New upstream version 6.0.24.59a+repack
This commit is contained in:
parent
a5c4d344cc
commit
64d58d0c5a
2
6pack.c
2
6pack.c
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
2
AGWAPI.c
2
AGWAPI.c
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
27
ARDOP.c
27
ARDOP.c
|
@ -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,9 @@ 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].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 +165,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 +649,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
|
||||||
|
@ -1918,7 +1930,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 %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
|
Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s %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);
|
||||||
|
@ -2134,7 +2146,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);
|
||||||
|
@ -2600,6 +2612,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 +2693,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;
|
||||||
|
|
||||||
|
@ -3344,6 +3362,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -1146,6 +1146,7 @@
|
||||||
// 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)
|
||||||
|
|
||||||
#include "bpqmail.h"
|
#include "bpqmail.h"
|
||||||
#include "winstdint.h"
|
#include "winstdint.h"
|
||||||
|
@ -1537,7 +1538,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
|
||||||
|
|
2
BPQNRR.c
2
BPQNRR.c
|
@ -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();
|
||||||
|
|
|
@ -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>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
19
Bpq32.c
19
Bpq32.c
|
@ -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,13 @@ 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 repoorting in a separate thread (59)
|
||||||
|
// Add support fro WhatsPac (59)
|
||||||
|
// Add timestamps to LIS monitor
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define CKernel
|
#define CKernel
|
||||||
|
@ -1503,6 +1510,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 +1529,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 +1879,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 +2301,7 @@ VOID TimerProcX()
|
||||||
Poll_AGW();
|
Poll_AGW();
|
||||||
|
|
||||||
DRATSPoll();
|
DRATSPoll();
|
||||||
|
RHPPoll();
|
||||||
|
|
||||||
CheckGuardZone();
|
CheckGuardZone();
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
3
Cmd.c
3
Cmd.c
|
@ -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;
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
88
CommonCode.c
88
CommonCode.c
|
@ -32,7 +32,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 +69,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 +571,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
|
||||||
|
|
||||||
|
@ -1456,7 +1456,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 +1493,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 +1510,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 +1526,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 +1547,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 +1583,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)
|
||||||
|
@ -3318,7 +3340,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 +3348,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 +3363,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 +3524,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 +3571,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 +4197,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 +4231,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 +5163,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 +5620,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\"}]}";
|
||||||
|
|
2
DOSAPI.c
2
DOSAPI.c
|
@ -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[];
|
||||||
|
|
2
DRATS.c
2
DRATS.c
|
@ -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"
|
||||||
|
|
1
Events.c
1
Events.c
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
2
FLDigi.c
2
FLDigi.c
|
@ -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)();
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
43
HTTPcode.c
43
HTTPcode.c
|
@ -24,7 +24,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||||
|
|
||||||
#define DllImport
|
#define DllImport
|
||||||
|
|
||||||
#include "CHeaders.h"
|
#include "cheaders.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "tncinfo.h"
|
#include "tncinfo.h"
|
||||||
|
@ -70,6 +70,7 @@ 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);
|
||||||
|
|
||||||
extern struct ROUTE * NEIGHBOURS;
|
extern struct ROUTE * NEIGHBOURS;
|
||||||
extern int ROUTE_LEN;
|
extern int ROUTE_LEN;
|
||||||
|
@ -1852,6 +1853,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)
|
||||||
|
@ -5135,6 +5173,3 @@ void SHA1PadMessage(SHA1Context *context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
10
HanksRT.c
10
HanksRT.c
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
2
IPCode.c
2
IPCode.c
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
2
KISSHF.c
2
KISSHF.c
|
@ -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)();
|
||||||
|
|
56
L2Code.c
56
L2Code.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
2
L3Code.c
2
L3Code.c
|
@ -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();
|
||||||
|
|
4
L4Code.c
4
L4Code.c
|
@ -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[];
|
||||||
|
@ -68,7 +68,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
|
||||||
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);
|
||||||
|
|
||||||
extern UINT APPLMASK;
|
static UINT APPLMASK;
|
||||||
|
|
||||||
extern BOOL LogL4Connects;
|
extern BOOL LogL4Connects;
|
||||||
extern BOOL LogAllConnects;
|
extern BOOL LogAllConnects;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
58
LinBPQ.c
58
LinBPQ.c
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,641 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RHPConnectionInfo
|
||||||
|
{
|
||||||
|
SOCKET socket;
|
||||||
|
struct RHPSessionInfo ** RHPSessions;
|
||||||
|
int NumberofRHPSessions;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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 RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
|
||||||
|
int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
|
||||||
|
int processRHCPClose(struct RHPConnectionInfo * RHPSocket, 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int RHPProcessHTTPMessage(struct ConnectionInfo * 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(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
|
||||||
|
|
||||||
|
for (n = 0; n < NumberofRHPConnections; n++)
|
||||||
|
{
|
||||||
|
if (RHPSockets[n]->socket == socket)
|
||||||
|
{
|
||||||
|
RHPSocket = RHPSockets[n];
|
||||||
|
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"}.
|
||||||
|
|
||||||
|
GetJSONValue(Msg, "\"type\":", Value, 15);
|
||||||
|
|
||||||
|
if (_stricmp(Value, "open") == 0)
|
||||||
|
{
|
||||||
|
Len = processRHCPOpen(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||||
|
if (Len)
|
||||||
|
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_stricmp(Value, "send") == 0)
|
||||||
|
{
|
||||||
|
Len = processRHCPSend(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||||
|
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_stricmp(Value, "close") == 0)
|
||||||
|
{
|
||||||
|
Len = processRHCPClose(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||||
|
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Debugprintf(Msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessRHPWebSockClosed(SOCKET socket)
|
||||||
|
{
|
||||||
|
// Close any connections on this scoket and delete socket entry
|
||||||
|
|
||||||
|
struct RHPConnectionInfo * RHPSocket = NULL;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
// Find Connection Record. CLear any Sessions
|
||||||
|
|
||||||
|
for (n = 0; n < NumberofRHPConnections; n++)
|
||||||
|
{
|
||||||
|
if (RHPSockets[n]->socket == socket)
|
||||||
|
{
|
||||||
|
RHPSocket = RHPSockets[n];
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, 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 Len;
|
||||||
|
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 = FindFreeStreamNoSem();
|
||||||
|
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 = RHPSocket->socket;
|
||||||
|
|
||||||
|
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(struct RHPConnectionInfo * RHPSocket, 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\": 12, \"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++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debugprintf(Data);
|
||||||
|
|
||||||
|
Len = strlen(Data);
|
||||||
|
ptr = Data;
|
||||||
|
|
||||||
|
|
||||||
|
while (Len > RHPPaclen)
|
||||||
|
{
|
||||||
|
SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
|
||||||
|
Len -= RHPPaclen;
|
||||||
|
ptr += RHPPaclen;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMsgNoSem(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(struct RHPConnectionInfo * RHPSocket, 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\": 12, \"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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void RHPPoll()
|
||||||
|
{
|
||||||
|
int Stream;
|
||||||
|
int n;
|
||||||
|
int state, change;
|
||||||
|
int Len;
|
||||||
|
char * RHPMsg;
|
||||||
|
unsigned char Buffer[1024]; // 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);
|
||||||
|
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;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
Buffer[pktlen] = 0;
|
||||||
|
|
||||||
|
// Message is JSON so Convert CR to \r, \ to \\ " to \"
|
||||||
|
|
||||||
|
while (c = *(ptr))
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 13:
|
||||||
|
|
||||||
|
memmove(ptr + 2, ptr + 1, strlen(ptr));
|
||||||
|
*(ptr++) = '\\';
|
||||||
|
*(ptr++) = 'r';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '"':
|
||||||
|
|
||||||
|
memmove(ptr + 2, ptr + 1, strlen(ptr));
|
||||||
|
*(ptr++) = '\\';
|
||||||
|
*(ptr++) = '"';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
|
||||||
|
memmove(ptr + 2, ptr + 1, strlen(ptr));
|
||||||
|
*(ptr++) = '\\';
|
||||||
|
*(ptr++) = '\\';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RHPMsg = malloc(1024);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,711 @@
|
||||||
|
/*
|
||||||
|
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"
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RHPConnectionInfo
|
||||||
|
{
|
||||||
|
SOCKET socket;
|
||||||
|
struct RHPSessionInfo ** RHPSessions;
|
||||||
|
int NumberofRHPSessions;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Struct passed by beginhread
|
||||||
|
|
||||||
|
struct RHPParamBlock
|
||||||
|
{
|
||||||
|
unsigned char * Msg;
|
||||||
|
int Len;
|
||||||
|
SOCKET Socket;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//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(SOCKET Socket, char * Msg, char * ReplyBuffer);
|
||||||
|
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
|
||||||
|
int processRHCPClose(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(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->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(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"}.
|
||||||
|
|
||||||
|
GetJSONValue(Msg, "\"type\":", Value, 15);
|
||||||
|
|
||||||
|
if (_stricmp(Value, "open") == 0)
|
||||||
|
{
|
||||||
|
Len = processRHCPOpen(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;
|
||||||
|
}
|
||||||
|
Debugprintf(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(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 Len;
|
||||||
|
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 = FindFreeStreamNoSem();
|
||||||
|
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;
|
||||||
|
|
||||||
|
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\": 12, \"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++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debugprintf(Data);
|
||||||
|
|
||||||
|
Len = strlen(Data);
|
||||||
|
ptr = Data;
|
||||||
|
|
||||||
|
|
||||||
|
while (Len > RHPPaclen)
|
||||||
|
{
|
||||||
|
SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
|
||||||
|
Len -= RHPPaclen;
|
||||||
|
ptr += RHPPaclen;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMsgNoSem(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\": 12, \"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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
20
RigControl.c
20
RigControl.c
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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)();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
73
TelnetV6.c
73
TelnetV6.c
|
@ -37,7 +37,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 +85,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;
|
||||||
|
@ -123,6 +127,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 +539,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);
|
||||||
|
@ -4967,6 +4973,15 @@ MsgLoop:
|
||||||
|
|
||||||
extern char * RigWebPage;
|
extern char * RigWebPage;
|
||||||
|
|
||||||
|
struct RHPParamBlock
|
||||||
|
{
|
||||||
|
unsigned char * Msg;
|
||||||
|
int Len;
|
||||||
|
SOCKET Socket;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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 +5004,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 +5037,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 +5065,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,7 +5100,7 @@ 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)
|
||||||
|
@ -5072,6 +5114,21 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
|
||||||
_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->Socket = sockptr->socket;
|
||||||
|
ParamBlock->Len = Len;
|
||||||
|
ParamBlock->Msg = malloc(Len + 10);
|
||||||
|
memcpy(ParamBlock->Msg, Payload, Len);
|
||||||
|
_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]);
|
||||||
|
|
2
UIARQ.c
2
UIARQ.c
|
@ -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)();
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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"
|
||||||
|
|
2
V4.c
2
V4.c
|
@ -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"
|
||||||
|
|
||||||
|
|
2
VARA.c
2
VARA.c
|
@ -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>
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
|
||||||
|
#ifdef Kernel
|
||||||
|
|
||||||
|
#define Vers 5,2,9,2
|
||||||
|
#define Verstring "5.2.9.2\0"
|
||||||
|
#define Datestring "September 2012"
|
||||||
|
#define VerComments "G8BPQ Packet Switch V5.2.9.2\0"
|
||||||
|
#define VerCopyright "Copyright © 2001-2012 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "BPQ32 Switch\0"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define KVers 6,0,24,59
|
||||||
|
#define KVerstring "6.0.24.59\0"
|
||||||
|
|
||||||
|
#ifdef CKernel
|
||||||
|
|
||||||
|
#define Vers KVers
|
||||||
|
#define Verstring KVerstring
|
||||||
|
#define Datestring "January 2025"
|
||||||
|
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
|
||||||
|
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "BPQ32 Switch\0"
|
||||||
|
#define VerProduct "BPQ32"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TermTCP
|
||||||
|
|
||||||
|
#define Vers 1,0,16,2
|
||||||
|
#define Verstring "1.0.16.2\0"
|
||||||
|
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
|
||||||
|
#define VerProduct "BPQTermTCP"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BPQTerm
|
||||||
|
|
||||||
|
#define Vers 2,2,5,2
|
||||||
|
#define Verstring "2.2.5.2\0"
|
||||||
|
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
|
||||||
|
#define VerProduct "BPQTerminal"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BPQTermMDI
|
||||||
|
|
||||||
|
#define Vers 2,2,0,3
|
||||||
|
#define Verstring "2.2.0.3\0"
|
||||||
|
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MAIL
|
||||||
|
|
||||||
|
#define Vers KVers
|
||||||
|
#define Verstring KVerstring
|
||||||
|
#define VerComments "Mail server for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
|
||||||
|
#define VerProduct "BPQMail"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HOSTMODES
|
||||||
|
|
||||||
|
#define Vers 1,1,8,1
|
||||||
|
#define Verstring "1.1.8.1\0"
|
||||||
|
//#define SPECIALVERSION "Test 3"
|
||||||
|
#define VerComments "Host Modes Emulator for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2009-2019 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Host Modes Emulator for G8BPQ's 32 Bit Switch\0"
|
||||||
|
#define VerProduct "BPQHostModes"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef UIUTIL
|
||||||
|
|
||||||
|
#define Vers 0,1,3,1
|
||||||
|
#define Verstring "0.1.3.1\0"
|
||||||
|
#define VerComments "Beacon Utility for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2011-2019 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Beacon Utility for G8BPQ Switch\0"
|
||||||
|
#define VerProduct "BPQUIUtil"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef AUTH
|
||||||
|
|
||||||
|
#define Vers 0,1,0,0
|
||||||
|
#define Verstring "0.1.0.0\0"
|
||||||
|
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef APRS
|
||||||
|
|
||||||
|
#define Vers KVers
|
||||||
|
#define Verstring KVerstring
|
||||||
|
#define VerComments "APRS Client for G8BPQ Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "APRS Client for G8BPQ Switch\0"
|
||||||
|
#define VerProduct "BPQAPRS"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CHAT
|
||||||
|
|
||||||
|
#define Vers KVers
|
||||||
|
#define Verstring KVerstring
|
||||||
|
#define VerComments "Chat server for G8BPQ Packet Switch\0"
|
||||||
|
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
|
||||||
|
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
|
||||||
|
#define VerProduct "BPQChat"
|
||||||
|
|
||||||
|
#endif
|
22
Versions.h
22
Versions.h
|
@ -10,16 +10,16 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define KVers 6,0,24,56
|
#define KVers 6,0,24,59
|
||||||
#define KVerstring "6.0.24.56\0"
|
#define KVerstring "6.0.24.59\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"
|
||||||
|
|
||||||
|
|
2
WINMOR.c
2
WINMOR.c
|
@ -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>
|
||||||
|
|
21
WPRoutines.c
21
WPRoutines.c
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
2
WinRPR.c
2
WinRPR.c
|
@ -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)();
|
||||||
|
|
2
adif.c
2
adif.c
|
@ -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"
|
||||||
|
|
|
@ -1044,6 +1044,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];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
16
bpqaxip.c
16
bpqaxip.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, ...);
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|
10
bpqmail.h
10
bpqmail.h
|
@ -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, ...);
|
||||||
|
|
|
@ -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>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
13
cMain.c
13
cMain.c
|
@ -34,7 +34,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"
|
||||||
|
|
||||||
|
@ -2468,7 +2468,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 +2478,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;
|
||||||
|
|
||||||
|
|
|
@ -1,447 +1,451 @@
|
||||||
//
|
//
|
||||||
// Prototypes for BPQ32 Node Functions
|
// Prototypes for BPQ32 Node Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
#define DllImport
|
|
||||||
|
#define DllImport
|
||||||
#define EXCLUDEBITS
|
|
||||||
|
#define EXCLUDEBITS
|
||||||
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
|
||||||
|
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||||
#include "compatbits.h"
|
|
||||||
|
#include "compatbits.h"
|
||||||
#include "asmstrucs.h"
|
|
||||||
|
#include "asmstrucs.h"
|
||||||
BOOL CheckExcludeList(UCHAR * Call);
|
|
||||||
|
BOOL CheckExcludeList(UCHAR * Call);
|
||||||
Dll int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
|
|
||||||
Dll BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call);
|
Dll int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
|
||||||
DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call);
|
Dll BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call);
|
||||||
int WritetoConsoleLocal(char * buff);
|
DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call);
|
||||||
VOID Consoleprintf(const char * format, ...);
|
int WritetoConsoleLocal(char * buff);
|
||||||
VOID FreeConfig();
|
VOID Consoleprintf(const char * format, ...);
|
||||||
int GetListeningPortsPID(int Port);
|
VOID FreeConfig();
|
||||||
|
int GetListeningPortsPID(int Port);
|
||||||
void * InitializeExtDriver(PEXTPORTDATA PORTVEC);
|
|
||||||
|
void * InitializeExtDriver(PEXTPORTDATA PORTVEC);
|
||||||
VOID PutLengthinBuffer(PDATAMESSAGE buff, USHORT datalen); // Needed for arm5 portability
|
|
||||||
int GetLengthfromBuffer(PDATAMESSAGE buff);
|
VOID PutLengthinBuffer(PDATAMESSAGE buff, USHORT datalen); // Needed for arm5 portability
|
||||||
int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BOOL APRS, BOOL MCTL);
|
int GetLengthfromBuffer(PDATAMESSAGE buff);
|
||||||
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
|
int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BOOL APRS, BOOL MCTL);
|
||||||
int CountBits64(uint64_t in);
|
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
|
||||||
|
int CountBits64(uint64_t in);
|
||||||
#define GetBuff() _GetBuff(__FILE__, __LINE__)
|
|
||||||
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
|
|
||||||
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
|
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||||
|
|
||||||
#define Q_REM(s) _Q_REM(s, __FILE__, __LINE__)
|
#define GetBuff() _GetBuff(__FILE__, __LINE__)
|
||||||
#define Q_REM_NP(s) _Q_REM_NP(s, __FILE__, __LINE__)
|
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
|
||||||
|
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
|
||||||
#define C_Q_ADD(s, b) _C_Q_ADD(s, b, __FILE__, __LINE__)
|
|
||||||
|
#define Q_REM(s) _Q_REM(s, __FILE__, __LINE__)
|
||||||
void _CheckGuardZone(char * File, int Line);
|
#define Q_REM_NP(s) _Q_REM_NP(s, __FILE__, __LINE__)
|
||||||
|
|
||||||
VOID * _Q_REM(VOID **Q, char * File, int Line);
|
#define C_Q_ADD(s, b) _C_Q_ADD(s, b, __FILE__, __LINE__)
|
||||||
VOID * _Q_REM_NP(VOID *Q, char * File, int Line);
|
|
||||||
|
void _CheckGuardZone(char * File, int Line);
|
||||||
int _C_Q_ADD(VOID *Q, VOID *BUFF, char * File, int Line);
|
|
||||||
|
VOID * _Q_REM(VOID **Q, char * File, int Line);
|
||||||
UINT _ReleaseBuffer(VOID *BUFF, char * File, int Line);
|
VOID * _Q_REM_NP(VOID *Q, char * File, int Line);
|
||||||
|
|
||||||
VOID * _GetBuff(char * File, int Line);
|
int _C_Q_ADD(VOID *Q, VOID *BUFF, char * File, int Line);
|
||||||
int _C_Q_ADD(VOID *PQ, VOID *PBUFF, char * File, int Line);
|
|
||||||
|
UINT _ReleaseBuffer(VOID *BUFF, char * File, int Line);
|
||||||
int C_Q_COUNT(VOID *Q);
|
|
||||||
|
VOID * _GetBuff(char * File, int Line);
|
||||||
DllExport char * APIENTRY GetApplCall(int Appl);
|
int _C_Q_ADD(VOID *PQ, VOID *PBUFF, char * File, int Line);
|
||||||
DllExport char * APIENTRY GetApplAlias(int Appl);
|
|
||||||
DllExport int APIENTRY FindFreeStream();
|
int C_Q_COUNT(VOID *Q);
|
||||||
DllExport int APIENTRY DeallocateStream(int stream);
|
|
||||||
DllExport int APIENTRY SessionState(int stream, int * state, int * change);
|
DllExport char * APIENTRY GetApplCall(int Appl);
|
||||||
DllExport int APIENTRY SetAppl(int stream, int flags, int mask);
|
DllExport char * APIENTRY GetApplAlias(int Appl);
|
||||||
DllExport int APIENTRY GetMsg(int stream, char * msg, int * len, int * count );
|
DllExport int APIENTRY FindFreeStream();
|
||||||
DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
|
DllExport int APIENTRY DeallocateStream(int stream);
|
||||||
int * port, int * sesstype, int * paclen,
|
DllExport int APIENTRY SessionState(int stream, int * state, int * change);
|
||||||
int * maxframe, int * l4window);
|
DllExport int APIENTRY SetAppl(int stream, int flags, int mask);
|
||||||
|
DllExport int APIENTRY GetMsg(int stream, char * msg, int * len, int * count );
|
||||||
|
DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
|
||||||
struct config_setting_t;
|
int * port, int * sesstype, int * paclen,
|
||||||
|
int * maxframe, int * l4window);
|
||||||
int GetIntValue(struct config_setting_t * group, char * name);
|
|
||||||
BOOL GetStringValue(struct config_setting_t * group, char * name, char * value);
|
#define LIBCONFIG_STATIC
|
||||||
VOID SaveIntValue(struct config_setting_t * group, char * name, int value);
|
#include "libconfig.h"
|
||||||
VOID SaveStringValue(struct config_setting_t * group, char * name, char * value);
|
|
||||||
|
int GetIntValue(config_setting_t * group, char * name);
|
||||||
int EncryptPass(char * Pass, char * Encrypt);
|
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
|
||||||
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
|
VOID SaveIntValue(config_setting_t * group, char * name, int value);
|
||||||
Dll VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset);
|
VOID SaveStringValue(config_setting_t * group, char * name, char * value);
|
||||||
Dll BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
|
|
||||||
|
int EncryptPass(char * Pass, char * Encrypt);
|
||||||
DllExport int APIENTRY TXCount(int stream);
|
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
|
||||||
DllExport int APIENTRY RXCount(int stream);
|
Dll VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset);
|
||||||
DllExport int APIENTRY MONCount(int stream);
|
Dll BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
|
||||||
|
|
||||||
VOID ReadNodes();
|
DllExport int APIENTRY TXCount(int stream);
|
||||||
int BPQTRACE(MESSAGE * Msg, BOOL APRS);
|
DllExport int APIENTRY RXCount(int stream);
|
||||||
|
DllExport int APIENTRY MONCount(int stream);
|
||||||
VOID CommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
|
||||||
|
VOID ReadNodes();
|
||||||
VOID PostStateChange(TRANSPORTENTRY * Session);
|
int BPQTRACE(MESSAGE * Msg, BOOL APRS);
|
||||||
|
|
||||||
VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
VOID CommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
||||||
VOID DoTheCommand(TRANSPORTENTRY * Session);
|
|
||||||
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
|
VOID PostStateChange(TRANSPORTENTRY * Session);
|
||||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
|
||||||
char * strlop(const char * buf, char delim);
|
VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
||||||
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
|
VOID DoTheCommand(TRANSPORTENTRY * Session);
|
||||||
|
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
|
||||||
VOID PostDataAvailable(TRANSPORTENTRY * Session);
|
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
||||||
int WritetoConsoleLocal(char * buff);
|
char * strlop(char * buf, char delim);
|
||||||
char * CHECKBUFFER(TRANSPORTENTRY * Session, char * Bufferptr);
|
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
|
||||||
VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
|
|
||||||
|
VOID PostDataAvailable(TRANSPORTENTRY * Session);
|
||||||
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
|
int WritetoConsoleLocal(char * buff);
|
||||||
|
char * CHECKBUFFER(TRANSPORTENTRY * Session, char * Bufferptr);
|
||||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
|
VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
|
||||||
|
|
||||||
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
|
||||||
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
|
|
||||||
|
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
|
||||||
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
|
|
||||||
int COUNTNODES(struct ROUTE * ROUTE);
|
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||||
int DecodeNodeName(char * NodeName, char * ptr);;
|
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
|
||||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
|
||||||
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
|
||||||
void * zalloc(int len);
|
int COUNTNODES(struct ROUTE * ROUTE);
|
||||||
BOOL FindDestination(UCHAR * Call, struct DEST_LIST ** REQDEST);
|
int DecodeNodeName(char * NodeName, char * ptr);;
|
||||||
|
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
||||||
BOOL ProcessConfig();
|
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||||
|
void * zalloc(int len);
|
||||||
VOID PUT_ON_PORT_Q(struct PORTCONTROL * PORT, MESSAGE * Buffer);
|
BOOL FindDestination(UCHAR * Call, struct DEST_LIST ** REQDEST);
|
||||||
VOID CLEAROUTLINK(struct _LINKTABLE * LINK);
|
|
||||||
VOID TellINP3LinkGone(struct ROUTE * Route);
|
BOOL ProcessConfig();
|
||||||
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason);
|
|
||||||
|
VOID PUT_ON_PORT_Q(struct PORTCONTROL * PORT, MESSAGE * Buffer);
|
||||||
// Reason Equates
|
VOID CLEAROUTLINK(struct _LINKTABLE * LINK);
|
||||||
|
VOID TellINP3LinkGone(struct ROUTE * Route);
|
||||||
#define NORMALCLOSE 0
|
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason);
|
||||||
#define RETRIEDOUT 1
|
|
||||||
#define SETUPFAILED 2
|
// Reason Equates
|
||||||
#define LINKLOST 3
|
|
||||||
#define LINKSTUCK 4
|
#define NORMALCLOSE 0
|
||||||
|
#define RETRIEDOUT 1
|
||||||
int COUNT_AT_L2(struct _LINKTABLE * LINK);
|
#define SETUPFAILED 2
|
||||||
VOID SENDIDMSG();
|
#define LINKLOST 3
|
||||||
VOID SENDBTMSG();
|
#define LINKSTUCK 4
|
||||||
VOID INP3TIMER();
|
|
||||||
VOID REMOVENODE(dest_list * DEST);
|
int COUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||||
BOOL ACTIVATE_DEST(struct DEST_LIST * DEST);
|
VOID SENDIDMSG();
|
||||||
VOID TellINP3LinkSetupFailed(struct ROUTE * Route);
|
VOID SENDBTMSG();
|
||||||
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
|
VOID INP3TIMER();
|
||||||
VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual);
|
VOID REMOVENODE(dest_list * DEST);
|
||||||
BOOL L2SETUPCROSSLINK(PROUTE ROUTE);
|
BOOL ACTIVATE_DEST(struct DEST_LIST * DEST);
|
||||||
VOID REMOVENODE(dest_list * DEST);
|
VOID TellINP3LinkSetupFailed(struct ROUTE * Route);
|
||||||
char * SetupNodeHeader(struct DATAMESSAGE * Buffer);
|
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
|
||||||
VOID L4CONNECTFAILED(TRANSPORTENTRY * L4);
|
VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual);
|
||||||
int CountFramesQueuedOnSession(TRANSPORTENTRY * Session);
|
BOOL L2SETUPCROSSLINK(PROUTE ROUTE);
|
||||||
VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session);
|
VOID REMOVENODE(dest_list * DEST);
|
||||||
VOID __cdecl Debugprintf(const char * format, ...);
|
char * SetupNodeHeader(struct DATAMESSAGE * Buffer);
|
||||||
|
VOID L4CONNECTFAILED(TRANSPORTENTRY * L4);
|
||||||
int APIENTRY Restart();
|
int CountFramesQueuedOnSession(TRANSPORTENTRY * Session);
|
||||||
int APIENTRY Reboot();
|
VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session);
|
||||||
int APIENTRY Reconfig();
|
VOID __cdecl Debugprintf(const char * format, ...);
|
||||||
Dll int APIENTRY SaveNodes ();
|
|
||||||
|
int APIENTRY Restart();
|
||||||
|
int APIENTRY Reboot();
|
||||||
struct SEM;
|
int APIENTRY Reconfig();
|
||||||
|
Dll int APIENTRY SaveNodes ();
|
||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
|
|
||||||
void FreeSemaphore(struct SEM * Semaphore);
|
|
||||||
|
struct SEM;
|
||||||
void MySetWindowText(HWND hWnd, char * Msg);
|
|
||||||
|
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||||
Dll int APIENTRY SessionControl(int stream, int command, int Mask);
|
void FreeSemaphore(struct SEM * Semaphore);
|
||||||
|
|
||||||
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits);
|
void MySetWindowText(HWND hWnd, char * Msg);
|
||||||
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength);
|
|
||||||
BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite);
|
Dll int APIENTRY SessionControl(int stream, int command, int Mask);
|
||||||
VOID CloseCOMPort(HANDLE fd);
|
|
||||||
|
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits);
|
||||||
VOID initUTF8();
|
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength);
|
||||||
int Is8Bit(unsigned char *cpt, int len);
|
BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite);
|
||||||
int WebIsUTF8(unsigned char *ptr, int len);
|
VOID CloseCOMPort(HANDLE fd);
|
||||||
int IsUTF8(unsigned char *ptr, int len);
|
|
||||||
int Convert437toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
VOID initUTF8();
|
||||||
int Convert1251toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
int Is8Bit(unsigned char *cpt, int len);
|
||||||
int Convert1252toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
int WebIsUTF8(unsigned char *ptr, int len);
|
||||||
int TrytoGuessCode(unsigned char * Char, int Len);
|
int IsUTF8(unsigned char *ptr, int len);
|
||||||
|
int Convert437toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
||||||
|
int Convert1251toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
||||||
#define CMD_TO_APPL 1 // PASS COMMAND TO APPLICATION
|
int Convert1252toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
|
||||||
#define MSG_TO_USER 2 // SEND 'CONNECTED' TO USER
|
int TrytoGuessCode(unsigned char * Char, int Len);
|
||||||
#define MSG_TO_APPL 4 // SEND 'CONECTED' TO APPL
|
|
||||||
#define CHECK_FOR_ESC 8 // Look for ^d (^D) to disconnect session)
|
|
||||||
|
#define CMD_TO_APPL 1 // PASS COMMAND TO APPLICATION
|
||||||
#define UI 3
|
#define MSG_TO_USER 2 // SEND 'CONNECTED' TO USER
|
||||||
#define SABM 0x2F
|
#define MSG_TO_APPL 4 // SEND 'CONECTED' TO APPL
|
||||||
#define DISC 0x43
|
#define CHECK_FOR_ESC 8 // Look for ^d (^D) to disconnect session)
|
||||||
#define DM 0x0F
|
|
||||||
#define UA 0x63
|
#define UI 3
|
||||||
#define FRMR 0x87
|
#define SABM 0x2F
|
||||||
#define RR 1
|
#define DISC 0x43
|
||||||
#define RNR 5
|
#define DM 0x0F
|
||||||
#define REJ 9
|
#define UA 0x63
|
||||||
|
#define FRMR 0x87
|
||||||
// V2.2 Types
|
#define RR 1
|
||||||
|
#define RNR 5
|
||||||
#define SREJ 0x0D
|
#define REJ 9
|
||||||
#define SABME 0x6F
|
|
||||||
#define XID 0xAF
|
// V2.2 Types
|
||||||
#define TEST 0xE3
|
|
||||||
|
#define SREJ 0x0D
|
||||||
#define SUPPORT2point2 1
|
#define SABME 0x6F
|
||||||
|
#define XID 0xAF
|
||||||
// XID Optional Functions
|
#define TEST 0xE3
|
||||||
|
|
||||||
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
|
#define SUPPORT2point2 1
|
||||||
#define OPSREJ 4
|
|
||||||
#define OPSREJMult 0x200000
|
// XID Optional Functions
|
||||||
#define OPREJ 2
|
|
||||||
#define OPMod8 0x400
|
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
|
||||||
#define OPMod128 0x800
|
#define OPSREJ 4
|
||||||
|
#define OPSREJMult 0x200000
|
||||||
#define BPQHOSTSTREAMS 64
|
#define OPREJ 2
|
||||||
|
#define OPMod8 0x400
|
||||||
extern TRANSPORTENTRY * L4TABLE;
|
#define OPMod128 0x800
|
||||||
extern unsigned char NEXTID;
|
|
||||||
extern int MAXCIRCUITS;
|
#define BPQHOSTSTREAMS 64
|
||||||
extern int L4DEFAULTWINDOW;
|
|
||||||
extern int L4T1;
|
extern TRANSPORTENTRY * L4TABLE;
|
||||||
extern APPLCALLS APPLCALLTABLE[];
|
extern unsigned char NEXTID;
|
||||||
extern char * APPLS;
|
extern int MAXCIRCUITS;
|
||||||
extern int NEEDMH;
|
extern int L4DEFAULTWINDOW;
|
||||||
extern int RFOnly;
|
extern int L4T1;
|
||||||
|
extern APPLCALLS APPLCALLTABLE[];
|
||||||
extern char SESSIONHDDR[];
|
extern char * APPLS;
|
||||||
|
extern int NEEDMH;
|
||||||
extern UCHAR NEXTID;
|
extern int RFOnly;
|
||||||
|
|
||||||
extern struct ROUTE * NEIGHBOURS;
|
extern char SESSIONHDDR[];
|
||||||
extern int MAXNEIGHBOURS;
|
|
||||||
|
extern UCHAR NEXTID;
|
||||||
extern struct ROUTE * NEIGHBOURS;
|
|
||||||
extern int ROUTE_LEN;
|
extern struct ROUTE * NEIGHBOURS;
|
||||||
extern int MAXNEIGHBOURS;
|
extern int MAXNEIGHBOURS;
|
||||||
|
|
||||||
extern struct DEST_LIST * DESTS; // NODE LIST
|
extern struct ROUTE * NEIGHBOURS;
|
||||||
extern struct DEST_LIST * ENDDESTLIST;
|
extern int ROUTE_LEN;
|
||||||
extern int DEST_LIST_LEN;
|
extern int MAXNEIGHBOURS;
|
||||||
extern int MAXDESTS; // MAX NODES IN SYSTEM
|
|
||||||
|
extern struct DEST_LIST * DESTS; // NODE LIST
|
||||||
extern struct _LINKTABLE * LINKS;
|
extern struct DEST_LIST * ENDDESTLIST;
|
||||||
extern int LINK_TABLE_LEN;
|
extern int DEST_LIST_LEN;
|
||||||
extern int MAXLINKS;
|
extern int MAXDESTS; // MAX NODES IN SYSTEM
|
||||||
|
|
||||||
|
extern struct _LINKTABLE * LINKS;
|
||||||
|
extern int LINK_TABLE_LEN;
|
||||||
extern char MYCALL[]; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED)
|
extern int MAXLINKS;
|
||||||
extern char MYALIASTEXT[]; // {" " ; NODE ALIAS (KEEP TOGETHER)
|
|
||||||
|
|
||||||
extern UCHAR MYCALLWITHALIAS[13];
|
|
||||||
extern APPLCALLS APPLCALLTABLE[NumberofAppls];
|
extern char MYCALL[]; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED)
|
||||||
|
extern char MYALIASTEXT[]; // {" " ; NODE ALIAS (KEEP TOGETHER)
|
||||||
extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
|
|
||||||
extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated
|
extern UCHAR MYCALLWITHALIAS[13];
|
||||||
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
|
extern APPLCALLS APPLCALLTABLE[NumberofAppls];
|
||||||
|
|
||||||
extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
|
extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
|
||||||
|
extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated
|
||||||
extern VOID * FREE_Q;
|
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
|
||||||
|
|
||||||
extern struct PORTCONTROL * PORTTABLE;
|
extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
|
||||||
extern int NUMBEROFPORTS;
|
|
||||||
|
extern VOID * FREE_Q;
|
||||||
|
|
||||||
extern int OBSINIT; // INITIAL OBSOLESCENCE VALUE
|
extern struct PORTCONTROL * PORTTABLE;
|
||||||
extern int OBSMIN; // MINIMUM TO BROADCAST
|
extern int NUMBEROFPORTS;
|
||||||
extern int L3INTERVAL; // "NODES" INTERVAL IN MINS
|
|
||||||
extern int IDINTERVAL; // "ID" BROADCAST INTERVAL
|
|
||||||
extern int BTINTERVAL; // "BT" BROADCAST INTERVAL
|
extern int OBSINIT; // INITIAL OBSOLESCENCE VALUE
|
||||||
extern int MINQUAL; // MIN QUALITY FOR AUTOUPDATES
|
extern int OBSMIN; // MINIMUM TO BROADCAST
|
||||||
extern int HIDENODES; // N * COMMAND SWITCH
|
extern int L3INTERVAL; // "NODES" INTERVAL IN MINS
|
||||||
extern int BBSQUAL; // QUALITY OF BBS RELATIVE TO NODE
|
extern int IDINTERVAL; // "ID" BROADCAST INTERVAL
|
||||||
|
extern int BTINTERVAL; // "BT" BROADCAST INTERVAL
|
||||||
extern int NUMBEROFBUFFERS; // PACKET BUFFERS
|
extern int MINQUAL; // MIN QUALITY FOR AUTOUPDATES
|
||||||
extern int PACLEN; //MAX PACKET SIZE
|
extern int HIDENODES; // N * COMMAND SWITCH
|
||||||
|
extern int BBSQUAL; // QUALITY OF BBS RELATIVE TO NODE
|
||||||
// L2 SYSTEM TIMER RUNS AT 3 HZ
|
|
||||||
|
extern int NUMBEROFBUFFERS; // PACKET BUFFERS
|
||||||
extern int T3; // LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions)
|
extern int PACLEN; //MAX PACKET SIZE
|
||||||
|
|
||||||
extern int L2KILLTIME; // IDLE LINK TIMER (16 MINS)
|
// L2 SYSTEM TIMER RUNS AT 3 HZ
|
||||||
extern int L3LIVES; // MAX L3 HOPS
|
|
||||||
extern int L4N2; // LEVEL 4 RETRY COUNT
|
extern int T3; // LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions)
|
||||||
extern int L4LIMIT; // IDLE SESSION LIMIT - 15 MINS
|
|
||||||
extern int L4DELAY; // L4 DELAYED ACK TIMER
|
extern int L2KILLTIME; // IDLE LINK TIMER (16 MINS)
|
||||||
|
extern int L3LIVES; // MAX L3 HOPS
|
||||||
extern int BBS; // INCLUDE BBS SUPPORT
|
extern int L4N2; // LEVEL 4 RETRY COUNT
|
||||||
extern int NODE; // INCLUDE SWITCH SUPPORT
|
extern int L4LIMIT; // IDLE SESSION LIMIT - 15 MINS
|
||||||
|
extern int L4DELAY; // L4 DELAYED ACK TIMER
|
||||||
extern int FULL_CTEXT; // CTEXT ON ALL CONNECTS IF NZ
|
|
||||||
|
extern int BBS; // INCLUDE BBS SUPPORT
|
||||||
|
extern int NODE; // INCLUDE SWITCH SUPPORT
|
||||||
// Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
|
|
||||||
|
extern int FULL_CTEXT; // CTEXT ON ALL CONNECTS IF NZ
|
||||||
extern BPQVECSTRUC DUMMYVEC; // Needed to force correct order of following
|
|
||||||
|
|
||||||
extern BPQVECSTRUC BPQHOSTVECTOR[BPQHOSTSTREAMS + 5];
|
// Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
|
||||||
|
|
||||||
extern int NODEORDER;
|
extern BPQVECSTRUC DUMMYVEC; // Needed to force correct order of following
|
||||||
extern UCHAR LINKEDFLAG;
|
|
||||||
|
extern BPQVECSTRUC BPQHOSTVECTOR[BPQHOSTSTREAMS + 5];
|
||||||
extern UCHAR UNPROTOCALL[80];
|
|
||||||
|
extern int NODEORDER;
|
||||||
|
extern UCHAR LINKEDFLAG;
|
||||||
extern char * INFOMSG;
|
|
||||||
|
extern UCHAR UNPROTOCALL[80];
|
||||||
extern char * CTEXTMSG;
|
|
||||||
extern int CTEXTLEN;
|
|
||||||
|
extern char * INFOMSG;
|
||||||
extern UCHAR MYALIAS[7]; // ALIAS IN AX25 FORM
|
|
||||||
extern UCHAR BBSALIAS[7];
|
extern char * CTEXTMSG;
|
||||||
|
extern int CTEXTLEN;
|
||||||
extern VOID * TRACE_Q; // TRANSMITTED FRAMES TO BE TRACED
|
|
||||||
|
extern UCHAR MYALIAS[7]; // ALIAS IN AX25 FORM
|
||||||
extern char HEADERCHAR; // CHAR FOR _NODE HEADER MSGS
|
extern UCHAR BBSALIAS[7];
|
||||||
|
|
||||||
extern int AUTOSAVE; // AUTO SAVE NODES ON EXIT FLAG
|
extern VOID * TRACE_Q; // TRANSMITTED FRAMES TO BE TRACED
|
||||||
extern int L4APPL; // Application for BBSCALL/ALIAS connects
|
|
||||||
extern int CFLAG; // C =HOST Command
|
extern char HEADERCHAR; // CHAR FOR _NODE HEADER MSGS
|
||||||
|
|
||||||
extern VOID * IDMSG_Q; // ID/BEACONS WAITING TO BE SENT
|
extern int AUTOSAVE; // AUTO SAVE NODES ON EXIT FLAG
|
||||||
|
extern int L4APPL; // Application for BBSCALL/ALIAS connects
|
||||||
extern struct DATAMESSAGE BTHDDR;
|
extern int CFLAG; // C =HOST Command
|
||||||
extern struct _MESSAGE IDHDDR;
|
|
||||||
|
extern VOID * IDMSG_Q; // ID/BEACONS WAITING TO BE SENT
|
||||||
extern VOID * IDMSG;
|
|
||||||
|
extern struct DATAMESSAGE BTHDDR;
|
||||||
extern int L3TIMER; // TIMER FOR 'NODES' MESSAGE
|
extern struct _MESSAGE IDHDDR;
|
||||||
extern int IDTIMER; // TIMER FOR ID MESSAGE
|
|
||||||
extern int BTTIMER; // TIMER FOR BT MESSAGE
|
extern VOID * IDMSG;
|
||||||
|
|
||||||
extern int STATSTIME;
|
extern int L3TIMER; // TIMER FOR 'NODES' MESSAGE
|
||||||
|
extern int IDTIMER; // TIMER FOR ID MESSAGE
|
||||||
|
extern int BTTIMER; // TIMER FOR BT MESSAGE
|
||||||
extern BOOL IPRequired;
|
|
||||||
extern int MaxHops;
|
extern int STATSTIME;
|
||||||
extern int MAXRTT;
|
|
||||||
extern USHORT CWTABLE[];
|
|
||||||
extern TRANSPORTENTRY * L4TABLE;
|
extern BOOL IPRequired;
|
||||||
extern UCHAR ROUTEQUAL;
|
extern int MaxHops;
|
||||||
extern UINT BPQMsg;
|
extern int MAXRTT;
|
||||||
extern UCHAR ExcludeList[];
|
extern USHORT CWTABLE[];
|
||||||
|
extern TRANSPORTENTRY * L4TABLE;
|
||||||
|
extern UCHAR ROUTEQUAL;
|
||||||
extern APPLCALLS APPLCALLTABLE[];
|
extern UINT BPQMsg;
|
||||||
|
extern UCHAR ExcludeList[];
|
||||||
extern char VersionStringWithBuild[];
|
|
||||||
extern char VersionString[];
|
|
||||||
|
extern APPLCALLS APPLCALLTABLE[];
|
||||||
extern int MAXHEARDENTRIES;
|
|
||||||
extern int MHLEN;
|
extern char VersionStringWithBuild[];
|
||||||
|
extern char VersionString[];
|
||||||
extern int APPL1;
|
|
||||||
extern int PASSCMD;
|
extern int MAXHEARDENTRIES;
|
||||||
extern int NUMBEROFCOMMANDS;
|
extern int MHLEN;
|
||||||
|
|
||||||
extern char * ConfigBuffer;
|
extern int APPL1;
|
||||||
|
extern int PASSCMD;
|
||||||
extern char * WL2KReportLine[];
|
extern int NUMBEROFCOMMANDS;
|
||||||
|
|
||||||
extern struct CMDX COMMANDS[];
|
extern char * ConfigBuffer;
|
||||||
|
|
||||||
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
|
extern char * WL2KReportLine[];
|
||||||
extern char CMDALIAS[ALIASLEN][NumberofAppls];
|
|
||||||
|
extern struct CMDX COMMANDS[];
|
||||||
extern int SEMGETS;
|
|
||||||
extern int SEMRELEASES;
|
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
|
||||||
extern int SEMCLASHES;
|
extern char CMDALIAS[ALIASLEN][NumberofAppls];
|
||||||
extern int MINBUFFCOUNT;
|
|
||||||
|
extern int SEMGETS;
|
||||||
extern UCHAR BPQDirectory[];
|
extern int SEMRELEASES;
|
||||||
extern UCHAR BPQProgramDirectory[];
|
extern int SEMCLASHES;
|
||||||
|
extern int MINBUFFCOUNT;
|
||||||
extern UCHAR WINMOR[];
|
|
||||||
extern UCHAR PACTORCALL[];
|
extern UCHAR BPQDirectory[];
|
||||||
|
extern UCHAR BPQProgramDirectory[];
|
||||||
extern UCHAR MCOM;
|
|
||||||
extern UCHAR MUIONLY;
|
extern UCHAR WINMOR[];
|
||||||
extern UCHAR MTX;
|
extern UCHAR PACTORCALL[];
|
||||||
extern uint64_t MMASK;
|
|
||||||
|
extern UCHAR MCOM;
|
||||||
extern UCHAR NODECALL[]; // NODES in ax.25
|
extern UCHAR MUIONLY;
|
||||||
|
extern UCHAR MTX;
|
||||||
extern int L4CONNECTSOUT;
|
extern uint64_t MMASK;
|
||||||
extern int L4CONNECTSIN;
|
|
||||||
extern int L4FRAMESTX;
|
extern UCHAR NODECALL[]; // NODES in ax.25
|
||||||
extern int L4FRAMESRX;
|
|
||||||
extern int L4FRAMESRETRIED;
|
extern int L4CONNECTSOUT;
|
||||||
extern int OLDFRAMES;
|
extern int L4CONNECTSIN;
|
||||||
extern int L3FRAMES;
|
extern int L4FRAMESTX;
|
||||||
|
extern int L4FRAMESRX;
|
||||||
extern char * PortConfig[];
|
extern int L4FRAMESRETRIED;
|
||||||
extern struct SEM Semaphore;
|
extern int OLDFRAMES;
|
||||||
extern UCHAR AuthorisedProgram; // Local Variable. Set if Program is on secure list
|
extern int L3FRAMES;
|
||||||
|
|
||||||
extern int REALTIMETICKS;
|
extern char * PortConfig[];
|
||||||
|
extern struct SEM Semaphore;
|
||||||
extern time_t CurrentSecs;
|
extern UCHAR AuthorisedProgram; // Local Variable. Set if Program is on secure list
|
||||||
extern time_t lastSlowSecs;
|
|
||||||
extern time_t lastSaveSecs;
|
extern int REALTIMETICKS;
|
||||||
|
|
||||||
// SNMP Variables
|
extern time_t CurrentSecs;
|
||||||
|
extern time_t lastSlowSecs;
|
||||||
extern int InOctets[64];
|
extern time_t lastSaveSecs;
|
||||||
extern int OutOctets[64];
|
|
||||||
|
// SNMP Variables
|
||||||
extern BOOL CloseAllNeeded;
|
|
||||||
extern int CloseOnError;
|
extern int InOctets[64];
|
||||||
|
extern int OutOctets[64];
|
||||||
extern char * PortConfig[70];
|
|
||||||
extern struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
|
extern BOOL CloseAllNeeded;
|
||||||
|
extern int CloseOnError;
|
||||||
#define MaxBPQPortNo 63 // Port 64 reserved for BBS Mon
|
|
||||||
#define MAXBPQPORTS 63
|
extern char * PortConfig[70];
|
||||||
|
extern struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
|
||||||
// IP, APRS use port ocnfig slots above the real port range
|
|
||||||
|
#define MaxBPQPortNo 63 // Port 64 reserved for BBS Mon
|
||||||
#define IPConfigSlot MaxBPQPortNo + 1
|
#define MAXBPQPORTS 63
|
||||||
#define PortMapConfigSlot MaxBPQPortNo + 2
|
|
||||||
#define APRSConfigSlot MaxBPQPortNo + 3
|
// IP, APRS use port ocnfig slots above the real port range
|
||||||
|
|
||||||
|
#define IPConfigSlot MaxBPQPortNo + 1
|
||||||
extern char * UIUIDigi[MaxBPQPortNo + 1];
|
#define PortMapConfigSlot MaxBPQPortNo + 2
|
||||||
extern char UIUIDEST[MaxBPQPortNo + 1][11]; // Dest for Beacons
|
#define APRSConfigSlot MaxBPQPortNo + 3
|
||||||
extern UCHAR FN[MaxBPQPortNo + 1][256]; // Filename
|
|
||||||
extern int Interval[MaxBPQPortNo + 1]; // Beacon Interval (Mins)
|
|
||||||
extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text
|
extern char * UIUIDigi[MaxBPQPortNo + 1];
|
||||||
|
extern char UIUIDEST[MaxBPQPortNo + 1][11]; // Dest for Beacons
|
||||||
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
|
extern UCHAR FN[MaxBPQPortNo + 1][256]; // Filename
|
||||||
extern BOOL SendFromFile[MaxBPQPortNo + 1];
|
extern int Interval[MaxBPQPortNo + 1]; // Beacon Interval (Mins)
|
||||||
|
extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text
|
||||||
extern BOOL MQTT;
|
|
||||||
extern char MQTT_HOST[80];
|
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
|
||||||
extern int MQTT_PORT;
|
extern BOOL SendFromFile[MaxBPQPortNo + 1];
|
||||||
extern char MQTT_USER[80];
|
|
||||||
extern char MQTT_PASS[80];
|
extern BOOL MQTT;
|
||||||
|
extern char MQTT_HOST[80];
|
||||||
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
|
extern int MQTT_PORT;
|
||||||
|
extern char MQTT_USER[80];
|
||||||
|
extern char MQTT_PASS[80];
|
||||||
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
|
|
||||||
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
|
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
|
||||||
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
|
|
||||||
|
|
||||||
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
|
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
|
||||||
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
|
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
|
||||||
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
|
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
|
||||||
|
|
||||||
|
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
|
||||||
|
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
|
||||||
|
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
|
5
config.c
5
config.c
|
@ -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>
|
||||||
|
@ -512,7 +512,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1532,7 +1531,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
kiss.c
2
kiss.c
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
8
makefile
8
makefile
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# LinBPQ Makefile
|
||||||
|
|
||||||
|
# To exclude i2c support run make noi2c
|
||||||
|
|
||||||
|
OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pngwutil.o\
|
||||||
|
pngread.o pngwrite.o png.o pngerror.o pngget.o pngmem.o APRSIconData.o AISCommon.o\
|
||||||
|
upnp.o APRSStdPages.o HSMODEM.o WinRPR.o KISSHF.o TNCEmulators.o bpqhdlc.o SerialPort.o\
|
||||||
|
adif.o WebMail.o utf8Routines.o VARA.o LzFind.o Alloc.o LzmaDec.o LzmaEnc.o LzmaLib.o \
|
||||||
|
Multicast.o ARDOP.o IPCode.o FLDigi.o linether.o CMSAuth.o APRSCode.o BPQtoAGW.o KAMPactor.o\
|
||||||
|
AEAPactor.o HALDriver.o MULTIPSK.o BBSHTMLConfig.o ChatHTMLConfig.o BBSUtilities.o bpqaxip.o\
|
||||||
|
BPQINP3.o BPQNRR.o cMain.o Cmd.o CommonCode.o HTMLCommonCode.o compatbits.o config.o datadefs.o \
|
||||||
|
FBBRoutines.o HFCommon.o Housekeeping.o HTTPcode.o kiss.o L2Code.o L3Code.o L4Code.o lzhuf32.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 \
|
||||||
|
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
|
||||||
|
|
||||||
|
# Configuration:
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
all: CFLAGS = -DLINBPQ -MMD -g -fcommon
|
||||||
|
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
|
||||||
|
all: linbpq
|
||||||
|
|
||||||
|
|
||||||
|
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -DNOMQTT
|
||||||
|
nomqtt: linbpq
|
||||||
|
|
||||||
|
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -fcommon
|
||||||
|
noi2c: linbpq
|
||||||
|
|
||||||
|
|
||||||
|
linbpq: $(OBJS)
|
||||||
|
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
|
||||||
|
sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
|
||||||
|
|
||||||
|
-include *.d
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm *.d
|
||||||
|
rm linbpq $(OBJS)
|
||||||
|
|
2
mqtt.c
2
mqtt.c
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,858 @@
|
||||||
|
// basic JASON API to BPQ Node
|
||||||
|
|
||||||
|
// Authentication is via Telnet USER records.
|
||||||
|
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
|
||||||
|
#include "cheaders.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "tncinfo.h"
|
||||||
|
#include "asmstrucs.h"
|
||||||
|
#include "kiss.h"
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
#define TOKEN_SIZE 32 // Length of the authentication token
|
||||||
|
#define TOKEN_EXPIRATION 7200 // Token expiration time in seconds (2 hours)
|
||||||
|
|
||||||
|
// Token data structure
|
||||||
|
typedef struct Token {
|
||||||
|
char token[TOKEN_SIZE + 1];
|
||||||
|
time_t expiration_time;
|
||||||
|
struct Token* next;
|
||||||
|
} Token;
|
||||||
|
|
||||||
|
typedef struct API
|
||||||
|
{
|
||||||
|
char *URL;
|
||||||
|
int URLLen;
|
||||||
|
int (* APIRoutine)(char * response, char * token, char * param);
|
||||||
|
int Auth;
|
||||||
|
} API;
|
||||||
|
|
||||||
|
// Auth defines
|
||||||
|
|
||||||
|
#define AuthNone 0
|
||||||
|
#define AuthUser 1
|
||||||
|
#define Auth BBSUser 2
|
||||||
|
#define AuthSysop 4
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
void handle_request(SOCKET client_socket, char * request, char * response);
|
||||||
|
int verify_token(const char* token);
|
||||||
|
void remove_expired_tokens();
|
||||||
|
char* fetch_data(const char* endpoint);
|
||||||
|
int request_token(char * response);
|
||||||
|
int send_http_response(char * response, const char* msg);
|
||||||
|
int create_json_response(char * response, char* access_token, int expires_in, char* scope);
|
||||||
|
void add_token_to_list(Token* token);
|
||||||
|
|
||||||
|
Token* find_token(const char* token);
|
||||||
|
Token* generate_token();
|
||||||
|
|
||||||
|
int sendPortList(char * response, char * token, char * Rest);
|
||||||
|
int sendNodeList(char * response, char * token, char * Rest);
|
||||||
|
int sendUserList(char * response, char * token, char * Rest);
|
||||||
|
int sendInfo(char * response, char * token, char * Rest);
|
||||||
|
int sendLinks(char * response, char * token, char * Rest);
|
||||||
|
int sendPortMHList(char * response, char * token, char * Rest);
|
||||||
|
int sendWhatsPacState(char * response, char * token, char * param);
|
||||||
|
int sendWhatsPacConfig(char * response, char * token, char * param);
|
||||||
|
|
||||||
|
void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
|
||||||
|
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
|
||||||
|
|
||||||
|
// Token list
|
||||||
|
Token* token_list = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
struct API APIList[] =
|
||||||
|
{
|
||||||
|
"/api/ports", 10, sendPortList, 0,
|
||||||
|
"/api/nodes", 10, sendNodeList, 0,
|
||||||
|
"/api/info", 9, sendInfo, 0,
|
||||||
|
"/api/links", 10, sendLinks, 0,
|
||||||
|
"/api/users", 10, sendUserList, 0,
|
||||||
|
"/api/mheard", 11, sendPortMHList, 0,
|
||||||
|
"/api/v1/config", 14, sendWhatsPacConfig, 0,
|
||||||
|
"/api/v1/state", 13, sendWhatsPacState, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
int APICount = sizeof(APIList) / sizeof(struct API);
|
||||||
|
|
||||||
|
extern int HTTPPort;
|
||||||
|
|
||||||
|
|
||||||
|
int xx()
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
// Remove expired tokens
|
||||||
|
remove_expired_tokens();
|
||||||
|
|
||||||
|
// Handle the client request
|
||||||
|
// handle_request();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
|
||||||
|
{
|
||||||
|
const char * auth_header = "Authorization: Bearer ";
|
||||||
|
char * token_begin = strstr(request, auth_header);
|
||||||
|
char token[TOKEN_SIZE + 1]= "";
|
||||||
|
int Flags = 0, n;
|
||||||
|
|
||||||
|
// Node Flags isn't currently used
|
||||||
|
|
||||||
|
char * Tok;
|
||||||
|
char * param;
|
||||||
|
|
||||||
|
if (token_begin)
|
||||||
|
{
|
||||||
|
// Using Auth Header
|
||||||
|
|
||||||
|
// Extract the token from the request (assuming it's present in the request headers)
|
||||||
|
|
||||||
|
if (token_begin == NULL)
|
||||||
|
{
|
||||||
|
Debugprintf("Invalid request: No authentication token provided.\n");
|
||||||
|
return send_http_response(response, "403 (Forbidden)");
|
||||||
|
}
|
||||||
|
|
||||||
|
token_begin += strlen(auth_header); // Move to the beginning of the token
|
||||||
|
strncpy(token, token_begin, TOKEN_SIZE);
|
||||||
|
token[TOKEN_SIZE] = '\0'; // Null-terminate the token
|
||||||
|
|
||||||
|
param = strlop(URL, '?');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// There may be a token as first param, but if auth not needed may be misisng
|
||||||
|
|
||||||
|
Tok = strlop(URL, '?');
|
||||||
|
param = strlop(Tok, '&');
|
||||||
|
|
||||||
|
if (Tok && strlen(Tok) == TOKEN_SIZE)
|
||||||
|
{
|
||||||
|
// assume auth token
|
||||||
|
|
||||||
|
strcpy(token, Tok);
|
||||||
|
}
|
||||||
|
else param = Tok;
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_expired_tokens(); // Tidy up
|
||||||
|
|
||||||
|
// Check if the request is for token generation
|
||||||
|
|
||||||
|
if (strcmp(Method, "OPTIONS") == 0)
|
||||||
|
{
|
||||||
|
// CORS Request
|
||||||
|
|
||||||
|
char Resp[] =
|
||||||
|
"HTTP/1.1 200 OK\r\n"
|
||||||
|
"Access-Control-Allow-Origin: *\r\n"
|
||||||
|
"Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n"
|
||||||
|
"Access-Control-Allow-Headers: authorization";
|
||||||
|
|
||||||
|
return send_http_response(response, Resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(Method, "GET") != 0)
|
||||||
|
return send_http_response(response, "403 (Bad Method)");
|
||||||
|
|
||||||
|
if (_stricmp(URL, "/api/request_token") == 0)
|
||||||
|
return request_token(response);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (token[0] == 0)
|
||||||
|
{
|
||||||
|
// Extract the token from the request (assuming it's present in the request headers)
|
||||||
|
if (token_begin == NULL)
|
||||||
|
{
|
||||||
|
Debugprintf("Invalid request: No authentication token provided.\n");
|
||||||
|
return send_http_response(response, "403 (Forbidden)");
|
||||||
|
}
|
||||||
|
token_begin += strlen(auth_header); // Move to the beginning of the token
|
||||||
|
strncpy(token, token_begin, TOKEN_SIZE);
|
||||||
|
token[TOKEN_SIZE] = '\0'; // Null-terminate the token
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify the token
|
||||||
|
if (!verify_token(token))
|
||||||
|
{
|
||||||
|
Debugprintf("Invalid authentication token.\n");
|
||||||
|
return send_http_response(response, "401 Unauthorized");
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Determine the requested API endpoint
|
||||||
|
|
||||||
|
for (n = 0; n < APICount; n++)
|
||||||
|
{
|
||||||
|
struct API * APIEntry;
|
||||||
|
char * rest;
|
||||||
|
|
||||||
|
APIEntry = &APIList[n];
|
||||||
|
|
||||||
|
if (_memicmp(URL, APIEntry->URL, APIEntry->URLLen) == 0)
|
||||||
|
{
|
||||||
|
rest = &request[4 + APIEntry->URLLen]; // Anything following?
|
||||||
|
|
||||||
|
if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?')
|
||||||
|
return APIEntry->APIRoutine(response, token, rest);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return send_http_response(response, "401 Invalid API Call");
|
||||||
|
}
|
||||||
|
|
||||||
|
int request_token(char * response)
|
||||||
|
{
|
||||||
|
Token * token = generate_token();
|
||||||
|
char scope[] = "create";
|
||||||
|
|
||||||
|
printf("Token generated: %s\n", token->token);
|
||||||
|
|
||||||
|
sprintf(response, "{\"access_token\":\"%s\", \"expires_at\":%ld,\"scope\":\"create\"}\r\n",
|
||||||
|
token->token, token->expiration_time);
|
||||||
|
|
||||||
|
return strlen(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
Token * generate_token()
|
||||||
|
{
|
||||||
|
// Generate a random authentication token
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Token * token = malloc(sizeof(Token));
|
||||||
|
for (i = 0; i < TOKEN_SIZE; i++)
|
||||||
|
{
|
||||||
|
token->token[i] = 'A' + rand() % 26; // Random uppercase alphabet character
|
||||||
|
}
|
||||||
|
token->token[TOKEN_SIZE] = '\0'; // Null-terminate the token
|
||||||
|
token->expiration_time = time(NULL) + TOKEN_EXPIRATION; // Set token expiration time
|
||||||
|
add_token_to_list(token);
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to add the token to the token_list
|
||||||
|
|
||||||
|
void add_token_to_list(Token* token)
|
||||||
|
{
|
||||||
|
if (token_list == NULL)
|
||||||
|
{
|
||||||
|
token_list = token;
|
||||||
|
token->next = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Token* current = token_list;
|
||||||
|
|
||||||
|
while (current->next != NULL)
|
||||||
|
current = current->next;
|
||||||
|
|
||||||
|
current->next = token;
|
||||||
|
token->next = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int verify_token(const char* token)
|
||||||
|
{
|
||||||
|
// Find the token in the token list
|
||||||
|
Token * existing_token = find_token(token);
|
||||||
|
|
||||||
|
if (existing_token != NULL)
|
||||||
|
{
|
||||||
|
// Check if the token has expired
|
||||||
|
time_t current_time = time(NULL);
|
||||||
|
if (current_time > existing_token->expiration_time)
|
||||||
|
{
|
||||||
|
// Token has expired, remove it from the token list
|
||||||
|
remove_expired_tokens();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// Token is valid
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token doesn't exist in the token list
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_expired_tokens()
|
||||||
|
{
|
||||||
|
time_t current_time = time(NULL);
|
||||||
|
Token* current_token = token_list;
|
||||||
|
Token* prev_token = NULL;
|
||||||
|
Token* next_token;
|
||||||
|
|
||||||
|
while (current_token != NULL)
|
||||||
|
{
|
||||||
|
if (current_time > current_token->expiration_time)
|
||||||
|
{
|
||||||
|
// Token has expired, remove it from the token list
|
||||||
|
if (prev_token == NULL)
|
||||||
|
{
|
||||||
|
token_list = current_token->next;
|
||||||
|
} else {
|
||||||
|
prev_token->next = current_token->next;
|
||||||
|
}
|
||||||
|
next_token = current_token->next;
|
||||||
|
free(current_token);
|
||||||
|
current_token = next_token;
|
||||||
|
} else {
|
||||||
|
prev_token = current_token;
|
||||||
|
current_token = current_token->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Token * find_token(const char* token)
|
||||||
|
{
|
||||||
|
Token* current_token = token_list;
|
||||||
|
while (current_token != NULL)
|
||||||
|
{
|
||||||
|
if (strcmp(current_token->token, token) == 0)
|
||||||
|
{
|
||||||
|
return current_token;
|
||||||
|
}
|
||||||
|
current_token = current_token->next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int send_http_response(char * response, const char* msg)
|
||||||
|
{
|
||||||
|
return sprintf(response, "HTTP/1.1 %s\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
|
||||||
|
"expires_in":3600,
|
||||||
|
"scope":"create"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
{"ports":[
|
||||||
|
{"ID":"My Port", "Driver":"KISS", "Number":2, "State":"Active"),
|
||||||
|
{ ...},
|
||||||
|
{...}
|
||||||
|
]}
|
||||||
|
*/
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
char * Array = 0;
|
||||||
|
int ArrayLen = 0;
|
||||||
|
int ArrayPtr = 0;
|
||||||
|
|
||||||
|
struct _EXTPORTDATA * ExtPort;
|
||||||
|
struct PORTCONTROL * Port;
|
||||||
|
struct PORTCONTROL * SAVEPORT;
|
||||||
|
int PortNo;
|
||||||
|
|
||||||
|
int count;
|
||||||
|
char DLL[20];
|
||||||
|
char Status[32]="Unknown";
|
||||||
|
char ID[33];
|
||||||
|
char * ptr;
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "{\"ports\":[\r\n");
|
||||||
|
|
||||||
|
for (count = 1; count <= NUMBEROFPORTS; count++)
|
||||||
|
{
|
||||||
|
Port = GetPortTableEntryFromSlot(count);
|
||||||
|
ExtPort = (struct _EXTPORTDATA *)Port;
|
||||||
|
PortNo = Port->PORTNUMBER;
|
||||||
|
|
||||||
|
if (Port->PORTTYPE == 0x10)
|
||||||
|
{
|
||||||
|
strcpy(DLL, ExtPort->PORT_DLL_NAME);
|
||||||
|
strlop(DLL, '.');
|
||||||
|
strlop(DLL, ' ');
|
||||||
|
}
|
||||||
|
else if (Port->PORTTYPE == 0)
|
||||||
|
strcpy(DLL, "ASYNC");
|
||||||
|
|
||||||
|
else if (Port->PORTTYPE == 22)
|
||||||
|
strcpy(DLL, "I2C");
|
||||||
|
|
||||||
|
else if (Port->PORTTYPE == 14)
|
||||||
|
strcpy(DLL, "INTERNAL");
|
||||||
|
|
||||||
|
else if (Port->PORTTYPE > 0 && Port->PORTTYPE < 14)
|
||||||
|
strcpy(DLL, "HDLC");
|
||||||
|
|
||||||
|
|
||||||
|
if (Port->PortStopped)
|
||||||
|
{
|
||||||
|
strcpy(Status, "Stopped");
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Port->PORTTYPE == 0)
|
||||||
|
{
|
||||||
|
struct KISSINFO * KISS = (struct KISSINFO *)Port;
|
||||||
|
NPASYINFO KPort;
|
||||||
|
|
||||||
|
SAVEPORT = Port;
|
||||||
|
|
||||||
|
if (KISS->FIRSTPORT && KISS->FIRSTPORT != KISS)
|
||||||
|
{
|
||||||
|
// Not first port on device
|
||||||
|
|
||||||
|
Port = (struct PORTCONTROL *)KISS->FIRSTPORT;
|
||||||
|
KPort = KISSInfo[PortNo];
|
||||||
|
}
|
||||||
|
|
||||||
|
KPort = KISSInfo[PortNo];
|
||||||
|
|
||||||
|
if (KPort)
|
||||||
|
{
|
||||||
|
// KISS like - see if connected
|
||||||
|
|
||||||
|
if (Port->PORTIPADDR.s_addr || Port->KISSSLAVE)
|
||||||
|
{
|
||||||
|
// KISS over UDP or TCP
|
||||||
|
|
||||||
|
if (Port->KISSTCP)
|
||||||
|
{
|
||||||
|
if (KPort->Connected)
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
else
|
||||||
|
if (Port->KISSSLAVE)
|
||||||
|
strcpy(Status, "Listen");
|
||||||
|
else
|
||||||
|
strcpy(Status, "Closed");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strcpy(Status, "UDP");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (KPort->idComDev) // Serial port Open
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
else
|
||||||
|
strcpy(Status, "Closed");
|
||||||
|
|
||||||
|
|
||||||
|
Port = SAVEPORT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Port->PORTTYPE == 14) // Loopback
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
|
||||||
|
else if (Port->PORTTYPE == 16) // External
|
||||||
|
{
|
||||||
|
if (Port->PROTOCOL == 10) // 'HF' Port
|
||||||
|
{
|
||||||
|
struct TNCINFO * TNC = TNCInfo[PortNo];
|
||||||
|
|
||||||
|
if (TNC)
|
||||||
|
{
|
||||||
|
switch (TNC->Hardware) // Hardware Type
|
||||||
|
{
|
||||||
|
case H_SCS:
|
||||||
|
case H_KAM:
|
||||||
|
case H_AEA:
|
||||||
|
case H_HAL:
|
||||||
|
case H_TRK:
|
||||||
|
case H_SERIAL:
|
||||||
|
|
||||||
|
// Serial
|
||||||
|
|
||||||
|
if (TNC->hDevice)
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
else
|
||||||
|
strcpy(Status, "Closed");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case H_UZ7HO:
|
||||||
|
|
||||||
|
if (TNCInfo[MasterPort[PortNo]]->CONNECTED)
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
else
|
||||||
|
strcpy(Status, "Closed");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case H_WINMOR:
|
||||||
|
case H_V4:
|
||||||
|
|
||||||
|
case H_MPSK:
|
||||||
|
case H_FLDIGI:
|
||||||
|
case H_UIARQ:
|
||||||
|
case H_ARDOP:
|
||||||
|
case H_VARA:
|
||||||
|
case H_KISSHF:
|
||||||
|
case H_WINRPR:
|
||||||
|
case H_FREEDATA:
|
||||||
|
|
||||||
|
// TCP
|
||||||
|
|
||||||
|
if (TNC->CONNECTED)
|
||||||
|
{
|
||||||
|
if (TNC->Streams[0].Attached)
|
||||||
|
strcpy(Status, "In Use");
|
||||||
|
else
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strcpy(Status, "Closed");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case H_TELNET:
|
||||||
|
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// External but not HF - AXIP, BPQETHER VKISS, ??
|
||||||
|
|
||||||
|
struct _EXTPORTDATA * EXTPORT = (struct _EXTPORTDATA *)Port;
|
||||||
|
|
||||||
|
strcpy(Status, "Open ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strlop(Status, ' ');
|
||||||
|
strcpy(ID, Port->PORTDESCRIPTION);
|
||||||
|
ptr = &ID[29];
|
||||||
|
while (*(ptr) == ' ')
|
||||||
|
{
|
||||||
|
*(ptr--) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], " {\"ID\":\"%s\", \"Driver\":\"%s\", \"Number\":%d,\"State\":\"%s\"},\r\n",
|
||||||
|
ID, DLL, Port->PORTNUMBER, Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayPtr -= 3; // remove trailing comma
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}\r\n");
|
||||||
|
|
||||||
|
return ArrayPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
{"Nodes":[
|
||||||
|
{"Call":"xx", "Alias":"xx", "Nbour1 ":"xx", "Quality":192),
|
||||||
|
{ ...},
|
||||||
|
{...}
|
||||||
|
]}
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern int MaxNodes;
|
||||||
|
extern struct DEST_LIST * DESTS; // NODE LIST
|
||||||
|
extern int DEST_LIST_LEN;
|
||||||
|
|
||||||
|
|
||||||
|
int sendNodeList(char * response, char * token, char * param)
|
||||||
|
{
|
||||||
|
int ArrayPtr = 0;
|
||||||
|
|
||||||
|
int count, len, i;
|
||||||
|
char Normcall[10], Portcall[10];
|
||||||
|
char Alias[7];
|
||||||
|
struct DEST_LIST * Dests = DESTS ;
|
||||||
|
// struct ROUTE * Routes;
|
||||||
|
|
||||||
|
Dests = DESTS;
|
||||||
|
MaxNodes = MAXDESTS;
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "{\"nodes\":[\r\n");
|
||||||
|
|
||||||
|
Dests-=1;
|
||||||
|
|
||||||
|
for (count = 0; count < MaxNodes; count++)
|
||||||
|
{
|
||||||
|
Dests+=1;
|
||||||
|
|
||||||
|
if (Dests->DEST_CALL[0] == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
len = ConvFromAX25(Dests->DEST_CALL, Normcall);
|
||||||
|
Normcall[len] = 0;
|
||||||
|
|
||||||
|
memcpy(Alias, Dests->DEST_ALIAS, 6);
|
||||||
|
|
||||||
|
Alias[6]=0;
|
||||||
|
|
||||||
|
for (i=0;i<6;i++)
|
||||||
|
{
|
||||||
|
if (Alias[i] == ' ')
|
||||||
|
Alias[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Alias\":\"%s\", \"Routes\":[", Normcall, Alias);
|
||||||
|
|
||||||
|
|
||||||
|
// Add an array with up to 6 objects (3 NR + 3 INP3 Neighbours
|
||||||
|
|
||||||
|
if (Dests->NRROUTE[0].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[0].ROUT_NEIGHBOUR->INP3Node == 0)
|
||||||
|
{
|
||||||
|
len = ConvFromAX25(Dests->NRROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
|
||||||
|
Portcall[len] = 0;
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "{\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
|
||||||
|
Portcall, Dests->NRROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[0].ROUT_QUALITY);
|
||||||
|
|
||||||
|
|
||||||
|
// if (Dests->NRROUTE[0].ROUT_OBSCOUNT > 127)
|
||||||
|
// {
|
||||||
|
// len=sprintf(&line[cursor],"! ");
|
||||||
|
// cursor+=len;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
if (Dests->NRROUTE[1].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[1].ROUT_NEIGHBOUR->INP3Node == 0)
|
||||||
|
{
|
||||||
|
len=ConvFromAX25(Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
|
||||||
|
Portcall[len]=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
|
||||||
|
Portcall, Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[1].ROUT_QUALITY);
|
||||||
|
//if (Dests->NRROUTE[1].ROUT_OBSCOUNT > 127)
|
||||||
|
//{
|
||||||
|
//len=sprintf(&line[cursor],"! ");
|
||||||
|
//cursor+=len;
|
||||||
|
//}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Dests->NRROUTE[2].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[2].ROUT_NEIGHBOUR->INP3Node == 0)
|
||||||
|
{
|
||||||
|
len=ConvFromAX25(Dests->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
|
||||||
|
Portcall[len]=0;
|
||||||
|
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
|
||||||
|
Portcall, Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[1].ROUT_QUALITY);
|
||||||
|
|
||||||
|
//if (Dests->NRROUTE[2].ROUT_OBSCOUNT > 127)
|
||||||
|
//{
|
||||||
|
//len=sprintf(&line[cursor],"! ");
|
||||||
|
//cursor+=len;
|
||||||
|
|
||||||
|
}
|
||||||
|
ArrayPtr -= 1; // remove comma
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "]},\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayPtr -= 3; // remove comma
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}");
|
||||||
|
|
||||||
|
return ArrayPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int sendUserList(char * response, char * token, char * param)
|
||||||
|
{
|
||||||
|
int ArrayPtr = 0;
|
||||||
|
int n = MAXCIRCUITS;
|
||||||
|
TRANSPORTENTRY * L4 = L4TABLE;
|
||||||
|
// TRANSPORTENTRY * Partner;
|
||||||
|
int MaxLinks = MAXLINKS;
|
||||||
|
char State[12] = "", Type[12] = "Uplink";
|
||||||
|
char LHS[50] = "", MID[10] = "", RHS[50] = "";
|
||||||
|
// char Line[100];
|
||||||
|
char Normcall[10];
|
||||||
|
int len;
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "{\"users\":[\r\n");
|
||||||
|
|
||||||
|
while (n--)
|
||||||
|
{
|
||||||
|
if (L4->L4USER[0])
|
||||||
|
{
|
||||||
|
RHS[0] = MID[0] = 0;
|
||||||
|
|
||||||
|
len = ConvFromAX25(L4->L4USER, Normcall);
|
||||||
|
Normcall[len] = 0;
|
||||||
|
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\": \"%s\"},\r\n", Normcall);
|
||||||
|
L4++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ArrayPtr == 12) //empty list
|
||||||
|
{
|
||||||
|
ArrayPtr -=2;
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "]}\r\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ArrayPtr -= 3; // remove trailing comma
|
||||||
|
ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}\r\n");
|
||||||
|
}
|
||||||
|
return ArrayPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern char MYALIASLOPPED[];
|
||||||
|
extern char TextVerstring[];
|
||||||
|
extern char LOCATOR[];
|
||||||
|
|
||||||
|
int sendInfo(char * response, char * token, char * param)
|
||||||
|
{
|
||||||
|
char call[10];
|
||||||
|
|
||||||
|
memcpy(call, MYNODECALL, 10);
|
||||||
|
strlop(call, ' ');
|
||||||
|
|
||||||
|
sprintf(response, "{\"info\":{\"NodeCall\":\"%s\", \"Alias\":\"%s\", \"Locator\":\"%s\", \"Version\":\"%s\"}}\r\n",
|
||||||
|
call, MYALIASLOPPED, LOCATOR, TextVerstring);
|
||||||
|
|
||||||
|
return strlen(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sendLinks(char * response, char * token, char * param)
|
||||||
|
{
|
||||||
|
struct _LINKTABLE * Links = LINKS;
|
||||||
|
int MaxLinks = MAXLINKS;
|
||||||
|
int count;
|
||||||
|
char Normcall1[10];
|
||||||
|
char Normcall2[10];
|
||||||
|
char State[12] = "", Type[12] = "Uplink";
|
||||||
|
int axState;
|
||||||
|
int cctType;
|
||||||
|
int ReplyLen = 0;
|
||||||
|
ReplyLen += sprintf(&response[ReplyLen],"{\"links\":[\r\n");
|
||||||
|
|
||||||
|
for (count=0; count<MaxLinks; count++)
|
||||||
|
{
|
||||||
|
if (Links->LINKCALL[0] != 0)
|
||||||
|
{
|
||||||
|
int len = ConvFromAX25(Links->LINKCALL, Normcall1);
|
||||||
|
Normcall1[len] = 0;
|
||||||
|
|
||||||
|
len = ConvFromAX25(Links->OURCALL, Normcall2);
|
||||||
|
Normcall2[len] = 0;
|
||||||
|
|
||||||
|
|
||||||
|
axState = Links->L2STATE;
|
||||||
|
|
||||||
|
if (axState == 2)
|
||||||
|
strcpy(State, "Connecting");
|
||||||
|
else if (axState == 3)
|
||||||
|
strcpy(State, "FRMR");
|
||||||
|
else if (axState == 4)
|
||||||
|
strcpy(State, "Closing");
|
||||||
|
else if (axState == 5)
|
||||||
|
strcpy(State, "Active");
|
||||||
|
else if (axState == 6)
|
||||||
|
strcpy(State, "REJ Sent");
|
||||||
|
|
||||||
|
cctType = Links->LINKTYPE;
|
||||||
|
|
||||||
|
if (cctType == 1)
|
||||||
|
strcpy(Type, "Uplink");
|
||||||
|
else if (cctType == 2)
|
||||||
|
strcpy(Type, "Downlink");
|
||||||
|
else if (cctType == 3)
|
||||||
|
strcpy(Type, "Node-Node");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ReplyLen += sprintf(&response[ReplyLen], "{\"farCall\": \"%s\",\"ourCall\": \"%s\", \"port\": \"%d\", \"state\": \"%s\", \"linkType\": \"%s\", \"ax25Version\": \"%d\"},\r\n",
|
||||||
|
Normcall1, Normcall2, Links->LINKPORT->PORTNUMBER,
|
||||||
|
State, Type, 2 - Links->VER1FLAG );
|
||||||
|
Links+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ReplyLen < 13)
|
||||||
|
ReplyLen -= 2; // no links
|
||||||
|
else
|
||||||
|
ReplyLen -= 3; // remove trailing comma
|
||||||
|
|
||||||
|
ReplyLen+= sprintf(&response[ReplyLen], "\r\n]}\r\n");
|
||||||
|
|
||||||
|
return ReplyLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sendPortMHList(char * response, char * token, char * param)
|
||||||
|
{
|
||||||
|
struct PORTCONTROL * PORTVEC ;
|
||||||
|
int n;
|
||||||
|
int port = 0;
|
||||||
|
|
||||||
|
if (param[0] = '?' || param[0] == '/')
|
||||||
|
port = atoi(¶m[1]);
|
||||||
|
|
||||||
|
PORTVEC = GetPortTableEntryFromPortNum(port);
|
||||||
|
response[0] = 0;
|
||||||
|
|
||||||
|
if (PORTVEC == 0)
|
||||||
|
return send_http_response(response, "401 Invalid API Call");
|
||||||
|
|
||||||
|
n = sprintf(response,"{\"mheard\":[\r\n");
|
||||||
|
|
||||||
|
BuildPortMH(&response[n], PORTVEC );
|
||||||
|
|
||||||
|
if (response[n] == 0) // No entries
|
||||||
|
{
|
||||||
|
response[strlen(response) - 2] = '\0'; // remove \r\n
|
||||||
|
strcat(response, "]}\r\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
response[strlen(response)-3 ] = '\0'; // remove ,\r\n
|
||||||
|
strcat(response, "\r\n]}\r\n");
|
||||||
|
// printf("MH for port %d:\r\n%s\r\n", PORTVEC->PORTNUMBER, 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)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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}]}";
|
||||||
|
|
||||||
|
sprintf(response, Template, HTTPPort);
|
||||||
|
|
||||||
|
return strlen(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
40
nodeapi.c
40
nodeapi.c
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#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"
|
||||||
|
@ -56,6 +56,8 @@ int sendUserList(char * response, char * token, char * Rest);
|
||||||
int sendInfo(char * response, char * token, char * Rest);
|
int sendInfo(char * response, char * token, char * Rest);
|
||||||
int sendLinks(char * response, char * token, char * Rest);
|
int sendLinks(char * response, char * token, char * Rest);
|
||||||
int sendPortMHList(char * response, char * token, char * Rest);
|
int sendPortMHList(char * response, char * token, char * Rest);
|
||||||
|
int sendWhatsPacState(char * response, char * token, char * param);
|
||||||
|
int sendWhatsPacConfig(char * response, char * token, char * param);
|
||||||
|
|
||||||
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 +73,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, 0,
|
||||||
|
"/api/v1/state", 13, sendWhatsPacState, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
int APICount = sizeof(APIList) / sizeof(struct API);
|
int APICount = sizeof(APIList) / sizeof(struct API);
|
||||||
|
|
||||||
|
extern int HTTPPort;
|
||||||
|
|
||||||
|
|
||||||
int xx()
|
int xx()
|
||||||
|
@ -817,6 +822,37 @@ 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)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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}]}";
|
||||||
|
|
||||||
|
sprintf(response, Template, HTTPPort);
|
||||||
|
|
||||||
|
return strlen(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
2
pibits.c
2
pibits.c
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue