From 6c6848bdcbedcee989fefdd8d39105e7022aeae3 Mon Sep 17 00:00:00 2001 From: g8bpq Date: Fri, 18 Nov 2022 17:03:39 +0000 Subject: [PATCH] 6.0.23.27 --- APRSCode.c | 146 ++++++++++++++++++++++++++++- BPQChat.vcproj.SKIGACER.johnw.user | 65 +++++++++++++ BPQMail.c | 2 + Bpq32.c | 4 + CBPQ32.vcproj | 4 + ChatUtils.c | 1 + Events.c | 109 +++++++++++++++++++++ FreeDATA.c | 63 +++++++++---- HanksRT.c | 16 ++++ LinBPQ.c | 2 + MailNode.vcproj | 4 + Versions.h | 4 +- bpqchat.c | 13 ++- cMain.c | 4 + config.c | 10 +- configstructs.h | 5 +- makefile | 2 +- templatedefs.c | 1 + 18 files changed, 425 insertions(+), 30 deletions(-) create mode 100644 BPQChat.vcproj.SKIGACER.johnw.user create mode 100644 Events.c diff --git a/APRSCode.c b/APRSCode.c index f98e8fe..468b00f 100644 --- a/APRSCode.c +++ b/APRSCode.c @@ -99,12 +99,16 @@ BOOL ProcessConfig(); int ProcessAISMessage(char * msg, int len); int read_png(unsigned char *bytes); VOID sendandcheck(SOCKET sock, const char * Buffer, int Len); +void SaveAPRSMessage(struct APRSMESSAGE * ptr); +void ClearSavedMessages(); +void GetSavedAPRSMessages(); extern int SemHeldByAPI; extern int APRSMONDECODE(); extern struct ConsoleInfo MonWindow; extern char VersionString[]; +BOOL SaveAPRSMsgs = 0; BOOL LogAPRSIS = FALSE; @@ -958,6 +962,11 @@ Dll BOOL APIENTRY Init_APRS() read_png((unsigned char *)IconData); + // Reload saved messages + + if (SaveAPRSMsgs) + GetSavedAPRSMessages(); + // If a Run parameter was supplied, run the program if (RunProgram[0] == 0) @@ -970,7 +979,7 @@ Dll BOOL APIENTRY Init_APRS() signal(SIGCHLD, SIG_IGN); // Silently (and portably) reap children. - // Fork and Exec ARDOP + // Fork and Exec program printf("Trying to start %s\n", RunProgram); @@ -1095,6 +1104,8 @@ Dll VOID APIENTRY Poll_APRS() SMEM->Messages = NULL; SMEM->ClearRX = 0; SMEM->NeedRefresh = TRUE; + + ClearSavedMessages(); } if (SMEM->ClearTX) @@ -7674,6 +7685,9 @@ int ProcessMessage(char * Payload, struct STATIONRECORD * Station) } } + if (SaveAPRSMsgs) + SaveAPRSMessage(Message); + ptr = SMEM->Messages; if (ptr == NULL) @@ -7690,6 +7704,7 @@ int ProcessMessage(char * Payload, struct STATIONRECORD * Station) } ptr->Next = Message; } + return ourMessage; } @@ -8763,3 +8778,132 @@ unsigned char * PngEncode (png_byte *pDiData, int iWidth, int iHeight, struct ic return Icon->pngimage; } +void SaveAPRSMessage(struct APRSMESSAGE * ptr) +{ + // Save messages in case of a restart + + char FN[250]; + FILE *file; + + // Set up filename + + if (BPQDirectory[0] == 0) + { + strcpy(FN,"APRSMsgs.dat"); + } + else + { + strcpy(FN,BPQDirectory); + strcat(FN,"/"); + strcat(FN,"APRSMsgs.dat"); + } + + if ((file = fopen(FN, "a")) == NULL) + return ; + + fprintf(file, "%d %s,%s,%s,%s,%s\n", time(NULL), ptr->FromCall, ptr->ToCall, ptr->Seq, ptr->Time, ptr->Text); + + fclose(file); +} + +void ClearSavedMessages() +{ + char FN[250]; + FILE *file; + + // Set up filename + + if (BPQDirectory[0] == 0) + { + strcpy(FN,"APRSMsgs.dat"); + } + else + { + strcpy(FN,BPQDirectory); + strcat(FN,"/"); + strcat(FN,"APRSMsgs.dat"); + } + + if ((file = fopen(FN, "w")) == NULL) + return ; + + fclose(file); +} + +void GetSavedAPRSMessages() +{ + // Get Saved messages + + // 1668768157 SERVER ,GM8BPQ-2 ,D7Yx,10:42,filter m/200 active + + char FN[250]; + FILE *file; + struct APRSMESSAGE * Message; + struct APRSMESSAGE * ptr; + char Line[256]; + char * Stamp = 0; + char * From = 0; + char * To = 0; + char * Seq = 0; + char * Time = 0; + char * Text = 0; + + // Set up filename + + if (BPQDirectory[0] == 0) + { + strcpy(FN,"APRSMsgs.dat"); + } + else + { + strcpy(FN,BPQDirectory); + strcat(FN,"/"); + strcat(FN,"APRSMsgs.dat"); + } + + if ((file = fopen(FN, "r")) == NULL) + return ; + + while (fgets(Line, 512, file)) + { + Stamp = Line; + From = strlop(Stamp, ' '); + To = strlop(From, ','); + Seq = strlop(To, ','); + Time = strlop(Seq, ','); + Text = strlop(Time, ','); + + if (Stamp && From && To && Seq && Time && Text) + { + Message = APRSGetMessageBuffer(); + + if (Message == NULL) + break; + + memset(Message, 0, sizeof(struct APRSMESSAGE)); + + strcpy(Message->FromCall, From); + strcpy(Message->ToCall, To); + strcpy(Message->Seq, Seq); + strcpy(Message->Time, Time); + strcpy(Message->Text, Text); + + ptr = SMEM->Messages; + + if (ptr == NULL) + { + SMEM->Messages = Message; + } + else + { + while(ptr->Next) + { + ptr = ptr->Next; + } + ptr->Next = Message; + } + + } + } + fclose(file); +} diff --git a/BPQChat.vcproj.SKIGACER.johnw.user b/BPQChat.vcproj.SKIGACER.johnw.user new file mode 100644 index 0000000..bbece07 --- /dev/null +++ b/BPQChat.vcproj.SKIGACER.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/BPQMail.c b/BPQMail.c index b72e751..647c80d 100644 --- a/BPQMail.c +++ b/BPQMail.c @@ -1117,6 +1117,7 @@ typedef int (WINAPI FAR *FARPROCZ)(); FARPROCX pDllBPQTRACE; FARPROCZ pGetLOC; FARPROCX pRefreshWebMailIndex; +FARPROCX pRunEventProgram; BOOL WINE = FALSE; @@ -1881,6 +1882,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) pDllBPQTRACE = GetProcAddress(ExtDriver,"_DllBPQTRACE@8"); pGetLOC = GetProcAddress(ExtDriver,"_GetLOC@0"); pRefreshWebMailIndex = GetProcAddress(ExtDriver,"_RefreshWebMailIndex@0"); + pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8"); if (pGetLOC) { diff --git a/Bpq32.c b/Bpq32.c index 7f371b2..6070c45 100644 --- a/Bpq32.c +++ b/Bpq32.c @@ -1120,6 +1120,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses // Add Web Sockets auto-refresh option for Webmail index page (25) // Fix FREEDATA driver for compatibility with FreeData TNC version 0.6.4-alpha.3 (25) // Add SmartID for bridged frames - Send ID only if packets sent recently (26) +// Add option to save and restore received APRS messages (27) +// Add mechanism to run a user program on certain events (27) #define CKernel @@ -1500,6 +1502,8 @@ int PerlReinit = 0; UINT_PTR TimerHandle = 0; UINT_PTR SessHandle = 0; +BOOL EventsEnabled = 0; + unsigned int TimerInst = 0xffffffff; HANDLE hInstance = 0; diff --git a/CBPQ32.vcproj b/CBPQ32.vcproj index 3e6fff8..b8732a2 100644 --- a/CBPQ32.vcproj +++ b/CBPQ32.vcproj @@ -350,6 +350,10 @@ RelativePath=".\DRATS.c" > + + diff --git a/ChatUtils.c b/ChatUtils.c index 9e005e7..bb5f502 100644 --- a/ChatUtils.c +++ b/ChatUtils.c @@ -41,6 +41,7 @@ extern int RunningConnectScript; INT_PTR CALLBACK InfoDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); int GetMultiLineDialog(HWND hDialog, int DLGItem); BOOL ProcessChatConnectScript(ChatCIRCUIT * conn, char * Buffer, int len); +VOID WriteMiniDump(); int Connected(int Stream) { diff --git a/Events.c b/Events.c new file mode 100644 index 0000000..fa32436 --- /dev/null +++ b/Events.c @@ -0,0 +1,109 @@ +/* +Copyright 2001-2022 John Wiseman G8BPQ + +This file is part of LinBPQ/BPQ32. + +LinBPQ/BPQ32 is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +LinBPQ/BPQ32 is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses +*/ + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#define _CRT_SECURE_NO_DEPRECATE + +#include "compatbits.h" +#include + +VOID __cdecl Debugprintf(const char * format, ...); + +#ifndef WIN32 + +#define APIENTRY +#define DllExport +#define VOID void + +#else +#include +#endif + +extern BOOL EventsEnabled; + +// Runs use specified routine on certain event +#ifndef WIN32 + +void RunEventProgram(char * Program, char * Param) +{ + char * arg_list[] = {Program, NULL, NULL}; + pid_t child_pid; + + if (EventsEnabled == 0) + return; + + signal(SIGCHLD, SIG_IGN); // Silently (and portably) reap children. + + if (Param && Param[0]) + arg_list[1] = Param; + + // Fork and Exec Specified program + + // Duplicate this process. + + child_pid = fork (); + + if (child_pid == -1) + { + printf ("Event fork() Failed\n"); + return; + } + + if (child_pid == 0) + { + execvp (arg_list[0], arg_list); + + // The execvp function returns only if an error occurs. + + printf ("Failed to run %s\n", arg_list[0]); + exit(0); // Kill the new process + } + +#else + +DllExport int APIENTRY RunEventProgram(char * Program, char * Param) +{ + int n = 0; + char cmdLine[256]; + + STARTUPINFO SInfo; // pointer to STARTUPINFO + PROCESS_INFORMATION PInfo; // pointer to PROCESS_INFORMATION + + if (EventsEnabled == 0) + return 0; + + + SInfo.cb=sizeof(SInfo); + SInfo.lpReserved=NULL; + SInfo.lpDesktop=NULL; + SInfo.lpTitle=NULL; + SInfo.dwFlags=0; + SInfo.cbReserved2=0; + SInfo.lpReserved2=NULL; + + sprintf(cmdLine, "%s %s", Program, Param); + + if (!CreateProcess(NULL, cmdLine, NULL, NULL, FALSE,0 ,NULL ,NULL, &SInfo, &PInfo)) + Debugprintf("Failed to Start %s Error %d ", Program, GetLastError()); + +#endif + + return 0; +} diff --git a/FreeDATA.c b/FreeDATA.c index 01993b8..ad09a4e 100644 --- a/FreeDATA.c +++ b/FreeDATA.c @@ -38,6 +38,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses #define SD_BOTH 0x02 +#define FREEDATABUFLEN 16384 // TCP buffer size + int KillTNC(struct TNCINFO * TNC); int RestartTNC(struct TNCINFO * TNC); @@ -254,7 +256,7 @@ static int ProcessLine(char * buf, int Port) TNC->FreeDataInfo->TuningRange = atoi(&buf[12]); else if (_memicmp(buf, "LimitBandWidth", 14) == 0) - TNC->FreeDataInfo->LimitBandWidth = atoi(&buf[14]); + TNC->FreeDataInfo->LimitBandWidth = atoi(&buf[15]); else if (_memicmp(buf, "HAMLIBPORT", 10) == 0) TNC->FreeDataInfo->hamlibPort = atoi(&buf[11]); @@ -928,14 +930,28 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff) return ((TNC->TNCCONNECTED != 0) << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK - - case 4: // reinit7 - - return 0; - case 5: // Close StopTNC(TNC); + + // Drop through + + case 4: // reinit7 + + if (TNC->TCPDataSock) + { + shutdown(TNC->TCPDataSock, SD_BOTH); + Sleep(100); + closesocket(TNC->TCPDataSock); + } + + if (TNC->TCPSock) + { + shutdown(TNC->TCPSock, SD_BOTH); + Sleep(100); + closesocket(TNC->TCPSock); + } + return 0; case 6: // Scan Stop Interface @@ -1320,7 +1336,7 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry) TNC->Hardware = H_FREEDATA; TNC->ARDOPDataBuffer = malloc(MAXRXSIZE); - TNC->ARDOPBuffer = malloc(8192); + TNC->ARDOPBuffer = malloc(FREEDATABUFLEN); TNC->PortRecord = PortEntry; @@ -3566,9 +3582,9 @@ void FreeDataProcessDaemonMsg(struct TNCINFO * TNC) if (TNC->InputLen > 8000) // Shouldnt have packets longer than this TNC->InputLen=0; - InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0); + InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], FREEDATABUFLEN - 1 - TNC->InputLen, 0); - if (InputLen == 8191) + if (InputLen == FREEDATABUFLEN - 1) c = 0; @@ -3970,14 +3986,11 @@ TNCRunning: if (TNC->TNCCONNECTED) FD_SET(TNC->TCPDataSock,&readfs); -// FD_ZERO(&writefs); - -// if (TNC->BPQtoWINMOR_Q) FD_SET(TNC->TCPSock,&writefs); // Need notification of busy clearing if (TNC->TNCCONNECTING || TNC->TNCCONNECTED) FD_SET(TNC->TCPDataSock,&errorfs); - timeout.tv_sec = 90; - timeout.tv_usec = 0; // We should get messages more frequently that this + timeout.tv_sec = 300; + timeout.tv_usec = 0; ret = select((int)TNC->TCPSock + 1, &readfs, NULL, &errorfs, &timeout); @@ -3986,7 +3999,20 @@ TNCRunning: Debugprintf("FreeData Select failed %d ", WSAGetLastError()); goto Lost; } - if (ret > 0) + + // If nothing doing send get rx_buffer as link validation poll + + if (ret == 0) + { + char GetData[] = "{\"type\" : \"get\", \"command\": \"rx_buffer\"}\n"; + int Len; + + Len = send(TNC->TCPDataSock, GetData, strlen(GetData), 0); + + if (Len != strlen(GetData)) + goto closeThread; + } + else { // See what happened @@ -4007,7 +4033,7 @@ TNCRunning: if (FD_ISSET(TNC->TCPDataSock, &errorfs)) { Lost: - sprintf(Msg, "FreeData Daemon Connection lost for Port %d\r\n", TNC->Port); + sprintf(Msg, "FreeData TNC Connection lost for Port %d\r\n", TNC->Port); WritetoConsole(Msg); sprintf(TNC->WEB_COMMSSTATE, "Connection to Daemon lost"); @@ -4048,11 +4074,10 @@ Lost: } continue; } - else - { - } } +closeThread: + if (TNC->TCPDataSock) { shutdown(TNC->TCPDataSock, SD_BOTH); diff --git a/HanksRT.c b/HanksRT.c index 4cc137b..7885c11 100644 --- a/HanksRT.c +++ b/HanksRT.c @@ -36,6 +36,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses iconv_t link_toUTF8 = NULL; + +BOOL RunEventProgram(char * Program, char * Param); + #endif BOOL ProcessChatConnectScript(ChatCIRCUIT * conn, char * Buffer, int len); @@ -48,6 +51,7 @@ void ChatWriteLogLine(ChatCIRCUIT * conn, int Flag, char * Msg, int MsgLen, int extern struct SEM ChatSemaphore; UCHAR * APIENTRY GetLogDirectory(); char * APIENTRY GetBPQDirectory(); +VOID WriteMiniDump(); extern SOCKADDR_IN Chatreportdest; @@ -114,6 +118,9 @@ time_t RunningConnectScript = 0; //#define free(p) +typedef int (WINAPI FAR *FARPROCX)(); +extern FARPROCX pRunEventProgram; + int ChatIsUTF8(unsigned char *ptr, int len) { int n; @@ -1935,6 +1942,7 @@ void text_tellu_Joined(USER * user) struct tm * tm; char Stamp[20]; time_t T; + char prog[256] = ""; T = time(NULL); tm = gmtime(&T); @@ -1973,6 +1981,14 @@ void text_tellu_Joined(USER * user) nputc(circuit, 7); nputc(circuit, 13); + +#ifdef WIN32 + if (pRunEventProgram) + pRunEventProgram("ChatNewUser.exe", user->call); +#else + sprintf(prog, "%s/%s", BPQDirectory, "ChatNewUser"); + RunEventProgram(prog, user->call); +#endif } } // Tell one link circuit about a local user change of topic. diff --git a/LinBPQ.c b/LinBPQ.c index e5d6f6e..5fe7b61 100644 --- a/LinBPQ.c +++ b/LinBPQ.c @@ -506,6 +506,8 @@ extern int ISPort; extern char ChatConfigName[250]; +BOOL EventsEnabled = 0; + UCHAR * GetBPQDirectory() { return BPQDirectory; diff --git a/MailNode.vcproj b/MailNode.vcproj index 534a39e..bfa832d 100644 --- a/MailNode.vcproj +++ b/MailNode.vcproj @@ -320,6 +320,10 @@ RelativePath=".\DRATS.c" > + + diff --git a/Versions.h b/Versions.h index d0cc103..cdb6ac8 100644 --- a/Versions.h +++ b/Versions.h @@ -10,8 +10,8 @@ #endif -#define KVers 6,0,23,26 -#define KVerstring "6.0.23.26\0" +#define KVers 6,0,23,27 +#define KVerstring "6.0.23.27\0" #ifdef CKernel diff --git a/bpqchat.c b/bpqchat.c index cbf0d9f..fe3c3d0 100644 --- a/bpqchat.c +++ b/bpqchat.c @@ -61,7 +61,8 @@ // Version 6.0.24.1 ?? // 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) #include "BPQChat.h" @@ -214,6 +215,7 @@ VOID SaveStringValue(config_setting_t * group, char * name, char * value); VOID SaveIntValue(config_setting_t * group, char * name, int value); VOID SaveChatConfig(HWND hDlg); BOOL CreateChatPipeThread(); +VOID WriteMiniDump(); struct _EXCEPTION_POINTERS exinfox; @@ -224,6 +226,9 @@ DWORD Stack[16]; BOOL Restarting = FALSE; +typedef int (WINAPI FAR *FARPROCX)(); +FARPROCX pRunEventProgram; + int Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg) { unsigned int SPPtr; @@ -1282,6 +1287,7 @@ BOOL Initialise() { int i; ChatCIRCUIT * conn; + HMODULE ExtDriver = LoadLibrary("bpq32.dll"); // Register message for posting by BPQDLL @@ -1388,6 +1394,11 @@ Retry: CreateChatPipeThread(); + + if (ExtDriver) + pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8"); + + return TRUE; } diff --git a/cMain.c b/cMain.c index 72b529a..e4e57cf 100644 --- a/cMain.c +++ b/cMain.c @@ -137,6 +137,8 @@ BOOL LogAllConnects = FALSE; BOOL AUTOSAVEMH = TRUE; extern BOOL ADIFLogEnabled; extern UCHAR LogDirectory[260]; +extern BOOL EventsEnabled; +extern BOOL SaveAPRSMsgs; //TNCTABLE DD 0 //NUMBEROFSTREAMS DD 0 @@ -759,6 +761,8 @@ BOOL Start() LogAllConnects = cfg->C_LogAllConnects; AUTOSAVEMH = cfg->C_SaveMH; ADIFLogEnabled = cfg->C_ADIF; + EventsEnabled = cfg->C_EVENTS; + SaveAPRSMsgs = cfg->C_SaveAPRSMsgs; // Get pointers to PASSWORD and APPL1 commands diff --git a/config.c b/config.c index c825a50..fe28b1c 100644 --- a/config.c +++ b/config.c @@ -299,7 +299,7 @@ static char *keywords[] = "APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL", "APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL", "BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed -"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG" +"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS" }; /* parameter keywords */ static void * offset[] = @@ -319,7 +319,7 @@ static void * offset[] = &xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual, &xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual, &xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed -&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF}; /* offset for corresponding data in config file */ +&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs}; /* offset for corresponding data in config file */ static int routine[] = { @@ -338,7 +338,7 @@ static int routine[] = 14, 14, 14, 14, 14, 14 ,14, 14, 15, 0, 2, 9, 9, -2, 2, 2, 2} ; // Routine to process param +2, 2, 2, 2, 2, 2} ; // Routine to process param int PARAMLIM = sizeof(routine)/sizeof(int); //int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int); @@ -407,7 +407,7 @@ static int routeindex = 0; /* Global variables */ /************************************************************************/ -int paramok[100]; /* PARAMETER OK FLAG */ +int paramok[100] = {0}; /* PARAMETER OK FLAG */ FILE *fp1; /* TEXT INPUT FILE */ @@ -587,6 +587,8 @@ BOOL ProcessConfig() paramok[75]=1; // LogAllConnects optional paramok[76]=1; // SAVEMH optional paramok[77]=1; // ENABLEADIFLOG optional + paramok[78]=1; // EnableEvents optional + paramok[79]=1; // SaveAPRSMsgs optional for (i=0; i < PARAMLIM; i++) { diff --git a/configstructs.h b/configstructs.h index c7aa827..0ccfb13 100644 --- a/configstructs.h +++ b/configstructs.h @@ -142,8 +142,9 @@ struct CONFIGTABLE UCHAR C_BTEXT[120]; // 121 char C_VERSTRING[10]; // 241 Version String from Config File UCHAR C_ADIF; - UCHAR C_LogAllConnects; - UCHAR Spare3[2]; // 252 - 4 + UCHAR C_EVENTS; + UCHAR C_LogAllConnects; + UCHAR C_SaveAPRSMsgs; UCHAR C_VERSION; // CONFIG PROG VERSION // Reuse C_APPLICATIONS - no longer used char C_NETROMCALL[10]; diff --git a/makefile b/makefile index cadeff9..6abbbdc 100644 --- a/makefile +++ b/makefile @@ -13,7 +13,7 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \ NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \ SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o UIRoutines.o AGWAPI.o AGWMoncode.o \ - DRATS.o FreeDATA.o base64.o + DRATS.o FreeDATA.o base64.o Events.o # Configuration: diff --git a/templatedefs.c b/templatedefs.c index 14061f6..bb2e495 100644 --- a/templatedefs.c +++ b/templatedefs.c @@ -377,6 +377,7 @@ char * WebMailPagetxt() " \r\n" " \r\n" " \r\n" + "" "