6.0.23.29

This commit is contained in:
g8bpq 2022-11-23 10:56:20 +00:00
parent 6c6848bdcb
commit be0f2b8576
17 changed files with 350 additions and 175 deletions

View File

@ -241,6 +241,7 @@ char SYMSET = '/';
BOOL TraceDigi = FALSE; // Add Trace to packets relayed on Digi Calls BOOL TraceDigi = FALSE; // Add Trace to packets relayed on Digi Calls
BOOL SATGate = FALSE; // Delay Gating to IS directly heard packets BOOL SATGate = FALSE; // Delay Gating to IS directly heard packets
BOOL RXOnly = FALSE; // Run as RX only IGATE, ie don't gate anything to RF
BOOL DefaultLocalTime = FALSE; BOOL DefaultLocalTime = FALSE;
BOOL DefaultDistKM = FALSE; BOOL DefaultDistKM = FALSE;
@ -1272,7 +1273,7 @@ Dll VOID APIENTRY Poll_APRS()
|| memcmp(AdjBuff->ORIGIN, axRFONLY, 6) == 0 || memcmp(AdjBuff->ORIGIN, axRFONLY, 6) == 0
|| DigisUsed > MaxDigisforIS) || DigisUsed > MaxDigisforIS)
// TOo many digis or Last digis is NOGATE or RFONLY - dont send to IS // Too many digis or Last digis is NOGATE or RFONLY - dont send to IS
NoGate = TRUE; NoGate = TRUE;
} }
@ -1418,7 +1419,7 @@ Dll VOID APIENTRY Poll_APRS()
MH->IGate = TRUE; // if we've seen msgs to TCPIP, it must be an Igate MH->IGate = TRUE; // if we've seen msgs to TCPIP, it must be an Igate
} }
if (NoGate) if (NoGate || RXOnly)
goto NoIS; goto NoIS;
// I think all PID F0 UI frames go to APRS-IS, // I think all PID F0 UI frames go to APRS-IS,
@ -1452,7 +1453,23 @@ Dll VOID APIENTRY Poll_APRS()
if (APRSISOpen && CrossPortMap[Port][0]) // No point if not open if (APRSISOpen && CrossPortMap[Port][0]) // No point if not open
{ {
// was done above len = sprintf(ISMsg, "%s>%s,qAR,%s:%s", ptr1, ptr4, APRSCall, Payload); // was done above len = sprintf(ISMsg, "%s>%s,qAR,%s:%s", ptr1, ptr4, APRSCall, Payload);
if (BeacontoIS == 0)
{
// Don't send anything we've received as an echo
char SaveCall[7];
memcpy(SaveCall, &monbuff->ORIGIN, 7);
SaveCall[6] &= 0x7e; // Mask End of address bit
if (memcmp(SaveCall, AXCall, 7) == 0) // We sent it
{
// Should we check for being received via digi? - not for now
goto NoIS;
}
}
if (SATGate && (DigisUsed == 0)) if (SATGate && (DigisUsed == 0))
{ {
@ -1471,7 +1488,7 @@ Dll VOID APIENTRY Poll_APRS()
} }
ISSend(sock, ISMsg, len, 0); ISSend(sock, ISMsg, len, 0);
ptr1 = strchr(ISMsg, 13); ptr1 = strchr(ISMsg, 13);
if (ptr1) *ptr1 = 0; if (ptr1) *ptr1 = 0;
// Debugprintf(">%s", ISMsg); // Debugprintf(">%s", ISMsg);
@ -1988,6 +2005,12 @@ static int APRSProcessLine(char * buf)
return TRUE; return TRUE;
} }
if (_stricmp(ptr, "RXOnly") == 0)
{
RXOnly = TRUE;
return TRUE;
}
if (_stricmp(ptr, "DISTKM") == 0) if (_stricmp(ptr, "DISTKM") == 0)
{ {
DefaultDistKM = TRUE; DefaultDistKM = TRUE;
@ -2794,7 +2817,7 @@ VOID SendIStatus()
IStatusCounter = 3600; // One per hour IStatusCounter = 3600; // One per hour
if (APRSISOpen && BeacontoIS) if (APRSISOpen && BeacontoIS && RXOnly == 0)
{ {
Msg.PID = 0xf0; Msg.PID = 0xf0;
Msg.CTL = 3; Msg.CTL = 3;
@ -3740,7 +3763,7 @@ void PollGPSIn()
GPSMsg[len] = 0; GPSMsg[len] = 0;
if (Check0183CheckSum(GPSMsg, len)) if (Check0183CheckSum(GPSMsg, len))
if (memcmp(&GPSMsg[1], "GPRMC", 5) == 0) if (memcmp(&GPSMsg[3], "RMC", 3) == 0)
DecodeRMC(GPSMsg, len); DecodeRMC(GPSMsg, len);
portptr->gpsinptr -= (int)len; // bytes left portptr->gpsinptr -= (int)len; // bytes left
@ -4174,7 +4197,7 @@ static VOID ProcessReceivedData(SOCKET TCPSock)
} }
else else
{ {
if (memcmp(UDPMsg, "$GPRMC", 6) == 0) if (memcmp(&UDPMsg[3], "RMC", 3) == 0)
DecodeRMC(UDPMsg, Len); DecodeRMC(UDPMsg, Len);
else if (memcmp(UDPMsg, "!AIVDM", 6) == 0) else if (memcmp(UDPMsg, "!AIVDM", 6) == 0)

View File

@ -43,6 +43,9 @@ RECT ConsoleRect;
BOOL OpenConsole; BOOL OpenConsole;
BOOL OpenMon; BOOL OpenMon;
int reportNewMesageEvents = 0;
extern struct ConsoleInfo BBSConsole; extern struct ConsoleInfo BBSConsole;
extern char LOC[7]; extern char LOC[7];
@ -199,6 +202,14 @@ BOOL SendNewUserMessage = TRUE;
BOOL AllowAnon = FALSE; BOOL AllowAnon = FALSE;
BOOL UserCantKillT = FALSE; BOOL UserCantKillT = FALSE;
typedef int (WINAPI FAR *FARPROCX)();
FARPROCX pRunEventProgram;
int RunEventProgram(char * Program, char * Param);
extern BOOL EventsEnabled;
#define BPQHOSTSTREAMS 64 #define BPQHOSTSTREAMS 64
// Although externally streams are numbered 1 to 64, internally offsets are 0 - 63 // Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
@ -4796,7 +4807,7 @@ char * ReadInfoFile(char * File)
FILE * hFile; FILE * hFile;
char * MsgBytes; char * MsgBytes;
struct stat STAT; struct stat STAT;
char * ptr1 = 0; char * ptr1 = 0, * ptr2;
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%s", BaseDir, File); sprintf_s(MsgFile, sizeof(MsgFile), "%s/%s", BaseDir, File);
@ -4816,13 +4827,20 @@ char * ReadInfoFile(char * File)
fclose(hFile); fclose(hFile);
MsgBytes[FileSize]=0; MsgBytes[FileSize] = 0;
#ifndef WIN32 ptr1 = MsgBytes;
// Replace LF with CR // Replace LF or CRLF with CR
// Remove lf chars // First remove cr from crlf
while(ptr2 = strstr(ptr1, "\r\n"))
{
memmove(ptr2, ptr2 + 1, strlen(ptr2));
}
// Now replace lf with cr
ptr1 = MsgBytes; ptr1 = MsgBytes;
@ -4833,7 +4851,6 @@ char * ReadInfoFile(char * File)
ptr1++; ptr1++;
} }
#endif
return MsgBytes; return MsgBytes;
} }
@ -6295,6 +6312,33 @@ nextline:
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
// If Event Notifications enabled report a new message event
if (reportNewMesageEvents)
{
char msg[200];
//12345 B 2053 TEST@ALL F6FBB 920325 This is the subject
struct tm *tm = gmtime((time_t *)&Msg->datecreated);
sprintf_s(msg, sizeof(msg),"%-6d %c %6d %-13s %-6s %02d%02d%02d %s\r",
Msg->number, Msg->type, Msg->length, Msg->to,
Msg->from, tm->tm_year-100, tm->tm_mon+1, tm->tm_mday, Msg->title);
#ifdef WIN32
if (pRunEventProgram)
pRunEventProgram("MailNewMsg.exe", msg);
#else
{
char prog[256];
sprintf(prog, "%s/%s", BPQDirectory, "MailNewMsg");
RunEventProgram(prog, msg);
}
#endif
}
if (EnableUI) if (EnableUI)
#ifdef LINBPQ #ifdef LINBPQ
SendMsgUI(Msg); SendMsgUI(Msg);

View File

@ -357,18 +357,6 @@
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File
RelativePath="..\BPQChat\BPQChat.h"
>
</File>
<File
RelativePath="..\BPQChat\Resource.h"
>
</File>
<File
RelativePath="..\BPQChat\stdafx.h"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"

View File

@ -1102,6 +1102,7 @@
// Fix ' in Webmail subject (8) // Fix ' in Webmail subject (8)
// Change web buttons to white on black when pressed (10) // Change web buttons to white on black when pressed (10)
// Add auto-refresh option to Webmail index page (25) // Add auto-refresh option to Webmail index page (25)
// Fix displaying help and info files with crlf line endings on Linux (28)
#include "bpqmail.h" #include "bpqmail.h"
#define MAIL #define MAIL

View File

@ -1122,6 +1122,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add SmartID for bridged frames - Send ID only if packets sent recently (26) // Add SmartID for bridged frames - Send ID only if packets sent recently (26)
// Add option to save and restore received APRS messages (27) // Add option to save and restore received APRS messages (27)
// Add mechanism to run a user program on certain events (27) // Add mechanism to run a user program on certain events (27)
// If BeacontoIS is zero don't Gate any of our messages received locally to APRS-IS (28)
// Add Node Help command (28)
// Add APRS Igate RXOnly option (29)
// Fix RMC message handling with prefixes other than GP
#define CKernel #define CKernel

View File

@ -37,7 +37,7 @@
Name="Release|Win32" Name="Release|Win32"
> >
<DebugSettings <DebugSettings
Command="" Command="C:\DevProgs\BPQ32\bpq32.exe"
WorkingDirectory="" WorkingDirectory=""
CommandArguments="" CommandArguments=""
Attach="false" Attach="false"

View File

@ -1,5 +1,4 @@
IZ4FVW 0 Giulio Cesena ITA JN64ce, 1k2 bps radio link¬55¬0 IZ4FVW 0 Giulio Cesena ITA JN64ce, 1k2 bps radio link¬55¬0
GM8BPQ 40 John ?_qthャ14ャ0
N5UXT 0 Angelo th New Orleans, La¬99¬0 N5UXT 0 Angelo th New Orleans, La¬99¬0
N0NJY 0 Rick Oak Island, NC¬76¬0 N0NJY 0 Rick Oak Island, NC¬76¬0
KB8UVN 0 Matt Johnstown, Ohio¬95¬0 KB8UVN 0 Matt Johnstown, Ohio¬95¬0
@ -14,3 +13,4 @@ WE1H 0 Matt Merrimack, NH
W9IKU 0 Greg Portage, Wisconsin USA¬55¬0 W9IKU 0 Greg Portage, Wisconsin USA¬55¬0
KA3VSP 0 Brian New Castle, DE¬91¬0 KA3VSP 0 Brian New Castle, DE¬91¬0
G8BPQ 0 John Nottingham¬26¬0 G8BPQ 0 John Nottingham¬26¬0
GM8BPQ 40 John ?_qthャ14ャ0

View File

@ -320,7 +320,7 @@ char * ReadInfoFile(char * File)
FILE * hFile; FILE * hFile;
char * MsgBytes; char * MsgBytes;
struct stat STAT; struct stat STAT;
char * ptr1 = 0; char * ptr1 = 0, * ptr2;
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%s", GetBPQDirectory(), File); sprintf_s(MsgFile, sizeof(MsgFile), "%s/%s", GetBPQDirectory(), File);
@ -342,11 +342,16 @@ char * ReadInfoFile(char * File)
MsgBytes[FileSize]=0; MsgBytes[FileSize]=0;
#ifndef WIN32 // Replace LF or CRLF with CR
// Replace LF with CR // First remove cr from crlf
// Remove lf chars while(ptr2 = strstr(ptr1, "\r\n"))
{
memmove(ptr2, ptr2 + 1, strlen(ptr2));
}
// Now replace lf with cr
ptr1 = MsgBytes; ptr1 = MsgBytes;
@ -357,7 +362,6 @@ char * ReadInfoFile(char * File)
ptr1++; ptr1++;
} }
#endif
return MsgBytes; return MsgBytes;
} }

View File

@ -484,82 +484,6 @@ void TrytoSend()
} }
} }
void ChatFlush(ChatCIRCUIT * conn)
{
int tosend, len, sent;
// Try to send data to user. May be stopped by user paging or node flow control
// UCHAR * OutputQueue; // Messages to user
// int OutputQueueLength; // Total Malloc'ed size. Also Put Pointer for next Message
// int OutputGetPointer; // Next byte to send. When Getpointer = Quele Length all is sent - free the buffer and start again.
// BOOL Paging; // Set if user wants paging
// int LinesSent; // Count when paging
// int PageLen; // Lines per page
if (conn->OutputQueue == NULL)
{
// Nothing to send. If Close after Flush is set, disconnect
if (conn->CloseAfterFlush)
{
conn->CloseAfterFlush--;
if (conn->CloseAfterFlush)
return;
Disconnect(conn->BPQStream);
}
return; // Nothing to send
}
tosend = conn->OutputQueueLength - conn->OutputGetPointer;
sent=0;
while (tosend > 0)
{
if (TXCount(conn->BPQStream) > 4)
return; // Busy
if (tosend <= conn->paclen)
len=tosend;
else
len=conn->paclen;
GetSemaphore(&OutputSEM, 0);
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->OutputGetPointer+=len;
FreeSemaphore(&OutputSEM);
tosend-=len;
sent++;
if (sent > 4)
return;
}
// All Sent. Free buffers and reset pointers
ChatClearQueue(conn);
}
VOID ChatClearQueue(ChatCIRCUIT * conn)
{
GetSemaphore(&OutputSEM, 0);
conn->OutputGetPointer=0;
conn->OutputQueueLength=0;
FreeSemaphore(&OutputSEM);
}
/* /*
char * FormatDateAndTime(time_t Datim, BOOL DateOnly) char * FormatDateAndTime(time_t Datim, BOOL DateOnly)
{ {

91
Cmd.c
View File

@ -169,6 +169,9 @@ VOID FLMSG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * Us
void ListExcludedCalls(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); void ListExcludedCalls(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD);
VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD);
VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD);
VOID HELPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD);
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...) char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...)
{ {
@ -4205,6 +4208,7 @@ CMDX COMMANDS[] =
"BYE ",1,BYECMD,0, "BYE ",1,BYECMD,0,
"QUIT ",1,BYECMD,0, "QUIT ",1,BYECMD,0,
"INFO ",1,CMDI00,0, "INFO ",1,CMDI00,0,
"HELP ",1,HELPCMD,0,
"VERSION ",1,CMDV00,0, "VERSION ",1,CMDV00,0,
"NODES ",1,CMDN00,0, "NODES ",1,CMDN00,0,
"LINKS ",1,CMDL00,0, "LINKS ",1,CMDL00,0,
@ -5496,6 +5500,93 @@ BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr)
return TRUE; return TRUE;
} }
VOID HELPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
{
int FileSize;
char MsgFile[MAX_PATH];
FILE * hFile;
char * MsgBytes;
struct stat STAT;
char * ptr1, * ptr, * ptr2;
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%s", BPQDirectory, "NodeHelp.txt");
if (stat(MsgFile, &STAT) == -1)
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Help file not found\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
FileSize = STAT.st_size;
hFile = fopen(MsgFile, "rb");
if (hFile == NULL)
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Help file not found\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
MsgBytes = malloc(FileSize+1);
fread(MsgBytes, 1, FileSize, hFile);
fclose(hFile);
MsgBytes[FileSize] = 0;
ptr1 = MsgBytes;
// Replace LF or CRLF with CR
// First remove cr from crlf
while(ptr2 = strstr(ptr1, "\r\n"))
{
memmove(ptr2, ptr2 + 1, strlen(ptr2));
}
// Now replace lf with cr
ptr1 = MsgBytes;
while (*ptr1)
{
if (*ptr1 == '\n')
*(ptr1) = '\r';
ptr1++;
}
ptr = ptr1 = MsgBytes;
Bufferptr = Cmdprintf(Session, Bufferptr, "\r");
// Read and send a line at a time, converting any line endings into CR
while (*ptr1)
{
if (*ptr1 == '\r')
{
*(ptr1++) = 0;
Bufferptr = Cmdprintf(Session, Bufferptr, "%s\r", ptr);
ptr = ptr1;
}
else
ptr1++;
}
free(MsgBytes);
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
}

View File

@ -2407,9 +2407,6 @@ HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet
struct termios term; struct termios term;
struct speed_struct *s; struct speed_struct *s;
// As Serial ports under linux can have all sorts of odd names, the code assumes that
// they are symlinked to a com1-com255 in the BPQ Directory (normally the one it is started from
if ((UINT)pPort < 256) if ((UINT)pPort < 256)
sprintf(Port, "%s/com%d", BPQDirectory, (int)pPort); sprintf(Port, "%s/com%d", BPQDirectory, (int)pPort);
else else

147
HanksRT.c
View File

@ -118,9 +118,71 @@ time_t RunningConnectScript = 0;
//#define free(p) //#define free(p)
struct HistoryRec * History = NULL;
int HistoryCount = 0;
typedef int (WINAPI FAR *FARPROCX)(); typedef int (WINAPI FAR *FARPROCX)();
extern FARPROCX pRunEventProgram; extern FARPROCX pRunEventProgram;
int AddtoHistory(struct user_t * user, char * text)
{
struct HistoryRec * Rec;
struct HistoryRec * ptr;
int n = 1;
char buf[512];
char Stamp[16];
struct tm * tm;
time_t Now = time(NULL);
// Don't want to grow indefinitely and fill memory. We only allow display upt 24 hours back, so if first record is older that that
// remove and reuse it
if (History && History->Time < Now - 86400)
{
Rec = History;
History = Rec->next; // Remove from front of chain
}
else
Rec = malloc(sizeof (struct HistoryRec));
memset(Rec, 0, sizeof (struct HistoryRec));
tm = gmtime(&Now);
sprintf(Stamp,"%02d:%02d ", tm->tm_hour, tm->tm_min);
sprintf(buf, "%s%-6.6s %s %c %s\r", Stamp, user->call, user->name, ':', text);
Rec->Time = Now;
Rec->Topic = _strdup(user->topic->name);
Rec->Message = _strdup(buf);
if (History == NULL)
History = Rec;
else
{
ptr = History;
while (ptr && ptr->next)
{
n++;
ptr = ptr->next;
}
n++;
ptr->next = Rec;
}
return n;
}
int ChatIsUTF8(unsigned char *ptr, int len) int ChatIsUTF8(unsigned char *ptr, int len)
{ {
int n; int n;
@ -221,7 +283,6 @@ VOID * _zalloc_dbg(int len, int type, char * file, int line)
return ptr; return ptr;
} }
#endif #endif
VOID __cdecl nprintf(ChatCIRCUIT * conn, const char * format, ...) VOID __cdecl nprintf(ChatCIRCUIT * conn, const char * format, ...)
@ -268,22 +329,18 @@ int ChatQueueMsg(ChatCIRCUIT * conn, char * msg, int len)
// UCHAR * OutputQueue; // Messages to user // UCHAR * OutputQueue; // Messages to user
// int OutputQueueLength; // Total Malloc'ed size. Also Put Pointer for next Message // int OutputQueueLength; // Total Malloc'ed size. Also Put Pointer for next Message
// int OutputGetPointer; // Next byte to send. When Getpointer = Quele Length all is sent - free the buffer and start again. // int OutputGetPointer; // Next byte to send. When Getpointer = Queue Length all is sent - free the buffer and start again.
// Create or extend buffer // Create or extend buffer
GetSemaphore(&OutputSEM, 0); GetSemaphore(&OutputSEM, 0);
if (conn->OutputQueueLength + len > 9999) while (conn->OutputQueueLength + len > conn->OutputQueueSize)
{ {
Debugprintf("Output Queue Overflow %d", conn->OutputQueueLength); // Extend Queue
// Shouldn't clear buffer as this will corrupt any partly recevied message - just drop it conn->OutputQueueSize += 4096;
conn->OutputQueue = realloc(conn->OutputQueue, conn->OutputQueueSize);
// conn->OutputQueueLength = 0;
// conn->OutputGetPointer = 0;
FreeSemaphore(&OutputSEM);
return 0; // or we will send a partial message
} }
memcpy(&conn->OutputQueue[conn->OutputQueueLength], msg, len); memcpy(&conn->OutputQueue[conn->OutputQueueLength], msg, len);
@ -702,6 +759,52 @@ VOID ProcessChatLine(ChatCIRCUIT * conn, struct UserInfo * user, char* OrigBuffe
return; return;
} }
if (_memicmp(&Buffer[1], "History", 7) == 0)
{
// Param is number of minutes to go back (max 24 hours)
struct HistoryRec * ptr = History;
int interval = atoi(&Buffer[9]) * 60;
time_t start = time(NULL) - interval;
int n = HistoryCount;
if (interval < 1)
{
nprintf(conn, "Format is /history n, where n is history time in minutes\r");
conn->u.user->lastsendtime = time(NULL);
return;
}
if (interval > 1440)
{
nprintf(conn, "History is only held for 24 Hours (1440 Minutes)\r");
interval = 1440; // Limit to 1 day
}
// Find first record to send
while (ptr)
{
if (ptr->Time > start)
break;
n--;
ptr = ptr->next;
}
// n is records found
while (ptr)
{
nprintf(conn, ptr->Message);
ptr = ptr->next;
}
conn->u.user->lastsendtime = time(NULL);
return;
}
if (_memicmp(&Buffer[1], "Keepalive", 4) == 0) if (_memicmp(&Buffer[1], "Keepalive", 4) == 0)
{ {
conn->u.user->rtflags ^= u_keepalive; conn->u.user->rtflags ^= u_keepalive;
@ -843,6 +946,8 @@ VOID ProcessChatLine(ChatCIRCUIT * conn, struct UserInfo * user, char* OrigBuffe
text_tellu(conn->u.user, Buffer, NULL, o_topic); // To local users. text_tellu(conn->u.user, Buffer, NULL, o_topic); // To local users.
HistoryCount = AddtoHistory(conn->u.user, Buffer);
conn->u.user->lastrealmsgtime = conn->u.user->lastmsgtime = time(NULL); conn->u.user->lastrealmsgtime = conn->u.user->lastmsgtime = time(NULL);
// Send to Linked nodes // Send to Linked nodes
@ -2938,6 +3043,7 @@ int rt_cmd(ChatCIRCUIT *circuit, char * Buffer)
nputs(circuit, "/S CALL Text - Send Text to that station only.\r"); nputs(circuit, "/S CALL Text - Send Text to that station only.\r");
nputs(circuit, "/F - Force all links to be made.\r/K - Show Known nodes.\r"); nputs(circuit, "/F - Force all links to be made.\r/K - Show Known nodes.\r");
nputs(circuit, "/B - Leave Chat and return to node.\r/QUIT - Leave Chat and disconnect from node.\r"); nputs(circuit, "/B - Leave Chat and return to node.\r/QUIT - Leave Chat and disconnect from node.\r");
nputs(circuit, "/History nn - Display chat messages received in last nn minutes.\r");
} }
} }
return TRUE; return TRUE;
@ -4165,6 +4271,7 @@ BOOL ChatInit()
return TRUE; return TRUE;
} }
#endif
void ChatFlush(ChatCIRCUIT * conn) void ChatFlush(ChatCIRCUIT * conn)
{ {
@ -4181,22 +4288,6 @@ void ChatFlush(ChatCIRCUIT * conn)
// int PageLen; // Lines per page // int PageLen; // Lines per page
if (conn->OutputQueue == NULL)
{
// Nothing to send. If Close after Flush is set, disconnect
if (conn->CloseAfterFlush)
{
conn->CloseAfterFlush--;
if (conn->CloseAfterFlush)
return;
Disconnect(conn->BPQStream);
}
return; // Nothing to send
}
tosend = conn->OutputQueueLength - conn->OutputGetPointer; tosend = conn->OutputQueueLength - conn->OutputGetPointer;
sent = 0; sent = 0;
@ -4233,9 +4324,6 @@ void ChatFlush(ChatCIRCUIT * conn)
VOID ChatClearQueue(ChatCIRCUIT * conn) VOID ChatClearQueue(ChatCIRCUIT * conn)
{ {
if (conn->OutputQueue == NULL)
return;
GetSemaphore(&OutputSEM, 0); GetSemaphore(&OutputSEM, 0);
conn->OutputGetPointer = 0; conn->OutputGetPointer = 0;
@ -4244,6 +4332,7 @@ VOID ChatClearQueue(ChatCIRCUIT * conn)
FreeSemaphore(&OutputSEM); FreeSemaphore(&OutputSEM);
} }
#ifdef LINBPQ
void ChatTrytoSend() void ChatTrytoSend()
{ {
// call Flush on any connected streams with queued data // call Flush on any connected streams with queued data

View File

@ -1,25 +1,26 @@
G8BPQ-1 1661431645 G8BPQ-1 1669106746
GM8BPQ-4 1661431604 GM8BPQ-3 1669106749
OH5RM-8 1661431604 KB8UVN-6 1669106746
G0BMH-4 1661431604 N8BHL-6 1669106746
AE5E-2 1661431604 KF8MZ-6 1669106746
MS0HFI-4 1661431604 W8BAP-6 1669106746
PE1RRR-4 1661431604 G8BPQ-4 1669106746
WA3WLH-14 1661431604 EI2GYB-4 1669106746
WA3WLH-11 1661431604 IZ4FVW-10 1669106746
W9IKU-11 1661431604 PE1NNZ-5 1669106746
N2UEM-11 1661431604 PI1LAP-4 1669106746
K5DAT-11 1661431604 K8OPG-14 1669106746
N3MEL-3 1661431604 KB9PVH-11 1669106746
N0NJY-11 1661431604 N0NJY-11 1669106746
KB9PVH-11 1661431604 N3MEL-3 1669106746
K8OPG-14 1661431604 K5DAT-11 1669106746
PI1LAP-4 1661431604 N2UEM-11 1669106746
PE1NNZ-5 1661431604 W9IKU-11 1669106746
IZ4FVW-10 1661431604 WA3WLH-11 1669106746
EI2GYB-4 1661431604 WA3WLH-14 1669106746
G8BPQ-4 1661431604 PE1RRR-4 1669106746
W8BAP-6 1661431604 MS0HFI-4 1669106746
KF8MZ-6 1661431604 AE5E-2 1669106746
N8BHL-6 1661431604 G0BMH-4 1669106746
KB8UVN-6 1661431604 OH5RM-8 1669106746
GM8BPQ-4 1669106746

View File

@ -10,8 +10,8 @@
#endif #endif
#define KVers 6,0,23,27 #define KVers 6,0,23,29
#define KVerstring "6.0.23.27\0" #define KVerstring "6.0.23.29\0"
#ifdef CKernel #ifdef CKernel

View File

@ -63,7 +63,7 @@
// Restore CMD_TO_APPL flag to Applflags (13) // Restore CMD_TO_APPL flag to Applflags (13)
// Check for and remove names set to *RTL // Check for and remove names set to *RTL
// Add option to run user program when chat user connects (27) // Add option to run user program when chat user connects (27)
// Add History (28)
#include "BPQChat.h" #include "BPQChat.h"
#include "Dbghelp.h" #include "Dbghelp.h"

View File

@ -400,11 +400,10 @@ typedef struct ChatConnectionInfo_S
// and data sucked out under both terminal and system flow control. PACLEN is // and data sucked out under both terminal and system flow control. PACLEN is
// enfored when sending to node. // enfored when sending to node.
UCHAR OutputQueue[10000]; // Messages to user UCHAR * OutputQueue; // Messages to user
int OutputQueueLength; // Total Malloc'ed size. Also Put Pointer for next Message int OutputQueueSize; // Total Malloc'ed size.
int OutputQueueLength; // Put Pointer for next Message
int OutputGetPointer; // Next byte to send. When Getpointer = Queue Length all is sent - free the buffer and start again. int OutputGetPointer; // Next byte to send. When Getpointer = Queue Length all is sent - free the buffer and start again.
int CloseAfterFlush; // Close session when all sent. Set to 100ms intervals to wait.
BOOL sysop; // Set if user is authenticated as a sysop BOOL sysop; // Set if user is authenticated as a sysop
BOOL Secure_Session; // Set if Local Terminal, or Telnet connect with SYSOP status BOOL Secure_Session; // Set if Local Terminal, or Telnet connect with SYSOP status
@ -550,6 +549,16 @@ struct ConsoleInfo
}; };
struct HistoryRec
{
struct HistoryRec * next;
time_t Time;
char * Topic;
char * Message;
};
extern struct HistoryRec * History;
extern int HistoryCount;
extern USER *user_hd; extern USER *user_hd;

View File

@ -14,9 +14,9 @@ Chat :
WrapInput = 0; WrapInput = 0;
FlashOnConnect = 0; FlashOnConnect = 0;
CloseWindowOnBye = 0; CloseWindowOnBye = 0;
ConsoleSize = "122,930,359,969"; ConsoleSize = "821,1629,283,893";
MonitorSize = "828,1644,148,770"; MonitorSize = "828,1644,148,770";
DebugSize = "0,0,0,0"; DebugSize = "0,0,0,0";
WindowSize = "608,1212,163,511"; WindowSize = "714,1318,165,513";
Version = "6,0,23,16"; Version = "6,0,23,28";
}; };