Compare commits

...

2 Commits

Author SHA1 Message Date
Hibby c858986248 New upstream version 6.0.24.65+repack 2025-02-25 09:32:57 +00:00
Hibby 64d58d0c5a New upstream version 6.0.24.59a+repack 2025-02-03 22:18:58 +00:00
86 changed files with 2080 additions and 10113 deletions

139
.rej
View File

@ -1,139 +0,0 @@
--- APRSCode.c
+++ APRSCode.c
@@ -3674,7 +3674,7 @@
if (ptr1)
*ptr1 = 0;
-// Debugprintf("Duplicate Message supressed %s", Msg);
+// Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate
}
}
--- BPQChat.rc
+++ BPQChat.rc
@@ -162,7 +162,7 @@
WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER
- LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
+ LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24
END
--- BPQMail.rc
+++ BPQMail.rc
@@ -1045,7 +1045,7 @@
CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
- CONTROL "Supress Mailing of Housekeeping Results",
+ CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
--- HanksRT.c
+++ HanksRT.c
@@ -1186,7 +1186,7 @@
// Duplicate, so discard, but save time
DupInfo[i].DupTime = Now;
- Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
+ Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate
}
--- RigControl.c
+++ RigControl.c
@@ -8385,7 +8385,7 @@
switch (Msg[0])
{
- case 'f': // Get Freqency
+ case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep);
return 0;
--- UZ7HODrv.c
+++ UZ7HODrv.c
@@ -374,7 +374,7 @@
{
// Read Freq
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1;
}
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}
--- WinRPRHelper.c
+++ WinRPRHelper.c
@@ -111,7 +111,7 @@
if (argc < 3)
{
- printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
+ printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n");
--- config.c
+++ config.c
@@ -649,7 +649,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
- Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
+ Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf("");
--- kiss.c
+++ kiss.c
@@ -1485,7 +1485,7 @@
}
}
else
- Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",
+ Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",
KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
goto SeeifMore; // SEE IF ANYTHING ELSE
--- templatedefs.c
+++ templatedefs.c
@@ -1165,7 +1165,7 @@
"Send Non-delivery Notifications<br>\r\n"
"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
" <br />\r\n"
- "Supress Mailing of<br>\r\n"
+ "Suppress Mailing of<br>\r\n"
"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"<div style=\"text-align: center;\"><input class='btn' name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
@@ -1454,7 +1454,7 @@
"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
- "seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
+ "separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
"<br></div>\n"
--- WebMail.c
+++ WebMail.c
@@ -2020,7 +2020,7 @@
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' "
- "value='Include Orignal Msg'>";
+ "value='Include Original Msg'>";
char Temp[1024];
char ReplyAddr[128];

View File

@ -72,7 +72,7 @@ Using code from 6pack Linux Kernel driver with the following licence and credits
#include "compatbits.h" #include "compatbits.h"
#include <string.h> #include <string.h>
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
@ -1412,10 +1412,11 @@ VOID * SIXPACKExtInit(EXTPORTDATA * PortEntry)
TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo)); TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SIXPACK; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SIXPACK;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include <process.h> //#include <process.h>
//#include <time.h> //#include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -382,7 +382,8 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_AEA; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
TNC->TEXTMODE = FALSE; TNC->TEXTMODE = FALSE;
@ -390,8 +391,6 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->InitScript = _strupr(TNC->InitScript); TNC->InitScript = _strupr(TNC->InitScript);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"

View File

@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
// MSGFLAG contains CMD/RESPONSE BITS // MSGFLAG contains CMD/RESPONSE BITS

View File

@ -7,7 +7,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
//#include "tncinfo.h" //#include "tncinfo.h"
//#include "adif.h" //#include "adif.h"
//#include "telnetserver.h" //#include "telnetserver.h"

View File

@ -25,7 +25,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h> #include <stdio.h>
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include <time.h> #include <time.h>
#include "kernelresource.h" #include "kernelresource.h"

File diff suppressed because it is too large Load Diff

View File

@ -1,139 +0,0 @@
--- APRSCode.c
+++ APRSCode.c
@@ -3674,7 +3674,7 @@
if (ptr1)
*ptr1 = 0;
-// Debugprintf("Duplicate Message supressed %s", Msg);
+// Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate
}
}
--- BPQChat.rc
+++ BPQChat.rc
@@ -162,7 +162,7 @@
WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER
- LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
+ LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24
END
--- BPQMail.rc
+++ BPQMail.rc
@@ -1045,7 +1045,7 @@
CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
- CONTROL "Supress Mailing of Housekeeping Results",
+ CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
--- HanksRT.c
+++ HanksRT.c
@@ -1186,7 +1186,7 @@
// Duplicate, so discard, but save time
DupInfo[i].DupTime = Now;
- Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
+ Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate
}
--- RigControl.c
+++ RigControl.c
@@ -8385,7 +8385,7 @@
switch (Msg[0])
{
- case 'f': // Get Freqency
+ case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep);
return 0;
--- UZ7HODrv.c
+++ UZ7HODrv.c
@@ -374,7 +374,7 @@
{
// Read Freq
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1;
}
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}
--- WinRPRHelper.c
+++ WinRPRHelper.c
@@ -111,7 +111,7 @@
if (argc < 3)
{
- printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
+ printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n");
--- config.c
+++ config.c
@@ -649,7 +649,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
- Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
+ Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf("");
--- kiss.c
+++ kiss.c
@@ -1485,7 +1485,7 @@
}
}
else
- Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",
+ Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",
KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
goto SeeifMore; // SEE IF ANYTHING ELSE
--- templatedefs.c
+++ templatedefs.c
@@ -1165,7 +1165,7 @@
"Send Non-delivery Notifications<br>\r\n"
"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
" <br />\r\n"
- "Supress Mailing of<br>\r\n"
+ "Suppress Mailing of<br>\r\n"
"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"<div style=\"text-align: center;\"><input class='btn' name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
@@ -1454,7 +1454,7 @@
"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
- "seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
+ "separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
"<br></div>\n"
--- WebMail.c
+++ WebMail.c
@@ -2020,7 +2020,7 @@
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' "
- "value='Include Orignal Msg'>";
+ "value='Include Original Msg'>";
char Temp[1024];
char ReplyAddr[128];

47
ARDOP.c
View File

@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
int (WINAPI FAR *GetModuleFileNameExPtr)(); int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -136,6 +136,10 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
if (TNC->Streams[0].Attached) if (TNC->Streams[0].Attached)
TNC->Streams[0].ReportDISC = TRUE; TNC->Streams[0].ReportDISC = TRUE;
TNC->Streams[0].Connecting = 0;
TNC->Streams[0].Connected = 0;
TNC->Streams[0].Attached = 0;
if (TNC->TCPSock) if (TNC->TCPSock)
{ {
shutdown(TNC->TCPSock, SD_BOTH); shutdown(TNC->TCPSock, SD_BOTH);
@ -162,6 +166,9 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped"); sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped");
MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE); MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE);
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
return TRUE; return TRUE;
} }
@ -643,6 +650,12 @@ VOID ARDOPSendCommand(struct TNCINFO * TNC, char * Buff, BOOL Queue)
if (Buff[0] == 0) // Terminal Keepalive? if (Buff[0] == 0) // Terminal Keepalive?
return; return;
if (memcmp(Buff, "LISTEN ", 7) == 0)
{
strcpy(TNC->WEB_MODE, &Buff[7]);
MySetWindowText(TNC->xIDC_MODE, &Buff[7]);
}
EncLen = sprintf(Encoded, "%s\r", Buff); EncLen = sprintf(Encoded, "%s\r", Buff);
// it is possible for binary data to be dumped into the command // it is possible for binary data to be dumped into the command
@ -876,7 +889,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime)) if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
{ {
ARDOPSendCommand(TNC, "DISCONNECT", TRUE); ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
STREAM->Disconnecting = TRUE; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0;
} }
} }
@ -1719,7 +1733,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
return TNC->CONNECTED << 8 | 1; return TNC->CONNECTED << 8 | 1;
return (TNC->CONNECTED << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK return (TNC->CONNECTED << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK
case 4: // reinit7 case 4: // reinit7
@ -1918,7 +1932,7 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE); Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE); Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE); Len += sprintf(&Buff[Len], "<tr><td>Listen</td><td>%s</td></tr>", TNC->WEB_MODE);
Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s &nbsp; %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS); Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s &nbsp; %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE); Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC); Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
@ -1967,6 +1981,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->LogPath) if (TNC->LogPath)
ARDOPOpenLogFiles(TNC); ARDOPOpenLogFiles(TNC);
@ -1979,7 +1994,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_ARDOP; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1987,7 +2002,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -2134,7 +2148,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL);
TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL); TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL);
CreateWindowEx(0, "STATIC", "Mode", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "Listen", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL); TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL);
CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL);
@ -2270,11 +2284,11 @@ VOID TNCLost(struct TNCINFO * TNC)
} }
if (STREAM->Attached) if (STREAM->Attached)
{
STREAM->Connected = FALSE;
STREAM->Connecting = FALSE;
STREAM->ReportDISC = TRUE; STREAM->ReportDISC = TRUE;
}
STREAM->Connected = FALSE;
STREAM->Connecting = FALSE;
} }
} }
@ -2600,6 +2614,8 @@ VOID ARDOPThread(struct TNCINFO * TNC)
TNC->Alerted = TRUE; TNC->Alerted = TRUE;
ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC"); sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC");
MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE); MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
@ -2679,6 +2695,10 @@ VOID ARDOPThread(struct TNCINFO * TNC)
sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost"); sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost");
MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE); MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
TNC->CONNECTED = FALSE; TNC->CONNECTED = FALSE;
TNC->Alerted = FALSE; TNC->Alerted = FALSE;
@ -3300,9 +3320,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
} }
if (_memicmp(Buffer, "DISCONNECTED", 12) == 0 if (_memicmp(Buffer, "DISCONNECTED", 12) == 0
|| _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0 || _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0
|| _memicmp(Buffer, "STATUS END ARQ CALL", 19) == 0
|| _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0 || _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0
// || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0 // || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0
|| _memicmp(Buffer, "ABORT", 5) == 0) || _memicmp(Buffer, "ABORT", 5) == 0)
@ -3344,6 +3364,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
RestartTNC(TNC); RestartTNC(TNC);
} }
sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
return; return;
} }

View File

@ -19,7 +19,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#ifdef WIN32 #ifdef WIN32
@ -2219,21 +2219,21 @@ VOID ProcessUserUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
ptr1 = GetNextParam(&ptr2); // Last Listed ptr1 = GetNextParam(&ptr2); // Last Listed
USER->lastmsg = atoi(ptr1); USER->lastmsg = atoi(ptr1);
ptr1 = GetNextParam(&ptr2); // Name ptr1 = GetNextParam(&ptr2); // Name
strcpy(USER->Name, ptr1); memcpy(USER->Name, ptr1, 17);
ptr1 = GetNextParam(&ptr2); // Pass ptr1 = GetNextParam(&ptr2); // Pass
strcpy(USER->pass, ptr1); memcpy(USER->pass, ptr1, 12);
ptr1 = GetNextParam(&ptr2); // CMS Pass ptr1 = GetNextParam(&ptr2); // CMS Pass
if (memcmp("****************", ptr1, strlen(ptr1) != 0)) if (memcmp("****************", ptr1, strlen(ptr1) != 0))
{ {
strcpy(USER->CMSPass, ptr1); memcpy(USER->CMSPass, ptr1, 15);
} }
ptr1 = GetNextParam(&ptr2); // QTH ptr1 = GetNextParam(&ptr2); // QTH
strcpy(USER->Address, ptr1); memcpy(USER->Address, ptr1, 60);
ptr1 = GetNextParam(&ptr2); // ZIP ptr1 = GetNextParam(&ptr2); // ZIP
strcpy(USER->ZIP, ptr1); memcpy(USER->ZIP, ptr1, 8);
ptr1 = GetNextParam(&ptr2); // HomeBBS ptr1 = GetNextParam(&ptr2); // HomeBBS
strcpy(USER->HomeBBS, ptr1); memcpy(USER->HomeBBS, ptr1, 40);
_strupr(USER->HomeBBS); _strupr(USER->HomeBBS);
SaveUserDatabase(); SaveUserDatabase();
@ -3038,13 +3038,10 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
const char * auth_header = "Authorization: Bearer "; const char * auth_header = "Authorization: Bearer ";
char * token_begin = strstr(MsgPtr, auth_header); char * token_begin = strstr(MsgPtr, auth_header);
int Flags = 0, n; int Flags = 0;
// Node Flags isn't currently used // Node Flags isn't currently used
char * Tok;
char * param;
if (token_begin) if (token_begin)
{ {
// Using Auth Header // Using Auth Header

View File

@ -28,6 +28,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
BOOL Bells; BOOL Bells;
BOOL FlashOnBell; // Flash instead of Beep BOOL FlashOnBell; // Flash instead of Beep
@ -77,7 +81,7 @@ FARPROCX pRefreshWebMailIndex;
Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall); Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall);
VOID APIENTRY md5 (char *arg, unsigned char * checksum); VOID APIENTRY md5 (char *arg, unsigned char * checksum);
int APIENTRY GetRaw(int stream, char * msg, int * len, int * count); int APIENTRY GetRaw(int stream, char * msg, int * len, int * count);
void GetSemaphore(struct SEM * Semaphore, int ID); void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
int EncryptPass(char * Pass, char * Encrypt); int EncryptPass(char * Pass, char * Encrypt);
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len); VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
@ -6574,8 +6578,6 @@ VOID CreateMessageFile(ConnectionInfo * conn, struct MsgInfo * Msg)
} }
VOID SendUnbuffered(int stream, char * msg, int len) VOID SendUnbuffered(int stream, char * msg, int len)
{ {
#ifndef LINBPQ #ifndef LINBPQ
@ -7302,7 +7304,7 @@ VOID SetupForwardingStruct(struct UserInfo * user)
if (ForwardingInfo->ConTimeout == 0) if (ForwardingInfo->ConTimeout == 0)
ForwardingInfo->ConTimeout = 120; ForwardingInfo->ConTimeout = 120;
GetStringValue(group, "BBSHA", Temp); GetStringValue(group, "BBSHA", Temp, 100);
if (Temp[0]) if (Temp[0])
ForwardingInfo->BBSHA = _strdup(Temp); ForwardingInfo->BBSHA = _strdup(Temp);
@ -10136,15 +10138,20 @@ int GetIntValueWithDefault(config_setting_t * group, char * name, int Default)
} }
BOOL GetStringValue(config_setting_t * group, char * name, char * value) BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
{ {
const char * str; char * str;
config_setting_t *setting; config_setting_t *setting;
setting = config_setting_get_member (group, name); setting = config_setting_get_member (group, name);
if (setting) if (setting)
{ {
str = config_setting_get_string (setting); str = (char *)config_setting_get_string (setting);
if (strlen(str) > maxlen)
{
Debugprintf("Suspect config record %s", str);
str[maxlen] = 0;
}
strcpy(value, str); strcpy(value, str);
return TRUE; return TRUE;
} }
@ -10221,25 +10228,24 @@ BOOL GetConfig(char * ConfigName)
Localtime = GetIntValue(group, "Localtime"); Localtime = GetIntValue(group, "Localtime");
AliasText = GetMultiStringValue(group, "FWDAliases"); AliasText = GetMultiStringValue(group, "FWDAliases");
GetStringValue(group, "BBSName", BBSName); GetStringValue(group, "BBSName", BBSName, 100);
GetStringValue(group, "MailForText", MailForText); GetStringValue(group, "MailForText", MailForText, 100);
GetStringValue(group, "SYSOPCall", SYSOPCall); GetStringValue(group, "SYSOPCall", SYSOPCall, 100);
GetStringValue(group, "H-Route", HRoute); GetStringValue(group, "H-Route", HRoute, 100);
GetStringValue(group, "AMPRDomain", AMPRDomain); GetStringValue(group, "AMPRDomain", AMPRDomain, 100);
SendAMPRDirect = GetIntValue(group, "SendAMPRDirect"); SendAMPRDirect = GetIntValue(group, "SendAMPRDirect");
ISP_Gateway_Enabled = GetIntValue(group, "SMTPGatewayEnabled"); ISP_Gateway_Enabled = GetIntValue(group, "SMTPGatewayEnabled");
ISPPOP3Interval = GetIntValue(group, "POP3PollingInterval"); ISPPOP3Interval = GetIntValue(group, "POP3PollingInterval");
GetStringValue(group, "MyDomain", MyDomain); GetStringValue(group, "MyDomain", MyDomain, 50);
GetStringValue(group, "ISPSMTPName", ISPSMTPName); GetStringValue(group, "ISPSMTPName", ISPSMTPName, 50);
GetStringValue(group, "ISPPOP3Name", ISPPOP3Name); GetStringValue(group, "ISPPOP3Name", ISPPOP3Name, 50);
ISPSMTPPort = GetIntValue(group, "ISPSMTPPort"); ISPSMTPPort = GetIntValue(group, "ISPSMTPPort");
ISPPOP3Port = GetIntValue(group, "ISPPOP3Port"); ISPPOP3Port = GetIntValue(group, "ISPPOP3Port");
GetStringValue(group, "ISPAccountName", ISPAccountName); GetStringValue(group, "ISPAccountName", ISPAccountName, 50);
GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass); GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
GetStringValue(group, "ISPAccountName", ISPAccountName);
sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default
GetStringValue(group, "SignoffMsg", SignoffMsg); GetStringValue(group, "SignoffMsg", ISPAccountName, 50);
DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass)); DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
@ -10251,10 +10257,10 @@ BOOL GetConfig(char * ConfigName)
#ifndef LINBPQ #ifndef LINBPQ
GetStringValue(group, "MonitorSize", Size); GetStringValue(group, "MonitorSize", Size, sizeof(Size));
sscanf(Size,"%d,%d,%d,%d,%d",&MonitorRect.left,&MonitorRect.right,&MonitorRect.top,&MonitorRect.bottom,&OpenMon); sscanf(Size,"%d,%d,%d,%d,%d",&MonitorRect.left,&MonitorRect.right,&MonitorRect.top,&MonitorRect.bottom,&OpenMon);
GetStringValue(group, "WindowSize", Size); GetStringValue(group, "WindowSize", Size, sizeof(Size));
sscanf(Size,"%d,%d,%d,%d",&MainRect.left,&MainRect.right,&MainRect.top,&MainRect.bottom); sscanf(Size,"%d,%d,%d,%d",&MainRect.left,&MainRect.right,&MainRect.top,&MainRect.bottom);
Bells = GetIntValue(group, "Bells"); Bells = GetIntValue(group, "Bells");
@ -10267,7 +10273,7 @@ BOOL GetConfig(char * ConfigName)
WrapInput = GetIntValue(group, "WrapInput"); WrapInput = GetIntValue(group, "WrapInput");
FlashOnConnect = GetIntValue(group, "FlashOnConnect"); FlashOnConnect = GetIntValue(group, "FlashOnConnect");
GetStringValue(group, "ConsoleSize", Size); GetStringValue(group, "ConsoleSize", Size, 80);
sscanf(Size,"%d,%d,%d,%d,%d", &ConsoleRect.left, &ConsoleRect.right, sscanf(Size,"%d,%d,%d,%d,%d", &ConsoleRect.left, &ConsoleRect.right,
&ConsoleRect.top, &ConsoleRect.bottom,&OpenConsole); &ConsoleRect.top, &ConsoleRect.bottom,&OpenConsole);
@ -10346,7 +10352,7 @@ BOOL GetConfig(char * ConfigName)
// Get FBB Filters // Get FBB Filters
GetStringValue(group, "FBBFilters", FBBString); GetStringValue(group, "FBBFilters", FBBString, sizeof(FBBString));
ptr1 = FBBString; ptr1 = FBBString;
@ -10432,8 +10438,8 @@ BOOL GetConfig(char * ConfigName)
SendWP = GetIntValue(group, "SendWP"); SendWP = GetIntValue(group, "SendWP");
SendWPType = GetIntValue(group, "SendWPType"); SendWPType = GetIntValue(group, "SendWPType");
GetStringValue(group, "SendWPTO", SendWPTO); GetStringValue(group, "SendWPTO", SendWPTO, sizeof(SendWPTO));
GetStringValue(group, "SendWPVIA", SendWPVIA); GetStringValue(group, "SendWPVIA", SendWPVIA, sizeof(SendWPVIA));
SendWPAddrs = GetMultiStringValue(group, "SendWPAddrs"); SendWPAddrs = GetMultiStringValue(group, "SendWPAddrs");
@ -10463,7 +10469,7 @@ BOOL GetConfig(char * ConfigName)
SendWPVIA[0] = 0; SendWPVIA[0] = 0;
} }
GetStringValue(group, "Version", Size); GetStringValue(group, "Version", Size, sizeof(Size));
sscanf(Size,"%d,%d,%d,%d", &LastVer[0], &LastVer[1], &LastVer[2], &LastVer[3]); sscanf(Size,"%d,%d,%d,%d", &LastVer[0], &LastVer[1], &LastVer[2], &LastVer[3]);
for (i =1 ; i <= GetNumberofPorts(); i++) for (i =1 ; i <= GetNumberofPorts(); i++)
@ -10481,7 +10487,7 @@ BOOL GetConfig(char * ConfigName)
UIHDDR[i] = GetIntValueWithDefault(group, "SendHDDR", UIEnabled[i]); UIHDDR[i] = GetIntValueWithDefault(group, "SendHDDR", UIEnabled[i]);
UINull[i] = GetIntValue(group, "SendNull"); UINull[i] = GetIntValue(group, "SendNull");
Size[0] = 0; Size[0] = 0;
GetStringValue(group, "Digis", Size); GetStringValue(group, "Digis", Size, sizeof(Size));
if (Size[0]) if (Size[0])
UIDigi[i] = _strdup(Size); UIDigi[i] = _strdup(Size);
} }

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "time.h" #include "time.h"
#include "stdio.h" #include "stdio.h"
@ -932,7 +932,7 @@ int SendRIPTimer()
// Delay more if Locked - they could be retrying for a long time // Delay more if Locked - they could be retrying for a long time
if ((Route->NEIGHBOUR_FLAG & 1)) // LOCKED ROUTE if ((Route->NEIGHBOUR_FLAG)) // LOCKED ROUTE
INP3Delay = 1200; INP3Delay = 1200;
else else
INP3Delay = 600; INP3Delay = 600;

View File

@ -1146,6 +1146,8 @@
// Fix sending ampr.org mail when RMS is not enabled (51) // Fix sending ampr.org mail when RMS is not enabled (51)
// Send forwarding info to packetnodes.spots.radio database (51) // Send forwarding info to packetnodes.spots.radio database (51)
// Fix bug in WP Message processing (56) // Fix bug in WP Message processing (56)
// Fix treating addresses ending in WW as Internet (57)
// Run sending to packetnodes.spots.radio in a separate thread (61)
#include "bpqmail.h" #include "bpqmail.h"
#include "winstdint.h" #include "winstdint.h"
@ -1537,7 +1539,11 @@ VOID WriteMiniDump()
} }
void GetSemaphore(struct SEM * Semaphore, int ID)
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free

View File

@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include "vmm.h" //#include "vmm.h"
#include "CHeaders.h" #include "cheaders.h"
extern int SENDNETFRAME(); extern int SENDNETFRAME();

View File

@ -56,7 +56,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#ifndef WIN32 #ifndef WIN32
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>

24
Bpq32.c
View File

@ -3,7 +3,7 @@ Copyright 2001-2022 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32. This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify LinBPQ/BPQ32 is free software: you can redistribute it and/or modifyextern int HTTP
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
@ -1241,6 +1241,18 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add MQTT reporting of Mail Events (54) // Add MQTT reporting of Mail Events (54)
// Fix beaconong on KISSHF ports (55) // Fix beaconong on KISSHF ports (55)
// Fix MailAPI msgs endpoint // Fix MailAPI msgs endpoint
// Attempt to fix NC going to wrong application. (57)
// Improve ARDOP end of session code (58)
// Run M0LTE Map reporting in a separate thread (59/60)
// Add RHP support for WhatsPac (59)
// Add timestamps to LIS monitor (60)
// Fix problem with L4 frames being delivered out of sequence (60)
// Add Compression of Netrom connections (62)
// Improve handling of Locked Routes (62)
// Add L4 RESET (Paula G8PZT's extension to NETROM)
// Fix problem using SENDRAW from BPQMail (63)
// Fix compatibility with latest ardopcf (64)
// Fix bug in RHP socket timeout code (65)
#define CKernel #define CKernel
@ -1503,6 +1515,7 @@ VOID APRSClose();
VOID CloseTNCEmulator(); VOID CloseTNCEmulator();
VOID Poll_AGW(); VOID Poll_AGW();
void RHPPoll();
BOOL AGWAPIInit(); BOOL AGWAPIInit();
int AGWAPITerminate(); int AGWAPITerminate();
@ -1521,7 +1534,9 @@ UINT Sem_edx = 0;
UINT Sem_esi = 0; UINT Sem_esi = 0;
UINT Sem_edi = 0; UINT Sem_edi = 0;
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI; DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI;
@ -1869,8 +1884,8 @@ VOID MonitorThread(int x)
{ {
// It is stuck - try to release // It is stuck - try to release
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d", Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
Semaphore.SemProcessID, SemHeldByAPI); Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
// Write a minidump // Write a minidump
@ -2291,6 +2306,7 @@ VOID TimerProcX()
Poll_AGW(); Poll_AGW();
DRATSPoll(); DRATSPoll();
RHPPoll();
CheckGuardZone(); CheckGuardZone();

View File

@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#ifdef LINBPQ #ifdef LINBPQ
#include "compatbits.h" #include "compatbits.h"
char * strlop(const char * buf, char delim); char * strlop(char * buf, char delim);
#define APIENTRY #define APIENTRY
#define VOID void #define VOID void

View File

@ -39,7 +39,8 @@ VOID __cdecl Logprintf(int LogMode, ChatCIRCUIT * conn, int InOut, const char *
return; return;
} }
void GetSemaphore(struct SEM * Semaphore, int ID)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free
@ -74,6 +75,9 @@ loop1:
; ;
} }
Semaphore->Line = Line;
strcpy(Semaphore->File, File);
return; return;
} }
void FreeSemaphore(struct SEM * Semaphore) void FreeSemaphore(struct SEM * Semaphore)

194
Cmd.c
View File

@ -35,7 +35,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include "vmm.h" //#include "vmm.h"
//#include "SHELLAPI.H" //#include "SHELLAPI.H"
#include "CHeaders.h" #include "cheaders.h"
#include "bpqaprs.h" #include "bpqaprs.h"
#include "kiss.h" #include "kiss.h"
@ -988,7 +988,6 @@ VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
{ {
char * ptr, *Context; char * ptr, *Context;
int Port = 0, cols = NUMBEROFPORTS, i; int Port = 0, cols = NUMBEROFPORTS, i;
char * uptime;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct PORTCONTROL * STARTPORT; struct PORTCONTROL * STARTPORT;
@ -1517,7 +1516,7 @@ VOID CMDP00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE * Routes, char Verbose) char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE * Routes, char Verbose)
{ {
char Normcall[10]; char Normcall[10];
char locked[] = " ! "; char locked[4] = " ";
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
char PercentString[20]; char PercentString[20];
@ -1531,11 +1530,16 @@ char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE *
Normcall[9]=0; Normcall[9]=0;
if ((Routes->NEIGHBOUR_FLAG & 1) == 1) if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
strcpy(locked, "!"); strcpy(locked, "!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
strcpy(locked, " "); strcpy(locked, " ");
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
if (Routes->NEIGHBOUR_LINK && Routes->NEIGHBOUR_LINK->L2STATE >= 5) if (Routes->NEIGHBOUR_LINK && Routes->NEIGHBOUR_LINK->L2STATE >= 5)
@ -1679,7 +1683,7 @@ ROUTEUPDATE:
{ {
// Toggle Lock // Toggle Lock
Routes->NEIGHBOUR_FLAG ^= 1; // FLIP LOCKED BIT Routes->NEIGHBOUR_FLAG ^= LOCKEDBYSYSOP; // FLIP LOCKED BIT
goto Displayit; goto Displayit;
} }
@ -1698,7 +1702,7 @@ ROUTEUPDATE:
{ {
// Toggle Lock // Toggle Lock
Routes->NEIGHBOUR_FLAG ^= 1; // FLIP LOCKED BIT Routes->NEIGHBOUR_FLAG ^= LOCKEDBYSYSOP; // FLIP LOCKED BIT
goto Displayit; goto Displayit;
} }
} }
@ -1712,167 +1716,6 @@ Displayit:
else else
Bufferptr = Cmdprintf(Session, Bufferptr, "Not Found\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Not Found\r");
/* MOV ROUTEDISP,1
CMP BYTE PTR [ESI],20H
JE SHORT JUSTDISPLAY
MOV ZAPFLAG,0
CMP BYTE PTR [ESI],'Z'
JNE SHORT NOTZAP
MOV ZAPFLAG,1
JMP SHORT JUSTDISPLAY
PUBLIC NOTZAP
NOTZAP:
MOV ROUTEDISP,2 ; LOCK UPDATE
CMP BYTE PTR [ESI],'!'
JE SHORT JUSTDISPLAY
;
; LOOK FOR V FOR ADDING A DIGI
;
CMP WORD PTR [ESI],' V' ; V [SPACE]
JE ADDDIGI
CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH
JC SHORT BADROUTECMD ; INVALID DIGITS
MOV NEWROUTEVAL,AL
MOV ROUTEDISP,0
CALL SCAN ; SEE IF !
MOV AH,[ESI]
PUBLIC JUSTDISPLAY
JUSTDISPLAY:
MOV ESI,OFFSET32 AX25CALL
CALL _FINDNEIGHBOUR
JZ SHORT FOUNDROUTE ; IN LIST - OK
CMP EBX,0
JE SHORT BADROUTECMD ; TABLE FULL??
MOV ECX,7
MOV EDI,EBX
REP MOVSB ; PUT IN CALL
MOV AL,SAVEPORT
MOV NEIGHBOUR_PORT[EBX],AL
JMP SHORT FOUNDROUTE
PUBLIC BADROUTECMD
BADROUTECMD:
POP EDI
JMP PBADVALUE
PUBLIC FOUNDROUTE
FOUNDROUTE:
CMP ZAPFLAG,1
JNE SHORT NOTCLEARCOUNTS
XOR AX,AX
MOV ES:WORD PTR NBOUR_IFRAMES[EDI],AX
MOV ES:WORD PTR NBOUR_IFRAMES+2[EDI],AX
MOV ES:WORD PTR NBOUR_RETRIES[EDI],AX
MOV ES:WORD PTR NBOUR_RETRIES+2[EDI],AX
JMP SHORT NOUPDATE
PUBLIC NOTCLEARCOUNTS
NOTCLEARCOUNTS:
CMP ROUTEDISP,1
JE SHORT NOUPDATE
CMP ROUTEDISP,2
JE SHORT LOCKUPDATE
MOV AL,NEWROUTEVAL
MOV NEIGHBOUR_QUAL[EBX],AL
CMP AH,'!'
JNE SHORT NOUPDATE
PUBLIC LOCKUPDATE
LOCKUPDATE:
XOR NEIGHBOUR_FLAG[EBX],1 ; FLIP LOCKED BIT
PUBLIC NOUPDATE
NOUPDATE:
MOV ESI,EBX
POP EDI
POP EBX
CALL DISPLAYROUTE
JMP SENDCOMMANDREPLY
PUBLIC ADDDIGI
ADDDIGI:
ADD ESI,2
PUSH ESI ; SAVE INPUT BUFFER
MOV ESI,OFFSET32 AX25CALL
CALL _FINDNEIGHBOUR
POP ESI
JZ SHORT ADD_FOUND ; IN LIST - OK
JMP BADROUTECMD
PUBLIC ADD_FOUND
ADD_FOUND:
CALL CONVTOAX25 ; GET DIGI CALLSIGN
PUSH ESI
MOV ESI,OFFSET32 AX25CALL
LEA EDI,NEIGHBOUR_DIGI[EBX]
MOV ECX,7
REP MOVSB
POP ESI ; MSG BUFFER
;
; SEE IF ANOTHER DIGI
;
CMP BYTE PTR [ESI],20H
JE SHORT NOMORE
CALL CONVTOAX25 ; GET DIGI CALLSIGN
MOV ESI,OFFSET32 AX25CALL
LEA EDI,NEIGHBOUR_DIGI+7[EBX]
MOV ECX,7
REP MOVSB
PUBLIC NOMORE
NOMORE:
JMP NOUPDATE
*/
SendReply: SendReply:
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
@ -4145,7 +3988,7 @@ VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
if (ret & 0x8000) // Disconnecting if (ret & 0x8000) // Disconnecting
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use (Disconnecting)\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return; return;
} }
@ -4196,14 +4039,25 @@ VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
if (EXTPORT->ATTACHEDSESSIONS[sess] || PORT->PortSuspended) if (EXTPORT->ATTACHEDSESSIONS[sess])
{ {
// In use // In use
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use (Session Attached\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return; return;
} }
if (PORT->PortSuspended)
{
// In use
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port Suspended\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
// GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK // GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK
NewSess = SetupNewSession(Session, Bufferptr); NewSess = SetupNewSession(Session, Bufferptr);

View File

@ -18,7 +18,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c // General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
@ -32,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "configstructs.h" #include "configstructs.h"
@ -69,7 +68,7 @@ VOID WriteMiniDump();
void printStack(void); void printStack(void);
char * FormatMH(PMHSTRUC MH, char Format); char * FormatMH(PMHSTRUC MH, char Format);
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode); void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
void SendDataToPktMap(char *Msg); void SendDataToPktMap();
extern BOOL LogAllConnects; extern BOOL LogAllConnects;
extern BOOL M0LTEMap; extern BOOL M0LTEMap;
@ -571,7 +570,7 @@ void * zalloc(int len)
return ptr; return ptr;
} }
char * strlop(const char * buf, char delim) char * strlop(char * buf, char delim)
{ {
// Terminate buf at delim, and return rest of string // Terminate buf at delim, and return rest of string
@ -914,7 +913,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
sprintf(Msg, "%d SCANSTOP", TNC->Port); sprintf(Msg, "%d SCANSTOP", TNC->Port);
Rig_Command( (TRANSPORTENTRY *) -1, Msg); Rig_Command((TRANSPORTENTRY *) -1, Msg);
UpdateMH(TNC, Call, '+', 'I'); UpdateMH(TNC, Call, '+', 'I');
} }
@ -1456,7 +1455,21 @@ DllExport int APIENTRY SessionStateNoAck(int stream, int * state)
return 0; return 0;
} }
int SendMsgEx(int stream, char * msg, int len, int GetSem);
int SendMsgNoSem(int stream, char * msg, int len)
{
return SendMsgEx(stream, msg, len, 0);
}
DllExport int APIENTRY SendMsg(int stream, char * msg, int len) DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
{
return SendMsgEx(stream, msg, len, 1);
}
int SendMsgEx(int stream, char * msg, int len, int GetSem)
{ {
// Send message to stream (BPQHOST Function 2) // Send message to stream (BPQHOST Function 2)
@ -1479,11 +1492,13 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
if (QCOUNT < 50) if (QCOUNT < 50)
return 0; // Dont want to run out return 0; // Dont want to run out
GetSemaphore(&Semaphore, 10); if (GetSem)
GetSemaphore(&Semaphore, 10);
if ((MSG = GetBuff()) == 0) if ((MSG = GetBuff()) == 0)
{ {
FreeSemaphore(&Semaphore); if (GetSem)
FreeSemaphore(&Semaphore);
return 0; return 0;
} }
@ -1494,7 +1509,8 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
SENDUIMESSAGE(MSG); SENDUIMESSAGE(MSG);
ReleaseBuffer(MSG); ReleaseBuffer(MSG);
FreeSemaphore(&Semaphore); if (GetSem)
FreeSemaphore(&Semaphore);
return 0; return 0;
} }
@ -1509,13 +1525,15 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
if (L4 == 0) if (L4 == 0)
return 0; return 0;
GetSemaphore(&Semaphore, 22); if (GetSem)
GetSemaphore(&Semaphore, 22);
SESS->HOSTFLAGS |= 0x80; // SET ALLOCATED BIT SESS->HOSTFLAGS |= 0x80; // SET ALLOCATED BIT
if (QCOUNT < 40) // PLENTY FREE? if (QCOUNT < 40) // PLENTY FREE?
{ {
FreeSemaphore(&Semaphore); if (GetSem)
FreeSemaphore(&Semaphore);
return 1; return 1;
} }
@ -1528,14 +1546,16 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
if (n > 100) if (n > 100)
{ {
Debugprintf("Stream %d QCOUNT %d Q Len %d - discarding", stream, QCOUNT, n); Debugprintf("Stream %d QCOUNT %d Q Len %d - discarding", stream, QCOUNT, n);
FreeSemaphore(&Semaphore); if (GetSem)
FreeSemaphore(&Semaphore);
return 1; return 1;
} }
} }
if ((MSG = GetBuff()) == 0) if ((MSG = GetBuff()) == 0)
{ {
FreeSemaphore(&Semaphore); if (GetSem)
FreeSemaphore(&Semaphore);
return 1; return 1;
} }
@ -1562,7 +1582,8 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
else else
C_Q_ADD(&L4->L4RX_Q, MSG); C_Q_ADD(&L4->L4RX_Q, MSG);
FreeSemaphore(&Semaphore); if (GetSem)
FreeSemaphore(&Semaphore);
return 0; return 0;
} }
DllExport int APIENTRY SendRaw(int port, char * msg, int len) DllExport int APIENTRY SendRaw(int port, char * msg, int len)
@ -1601,7 +1622,7 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
MSG->LENGTH = len + MSGHDDRLEN; MSG->LENGTH = len + MSGHDDRLEN;
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF) // PACTOR/WINMOR Style if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF) // PACTOR/WINMOR Style
{ {
// Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR // Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
@ -2665,6 +2686,14 @@ int DoRoutes()
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{ {
// Dont save routes from config file here or they are difficult to get rid of
if (Routes->NEIGHBOUR_FLAG & LOCKEDBYCONFIG)
{
Routes++;
continue;
}
len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall); len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall);
Normcall[len]=0; Normcall[len]=0;
@ -2688,7 +2717,7 @@ int DoRoutes()
digis[0] = 0; digis[0] = 0;
len=sprintf(line, len=sprintf(line,
"ROUTE ADD %s %d %d %s %d %d %d %d %d\n", "ROUTE ADD %s %d %d %s %d %d %d %d %d %c\n",
Normcall, Normcall,
Routes->NEIGHBOUR_PORT, Routes->NEIGHBOUR_PORT,
Routes->NEIGHBOUR_QUAL, digis, Routes->NEIGHBOUR_QUAL, digis,
@ -2696,7 +2725,8 @@ int DoRoutes()
Routes->NBOUR_FRACK, Routes->NBOUR_FRACK,
Routes->NBOUR_PACLEN, Routes->NBOUR_PACLEN,
Routes->INP3Node | (Routes->NoKeepAlive << 2), Routes->INP3Node | (Routes->NoKeepAlive << 2),
Routes->OtherendsRouteQual); Routes->OtherendsRouteQual,
(Routes->NEIGHBOUR_FLAG & LOCKEDBYSYSOP)?'!':' ');
fputs(line, file); fputs(line, file);
} }
@ -3318,7 +3348,7 @@ VOID SendLocation()
SendReportMsg((char *)&AXMSG.DEST, Len + 16); SendReportMsg((char *)&AXMSG.DEST, Len + 16);
if (M0LTEMap) if (M0LTEMap)
SendDataToPktMap(""); SendDataToPktMap();
return; return;
@ -3326,7 +3356,6 @@ VOID SendLocation()
VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode) VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode)
{ {
MESSAGE AXMSG; MESSAGE AXMSG;
@ -3342,7 +3371,8 @@ VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * M
// Block includes the Msg Header (7 bytes), Len Does not! // Block includes the Msg Header (7 bytes), Len Does not!
memcpy(AXPTR->DEST, ReportDest, 7); memcpy(AXPTR->DEST, ReportDest, 7);
if (TNC->PortRecord->PORTCONTROL.PORTCALL[0])
if (TNC && TNC->PortRecord->PORTCONTROL.PORTCALL[0])
memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7); memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7);
else else
memcpy(AXPTR->ORIGIN, MYCALL, 7); memcpy(AXPTR->ORIGIN, MYCALL, 7);
@ -3502,8 +3532,10 @@ int __sync_lock_test_and_set(int * ptr, int val)
#endif // MACBPQ #endif // MACBPQ
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void GetSemaphore(struct SEM * Semaphore, int ID)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free
@ -3547,6 +3579,8 @@ loop1:
Semaphore->SemProcessID = GetCurrentProcessId(); Semaphore->SemProcessID = GetCurrentProcessId();
Semaphore->SemThreadID = GetCurrentThreadId(); Semaphore->SemThreadID = GetCurrentThreadId();
SemHeldByAPI = ID; SemHeldByAPI = ID;
Semaphore->Line = Line;
strcpy(Semaphore->File, File);
return; return;
} }
@ -4171,10 +4205,10 @@ VOID GetUIConfig()
if (group) if (group)
{ {
GetStringValue(group, "UIDEST", &UIUIDEST[Port][0]); GetStringValue(group, "UIDEST", &UIUIDEST[Port][0], 11);
GetStringValue(group, "FileName", &FN[Port][0]); GetStringValue(group, "FileName", &FN[Port][0], 256);
GetStringValue(group, "Message", &Message[Port][0]); GetStringValue(group, "Message", &Message[Port][0], 1000);
GetStringValue(group, "Digis", Digis); GetStringValue(group, "Digis", Digis, 100);
UIUIDigi[Port] = _strdup(Digis); UIUIDigi[Port] = _strdup(Digis);
Interval[Port] = GetIntValue(group, "Interval"); Interval[Port] = GetIntValue(group, "Interval");
@ -4205,15 +4239,21 @@ int GetIntValue(config_setting_t * group, char * name)
return 0; return 0;
} }
BOOL GetStringValue(config_setting_t * group, char * name, char * value) BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
{ {
const char * str; char * str;
config_setting_t *setting; config_setting_t *setting;
setting = config_setting_get_member (group, name); setting = config_setting_get_member (group, name);
if (setting) if (setting)
{ {
str = config_setting_get_string (setting); str = (char *)config_setting_get_string(setting);
if (strlen(str) > maxlen)
{
Debugprintf("Suspect config record %s", str);
str[maxlen] = 0;
}
strcpy(value, str); strcpy(value, str);
return TRUE; return TRUE;
} }
@ -5131,10 +5171,16 @@ skipit:
} }
} }
void SendDataToPktMapThread();
void SendDataToPktMap(char *Msg) void SendDataToPktMap()
{ {
char Return[256]; _beginthread(SendDataToPktMapThread,2048000,0);
}
void SendDataToPktMapThread()
{
char Return[256] = "";
char Request[64]; char Request[64];
char Params[50000]; char Params[50000];
@ -5582,7 +5628,7 @@ void SendDataToPktMap(char *Msg)
// "contact": "string", // "contact": "string",
// "neighbours": [{"node": "G7TAJ","port": "30"}] // "neighbours": [{"node": "G7TAJ","port": "30"}]
SendWebRequest("packetnodes.spots.radio", Request, Params, Return); SendWebRequest("packetnodes.spots.radio", Request, Params, 0);
} }
// ="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}"; // ="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}";

View File

@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "compatbits.h" #include "compatbits.h"
#include "CHeaders.h" #include "cheaders.h"
extern QCOUNT; extern QCOUNT;
extern BPQVECSTRUC BPQHOSTVECTOR[]; extern BPQVECSTRUC BPQHOSTVECTOR[];

View File

@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "telnetserver.h" #include "telnetserver.h"

View File

@ -125,7 +125,6 @@ void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _
strcpy(LINK->callingCall, remotecall); strcpy(LINK->callingCall, remotecall);
strcpy(LINK->receivingCall, ourcall); strcpy(LINK->receivingCall, ourcall);
strcpy(LINK->Direction, "In"); strcpy(LINK->Direction, "In");
} }
void hookL2SessionDeleted(struct _LINKTABLE * LINK) void hookL2SessionDeleted(struct _LINKTABLE * LINK)

View File

@ -23,6 +23,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress); int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);

View File

@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
@ -1180,7 +1180,6 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
@ -1211,7 +1210,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_FLDIGI; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View File

@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "tncinfo.h" #include "tncinfo.h"
@ -1393,14 +1393,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_FREEDATA; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FREEDATA;
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->ARDOPDataBuffer = malloc(MAXRXSIZE); TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
TNC->ARDOPBuffer = malloc(FREEDATABUFLEN); TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -499,15 +499,15 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_HAL; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HAL;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
PortEntry->MAXHOSTMODESESSIONS = 1; // Default PortEntry->MAXHOSTMODESESSIONS = 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {

View File

@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "kernelresource.h" #include "kernelresource.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#ifndef LINBPQ #ifndef LINBPQ
#include <commctrl.h> #include <commctrl.h>
@ -336,7 +336,8 @@ LRESULT CALLBACK PacWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
} }
#endif #endif
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc()) BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height,
VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream))
{ {
#ifdef LINBPQ #ifdef LINBPQ
return FALSE; return FALSE;

View File

@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#pragma pack(1) #pragma pack(1)
@ -1177,10 +1177,10 @@ VOID * HSMODEMExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_HSMODEM;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HSMODEM;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "templatedefs.c" // Inline definitions from HTLMPages #include "templatedefs.c" // Inline definitions from HTLMPages

View File

@ -17,14 +17,13 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses 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 WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#define DllImport #define DllImport
#include "CHeaders.h" #include "cheaders.h"
#include <stdlib.h> #include <stdlib.h>
#include "tncinfo.h" #include "tncinfo.h"
@ -70,6 +69,9 @@ char * GetStandardPage(char * FN, int * Len);
BOOL SHA1PasswordHash(char * String, char * Hash); BOOL SHA1PasswordHash(char * String, char * Hash);
char * byte_base64_encode(char *str, int len); char * byte_base64_encode(char *str, int len);
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
extern struct ROUTE * NEIGHBOURS; extern struct ROUTE * NEIGHBOURS;
extern int ROUTE_LEN; extern int ROUTE_LEN;
@ -142,7 +144,7 @@ char Tail[] = "</body></html>";
char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>" char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>"
"<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>"; "<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>";
char RouteLine[] = "<tr><td>%s%d</td><td>%s%c</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>"; char RouteLine[] = "<tr><td>%s%d</td><td>%s%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>";
char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>" char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>"
"<table align=center bgcolor=white>" "<table align=center bgcolor=white>"
"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>" "<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
@ -1852,6 +1854,43 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
} }
} }
if (_memicmp(Context, "/rhp/", 5) == 0 || _stricmp(Context, "/rhp") == 0)
{
{
ReplyLen = RHPProcessHTTPMessage(conn, _REPLYBUFFER, Method, Context, MsgPtr, LOCAL, COOKIE);
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{
// Full Message - just send it
sendandcheck(sock, _REPLYBUFFER, ReplyLen);
return 0;
}
if (allowDeflate)
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
else
Compressed = _REPLYBUFFER;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\n"
"Content-Length: %d\r\n"
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"Access-Control-Allow-Origin: *\r\n"
"%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
if (allowDeflate)
free (Compressed);
return 0;
}
}
// APRS process internally // APRS process internally
if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0) if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0)
@ -2374,7 +2413,10 @@ doHeader:
if (Session == 0) if (Session == 0)
Session = &Dummy; Session = &Dummy;
Session->TNC = LOCAL; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag if (LOCAL)
Session->TNC = (struct TNCINFO *)(uintptr_t)1; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
else
Session->TNC = 0;
WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL); WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL); WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
@ -3758,7 +3800,7 @@ doHeader:
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int count; int count;
char Normcall[10]; char Normcall[10];
char locked; char locked[4] = " ";
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
int Iframes, Retries; int Iframes, Retries;
@ -3774,10 +3816,14 @@ doHeader:
int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall); int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
Normcall[len]=0; Normcall[len]=0;
if ((Routes->NEIGHBOUR_FLAG & 1) == 1) if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
locked = '!'; strcpy(locked, "!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
locked = ' '; strcpy(locked, " ");
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
@ -4284,7 +4330,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
{ {
int ReplyLen = 0; int ReplyLen = 0;
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
char * user, * password, * Key; char * user, * password;
struct HTTPConnectionInfo * NewSession; struct HTTPConnectionInfo * NewSession;
int i; int i;
struct UserRec * USER; struct UserRec * USER;
@ -5135,6 +5181,3 @@ void SHA1PadMessage(SHA1Context *context)
} }

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#ifdef LINBPQ #ifdef LINBPQ
#include "CHeaders.h" #include "cheaders.h"
#endif #endif
#include "bpqchat.h" #include "bpqchat.h"
@ -4178,10 +4178,10 @@ BOOL GetChatConfig(char * ConfigName)
MaxChatStreams = GetIntValue(group, "MaxStreams"); MaxChatStreams = GetIntValue(group, "MaxStreams");
reportChatEvents = GetIntValue(group, "reportChatEvents"); reportChatEvents = GetIntValue(group, "reportChatEvents");
chatPaclen = GetIntValue(group, "chatPaclen"); chatPaclen = GetIntValue(group, "chatPaclen");
GetStringValue(group, "OtherChatNodes", OtherNodesList); GetStringValue(group, "OtherChatNodes", OtherNodesList, 1000);
GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg); GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg, 1000);
GetStringValue(group, "MapPosition", Position); GetStringValue(group, "MapPosition", Position, 81);
GetStringValue(group, "MapPopup", PopupText); GetStringValue(group, "MapPopup", PopupText, 260);
PopupMode = GetIntValue(group, "PopupMode"); PopupMode = GetIntValue(group, "PopupMode");
if (chatPaclen == 0) if (chatPaclen == 0)

View File

@ -21,6 +21,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// //
// Housekeeping Module // Housekeeping Module
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#include "bpqmail.h" #include "bpqmail.h"
char * APIENTRY GetBPQDirectory(); char * APIENTRY GetBPQDirectory();

View File

@ -81,7 +81,7 @@ TODo ?Multiple Adapters
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "ipcode.h" #include "ipcode.h"
@ -5413,11 +5413,8 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
int Len; int Len;
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data; PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
UCHAR * Msg; UCHAR * Msg;
int Type;
int Length, ComLen;
int IntVal;
UCHAR Reply[256]; UCHAR Reply[256];
int PDULen, SendLen; int SendLen;
int Offset = 0; int Offset = 0;
Len = ntohs(IPptr->IPLENGTH); Len = ntohs(IPptr->IPLENGTH);

View File

@ -53,7 +53,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdlib.h> #include <stdlib.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -567,15 +567,15 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
return ExtProc; return ExtProc;
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_KAM; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KAM;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
PortEntry->MAXHOSTMODESESSIONS = 11; // Default PortEntry->MAXHOSTMODESESSIONS = 11; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -809,10 +809,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_KISSHF; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KISSHF;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "time.h" #include "time.h"
#include "stdio.h" #include "stdio.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
@ -130,7 +130,7 @@ extern int REALTIMETICKS;
UCHAR NO_CTEXT = 0; UCHAR NO_CTEXT = 0;
UCHAR ALIASMSG = 0; UCHAR ALIASMSG = 0;
extern UINT APPLMASK;
static UCHAR ISNETROMMSG = 0; static UCHAR ISNETROMMSG = 0;
UCHAR MSGFLAG = 0; UCHAR MSGFLAG = 0;
extern char * ALIASPTR; extern char * ALIASPTR;
@ -142,6 +142,30 @@ extern BOOL LogAllConnects;
APPLCALLS * APPL; APPLCALLS * APPL;
void SendL2ToMonMap(struct PORTCONTROL * PORT, char * ReportCall, char Mode, char Direction)
{
// if Port Freq < 30Mhz send to Node Map
if (PORT->PortFreq && PORT->PortFreq < 30000000)
{
char ReportMode[16];
char ReportFreq[350] = "";
ReportMode[0] = '@';
ReportMode[1] = Mode;
ReportMode[2] = '?';
ReportMode[3] = Direction;
ReportMode[4] = 0;
// If no position see if we have an APRS posn
_gcvt(PORT->PortFreq, 9, ReportFreq);
SendMH(0, ReportCall, ReportFreq, 0, ReportMode);
}
}
VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer) VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
{ {
// LEVEL 2 PROCESSING // LEVEL 2 PROCESSING
@ -153,6 +177,7 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
UCHAR CTL; UCHAR CTL;
uintptr_t Work; uintptr_t Work;
UCHAR c; UCHAR c;
unsigned int APPLMASK = 0;
// Check for invalid length (< 22 7Header + 7Addr + 7Addr + CTL // Check for invalid length (< 22 7Header + 7Addr + 7Addr + CTL
@ -166,7 +191,6 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
PORT->L2FRAMES++; PORT->L2FRAMES++;
ALIASMSG = 0; ALIASMSG = 0;
APPLMASK = 0;
ISNETROMMSG = 0; ISNETROMMSG = 0;
MSGFLAG = 0; // CMD/RESP UNDEFINED MSGFLAG = 0; // CMD/RESP UNDEFINED
@ -238,6 +262,7 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
if (PORT->PORTMHEARD) if (PORT->PORTMHEARD)
MHPROC(PORT, Buffer); MHPROC(PORT, Buffer);
/// TAJ added 07/12/2020 for 'all RX traffic as IfinOctects /// TAJ added 07/12/2020 for 'all RX traffic as IfinOctects
InOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN; InOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN;
@ -466,6 +491,8 @@ FORUS:
if (PORT->UIHook && CTL == 3) if (PORT->UIHook && CTL == 3)
PORT->UIHook(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG); PORT->UIHook(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG);
LINK->APPLMASK = APPLMASK;
L2FORUS(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG); L2FORUS(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG);
} }
@ -732,7 +759,7 @@ VOID L2FORUS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buff
NO_CTEXT = 1; NO_CTEXT = 1;
if (ROUTE->NEIGHBOUR_FLAG == 1 && ROUTE->NEIGHBOUR_QUAL == 0) // Locked, qual 0 if (ROUTE->NEIGHBOUR_FLAG && ROUTE->NEIGHBOUR_QUAL == 0) // Locked, qual 0
{ {
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
return; return;
@ -935,7 +962,7 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
// We need to save APPLMASK and ALIASPTR so following SABM connects to application // We need to save APPLMASK and ALIASPTR so following SABM connects to application
LINK->APPLMASK = APPLMASK; // LINK->APPLMASK now set in L2FORUS
LINK->ALIASPTR = ALIASPTR; LINK->ALIASPTR = ALIASPTR;
PUT_ON_PORT_Q(PORT, Buffer); PUT_ON_PORT_Q(PORT, Buffer);
@ -1062,7 +1089,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
if (LINK->L2STATE == 1) // Sent XID? if (LINK->L2STATE == 1) // Sent XID?
{ {
APPLMASK = LINK->APPLMASK; LINK->APPLMASK;
ALIASPTR = LINK->ALIASPTR; ALIASPTR = LINK->ALIASPTR;
L2SABM(LINK, PORT, Buffer, ADJBUFFER, MSGFLAG); // Process the SABM L2SABM(LINK, PORT, Buffer, ADJBUFFER, MSGFLAG); // Process the SABM
@ -1147,7 +1174,7 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
// IF CONNECT TO APPL ADDRESS, SET UP APPL SESSION // IF CONNECT TO APPL ADDRESS, SET UP APPL SESSION
if (APPLMASK == 0) if (LINK->APPLMASK == 0)
{ {
// Not ATTACH TO APPL // Not ATTACH TO APPL
@ -1163,7 +1190,9 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
WriteConnectLog(fromCall, toCall, "AX.25"); WriteConnectLog(fromCall, toCall, "AX.25");
hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK); hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
SendL2ToMonMap(PORT, fromCall, '+', 'I');
L2SENDUA(PORT, Buffer, ADJBUFFER); L2SENDUA(PORT, Buffer, ADJBUFFER);
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF) if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
@ -1280,6 +1309,8 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK); hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
SendL2ToMonMap(PORT, fromCall, '+', 'I');
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF) if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
{ {
struct DATAMESSAGE * Msg; struct DATAMESSAGE * Msg;
@ -1353,7 +1384,7 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
return; return;
} }
if (cATTACHTOBBS(Session, APPLMASK, PORT->PORTPACLEN, &CONERROR) == 0) if (cATTACHTOBBS(Session, LINK->APPLMASK, PORT->PORTPACLEN, &CONERROR) == 0)
{ {
// NO BBS AVAILABLE // NO BBS AVAILABLE
@ -1380,7 +1411,8 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK); hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
SendL2ToMonMap(PORT, fromCall, '+', 'I');
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF) if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
{ {
struct DATAMESSAGE * Msg; struct DATAMESSAGE * Msg;
@ -1848,8 +1880,14 @@ VOID L2_PROCESS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * B
{ {
// RESPONSE TO SABM - SET LINK UP // RESPONSE TO SABM - SET LINK UP
char fromCall[12];
fromCall[ConvFromAX25(Buffer->ORIGIN, fromCall)] = 0;
RESET2X(LINK); // LEAVE QUEUED STUFF RESET2X(LINK); // LEAVE QUEUED STUFF
SendL2ToMonMap(PORT, fromCall, '+', 'O');
LINK->L2STATE = 5; LINK->L2STATE = 5;
LINK->L2TIMER = 0; // CANCEL TIMER LINK->L2TIMER = 0; // CANCEL TIMER
LINK->L2RETRIES = 0; LINK->L2RETRIES = 0;

View File

@ -49,7 +49,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "stdio.h" #include "stdio.h"
#include <fcntl.h> #include <fcntl.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
VOID UPDATEDESTLIST(); VOID UPDATEDESTLIST();
@ -319,13 +319,13 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
// if locked route with quality zero ignore // if locked route with quality zero ignore
if ((ROUTE->NEIGHBOUR_FLAG & 1)) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG)) // LOCKED ROUTE
if (ROUTE->NEIGHBOUR_QUAL == 0) if (ROUTE->NEIGHBOUR_QUAL == 0)
return; return;
// If Ignoreunlocked set, ignore it not locked // If Ignoreunlocked set, ignore it not locked
if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG) == 0) // LOCKED ROUTE
if (PORT->IgnoreUnlocked) if (PORT->IgnoreUnlocked)
return; return;
@ -333,7 +333,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
// if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES // if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES
if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // Not LOCKED ROUTE if (ROUTE->NEIGHBOUR_FLAG == 0) // Not LOCKED ROUTE
ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY; ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY;
// GET TIME FROM BIOS DATA AREA OR RTC // GET TIME FROM BIOS DATA AREA OR RTC
@ -1038,7 +1038,7 @@ VOID L3TimerProc()
{ {
ROUTE++; ROUTE++;
if (ROUTE->NEIGHBOUR_FLAG & 1) // Locked? if (ROUTE->NEIGHBOUR_FLAG) // Locked?
continue; continue;
if (ROUTE->NEIGHBOUR_LINK) // Has an active Session if (ROUTE->NEIGHBOUR_LINK) // Has an active Session

557
L4Code.c
View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "stdio.h" #include "stdio.h"
#include <fcntl.h> #include <fcntl.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
extern BPQVECSTRUC BPQHOSTVECTOR[]; extern BPQVECSTRUC BPQHOSTVECTOR[];
@ -67,12 +67,18 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall); VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall);
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode); void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG); void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
extern UINT APPLMASK; static UINT APPLMASK;
extern BOOL LogL4Connects; extern BOOL LogL4Connects;
extern BOOL LogAllConnects; extern BOOL LogAllConnects;
extern int L4Compress;
extern int L4CompMaxframe;
extern int L4CompPaclen;
// L4 Flags Values // L4 Flags Values
#define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED #define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED
@ -341,6 +347,17 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
L3MSG->L4FLAGS = L4INFO | L4->NAKBITS; L3MSG->L4FLAGS = L4INFO | L4->NAKBITS;
if (Msg->PID == 0xF1) // Compressed Message
{
L3MSG->L4FLAGS |= L4COMP;
Msg->PID = 0xF0;
}
else if (Msg->PID == 0xF2) // Compressed Message - More to come
{
L3MSG->L4FLAGS |= (L4COMP | L4MORE);
Msg->PID = 0xF0;
}
L4->L4TIMER = L4->SESSIONT1; // SET TIMER L4->L4TIMER = L4->SESSIONT1; // SET TIMER
L4->L4ACKREQ = 0; // CANCEL ACK NEEDED L4->L4ACKREQ = 0; // CANCEL ACK NEEDED
@ -470,6 +487,9 @@ VOID SENDL4CONNECT(TRANSPORTENTRY * Session)
MSG->LENGTH = (int)(&MSG->L4DATA[17] - (UCHAR *)MSG); MSG->LENGTH = (int)(&MSG->L4DATA[17] - (UCHAR *)MSG);
if (L4Compress)
MSG->L4DATA[16] |= 0x40; // Set Compression Supported
if (Session->SPYFLAG) if (Session->SPYFLAG)
{ {
MSG->L4DATA[17] = 'Z'; // ADD SPY ON BBS FLAG MSG->L4DATA[17] = 'Z'; // ADD SPY ON BBS FLAG
@ -500,6 +520,53 @@ void RETURNEDTONODE(TRANSPORTENTRY * Session)
extern void * BUFFER; extern void * BUFFER;
void sendChunk(TRANSPORTENTRY * L4, unsigned char * Compressed, int complen, int savePort)
{
unsigned char * compdata;
struct DATAMESSAGE * Msg;
int sendLen = complen;
int fragments;
L4->SentAfterCompression += complen;
if (complen > L4CompPaclen)
{
fragments = (complen / L4CompPaclen); // Split to roughly equal sized fraagments
if (fragments * L4CompPaclen != complen)
fragments++;
sendLen = (complen / fragments) + 1;
}
compdata = Compressed;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = savePort;
memcpy(Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1; // 1 for pid field
Msg->PID = PID; // Not sent so use as a flag for compressed msg
compdata += sendLen;
complen -= sendLen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
}
}
VOID L4BG() VOID L4BG()
{ {
// PROCESS DATA QUEUED ON SESSIONS // PROCESS DATA QUEUED ON SESSIONS
@ -593,8 +660,151 @@ VOID L4BG()
if (L4->L4CIRCUITTYPE & SESSION) if (L4->L4CIRCUITTYPE & SESSION)
{ {
SENDL4MESSAGE(L4, Msg); // Now support compressing NetRom Sessions.
ReleaseBuffer(Msg); // We collect as much data as possible before compressing and re-packetizing
if (L4->AllowCompress)
{
int complen = 0;
unsigned char * Compressed;
int dataLen;
int savePort = Msg->PORT;
int maxCompSendLen;
// Save first packet, then see if more on TX_Q
L4->toCompress = malloc(8192);
L4->toCompressLen = 0;
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen;
memcpy(&L4->toCompress[L4->toCompressLen], Msg->L2DATA, dataLen);
L4->toCompressLen += dataLen;
// See if first will compress. If not assume too short or already compressed data and just send
Compressed = Compressit(L4->toCompress, L4->toCompressLen, &complen);
if (complen >= dataLen)
{
free(Compressed);
L4->SentAfterCompression += dataLen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
free(L4->toCompress);
L4->toCompress = 0;
L4->toCompressLen = 0;
continue;
}
// Worth compressing. Try to collect several packets
if (L4->L4TX_Q == 0)
{
// no more, so just send the stuff we've just compressed. Compressed data will fit in input packet
// Debugprintf("%d %d %d%%", L4->toCompressLen, complen, ((L4->toCompressLen - complen) * 100) / L4->toCompressLen);
memcpy(Msg->L2DATA, Compressed, complen);
Msg->PID = 0xF1; // Compressed
Msg->LENGTH = complen + MSGHDDRLEN + 1; // 1 for pid field
L4->SentAfterCompression += complen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
free(L4->toCompress);
L4->toCompressLen = 0;
L4->toCompress = 0;
free(Compressed);
continue;
}
free(Compressed);
ReleaseBuffer(Msg); // Not going to use it
while (L4->L4TX_Q && L4->toCompressLen < (8192 - 256)) // Make sure can't overrin buffer
{
// Collect the data from L4TX_Q
Msg = Q_REM((void *)&L4->L4TX_Q);
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen;
memcpy(&L4->toCompress[L4->toCompressLen], Msg->L2DATA, dataLen);
L4->toCompressLen += dataLen;
ReleaseBuffer(Msg);
}
L4->toCompress[L4->toCompressLen] = 0;
Compressed = Compressit(L4->toCompress, L4->toCompressLen, &complen);
// Debugprintf("%d %d %d%%", L4->toCompressLen, complen, ((L4->toCompressLen - complen) * 100) / L4->toCompressLen);
// Send compressed
// Fragment if more than L4CompPaclen
// Entered with original first fragment in saveMsg;
// Check for too big a compressed frame size. Bigger compresses better but adds latency to link
maxCompSendLen = L4CompPaclen * L4CompMaxframe;
if (complen > maxCompSendLen)
{
// Too Much Data. Needs to recompress less. To avoid too many recompresses be a bit conservative in calulating max size
// to allow for a bit less compression of part of data. Getting it wrong isn't fatal as sending more than optimum isn't fatal
int Fragments;
int ChunkSize;
unsigned char * CompressPtr = L4->toCompress;
int bytesleft = L4->toCompressLen;
// Assume 10% worse compression on smaller input
int j = (complen * 11) / 10; // New Comp size
Fragments = j / maxCompSendLen;
Fragments++;
ChunkSize = (L4->toCompressLen / Fragments) + 1; // 1 for rounding
while (bytesleft > 0)
{
int Len = bytesleft;
if (Len > ChunkSize)
Len = ChunkSize;
free (Compressed);
Compressed = Compressit(CompressPtr, Len, &complen);
// Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len);
sendChunk(L4, Compressed, complen, savePort);
CompressPtr += Len;
bytesleft -= Len;
}
}
else
sendChunk(L4, Compressed, complen,savePort);
free(L4->toCompress);
L4->toCompressLen = 0;
L4->toCompress = 0;
free(Compressed);
}
else
{
// Compression Disabled
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
}
continue; continue;
} }
@ -703,12 +913,35 @@ VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session)
Session->L4RESEQ_Q = 0; Session->L4RESEQ_Q = 0;
} }
// if compressed session display stats
if (Session->Sent && Session->Received)
{
char SRCE[10];
char TO[10];
struct DEST_LIST * DEST = Session->L4TARGET.DEST;
SRCE[ConvFromAX25(Session->L4MYCALL, SRCE)] = 0;
TO[ConvFromAX25(DEST->DEST_CALL, TO)] = 0;
Debugprintf("L4 Compression Stats %s %s TX %d %d %d%% RX %d %d %d%%", SRCE, TO,
Session->Sent, Session->SentAfterCompression, ((Session->Sent - Session->SentAfterCompression) * 100) / Session->Sent,
Session->Received, Session->ReceivedAfterExpansion, ((Session->ReceivedAfterExpansion - Session->Received) * 100) / Session->Received);
}
while (Session->L4RESEQ_Q) while (Session->L4RESEQ_Q)
ReleaseBuffer(Q_REM((void *)&Session->L4RESEQ_Q)); ReleaseBuffer(Q_REM((void *)&Session->L4RESEQ_Q));
if (Session->PARTCMDBUFFER) if (Session->PARTCMDBUFFER)
ReleaseBuffer(Session->PARTCMDBUFFER); ReleaseBuffer(Session->PARTCMDBUFFER);
if (Session->toCompress)
free(Session->toCompress);
if (Session->unCompress)
free(Session->unCompress);
memset(Session, 0, sizeof(TRANSPORTENTRY)); memset(Session, 0, sizeof(TRANSPORTENTRY));
} }
@ -900,10 +1133,14 @@ VOID L4TimerProc()
L4->STAYFLAG = 0; L4->STAYFLAG = 0;
Partner = L4->L4CROSSLINK; Partner = L4->L4CROSSLINK;
CLOSECURRENTSESSION(L4); CLOSECURRENTSESSION(L4);
if (Partner) if (Partner)
{ {
// if compressed session display stats
Partner->L4KILLTIMER = 0; //ITS TIMES IS ALSO ABOUT TO EXPIRE Partner->L4KILLTIMER = 0; //ITS TIMES IS ALSO ABOUT TO EXPIRE
CLOSECURRENTSESSION(Partner); // CLOSE THIS ONE CLOSECURRENTSESSION(Partner); // CLOSE THIS ONE
} }
@ -978,6 +1215,8 @@ VOID L4TIMEOUT(TRANSPORTENTRY * L4)
{ {
// RETRIED N2 TIMES - FAIL LINK // RETRIED N2 TIMES - FAIL LINK
// if compressed session display stats
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT) CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
return; return;
} }
@ -1250,6 +1489,7 @@ VOID SENDL4DISC(TRANSPORTENTRY * Session)
MSG->LENGTH = (int)(&MSG->L4DATA[0] - (UCHAR *)MSG); MSG->LENGTH = (int)(&MSG->L4DATA[0] - (UCHAR *)MSG);
C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG); C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG);
} }
@ -1458,6 +1698,9 @@ VOID SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER *
if (BPQNODE) if (BPQNODE)
{ {
L3MSG->L4DATA[1] = L3LIVES; // Our TTL L3MSG->L4DATA[1] = L3LIVES; // Our TTL
if (L4->AllowCompress)
L3MSG->L4DATA[1] |= 0x80;
L3MSG->LENGTH++; L3MSG->LENGTH++;
} }
@ -1559,6 +1802,25 @@ VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
C_Q_ADD(&LINK->TX_Q, L3MSG); C_Q_ADD(&LINK->TX_Q, L3MSG);
} }
VOID SendL4RESET(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{
// Paula's extension
L3MSG->L4FLAGS = L4RESET;
L3SWAPADDRESSES(L3MSG);
L3MSG->L3TTL = L3LIVES;
L3MSG->LENGTH = (int)(&L3MSG->L4DATA[0] - (UCHAR *)L3MSG);
C_Q_ADD(&LINK->TX_Q, L3MSG);
}
VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE) TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE)
{ {
@ -1573,8 +1835,9 @@ VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
L4->CIRCUITID = NEXTID; L4->CIRCUITID = NEXTID;
NEXTID++; NEXTID++;
if (NEXTID == 0)
NEXTID++; // kEEP nON-ZERO if (NEXTID == 0)
NEXTID++; // kEEP nON-ZERO
L4->SESSIONT1 = L4T1; L4->SESSIONT1 = L4T1;
@ -1597,10 +1860,18 @@ VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
// GET BPQ EXTENDED CONNECT PARAMS IF PRESENT // GET BPQ EXTENDED CONNECT PARAMS IF PRESENT
if (L3MSG->LENGTH == MSGHDDRLEN + 38 || L3MSG->LENGTH == MSGHDDRLEN + 39) if (L3MSG->LENGTH == MSGHDDRLEN + 38 || L3MSG->LENGTH == MSGHDDRLEN + 39)
{ {
*BPQNODE = 1; *BPQNODE = 1;
memcpy(BPQPARAMS, &L3MSG->L4DATA[15],L3MSG->LENGTH - (MSGHDDRLEN + 36)); memcpy(BPQPARAMS, &L3MSG->L4DATA[15],L3MSG->LENGTH - (MSGHDDRLEN + 36));
// 40 bit of 2nd byte is Compress Flag
if (BPQPARAMS[1] & 0x40 && L4Compress)
L4->AllowCompress = 1;
BPQPARAMS[1] &= 0xf; // Only bottom bit is significant in Timeeout field
} }
L4->L4CIRCUITTYPE = SESSION | UPLINK; L4->L4CIRCUITTYPE = SESSION | UPLINK;
@ -1658,7 +1929,7 @@ TryAgain:
{ {
SHORT T1; SHORT T1;
DEST->DEST_STATE |= 0x40; // SET BPQ _NODE BIT DEST->DEST_STATE |= 0x40; // SET BPQ NODE BIT
memcpy((char *)&T1, BPQPARAMS, 2); memcpy((char *)&T1, BPQPARAMS, 2);
if (T1 > 300) if (T1 > 300)
@ -1694,7 +1965,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
{ {
// INTERNODE LINK // INTERNODE LINK
TRANSPORTENTRY * L4; TRANSPORTENTRY * L4 = 0;
struct DEST_LIST * DEST; struct DEST_LIST * DEST;
int Opcode; int Opcode;
char Nodename[20]; char Nodename[20];
@ -1741,22 +2012,48 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
CONNECTREQUEST(LINK, L3MSG, ApplMask, ApplCall); CONNECTREQUEST(LINK, L3MSG, ApplMask, ApplCall);
return; return;
} }
// OTHERS NEED A SESSION // OTHERS NEED A SESSION
L4 = &L4TABLE[L3MSG->L4INDEX]; if (Opcode == L4RESET)
if (L4->CIRCUITID!= L3MSG->L4ID)
{ {
// Paula's extension - other end dosn't know about session so disconnect
// A reset has our far index and id, not our index and id so have to search table for L4 entry
int n = MAXCIRCUITS;
L4 = L4TABLE;
while (n--)
{
if (L4->L4USER[0] && L4->FARID == L3MSG->L4ID && L4->FARINDEX == L3MSG->L4INDEX)
{
// Check L3 source call to be sure (should that be L4 source call??
L3MSG->L3SRCE[6] &= 0xfe; // mask end of call
if (memcmp(L3MSG->L3SRCE, L4->L4TARGET.DEST->DEST_CALL, 7) == 0)
{
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
}
ReleaseBuffer(L3MSG);
return;
}
L4++;
}
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
if ((L4->L4CIRCUITTYPE & SESSION) == 0) if (L3MSG->L4INDEX < MAXCIRCUITS)
{ L4 = &L4TABLE[L3MSG->L4INDEX];
// Not an L4 Session - must be an old connection
ReleaseBuffer(L3MSG); // If wrong ID or not an L4 session we must have restarted or cleared session
if (L4 == 0 || L4->CIRCUITID != L3MSG->L4ID || (L4->L4CIRCUITTYPE & SESSION) == 0)
{
SendL4RESET(LINK, L3MSG); // Paula's extension
return; return;
} }
@ -1767,13 +2064,19 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
case L4CACK: case L4CACK:
// CONNECT ACK // CONNECT ACK
DEST = L4->L4TARGET.DEST; DEST = L4->L4TARGET.DEST;
// EXTRACT EXTENDED PARAMS IF PRESENT // EXTRACT EXTENDED PARAMS IF PRESENT
if (L3MSG->LENGTH > MSGHDDRLEN + 22) // Standard Msg if (L3MSG->LENGTH > MSGHDDRLEN + 22) // Standard Msg
{ {
if (L3MSG->L4DATA[1] & 0x80) // Compress Flag
{
L4->AllowCompress = 1;
L3MSG->L4DATA[1] &= 0x7f;
}
DEST->DEST_STATE &= 0x80; DEST->DEST_STATE &= 0x80;
DEST->DEST_STATE |= (L3MSG->L4DATA[1] - L3MSG->L3TTL) + 0x41; // Hops to dest + x40 DEST->DEST_STATE |= (L3MSG->L4DATA[1] - L3MSG->L3TTL) + 0x41; // Hops to dest + x40
} }
@ -1840,13 +2143,13 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// DISCONNECT REQUEST // DISCONNECT REQUEST
L3MSG->L4INDEX = L4->FARINDEX; L3MSG->L4INDEX = L4->FARINDEX;
L3MSG->L4ID = L4->FARID; L3MSG->L4ID = L4->FARID;
L3MSG->L4FLAGS = L4DACK;
L3SWAPADDRESSES(L3MSG); // EXCHANGE SOURCE AND DEST L3MSG->L4FLAGS = L4DACK;
L3MSG->L3TTL = L3LIVES;
L3SWAPADDRESSES(L3MSG); // EXCHANGE SOURCE AND DEST
L3MSG->L3TTL = L3LIVES;
TNC = LINK->LINKPORT->TNC; TNC = LINK->LINKPORT->TNC;
@ -1855,11 +2158,11 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
else else
C_Q_ADD(&LINK->TX_Q, L3MSG); C_Q_ADD(&LINK->TX_Q, L3MSG);
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT) CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
return; return;
case L4DACK: case L4DACK:
CLEARSESSIONENTRY(L4); CLEARSESSIONENTRY(L4);
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
@ -1874,6 +2177,19 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
return; return;
} }
// Randomly drop packets
/*
Debugprintf("L4 Test Received packet %d ", L3MSG->L4TXNO);
if ((rand() % 7) > 5)
{
Debugprintf("L4 Test Drop packet %d ", L3MSG->L4TXNO);
ReleaseBuffer(L3MSG);
return;
}
*/
ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO); ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO);
// If DISCPENDING or STATE IS 4, THEN SESSION IS CLOSING - IGNORE ANY I FRAMES // If DISCPENDING or STATE IS 4, THEN SESSION IS CLOSING - IGNORE ANY I FRAMES
@ -1898,36 +2214,35 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// FRAME IS A REPEAT // FRAME IS A REPEAT
Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0; Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0;
Debugprintf("Discarding repeated frame seq %d from %s", L3MSG->L4TXNO, Call); Debugprintf("L4 Discarding repeated frame seq %d from %s", L3MSG->L4TXNO, Call);
L4->L4ACKREQ = 1; L4->L4ACKREQ = 1;
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
if (FramesMissing > 0) if (FramesMissing > 0)
{ {
// EXPECTED FRAME HAS BEEN MISSED - ASK FOR IT AGAIN, // EXPECTED FRAME HAS BEEN MISSED - ASK FOR IT AGAIN,
// AND KEEP THIS FRAME UNTIL MISSING ONE ARRIVES // AND KEEP THIS FRAME UNTIL MISSING ONE ARRIVES
L4->NAKBITS |= L4NAK; // SET NAK REQUIRED L4->NAKBITS |= L4NAK; // SET NAK REQUIRED
SENDL4IACK(L4); // SEND DATA ACK COMMAND TO ACK OUTSTANDING FRAMES SENDL4IACK(L4); // SEND DATA ACK COMMAND TO ACK OUTSTANDING FRAMES
// SEE IF WE ALREADY HAVE A COPY OF THIS ONE // SEE IF WE ALREADY HAVE A COPY OF THIS ONE
/*
Saved = L4->L4RESEQ_Q; Saved = L4->L4RESEQ_Q;
Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0; Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0;
Debugprintf("saving seq %d from %s", L3MSG->L4TXNO, Call); Debugprintf("L4 Out Of Seq saving seq %d from %s", L3MSG->L4TXNO, Call);
while (Saved) while (Saved)
{ {
if (Saved->L4TXNO == L3MSG->L4TXNO) if (Saved->L4TXNO == L3MSG->L4TXNO)
{ {
// ALREADY HAVE A COPY - DISCARD IT // ALREADY HAVE A COPY - DISCARD IT
Debugprintf("Already have seq %d - discarding", L3MSG->L4TXNO); Debugprintf("L4 Already have seq %d - discarding", L3MSG->L4TXNO);
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
@ -1937,7 +2252,6 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
C_Q_ADD(&L4->L4RESEQ_Q, L3MSG); // ADD TO CHAIN C_Q_ADD(&L4->L4RESEQ_Q, L3MSG); // ADD TO CHAIN
return; return;
*/
} }
// Frame is OK // Frame is OK
@ -1953,7 +2267,7 @@ L4INFO_OK:
L4->NAKBITS &= ~L4NAK; // CLEAR MESSAGE LOST STATE L4->NAKBITS &= ~L4NAK; // CLEAR MESSAGE LOST STATE
L4->RXSEQNO++; L4->RXSEQNO++;
// REMOVE HEADERS, AND QUEUE INFO // REMOVE HEADERS, AND QUEUE INFO
L3MSG->LENGTH -= 20; // L3/L4 Header L3MSG->LENGTH -= 20; // L3/L4 Header
@ -1966,15 +2280,122 @@ L4INFO_OK:
L3MSG->L3PID = 0xF0; // Normal Data PID L3MSG->L3PID = 0xF0; // Normal Data PID
memmove(L3MSG->L3SRCE, L3MSG->L4DATA, L3MSG->LENGTH - (4 + sizeof(void *))); // if compressed, expand
REFRESHROUTE(L4); if ((L3MSG->L4FLAGS & L4COMP) == 0)
{
// Not Compressed
L4->Received += L3MSG->LENGTH - MSGHDDRLEN - 1;
L4->ReceivedAfterExpansion += L3MSG->LENGTH - MSGHDDRLEN - 1;
memmove(L3MSG->L3SRCE, L3MSG->L4DATA, L3MSG->LENGTH - (4 + sizeof(void *)));
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
}
else
{
char Buffer[8192];
int Len;
int outLen;
int sendLen;
char * sendptr;
int savePort = L3MSG->Port;
// May be more thsn one packet
Len = L3MSG->LENGTH - MSGHDDRLEN - 1;
L4->Received += Len;
if (L3MSG->L4FLAGS & L4MORE)
{
if (L4->unCompressLen == 0)
{
// New packet
L4->unCompress = malloc(8192);
}
// Save data
memcpy(&L4->unCompress[L4->unCompressLen], L3MSG->L4DATA, Len);
L4->unCompressLen += Len;
ReleaseBuffer(L3MSG);
goto checkReseq;
}
if (L4->unCompressLen)
{
// Already have some data - add this to it
memcpy(&L4->unCompress[L4->unCompressLen], L3MSG->L4DATA, Len);
L4->unCompressLen += Len;
Len = doinflate(L4->unCompress, Buffer, L4->unCompressLen, 8192, &outLen);
}
else
{
// Just inflate this bit
Len = doinflate(L3MSG->L4DATA, Buffer, L3MSG->LENGTH - MSGHDDRLEN - 1, 8192, &outLen);
}
free(L4->unCompress);
L4->unCompress = 0;
L4->unCompressLen = 0;
sendLen = outLen;
sendptr = Buffer;
L4->ReceivedAfterExpansion += outLen;
// Send first bit in input buffer. If still some left get new buffers for it
if (sendLen > 236)
sendLen = 236;
memcpy(L3MSG->L3SRCE, sendptr, sendLen); // Converting to DATAMESSAGE format
L3MSG->LENGTH = sendLen + MSGHDDRLEN + 1;
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
outLen -= sendLen;
sendptr += sendLen;
while (outLen > 0)
{
sendLen = outLen;
if (sendLen > 236)
sendLen = 236;
Msg = GetBuff();
if (Msg)
{
// Just ignore if no buffers - shouldn't happen
Msg->PID = 240;
Msg->PORT = savePort;
memcpy(Msg->L2DATA, sendptr, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1;
IFRM150(L4, Msg); // CHECK IF SETTING UP AND PASS ON
}
outLen -= sendLen;
sendptr += sendLen;
}
}
L4->L4ACKREQ = L4DELAY; // SEND INFO ACK AFTER L4DELAY (UNLESS I FRAME SENT) L4->L4ACKREQ = L4DELAY; // SEND INFO ACK AFTER L4DELAY (UNLESS I FRAME SENT)
REFRESHROUTE(L4);
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
// See if anything on reseq Q to process // See if anything on reseq Q to process
checkReseq:
if (L4->L4RESEQ_Q == 0) if (L4->L4RESEQ_Q == 0)
return; return;
@ -1991,13 +2412,13 @@ L4INFO_OK:
*Prev = Saved->Next; // CHAIN NEXT IN CHAIN TO PREVIOUS *Prev = Saved->Next; // CHAIN NEXT IN CHAIN TO PREVIOUS
OLDFRAMES++; // COUNT FOR STATS OLDFRAMES++; // COUNT FOR STATS
L3MSG = Saved; L3MSG = Saved;
Debugprintf("Processing Saved Message %d Address %x", L4->RXSEQNO, L3MSG); Debugprintf("L4 Processing Saved Message %d Address %x", L4->RXSEQNO, L3MSG);
goto L4INFO_OK; goto L4INFO_OK;
} }
Debugprintf("Message %d %x still on Reseq Queue", Saved->L4TXNO, Saved); Debugprintf("L4 Message %d %x still on Reseq Queue", Saved->L4TXNO, Saved);
Prev = &Saved; Prev = &Saved;
Saved = Saved->Next; Saved = Saved->Next;
@ -2010,7 +2431,9 @@ L4INFO_OK:
ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO); ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO);
REFRESHROUTE(L4); REFRESHROUTE(L4);
// Drop Through ReleaseBuffer(L3MSG);
return;
} }
// Unrecognised - Ignore // Unrecognised - Ignore
@ -2061,15 +2484,18 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
if (L4->RTT_TIMER) if (L4->RTT_TIMER)
{ {
// FRAME BEING TIMED HAS BEEN ACKED - UPDATE DEST RTT TIMER // FRAME BEING TIMED HAS BEEN ACKED - UPDATE DEST RTT TIMER
DEST = L4->L4TARGET.DEST; DEST = L4->L4TARGET.DEST;
RTT = GetTickCount() - L4->RTT_TIMER; RTT = GetTickCount() - L4->RTT_TIMER;
if (DEST->DEST_RTT == 0) if (RTT < 180) // Sanity Check
DEST->DEST_RTT = RTT; {
else if (DEST->DEST_RTT == 0)
DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New DEST->DEST_RTT = RTT;
else
DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New
}
} }
} }
@ -2091,7 +2517,7 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
if ((L4->FLAGS & DISCPENDING) && L4->L4TX_Q == 0) if ((L4->FLAGS & DISCPENDING) && L4->L4TX_Q == 0)
{ {
// All Acked and DISC Pending, so send it // All Acked and DISC Pending, so send it
SENDL4DISC(L4); SENDL4DISC(L4);
return; return;
} }
@ -2100,13 +2526,13 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
// SEE IF CHOKE SET // SEE IF CHOKE SET
L4->FLAGS &= ~L4BUSY; L4->FLAGS &= ~L4BUSY;
if (L3MSG->L4FLAGS & L4BUSY) if (L3MSG->L4FLAGS & L4BUSY)
{ {
L4->FLAGS |= L3MSG->L4FLAGS & L4BUSY; // Get Busy flag from message L4->FLAGS |= L3MSG->L4FLAGS & L4BUSY; // Get Busy flag from message
if ((L3MSG->L4FLAGS & L4NAK) == 0) if ((L3MSG->L4FLAGS & L4NAK) == 0)
return; // Dont send while biust unless NAC received return; // Dont send while busy unless NAK received
} }
if (L3MSG->L4FLAGS & L4NAK) if (L3MSG->L4FLAGS & L4NAK)
@ -2114,10 +2540,10 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
// RETRANSMIT REQUESTED MESSAGE - WILL BE FIRST ON HOLD QUEUE // RETRANSMIT REQUESTED MESSAGE - WILL BE FIRST ON HOLD QUEUE
Msg = L4->L4HOLD_Q; Msg = L4->L4HOLD_Q;
if (Msg == 0) if (Msg == 0)
return; return;
Copy = GetBuff(); Copy = GetBuff();
if (Copy == 0) if (Copy == 0)
@ -2134,17 +2560,6 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
VOID SENDL4IACK(TRANSPORTENTRY * Session) VOID SENDL4IACK(TRANSPORTENTRY * Session)
{ {
// SEND INFO ACK // SEND INFO ACK
@ -2167,7 +2582,8 @@ VOID SENDL4IACK(TRANSPORTENTRY * Session)
MSG->L4TXNO = 0; MSG->L4TXNO = 0;
MSG->L4RXNO = Session->RXSEQNO; MSG->L4RXNO = Session->RXSEQNO;
Session->L4LASTACKED = Session->RXSEQNO; // SAVE LAST NUMBER ACKED Session->L4LASTACKED = Session->RXSEQNO; // SAVE LAST NUMBER ACKED
@ -2175,7 +2591,10 @@ VOID SENDL4IACK(TRANSPORTENTRY * Session)
MSG->LENGTH = MSGHDDRLEN + 22; MSG->LENGTH = MSGHDDRLEN + 22;
// Debugprintf("Sending L4 IACK %d %x", MSG->L4RXNO, MSG->L4FLAGS);
C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG); C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG);
} }

View File

@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#ifdef WIN32 #ifdef WIN32
#include <Iphlpapi.h> #include <Iphlpapi.h>
@ -45,7 +45,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
BOOL APIENTRY Rig_Init(); BOOL APIENTRY Rig_Init();
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID CopyConfigFile(char * ConfigName); VOID CopyConfigFile(char * ConfigName);
VOID SendMailForThread(VOID * Param); VOID SendMailForThread(VOID * Param);
@ -75,6 +79,8 @@ int upnpClose();
void SaveAIS(); void SaveAIS();
void initAIS(); void initAIS();
void DRATSPoll(); void DRATSPoll();
void RHPPoll();
VOID GetPGConfig(); VOID GetPGConfig();
void SendBBSDataToPktMap(); void SendBBSDataToPktMap();
@ -374,24 +380,41 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#include <execinfo.h> #include <execinfo.h>
#include <signal.h> #include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig) static void segvhandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "SIGSEGV Received\n";
// get void*'s for all entries on the stack write(STDERR_FILENO, msg, strlen(msg));
size = backtrace(array, 10);
// get void*'s for all entries on the stack
size = backtrace(array, 10);
// print out all the frames to stderr
backtrace_symbols_fd(array, size, STDERR_FILENO);
// print out all the frames to stderr
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1); exit(1);
} }
static void abrthandler(int sig)
{
void *array[10];
size_t size;
char msg[] = "SIGABRT Received\n";
write(STDERR_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
static void sigterm_handler(int sig) static void sigterm_handler(int sig)
{ {
@ -481,9 +504,10 @@ VOID MonitorThread(void * x)
{ {
// It is stuck - try to release // It is stuck - try to release
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d", Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
Semaphore.SemProcessID, SemHeldByAPI); Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
Semaphore.Flag = 0; Semaphore.Flag = 0;
} }
@ -761,6 +785,8 @@ char HelpScreen[] =
int Redirected = 0; int Redirected = 0;
static void segvhandler(int sig); static void segvhandler(int sig);
static void abrthandler(int sig);
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -792,7 +818,8 @@ int main(int argc, char * argv[])
#else #else
// signal(SIGSEGV, segvhandler); signal(SIGSEGV, segvhandler);
signal(SIGABRT, abrthandler);
setlinebuf(stdout); setlinebuf(stdout);
struct sigaction act; struct sigaction act;
@ -1560,6 +1587,7 @@ int main(int argc, char * argv[])
Poll_AGW(); Poll_AGW();
DRATSPoll(); DRATSPoll();
RHPPoll();
HTTPTimer(); HTTPTimer();

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
@ -710,7 +710,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_MPSK; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK;
MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;

View File

@ -133,7 +133,7 @@ char HRoute[100];
char AMPRDomain[100]; char AMPRDomain[100];
BOOL SendAMPRDirect = 0; BOOL SendAMPRDirect = 0;
char SignoffMsg[100]; char SignoffMsg[120];
char AbortedMsg[100]="\rOutput aborted\r"; char AbortedMsg[100]="\rOutput aborted\r";

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
// MSGFLAG contains CMD/RESPONSE BITS // MSGFLAG contains CMD/RESPONSE BITS
@ -728,6 +728,10 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
return Output + sprintf((char *)Output, " <DISC ACK>"); return Output + sprintf((char *)Output, " <DISC ACK>");
case L4RESET:
return Output + sprintf((char *)Output, " <RESET>");
case L4INFO: case L4INFO:
{ {
char Infofield[257]; char Infofield[257];
@ -746,6 +750,9 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
if (Flags & L4MORE) if (Flags & L4MORE)
*(Output++) = 'M'; *(Output++) = 'M';
if (Flags & L4COMP)
*(Output++) = 'C';
MsgLen = MsgLen - (19 + sizeof(void *)); MsgLen = MsgLen - (19 + sizeof(void *));
if (MsgLen < 0 || MsgLen > 257) if (MsgLen < 0 || MsgLen > 257)

View File

@ -27,6 +27,9 @@ VOID __cdecl Debugprintf(const char * format, ...);
VOID ReleaseSock(SOCKET sock); VOID ReleaseSock(SOCKET sock);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
struct NNTPRec * FirstNNTPRec = NULL; struct NNTPRec * FirstNNTPRec = NULL;
//int NumberofNNTPRecs=0; //int NumberofNNTPRecs=0;

View File

@ -60,7 +60,7 @@ TODo ?Multiple Adapters
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "ipcode.h" #include "ipcode.h"

756
RHP.c Normal file
View File

@ -0,0 +1,756 @@
/*
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
*/
/*
Paula (G8PZT)'s Remote Host Protocol interface.
For now only sufficient support for WhatsPac
*/
#define _CRT_SECURE_NO_DEPRECATE
#include "cheaders.h"
#include "bpq32.h"
#include "telnetserver.h"
int FindFreeStreamNoSem();
DllExport int APIENTRY DeallocateStream(int stream);
int SendMsgNoSem(int stream, char * msg, int len);
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len);
static int GetJSONInt(char * _REPLYBUFFER, char * Name);
// Generally Can have multiple RHP connections and each can have multiple RHF Sessions
struct RHPSessionInfo
{
struct ConnectionInfo * sockptr;
SOCKET Socket; // Websocks Socket
int BPQStream;
int Handle; // RHP session ID
int Seq;
char Local[12];
char Remote[12];
BOOL Connecting; // Set while waiting for connection to complete
BOOL Listening;
BOOL Connected;
int Busy;
};
struct RHPConnectionInfo
{
SOCKET socket;
struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions;
};
// Struct passed by beginhread
struct RHPParamBlock
{
unsigned char * Msg;
int Len;
SOCKET Socket;
struct ConnectionInfo * sockptr;
};
//struct RHPConnectionInfo ** RHPSockets = NULL;
//int NumberofRHPConnections = 0;
struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions;
char ErrCodes[18][24] =
{
"Ok",
"Unspecified",
"Bad or missing type",
"Invalid handle",
"No memory",
"Bad or missing mode",
"Invalid local address",
"Invalid remote address" ,
"Bad or missing family" ,
"Duplicate socket" ,
"No such port" ,
"Invalid protocol" ,
"Bad parameter" ,
"No buffers" ,
"Unauthorised" ,
"No Route" ,
"Operation not supported"};
extern char pgm[256];
SOCKET agwsock;
extern int SemHeldByAPI;
char szBuff[80];
int WhatsPacConfigured = 1;
int RHPPaclen = 236;
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer);
void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
{
int Loops = 0;
int Sent;
int TxLen;
char * OutBuffer = Msg;
// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
if (Len < 126)
{
// Two Byte Header
OutBuffer[8] = 0x81; // Fin, Data
OutBuffer[9] = Len;
TxLen = Len + 2;
OutBuffer = &Msg[8];
}
else if (Len < 65536)
{
OutBuffer[6] = 0x81; // Fin, Data
OutBuffer[7] = 126; // Unmasked, Extended Len 16
OutBuffer[8] = Len >> 8;
OutBuffer[9] = Len & 0xff;
TxLen = Len + 4;
OutBuffer = &Msg[6];
}
else
{
OutBuffer[0] = 0x81; // Fin, Data
OutBuffer[1] = 127; // Unmasked, Extended Len 64 bits
// Len is 32 bits, so pad with zeros
OutBuffer[2] = 0;
OutBuffer[3] = 0;
OutBuffer[4] = 0;
OutBuffer[5] = 0;
OutBuffer[6] = (Len >> 24) & 0xff;
OutBuffer[7] = (Len >> 16) & 0xff;
OutBuffer[8] = (Len >> 8) & 0xff;
OutBuffer[9] = Len & 0xff;
TxLen = Len + + 10;
OutBuffer = &Msg[0];
}
// Send may block
Sent = send(socket, OutBuffer, TxLen, 0);
while (Sent != TxLen && Loops++ < 3000) // 100 secs max
{
if (Sent > 0) // something sent
{
TxLen -= Sent;
memmove(OutBuffer, &OutBuffer[Sent], TxLen);
}
Sleep(30);
Sent = send(socket, OutBuffer, TxLen, 0);
if (Sent == -1)
break;
}
free(Msg);
return;
}
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen);
void RHPThread(void * Params)
{
// Params and data buffer are malloced blocks so free when done with it
struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
ProcessRHPWebSock(Block->sockptr, Block->Socket, Block->Msg, Block->Len);
free(Block->Msg);
free(Params);
}
int RHPProcessHTTPMessage(void * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
{
// RHP messages can be sent over Websocks or normal http but I think WhatsPac only uses WebSocks
return 0;
}
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen)
{
int Loops = 0;
int InputLen = 0;
int Len;
char Value[16];
char * OutBuffer = malloc(250000);
// struct RHPConnectionInfo * RHPSocket = NULL;
// int n;
Msg[MsgLen] = 0;
// Find Connection Record. If none, create one
// I dont think I need connection records
/*
for (n = 0; n < NumberofRHPConnections; n++)
{
if (RHPSockets[n]->socket == socket)
{
RHPSocket = RHPSockets[n];
break;
}
}
if (RHPSocket == 0)
{
// See if there is an old one we can reuse
for (n = 0; n < NumberofRHPConnections; n++)
{
if (RHPSockets[n]-Socket == -1)
{
RHPSocket = RHPSockets[n];
RHP
break;
}
}
if (RHPSocket == 0)
NumberofRHPConnections;
RHPSockets = realloc(RHPSockets, sizeof(void *) * (NumberofRHPConnections + 1));
RHPSocket = RHPSockets[NumberofRHPConnections] = zalloc(sizeof (struct RHPConnectionInfo));
NumberofRHPConnections++;
RHPSocket->socket = socket;
}
*/
// {"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
// {"type": "openReply", "id": 82, "handle": 1, "errCode": 0, "errText": "Ok"}
// {"seqno": 0, "type": "status", "handle": 1, "flags": 0}
// ("seqno": 1, "type": "close", "handle": 1}
// {"id":40,"type":"close","handle":1}
// {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
// {"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 12, "errtext": "invalid handle"}. It
// {type: 'keepalive'} if there has been no other activity for nearly 3 minutes. Replies with {"type": "keepaliveReply"}
GetJSONValue(Msg, "\"type\":", Value, 15);
if (_stricmp(Value, "open") == 0)
{
Len = processRHCPOpen(sockptr, Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
if (Len)
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "send") == 0)
{
Len = processRHCPSend(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "close") == 0)
{
Len = processRHCPClose(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "status") == 0)
{
Len = processRHCPStatus(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "keepalive") == 0)
{
Len = sprintf(&OutBuffer[10], "{\"type\": \"keepaliveReply\"}"); // Space at front for WebSock Header
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
Debugprintf("Unrecognised RHP Message - %s", Msg);
}
void ProcessRHPWebSockClosed(SOCKET socket)
{
// Close any connections on this scoket and delete socket entry
struct RHPSessionInfo * RHPSession = 0;
int n;
// Find and close any Sessions
for (n = 0; n < NumberofRHPSessions; n++)
{
if (RHPSessions[n]->Socket == socket)
{
RHPSession = RHPSessions[n];
if (RHPSession->BPQStream)
{
Disconnect(RHPSession->BPQStream);
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
}
RHPSession->Connecting = 0;
// We can't send a close to RHP endpont as socket has gone
RHPSession->Connected = 0;
}
}
}
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer)
{
//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
struct RHPSessionInfo * RHPSession = 0;
char * Value = malloc(strlen(Msg)); // Will always be long enough
int ID;
char pfam[16];
char Mode[16];
int Port;
char Local[16];
char Remote[16];
int flags;
int Handle = 1;
int Stream;
unsigned char AXCall[10];
int n;
// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
ID = GetJSONInt(Msg, "\"id\":");
GetJSONValue(Msg, "\"pfam\":", pfam, 15);
GetJSONValue(Msg, "\"mode\":", Mode, 15);
Port = GetJSONInt(Msg, "\"port\":");
GetJSONValue(Msg, "\"local\":", Local, 15);
GetJSONValue(Msg, "\"remote\":", Remote, 15);
flags = GetJSONInt(Msg, "\"flags\":");
if (_stricmp(pfam, "ax25") != 0)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
if (_stricmp(Mode, "stream") == 0)
{
{
// Allocate a RHP Session
// See if there is an old one we can reuse
for (n = 0; n < NumberofRHPSessions; n++)
{
if (RHPSessions[n]->BPQStream == 0)
{
RHPSession = RHPSessions[n];
Handle = n + 1;
Stream = RHPSessions[n]->BPQStream;
break;
}
}
if (RHPSession == 0)
{
RHPSessions = realloc(RHPSessions, sizeof(void *) * (NumberofRHPSessions + 1));
RHPSession = RHPSessions[NumberofRHPSessions] = zalloc(sizeof (struct RHPSessionInfo));
NumberofRHPSessions++;
Handle = NumberofRHPSessions;
}
strcpy(pgm, "RHP");
Stream = FindFreeStream();
strcpy(pgm, "bpq32.exe");
if (Stream == 255)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
RHPSession->BPQStream = Stream;
RHPSession->Handle = Handle;
RHPSession->Connecting = TRUE;
RHPSession->Socket = Socket;
RHPSession->sockptr = sockptr;
strcpy(RHPSession->Local, Local);
strcpy(RHPSession->Remote, Remote);
Connect(Stream);
ConvToAX25(Local, AXCall);
ChangeSessionCallsign(Stream, AXCall);
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\"}", ID, Handle);
}
}
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
}
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
{
// {"type":"send","handle":1,"data":";;;;;;\r","id":70}
struct RHPSessionInfo * RHPSession;
int ID;
char * Data;
char * ptr;
int c;
int Len;
int Handle = 1;
Data = malloc(strlen(Msg));
ID = GetJSONInt(Msg, "\"id\":");
Handle = GetJSONInt(Msg, "\"handle\":");
GetJSONValue(Msg, "\"data\":", Data, strlen(Msg) - 1);
if (Handle < 1 || Handle > NumberofRHPSessions)
{
free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle);
}
RHPSession = RHPSessions[Handle - 1];
// Look for \ escapes
ptr = Data;
while (ptr = strchr(ptr, '\\'))
{
c = ptr[1];
switch (c)
{
case 'r':
*ptr = 13;
break;
case '\\':
*ptr = '\\';
break;
case '"':
*ptr = '"';
break;
}
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
ptr++;
}
Len = strlen(Data);
ptr = Data;
while (Len > RHPPaclen)
{
SendMsg(RHPSession->BPQStream, ptr, RHPPaclen);
Len -= RHPPaclen;
ptr += RHPPaclen;
}
SendMsg(RHPSession->BPQStream, ptr, Len);
free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
}
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
{
// {"id":70,"type":"close","handle":1}
struct RHPSessionInfo * RHPSession;
int ID;
int Handle = 1;
char * OutBuffer = malloc(256);
ID = GetJSONInt(Msg, "\"id\":");
Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle);
RHPSession = RHPSessions[Handle - 1];
Disconnect(RHPSession->BPQStream);
RHPSession->Connected = 0;
RHPSession->Connecting = 0;
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
}
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer)
{
// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 3, "errtext": "invalid handle"}. It
struct RHPSessionInfo * RHPSession;
int Handle = 0;
Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"type\": \"statusReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", Handle);
RHPSession = RHPSessions[Handle - 1];
return sprintf(ReplyBuffer, "{\"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Handle);
}
char toHex[] = "0123456789abcdef";
void RHPPoll()
{
int Stream;
int n;
int state, change;
int Len;
char * RHPMsg;
unsigned char Buffer[2048]; // Space to escape control chars
int pktlen, count;
struct RHPSessionInfo * RHPSession;
for (n = 0; n < NumberofRHPSessions; n++)
{
RHPSession = RHPSessions[n];
Stream = RHPSession->BPQStream;
// See if connected state has changed
SessionState(Stream, &state, &change);
if (change == 1)
{
if (state == 1)
{
// Connected
RHPSession->Seq = 0;
RHPSession->Connecting = FALSE;
RHPSession->Connected = TRUE;
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
// Send RHP CTEXT
RHPMsg = malloc(256);
Sleep(10); // otherwise WhatsPac doesn't display connected
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"Connected to RHP Server\\r\"}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
}
else
{
// Disconnected. Send Close to client
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"type\": \"close\", \"seqno\": %d, \"handle\": %d}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
RHPSession->Connected = 0;
RHPSession->Connecting = 0;
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
}
}
do
{
GetMsg(Stream, Buffer, &pktlen, &count);
if (pktlen > 0)
{
char * ptr = Buffer;
unsigned char c;
Buffer[pktlen] = 0;
RHPSession->sockptr->LastSendTime = time(NULL);
// Message is JSON so Convert CR to \r, \ to \\ " to \"
// Looks like I need to escape everything not between 0x20 and 0x7f eg \U00c3
while (c = *(ptr))
{
switch (c)
{
case 13:
memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
*(ptr++) = '\\';
*(ptr++) = 'r';
break;
case '"':
memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
*(ptr++) = '\\';
*(ptr++) = '"';
break;
case '\\':
memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
*(ptr++) = '\\';
*(ptr++) = '\\';
break;
default:
if (c > 127)
{
memmove(ptr + 6, ptr + 1, strlen(ptr) + 1);
*(ptr++) = '\\';
*(ptr++) = 'u';
*(ptr++) = '0';
*(ptr++) = '0';
*(ptr++) = toHex[c >> 4];
*(ptr++) = toHex[c & 15];
break;
}
else
ptr++;
}
}
RHPMsg = malloc(2048);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"%s\"}", RHPSession->Seq++, RHPSession->Handle, Buffer);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
}
}
while (count > 0);
}
}
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len)
{
char * ptr1, * ptr2;
Value[0] = 0;
ptr1 = strstr(_REPLYBUFFER, Name);
if (ptr1 == 0)
return;
ptr1 += (strlen(Name) + 1);
// "data":"{\"t\":\"c\",\"n\":\"John\",\"c\":\"G8BPQ\",\"lm\":1737912636,\"le\":1737883907,\"led\":1737758451,\"v\":0.33,\"cc\":[{\"cid\":1,\"lp\":1737917257201,\"le\":1737913735726,\"led\":1737905249785},{\"cid\":0,\"lp\":1737324074107,\"le\":1737323831510,\"led\":1737322973662},{\"cid\":5,\"lp\":1737992107419,\"le\":1737931466510,\"led\":1737770056244}]}\r","id":28}
// There may be escaped " in data stream
ptr2 = strchr(ptr1, '"');
while (*(ptr2 - 1) == '\\')
{
ptr2 = strchr(ptr2 + 2, '"');
}
if (ptr2)
{
size_t ValLen = ptr2 - ptr1;
if (ValLen > Len)
ValLen = Len;
memcpy(Value, ptr1, ValLen);
Value[ValLen] = 0;
}
return;
}
static int GetJSONInt(char * _REPLYBUFFER, char * Name)
{
char * ptr1;
ptr1 = strstr(_REPLYBUFFER, Name);
if (ptr1 == 0)
return 0;
ptr1 += (strlen(Name));
return atoi(ptr1);
}

View File

@ -48,7 +48,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdlib.h> #include <stdlib.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#ifdef WIN32 #ifdef WIN32
#include <commctrl.h> #include <commctrl.h>
@ -324,7 +324,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
// Convert to CAT string // Convert to CAT string
sprintf(FreqString, "%012d", txfreq); sprintf(FreqString, "%012lld", txfreq);
switch (PORT->PortType) switch (PORT->PortType)
{ {
@ -455,7 +455,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
// Convert to CAT string // Convert to CAT string
sprintf(FreqString, "%012d", txfreq); sprintf(FreqString, "%012lld", txfreq);
switch (PORT->PortType) switch (PORT->PortType)
{ {
@ -896,7 +896,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
// if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port // if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port
if (Command[0] == 'R') if (Command[0] == 'R')
n = sscanf(Command,"%s %s %s %s %s", &Dummy, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]); n = sscanf(Command,"%s %s %s %s %s", &Dummy[0], &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
else else
n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]); n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
@ -1117,7 +1117,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
if (_stricmp(FreqString, "POWER") == 0) if (_stricmp(FreqString, "POWER") == 0)
{ {
char PowerString[8] = ""; char PowerString[16] = "";
int Power = atoi(Mode); int Power = atoi(Mode);
int len; int len;
char cmd[80]; char cmd[80];
@ -1291,7 +1291,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
// use text command // use text command
Len = sprintf(CmdPtr, "%S", ptr1); Len = sprintf(CmdPtr, "%s", ptr1);
break; break;
case YAESU: case YAESU:
@ -2072,7 +2072,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
case HAMLIB: case HAMLIB:
{ {
char cmd[80]; char cmd[200];
int len = sprintf(cmd, "F %s\n+f\nM %s %d\n+m\n", int len = sprintf(cmd, "F %s\n+f\nM %s %d\n+m\n",
FreqString, Mode, atoi(Data)); FreqString, Mode, atoi(Data));
@ -7252,7 +7252,7 @@ CheckScan:
} }
else if (PORT->PortType == FT991A || PORT->PortType == FTDX10) else if (PORT->PortType == FT991A || PORT->PortType == FTDX10)
{ {
FreqPtr[0]->Cmd1Len = sprintf(CmdPtr, "FA%s;MD0%X;FA;MD0;", &FreqString, ModeNo); FreqPtr[0]->Cmd1Len = sprintf(CmdPtr, "FA%s;MD0%X;FA;MD0;", &FreqString[0], ModeNo);
} }
else if (PORT->PortType == FT100 || PORT->PortType == FT990 else if (PORT->PortType == FT100 || PORT->PortType == FT990
|| PORT->PortType == FT1000) || PORT->PortType == FT1000)
@ -8139,7 +8139,7 @@ void ProcessFLRIGFrame(struct RIGPORTINFO * PORT)
void HLSetMode(SOCKET Sock, struct RIGINFO * RIG, unsigned char * Msg, char sep) void HLSetMode(SOCKET Sock, struct RIGINFO * RIG, unsigned char * Msg, char sep)
{ {
char Resp[80]; char Resp[120];
int Len; int Len;
char mode[80] = ""; char mode[80] = "";
int filter = 0; int filter = 0;
@ -10164,7 +10164,7 @@ VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
VOID SDRANGELThread(struct RIGPORTINFO * PORT) VOID SDRANGELThread(struct RIGPORTINFO * PORT)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
char Msg[255]; char Msg[512];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
BOOL bcopt=TRUE; BOOL bcopt=TRUE;

View File

@ -78,7 +78,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 10 // First is used for Pactor, even though Pactor uses channel 31 #define MaxStreams 10 // First is used for Pactor, even though Pactor uses channel 31
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -854,7 +854,8 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SCS; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
OpenLogFile(TNC->Port); OpenLogFile(TNC->Port);
CloseLogFile(TNC->Port); CloseLogFile(TNC->Port);
@ -885,8 +886,6 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 10 #define MaxStreams 10
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -376,7 +376,8 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_TRKM; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -392,8 +393,6 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 1 #define MaxStreams 1
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
//#include "bpq32.h" //#include "bpq32.h"
@ -666,7 +666,8 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_TRK; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -682,8 +683,6 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -770,9 +770,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SERIAL;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "stdio.h" #include "stdio.h"
#include <fcntl.h> #include <fcntl.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
int C_Q_COUNT(VOID *PQ); int C_Q_COUNT(VOID *PQ);

View File

@ -25,7 +25,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
typedef struct _TCMDX typedef struct _TCMDX
{ {

View File

@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// Telnet Driver for BPQ Switch // Telnet Driver for BPQ Switch
// //
@ -37,7 +38,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define IDM_DISCONNECT 2000 #define IDM_DISCONNECT 2000
#define IDM_LOGGING 2100 #define IDM_LOGGING 2100
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#ifdef WIN32 #ifdef WIN32
@ -85,7 +86,11 @@ void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo *
void DRATSConnectionLost(struct ConnectionInfo * sockptr); void DRATSConnectionLost(struct ConnectionInfo * sockptr);
int BuildRigCtlPage(char * _REPLYBUFFER); int BuildRigCtlPage(char * _REPLYBUFFER);
void ProcessWebmailWebSockThread(void * conn); void ProcessWebmailWebSockThread(void * conn);
void RHPThread(void * Params);
void ProcessRHPWebSockClosed(SOCKET socket);
int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr); int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
#ifndef LINBPQ #ifndef LINBPQ
extern HKEY REGTREE; extern HKEY REGTREE;
@ -109,7 +114,7 @@ extern int REALTIMETICKS;
#define MaxSockets 26 #define MaxSockets 26
struct UserRec RelayUser; struct UserRec RelayUser;
struct UserRec SyncUser = {"","Sync"};; struct UserRec SyncUser = {"","Sync"};
struct UserRec CMSUser; struct UserRec CMSUser;
struct UserRec HostUser = {"","Host"}; struct UserRec HostUser = {"","Host"};
struct UserRec TriModeUser; struct UserRec TriModeUser;
@ -123,6 +128,8 @@ BOOL LogEnabled = FALSE;
BOOL CMSLogEnabled = TRUE; BOOL CMSLogEnabled = TRUE;
extern BOOL IncludesMail; extern BOOL IncludesMail;
extern int HTTPPort;
static HMENU hMenu, hPopMenu, hPopMenu2, hPopMenu3; // handle of menu static HMENU hMenu, hPopMenu, hPopMenu2, hPopMenu3; // handle of menu
static int ProcessLine(char * buf, int Port); static int ProcessLine(char * buf, int Port);
@ -533,7 +540,7 @@ int ProcessLine(char * buf, int Port)
TCP->TriModePort = atoi(value); TCP->TriModePort = atoi(value);
else if (_stricmp(param,"HTTPPORT") == 0) else if (_stricmp(param,"HTTPPORT") == 0)
TCP->HTTPPort = atoi(value); HTTPPort = TCP->HTTPPort = atoi(value);
else if (_stricmp(param,"APIPORT") == 0) else if (_stricmp(param,"APIPORT") == 0)
TCP->APIPort = atoi(value); TCP->APIPort = atoi(value);
@ -947,13 +954,27 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (sockptr->WebSocks == 0) if (sockptr->WebSocks == 0)
{ {
if (sockptr->LastSendTime && (REALTIMETICKS - sockptr->LastSendTime) > 1500) // ~ 2.5 mins if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 150) // ~ 2.5 mins
{ {
closesocket(sockptr->socket); closesocket(sockptr->socket);
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC); ShowConnections(TNC);
} }
} }
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
// RHP Sockets (Used for WhatsPack) Need a timeout
// Normally keepalives are sent each way around every 9 mins
// Keepalives aren't sent when connecting so may need a bit longer
if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 20 * 60) // 20mins
{
ProcessRHPWebSockClosed(sockptr->socket);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
}
} }
else else
{ {
@ -1168,7 +1189,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->Hardware = H_TELNET; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
// Get Menu Handles // Get Menu Handles
@ -1443,13 +1464,12 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
TCP = TNC->TCPInfo; TCP = TNC->TCPInfo;
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_TELNET; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] != 0) if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall); ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
@ -2467,15 +2487,11 @@ nosocks:
if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT) if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
{ {
#ifdef WIN32 if ((time(NULL) - sockptr->LastSendTime) > (L4LIMIT - 60)) // PC Ticks are about 10% slow
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 9) // PC Ticks are about 10% slow
#else
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 10)
#endif
{ {
// Send Keepalive // Send Keepalive
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
BuffertoNode(sockptr, "Keepalive\r", 10); BuffertoNode(sockptr, "Keepalive\r", 10);
} }
} }
@ -2605,7 +2621,7 @@ nosocks:
if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K') if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
{ {
sockptr->Keepalive = TRUE; sockptr->Keepalive = TRUE;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
} }
if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S') if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
@ -2837,7 +2853,7 @@ nosocks:
SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen); SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
sockptr->FromHostBuffGetptr += Msglen; sockptr->FromHostBuffGetptr += Msglen;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
} }
} }
} }
@ -3094,7 +3110,10 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->Hardware = H_TELNET; TNC->PortRecord = PortRecord;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->hDlg = SavehDlg; TNC->hDlg = SavehDlg;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
@ -3125,8 +3144,6 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, "."); ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
} }
TNC->PortRecord = PortRecord;
Sleep(500); Sleep(500);
OpenSockets(TNC); OpenSockets(TNC);
OpenSockets6(TNC); OpenSockets6(TNC);
@ -3749,7 +3766,7 @@ MsgLoop:
BuffertoNode(sockptr, NodeLine, len); BuffertoNode(sockptr, NodeLine, len);
sockptr->InputLen = 0; sockptr->InputLen = 0;
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
} }
@ -3923,7 +3940,7 @@ MsgLoop:
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
} }
@ -4179,7 +4196,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
@ -4299,7 +4316,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL)); SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
@ -4484,7 +4501,7 @@ MsgLoop:
WritetoTrace(Stream, MsgPtr, InputLen, sockptr->ADIF, 'R'); WritetoTrace(Stream, MsgPtr, InputLen, sockptr->ADIF, 'R');
} }
if (InputLen == 8 && memcmp(MsgPtr, ";;;;;;\r\n", 8) == 0) if (InputLen == 8 && memcmp(MsgPtr, ";;;\r\n", 8) == 0)
{ {
// CMS Keepalive // CMS Keepalive
@ -4798,7 +4815,7 @@ MsgLoop:
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
@ -4874,7 +4891,7 @@ MsgLoop:
WriteLog (logmsg); WriteLog (logmsg);
} }
ShowConnections(TNC);; ShowConnections(TNC);
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
sockptr->InputLen=InputLen; sockptr->InputLen=InputLen;
@ -4967,6 +4984,16 @@ MsgLoop:
extern char * RigWebPage; extern char * RigWebPage;
struct RHPParamBlock
{
unsigned char * Msg;
int Len;
SOCKET Socket;
struct ConnectionInfo * sockptr;
};
int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream) int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream)
{ {
int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret; int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret;
@ -4989,9 +5016,23 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
// Failed or closed - clear connection // Failed or closed - clear connection
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node // if Websock connection till app
DataSocket_Disconnect(TNC, sockptr);
return 0; if (sockptr->WebSocks)
{
if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
ProcessRHPWebSockClosed(sockptr->socket);
DataSocket_Disconnect(TNC, sockptr);
return 0;
}
}
else
{
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
DataSocket_Disconnect(TNC, sockptr);
return 0;
}
} }
MsgPtr = &sockptr->InputBuffer[0]; MsgPtr = &sockptr->InputBuffer[0];
@ -5008,6 +5049,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
int Fin, Opcode, Len, Mask; int Fin, Opcode, Len, Mask;
char MaskingKey[4]; char MaskingKey[4];
char * ptr; char * ptr;
char * Payload;
/* /*
+-+-+-+-+-------+-+-------------+-------------------------------+ +-+-+-+-+-------+-+-------------+-------------------------------+
@ -5035,8 +5077,20 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
Opcode = MsgPtr[0] & 15; Opcode = MsgPtr[0] & 15;
Mask = MsgPtr[1] >> 7; Mask = MsgPtr[1] >> 7;
Len = MsgPtr[1] & 127; Len = MsgPtr[1] & 127;
memcpy(MaskingKey, &MsgPtr[2], 4);
ptr = &MsgPtr[6]; if (Len == 126) // Two Byte Len
{
Len = (MsgPtr[2] << 8) + MsgPtr[3];
memcpy(MaskingKey, &MsgPtr[4], 4);
ptr = &MsgPtr[8];
}
else
{
memcpy(MaskingKey, &MsgPtr[2], 4);
ptr = &MsgPtr[6];
}
Payload = ptr;
for (i = 0; i < Len; i++) for (i = 0; i < Len; i++)
{ {
@ -5058,20 +5112,38 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
char RigCMD[64]; char RigCMD[64];
sprintf(RigCMD, "%s PTT", &MsgPtr[6]); sprintf(RigCMD, "%s PTT", Payload);
Rig_Command( (TRANSPORTENTRY *) -1, RigCMD); Rig_Command( (TRANSPORTENTRY *) -1, RigCMD);
} }
else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0) else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0)
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
_beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy); // Needs big stack _beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy); // Needs big stack
return 0; return 0;
} }
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
// Run in thread as it may block;
struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
ParamBlock->sockptr = sockptr;
ParamBlock->Socket = sockptr->socket;
ParamBlock->Len = Len;
ParamBlock->Msg = malloc(Len + 10);
memcpy(ParamBlock->Msg, Payload, Len);
sockptr->LastSendTime = time(NULL);
_beginthread(RHPThread, 0, (VOID *)ParamBlock);
sockptr->InputLen = 0;
return 0;
}
} }
else else
Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]); Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
@ -5101,7 +5173,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5208,7 +5280,7 @@ int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr
ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, "."); ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
#endif #endif
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC);; ShowConnections(TNC);
} }
return 0; return 0;
} }
@ -7097,7 +7169,7 @@ int DoRefreshWebMailIndex()
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));

View File

@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
@ -464,7 +464,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_UIARQ; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View File

@ -22,6 +22,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// UI Handling Routines // UI Handling Routines
#include "bpqmail.h" #include "bpqmail.h"
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
char UIDEST[10] = "FBB"; char UIDEST[10] = "FBB";

View File

@ -37,7 +37,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -1400,7 +1400,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_UZ7HO; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO;
UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;

6
V4.c
View File

@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define SD_BOTH 0x02 #define SD_BOTH 0x02
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -971,13 +971,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_V4; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_V4;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

45
VARA.c
View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#ifdef WIN32 #ifdef WIN32
#include <Psapi.h> #include <Psapi.h>
@ -1163,6 +1163,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->ARDOPDataBuffer = malloc(8192); TNC->ARDOPDataBuffer = malloc(8192);
@ -1170,7 +1171,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->Hardware = H_VARA; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_VARA;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1178,8 +1179,6 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else
@ -1446,9 +1445,6 @@ VOID VARAThread(void * portptr)
return; return;
} }
// printf("Starting VARA Thread\n");
// if on Windows and Localhost see if TNC is running // if on Windows and Localhost see if TNC is running
#ifdef WIN32 #ifdef WIN32
@ -1564,14 +1560,11 @@ TNCRunning:
sinx.sin_addr.s_addr = INADDR_ANY; sinx.sin_addr.s_addr = INADDR_ANY;
sinx.sin_port = 0; sinx.sin_port = 0;
// printf("Trying to connect to VARA TNC\n");
if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0) if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0)
{ {
// Connected successful // Connected successful
goto VConnected; goto VConnected;
} }
if (TNC->Alerted == FALSE) if (TNC->Alerted == FALSE)
@ -1727,6 +1720,7 @@ VConnected:
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
VARAProcessReceivedControl(TNC); VARAProcessReceivedControl(TNC);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
Debugprintf("VARA Returned from processing control packet");
} }
if (FD_ISSET(TNC->TCPDataSock, &readfs)) if (FD_ISSET(TNC->TCPDataSock, &readfs))
@ -2115,7 +2109,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Only allow VarAC mode for incomming sessions // Only allow VarAC mode for incomming sessions
ProcessIncommingConnectEx(TNC, Call, 0, (TNC->NetRomMode == 0), TRUE); ProcessIncommingConnectEx(TNC, Call, 0, (TNC->NetRomMode == 0), TRUE);
SESS = TNC->PortRecord->ATTACHEDSESSIONS[0]; SESS = TNC->PortRecord->ATTACHEDSESSIONS[0];
if (Speed) if (Speed)
@ -2230,6 +2224,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (App < 32) if (App < 32)
{ {
char AppName[13]; char AppName[13];
char AppBuffer[64];
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
@ -2244,7 +2239,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (CheckAppl(TNC, AppName)) if (CheckAppl(TNC, AppName))
{ {
MsgLen = sprintf(Buffer, "%s\r", AppName); MsgLen = sprintf(AppBuffer, "%s\r", AppName);
buffptr = GetBuff(); buffptr = GetBuff();
@ -2254,7 +2249,9 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
buffptr->Len = MsgLen; buffptr->Len = MsgLen;
memcpy(buffptr->Data, Buffer, MsgLen); memcpy(buffptr->Data, AppBuffer, MsgLen);
Debugprintf("Calling Application %s", AppBuffer);
C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
@ -2429,7 +2426,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// return; // return;
} }
if (_memicmp(Buffer, "REGISTERED", 9) == 0) if (_memicmp(Buffer, "LINK REGISTERED", 9) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer)); WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
@ -2443,6 +2440,13 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
return; return;
} }
if (_memicmp(Buffer, "UNENCRYPTED LINK ", 11) == 0)
{
strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
return;
}
if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0) if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
@ -2668,7 +2672,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
{ {
int InputLen, MsgLen; int InputLen, MsgLen;
char * ptr, * ptr2; char * ptr, * ptr2;
char Buffer[4096]; char Buffer[8192];
// shouldn't get several messages per packet, as each should need an ack // shouldn't get several messages per packet, as each should need an ack
// May get message split over packets // May get message split over packets
@ -2676,7 +2680,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
if (TNC->InputLen > 8000) // Shouldnt have packets longer than this if (TNC->InputLen > 8000) // Shouldnt have packets longer than this
TNC->InputLen=0; TNC->InputLen=0;
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8192 - TNC->InputLen, 0); InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0);
if (InputLen == 0 || InputLen == SOCKET_ERROR) if (InputLen == 0 || InputLen == SOCKET_ERROR)
{ {
@ -2699,12 +2703,18 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
TNC->InputLen += InputLen; TNC->InputLen += InputLen;
TNC->ARDOPBuffer[TNC->InputLen] = 0;
Debugprintf("VARA Processing buffer - %s", TNC->ARDOPBuffer);
loop: loop:
ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen); ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen);
if (ptr == 0) // CR in buffer if (ptr == 0) // CR in buffer
{
Debugprintf("VARA Part Packet Received - Waiting for rest");
return; // Wait for it return; // Wait for it
}
ptr2 = &TNC->ARDOPBuffer[TNC->InputLen]; ptr2 = &TNC->ARDOPBuffer[TNC->InputLen];
@ -2727,9 +2737,10 @@ loop:
if (TNC->InputLen < MsgLen) if (TNC->InputLen < MsgLen)
{ {
TNC->InputLen = 0; TNC->InputLen = 0;
Debugprintf("VARA Corrupt multi command input");
return; return;
} }
memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen-MsgLen); memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen - MsgLen);
TNC->InputLen -= MsgLen; TNC->InputLen -= MsgLen;
goto loop; goto loop;

View File

@ -10,16 +10,16 @@
#endif #endif
#define KVers 6,0,24,56 #define KVers 6,0,24,65
#define KVerstring "6.0.24.56\0" #define KVerstring "6.0.24.65\0"
#ifdef CKernel #ifdef CKernel
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define Datestring "December 2024" #define Datestring "February 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring #define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0" #define VerDesc "BPQ32 Switch\0"
#define VerProduct "BPQ32" #define VerProduct "BPQ32"
@ -30,7 +30,7 @@
#define Vers 1,0,16,2 #define Vers 1,0,16,2
#define Verstring "1.0.16.2\0" #define Verstring "1.0.16.2\0"
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0" #define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0" #define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTermTCP" #define VerProduct "BPQTermTCP"
@ -41,7 +41,7 @@
#define Vers 2,2,5,2 #define Vers 2,2,5,2
#define Verstring "2.2.5.2\0" #define Verstring "2.2.5.2\0"
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0" #define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0" #define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTerminal" #define VerProduct "BPQTerminal"
@ -52,7 +52,7 @@
#define Vers 2,2,0,3 #define Vers 2,2,0,3
#define Verstring "2.2.0.3\0" #define Verstring "2.2.0.3\0"
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0" #define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0" #define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
#endif #endif
@ -62,7 +62,7 @@
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define VerComments "Mail server for G8BPQ Packet Switch\0" #define VerComments "Mail server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0" #define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQMail" #define VerProduct "BPQMail"
@ -97,7 +97,7 @@
#define Vers 0,1,0,0 #define Vers 0,1,0,0
#define Verstring "0.1.0.0\0" #define Verstring "0.1.0.0\0"
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0" #define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Password Generation Utility for G8BPQ Switch\0" #define VerDesc "Password Generation Utility for G8BPQ Switch\0"
#endif #endif
@ -107,7 +107,7 @@
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define VerComments "APRS Client for G8BPQ Switch\0" #define VerComments "APRS Client for G8BPQ Switch\0"
#define VerCopyright "Copyright © 2012-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
#define VerDesc "APRS Client for G8BPQ Switch\0" #define VerDesc "APRS Client for G8BPQ Switch\0"
#define VerProduct "BPQAPRS" #define VerProduct "BPQAPRS"
@ -118,7 +118,7 @@
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define VerComments "Chat server for G8BPQ Packet Switch\0" #define VerComments "Chat server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2024 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0" #define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQChat" #define VerProduct "BPQChat"

View File

@ -70,7 +70,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#ifdef WIN32 #ifdef WIN32
#include <Psapi.h> #include <Psapi.h>
@ -1462,11 +1462,12 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_WINMOR; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1474,7 +1475,6 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -23,6 +23,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
int CurrentWPIndex; int CurrentWPIndex;
char CurrentWPCall[10]; char CurrentWPCall[10];
@ -121,7 +124,7 @@ VOID GetWPDatabase()
sprintf(Key, "R%d", i++); sprintf(Key, "R%d", i++);
GetStringValue(group, Key, Record); GetStringValue(group, Key, Record, 1024);
if (Record[0] == 0) // End of List if (Record[0] == 0) // End of List
return; return;
@ -269,23 +272,23 @@ WPOK:;
memset(&WPRec, 0, sizeof(WPRec)); memset(&WPRec, 0, sizeof(WPRec));
GetStringValue(wpgroup, "c", WPRec.callsign); GetStringValue(wpgroup, "c", WPRec.callsign, 6);
GetStringValue(wpgroup, "n", WPRec.name); GetStringValue(wpgroup, "n", WPRec.name, 12);
WPRec.Type = GetIntValue(wpgroup, "T"); WPRec.Type = GetIntValue(wpgroup, "T");
WPRec.changed = GetIntValue(wpgroup, "ch"); WPRec.changed = GetIntValue(wpgroup, "ch");
WPRec.seen = GetIntValue(wpgroup, "s"); WPRec.seen = GetIntValue(wpgroup, "s");
GetStringValue(wpgroup, "h", WPRec.first_homebbs); GetStringValue(wpgroup, "h", WPRec.first_homebbs, 40);
GetStringValue(wpgroup, "sh", WPRec.secnd_homebbs); GetStringValue(wpgroup, "sh", WPRec.secnd_homebbs, 40);
GetStringValue(wpgroup, "z", WPRec.first_zip); GetStringValue(wpgroup, "z", WPRec.first_zip, 8);
GetStringValue(wpgroup, "sz", WPRec.secnd_zip); GetStringValue(wpgroup, "sz", WPRec.secnd_zip, 8);
GetStringValue(wpgroup, "q", Temp); GetStringValue(wpgroup, "q", Temp, 30);
Temp[30] = 0; Temp[30] = 0;
strcpy(WPRec.first_qth, Temp); strcpy(WPRec.first_qth, Temp);
GetStringValue(wpgroup, "sq", Temp); GetStringValue(wpgroup, "sq", Temp, 30);
Temp[30] = 0; Temp[30] = 0;
strcpy(WPRec.secnd_qth, Temp); strcpy(WPRec.secnd_qth, Temp);

View File

@ -19,7 +19,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#define MAIL #define MAIL

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 1 #define MaxStreams 1
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -795,7 +795,8 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
WritetoConsoleLocal(msg); WritetoConsoleLocal(msg);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_WINRPR; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -811,8 +812,6 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

2
adif.c
View File

@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "adif.h" #include "adif.h"
#include "telnetserver.h" #include "telnetserver.h"

View File

@ -33,6 +33,7 @@ typedef int (FAR *FARPROCY)();
#define L4BUSY 0x80 // BNA - DONT SEND ANY MORE #define L4BUSY 0x80 // BNA - DONT SEND ANY MORE
#define L4NAK 0x40 // NEGATIVE RESPONSE FLAG #define L4NAK 0x40 // NEGATIVE RESPONSE FLAG
#define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG #define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG
#define L4COMP 0x10 // BPQ Specific use of spare it - data is compressed
#define L4CREQ 1 // CONNECT REQUEST #define L4CREQ 1 // CONNECT REQUEST
#define L4CACK 2 // CONNECT ACK #define L4CACK 2 // CONNECT ACK
@ -40,6 +41,7 @@ typedef int (FAR *FARPROCY)();
#define L4DACK 4 // DISCONNECT ACK #define L4DACK 4 // DISCONNECT ACK
#define L4INFO 5 // INFORMATION #define L4INFO 5 // INFORMATION
#define L4IACK 6 // INFORMATION ACK #define L4IACK 6 // INFORMATION ACK
#define L4RESET 7 // Paula's extension
extern char MYCALL[]; // 7 chars, ax.25 format extern char MYCALL[]; // 7 chars, ax.25 format
@ -170,6 +172,23 @@ typedef struct _TRANSPORTENTRY
char APPL[16]; // Set if session initiated by an APPL char APPL[16]; // Set if session initiated by an APPL
int L4LIMIT; // Idle time for this Session int L4LIMIT; // Idle time for this Session
// Now support compressing NetRom Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * toCompress; // Data being saved to compress
int toCompressLen;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
} TRANSPORTENTRY; } TRANSPORTENTRY;
// //
@ -195,6 +214,9 @@ typedef struct ROUTE
UCHAR NEIGHBOUR_QUAL; UCHAR NEIGHBOUR_QUAL;
UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE
#define LOCKEDBYCONFIG 1
#define LOCKEDBYSYSOP 2
struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR
USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM) USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM)
@ -445,7 +467,8 @@ typedef struct NR_DEST_ROUTE_ENTRY
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
UCHAR ROUT_QUALITY; // QUALITY UCHAR ROUT_QUALITY; // QUALITY
UCHAR ROUT_OBSCOUNT; UCHAR ROUT_OBSCOUNT;
UCHAR Padding[5]; // SO Entries are the same length UCHAR ROUT_LOCKED;
UCHAR Padding[4]; // SO Entries are the same length
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct DEST_ROUTE_ENTRY typedef struct DEST_ROUTE_ENTRY
@ -467,12 +490,12 @@ typedef struct DEST_LIST
UCHAR DEST_ALIAS[6]; UCHAR DEST_ALIAS[6];
UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC
UCHAR DEST_LOCKED;
UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION
UCHAR INP3FLAGS; UCHAR INP3FLAGS;
struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest
struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION
@ -682,6 +705,7 @@ typedef struct PORTCONTROL
struct PORTCONTROL * HookPort; struct PORTCONTROL * HookPort;
int PortSlot; // Index in Port Table int PortSlot; // Index in Port Table
struct TNCINFO * TNC; // Associated TNC record struct TNCINFO * TNC; // Associated TNC record
int HWType; // Hardware type of Driver. In here as external apps don't have access to TNC record
int RIGPort; // Linked port for freq resporting int RIGPort; // Linked port for freq resporting
unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED) unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED)
char * CTEXT; // Port Specific CText char * CTEXT; // Port Specific CText
@ -1044,6 +1068,8 @@ struct SEM
int Rels; int Rels;
DWORD SemProcessID; DWORD SemProcessID;
DWORD SemThreadID; DWORD SemThreadID;
int Line; // caller file and line
char File[MAX_PATH];
}; };

View File

@ -141,7 +141,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#ifndef WIN32 #ifndef WIN32
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
@ -3246,15 +3246,21 @@ VOID SaveAXIPCache(struct AXIPPORTINFO * PORT)
#ifndef LINBPQ #ifndef LINBPQ
static BOOL GetStringValue(config_setting_t * group, char * name, char * value) static BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
{ {
const char * str; char * str;
config_setting_t *setting; config_setting_t *setting;
setting = config_setting_get_member (group, name); setting = config_setting_get_member (group, name);
if (setting) if (setting)
{ {
str = config_setting_get_string (setting); str = (char *)config_setting_get_string (setting);
if (strlen(str) > maxlen)
{
Debugprintf("Suspect config record %s", str);
str[maxlen] = 0;
}
strcpy(value, str); strcpy(value, str);
return TRUE; return TRUE;
} }
@ -3321,7 +3327,7 @@ VOID GetAXIPCache(struct AXIPPORTINFO * PORT)
ptr++; ptr++;
} }
if (GetStringValue(group, Key, hostaddr)) if (GetStringValue(group, Key, hostaddr, 64))
{ {
arp->destaddr.sin_addr.s_addr = inet_addr(hostaddr); arp->destaddr.sin_addr.s_addr = inet_addr(hostaddr);
} }

View File

@ -603,7 +603,7 @@ VOID __cdecl nprintf(ChatCIRCUIT * conn, const char * format, ...);
VOID nputs(ChatCIRCUIT * conn, char * buf); VOID nputs(ChatCIRCUIT * conn, char * buf);
#endif #endif
BOOL matchi(char * p1, char * p2); BOOL matchi(char * p1, char * p2);
char * strlop(const char * buf, char delim); char * strlop(char * buf, char delim);
int rt_cmd(ChatCIRCUIT *circuit, char * Buffer); int rt_cmd(ChatCIRCUIT *circuit, char * Buffer);
ChatCIRCUIT *circuit_new(ChatCIRCUIT *circuit, int flags); ChatCIRCUIT *circuit_new(ChatCIRCUIT *circuit, int flags);
void makelinks(void); void makelinks(void);
@ -687,7 +687,11 @@ int RemoveLF(char * Message, int len);
struct SEM; struct SEM;
BOOL isdigits(char * string); BOOL isdigits(char * string);
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);

View File

@ -52,7 +52,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include <time.h> //#include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include <process.h> #include <process.h>
#include "pcap.h" #include "pcap.h"

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"

View File

@ -33,7 +33,7 @@
#include "BPQMailrc.h" #include "BPQMailrc.h"
#include "dbghelp.h" #include "dbghelp.h"
#else #else
#include "CHeaders.h" #include "cheaders.h"
#endif #endif
#include "asmstrucs.h" #include "asmstrucs.h"
@ -879,7 +879,7 @@ struct MSESSION
}; };
VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...); VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...);
char * strlop(const char * buf, char delim); char * strlop(char * buf, char delim);
int rt_cmd(CIRCUIT *circuit, char * Buffer); int rt_cmd(CIRCUIT *circuit, char * Buffer);
CIRCUIT *circuit_new(CIRCUIT *circuit, int flags); CIRCUIT *circuit_new(CIRCUIT *circuit, int flags);
VOID BBSputs(CIRCUIT * conn, char * buf); VOID BBSputs(CIRCUIT * conn, char * buf);
@ -1173,7 +1173,7 @@ int ProcessConnecting(CIRCUIT * circuit, char * Buffer, int Len);
VOID SaveConfig(char * ConfigName); VOID SaveConfig(char * ConfigName);
BOOL GetConfig(char * ConfigName); BOOL GetConfig(char * ConfigName);
int GetIntValue(config_setting_t * group, char * name); int GetIntValue(config_setting_t * group, char * name);
BOOL GetStringValue(config_setting_t * group, char * name, char * value); //BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
BOOL GetConfigFromRegistry(); BOOL GetConfigFromRegistry();
VOID Parse_SID(CIRCUIT * conn, char * SID, int len); VOID Parse_SID(CIRCUIT * conn, char * SID, int len);
VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len); VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len);
@ -1289,7 +1289,9 @@ int RemoveLF(char * Message, int len);
// Utilities // Utilities
BOOL isdigits(char * string); BOOL isdigits(char * string);
void GetSemaphore(struct SEM * Semaphore, int ID);
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);

View File

@ -34,7 +34,7 @@
typedef unsigned char byte; typedef unsigned char byte;
#include "CHeaders.h" #include "cheaders.h"
#include "bpqvkiss.h" #include "bpqvkiss.h"
#include <stdlib.h> #include <stdlib.h>

46
cMain.c
View File

@ -15,7 +15,8 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// C replacement for Main.asm // C replacement for Main.asm
@ -34,7 +35,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <fcntl.h> #include <fcntl.h>
#include "kernelresource.h" #include "kernelresource.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "mqtt.h" #include "mqtt.h"
@ -139,6 +140,10 @@ int NODE = 1; // INCLUDE SWITCH SUPPORT
int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ
int L4Compress = 0;
int L4CompMaxframe = 3;
int L4CompPaclen = 236;
BOOL LogL4Connects = FALSE; BOOL LogL4Connects = FALSE;
BOOL LogAllConnects = FALSE; BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE; BOOL AUTOSAVEMH = TRUE;
@ -822,6 +827,15 @@ BOOL Start()
MQTT_PORT = cfg->C_MQTT_PORT; MQTT_PORT = cfg->C_MQTT_PORT;
strcpy(MQTT_USER, cfg->C_MQTT_USER); strcpy(MQTT_USER, cfg->C_MQTT_USER);
strcpy(MQTT_PASS, cfg->C_MQTT_PASS); strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
L4Compress = cfg->C_L4Compress;
L4CompMaxframe = cfg->C_L4CompMaxframe;
L4CompPaclen = cfg->C_L4CompPaclen;
if (L4CompMaxframe < 1 || L4CompMaxframe > 16)
L4CompMaxframe = 3;
if (L4CompPaclen < 64 || L4CompPaclen > 236)
L4CompPaclen = 236;
// Get pointers to PASSWORD and APPL1 commands // Get pointers to PASSWORD and APPL1 commands
@ -1338,7 +1352,7 @@ BOOL Start()
ROUTE->NBOUR_PACLEN = Rcfg->ppacl; ROUTE->NBOUR_PACLEN = Rcfg->ppacl;
ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual; ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual;
ROUTE->NEIGHBOUR_FLAG = 1; // Locked ROUTE->NEIGHBOUR_FLAG = LOCKEDBYCONFIG; // Locked
Rcfg++; Rcfg++;
ROUTE++; ROUTE++;
@ -1843,12 +1857,11 @@ VOID ReadNodes()
if (ptr == NULL) continue; if (ptr == NULL) continue;
// I don't thinlk we should load locked flag from save file - only from config // I don't thinlk we should load locked flag from save file - only from config
// Now (2025) have two locked flags, from config or by sysop. Latter is saved and restored
// But need to parse it until I stop saving it
if (ptr[0] == '!') if (ptr[0] == '!')
{ {
// ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
} }
@ -1865,7 +1878,7 @@ VOID ReadNodes()
memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7); memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE - Digi'ed routes must be locked ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE - Digi'ed routes must be locked
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
@ -1921,6 +1934,14 @@ VOID ReadNodes()
if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE
ROUTE->OtherendsRouteQual = atoi(ptr); ROUTE->OtherendsRouteQual = atoi(ptr);
ptr = strtok_s(NULL, seps, &Context); // INP3
if (ptr == NULL) continue;
if (ptr[0] == '!')
{
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context);
}
continue; continue;
} }
@ -2468,7 +2489,7 @@ VOID DoListenMonitor(TRANSPORTENTRY * L4, MESSAGE * Msg)
PDATAMESSAGE Buffer; PDATAMESSAGE Buffer;
char MonBuffer[1024]; char MonBuffer[1024];
int len; int len;
struct tm * TM;
UCHAR * monchars = (UCHAR *)Msg; UCHAR * monchars = (UCHAR *)Msg;
if (CountFramesQueuedOnSession(L4) > 10) if (CountFramesQueuedOnSession(L4) > 10)
@ -2478,14 +2499,19 @@ VOID DoListenMonitor(TRANSPORTENTRY * L4, MESSAGE * Msg)
return; return;
IntSetTraceOptionsEx(L4->LISTEN, 1, 0, 0); IntSetTraceOptionsEx(L4->LISTEN, 1, 0, 0);
len = IntDecodeFrame(Msg, MonBuffer, Msg->Timestamp, L4->LISTEN, FALSE, TRUE); TM = gmtime(&Msg->Timestamp);
sprintf(MonBuffer, "%02d:%02d:%02d ", TM->tm_hour, TM->tm_min, TM->tm_sec);
len = IntDecodeFrame(Msg, &MonBuffer[9], Msg->Timestamp, L4->LISTEN, FALSE, TRUE);
IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI); IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
if (len == 0) if (len == 0)
return; return;
len += 9;
if (len > 256) if (len > 256)
len = 256; len = 256;

View File

@ -30,6 +30,9 @@ int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BO
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly); int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
int CountBits64(uint64_t in); int CountBits64(uint64_t in);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#define GetBuff() _GetBuff(__FILE__, __LINE__) #define GetBuff() _GetBuff(__FILE__, __LINE__)
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__) #define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__) #define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
@ -64,13 +67,13 @@ DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
int * port, int * sesstype, int * paclen, int * port, int * sesstype, int * paclen,
int * maxframe, int * l4window); int * maxframe, int * l4window);
#define LIBCONFIG_STATIC
#include "libconfig.h"
struct config_setting_t; int GetIntValue(config_setting_t * group, char * name);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
int GetIntValue(struct config_setting_t * group, char * name); VOID SaveIntValue(config_setting_t * group, char * name, int value);
BOOL GetStringValue(struct config_setting_t * group, char * name, char * value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
VOID SaveIntValue(struct config_setting_t * group, char * name, int value);
VOID SaveStringValue(struct config_setting_t * group, char * name, char * value);
int EncryptPass(char * Pass, char * Encrypt); int EncryptPass(char * Pass, char * Encrypt);
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len); VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
@ -92,7 +95,7 @@ VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID DoTheCommand(TRANSPORTENTRY * Session); VOID DoTheCommand(TRANSPORTENTRY * Session);
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len); char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer); VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
char * strlop(const char * buf, char delim); char * strlop(char * buf, char delim);
BOOL CompareCalls(UCHAR * c1, UCHAR * c2); BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
VOID PostDataAvailable(TRANSPORTENTRY * Session); VOID PostDataAvailable(TRANSPORTENTRY * Session);
@ -155,7 +158,7 @@ Dll int APIENTRY SaveNodes ();
struct SEM; struct SEM;
void GetSemaphore(struct SEM * Semaphore, int ID); void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
void MySetWindowText(HWND hWnd, char * Msg); void MySetWindowText(HWND hWnd, char * Msg);

View File

@ -119,7 +119,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -307,7 +307,8 @@ static char *keywords[] =
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL", "APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed "BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", "LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS" "EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS",
"L4Compress", "L4CompMaxframe", "L4CompPaclen"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -328,7 +329,8 @@ static void * offset[] =
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].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_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, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs, &xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS}; /* offset for corresponding data in config file */ &xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS,
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -348,7 +350,8 @@ static int routine[] =
14, 14 ,14, 14, 14, 14 ,14, 14,
15, 0, 2, 9, 9, 15, 0, 2, 9, 9,
2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20} ; // Routine to process param 2, 2, 0, 1, 20, 20,
1, 1, 1} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int); int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int); //int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -370,8 +373,7 @@ static char *pkeywords[] =
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY", "BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE", "UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE", "IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort"}; /* parameter keywords */
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -512,7 +514,6 @@ BOOL ProcessConfig()
if ((fp1 = fopen(inputname,"r")) == NULL) if ((fp1 = fopen(inputname,"r")) == NULL)
{ {
Consoleprintf("Could not open file %s Error code %d", inputname, errno); Consoleprintf("Could not open file %s Error code %d", inputname, errno);
return FALSE; return FALSE;
} }
@ -617,6 +618,10 @@ BOOL ProcessConfig()
paramok[83]=1; // MQTT Params paramok[83]=1; // MQTT Params
paramok[84]=1; // MQTT Params paramok[84]=1; // MQTT Params
paramok[85]=1; // MQTT Params paramok[85]=1; // MQTT Params
paramok[86]=1; // L4Compress
paramok[87]=1; // L4Compress Maxframe
paramok[88]=1; // L4Compress Paclen
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
{ {
@ -1532,7 +1537,7 @@ int dotext(char * val, char * key_word, int max)
if (len > max) if (len > max)
{ {
Consoleprintf("Text too long: %s\r\n",key_word); Consoleprintf("Text too long: %s (max %d\r\n",key_word, max);
return(0); return(0);
} }

View File

@ -170,7 +170,11 @@ struct CONFIGTABLE
int C_MQTT_PORT; int C_MQTT_PORT;
char C_MQTT_USER[80]; char C_MQTT_USER[80];
char C_MQTT_PASS[80]; char C_MQTT_PASS[80];
int C_L4Compress;
int C_L4CompMaxframe;
int C_L4CompPaclen;
//#define ApplOffset 80000 // Applications offset in config buffer //#define ApplOffset 80000 // Applications offset in config buffer
//#define InfoOffset 85000 // Infomsg offset in buffer //#define InfoOffset 85000 // Infomsg offset in buffer
//#define InfoMax 2000 // Max Info //#define InfoMax 2000 // Max Info

2
kiss.c
View File

@ -77,7 +77,7 @@ int i2c_smbus_read_byte()
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#include "mqtt.h" #include "mqtt.h"
#include "kiss.h" #include "kiss.h"

View File

@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include "CHeaders.h" #include "cheaders.h"
#include <sys/socket.h> #include <sys/socket.h>
#include <linux/if_packet.h> #include <linux/if_packet.h>

View File

@ -764,14 +764,14 @@ BOOL CheckifPacket(char * Via)
return TRUE; // Packet return TRUE; // Packet
// ptr1 is last element. If a valid continent, it is a packet message // ptr1 is last element. If a valid continent, it is a packet message
// should really accept .WW on end as it is valid
if (FindContinent(ptr1)) if (FindContinent(ptr1))
return TRUE; // Packet return TRUE; // Packet
if (FindCountry(ptr1)) if (FindCountry(ptr1))
return TRUE; // Packet return TRUE; // Packet
if ((_stricmp(ptr1, "MARS") == 0) || (_stricmp(ptr1, "USA") == 0)) // MARS used both if ((_stricmp(ptr1, "MARS") == 0) || (_stricmp(ptr1, "USA") == 0) || (_stricmp(ptr1, "WW") == 0)) // MARS used both MARS and USA
return TRUE; // Packet return TRUE; // Packet
return FALSE; return FALSE;

View File

@ -7,7 +7,7 @@
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
//#include <windows.h> //#include <windows.h>
#include "CHeaders.h" #include "cheaders.h"
#include <stdlib.h> #include <stdlib.h>
#include "bpqmail.h" #include "bpqmail.h"
#include "httpconnectioninfo.h" #include "httpconnectioninfo.h"
@ -852,7 +852,14 @@ double LatFromLOC = 0;
double LonFromLOC = 0; double LonFromLOC = 0;
#endif #endif
void SendBBSDataToPktMapThread();
void SendBBSDataToPktMap() void SendBBSDataToPktMap()
{
_beginthread(SendBBSDataToPktMapThread, 0, 0);
}
void SendBBSDataToPktMapThread()
{ {
char Request[64]; char Request[64];
char * Params; char * Params;

View File

@ -13,21 +13,21 @@ 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 \ 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 \ 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 \ SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o UIRoutines.o AGWAPI.o AGWMoncode.o \
DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o RHP.o
# Configuration: # Configuration:
CC = gcc CC = gcc
all: CFLAGS = -DLINBPQ -MMD -g -fcommon all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
all: linbpq all: linbpq
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -DNOMQTT nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT
nomqtt: linbpq nomqtt: linbpq
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -fcommon noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon
noi2c: linbpq noi2c: linbpq

2
mqtt.c
View File

@ -8,7 +8,7 @@
#include <jansson.h> #include <jansson.h>
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#include "asmstrucs.h" #include "asmstrucs.h"
#include "mqtt.h" #include "mqtt.h"

View File

@ -2,10 +2,9 @@
// Authentication is via Telnet USER records. // Authentication is via Telnet USER records.
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include <stdlib.h> #include <stdlib.h>
#include "tncinfo.h" #include "tncinfo.h"
#include "asmstrucs.h" #include "asmstrucs.h"
@ -26,7 +25,7 @@ typedef struct API
{ {
char *URL; char *URL;
int URLLen; int URLLen;
int (* APIRoutine)(char * response, char * token, char * param); int (* APIRoutine)(char * response, char * token, char * param, int Local);
int Auth; int Auth;
} API; } API;
@ -34,7 +33,7 @@ typedef struct API
#define AuthNone 0 #define AuthNone 0
#define AuthUser 1 #define AuthUser 1
#define Auth BBSUser 2 #define AuthBBSUser 2
#define AuthSysop 4 #define AuthSysop 4
// Function prototypes // Function prototypes
@ -50,12 +49,14 @@ void add_token_to_list(Token* token);
Token* find_token(const char* token); Token* find_token(const char* token);
Token* generate_token(); Token* generate_token();
int sendPortList(char * response, char * token, char * Rest); int sendPortList(char * response, char * token, char * Rest, int Local);
int sendNodeList(char * response, char * token, char * Rest); int sendNodeList(char * response, char * token, char * Rest, int Local);
int sendUserList(char * response, char * token, char * Rest); int sendUserList(char * response, char * token, char * Rest, int Local);
int sendInfo(char * response, char * token, char * Rest); int sendInfo(char * response, char * token, char * Rest, int Local);
int sendLinks(char * response, char * token, char * Rest); int sendLinks(char * response, char * token, char * Rest, int Local);
int sendPortMHList(char * response, char * token, char * Rest); int sendPortMHList(char * response, char * token, char * Rest, int Local);
int sendWhatsPacState(char * response, char * token, char * param, int Local);
int sendWhatsPacConfig(char * response, char * token, char * param, int Local);
void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT); void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
@ -71,11 +72,14 @@ struct API APIList[] =
"/api/info", 9, sendInfo, 0, "/api/info", 9, sendInfo, 0,
"/api/links", 10, sendLinks, 0, "/api/links", 10, sendLinks, 0,
"/api/users", 10, sendUserList, 0, "/api/users", 10, sendUserList, 0,
"/api/mheard", 11, sendPortMHList, 0 "/api/mheard", 11, sendPortMHList, 0,
"/api/v1/config", 14, sendWhatsPacConfig, AuthSysop,
"/api/v1/state", 13, sendWhatsPacState, AuthSysop
}; };
int APICount = sizeof(APIList) / sizeof(struct API); int APICount = sizeof(APIList) / sizeof(struct API);
extern int HTTPPort;
int xx() int xx()
@ -154,6 +158,14 @@ int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * req
return send_http_response(response, Resp); return send_http_response(response, Resp);
} }
if (strcmp(Method, "POST") == 0)
{
if (_stricmp(URL, "/api/v1/config") == 0)
{
return send_http_response(response, "200 (OK)");
}
}
if (strcmp(Method, "GET") != 0) if (strcmp(Method, "GET") != 0)
return send_http_response(response, "403 (Bad Method)"); return send_http_response(response, "403 (Bad Method)");
@ -197,7 +209,7 @@ if (token[0] == 0)
rest = &request[4 + APIEntry->URLLen]; // Anything following? rest = &request[4 + APIEntry->URLLen]; // Anything following?
if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?') if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?')
return APIEntry->APIRoutine(response, token, rest); return APIEntry->APIRoutine(response, token, rest, LOCAL);
} }
} }
@ -344,7 +356,7 @@ int send_http_response(char * response, const char* msg)
extern int MasterPort[MAXBPQPORTS+1]; // Pointer to first BPQ port for a specific MPSK or UZ7HO host extern int MasterPort[MAXBPQPORTS+1]; // Pointer to first BPQ port for a specific MPSK or UZ7HO host
int sendPortList(char * response, char * token, char * param) int sendPortList(char * response, char * token, char * param, int Local)
{ {
char * Array = 0; char * Array = 0;
int ArrayLen = 0; int ArrayLen = 0;
@ -556,7 +568,7 @@ extern struct DEST_LIST * DESTS; // NODE LIST
extern int DEST_LIST_LEN; extern int DEST_LIST_LEN;
int sendNodeList(char * response, char * token, char * param) int sendNodeList(char * response, char * token, char * param, int Local)
{ {
int ArrayPtr = 0; int ArrayPtr = 0;
@ -660,7 +672,7 @@ int sendNodeList(char * response, char * token, char * param)
} }
int sendUserList(char * response, char * token, char * param) int sendUserList(char * response, char * token, char * param, int Local)
{ {
int ArrayPtr = 0; int ArrayPtr = 0;
int n = MAXCIRCUITS; int n = MAXCIRCUITS;
@ -706,7 +718,7 @@ extern char MYALIASLOPPED[];
extern char TextVerstring[]; extern char TextVerstring[];
extern char LOCATOR[]; extern char LOCATOR[];
int sendInfo(char * response, char * token, char * param) int sendInfo(char * response, char * token, char * param, int Local)
{ {
char call[10]; char call[10];
@ -719,7 +731,7 @@ int sendInfo(char * response, char * token, char * param)
return strlen(response); return strlen(response);
} }
int sendLinks(char * response, char * token, char * param) int sendLinks(char * response, char * token, char * param, int Local)
{ {
struct _LINKTABLE * Links = LINKS; struct _LINKTABLE * Links = LINKS;
int MaxLinks = MAXLINKS; int MaxLinks = MAXLINKS;
@ -784,7 +796,7 @@ int sendLinks(char * response, char * token, char * param)
return ReplyLen; return ReplyLen;
} }
int sendPortMHList(char * response, char * token, char * param) int sendPortMHList(char * response, char * token, char * param, int Local)
{ {
struct PORTCONTROL * PORTVEC ; struct PORTCONTROL * PORTVEC ;
int n; int n;
@ -817,6 +829,43 @@ int sendPortMHList(char * response, char * token, char * param)
return strlen(response); return strlen(response);
} }
// WhatsPac configuration interface
// WhatsPac also uses Paula's Remote Host Protocol (RHP). This is in a separate module
extern int WhatsPacConfigured;
int sendWhatsPacState(char * response, char * token, char * param, int Local)
{
if (Local == 0)
return send_http_response(response, "401 Not Authorised");
if (WhatsPacConfigured)
sprintf(response, "{\"configured\": true}\r\n");
else
sprintf(response, "{\"configured\": false}\r\n");
return strlen(response);
}
int sendWhatsPacConfig(char * response, char * token, char * param, int Local)
{
char Template[] =
"{\"MODE\": 0,"
"\"RHPPORT\": \"%d\","
"\"AGWPORT\": \"7000\","
"\"INTERFACES\": [{\"INTERFACE\": 1,\"PROTOCOL\": \"KISS\",\"TYPE\": \"TCP\",\"IOADDR\": \"127.0.0.1\",\"INTNUM\": 8100}],"
"\"PORTS\": [{\"PORT\": 1,\"ID\": \"RHPPORT\", \"INTERFACENUM\": 1}]}";
if (Local == 0)
return send_http_response(response, "401 Not Authorised");
sprintf(response, Template, HTTPPort);
return strlen(response);
}

View File

@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"

View File

@ -871,9 +871,10 @@ typedef struct TNCINFO
VOID * zalloc(int len); VOID * zalloc(int len);
BOOL ReadConfigFile(int Port, int ProcLine()); BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port));
int GetLine(char * buf); int GetLine(char * buf);
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc()); BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc,
int Width, int Height, VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream));
char * CheckAppl(struct TNCINFO * TNC, char * Appl); char * CheckAppl(struct TNCINFO * TNC, char * Appl);
BOOL SendReporttoWL2K(struct TNCINFO * TNC); BOOL SendReporttoWL2K(struct TNCINFO * TNC);
struct WL2KInfo * DecodeWL2KReportLine(char * buf); struct WL2KInfo * DecodeWL2KReportLine(char * buf);