Compare commits

..

35 Commits

Author SHA1 Message Date
Hibby f0ac0675f6
Release, try out some MINI_BUILDD_OPTIONS 2025-03-11 00:51:56 +00:00
Hibby 329e2f441d
Who knows at this point 2025-03-11 00:28:11 +00:00
Hibby 0b4a17004f
New upstream 2025-03-04 22:50:37 +00:00
Hibby f0b507a096 Update upstream source from tag 'upstream/6.0.24.66+repack'
Update to upstream version '6.0.24.66+repack'
with Debian dir 0a1e01b2c4
2025-03-04 22:46:54 +00:00
Hibby b128f2a43a New upstream version 6.0.24.66+repack 2025-03-04 22:46:52 +00:00
Hibby 9d0d20064d
Release! 2025-02-25 09:39:10 +00:00
Hibby ead72b2575
New import packaging 2025-02-25 09:35:39 +00:00
Hibby f1d8b647c7 Update upstream source from tag 'upstream/6.0.24.65+repack'
Update to upstream version '6.0.24.65+repack'
with Debian dir 324f0a8474
2025-02-25 09:32:59 +00:00
Hibby c858986248 New upstream version 6.0.24.65+repack 2025-02-25 09:32:57 +00:00
Hibby bfcf049c56
New packaging tweaks 2025-02-03 22:35:11 +00:00
Hibby 488e218d34 Update upstream source from tag 'upstream/6.0.24.59a+repack'
Update to upstream version '6.0.24.59a+repack'
with Debian dir 618298da94
2025-02-03 22:19:01 +00:00
Hibby 64d58d0c5a New upstream version 6.0.24.59a+repack 2025-02-03 22:18:58 +00:00
Hibby 3efea8aa10
Release 2025-01-06 21:41:04 +00:00
Hibby 8e9260b52d
Updates for .56 2025-01-06 21:37:03 +00:00
Hibby 5105f0adf3 Update upstream source from tag 'upstream/6.0.24.56+repack'
Update to upstream version '6.0.24.56+repack'
with Debian dir 5e2bea687a
2025-01-06 21:26:32 +00:00
Hibby a5c4d344cc New upstream version 6.0.24.56+repack 2025-01-06 21:26:30 +00:00
Hibby b060bf5d39
Update upstream source from tag 'upstream/6.0.24.55+repack'
Update to upstream version '6.0.24.55+repack'
with Debian dir ba150ac059
2025-01-05 23:35:13 +00:00
Hibby d7e92752bb New upstream version 6.0.24.55+repack 2025-01-05 23:25:03 +00:00
Hibby 87cd041888
New upstream version 6.0.24.54+repack 2024-12-17 17:45:09 +00:00
Hibby 33d8e6f75a
Release to unstable 2024-12-17 16:51:59 +00:00
Hibby 58d2baad53
New upstream and packaging tweaks 2024-12-17 16:45:51 +00:00
Hibby 1f73eb5601 Update upstream source from tag 'upstream/6.0.24.54+repack'
Update to upstream version '6.0.24.54+repack'
with Debian dir f571d496d3
2024-12-16 17:54:18 +00:00
Hibby a7d635fe2f New upstream version 6.0.24.54+repack 2024-12-16 17:54:16 +00:00
Hibby eab73bee95
.53 build 2024-12-09 10:06:20 +00:00
Hibby 745a9f8e88 Update upstream source from tag 'upstream/6.0.24.53+repack'
Update to upstream version '6.0.24.53+repack'
with Debian dir 64961bc210
2024-12-03 00:27:59 +00:00
Hibby 96c573931d New upstream version 6.0.24.53+repack 2024-12-03 00:27:57 +00:00
Hibby 697fde3123
Merge branch 'upstream/latest' of git.hibbian.org:Hibbian/linbpq into upstream/latest 2024-11-30 22:18:40 +00:00
Hibby dd84b546a0
Release 2024-11-30 22:14:12 +00:00
Hibby 3a600bee23 Update upstream source from tag 'upstream/6.0.24.52+repack'
Update to upstream version '6.0.24.52+repack'
with Debian dir 0b34b91ce1
2024-11-30 21:42:45 +00:00
Hibby d1c36fce6e New upstream version 6.0.24.52+repack 2024-11-30 21:42:43 +00:00
Hibby d09a168608 Update upstream source from tag 'upstream/6.0.24.51.3+repack+really50'
Update to upstream version '6.0.24.51.3+repack+really50'
with Debian dir 0b34b91ce1
2024-11-30 11:27:30 +00:00
Hibby 93a10a982d New upstream version 6.0.24.51.3+repack+really50 2024-11-30 11:27:28 +00:00
Hibby 757c658adc Update upstream source from tag 'upstream/6.0.24.51.2+repack+really.50'
Update to upstream version '6.0.24.51.2+repack+really.50'
with Debian dir 0b34b91ce1
2024-11-30 11:21:00 +00:00
Hibby f62edf7675 New upstream version 6.0.24.51.2+repack+really.50 2024-11-30 11:20:57 +00:00
Hibby 37bacc3178
Update required for build on trixie - I knew there was weirdness
somewhere!
2024-11-29 19:57:43 +00:00
113 changed files with 2899 additions and 23239 deletions

View File

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

View File

@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include <process.h> //#include <process.h>
//#include <time.h> //#include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -292,8 +292,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
// Send Error Response // Send Error Response
buffptr->Len = 36; buffptr->Len = sprintf(buffptr->Data, "No Connection to PACTOR TNC\r");
memcpy(buffptr->Data, "No Connection to PACTOR TNC\r", 36);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
@ -383,7 +382,8 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_AEA; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
TNC->TEXTMODE = FALSE; TNC->TEXTMODE = FALSE;
@ -391,8 +391,6 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->InitScript = _strupr(TNC->InitScript); TNC->InitScript = _strupr(TNC->InitScript);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
@ -128,7 +128,7 @@ int DataSocket_Write(struct AGWSocketConnectionInfo * sockptr, SOCKET sock);
int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr); int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr); int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
int SendDataToAppl(int Stream, byte * Buffer, int Length); int SendDataToAppl(int Stream, byte * Buffer, int Length);
int InternalAGWDecodeFrame(char * msg, char * buffer, int Stamp, int * FrameType, int useLocalTime, int doNodes); int InternalAGWDecodeFrame(char * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes);
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr); int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length); int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
int ShowApps(); int ShowApps();
@ -402,7 +402,7 @@ int SetUpHostSessions()
extern struct DATAMESSAGE * REPLYBUFFER; extern struct DATAMESSAGE * REPLYBUFFER;
extern BOOL AGWActive; extern BOOL AGWActive;
VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY AGW Session Status // DISPLAY AGW Session Status
@ -1142,6 +1142,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
int con,conport; int con,conport;
int AGWYReply = 0; int AGWYReply = 0;
int state, change; int state, change;
int n;
// if we have hidden some ports then the port in the AGW packet will be an index into the visible ports, // if we have hidden some ports then the port in the AGW packet will be an index into the visible ports,
// not the real port number // not the real port number
@ -1196,7 +1197,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]); conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]);
sprintf(ConnectMsg,"C %d %s",conport,ToCall); n = sprintf(ConnectMsg,"C %d %s",conport,ToCall);
// if 'v' command add digis // if 'v' command add digis
@ -1211,7 +1212,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
while(nDigis--) while(nDigis--)
{ {
sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis); n += sprintf(&ConnectMsg[n], " %s", Digis);
Digis += 10; Digis += 10;
} }
} }

View File

@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
// MSGFLAG contains CMD/RESPONSE BITS // MSGFLAG contains CMD/RESPONSE BITS
@ -61,7 +61,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define NODES_SIG 0xFF #define NODES_SIG 0xFF
char * strlop(char * buf, char delim);
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen); UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes); static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes);

View File

@ -7,7 +7,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
//#include "tncinfo.h" //#include "tncinfo.h"
//#include "adif.h" //#include "adif.h"
//#include "telnetserver.h" //#include "telnetserver.h"
@ -760,7 +760,7 @@ void SaveVesselDataBase()
void LoadNavAidDataBase() void LoadNavAidDataBase()
{ {
int i; int i, n, count;
FILE *file; FILE *file;
char buf[256]; char buf[256];
@ -793,10 +793,12 @@ void LoadNavAidDataBase()
NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *)); NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *));
count = 0;
for (i = 0; i < NavAidCount; i++) for (i = 0; i < NavAidCount; i++)
{ {
navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD)); navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD));
NavRecords[i] = navptr; NavRecords[count] = navptr;
memset(navptr, 0, sizeof(struct NAVAIDRECORD)); memset(navptr, 0, sizeof(struct NAVAIDRECORD));
fgets(buf, 255, file); fgets(buf, 255, file);
@ -807,6 +809,19 @@ void LoadNavAidDataBase()
token = strtok(NULL, "|\n" ); token = strtok(NULL, "|\n" );
strcpy(&navptr->name[0],token); strcpy(&navptr->name[0],token);
for (n = 0; n < 20; n++)
{
char c = navptr->name[n];
if (!isalpha(c) && !isdigit(c) && c != ' ' && c != '_')
{
count--;
break;
}
}
count++;
token = strtok(NULL, "|\n" ); token = strtok(NULL, "|\n" );
navptr->lat = atof(token); navptr->lat = atof(token);
@ -820,6 +835,7 @@ void LoadNavAidDataBase()
navptr->TimeLastUpdated = atoi(token); navptr->TimeLastUpdated = atoi(token);
} }
NavAidCount = count;
fclose(file); fclose(file);
} }
@ -832,6 +848,7 @@ void SaveNavAidDataBase()
char FN[256]; char FN[256];
struct NAVAIDRECORD * navptr; struct NAVAIDRECORD * navptr;
if (BPQDirectory[0] == 0) if (BPQDirectory[0] == 0)
{ {
strcpy(FN, "AIS_NavAids.txt"); strcpy(FN, "AIS_NavAids.txt");
@ -2372,6 +2389,8 @@ void ProcessAISNavAidMessage()
NavAidCount++; NavAidCount++;
ProcessAISNavAidMessage(); ProcessAISNavAidMessage();
NavAidDBChanged = 1;
return; return;

View File

@ -22,11 +22,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// First Version, November 2011 // First Version, November 2011
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#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"
@ -63,7 +62,6 @@ VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Consoleprintf(const char * format, ...); VOID __cdecl Consoleprintf(const char * format, ...);
BOOL APIENTRY Send_AX(PMESSAGE Block, DWORD Len, UCHAR Port); BOOL APIENTRY Send_AX(PMESSAGE Block, DWORD Len, UCHAR Port);
VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port); VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port);
char * strlop(char * buf, char delim);
int APRSDecodeFrame(char * msg, char * buffer, time_t Stamp, uint64_t Mask); // Unsemaphored DecodeFrame int APRSDecodeFrame(char * msg, char * buffer, time_t Stamp, uint64_t Mask); // Unsemaphored DecodeFrame
APRSHEARDRECORD * UpdateHeard(UCHAR * Call, int Port); APRSHEARDRECORD * UpdateHeard(UCHAR * Call, int Port);
BOOL CheckforDups(char * Call, char * Msg, int Len); BOOL CheckforDups(char * Call, char * Msg, int Len);
@ -349,7 +347,7 @@ APRSHEARDRECORD MHTABLE[MAXHEARD] = {0};
APRSHEARDRECORD * MHDATA = &MHTABLE[0]; APRSHEARDRECORD * MHDATA = &MHTABLE[0];
static SOCKET sock = (SOCKET)0; static SOCKET sock = 0;
//Duplicate suppression Code //Duplicate suppression Code
@ -555,6 +553,8 @@ int APRSWriteLog(char * msg)
UCHAR Value[MAX_PATH]; UCHAR Value[MAX_PATH];
time_t T; time_t T;
struct tm * tm; struct tm * tm;
int n;
if (LogAPRSIS == 0) if (LogAPRSIS == 0)
return 0; return 0;
@ -576,8 +576,9 @@ int APRSWriteLog(char * msg)
strcat(Value, "logs/APRS_"); strcat(Value, "logs/APRS_");
} }
sprintf(Value, "%s%02d%02d%02d.log", Value, n = strlen(Value);
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
sprintf(&Value[n], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "ab")) == NULL) if ((file = fopen(Value, "ab")) == NULL)
return FALSE; return FALSE;
@ -3114,7 +3115,7 @@ VOID APRSISThread(void * Report)
BOOL bcopt=TRUE; BOOL bcopt=TRUE;
char Buffer[1000]; char Buffer[1000];
int InputLen = 1; // Non-zero int InputLen = 1; // Non-zero
char errmsg[100]; char errmsg[300];
char * ptr; char * ptr;
size_t inptr = 0; size_t inptr = 0;
char APRSinMsg[1000]; char APRSinMsg[1000];
@ -3675,7 +3676,7 @@ BOOL CheckforDups(char * Call, char * Msg, int Len)
if (ptr1) if (ptr1)
*ptr1 = 0; *ptr1 = 0;
// Debugprintf("Duplicate Message supressed %s", Msg); // Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate return TRUE; // Duplicate
} }
} }
@ -7667,7 +7668,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
} }
OutputLen += sprintf(&OutBuffer[OutputLen], WebTrailer); OutputLen += sprintf(&OutBuffer[OutputLen], "%s", WebTrailer);
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen); HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
sendandcheck(sock, Header, HeaderLen); sendandcheck(sock, Header, HeaderLen);
@ -7712,7 +7713,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
} }
OutputLen += sprintf(&OutBuffer[OutputLen], WebTrailer); OutputLen += sprintf(&OutBuffer[OutputLen], "%s", WebTrailer);
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen); HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
sendandcheck(sock, Header, HeaderLen); sendandcheck(sock, Header, HeaderLen);
@ -8114,7 +8115,7 @@ extern char OrigCmdBuffer[81];
BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr); BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr);
VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// APRS Subcommands. Default for compatibility is APRSMH // APRS Subcommands. Default for compatibility is APRSMH
@ -9179,7 +9180,7 @@ void GetSavedAPRSMessages()
if ((file = fopen(FN, "r")) == NULL) if ((file = fopen(FN, "r")) == NULL)
return ; return ;
while (fgets(Line, 512, file)) while (fgets(Line, sizeof(Line), file))
{ {
Stamp = Line; Stamp = Line;
From = strlop(Stamp, ' '); From = strlop(Stamp, ' ');

56
ARDOP.c
View File

@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
int (WINAPI FAR *GetModuleFileNameExPtr)(); int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -136,6 +136,10 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
if (TNC->Streams[0].Attached) if (TNC->Streams[0].Attached)
TNC->Streams[0].ReportDISC = TRUE; TNC->Streams[0].ReportDISC = TRUE;
TNC->Streams[0].Connecting = 0;
TNC->Streams[0].Connected = 0;
TNC->Streams[0].Attached = 0;
if (TNC->TCPSock) if (TNC->TCPSock)
{ {
shutdown(TNC->TCPSock, SD_BOTH); shutdown(TNC->TCPSock, SD_BOTH);
@ -162,6 +166,9 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped"); sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped");
MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE); MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE);
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
return TRUE; return TRUE;
} }
@ -562,7 +569,7 @@ static int ProcessLine(char * buf, int Port)
void ARDOPThread(struct TNCINFO * TNC); void ARDOPThread(struct TNCINFO * TNC);
VOID ARDOPProcessDataSocketData(int port); VOID ARDOPProcessDataSocketData(int port);
int ConnecttoARDOP(); int ConnecttoARDOP(struct TNCINFO * TNC);
static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC); static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
static VOID ARDOPProcessReceivedControl(struct TNCINFO * TNC); static VOID ARDOPProcessReceivedControl(struct TNCINFO * TNC);
int V4ProcessReceivedData(struct TNCINFO * TNC); int V4ProcessReceivedData(struct TNCINFO * TNC);
@ -643,6 +650,12 @@ VOID ARDOPSendCommand(struct TNCINFO * TNC, char * Buff, BOOL Queue)
if (Buff[0] == 0) // Terminal Keepalive? if (Buff[0] == 0) // Terminal Keepalive?
return; return;
if (memcmp(Buff, "LISTEN ", 7) == 0)
{
strcpy(TNC->WEB_MODE, &Buff[7]);
MySetWindowText(TNC->xIDC_MODE, &Buff[7]);
}
EncLen = sprintf(Encoded, "%s\r", Buff); EncLen = sprintf(Encoded, "%s\r", Buff);
// it is possible for binary data to be dumped into the command // it is possible for binary data to be dumped into the command
@ -876,7 +889,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime)) if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
{ {
ARDOPSendCommand(TNC, "DISCONNECT", TRUE); ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
STREAM->Disconnecting = TRUE; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0;
} }
} }
@ -1480,7 +1494,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1918,7 +1935,7 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE); Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE); Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE); Len += sprintf(&Buff[Len], "<tr><td>Listen</td><td>%s</td></tr>", TNC->WEB_MODE);
Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s &nbsp; %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS); Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s &nbsp; %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE); Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC); Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
@ -1967,6 +1984,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->LogPath) if (TNC->LogPath)
ARDOPOpenLogFiles(TNC); ARDOPOpenLogFiles(TNC);
@ -1979,7 +1997,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_ARDOP; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1987,7 +2005,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -2134,7 +2151,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL);
TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL); TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL);
CreateWindowEx(0, "STATIC", "Mode", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "Listen", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL); TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL);
CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL);
@ -2270,11 +2287,11 @@ VOID TNCLost(struct TNCINFO * TNC)
} }
if (STREAM->Attached) if (STREAM->Attached)
{ STREAM->ReportDISC = TRUE;
STREAM->Connected = FALSE; STREAM->Connected = FALSE;
STREAM->Connecting = FALSE; STREAM->Connecting = FALSE;
STREAM->ReportDISC = TRUE;
}
} }
} }
@ -2600,6 +2617,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 +2698,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;
@ -3212,7 +3235,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
if (TNC->SendTandRtoRelay && memcmp(AppName, "RMS ", 4) == 0 if (TNC->SendTandRtoRelay && memcmp(AppName, "RMS ", 4) == 0
@ -3300,9 +3323,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
} }
if (_memicmp(Buffer, "DISCONNECTED", 12) == 0 if (_memicmp(Buffer, "DISCONNECTED", 12) == 0
|| _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0 || _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0
|| _memicmp(Buffer, "STATUS END ARQ CALL", 19) == 0
|| _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0 || _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0
// || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0 // || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0
|| _memicmp(Buffer, "ABORT", 5) == 0) || _memicmp(Buffer, "ABORT", 5) == 0)
@ -3344,6 +3367,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;
} }
@ -5063,7 +5089,7 @@ tcpHostFrame:
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available
@ -5932,7 +5958,7 @@ VOID ARAXINIT(struct PORTCONTROL * PORT)
char Msg[80] = ""; char Msg[80] = "";
memcpy(Msg, PORT->PORTDESCRIPTION, 30); memcpy(Msg, PORT->PORTDESCRIPTION, 30);
sprintf(Msg, "%s\n", Msg); strcat(Msg, "\n);
WritetoConsoleLocal(Msg); WritetoConsoleLocal(Msg);
} }

View File

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

View File

@ -28,6 +28,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
BOOL Bells; BOOL Bells;
BOOL FlashOnBell; // Flash instead of Beep BOOL FlashOnBell; // Flash instead of Beep
@ -51,6 +55,8 @@ extern struct ConsoleInfo BBSConsole;
extern char LOC[7]; extern char LOC[7];
extern BOOL MQTT;
//#define BBSIDLETIME 120 //#define BBSIDLETIME 120
//#define USERIDLETIME 300 //#define USERIDLETIME 300
@ -75,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);
@ -126,6 +132,7 @@ int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compre
int APIENTRY ChangeSessionCallsign(int Stream, unsigned char * AXCall); int APIENTRY ChangeSessionCallsign(int Stream, unsigned char * AXCall);
void SendMessageReadEvent(char * call, struct MsgInfo * Msg); void SendMessageReadEvent(char * call, struct MsgInfo * Msg);
void SendNewMessageEvent(char * call, struct MsgInfo * Msg); void SendNewMessageEvent(char * call, struct MsgInfo * Msg);
void MQTTMessageEvent(struct MsgInfo * message);
config_t cfg; config_t cfg;
config_setting_t * group; config_setting_t * group;
@ -3452,6 +3459,11 @@ VOID FlagAsKilled(struct MsgInfo * Msg, BOOL SaveDB)
if (SaveDB) if (SaveDB)
SaveMessageDatabase(); SaveMessageDatabase();
RebuildNNTPList(); RebuildNNTPList();
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
} }
void DoDeliveredCommand(CIRCUIT * conn, struct UserInfo * user, char * Cmd, char * Arg1, char * Context) void DoDeliveredCommand(CIRCUIT * conn, struct UserInfo * user, char * Cmd, char * Arg1, char * Context)
@ -4896,6 +4908,10 @@ sendEOM:
Msg->datechanged=time(NULL); Msg->datechanged=time(NULL);
SaveMessageDatabase(); SaveMessageDatabase();
SendMessageReadEvent(user->Call, Msg); SendMessageReadEvent(user->Call, Msg);
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
} }
} }
} }
@ -5794,12 +5810,12 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
continue; continue;
} }
} }
ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, Addr, Via); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", Addr, Via);
continue; continue;
} }
@ -5817,7 +5833,7 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
// Add to B2 Message for RMS // Add to B2 Message for RMS
@ -6457,6 +6473,10 @@ nextline:
user = LookupCall(Msg->to); user = LookupCall(Msg->to);
SendNewMessageEvent(user->Call, Msg); SendNewMessageEvent(user->Call, Msg);
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
if (EnableUI) if (EnableUI)
#ifdef LINBPQ #ifdef LINBPQ
@ -6558,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
@ -7286,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);
@ -10120,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;
} }
@ -10141,7 +10164,6 @@ BOOL GetConfig(char * ConfigName)
int i; int i;
char Size[80]; char Size[80];
config_setting_t *setting; config_setting_t *setting;
const char * ptr;
char * ptr1; char * ptr1;
char FBBString[8192]= ""; char FBBString[8192]= "";
FBBFilter f; FBBFilter f;
@ -10206,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));
@ -10236,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");
@ -10252,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);
@ -10264,8 +10285,7 @@ BOOL GetConfig(char * ConfigName)
if (setting && setting->value.sval[0]) if (setting && setting->value.sval[0])
{ {
ptr = config_setting_get_string (setting); WelcomeMsg = _strdup(config_setting_get_string (setting));
WelcomeMsg = _strdup(ptr);
} }
else else
WelcomeMsg = _strdup("Hello $I. Latest Message is $L, Last listed is $Z\r\n"); WelcomeMsg = _strdup("Hello $I. Latest Message is $L, Last listed is $Z\r\n");
@ -10274,10 +10294,7 @@ BOOL GetConfig(char * ConfigName)
setting = config_setting_get_member (group, "NewUserWelcomeMsg"); setting = config_setting_get_member (group, "NewUserWelcomeMsg");
if (setting && setting->value.sval[0]) if (setting && setting->value.sval[0])
{ NewWelcomeMsg = _strdup(config_setting_get_string (setting));
ptr = config_setting_get_string (setting);
NewWelcomeMsg = _strdup(ptr);
}
else else
NewWelcomeMsg = _strdup("Hello $I. Latest Message is $L, Last listed is $Z\r\n"); NewWelcomeMsg = _strdup("Hello $I. Latest Message is $L, Last listed is $Z\r\n");
@ -10285,10 +10302,7 @@ BOOL GetConfig(char * ConfigName)
setting = config_setting_get_member (group, "ExpertWelcomeMsg"); setting = config_setting_get_member (group, "ExpertWelcomeMsg");
if (setting && setting->value.sval[0]) if (setting && setting->value.sval[0])
{ ExpertWelcomeMsg = _strdup(config_setting_get_string (setting));
ptr = config_setting_get_string (setting);
ExpertWelcomeMsg = _strdup(ptr);
}
else else
ExpertWelcomeMsg = _strdup(""); ExpertWelcomeMsg = _strdup("");
@ -10297,10 +10311,7 @@ BOOL GetConfig(char * ConfigName)
setting = config_setting_get_member (group, "Prompt"); setting = config_setting_get_member (group, "Prompt");
if (setting && setting->value.sval[0]) if (setting && setting->value.sval[0])
{ Prompt = _strdup(config_setting_get_string (setting));
ptr = config_setting_get_string (setting);
Prompt = _strdup(ptr);
}
else else
{ {
Prompt = malloc(20); Prompt = malloc(20);
@ -10310,10 +10321,7 @@ BOOL GetConfig(char * ConfigName)
setting = config_setting_get_member (group, "NewUserPrompt"); setting = config_setting_get_member (group, "NewUserPrompt");
if (setting && setting->value.sval[0]) if (setting && setting->value.sval[0])
{ NewPrompt = _strdup(config_setting_get_string (setting));
ptr = config_setting_get_string (setting);
NewPrompt = _strdup(ptr);
}
else else
{ {
NewPrompt = malloc(20); NewPrompt = malloc(20);
@ -10323,10 +10331,7 @@ BOOL GetConfig(char * ConfigName)
setting = config_setting_get_member (group, "ExpertPrompt"); setting = config_setting_get_member (group, "ExpertPrompt");
if (setting && setting->value.sval[0]) if (setting && setting->value.sval[0])
{ ExpertPrompt = _strdup(config_setting_get_string (setting));
ptr = config_setting_get_string (setting);
ExpertPrompt = _strdup(ptr);
}
else else
{ {
ExpertPrompt = malloc(20); ExpertPrompt = malloc(20);
@ -10347,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;
@ -10433,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");
@ -10464,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++)
@ -10482,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);
} }
@ -10547,7 +10552,7 @@ int Connected(int Stream)
char ConnectedMsg[] = "*** CONNECTED "; char ConnectedMsg[] = "*** CONNECTED ";
char Msg[100]; char Msg[100];
char Title[100]; char Title[100];
int Freq = 0; int64_t Freq = 0;
int Mode = 0; int Mode = 0;
BPQVECSTRUC * SESS; BPQVECSTRUC * SESS;
TRANSPORTENTRY * Sess1 = NULL, * Sess2; TRANSPORTENTRY * Sess1 = NULL, * Sess2;
@ -11781,6 +11786,11 @@ VOID ProcessTextFwdLine(ConnectionInfo * conn, struct UserInfo * user, char * Bu
SaveMessageDatabase(); SaveMessageDatabase();
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
// See if any more to forward // See if any more to forward

View File

@ -162,7 +162,7 @@ BEGIN
WS_VSCROLL WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14, DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER BS_CENTER | BS_VCENTER
LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT", LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24 IDC_STATIC,9,52,355,24
END END

View File

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

View File

@ -1144,7 +1144,10 @@
// Include SERVIC as valid from call (for Winlink Service messages) (49) // Include SERVIC as valid from call (for Winlink Service messages) (49)
// Attempt to detect line draw characters in Webmail (50) // Attempt to detect line draw characters in Webmail (50)
// 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 tp packetnodes.spots.radio database (51) // Send forwarding info to packetnodes.spots.radio database (51)
// Fix bug in WP Message processing (56)
// Fix treating addresses ending in WW as Internet (57)
// Run sending to packetnodes.spots.radio in a separate thread (61)
#include "bpqmail.h" #include "bpqmail.h"
#include "winstdint.h" #include "winstdint.h"
@ -1536,7 +1539,11 @@ VOID WriteMiniDump()
} }
void GetSemaphore(struct SEM * Semaphore, int ID)
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free
@ -2830,6 +2837,12 @@ gotAddr:
EndDialog(hDlg, LOWORD(wParam)); EndDialog(hDlg, LOWORD(wParam));
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
return TRUE; return TRUE;
} }
@ -3085,6 +3098,8 @@ BOOL Initialise()
GetTimeZoneInformation(&TimeZoneInformation); GetTimeZoneInformation(&TimeZoneInformation);
Debugprintf("%d", sizeof(struct MsgInfo));
_tzset(); _tzset();
_MYTIMEZONE = timezone; _MYTIMEZONE = timezone;
_MYTIMEZONE = TimeZoneInformation.Bias * 60; _MYTIMEZONE = TimeZoneInformation.Bias * 60;
@ -3396,7 +3411,6 @@ BOOL Initialise()
CreatePipeThread(); CreatePipeThread();
GetPGConfig(); GetPGConfig();
APIClock = 0; APIClock = 0;
return TRUE; return TRUE;

View File

@ -1045,7 +1045,7 @@ BEGIN
CONTROL "Delete Log and Message Files to Recycle Bin", CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX | IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20 BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
CONTROL "Supress Mailing of Housekeeping Results", CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20 BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button", CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",

View File

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

View File

@ -214,7 +214,7 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ; LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
extern CMDX COMMANDS[]; extern struct CMDX COMMANDS[];
extern int APPL1; extern int APPL1;
static HMENU trayMenu; static HMENU trayMenu;

View File

@ -56,7 +56,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#ifndef WIN32 #ifndef WIN32
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
@ -87,7 +87,7 @@ void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
static BOOL ReadConfigFile(int Port); static BOOL ReadConfigFile(int Port);
int ConnecttoAGW(); int ConnecttoAGW(int port);
int ProcessReceivedData(int bpqport); int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port, BOOL CheckPort); static int ProcessLine(char * buf, int Port, BOOL CheckPort);

48
Bpq32.c
View File

@ -3,7 +3,7 @@ Copyright 2001-2022 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32. This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify LinBPQ/BPQ32 is free software: you can redistribute it and/or modifyextern int HTTP
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
@ -1235,6 +1235,28 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// API format fixes (48) // API format fixes (48)
// AGWAPI Add protection against accidental connects from a non-agw application (50) // AGWAPI Add protection against accidental connects from a non-agw application (50)
// Save MH and NODES every hour (51) // Save MH and NODES every hour (51)
// Fix handling long unix device names (now max 250 bytes) (52)
// Fix error reporting in api update (53)
// Coding changes to remove some compiler warnings (53, 54)
// Add MQTT reporting of Mail Events (54)
// Fix beaconong on KISSHF ports (55)
// Fix MailAPI msgs endpoint
// Attempt to fix NC going to wrong application. (57)
// Improve ARDOP end of session code (58)
// Run M0LTE Map reporting in a separate thread (59/60)
// Add RHP support for WhatsPac (59)
// Add timestamps to LIS monitor (60)
// Fix problem with L4 frames being delivered out of sequence (60)
// Add Compression of Netrom connections (62)
// Improve handling of Locked Routes (62)
// Add L4 RESET (Paula G8PZT's extension to NETROM)
// Fix problem using SENDRAW from BPQMail (63)
// Fix compatibility with latest ardopcf (64)
// Fix bug in RHP socket timeout code (65)
// Fix L4 RTT (66)
// Fix RigConrol with Chanxx but no other settings (66)
#define CKernel #define CKernel
@ -1496,6 +1518,7 @@ VOID APRSClose();
VOID CloseTNCEmulator(); VOID CloseTNCEmulator();
VOID Poll_AGW(); VOID Poll_AGW();
void RHPPoll();
BOOL AGWAPIInit(); BOOL AGWAPIInit();
int AGWAPITerminate(); int AGWAPITerminate();
@ -1514,7 +1537,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;
@ -1862,8 +1887,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
@ -2284,6 +2309,7 @@ VOID TimerProcX()
Poll_AGW(); Poll_AGW();
DRATSPoll(); DRATSPoll();
RHPPoll();
CheckGuardZone(); CheckGuardZone();
@ -6094,13 +6120,14 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len = sprintf(RegLine, "%s\\\r\n", RegLine); len += sprintf(&RegLine[len], "\\\r\n", RegLine);
strcat(RegLine, "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]); len += sprintf(&RegLine[len], "%02x,", Value[k]);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;
RegLine[++len] = 0x0a; RegLine[++len] = 0x0a;
@ -6126,19 +6153,20 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len = sprintf(RegLine, "%s\\\r\n", RegLine); len += sprintf(RegLine[len], "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
len += sprintf(&RegLine[len], "%02x,", Value[k]);
if (len > 76) if (len > 76)
{ {
len = sprintf(RegLine, "%s\\\r\n", RegLine); len += sprintf(RegLine[len], "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
} }
len = sprintf(RegLine, "%s00,", RegLine); len += sprintf(&RegLine[len], "00,");
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;

View File

@ -23,6 +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(char * buf, char delim);
#define APIENTRY #define APIENTRY
#define VOID void #define VOID void
@ -31,7 +32,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <windows.h> #include <windows.h>
#endif #endif
char * strlop(char * buf, char delim);
VOID APIENTRY md5 (char *arg, unsigned char * checksum); VOID APIENTRY md5 (char *arg, unsigned char * checksum);

View File

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

File diff suppressed because it is too large Load Diff

408
Cmd.c
View File

@ -35,7 +35,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include "vmm.h" //#include "vmm.h"
//#include "SHELLAPI.H" //#include "SHELLAPI.H"
#include "CHeaders.h" #include "cheaders.h"
#include "bpqaprs.h" #include "bpqaprs.h"
#include "kiss.h" #include "kiss.h"
@ -44,6 +44,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "tncinfo.h" #include "tncinfo.h"
#include "telnetserver.h" #include "telnetserver.h"
//#include "GetVersion.h" //#include "GetVersion.h"
//#define DllImport __declspec( dllimport ) //#define DllImport __declspec( dllimport )
@ -64,12 +66,12 @@ VOID L2SENDXID(struct _LINKTABLE * LINK);
int CountBits(unsigned long in); int CountBits(unsigned long in);
VOID SaveMH(); VOID SaveMH();
BOOL RestartTNC(struct TNCINFO * TNC); BOOL RestartTNC(struct TNCINFO * TNC);
void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID WriteMiniDump(); VOID WriteMiniDump();
int CheckKissInterlock(struct PORTCONTROL * PORT, int Exclusive); int CheckKissInterlock(struct PORTCONTROL * PORT, int Exclusive);
int seeifInterlockneeded(struct PORTCONTROL * PORT); int seeifInterlockneeded(struct PORTCONTROL * PORT);
extern VOID KISSTX(); extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer);
char COMMANDBUFFER[81] = ""; // Command Hander input buffer char COMMANDBUFFER[81] = ""; // Command Hander input buffer
char OrigCmdBuffer[81] = ""; // Command Hander input buffer before toupper char OrigCmdBuffer[81] = ""; // Command Hander input buffer before toupper
@ -134,8 +136,8 @@ int L4FRAMESRETRIED = 0;
int OLDFRAMES = 0; int OLDFRAMES = 0;
int L3FRAMES = 0; int L3FRAMES = 0;
VOID SENDSABM(); VOID SENDSABM(struct _LINKTABLE * LINK);
VOID RESET2(); VOID RESET2(struct _LINKTABLE * LINK);
int APPL1 = 0; int APPL1 = 0;
int PASSCMD = 0; int PASSCMD = 0;
@ -149,33 +151,35 @@ char * ALIASPTR = &CMDALIAS[0][0];
extern int RigReconfigFlag; extern int RigReconfigFlag;
CMDX COMMANDS[];
int CMDXLEN = sizeof (CMDX);
struct CMDX COMMANDS[];
int CMDXLEN = sizeof (struct CMDX);
VOID SENDNODESMSG(); VOID SENDNODESMSG();
VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID STOPCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID STOPCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID STARTCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID STARTCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID STOPPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID STOPPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID STARTPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID STARTPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID FINDBUFFS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID FINDBUFFS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID WL2KSYSOP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID WL2KSYSOP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID AXRESOLVER(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID AXRESOLVER(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID AXMHEARD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID AXMHEARD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID SHOWTELNET(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID SHOWTELNET(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID FLMSG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD); VOID FLMSG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD);
void ListExcludedCalls(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); void ListExcludedCalls(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID HELPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID HELPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD); VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD);
VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD); VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD);
void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK); void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
@ -242,7 +246,7 @@ char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char
} }
VOID SENDNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SENDNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
SENDNODESMSG(); SENDNODESMSG();
@ -252,7 +256,7 @@ VOID SENDNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID SAVEMHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SAVEMHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
SaveMH(); SaveMH();
@ -262,7 +266,7 @@ VOID SAVEMHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID SAVENODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SAVENODES(struct _TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
SaveNodes(); SaveNodes();
@ -272,7 +276,7 @@ VOID SAVENODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID DUMPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID DUMPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
WriteMiniDump(); WriteMiniDump();
@ -282,7 +286,7 @@ VOID DUMPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID RIGRECONFIG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID RIGRECONFIG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
if (!ProcessConfig()) if (!ProcessConfig())
{ {
@ -297,7 +301,7 @@ VOID RIGRECONFIG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMD
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID REBOOT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID REBOOT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
if (Reboot()) if (Reboot())
{ {
@ -313,7 +317,7 @@ VOID REBOOT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID RESTART(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID RESTART(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
if (Restart()) if (Restart())
{ {
@ -329,7 +333,7 @@ VOID RESTART(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID RESTARTTNC(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID RESTARTTNC(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char * ptr, *Context; char * ptr, *Context;
int portno; int portno;
@ -373,20 +377,20 @@ VOID RESTARTTNC(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
UCHAR VALNODESFLAG = 0, EXTONLY = 0; UCHAR VALNODESFLAG = 0, EXTONLY = 0;
VOID PORTVAL (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); VOID PORTVAL (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
VOID VALNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID VALNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
VALNODESFLAG = 1; VALNODESFLAG = 1;
PORTVAL(Session, Bufferptr, CmdTail, CMD); PORTVAL(Session, Bufferptr, CmdTail, CMD);
} }
VOID EXTPORTVAL(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID EXTPORTVAL(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
EXTONLY = 1; EXTONLY = 1;
PORTVAL(Session, Bufferptr, CmdTail, CMD); PORTVAL(Session, Bufferptr, CmdTail, CMD);
} }
VOID PORTVAL(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID PORTVAL(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS PORT VALUE COMMANDS // PROCESS PORT VALUE COMMANDS
@ -501,7 +505,7 @@ VOID PORTVAL(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
} }
VOID SWITCHVAL (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SWITCHVAL (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// Update switch 8 bit value // Update switch 8 bit value
@ -546,7 +550,7 @@ VOID SWITCHVAL (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
} }
VOID SWITCHVALW (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SWITCHVALW (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// Update switch 16 bit value // Update switch 16 bit value
@ -709,7 +713,7 @@ BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySess
return FALSE; return FALSE;
} }
VOID APPLCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID APPLCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
BOOL CONFAILED = 0; BOOL CONFAILED = 0;
UINT CONERROR ; UINT CONERROR ;
@ -820,13 +824,13 @@ VOID APPLCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
} }
VOID CMDI00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDI00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", INFOMSG); Bufferptr = Cmdprintf(Session, Bufferptr, "%s", INFOMSG);
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID CMDV00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDV00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
if (sizeof(void *) == 4) if (sizeof(void *) == 4)
Bufferptr = Cmdprintf(Session, Bufferptr, "Version %s\r", VersionString); Bufferptr = Cmdprintf(Session, Bufferptr, "Version %s\r", VersionString);
@ -836,14 +840,14 @@ VOID CMDV00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID BYECMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID BYECMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
CLOSECURRENTSESSION(Session); // Kills any crosslink, plus local link CLOSECURRENTSESSION(Session); // Kills any crosslink, plus local link
ReleaseBuffer((UINT *)REPLYBUFFER); ReleaseBuffer((UINT *)REPLYBUFFER);
return; return;
} }
VOID CMDPAC(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDPAC(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// SET PACLEN FOR THIS SESSION // SET PACLEN FOR THIS SESSION
@ -865,7 +869,7 @@ VOID CMDPAC(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID CMDIDLE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDIDLE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// SET IDLETIME FOR THIS SESSION // SET IDLETIME FOR THIS SESSION
@ -887,7 +891,7 @@ VOID CMDIDLE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID CMDT00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDT00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// SET L4 TIMEOUT FOR CONNECTS ON THIS SESSION // SET L4 TIMEOUT FOR CONNECTS ON THIS SESSION
@ -912,7 +916,7 @@ VOID CMDT00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
UCHAR PWLen; UCHAR PWLen;
char PWTEXT[80]; char PWTEXT[80];
VOID PWDCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID PWDCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char * ptr, *Context; char * ptr, *Context;
USHORT pwsum = 0; USHORT pwsum = 0;
@ -980,11 +984,10 @@ VOID PWDCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
return; return;
} }
VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
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;
@ -1001,8 +1004,16 @@ VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
if (Port == 0) if (Port == 0)
{ {
uptime = FormatUptime(STATSTIME); struct tm * TM;
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", uptime); char UPTime[50];
time_t szClock = STATSTIME * 60;
TM = gmtime(&szClock);
sprintf(UPTime, "Uptime (Days Hours Mins) %.2d:%.2d:%.2d\r",
TM->tm_yday, TM->tm_hour, TM->tm_min);
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", UPTime);
Bufferptr = Cmdprintf(Session, Bufferptr, "Semaphore Get-Rel/Clashes %9d%9d\r", Bufferptr = Cmdprintf(Session, Bufferptr, "Semaphore Get-Rel/Clashes %9d%9d\r",
Semaphore.Gets - Semaphore.Rels, Semaphore.Clashes); Semaphore.Gets - Semaphore.Rels, Semaphore.Clashes);
@ -1214,7 +1225,7 @@ VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS 'LINKS' MESSAGE // PROCESS 'LINKS' MESSAGE
@ -1250,7 +1261,7 @@ VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
} }
VOID CMDS00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDS00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS 'USERS' // PROCESS 'USERS'
@ -1322,7 +1333,7 @@ CMDS60:
extern int MasterPort[MAXBPQPORTS+1]; // Pointer to first BPQ port for a specific MPSK or UZ7HO host extern int MasterPort[MAXBPQPORTS+1]; // Pointer to first BPQ port for a specific MPSK or UZ7HO host
VOID CMDP00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDP00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// Process PORTS Message // Process PORTS Message
@ -1505,7 +1516,7 @@ VOID CMDP00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE * Routes, char Verbose) char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE * Routes, char Verbose)
{ {
char Normcall[10]; char Normcall[10];
char locked[] = " ! "; char locked[4] = " ";
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
char PercentString[20]; char PercentString[20];
@ -1519,11 +1530,16 @@ char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE *
Normcall[9]=0; Normcall[9]=0;
if ((Routes->NEIGHBOUR_FLAG & 1) == 1) if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
strcpy(locked, "!"); strcpy(locked, "!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
strcpy(locked, " "); strcpy(locked, " ");
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
if (Routes->NEIGHBOUR_LINK && Routes->NEIGHBOUR_LINK->L2STATE >= 5) if (Routes->NEIGHBOUR_LINK && Routes->NEIGHBOUR_LINK->L2STATE >= 5)
@ -1577,7 +1593,7 @@ char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE *
} }
VOID CMDR00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDR00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
@ -1667,7 +1683,7 @@ ROUTEUPDATE:
{ {
// Toggle Lock // Toggle Lock
Routes->NEIGHBOUR_FLAG ^= 1; // FLIP LOCKED BIT Routes->NEIGHBOUR_FLAG ^= LOCKEDBYSYSOP; // FLIP LOCKED BIT
goto Displayit; goto Displayit;
} }
@ -1686,7 +1702,7 @@ ROUTEUPDATE:
{ {
// Toggle Lock // Toggle Lock
Routes->NEIGHBOUR_FLAG ^= 1; // FLIP LOCKED BIT Routes->NEIGHBOUR_FLAG ^= LOCKEDBYSYSOP; // FLIP LOCKED BIT
goto Displayit; goto Displayit;
} }
} }
@ -1700,174 +1716,13 @@ Displayit:
else else
Bufferptr = Cmdprintf(Session, Bufferptr, "Not Found\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Not Found\r");
/* MOV ROUTEDISP,1
CMP BYTE PTR [ESI],20H
JE SHORT JUSTDISPLAY
MOV ZAPFLAG,0
CMP BYTE PTR [ESI],'Z'
JNE SHORT NOTZAP
MOV ZAPFLAG,1
JMP SHORT JUSTDISPLAY
PUBLIC NOTZAP
NOTZAP:
MOV ROUTEDISP,2 ; LOCK UPDATE
CMP BYTE PTR [ESI],'!'
JE SHORT JUSTDISPLAY
;
; LOOK FOR V FOR ADDING A DIGI
;
CMP WORD PTR [ESI],' V' ; V [SPACE]
JE ADDDIGI
CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH
JC SHORT BADROUTECMD ; INVALID DIGITS
MOV NEWROUTEVAL,AL
MOV ROUTEDISP,0
CALL SCAN ; SEE IF !
MOV AH,[ESI]
PUBLIC JUSTDISPLAY
JUSTDISPLAY:
MOV ESI,OFFSET32 AX25CALL
CALL _FINDNEIGHBOUR
JZ SHORT FOUNDROUTE ; IN LIST - OK
CMP EBX,0
JE SHORT BADROUTECMD ; TABLE FULL??
MOV ECX,7
MOV EDI,EBX
REP MOVSB ; PUT IN CALL
MOV AL,SAVEPORT
MOV NEIGHBOUR_PORT[EBX],AL
JMP SHORT FOUNDROUTE
PUBLIC BADROUTECMD
BADROUTECMD:
POP EDI
JMP PBADVALUE
PUBLIC FOUNDROUTE
FOUNDROUTE:
CMP ZAPFLAG,1
JNE SHORT NOTCLEARCOUNTS
XOR AX,AX
MOV ES:WORD PTR NBOUR_IFRAMES[EDI],AX
MOV ES:WORD PTR NBOUR_IFRAMES+2[EDI],AX
MOV ES:WORD PTR NBOUR_RETRIES[EDI],AX
MOV ES:WORD PTR NBOUR_RETRIES+2[EDI],AX
JMP SHORT NOUPDATE
PUBLIC NOTCLEARCOUNTS
NOTCLEARCOUNTS:
CMP ROUTEDISP,1
JE SHORT NOUPDATE
CMP ROUTEDISP,2
JE SHORT LOCKUPDATE
MOV AL,NEWROUTEVAL
MOV NEIGHBOUR_QUAL[EBX],AL
CMP AH,'!'
JNE SHORT NOUPDATE
PUBLIC LOCKUPDATE
LOCKUPDATE:
XOR NEIGHBOUR_FLAG[EBX],1 ; FLIP LOCKED BIT
PUBLIC NOUPDATE
NOUPDATE:
MOV ESI,EBX
POP EDI
POP EBX
CALL DISPLAYROUTE
JMP SENDCOMMANDREPLY
PUBLIC ADDDIGI
ADDDIGI:
ADD ESI,2
PUSH ESI ; SAVE INPUT BUFFER
MOV ESI,OFFSET32 AX25CALL
CALL _FINDNEIGHBOUR
POP ESI
JZ SHORT ADD_FOUND ; IN LIST - OK
JMP BADROUTECMD
PUBLIC ADD_FOUND
ADD_FOUND:
CALL CONVTOAX25 ; GET DIGI CALLSIGN
PUSH ESI
MOV ESI,OFFSET32 AX25CALL
LEA EDI,NEIGHBOUR_DIGI[EBX]
MOV ECX,7
REP MOVSB
POP ESI ; MSG BUFFER
;
; SEE IF ANOTHER DIGI
;
CMP BYTE PTR [ESI],20H
JE SHORT NOMORE
CALL CONVTOAX25 ; GET DIGI CALLSIGN
MOV ESI,OFFSET32 AX25CALL
LEA EDI,NEIGHBOUR_DIGI+7[EBX]
MOV ECX,7
REP MOVSB
PUBLIC NOMORE
NOMORE:
JMP NOUPDATE
*/
SendReply: SendReply:
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS LISTEN COMMAND // PROCESS LISTEN COMMAND
@ -1878,6 +1733,7 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
char * ptr, *Context; char * ptr, *Context;
struct PORTCONTROL * PORT = NULL; struct PORTCONTROL * PORT = NULL;
char ListenPortList[128] = ""; char ListenPortList[128] = "";
int len = 0;
ptr = strtok_s(CmdTail, " ,", &Context); ptr = strtok_s(CmdTail, " ,", &Context);
@ -1930,7 +1786,7 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
} }
} }
sprintf(ListenPortList, "%s %d", ListenPortList, Port); len += sprintf(&ListenPortList[len], " %d", Port);
ListenMask |= ((uint64_t)1 << (Port - 1)); ListenMask |= ((uint64_t)1 << (Port - 1));
} }
@ -1950,7 +1806,7 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
} }
VOID UNPROTOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID UNPROTOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS UNPROTO COMMAND // PROCESS UNPROTO COMMAND
@ -2019,7 +1875,7 @@ VOID UNPROTOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
return; return;
} }
VOID CALCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CALCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS CAL COMMAND // PROCESS CAL COMMAND
@ -2072,7 +1928,7 @@ VOID CALCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
VOID CQCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CQCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// Send a CQ Beacon on a radio port. Must be in LISTEN state // Send a CQ Beacon on a radio port. Must be in LISTEN state
@ -2278,9 +2134,9 @@ BOOL FindLink(UCHAR * LinkCall, UCHAR * OurCall, int Port, struct _LINKTABLE **
return FALSE; return FALSE;
} }
VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD); VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD);
VOID CMDC00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDC00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS CONNECT COMMAND // PROCESS CONNECT COMMAND
@ -2302,7 +2158,7 @@ VOID CMDC00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * C
char PortString[10]; char PortString[10];
char cmdCopy[256]; char cmdCopy[256];
struct _EXTPORTDATA * EXTPORT = (struct _EXTPORTDATA *)PORT; struct _EXTPORTDATA * EXTPORT = (struct _EXTPORTDATA *)PORT;
char toCall[12], fromCall[12];
#ifdef EXCLUDEBITS #ifdef EXCLUDEBITS
@ -2920,7 +2776,7 @@ BOOL DecodeCallString(char * Calls, BOOL * Stay, BOOL * Spy, UCHAR * AXCalls)
} }
VOID LINKCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID LINKCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS *** LINKED to CALLSIGN // PROCESS *** LINKED to CALLSIGN
@ -3112,7 +2968,7 @@ int WildCmp(char * pattern, char * string)
return 0; return 0;
} }
VOID CMDN00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID CMDN00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
struct DEST_LIST * Dest = DESTS; struct DEST_LIST * Dest = DESTS;
int count = MAXDESTS, i; int count = MAXDESTS, i;
@ -3633,7 +3489,7 @@ SendReply:
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID CMDQUERY(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD) VOID CMDQUERY(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD)
{ {
// DISPLAY AVAILABLE COMMANDS // DISPLAY AVAILABLE COMMANDS
@ -3642,7 +3498,7 @@ VOID CMDQUERY(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
char ApplList[2048]; char ApplList[2048];
char * out = ApplList; char * out = ApplList;
CMDX * CMD = &COMMANDS[APPL1]; struct CMDX * CMD = &COMMANDS[APPL1];
for (n = 0; n < NumberofAppls; n++) for (n = 0; n < NumberofAppls; n++)
{ {
@ -3672,7 +3528,7 @@ VOID CMDQUERY(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
char * FormatMH(MHSTRUC * MH, char Format); char * FormatMH(MHSTRUC * MH, char Format);
VOID MHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID MHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY HEARD LIST // DISPLAY HEARD LIST
@ -3854,7 +3710,7 @@ VOID MHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CM
int Rig_Command(TRANSPORTENTRY * Session, char * Command); int Rig_Command(TRANSPORTENTRY * Session, char * Command);
VOID RADIOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD) VOID RADIOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD)
{ {
char * ptr; char * ptr;
@ -3883,7 +3739,7 @@ VOID RADIOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session); VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session);
VOID NRRCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD) VOID NRRCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD)
{ {
// PROCESS 'NRR - Netrom Record Route' COMMAND // PROCESS 'NRR - Netrom Record Route' COMMAND
@ -3953,7 +3809,7 @@ int CHECKINTERLOCK(struct PORTCONTROL * OURPORT)
return 0; return 0;
} }
VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD) VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD)
{ {
// ATTACH to a PACTOR or similar port // ATTACH to a PACTOR or similar port
@ -4133,7 +3989,7 @@ VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
if (ret & 0x8000) // Disconnecting if (ret & 0x8000) // Disconnecting
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use (Disconnecting)\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return; return;
} }
@ -4184,14 +4040,25 @@ VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
if (EXTPORT->ATTACHEDSESSIONS[sess] || PORT->PortSuspended) if (EXTPORT->ATTACHEDSESSIONS[sess])
{ {
// In use // In use
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use (Session Attached\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return; return;
} }
if (PORT->PortSuspended)
{
// In use
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port Suspended\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
// GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK // GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK
NewSess = SetupNewSession(Session, Bufferptr); NewSess = SetupNewSession(Session, Bufferptr);
@ -4318,16 +4185,17 @@ checkattachandcall:
// SYSOP COMMANDS // SYSOP COMMANDS
CMDX COMMANDS[] = struct CMDX COMMANDS[] =
{ {
"SAVENODES ",8, SAVENODES, 0, // "SAVENODES ",8, SAVENODES(struct _TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD), 0,
"TELRECONFIG ",4, RECONFIGTELNET, 0, "SAVENODES ",8, &SAVENODES, 0,
"SAVEMH ",6, SAVEMHCMD, 0, "TELRECONFIG ",4, &RECONFIGTELNET, 0,
"REBOOT ",6, REBOOT, 0, "SAVEMH ",6, &SAVEMHCMD, 0,
"RIGRECONFIG ",8 , RIGRECONFIG, 0, "REBOOT ",6, &REBOOT, 0,
"RESTART ",7,RESTART,0, "RIGRECONFIG ",8, &RIGRECONFIG, 0,
"RESTARTTNC ",10,RESTARTTNC,0, "RESTART ",7, &RESTART,0,
"SENDNODES ",8,SENDNODES,0, "RESTARTTNC ",10,&RESTARTTNC,0,
"SENDNODES ",8, &SENDNODES,0,
"EXTRESTART ",10, EXTPORTVAL, offsetof(EXTPORTDATA, EXTRESTART), "EXTRESTART ",10, EXTPORTVAL, offsetof(EXTPORTDATA, EXTRESTART),
"TXDELAY ",3, PORTVAL, offsetof(PORTCONTROLX, PORTTXDELAY), "TXDELAY ",3, PORTVAL, offsetof(PORTCONTROLX, PORTTXDELAY),
"MAXFRAME ",3, PORTVAL, offsetof(PORTCONTROLX, PORTWINDOW), "MAXFRAME ",3, PORTVAL, offsetof(PORTCONTROLX, PORTWINDOW),
@ -4457,9 +4325,9 @@ CMDX COMMANDS[] =
"..FLMSG ",7,FLMSG,0 "..FLMSG ",7,FLMSG,0
}; };
CMDX * CMD = NULL; struct CMDX * CMD = NULL;
int NUMBEROFCOMMANDS = sizeof(COMMANDS)/sizeof(CMDX); int NUMBEROFCOMMANDS = sizeof(COMMANDS)/sizeof(struct CMDX);
char * ReplyPointer; // Pointer into reply buffer char * ReplyPointer; // Pointer into reply buffer
@ -4952,7 +4820,7 @@ VOID StatsTimer()
int x = 17; int x = 17;
} }
if (PORT->PORTTXROUTINE == KISSTX && (KISS->QtSMStats || KISS->FIRSTPORT->PORT.QtSMPort)) // KISS Port QtSM Stats if ((void *)PORT->PORTTXROUTINE == (void *)KISSTX && (KISS->QtSMStats || KISS->FIRSTPORT->PORT.QtSMPort)) // KISS Port QtSM Stats
{ {
} }
else else
@ -4990,7 +4858,7 @@ extern struct AXIPPORTINFO * Portlist[];
#define TCPConnected 4 #define TCPConnected 4
VOID AXRESOLVER(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID AXRESOLVER(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY AXIP Resolver info // DISPLAY AXIP Resolver info
@ -5080,7 +4948,7 @@ VOID AXRESOLVER(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID AXMHEARD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID AXMHEARD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY AXIP Mheard info // DISPLAY AXIP Mheard info
@ -5150,7 +5018,7 @@ extern char WL2KLoc[7];
BOOL GetWL2KSYSOPInfo(char * Call, char * _REPLYBUFFER); BOOL GetWL2KSYSOPInfo(char * Call, char * _REPLYBUFFER);
BOOL UpdateWL2KSYSOPInfo(char * Call, char * SQL); BOOL UpdateWL2KSYSOPInfo(char * Call, char * SQL);
VOID WL2KSYSOP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID WL2KSYSOP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char _REPLYBUFFER[1000] = ""; char _REPLYBUFFER[1000] = "";
@ -5302,7 +5170,7 @@ VOID WL2KSYSOP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
VOID CloseKISSPort(struct PORTCONTROL * PortVector); VOID CloseKISSPort(struct PORTCONTROL * PortVector);
VOID STOPCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID STOPCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char _REPLYBUFFER[1000] = ""; char _REPLYBUFFER[1000] = "";
char * ptr, * Context; char * ptr, * Context;
@ -5363,7 +5231,7 @@ VOID STOPCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
} }
VOID STARTCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID STARTCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char _REPLYBUFFER[1000] = ""; char _REPLYBUFFER[1000] = "";
char * ptr, * Context; char * ptr, * Context;
@ -5423,7 +5291,7 @@ VOID STARTCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
} }
VOID STOPPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID STOPPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char _REPLYBUFFER[1000] = ""; char _REPLYBUFFER[1000] = "";
char * ptr, * Context; char * ptr, * Context;
@ -5507,7 +5375,7 @@ VOID STOPPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
} }
VOID STARTPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID STARTPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char _REPLYBUFFER[1000] = ""; char _REPLYBUFFER[1000] = "";
char * ptr, * Context; char * ptr, * Context;
@ -5599,7 +5467,7 @@ VOID STARTPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
int ASYSEND(struct PORTCONTROL * PortVector, char * buffer, int count); int ASYSEND(struct PORTCONTROL * PortVector, char * buffer, int count);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char _REPLYBUFFER[1000] = ""; char _REPLYBUFFER[1000] = "";
char * ptr, * Context; char * ptr, * Context;
@ -5690,7 +5558,7 @@ VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
} }
VOID FINDBUFFS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID FINDBUFFS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
FindLostBuffers(); FindLostBuffers();
@ -5702,7 +5570,7 @@ VOID FINDBUFFS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID FLMSG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * UserCMD) VOID FLMSG(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * UserCMD)
{ {
// Telnet Connection from FLMSG // Telnet Connection from FLMSG
CLOSECURRENTSESSION(Session); // Kills any crosslink, plus local link CLOSECURRENTSESSION(Session); // Kills any crosslink, plus local link
@ -5725,7 +5593,7 @@ BOOL CheckExcludeList(UCHAR * Call)
} }
void ListExcludedCalls(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) void ListExcludedCalls(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
UCHAR * ptr = ExcludeList; UCHAR * ptr = ExcludeList;
@ -5774,7 +5642,7 @@ BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr)
return TRUE; return TRUE;
} }
VOID HELPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID HELPCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
int FileSize; int FileSize;
char MsgFile[MAX_PATH]; char MsgFile[MAX_PATH];
@ -5863,7 +5731,7 @@ int UZ7HOSetModem(int port, struct TNCINFO * TNC, struct AGWINFO * AGW, PDATAMES
int UZ7HOSetFlags(int port, struct TNCINFO * TNC, struct AGWINFO * AGW, PDATAMESSAGE buff, PMSGWITHLEN buffptr); int UZ7HOSetFlags(int port, struct TNCINFO * TNC, struct AGWINFO * AGW, PDATAMESSAGE buff, PMSGWITHLEN buffptr);
VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char * Cmd; char * Cmd;
int port; int port;
@ -5934,7 +5802,7 @@ VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
return; return;
} }
VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
int port; int port;
struct PORTCONTROL * PORT; struct PORTCONTROL * PORT;
@ -5946,7 +5814,7 @@ VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
PORT = GetPortTableEntryFromPortNum(port); PORT = GetPortTableEntryFromPortNum(port);
if (PORT == NULL || PORT->PORTTXROUTINE != KISSTX) // Must be a kiss like port if (PORT == NULL || (void *)PORT->PORTTXROUTINE != (void *)KISSTX) // Must be a kiss like port
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port %d is not a KISS port\r", port); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port %d is not a KISS port\r", port);
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));

View File

@ -18,7 +18,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c // General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
@ -32,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "configstructs.h" #include "configstructs.h"
@ -69,7 +68,7 @@ VOID WriteMiniDump();
void printStack(void); void printStack(void);
char * FormatMH(PMHSTRUC MH, char Format); char * FormatMH(PMHSTRUC MH, char Format);
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode); void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
void SendDataToPktMap(char *Msg); void SendDataToPktMap();
extern BOOL LogAllConnects; extern BOOL LogAllConnects;
extern BOOL M0LTEMap; extern BOOL M0LTEMap;
@ -692,7 +691,7 @@ VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer)
} }
VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM, VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM,
VOID TidyCloseProc(), VOID ForcedCloseProc(), VOID CloseComplete()) VOID TidyCloseProc(struct TNCINFO * TNC, int Stream), VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream), VOID CloseComplete(struct TNCINFO * TNC, int Stream))
{ {
void ** buffptr; void ** buffptr;
@ -722,8 +721,6 @@ VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM
if (STREAM->Connected || STREAM->Connecting) if (STREAM->Connected || STREAM->Connecting)
{ {
char logmsg[120];
time_t Duration;
// Need to do a tidy close // Need to do a tidy close
@ -1020,7 +1017,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
char * Config; char * Config;
static char * ptr1, * ptr2; static char * ptr1, * ptr2;
BOOL ReadConfigFile(int Port, int ProcLine()) BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
{ {
char buf[256],errbuf[256]; char buf[256],errbuf[256];
@ -1458,7 +1455,21 @@ DllExport int APIENTRY SessionStateNoAck(int stream, int * state)
return 0; return 0;
} }
int SendMsgEx(int stream, char * msg, int len, int GetSem);
int SendMsgNoSem(int stream, char * msg, int len)
{
return SendMsgEx(stream, msg, len, 0);
}
DllExport int APIENTRY SendMsg(int stream, char * msg, int len) DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
{
return SendMsgEx(stream, msg, len, 1);
}
int SendMsgEx(int stream, char * msg, int len, int GetSem)
{ {
// Send message to stream (BPQHOST Function 2) // Send message to stream (BPQHOST Function 2)
@ -1481,10 +1492,12 @@ 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
if (GetSem)
GetSemaphore(&Semaphore, 10); GetSemaphore(&Semaphore, 10);
if ((MSG = GetBuff()) == 0) if ((MSG = GetBuff()) == 0)
{ {
if (GetSem)
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
return 0; return 0;
} }
@ -1496,6 +1509,7 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
SENDUIMESSAGE(MSG); SENDUIMESSAGE(MSG);
ReleaseBuffer(MSG); ReleaseBuffer(MSG);
if (GetSem)
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
return 0; return 0;
} }
@ -1511,12 +1525,14 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
if (L4 == 0) if (L4 == 0)
return 0; return 0;
if (GetSem)
GetSemaphore(&Semaphore, 22); 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?
{ {
if (GetSem)
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
return 1; return 1;
} }
@ -1530,6 +1546,7 @@ 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);
if (GetSem)
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
return 1; return 1;
} }
@ -1537,6 +1554,7 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
if ((MSG = GetBuff()) == 0) if ((MSG = GetBuff()) == 0)
{ {
if (GetSem)
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
return 1; return 1;
} }
@ -1564,6 +1582,7 @@ 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);
if (GetSem)
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
return 0; return 0;
} }
@ -1603,9 +1622,9 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
MSG->LENGTH = len + MSGHDDRLEN; MSG->LENGTH = len + MSGHDDRLEN;
if (PORT->PROTOCOL == 10) // PACTOR/WINMOR Style if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF) // PACTOR/WINMOR Style
{ {
// Pactor Style. Probably will only be used for Tracker uneless we do APRS over V4 or WINMOR // Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT; EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
@ -2437,7 +2456,7 @@ static struct speed_struct
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits) HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits)
{ {
char Port[256]; char Port[256];
char buf[100]; char buf[512];
// Linux Version. // Linux Version.
@ -2667,6 +2686,14 @@ int DoRoutes()
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{ {
// Dont save routes from config file here or they are difficult to get rid of
if (Routes->NEIGHBOUR_FLAG & LOCKEDBYCONFIG)
{
Routes++;
continue;
}
len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall); len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall);
Normcall[len]=0; Normcall[len]=0;
@ -2690,7 +2717,7 @@ int DoRoutes()
digis[0] = 0; digis[0] = 0;
len=sprintf(line, len=sprintf(line,
"ROUTE ADD %s %d %d %s %d %d %d %d %d\n", "ROUTE ADD %s %d %d %s %d %d %d %d %d %c\n",
Normcall, Normcall,
Routes->NEIGHBOUR_PORT, Routes->NEIGHBOUR_PORT,
Routes->NEIGHBOUR_QUAL, digis, Routes->NEIGHBOUR_QUAL, digis,
@ -2698,7 +2725,8 @@ int DoRoutes()
Routes->NBOUR_FRACK, Routes->NBOUR_FRACK,
Routes->NBOUR_PACLEN, Routes->NBOUR_PACLEN,
Routes->INP3Node | (Routes->NoKeepAlive << 2), Routes->INP3Node | (Routes->NoKeepAlive << 2),
Routes->OtherendsRouteQual); Routes->OtherendsRouteQual,
(Routes->NEIGHBOUR_FLAG & LOCKEDBYSYSOP)?'!':' ');
fputs(line, file); fputs(line, file);
} }
@ -3009,19 +3037,7 @@ DllExport int APIENTRY ClearNodes ()
return (0); return (0);
} }
char * FormatUptime(int Uptime)
{
struct tm * TM;
static char UPTime[50];
time_t szClock = Uptime * 60;
TM = gmtime(&szClock);
sprintf(UPTime, "Uptime (Days Hours Mins) %.2d:%.2d:%.2d\r",
TM->tm_yday, TM->tm_hour, TM->tm_min);
return UPTime;
}
static char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; static char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
@ -3332,7 +3348,7 @@ VOID SendLocation()
SendReportMsg((char *)&AXMSG.DEST, Len + 16); SendReportMsg((char *)&AXMSG.DEST, Len + 16);
if (M0LTEMap) if (M0LTEMap)
SendDataToPktMap(""); SendDataToPktMap();
return; return;
@ -3340,7 +3356,6 @@ VOID SendLocation()
VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode) VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode)
{ {
MESSAGE AXMSG; MESSAGE AXMSG;
@ -3356,7 +3371,8 @@ VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * M
// Block includes the Msg Header (7 bytes), Len Does not! // Block includes the Msg Header (7 bytes), Len Does not!
memcpy(AXPTR->DEST, ReportDest, 7); memcpy(AXPTR->DEST, ReportDest, 7);
if (TNC->PortRecord->PORTCONTROL.PORTCALL[0])
if (TNC && TNC->PortRecord->PORTCONTROL.PORTCALL[0])
memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7); memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7);
else else
memcpy(AXPTR->ORIGIN, MYCALL, 7); memcpy(AXPTR->ORIGIN, MYCALL, 7);
@ -3516,8 +3532,10 @@ int __sync_lock_test_and_set(int * ptr, int val)
#endif // MACBPQ #endif // MACBPQ
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void GetSemaphore(struct SEM * Semaphore, int ID)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free
@ -3561,6 +3579,8 @@ loop1:
Semaphore->SemProcessID = GetCurrentProcessId(); Semaphore->SemProcessID = GetCurrentProcessId();
Semaphore->SemThreadID = GetCurrentThreadId(); Semaphore->SemThreadID = GetCurrentThreadId();
SemHeldByAPI = ID; SemHeldByAPI = ID;
Semaphore->Line = Line;
strcpy(Semaphore->File, File);
return; return;
} }
@ -4185,10 +4205,10 @@ VOID GetUIConfig()
if (group) if (group)
{ {
GetStringValue(group, "UIDEST", &UIUIDEST[Port][0]); GetStringValue(group, "UIDEST", &UIUIDEST[Port][0], 11);
GetStringValue(group, "FileName", &FN[Port][0]); GetStringValue(group, "FileName", &FN[Port][0], 256);
GetStringValue(group, "Message", &Message[Port][0]); GetStringValue(group, "Message", &Message[Port][0], 1000);
GetStringValue(group, "Digis", Digis); GetStringValue(group, "Digis", Digis, 100);
UIUIDigi[Port] = _strdup(Digis); UIUIDigi[Port] = _strdup(Digis);
Interval[Port] = GetIntValue(group, "Interval"); Interval[Port] = GetIntValue(group, "Interval");
@ -4219,15 +4239,21 @@ int GetIntValue(config_setting_t * group, char * name)
return 0; return 0;
} }
BOOL GetStringValue(config_setting_t * group, char * name, char * value) BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
{ {
const char * str; char * str;
config_setting_t *setting; config_setting_t *setting;
setting = config_setting_get_member (group, name); setting = config_setting_get_member (group, name);
if (setting) if (setting)
{ {
str = config_setting_get_string (setting); str = (char *)config_setting_get_string(setting);
if (strlen(str) > maxlen)
{
Debugprintf("Suspect config record %s", str);
str[maxlen] = 0;
}
strcpy(value, str); strcpy(value, str);
return TRUE; return TRUE;
} }
@ -4759,13 +4785,14 @@ LRESULT CALLBACK UIWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
extern struct DATAMESSAGE * REPLYBUFFER; extern struct DATAMESSAGE * REPLYBUFFER;
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...); char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
char FN[250]; char FN[250];
FILE *hFile; FILE *hFile;
struct stat STAT; struct stat STAT;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
char PortList[256] = ""; char PortList[256] = "";
int len = 0;
while (PORT) while (PORT)
{ {
@ -4807,7 +4834,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CM
*ptr = '\r'; *ptr = '\r';
sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER); len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER);
} }
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;
@ -4992,7 +5019,7 @@ DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params,
while (InputLen != -1) while (InputLen != -1)
{ {
InputLen = recv(sock, &Buffer[inptr], 4096 - inptr, 0); InputLen = recv(sock, &Buffer[inptr], 4095 - inptr, 0);
if (InputLen == -1 || InputLen == 0) if (InputLen == -1 || InputLen == 0)
{ {
@ -5040,8 +5067,6 @@ DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params,
else else
{ {
strlop(Buffer, 13); strlop(Buffer, 13);
Debugprintf("Map Update Params - %s", Params);
Debugprintf("Map Update failed - %s", Buffer); Debugprintf("Map Update failed - %s", Buffer);
} }
closesocket(sock); closesocket(sock);
@ -5055,7 +5080,7 @@ DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params,
if (ptr1) if (ptr1)
{ {
// Just accept anything until I've sorted things with Lee // Just accept anything until I've sorted things with Lee
Debugprintf("%s", ptr1);
closesocket(sock); closesocket(sock);
Debugprintf("Web Database update ok"); Debugprintf("Web Database update ok");
return; return;
@ -5147,11 +5172,16 @@ skipit:
} }
} }
void SendDataToPktMapThread();
void SendDataToPktMap(char *Msg) void SendDataToPktMap()
{ {
SOCKET sock; _beginthread(SendDataToPktMapThread,2048000,0);
char Return[256]; }
void SendDataToPktMapThread()
{
char Return[256] = "";
char Request[64]; char Request[64];
char Params[50000]; char Params[50000];
@ -5599,7 +5629,7 @@ void SendDataToPktMap(char *Msg)
// "contact": "string", // "contact": "string",
// "neighbours": [{"node": "G7TAJ","port": "30"}] // "neighbours": [{"node": "G7TAJ","port": "30"}]
SendWebRequest("packetnodes.spots.radio", Request, Params, Return); SendWebRequest("packetnodes.spots.radio", Request, Params, 0);
} }
// ="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}"; // ="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}";

View File

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

View File

@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "telnetserver.h" #include "telnetserver.h"
@ -168,7 +168,7 @@ int AllocateDRATSStream(struct DRATSSession * Sess)
if (Stream == 255) return 0; if (Stream == 255) return 0;
if (memcmp(Sess->CallTo, "NODE", 6) == 0) if (memcmp(Sess->CallTo, "NODE", 4) == 0)
{ {
// Just connect to command level on switch // Just connect to command level on switch
} }
@ -563,7 +563,7 @@ void DRATSConnectionLost(struct ConnectionInfo * sockptr)
#define ZEXPORT __stdcall #define ZEXPORT __stdcall
#endif #endif
#include "zlib.h" #include <zlib.h>
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen) int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen)

View File

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

View File

@ -23,9 +23,13 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress); #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);
void MQTTMessageEvent(void* message);
int MaxRXSize = 99999; int MaxRXSize = 99999;
int MaxTXSize = 99999; int MaxTXSize = 99999;
@ -807,6 +811,11 @@ VOID FlagSentMessages(CIRCUIT * conn, struct UserInfo * user)
FBBHeader->FwdMsg->datechanged=time(NULL); FBBHeader->FwdMsg->datechanged=time(NULL);
} }
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(FBBHeader->FwdMsg);
#endif
FBBHeader->FwdMsg->Locked = 0; // Unlock FBBHeader->FwdMsg->Locked = 0; // Unlock
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
} }

View File

@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
@ -65,12 +65,12 @@ extern int (WINAPI FAR *GetModuleFileNameExPtr)();
; ;
int SemHeldByAPI; int SemHeldByAPI;
static void ConnecttoFLDigiThread(void * portptr); void ConnecttoFLDigiThread(void * portptr);
void CreateMHWindow(); void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
static int ConnecttoFLDigi(); int ConnecttoFLDigi(int port);
static int ProcessReceivedData(int bpqport); static int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port); static int ProcessLine(char * buf, int Port);
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
@ -93,6 +93,7 @@ VOID CheckFLDigiData(struct TNCINFO * TNC);
VOID SendPacket(struct TNCINFO * TNC, UCHAR * Msg, int MsgLen); VOID SendPacket(struct TNCINFO * TNC, UCHAR * Msg, int MsgLen);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char ParamType); VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char ParamType);
VOID SendXMLCommandInt(struct TNCINFO * TNC, char * Command, int Value, char ParamType);
VOID FLSlowTimer(struct TNCINFO * TNC); VOID FLSlowTimer(struct TNCINFO * TNC);
VOID SendKISSCommand(struct TNCINFO * TNC, char * Msg); VOID SendKISSCommand(struct TNCINFO * TNC, char * Msg);
@ -101,8 +102,6 @@ VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC); VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
char * strlop(char * buf, char delim);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
#define MAXMPSKPORTS 16 #define MAXMPSKPORTS 16
@ -539,7 +538,11 @@ pollloop:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -592,7 +595,7 @@ pollloop:
} }
else else
{ {
SendXMLCommand(TNC, "modem.set_carrier", (char *)atoi(&buff->L2DATA[5]), 'I'); SendXMLCommandInt(TNC, "modem.set_carrier", atoi(&buff->L2DATA[5]), 'I');
} }
TNC->InternalCmd = TRUE; TNC->InternalCmd = TRUE;
@ -1181,7 +1184,6 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
@ -1212,7 +1214,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_FLDIGI; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1482,14 +1484,14 @@ static int ProcessLine(char * buf, int Port)
return (TRUE); return (TRUE);
} }
static int ConnecttoFLDigi(int port) int ConnecttoFLDigi(int port)
{ {
_beginthread(ConnecttoFLDigiThread, 0, (void *)(size_t)port); _beginthread(ConnecttoFLDigiThread, 0, (void *)(size_t)port);
return 0; return 0;
} }
static VOID ConnecttoFLDigiThread(void * portptr) VOID ConnecttoFLDigiThread(void * portptr)
{ {
int port = (int)(size_t)portptr; int port = (int)(size_t)portptr;
char Msg[255]; char Msg[255];
@ -2580,7 +2582,7 @@ VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, char Channe
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available
@ -3197,7 +3199,7 @@ VOID FLReleaseTNC(struct TNCINFO * TNC)
else else
{ {
SendXMLCommand(TNC, "modem.set_by_name", TNC->FLInfo->DefaultMode, 'S'); SendXMLCommand(TNC, "modem.set_by_name", TNC->FLInfo->DefaultMode, 'S');
SendXMLCommand(TNC, "modem.set_carrier", (char *)TNC->FLInfo->DefaultFreq, 'I'); SendXMLCommandInt(TNC, "modem.set_carrier", TNC->FLInfo->DefaultFreq, 'I');
} }
} }
// Start Scanner // Start Scanner
@ -3895,6 +3897,27 @@ VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char Par
return; return;
} }
VOID SendXMLCommandInt(struct TNCINFO * TNC, char * Command, int Value, char ParamType)
{
int Len;
char ReqBuf[512];
char SendBuff[512];
struct FLINFO * FL = TNC->FLInfo;
struct ARQINFO * ARQ = TNC->ARQInfo;
char ValueString[256] ="";
if (!TNC->CONNECTED || TNC->FLInfo->KISSMODE)
return;
sprintf(ValueString, "<params><param><value><i4>%d</i4></value></param></params\r\n>", Value);
strcpy(FL->LastXML, Command);
Len = sprintf(ReqBuf, Req, FL->LastXML, ValueString);
Len = sprintf(SendBuff, MsgHddr, Len, ReqBuf);
send(TNC->TCPSock, SendBuff, Len, 0);
return;
}
VOID SendXMLPoll(struct TNCINFO * TNC) VOID SendXMLPoll(struct TNCINFO * TNC)
{ {
int Len; int Len;

3860
FLDigi64.c

File diff suppressed because it is too large Load Diff

View File

@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "tncinfo.h" #include "tncinfo.h"
@ -347,41 +347,6 @@ loop:
return 1; return 1;
} }
BOOL FreeDataReadConfigFile(int Port, int ProcLine())
{
char buf[256],errbuf[256];
Config = PortConfig[Port];
if (Config)
{
// Using config from bpq32.cfg
if (strlen(Config) == 0)
{
return TRUE;
}
ptr1 = Config;
ptr2 = strchr(ptr1, 13);
if (!ProcLine(buf, Port))
{
WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf);
}
}
else
{
sprintf(buf," ** Error - No Configuration info in bpq32.cfg");
WritetoConsoleLocal(buf);
}
return (TRUE);
}
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC); VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC); VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
@ -775,7 +740,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -867,7 +835,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
char Message[256]; char Message[256];
int Len, ret; int Len, ret;
Len = sprintf(Message, TXF); Len = sprintf(Message, "%s", TXF);
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0); ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
if (buffptr) if (buffptr)
@ -1428,14 +1396,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_FREEDATA; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FREEDATA;
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->ARDOPDataBuffer = malloc(MAXRXSIZE); TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
TNC->ARDOPBuffer = malloc(FREEDATABUFLEN); TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -1881,7 +1849,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
if (App < 32) if (App < 32)
{ {
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// if SendTandRtoRelay set and Appl is RMS change to RELAY // if SendTandRtoRelay set and Appl is RMS change to RELAY
@ -2242,7 +2210,7 @@ VOID FreeDataProcessNewConnect(struct TNCINFO * TNC, char * fromCall, char * toC
if (App < 32) if (App < 32)
{ {
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// if SendTandRtoRelay set and Appl is RMS change to RELAY // if SendTandRtoRelay set and Appl is RMS change to RELAY
@ -2476,7 +2444,7 @@ static void SendCQ(struct TNCINFO * TNC)
char Message[256]; char Message[256];
int Len, ret; int Len, ret;
Len = sprintf(Message, CQ); Len = sprintf(Message, "%s", CQ);
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0); ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
} }
@ -2491,7 +2459,7 @@ static void SendBeacon(struct TNCINFO * TNC, int Interval)
if (Interval > 0) if (Interval > 0)
Len = sprintf(Message, Template1, Interval); Len = sprintf(Message, Template1, Interval);
else else
Len = sprintf(Message, Template2); Len = sprintf(Message, "%s", Template2);
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0); ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
} }
@ -3682,7 +3650,7 @@ int FreeDataDisconnect(struct TNCINFO * TNC)
// return FreeDataSendCommand(TNC, "D"); // return FreeDataSendCommand(TNC, "D");
Len = sprintf(Msg, Disconnect); Len = sprintf(Msg, "%s", Disconnect);
return send(TNC->TCPDataSock, Msg, Len, 0); return send(TNC->TCPDataSock, Msg, Len, 0);
} }
@ -3694,7 +3662,7 @@ int FreeGetData(struct TNCINFO * TNC)
char Msg[128]; char Msg[128];
int Len; int Len;
Len = sprintf(Msg, GetData); Len = sprintf(Msg, "%s", GetData);
return send(TNC->TCPDataSock, Msg, Len, 0); return send(TNC->TCPDataSock, Msg, Len, 0);
} }
@ -4174,7 +4142,7 @@ void buildParamString(struct TNCINFO * TNC, char * line)
FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel); FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
if (FDI->hamlibHost) if (FDI->hamlibHost)
sprintf(line, "%s --rigctld_ip %s --rigctld_port %d", line, FDI->hamlibHost, FDI->hamlibPort); sprintf(&line[strlen(line)], " --rigctld_ip %s --rigctld_port %d", FDI->hamlibHost, FDI->hamlibPort);
if (FDI->LimitBandWidth) if (FDI->LimitBandWidth)
strcat(line, " --500hz"); strcat(line, " --500hz");

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -471,7 +471,7 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
int port; int port;
char * ptr; char * ptr;
int len; int len;
char Msg[80]; char Msg[512];
#ifndef LINBPQ #ifndef LINBPQ
HWND x; HWND x;
#endif #endif
@ -499,15 +499,15 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_HAL; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HAL;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
PortEntry->MAXHOSTMODESESSIONS = 1; // Default PortEntry->MAXHOSTMODESESSIONS = 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {
@ -548,7 +548,7 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
TNC->WebWinX = 510; TNC->WebWinX = 510;
TNC->WebWinY = 280; TNC->WebWinY = 280;
TNC->WEB_COMMSSTATE = zalloc(100); TNC->WEB_COMMSSTATE = zalloc(512);
TNC->WEB_TNCSTATE = zalloc(100); TNC->WEB_TNCSTATE = zalloc(100);
strcpy(TNC->WEB_TNCSTATE, "Free"); strcpy(TNC->WEB_TNCSTATE, "Free");
TNC->WEB_MODE = zalloc(100); TNC->WEB_MODE = zalloc(100);

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#pragma pack(1) #pragma pack(1)
@ -309,47 +309,10 @@ loop:
return 1; return 1;
} }
BOOL HSMODEMReadConfigFile(int Port, int ProcLine())
{
char buf[256],errbuf[256];
Config = PortConfig[Port];
if (Config)
{
// Using config from bpq32.cfg
if (strlen(Config) == 0)
{
return TRUE;
}
ptr1 = Config;
ptr2 = strchr(ptr1, 13);
if (!ProcLine(buf, Port))
{
WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf);
}
}
else
{
sprintf(buf," ** Error - No Configuration info in bpq32.cfg");
WritetoConsoleLocal(buf);
}
return (TRUE);
}
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC); VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC); VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
static time_t ltime; static time_t ltime;
@ -685,7 +648,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1214,10 +1181,10 @@ VOID * HSMODEMExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_HSMODEM;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HSMODEM;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

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

View File

@ -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"
@ -38,7 +38,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define ZEXPORT __stdcall #define ZEXPORT __stdcall
#endif #endif
#include "zlib.h" #include <zlib.h>
#define CKernel #define CKernel
#include "httpconnectioninfo.h" #include "httpconnectioninfo.h"
@ -70,6 +70,9 @@ char * GetStandardPage(char * FN, int * Len);
BOOL SHA1PasswordHash(char * String, char * Hash); BOOL SHA1PasswordHash(char * String, char * Hash);
char * byte_base64_encode(char *str, int len); char * byte_base64_encode(char *str, int len);
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
extern struct ROUTE * NEIGHBOURS; extern struct ROUTE * NEIGHBOURS;
extern int ROUTE_LEN; extern int ROUTE_LEN;
@ -102,7 +105,6 @@ extern int NumberofPorts;
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
char * strlop(char * buf, char delim);
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len); VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
int CompareNode(const void *a, const void *b); int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b); int CompareAlias(const void *a, const void *b);
@ -143,7 +145,7 @@ char Tail[] = "</body></html>";
char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>" char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>"
"<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>"; "<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>";
char RouteLine[] = "<tr><td>%s%d</td><td>%s%c</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>"; char RouteLine[] = "<tr><td>%s%d</td><td>%s%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>";
char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>" char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>"
"<table align=center bgcolor=white>" "<table align=center bgcolor=white>"
"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>" "<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
@ -1853,6 +1855,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)
@ -2375,7 +2414,10 @@ doHeader:
if (Session == 0) if (Session == 0)
Session = &Dummy; Session = &Dummy;
Session->TNC = LOCAL; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag if (LOCAL)
Session->TNC = (struct TNCINFO *)(uintptr_t)1; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
else
Session->TNC = 0;
WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL); WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL); WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
@ -3759,7 +3801,7 @@ doHeader:
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int count; int count;
char Normcall[10]; char Normcall[10];
char locked; char locked[4] = " ";
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
int Iframes, Retries; int Iframes, Retries;
@ -3775,10 +3817,14 @@ doHeader:
int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall); int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
Normcall[len]=0; Normcall[len]=0;
if ((Routes->NEIGHBOUR_FLAG & 1) == 1) if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
locked = '!'; strcpy(locked, "!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
locked = ' '; strcpy(locked, " ");
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
@ -4285,7 +4331,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
{ {
int ReplyLen = 0; int ReplyLen = 0;
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
char * user, * password, * Key; char * user, * password;
struct HTTPConnectionInfo * NewSession; struct HTTPConnectionInfo * NewSession;
int i; int i;
struct UserRec * USER; struct UserRec * USER;
@ -4334,7 +4380,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
if (user && user[0] && password && password[0]) if (user && user[0] && password && password[0])
{ {
sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password); sprintf(&MsgPtr[strlen(MsgPtr)], "?%s&%s", user, password);
} }
} }
@ -5136,6 +5182,3 @@ void SHA1PadMessage(SHA1Context *context)
} }

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#ifdef LINBPQ #ifdef LINBPQ
#include "CHeaders.h" #include "cheaders.h"
#endif #endif
#include "bpqchat.h" #include "bpqchat.h"
@ -1186,7 +1186,7 @@ static BOOL CheckforDups(ChatCIRCUIT * circuit, char * Call, char * Msg)
// Duplicate, so discard, but save time // Duplicate, so discard, but save time
DupInfo[i].DupTime = Now; DupInfo[i].DupTime = Now;
Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg); Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate return TRUE; // Duplicate
} }
@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
__try __try
{ {
#endif #endif
len = sprintf(line, "%s %p %s", line, cn->node, cn->node->alias); len += sprintf(&line[len], " %p %s", cn->node, cn->node->alias);
if (len > 80) if (len > 80)
{ {
Debugprintf("%s", line); Debugprintf("%s", line);
@ -2821,7 +2821,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
CHATNODE *node; CHATNODE *node;
LINK *link; LINK *link;
char line[1000]; char line[1000];
int len; int len = 0;
CN *cn; CN *cn;
int i = 0; int i = 0;
@ -2836,16 +2836,16 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
nprintf(conn, "%d Node(s)\r", i); nprintf(conn, "%d Node(s)\r", i);
if (Flag == 'c') if (Flag == 'c')
sprintf(line, "Here %-6.6s <-", OurNode); len = sprintf(line, "Here %-6.6s <-", OurNode);
else else
sprintf(line, "Here %-6.6s <-", OurAlias); len = sprintf(line, "Here %-6.6s <-", OurAlias);
for (node = node_hd; node; node = node->next) if (node->refcnt) for (node = node_hd; node; node = node->next) if (node->refcnt)
{ {
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "%s %s", line, node->call); len += sprintf(&line[len], " %s", node->call);
else else
len = sprintf(line, "%s %s", line, node->alias); len += sprintf(&line[len], " %s", node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2873,9 +2873,9 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
__try __try
{ {
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "%s %s", line, cn->node->call); len += sprintf(&line[len], " %s", cn->node->call);
else else
len = sprintf(line, "%s %s", line, cn->node->alias); len += sprintf(&line[len], " %s", cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2883,23 +2883,23 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len = sprintf(line, "%s *PE* Corrupt Rec %x %x", line, cn, cn->node);} {len += sprintf(&line[len], " *PE* Corrupt Rec %x %x", cn, cn->node);}
} }
else else
len = sprintf(line, "%s Corrupt Rec %x %x ", line, cn, cn->node); len = sprintf(&line[len], " Corrupt Rec %x %x ", cn, cn->node);
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len = sprintf(line, "%s *PE* Corrupt Rec %x %x ", line, cn, cn->node);} {len += sprintf(&line[len], " *PE* Corrupt Rec %x %x ", cn, cn->node);}
#else #else
for (cn = circuit->hnode; cn; cn = cn->next) for (cn = circuit->hnode; cn; cn = cn->next)
{ {
if (cn->node && cn->node->alias) if (cn->node && cn->node->alias)
{ {
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "%s %s", line, cn->node->call); len += sprintf(&line[len], " %s", cn->node->call);
else else
len = sprintf(line, "%s %s", line, cn->node->alias); len += sprintf(&line[len], " %s", cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2907,7 +2907,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
else else
len = sprintf(line, "%s Corrupt Rec %p %p ", line, cn, cn->node); len += sprintf(&line[len], " Corrupt Rec %p %p ", cn, cn->node);
} }
#endif #endif
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -3682,7 +3682,7 @@ VOID SendChatLinkStatus()
} }
} }
len = sprintf(Msg, "%s%s %c ", Msg, link->call, '0' + link->flags); len += sprintf(&Msg[len], "%s %c ", link->call, '0' + link->flags);
if (len > 240) if (len > 240)
break; break;
@ -4178,10 +4178,10 @@ BOOL GetChatConfig(char * ConfigName)
MaxChatStreams = GetIntValue(group, "MaxStreams"); MaxChatStreams = GetIntValue(group, "MaxStreams");
reportChatEvents = GetIntValue(group, "reportChatEvents"); reportChatEvents = GetIntValue(group, "reportChatEvents");
chatPaclen = GetIntValue(group, "chatPaclen"); chatPaclen = GetIntValue(group, "chatPaclen");
GetStringValue(group, "OtherChatNodes", OtherNodesList); GetStringValue(group, "OtherChatNodes", OtherNodesList, 1000);
GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg); GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg, 1000);
GetStringValue(group, "MapPosition", Position); GetStringValue(group, "MapPosition", Position, 81);
GetStringValue(group, "MapPopup", PopupText); GetStringValue(group, "MapPopup", PopupText, 260);
PopupMode = GetIntValue(group, "PopupMode"); PopupMode = GetIntValue(group, "PopupMode");
if (chatPaclen == 0) if (chatPaclen == 0)

View File

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

View File

@ -81,7 +81,7 @@ TODo ?Multiple Adapters
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "ipcode.h" #include "ipcode.h"
@ -95,9 +95,13 @@ TODo ?Multiple Adapters
#pragma comment(lib, "IPHLPAPI.lib") #pragma comment(lib, "IPHLPAPI.lib")
#endif #endif
#include "pcap.h" #include <pcap.h>
#ifdef WIN32
int pcap_sendpacket(pcap_t *p, u_char *buf, int size); int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
#else
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#endif
#ifndef LINBPQ #ifndef LINBPQ
#include "kernelresource.h" #include "kernelresource.h"
@ -4731,7 +4735,7 @@ void OpenTAP()
extern struct DATAMESSAGE * REPLYBUFFER; extern struct DATAMESSAGE * REPLYBUFFER;
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...); char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// Send ICMP Echo Request // Send ICMP Echo Request
@ -4789,7 +4793,7 @@ VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD
return; return;
} }
VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY IP Gateway ARP status or Clear // DISPLAY IP Gateway ARP status or Clear
@ -4884,7 +4888,7 @@ VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY IP Gateway ARP status or Clear // DISPLAY IP Gateway ARP status or Clear
@ -4943,7 +4947,7 @@ int CountBits(uint32_t in)
return n; return n;
} }
VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY IP Gateway ARP status or Clear // DISPLAY IP Gateway ARP status or Clear
@ -5334,7 +5338,7 @@ int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr)
// Should be nothing left // Should be nothing left
} }
if (RequestType = 160) if (RequestType == 160)
{ {
int Offset = 255; int Offset = 255;
int PDULen = 0; int PDULen = 0;
@ -5409,11 +5413,8 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
int Len; int Len;
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data; PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
UCHAR * Msg; UCHAR * Msg;
int Type;
int Length, ComLen;
int IntVal;
UCHAR Reply[256]; UCHAR Reply[256];
int PDULen, SendLen; int SendLen;
int Offset = 0; int Offset = 0;
Len = ntohs(IPptr->IPLENGTH); Len = ntohs(IPptr->IPLENGTH);

View File

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

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -350,6 +350,7 @@ ok:
// See if any frames for this port // See if any frames for this port
STREAM = &TNC->Streams[0]; STREAM = &TNC->Streams[0];
if (STREAM->BPQtoPACTOR_Q) if (STREAM->BPQtoPACTOR_Q)
@ -457,7 +458,11 @@ ok:
if (_memicmp(txbuff, "RADIO ", 6) == 0) if (_memicmp(txbuff, "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &txbuff[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -725,7 +730,7 @@ VOID KISSHFReleaseTNC(struct TNCINFO * TNC)
ReleaseOtherPorts(TNC); ReleaseOtherPorts(TNC);
} }
VOID KISSHFSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC) VOID KISSHFSuspendPort(struct TNCINFO * TNC, struct TNCINFO * THISTNC)
{ {
TNC->PortRecord->PORTCONTROL.PortSuspended = 1; TNC->PortRecord->PORTCONTROL.PortSuspended = 1;
strcpy(TNC->WEB_TNCSTATE, "Interlocked"); strcpy(TNC->WEB_TNCSTATE, "Interlocked");
@ -808,10 +813,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_KISSHF; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KISSHF;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "time.h" #include "time.h"
#include "stdio.h" #include "stdio.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
@ -47,8 +47,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define THREESECS 3*3 #define THREESECS 3*3
VOID L2SENDCOMMAND(); VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer);
VOID L2ROUTINE();
MESSAGE * SETUPL2MESSAGE(struct _LINKTABLE * LINK, UCHAR CMD); MESSAGE * SETUPL2MESSAGE(struct _LINKTABLE * LINK, UCHAR CMD);
VOID SendSupervisCmd(struct _LINKTABLE * LINK); VOID SendSupervisCmd(struct _LINKTABLE * LINK);
void SEND_RR_RESP(struct _LINKTABLE * LINK, UCHAR PF); void SEND_RR_RESP(struct _LINKTABLE * LINK, UCHAR PF);
@ -131,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;
@ -143,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
@ -154,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
@ -167,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
@ -239,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;
@ -467,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);
} }
@ -733,7 +759,7 @@ VOID L2FORUS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buff
NO_CTEXT = 1; NO_CTEXT = 1;
if (ROUTE->NEIGHBOUR_FLAG == 1 && ROUTE->NEIGHBOUR_QUAL == 0) // Locked, qual 0 if (ROUTE->NEIGHBOUR_FLAG && ROUTE->NEIGHBOUR_QUAL == 0) // Locked, qual 0
{ {
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
return; return;
@ -936,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);
@ -1063,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
@ -1148,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
@ -1165,6 +1191,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');
L2SENDUA(PORT, Buffer, ADJBUFFER); L2SENDUA(PORT, Buffer, ADJBUFFER);
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF) if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
@ -1281,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;
@ -1354,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
@ -1381,6 +1411,7 @@ 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)
{ {
@ -1849,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;
@ -3098,7 +3135,7 @@ VOID ACKMSG(struct _LINKTABLE * LINK)
} }
} }
VOID CONNECTFAILED(); VOID CONNECTFAILED(struct _LINKTABLE * LINK);
VOID L2TIMEOUT(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT) VOID L2TIMEOUT(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT)
{ {
@ -3599,7 +3636,7 @@ VOID CONNECTREFUSED(struct _LINKTABLE * LINK)
ConnectFailedOrRefused(LINK, "Busy from"); ConnectFailedOrRefused(LINK, "Busy from");
} }
VOID L3CONNECTFAILED(); VOID L3CONNECTFAILED(struct _LINKTABLE * LINK);
VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg) VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg)
{ {
@ -4135,7 +4172,7 @@ int seeifUnlockneeded(struct _LINKTABLE * LINK)
if (TNC) if (TNC)
if (Interlock == TNC->RXRadio || Interlock == TNC->TXRadio) // Same Group if (Interlock == TNC->RXRadio || Interlock == TNC->TXRadio) // Same Group
if (TNC->ReleasePortProc && TNC->PortRecord->PORTCONTROL.PortSuspended == TRUE) if (TNC->ReleasePortProc && TNC->PortRecord->PORTCONTROL.PortSuspended == TRUE)
TNC->ReleasePortProc(TNC, TNC); TNC->ReleasePortProc(TNC);
} }
return 0; return 0;

View File

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

File diff suppressed because it is too large Load Diff

510
L4Code.c
View File

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

View File

@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#ifdef WIN32 #ifdef WIN32
#include <Iphlpapi.h> #include <Iphlpapi.h>
@ -45,7 +45,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
BOOL APIENTRY Rig_Init(); BOOL APIENTRY Rig_Init();
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID CopyConfigFile(char * ConfigName); VOID CopyConfigFile(char * ConfigName);
VOID SendMailForThread(VOID * Param); VOID SendMailForThread(VOID * Param);
@ -75,6 +79,8 @@ int upnpClose();
void SaveAIS(); void SaveAIS();
void initAIS(); void initAIS();
void DRATSPoll(); void DRATSPoll();
void RHPPoll();
VOID GetPGConfig(); VOID GetPGConfig();
void SendBBSDataToPktMap(); void SendBBSDataToPktMap();
@ -371,8 +377,45 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#else #else
#include <execinfo.h>
#include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig)
{
void *array[10];
size_t size;
char msg[] = "SIGSEGV Received\n";
write(STDERR_FILENO, msg, strlen(msg));
// 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);
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)
{ {
syslog(LOG_INFO, "terminating on SIGTERM\n"); syslog(LOG_INFO, "terminating on SIGTERM\n");
@ -461,8 +504,9 @@ 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;
} }
@ -554,6 +598,8 @@ extern int POP3Timer;
#ifndef WIN32 #ifndef WIN32
#define _getch getchar #define _getch getchar
/** /**
@ -667,7 +713,7 @@ void ConTermPoll()
// Replace CR with CRLF // Replace CR with CRLF
printf(ptr); printf("%s", ptr);
if (ptr2) if (ptr2)
printf("\r\n"); printf("\r\n");
@ -717,7 +763,7 @@ void ConTermPoll()
} }
#include "getopt.h" #include <getopt.h>
static struct option long_options[] = static struct option long_options[] =
{ {
@ -738,6 +784,10 @@ char HelpScreen[] =
int Redirected = 0; int Redirected = 0;
static void segvhandler(int sig);
static void abrthandler(int sig);
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
int i; int i;
@ -767,6 +817,10 @@ int main(int argc, char * argv[])
} }
#else #else
signal(SIGSEGV, segvhandler);
signal(SIGABRT, abrthandler);
setlinebuf(stdout); setlinebuf(stdout);
struct sigaction act; struct sigaction act;
openlog("LINBPQ", LOG_PID, LOG_DAEMON); openlog("LINBPQ", LOG_PID, LOG_DAEMON);
@ -816,7 +870,7 @@ int main(int argc, char * argv[])
{ {
case 'h': case 'h':
printf(HelpScreen); printf("%s", HelpScreen);
exit (0); exit (0);
case 'l': case 'l':
@ -1533,6 +1587,7 @@ int main(int argc, char * argv[])
Poll_AGW(); Poll_AGW();
DRATSPoll(); DRATSPoll();
RHPPoll();
HTTPTimer(); HTTPTimer();

View File

@ -24,6 +24,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
void SendMessageReadEvent(char * call, struct MsgInfo * Msg); void SendMessageReadEvent(char * call, struct MsgInfo * Msg);
void MQTTMessageEvent(void* message);
VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len) VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len)
@ -199,6 +200,12 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
} }
conn->FwdMsg->Locked = 0; // Unlock conn->FwdMsg->Locked = 0; // Unlock
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
} }
return; return;
@ -282,7 +289,7 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
{ {
// Reverse forward request // Reverse forward request
// If we have just sent a nessage, Flag it as sent // If we have just sent a message, Flag it as sent
if (conn->FBBMsgsSent) if (conn->FBBMsgsSent)
{ {
@ -300,6 +307,11 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
conn->FwdMsg->Locked = 0; // Unlock conn->FwdMsg->Locked = 0; // Unlock
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
} }
@ -354,6 +366,11 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
conn->FwdMsg->datechanged=time(NULL); conn->FwdMsg->datechanged=time(NULL);
} }
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
} }

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
@ -60,7 +60,7 @@ static void ConnecttoMPSKThread(void * portptr);
void CreateMHWindow(); void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
static int ConnecttoMPSK(); static int ConnecttoMPSK(int port);
static int ProcessReceivedData(int bpqport); static int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port); static int ProcessLine(char * buf, int Port);
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
@ -71,8 +71,6 @@ static VOID SendData(struct TNCINFO * TNC, char * Msg, int MsgLen);
static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg); static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg);
VOID SendRPBeacon(struct TNCINFO * TNC); VOID SendRPBeacon(struct TNCINFO * TNC);
char * strlop(char * buf, char delim);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
#define MAXMPSKPORTS 16 #define MAXMPSKPORTS 16
@ -409,7 +407,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -712,7 +713,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_MPSK; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK;
MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
@ -1541,7 +1542,7 @@ VOID CloseComplete(struct TNCINFO * TNC, int Stream)
sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode); sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
if (TNC->MPSKInfo->Beacon) if (TNC->MPSKInfo->Beacon)
sprintf(Cmd, "%s%cBEACON_ARQ_FAE\x1b", Cmd, '\x1a'); sprintf(&Cmd[strlen(Cmd)], "%cBEACON_ARQ_FAE\x1b", '\x1a');
Len = strlen(Cmd); Len = strlen(Cmd);

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -141,7 +141,7 @@ struct Country Countries[] =
"HKG", "ASIA", "AS", // Hong Kong Special Administrative Region of China "HKG", "ASIA", "AS", // Hong Kong Special Administrative Region of China
"MAC", "ASIA", "AS", // Macao Special Administrative Region of China "MAC", "ASIA", "AS", // Macao Special Administrative Region of China
"COL", "ASIA", "SA", // Colombia "COL", "ASIA", "SA", // Colombia
"COM", "SAFR", "AF", // Comoros // "COM", "SAFR", "AF", // Comoros
"COG", "CAFR", "AF", // Congo "COG", "CAFR", "AF", // Congo
"COK", "SPAC", "OC", // Cook Islands "COK", "SPAC", "OC", // Cook Islands
"CRI", "CEAM", "NA", // Costa Rica "CRI", "CEAM", "NA", // Costa Rica

View File

@ -1570,12 +1570,12 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
continue; continue;
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, &Addr[4]); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", &Addr[4]);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;
} }
ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, &Addr[4], Via); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", &Addr[4], Via);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;
} }
@ -1591,7 +1591,7 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
continue; continue;
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;

View File

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

View File

@ -612,15 +612,15 @@ struct MSESSION * FindMSession(unsigned int Key)
#define LZMA_STR "\1LZMA" #define LZMA_STR "\1LZMA"
UCHAR * LZUncompress(UCHAR * Decoded, int Len, int * NewLen) UCHAR * LZUncompress(UCHAR * Decoded, size_t Len, size_t * NewLen)
{ {
unsigned char * buf; unsigned char * buf;
unsigned char inprops[LZMA_PROPS_SIZE]; unsigned char inprops[LZMA_PROPS_SIZE];
size_t inlen; size_t inlen;
int r; int r;
UINT rlen; size_t rlen = 0;
UINT outlen; size_t outlen;
memcpy(&rlen, &Decoded[5], 4); memcpy(&rlen, &Decoded[5], 4);
@ -668,8 +668,8 @@ void SaveMulticastMessage(struct MSESSION * MSession)
{ {
UCHAR * Decoded = NULL; // Output from Basexxx decode UCHAR * Decoded = NULL; // Output from Basexxx decode
UCHAR * Uncompressed = NULL; UCHAR * Uncompressed = NULL;
int DecodedLen; // Length of decoded message size_t DecodedLen; // Length of decoded message
int UncompressedLen; // Length of decompressed message size_t UncompressedLen; // Length of decompressed message
int ExpectedLen; // From front of Base128 or Base256 message int ExpectedLen; // From front of Base128 or Base256 message
int HddrLen; // Length of Expected Len Header int HddrLen; // Length of Expected Len Header
@ -1612,7 +1612,7 @@ int MulticastStatusHTML(char * Reply)
if (Sess ==NULL) if (Sess ==NULL)
return 0; return 0;
Len = sprintf(Reply, StatusPage); Len = sprintf(Reply, "%s", StatusPage);
while (Sess) while (Sess)
{ {
@ -1670,7 +1670,7 @@ int MulticastStatusHTML(char * Reply)
Sess = Sess->Next; Sess = Sess->Next;
} }
Len += sprintf(&Reply[Len], StatusTail); Len += sprintf(&Reply[Len], "%s", StatusTail);
return Len; return Len;
} }

View File

@ -25,6 +25,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
VOID ReleaseSock(SOCKET sock); VOID ReleaseSock(SOCKET sock);
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;
@ -352,6 +356,12 @@ int CreateNNTPMessage(char * From, char * To, char * MsgTitle, time_t Date, char
BuildNNTPList(Msg); // Build NNTP Groups list BuildNNTPList(Msg); // Build NNTP Groups list
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
return CreateSMTPMessageFile(MsgBody, Msg); return CreateSMTPMessageFile(MsgBody, Msg);
} }

View File

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

756
RHP.c Normal file
View File

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

View File

@ -48,7 +48,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdlib.h> #include <stdlib.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#ifdef WIN32 #ifdef WIN32
#include <commctrl.h> #include <commctrl.h>
@ -324,7 +324,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
// Convert to CAT string // Convert to CAT string
sprintf(FreqString, "%012d", txfreq); sprintf(FreqString, "%012lld", txfreq);
switch (PORT->PortType) switch (PORT->PortType)
{ {
@ -455,7 +455,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
// Convert to CAT string // Convert to CAT string
sprintf(FreqString, "%012d", txfreq); sprintf(FreqString, "%012lld", txfreq);
switch (PORT->PortType) switch (PORT->PortType)
{ {
@ -896,7 +896,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
// if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port // if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port
if (Command[0] == 'R') if (Command[0] == 'R')
n = sscanf(Command,"%s %s %s %s %s", &Dummy, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]); n = sscanf(Command,"%s %s %s %s %s", &Dummy[0], &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
else else
n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]); n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
@ -1117,7 +1117,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
if (_stricmp(FreqString, "POWER") == 0) if (_stricmp(FreqString, "POWER") == 0)
{ {
char PowerString[8] = ""; char PowerString[16] = "";
int Power = atoi(Mode); int Power = atoi(Mode);
int len; int len;
char cmd[80]; char cmd[80];
@ -1291,7 +1291,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
// use text command // use text command
Len = sprintf(CmdPtr, 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));
@ -3205,7 +3205,7 @@ VOID ReleasePermission(struct RIGINFO *RIG)
while (RIG->PortRecord[i]) while (RIG->PortRecord[i])
{ {
PortRecord = RIG->PortRecord[i]; PortRecord = RIG->PortRecord[i];
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 3); // Release Perrmission PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)3); // Release Perrmission
i++; i++;
} }
} }
@ -3235,7 +3235,7 @@ int GetPermissionToChange(struct RIGPORTINFO * PORT, struct RIGINFO *RIG)
// TNC has been asked for permission, and we are waiting respoonse // TNC has been asked for permission, and we are waiting respoonse
// Only SCS pactor returns WaitingForPrmission, so check shouldn't be called on others // Only SCS pactor returns WaitingForPrmission, so check shouldn't be called on others
RIG->OKtoChange = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, 2); // Get Ok Flag RIG->OKtoChange = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)2); // Get Ok Flag
if (RIG->OKtoChange == 1) if (RIG->OKtoChange == 1)
{ {
@ -3277,7 +3277,7 @@ int GetPermissionToChange(struct RIGPORTINFO * PORT, struct RIGINFO *RIG)
// not waiting for permission, so must be first call of a cycle // not waiting for permission, so must be first call of a cycle
if (RIG->PortRecord[0] && RIG->PortRecord[0]->PORT_EXT_ADDR) if (RIG->PortRecord[0] && RIG->PortRecord[0]->PORT_EXT_ADDR)
RIG->WaitingForPermission = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, 1); // Request Perrmission RIG->WaitingForPermission = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)1); // Request Perrmission
// If it returns zero there is no need to wait. // If it returns zero there is no need to wait.
// Normally SCS Returns True for first call, but returns 0 if Link not running // Normally SCS Returns True for first call, but returns 0 if Link not running
@ -3300,7 +3300,7 @@ CheckOtherPorts:
{ {
PortRecord = RIG->PortRecord[i]; PortRecord = RIG->PortRecord[i];
if (PortRecord->PORT_EXT_ADDR && PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 1)) if (PortRecord->PORT_EXT_ADDR && PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)1))
{ {
// 1 means can't change - release all // 1 means can't change - release all
@ -3392,7 +3392,7 @@ VOID DoBandwidthandAntenna(struct RIGINFO *RIG, struct ScanEntry * ptr)
RIG->CurrentBandWidth = ptr->Bandwidth; RIG->CurrentBandWidth = ptr->Bandwidth;
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, ptr); PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)ptr);
/* if (ptr->Bandwidth == 'R') // Robust Packet /* if (ptr->Bandwidth == 'R') // Robust Packet
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 6); // Set Robust Packet PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 6); // Set Robust Packet
@ -5286,10 +5286,13 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
ptr = strtok_s(NULL, ",", &Context); ptr = strtok_s(NULL, ",", &Context);
if (ptr == NULL || strlen(ptr) > 8) if (ptr == NULL)
return FALSE; if (*MemoryNumber) // If channel, dont need mode
return TRUE;
if (ptr == NULL || strlen(ptr) > 8)
return FALSE; // Mode Missing
// If channel, dont need mode
if (*MemoryNumber == 0) if (*MemoryNumber == 0)
{ {
@ -7252,7 +7255,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)
@ -7393,6 +7396,8 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
int Interlock = RIG->Interlock; int Interlock = RIG->Interlock;
char PortString[128] = ""; char PortString[128] = "";
char TxPortString[128] = ""; char TxPortString[128] = "";
int n = 0;
int nn = 0;
// Find TNC ports in this Rig's scan group // Find TNC ports in this Rig's scan group
@ -7409,7 +7414,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
sprintf(PortString, "%s,%d", PortString, p); n += sprintf(&PortString[n], ",%d", p);
TNC->RIG = RIG; TNC->RIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7419,7 +7424,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
sprintf(TxPortString, "%s,%d", TxPortString, p); nn += sprintf(&TxPortString[nn], ",%d", p);
TNC->TXRIG = RIG; TNC->TXRIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -8139,7 +8144,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;
@ -8385,7 +8390,7 @@ int ProcessHAMLIBSlaveMessage(SOCKET Sock, struct RIGINFO * RIG, unsigned char *
switch (Msg[0]) switch (Msg[0])
{ {
case 'f': // Get Freqency case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep); HLGetFreq(Sock, RIG, sep);
return 0; return 0;
@ -9938,14 +9943,10 @@ void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT)
int Length; int Length;
char * msg; char * msg;
char * rest;
struct RIGINFO * RIG; struct RIGINFO * RIG;
char * ptr, * ptr1, * ptr2, * ptr3, * pos; char * ptr, * ptr1, * ptr2, * ptr3, * pos;
int Len, TotalLen;
char cmd[80]; char cmd[80];
char ReqBuf[256];
char SendBuff[256];
int chunklength; int chunklength;
int headerlen; int headerlen;
int i, n = 0; int i, n = 0;
@ -10168,7 +10169,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;
@ -10332,7 +10333,6 @@ VOID SDRANGELPoll(struct RIGPORTINFO * PORT)
struct RIGINFO * RIG = &PORT->Rigs[0]; struct RIGINFO * RIG = &PORT->Rigs[0];
int Len, i; int Len, i;
char ReqBuf[256];
char SendBuff[256]; char SendBuff[256];
//char * SDRANGEL_GETheader = "GET /sdrangel/deviceset/%d/device/settings " //char * SDRANGEL_GETheader = "GET /sdrangel/deviceset/%d/device/settings "
// "HTTP/1.1\nHost: %s\nConnection: keep-alive\n\r\n"; // "HTTP/1.1\nHost: %s\nConnection: keep-alive\n\r\n";
@ -10379,7 +10379,6 @@ VOID SDRANGELPoll(struct RIGPORTINFO * PORT)
if (GetPermissionToChange(PORT, RIG)) if (GetPermissionToChange(PORT, RIG))
{ {
char cmd[80]; char cmd[80];
double freq;
if (RIG->RIG_DEBUG) if (RIG->RIG_DEBUG)
Debugprintf("BPQ32 Change Freq to %9.4f", PORT->FreqPtr->Freq); Debugprintf("BPQ32 Change Freq to %9.4f", PORT->FreqPtr->Freq);
@ -10451,7 +10450,6 @@ VOID SDRANGELPoll(struct RIGPORTINFO * PORT)
VOID SDRANGELSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value) VOID SDRANGELSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value)
{ {
int Len, ret; int Len, ret;
char ReqBuf[512];
char SendBuff[512]; char SendBuff[512];
char ValueString[256] =""; char ValueString[256] ="";
char * SDRANGEL_PATCHheader = "PATCH /sdrangel/deviceset/%d/device/settings " char * SDRANGEL_PATCHheader = "PATCH /sdrangel/deviceset/%d/device/settings "

View File

@ -78,7 +78,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 10 // First is used for Pactor, even though Pactor uses channel 31 #define MaxStreams 10 // First is used for Pactor, even though Pactor uses channel 31
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -854,7 +854,8 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SCS; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
OpenLogFile(TNC->Port); OpenLogFile(TNC->Port);
CloseLogFile(TNC->Port); CloseLogFile(TNC->Port);
@ -885,8 +886,6 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
@ -2893,7 +2892,7 @@ VOID ProcessIncomingCall(struct TNCINFO * TNC, struct STREAMINFO * STREAM, int S
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available
@ -3034,7 +3033,7 @@ VOID ProcessIncomingCall(struct TNCINFO * TNC, struct STREAMINFO * STREAM, int S
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// if SendTandRtoRelay set and Appl is RMS change to RELAY // if SendTandRtoRelay set and Appl is RMS change to RELAY

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 10 #define MaxStreams 10
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -48,7 +48,6 @@ extern UCHAR BPQDirectory[];
static RECT Rect; static RECT Rect;
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
char * strlop(char * buf, char delim);
BOOL KAMStartPort(struct PORTCONTROL * PORT); BOOL KAMStartPort(struct PORTCONTROL * PORT);
BOOL KAMStopPort(struct PORTCONTROL * PORT); BOOL KAMStopPort(struct PORTCONTROL * PORT);
@ -377,7 +376,8 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_TRKM; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -393,8 +393,6 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

File diff suppressed because it is too large Load Diff

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 1 #define MaxStreams 1
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
//#include "bpq32.h" //#include "bpq32.h"
@ -52,7 +52,6 @@ extern char LOC[];
static RECT Rect; static RECT Rect;
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
char * strlop(char * buf, char delim);
char NodeCall[11]; // Nodecall, Null Terminated char NodeCall[11]; // Nodecall, Null Terminated
@ -667,7 +666,8 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_TRK; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -683,8 +683,6 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else
@ -2175,7 +2173,7 @@ VOID TrkProcessDEDFrame(struct TNCINFO * TNC)
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available

View File

@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -142,7 +142,7 @@ loop:
return 1; return 1;
} }
BOOL SerialReadConfigFile(int Port, int ProcLine()) BOOL SerialReadConfigFile(int Port, int ProcLine(char * buf, int Port))
{ {
char buf[256],errbuf[256]; char buf[256],errbuf[256];
@ -508,7 +508,10 @@ ok:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cnd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -735,7 +738,7 @@ VOID SerialReleasePort(struct TNCINFO * TNC)
VOID * SerialExtInit(EXTPORTDATA * PortEntry) VOID * SerialExtInit(EXTPORTDATA * PortEntry)
{ {
int port; int port;
char Msg[255]; char Msg[512];
char * ptr; char * ptr;
struct TNCINFO * TNC; struct TNCINFO * TNC;
char * TempScript; char * TempScript;
@ -770,9 +773,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SERIAL;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

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

View File

@ -25,7 +25,17 @@ 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
{
char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH
VOID (* CMDPROC)(struct TNCDATA * TNC, char * Tail, struct _TCMDX * CMD);// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset
} TCMDX;
#define LF 10 #define LF 10
#define CR 13 #define CR 13
@ -848,7 +858,7 @@ int LocalSessionState(int stream, int * state, int * change, BOOL ACK)
VOID ONOFF(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID ONOFF(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
// PROCESS COMMANDS WITH ON/OFF PARAM // PROCESS COMMANDS WITH ON/OFF PARAM
@ -897,7 +907,7 @@ VOID ONOFF(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
VOID ONOFF_CONOK(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID ONOFF_CONOK(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream]; struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
@ -911,7 +921,7 @@ VOID ONOFF_CONOK(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SetAppl(TNCStream->BPQPort, TNC->APPLFLAGS, 0); SetAppl(TNCStream->BPQPort, TNC->APPLFLAGS, 0);
} }
VOID SETMYCALL(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID SETMYCALL(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
char Response[80]; char Response[80];
int len; int len;
@ -935,7 +945,7 @@ VOID SETMYCALL(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SENDREPLY(TNC, Response, len); SENDREPLY(TNC, Response, len);
} }
VOID CTEXTCMD(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID CTEXTCMD(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
char Response[256]; char Response[256];
int len, n; int len, n;
@ -963,10 +973,10 @@ VOID CTEXTCMD(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SENDREPLY(TNC, Response, len); SENDREPLY(TNC, Response, len);
} }
VOID BTEXT(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID BTEXT(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
} }
VOID VALUE(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID VALUE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
// PROCESS COMMANDS WITH decimal value // PROCESS COMMANDS WITH decimal value
@ -995,7 +1005,7 @@ VOID VALUE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SENDREPLY(TNC, Response, len); SENDREPLY(TNC, Response, len);
} }
VOID VALHEX(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID VALHEX(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
// PROCESS COMMANDS WITH decimal value // PROCESS COMMANDS WITH decimal value
@ -1032,7 +1042,7 @@ VOID VALHEX(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SENDREPLY(TNC, Response, len); SENDREPLY(TNC, Response, len);
} }
VOID APPL_VALHEX(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID APPL_VALHEX(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
int ApplNum = 1; int ApplNum = 1;
UINT APPLMASK; UINT APPLMASK;
@ -1061,7 +1071,7 @@ VOID APPL_VALHEX(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
memcpy(TNC->MYCALL, GetApplCall(ApplNum), 10); memcpy(TNC->MYCALL, GetApplCall(ApplNum), 10);
} }
VOID CSWITCH(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID CSWITCH(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
char Response[80]; char Response[80];
int len; int len;
@ -1072,12 +1082,12 @@ VOID CSWITCH(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
CONNECTTONODE(TNC); CONNECTTONODE(TNC);
} }
VOID CONMODE(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID CONMODE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
SENDREPLY(TNC, CMDMSG, 4); SENDREPLY(TNC, CMDMSG, 4);
} }
VOID TNCCONV(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID TNCCONV(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream]; struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
@ -1085,7 +1095,7 @@ VOID TNCCONV(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
TNCStream->MODEFLAG &= ~(COMMAND+TRANS); TNCStream->MODEFLAG &= ~(COMMAND+TRANS);
} }
VOID TNCNODE(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID TNCNODE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
// CONNECT TO NODE // CONNECT TO NODE
@ -1099,7 +1109,7 @@ VOID TNCNODE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
CONNECTTONODE(TNC); CONNECTTONODE(TNC);
} }
VOID CStatus(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID CStatus(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream]; struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
@ -1136,7 +1146,7 @@ VOID CStatus(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
} }
VOID TNCCONNECT(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID TNCCONNECT(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream]; struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
@ -1179,7 +1189,7 @@ VOID TNCCONNECT(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SENDPACKET(TNC); // Will now go to node SENDPACKET(TNC); // Will now go to node
} }
VOID TNCDISC(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID TNCDISC(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream]; struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
@ -1194,7 +1204,7 @@ VOID READCHANGE(int Stream)
LocalSessionState(Stream, &dummy, &dummy, TRUE); LocalSessionState(Stream, &dummy, &dummy, TRUE);
} }
VOID TNCRELEASE(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID TNCRELEASE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
ReturntoNode(TNC->BPQPort); ReturntoNode(TNC->BPQPort);
@ -1203,7 +1213,7 @@ VOID TNCRELEASE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
SENDREPLY(TNC, CMDMSG, 4); SENDREPLY(TNC, CMDMSG, 4);
} }
VOID TNCTRANS(struct TNCDATA * TNC, char * Tail, CMDX * CMD) VOID TNCTRANS(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream]; struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
@ -1215,7 +1225,7 @@ VOID TNCTRANS(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
TNCStream->MODEFLAG |= TRANS; TNCStream->MODEFLAG |= TRANS;
TNCStream->MODEFLAG &= ~(COMMAND+CONV); TNCStream->MODEFLAG &= ~(COMMAND+CONV);
} }
static VOID TNCRESTART(struct TNCDATA * TNC) static VOID TNCRESTART(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
// REINITIALISE CHANNEL // REINITIALISE CHANNEL
@ -1243,12 +1253,12 @@ static VOID TNCRESTART(struct TNCDATA * TNC)
} }
static VOID TNCUNPROTOCMD(struct TNCDATA * TNC, char * Tail, CMDX * CMD) static VOID TNCUNPROTOCMD(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
{ {
} }
CMDX TNCCOMMANDLIST[] = TCMDX TNCCOMMANDLIST[] =
{ {
"AUTOLF ",2, ONOFF, offsetof(struct TNCDATA, AUTOLF), "AUTOLF ",2, ONOFF, offsetof(struct TNCDATA, AUTOLF),
"BBSMON ",6, ONOFF, offsetof(struct TNCDATA, BBSMON), "BBSMON ",6, ONOFF, offsetof(struct TNCDATA, BBSMON),
@ -1301,7 +1311,7 @@ CMDX TNCCOMMANDLIST[] =
int NUMBEROFTNCCOMMANDS = sizeof(TNCCOMMANDLIST)/sizeof(CMDX); int NUMBEROFTNCCOMMANDS = sizeof(TNCCOMMANDLIST)/sizeof(TCMDX);
/*NEWVALUE DW 0 /*NEWVALUE DW 0
HEXFLAG DB 0 HEXFLAG DB 0
@ -2575,7 +2585,7 @@ VOID TNCCOMMAND(struct TNCDATA * TNC)
char * ptr, * ptr1, * ptr2; char * ptr, * ptr1, * ptr2;
int n; int n;
CMDX * CMD; TCMDX * CMD;
*(--TNC->CURSOR) = 0; *(--TNC->CURSOR) = 0;
@ -2653,11 +2663,8 @@ VOID TNCCOMMAND(struct TNCDATA * TNC)
} }
CMD++; CMD++;
} }
SENDREPLY(TNC, WHATMSG, 8); SENDREPLY(TNC, WHATMSG, 8);
} }
/* /*
@ -4926,6 +4933,7 @@ int STATUSPOLL(struct TNCDATA * TNC, struct StreamInfo * Channel)
int State, Change, i; int State, Change, i;
char WorkString[256]; char WorkString[256];
char ConMsg[64];
if (TNC->MSGCHANNEL == 0) // Monitor Chan if (TNC->MSGCHANNEL == 0) // Monitor Chan
return 0; return 0;
@ -4941,7 +4949,7 @@ int STATUSPOLL(struct TNCDATA * TNC, struct StreamInfo * Channel)
{ {
// DISCONNECTED // DISCONNECTED
i = sprintf(CONMSG, "\x3(%d) DISCONNECTED fm 0:SWITCH\r", TNC->MSGCHANNEL); i = sprintf(ConMsg, "\x3(%d) DISCONNECTED fm 0:SWITCH\r", TNC->MSGCHANNEL);
i++; i++;
} }
else else
@ -4950,11 +4958,11 @@ int STATUSPOLL(struct TNCDATA * TNC, struct StreamInfo * Channel)
GetCallsign(Channel->BPQStream, WorkString); GetCallsign(Channel->BPQStream, WorkString);
strlop(WorkString, ' '); strlop(WorkString, ' ');
i = sprintf(CONMSG, "\x3(%d) CONNECTED to %s\r", TNC->MSGCHANNEL, WorkString); i = sprintf(ConMsg, "\x3(%d) CONNECTED to %s\r", TNC->MSGCHANNEL, WorkString);
i++; i++;
} }
SENDCMDREPLY(TNC, CONMSG, i); SENDCMDREPLY(TNC, ConMsg, i);
return 1; return 1;
} }

View File

@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// Telnet Driver for BPQ Switch // Telnet Driver for BPQ Switch
// //
@ -37,7 +38,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define IDM_DISCONNECT 2000 #define IDM_DISCONNECT 2000
#define IDM_LOGGING 2100 #define IDM_LOGGING 2100
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#ifdef WIN32 #ifdef WIN32
@ -85,7 +86,11 @@ void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo *
void DRATSConnectionLost(struct ConnectionInfo * sockptr); void DRATSConnectionLost(struct ConnectionInfo * sockptr);
int BuildRigCtlPage(char * _REPLYBUFFER); int BuildRigCtlPage(char * _REPLYBUFFER);
void ProcessWebmailWebSockThread(void * conn); void ProcessWebmailWebSockThread(void * conn);
void RHPThread(void * Params);
void ProcessRHPWebSockClosed(SOCKET socket);
int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr); int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
#ifndef LINBPQ #ifndef LINBPQ
extern HKEY REGTREE; extern HKEY REGTREE;
@ -109,7 +114,7 @@ extern int REALTIMETICKS;
#define MaxSockets 26 #define MaxSockets 26
struct UserRec RelayUser; struct UserRec RelayUser;
struct UserRec SyncUser = {"","Sync"};; struct UserRec SyncUser = {"","Sync"};
struct UserRec CMSUser; struct UserRec CMSUser;
struct UserRec HostUser = {"","Host"}; struct UserRec HostUser = {"","Host"};
struct UserRec TriModeUser; struct UserRec TriModeUser;
@ -123,11 +128,12 @@ 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);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
char * strlop(char * buf, char delim);
int DisplaySessions(struct TNCINFO * TNC); int DisplaySessions(struct TNCINFO * TNC);
@ -534,7 +540,7 @@ int ProcessLine(char * buf, int Port)
TCP->TriModePort = atoi(value); TCP->TriModePort = atoi(value);
else if (_stricmp(param,"HTTPPORT") == 0) else if (_stricmp(param,"HTTPPORT") == 0)
TCP->HTTPPort = atoi(value); HTTPPort = TCP->HTTPPort = atoi(value);
else if (_stricmp(param,"APIPORT") == 0) else if (_stricmp(param,"APIPORT") == 0)
TCP->APIPort = atoi(value); TCP->APIPort = atoi(value);
@ -948,13 +954,27 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (sockptr->WebSocks == 0) if (sockptr->WebSocks == 0)
{ {
if (sockptr->LastSendTime && (REALTIMETICKS - sockptr->LastSendTime) > 1500) // ~ 2.5 mins if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 150) // ~ 2.5 mins
{ {
closesocket(sockptr->socket); closesocket(sockptr->socket);
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC); ShowConnections(TNC);
} }
} }
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
// RHP Sockets (Used for WhatsPack) Need a timeout
// Normally keepalives are sent each way around every 9 mins
// Keepalives aren't sent when connecting so may need a bit longer
if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 20 * 60) // 20mins
{
ProcessRHPWebSockClosed(sockptr->socket);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
}
} }
else else
{ {
@ -1169,7 +1189,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->Hardware = H_TELNET; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
// Get Menu Handles // Get Menu Handles
@ -1444,13 +1464,12 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
TCP = TNC->TCPInfo; TCP = TNC->TCPInfo;
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_TELNET; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] != 0) if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall); ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
@ -2468,15 +2487,11 @@ nosocks:
if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT) if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
{ {
#ifdef WIN32 if ((time(NULL) - sockptr->LastSendTime) > (L4LIMIT - 60)) // PC Ticks are about 10% slow
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 9) // PC Ticks are about 10% slow
#else
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 10)
#endif
{ {
// Send Keepalive // Send Keepalive
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
BuffertoNode(sockptr, "Keepalive\r", 10); BuffertoNode(sockptr, "Keepalive\r", 10);
} }
} }
@ -2606,7 +2621,7 @@ nosocks:
if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K') if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
{ {
sockptr->Keepalive = TRUE; sockptr->Keepalive = TRUE;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
} }
if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S') if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
@ -2838,7 +2853,7 @@ nosocks:
SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen); SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
sockptr->FromHostBuffGetptr += Msglen; sockptr->FromHostBuffGetptr += Msglen;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
} }
} }
} }
@ -3095,7 +3110,10 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->Hardware = H_TELNET; TNC->PortRecord = PortRecord;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->hDlg = SavehDlg; TNC->hDlg = SavehDlg;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
@ -3126,8 +3144,6 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, "."); ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
} }
TNC->PortRecord = PortRecord;
Sleep(500); Sleep(500);
OpenSockets(TNC); OpenSockets(TNC);
OpenSockets6(TNC); OpenSockets6(TNC);
@ -3750,7 +3766,7 @@ MsgLoop:
BuffertoNode(sockptr, NodeLine, len); BuffertoNode(sockptr, NodeLine, len);
sockptr->InputLen = 0; sockptr->InputLen = 0;
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
} }
@ -3924,7 +3940,7 @@ MsgLoop:
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
} }
@ -4180,7 +4196,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
@ -4300,7 +4316,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL)); SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
@ -4799,7 +4815,7 @@ MsgLoop:
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
@ -4875,7 +4891,7 @@ MsgLoop:
WriteLog (logmsg); WriteLog (logmsg);
} }
ShowConnections(TNC);; ShowConnections(TNC);
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
sockptr->InputLen=InputLen; sockptr->InputLen=InputLen;
@ -4968,6 +4984,16 @@ MsgLoop:
extern char * RigWebPage; extern char * RigWebPage;
struct RHPParamBlock
{
unsigned char * Msg;
int Len;
SOCKET Socket;
struct ConnectionInfo * sockptr;
};
int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream) int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream)
{ {
int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret; int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret;
@ -4990,10 +5016,24 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
// Failed or closed - clear connection // Failed or closed - clear connection
// if Websock connection till app
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 TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
DataSocket_Disconnect(TNC, sockptr); DataSocket_Disconnect(TNC, sockptr);
return 0; return 0;
} }
}
MsgPtr = &sockptr->InputBuffer[0]; MsgPtr = &sockptr->InputBuffer[0];
sockptr->InputLen += len; sockptr->InputLen += len;
@ -5009,6 +5049,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
int Fin, Opcode, Len, Mask; int Fin, Opcode, Len, Mask;
char MaskingKey[4]; char MaskingKey[4];
char * ptr; char * ptr;
char * Payload;
/* /*
+-+-+-+-+-------+-+-------------+-------------------------------+ +-+-+-+-+-------+-+-------------+-------------------------------+
@ -5036,8 +5077,20 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
Opcode = MsgPtr[0] & 15; Opcode = MsgPtr[0] & 15;
Mask = MsgPtr[1] >> 7; Mask = MsgPtr[1] >> 7;
Len = MsgPtr[1] & 127; Len = MsgPtr[1] & 127;
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); memcpy(MaskingKey, &MsgPtr[2], 4);
ptr = &MsgPtr[6]; ptr = &MsgPtr[6];
}
Payload = ptr;
for (i = 0; i < Len; i++) for (i = 0; i < Len; i++)
{ {
@ -5059,23 +5112,47 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
char RigCMD[64]; char RigCMD[64];
sprintf(RigCMD, "%s PTT", &MsgPtr[6]); sprintf(RigCMD, "%s PTT", Payload);
Rig_Command( (TRANSPORTENTRY *) -1, RigCMD); Rig_Command( (TRANSPORTENTRY *) -1, RigCMD);
} }
else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0) else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0)
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
_beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy); // Needs big stack _beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy); // Needs big stack
return 0; return 0;
} }
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
// Run in thread as it may block;
struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
ParamBlock->sockptr = sockptr;
ParamBlock->Socket = sockptr->socket;
ParamBlock->Len = Len;
ParamBlock->Msg = malloc(Len + 10);
memcpy(ParamBlock->Msg, Payload, Len);
sockptr->LastSendTime = time(NULL);
_beginthread(RHPThread, 0, (VOID *)ParamBlock);
sockptr->InputLen = 0;
return 0;
}
} }
else else
{
Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]); Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
sockptr->InputLen = 0; sockptr->InputLen = 0;
return 0; return 0;
@ -5102,7 +5179,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5209,7 +5286,7 @@ int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr
ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, "."); ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
#endif #endif
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC);; ShowConnections(TNC);
} }
return 0; return 0;
} }
@ -5396,8 +5473,7 @@ int WriteLog(char * msg)
strcat(Value, "logs/Telnet_"); strcat(Value, "logs/Telnet_");
} }
sprintf(Value, "%s%02d%02d%02d.log", Value, sprintf(&Value[strlen(Value)], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "a")) == NULL) if ((file = fopen(Value, "a")) == NULL)
return FALSE; return FALSE;
@ -5452,8 +5528,7 @@ VOID WriteCMSLog(char * msg)
strcat(Value, "logs/CMSAccess"); strcat(Value, "logs/CMSAccess");
} }
sprintf(Value, "%s_%04d%02d%02d.log", Value, sprintf(&Value[strlen(Value)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(Value, "ab"); Handle = fopen(Value, "ab");
@ -6757,7 +6832,7 @@ extern struct DATAMESSAGE * REPLYBUFFER;
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...); char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
int Port = 0, index =0; int Port = 0, index =0;
char * ptr, *Context; char * ptr, *Context;
@ -6942,7 +7017,7 @@ VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail,
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID SHOWTELNET(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWTELNET(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY Telnet Server Status Mheard // DISPLAY Telnet Server Status Mheard
@ -7098,7 +7173,7 @@ int DoRefreshWebMailIndex()
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));

View File

@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
@ -464,7 +464,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_UIARQ; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -476,7 +476,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
while (TNC->ARQPorts[i]) while (TNC->ARQPorts[i])
{ {
PORT = GetPortTableEntryFromPortNum(TNC->ARQPorts[i]); PORT = GetPortTableEntryFromPortNum(TNC->ARQPorts[i]);
PORT->UIHook = (FARPROCY)UIHook; PORT->UIHook = UIHook;
PORT->HookPort = (struct PORTCONTROL *)PortEntry; PORT->HookPort = (struct PORTCONTROL *)PortEntry;
i++; i++;
} }
@ -869,7 +869,7 @@ static VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, int
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available

View File

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

View File

@ -37,7 +37,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -62,7 +62,7 @@ void ConnecttoUZ7HOThread(void * portptr);
void CreateMHWindow(); void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
int ConnecttoUZ7HO(); int ConnecttoUZ7HO(int port);
static int ProcessReceivedData(int bpqport); static int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port); static int ProcessLine(char * buf, int Port);
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
@ -374,7 +374,7 @@ int UZ7HOSetFreq(int port, struct TNCINFO * TNC, struct AGWINFO * AGW, PDATAMESS
{ {
// Read Freq // Read Freq
buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq); buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1; return 1;
} }
@ -1023,7 +1023,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1400,7 +1404,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_UZ7HO; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO;
UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
@ -2479,7 +2483,7 @@ GotStream:
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available

13
V4.c
View File

@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define SD_BOTH 0x02 #define SD_BOTH 0x02
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -622,7 +622,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -971,13 +974,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_V4; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_V4;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -1273,7 +1276,7 @@ static VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available

43
VARA.c
View File

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

View File

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

View File

@ -70,7 +70,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#ifdef WIN32 #ifdef WIN32
#include <Psapi.h> #include <Psapi.h>
@ -508,7 +508,7 @@ static int ProcessLine(char * buf, int Port)
void WINMORThread(void * portptr); void WINMORThread(void * portptr);
VOID ProcessDataSocketData(int port); VOID ProcessDataSocketData(int port);
int ConnecttoWINMOR(); int ConnecttoWINMOR(int port);
static int ProcessReceivedData(struct TNCINFO * TNC); static int ProcessReceivedData(struct TNCINFO * TNC);
int V4ProcessReceivedData(struct TNCINFO * TNC); int V4ProcessReceivedData(struct TNCINFO * TNC);
VOID ReleaseTNC(struct TNCINFO * TNC); VOID ReleaseTNC(struct TNCINFO * TNC);
@ -984,7 +984,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1462,11 +1466,12 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_WINMOR; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1474,7 +1479,6 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -2231,7 +2235,7 @@ VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available

View File

@ -23,6 +23,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
int CurrentWPIndex; int CurrentWPIndex;
char CurrentWPCall[10]; char CurrentWPCall[10];
@ -34,6 +37,7 @@ VOID Do_Save_WPRec(HWND hDlg);
VOID SaveInt64Value(config_setting_t * group, char * name, long long value); VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
VOID SaveIntValue(config_setting_t * group, char * name, int value); VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveStringValue(config_setting_t * group, char * name, char * value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
void MQTTMessageEvent(void* message);
WPRec * AllocateWPRecord() WPRec * AllocateWPRecord()
{ {
@ -120,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;
@ -268,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);
@ -945,6 +949,9 @@ VOID ProcessWPMsg(char * MailBuffer, int Size, char * FirstRLine)
WPLen = ptr2 - ptr1; WPLen = ptr2 - ptr1;
if (WPLen > 128)
return;
if ((memcmp(ptr1, "On ", 3) == 0) && (WPLen < 200)) if ((memcmp(ptr1, "On ", 3) == 0) && (WPLen < 200))
{ {
char * Date; char * Date;
@ -1029,7 +1036,7 @@ it will not be replaced. This flag will be used in case the WP update messages a
WPDate -= (time_t)_MYTIMEZONE; WPDate -= (time_t)_MYTIMEZONE;
TypeString = strlop(Call, '/'); TypeString = strlop(Call, '/');
if (strlen(Call) < 3 || strlen(Call) > 9) if (strlen(Call) < 3 || strlen(Call) > 6)
return; return;
if (TypeString) if (TypeString)
@ -1416,7 +1423,7 @@ int CreateWPMessage()
// if (ptr->last_modif > LASTWPSendTime && ptr->Type == 'U' && ptr->first_homebbs[0]) // if (ptr->last_modif > LASTWPSendTime && ptr->Type == 'U' && ptr->first_homebbs[0])
if (ptr->changed && ptr->last_modif > LASTWPSendTime && ptr->first_homebbs[0]) if (ptr->changed && ptr->last_modif > LASTWPSendTime && ptr->first_homebbs[0])
{ {
tm = gmtime(&ptr->last_modif); tm = gmtime((time_t *)&ptr->last_modif);
MsgLen += sprintf(Buffptr, "On %02d%02d%02d %s/%c @ %s zip %s %s %s\r\n", MsgLen += sprintf(Buffptr, "On %02d%02d%02d %s/%c @ %s zip %s %s %s\r\n",
tm->tm_year-100, tm->tm_mon+1, tm->tm_mday, tm->tm_year-100, tm->tm_mon+1, tm->tm_mday,
ptr->callsign, ptr->Type, ptr->first_homebbs, ptr->callsign, ptr->Type, ptr->first_homebbs,
@ -1495,6 +1502,10 @@ int CreateWPMessage()
BuildNNTPList(Msg); // Build NNTP Groups list BuildNNTPList(Msg); // Build NNTP Groups list
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
To++; To++;
} }
@ -1533,8 +1544,8 @@ VOID CreateWPReport()
len = sprintf(Line, "%-7s,%c,%s,%s,%s,%s,%s,%s,%s,%d,%s,%s\r\n", len = sprintf(Line, "%-7s,%c,%s,%s,%s,%s,%s,%s,%s,%d,%s,%s\r\n",
WP->callsign, WP->Type, WP->first_homebbs, WP->first_qth, WP->first_zip, WP->callsign, WP->Type, WP->first_homebbs, WP->first_qth, WP->first_zip,
WP->secnd_homebbs, WP->secnd_qth, WP->secnd_zip, WP->name, WP->changed, WP->secnd_homebbs, WP->secnd_qth, WP->secnd_zip, WP->name, WP->changed,
FormatWPDate(WP->last_modif), FormatWPDate((time_t)WP->last_modif),
FormatWPDate(WP->last_seen)); FormatWPDate((time_t)WP->last_seen));
fwrite(Line, 1, len, hFile); fwrite(Line, 1, len, hFile);
} }

View File

@ -19,7 +19,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#define MAIL #define MAIL
@ -78,6 +78,7 @@ char * doXMLTransparency(char * string);
Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall); Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall);
void SendMessageReadEvent(char * Call, struct MsgInfo * Msg); void SendMessageReadEvent(char * Call, struct MsgInfo * Msg);
void SendNewMessageEvent(char * call, struct MsgInfo * Msg); void SendNewMessageEvent(char * call, struct MsgInfo * Msg);
void MQTTMessageEvent(void* message);
extern char NodeTail[]; extern char NodeTail[];
extern char BBSName[10]; extern char BBSName[10];
@ -2020,7 +2021,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';" "document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>" " document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' " "<input type=button class='btn' onclick='myfunc()' "
"value='Include Orignal Msg'>"; "value='Include Original Msg'>";
char Temp[1024]; char Temp[1024];
char ReplyAddr[128]; char ReplyAddr[128];
@ -2292,6 +2293,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
struct HtmlFormDir * Dir; struct HtmlFormDir * Dir;
int i; int i;
int len;
SubDir = strlop(&NodeURL[17], ':'); SubDir = strlop(&NodeURL[17], ':');
DirNo = atoi(&NodeURL[17]); DirNo = atoi(&NodeURL[17]);
@ -2312,9 +2314,9 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (SubDir) if (SubDir)
sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName); len = sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
else else
sprintf(popup, popuphddr, Key, Dir->DirName); len = sprintf(popup, popuphddr, Key, Dir->DirName);
if (SubDir) if (SubDir)
{ {
@ -2325,7 +2327,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// We only send if there is a .txt file // We only send if there is a .txt file
if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0) if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
sprintf(popup, "%s <option value=%d:%d,%d>%s", popup, DirNo, SubDirNo, i, Name); len += sprintf(&popup[len], " <option value=%d:%d,%d>%s", DirNo, SubDirNo, i, Name);
} }
} }
else else
@ -2337,10 +2339,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// We only send if there is a .txt file // We only send if there is a .txt file
if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0) if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
sprintf(popup, "%s <option value=%d,%d>%s", popup, DirNo, i, Name); len += sprintf(&popup[len], " <option value=%d,%d>%s", DirNo, i, Name);
} }
} }
sprintf(popup, "%s</select></p>", popup); len += sprintf(&popup[len], "</select></p>");
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -2408,6 +2410,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
int i; int i;
int MsgLen = 0; int MsgLen = 0;
char * Boundary; char * Boundary;
int len;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
@ -2454,7 +2457,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
// Also to active fields in case not changed by form // Also to active fields in case not changed by form
sprintf(popup, popuphddr, Session->Key); len = sprintf(popup, popuphddr, Session->Key);
LastGroup = HtmlFormDirs[0]->FormSet; // Save so we know when changes LastGroup = HtmlFormDirs[0]->FormSet; // Save so we know when changes
@ -2467,21 +2470,21 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
if (strcmp(LastGroup, Dir->FormSet) != 0) if (strcmp(LastGroup, Dir->FormSet) != 0)
{ {
LastGroup = Dir->FormSet; LastGroup = Dir->FormSet;
sprintf(popup, "%s%s", popup, NewGroup); len += sprintf(&popup[len], "%s", NewGroup);
} }
sprintf(popup, "%s <option value=%d>%s", popup, i, Dir->DirName); len += sprintf(&popup[len], " <option value=%d>%s", i, Dir->DirName);
// Recurse any Subdirs // Recurse any Subdirs
n = 0; n = 0;
while (n < Dir->DirCount) while (n < Dir->DirCount)
{ {
sprintf(popup, "%s <option value=%d:%d>%s", popup, i, n, Dir->Dirs[n]->DirName); len += sprintf(&popup[len], " <option value=%d:%d>%s", i, n, Dir->Dirs[n]->DirName);
n++; n++;
} }
} }
sprintf(popup, "%s</select></td></tr></table></p>", popup); len += sprintf(&popup[len], "%</select></td></tr></table></p>");
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
@ -2840,6 +2843,11 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
SendNewMessageEvent(user->Call, Msg); SendNewMessageEvent(user->Call, Msg);
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
if (user && (user->flags & F_APRSMFOR)) if (user && (user->flags & F_APRSMFOR))
{ {
char APRS[128]; char APRS[128];
@ -3784,6 +3792,12 @@ VOID WriteOneRecipient(struct MsgInfo * Msg, WebMailInfo * WebMail, int MsgLen,
Msg->status = '$'; // Has forwarding Msg->status = '$'; // Has forwarding
BuildNNTPList(Msg); // Build NNTP Groups list BuildNNTPList(Msg); // Build NNTP Groups list
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
} }
@ -4368,6 +4382,12 @@ VOID BuildMessageFromHTMLInput(struct HTTPConnectionInfo * Session, char * Reply
BuildNNTPList(Msg); // Build NNTP Groups list BuildNNTPList(Msg); // Build NNTP Groups list
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
@ -5477,6 +5497,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
char * ptr, * ptr1; char * ptr, * ptr1;
char * prompt; char * prompt;
char * var[100]; char * var[100];
int len;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
@ -5546,7 +5567,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
ptr = ptr1; ptr = ptr1;
} }
sprintf(popup, popuphddr, Session->Key, prompt, vars + 1); len = sprintf(popup, popuphddr, Session->Key, prompt, vars + 1);
for (i = 0; i < vars; i++) for (i = 0; i < vars; i++)
{ {
@ -5555,9 +5576,9 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
if (key == NULL) if (key == NULL)
key = var[i]; key = var[i];
sprintf(popup, "%s <option value='%s'>%s", popup, key, var[i]); len += sprintf(&popup[len], " <option value='%s'>%s", key, var[i]);
} }
sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup); len += sprintf(&popup[len], "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>");
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
free(SelCopy); free(SelCopy);
@ -6116,16 +6137,17 @@ VOID getAttachmentList(struct HTTPConnectionInfo * Session, char * Reply, int *
char popup[10000]; char popup[10000];
int i; int i;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
int len;
sprintf(popup, popuphddr, Session->Key, WebMail->Files); len = sprintf(popup, popuphddr, Session->Key, WebMail->Files);
for (i = 0; i < WebMail->Files; i++) for (i = 0; i < WebMail->Files; i++)
{ {
if(WebMail->FileLen[i] < 100000) if(WebMail->FileLen[i] < 100000)
sprintf(popup, "%s <option value=%d>%s (Len %d)", popup, i + 1, WebMail->FileName[i], WebMail->FileLen[i]); len += sprintf(&popup[len], " <option value=%d>%s (Len %d)", i + 1, WebMail->FileName[i], WebMail->FileLen[i]);
} }
sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup); len += sprintf(&popup[len], "%</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>");
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -6271,7 +6293,7 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
} }
} }
ptr += sprintf(ptr, "%s</pre> \r\n", ptr); ptr += sprintf(&ptr[strlen(ptr)], "</pre> \r\n");
Len = ptr - &OutBuffer[10]; Len = ptr - &OutBuffer[10];

View File

@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define MaxStreams 1 #define MaxStreams 1
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -63,8 +63,6 @@ extern char LOC[];
static RECT Rect; static RECT Rect;
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
char * strlop(char * buf, char delim);
char NodeCall[11]; // Nodecall, Null Terminated char NodeCall[11]; // Nodecall, Null Terminated
static BOOL WriteCommBlock(struct TNCINFO * TNC); static BOOL WriteCommBlock(struct TNCINFO * TNC);
@ -797,7 +795,8 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
WritetoConsoleLocal(msg); WritetoConsoleLocal(msg);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_WINRPR; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -813,8 +812,6 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

@ -111,7 +111,7 @@ int main(int argc, char ** argv)
if (argc < 3) if (argc < 3)
{ {
printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n" printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n" " WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n"); "Press any key to exit\r\n");

5
adif.c
View File

@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "adif.h" #include "adif.h"
#include "telnetserver.h" #include "telnetserver.h"
@ -409,8 +409,7 @@ BOOL WriteADIFRecord(ADIF * ADIF)
strcat(Value, "logs/BPQ_CMS_ADIF"); strcat(Value, "logs/BPQ_CMS_ADIF");
} }
sprintf(Value, "%s_%04d%02d.adi", Value, sprintf(&Value[strlen(Value)], "_%04d%02d.adi", tm->tm_year +1900, tm->tm_mon+1);
tm->tm_year +1900, tm->tm_mon+1);
STAT.st_size = 0; STAT.st_size = 0;
stat(Value, &STAT); stat(Value, &STAT);

View File

@ -33,6 +33,7 @@ typedef int (FAR *FARPROCY)();
#define L4BUSY 0x80 // BNA - DONT SEND ANY MORE #define L4BUSY 0x80 // BNA - DONT SEND ANY MORE
#define L4NAK 0x40 // NEGATIVE RESPONSE FLAG #define L4NAK 0x40 // NEGATIVE RESPONSE FLAG
#define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG #define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG
#define L4COMP 0x10 // BPQ Specific use of spare it - data is compressed
#define L4CREQ 1 // CONNECT REQUEST #define L4CREQ 1 // CONNECT REQUEST
#define L4CACK 2 // CONNECT ACK #define L4CACK 2 // CONNECT ACK
@ -40,6 +41,7 @@ typedef int (FAR *FARPROCY)();
#define L4DACK 4 // DISCONNECT ACK #define L4DACK 4 // DISCONNECT ACK
#define L4INFO 5 // INFORMATION #define L4INFO 5 // INFORMATION
#define L4IACK 6 // INFORMATION ACK #define L4IACK 6 // INFORMATION ACK
#define L4RESET 7 // Paula's extension
extern char MYCALL[]; // 7 chars, ax.25 format extern char MYCALL[]; // 7 chars, ax.25 format
@ -62,15 +64,15 @@ extern int ENDOFDATA;
extern int L3LIVES; extern int L3LIVES;
extern int NUMBEROFNODES; extern int NUMBEROFNODES;
typedef struct _CMDX struct CMDX
{ {
char String[12]; // COMMAND STRING char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH UCHAR CMDLEN; // SIGNIFICANT LENGTH
// VOID (*CMDPROC)(struct _TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);// COMMAND PROCESSOR
VOID (*CMDPROC)();// COMMAND PROCESSOR VOID (*CMDPROC)();// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset size_t CMDFLAG; // FLAG/VALUE Offset
} CMDX; };
struct APPLCONFIG struct APPLCONFIG
{ {
@ -170,6 +172,23 @@ typedef struct _TRANSPORTENTRY
char APPL[16]; // Set if session initiated by an APPL char APPL[16]; // Set if session initiated by an APPL
int L4LIMIT; // Idle time for this Session int L4LIMIT; // Idle time for this Session
// Now support compressing NetRom Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * toCompress; // Data being saved to compress
int toCompressLen;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
} TRANSPORTENTRY; } TRANSPORTENTRY;
// //
@ -195,6 +214,9 @@ typedef struct ROUTE
UCHAR NEIGHBOUR_QUAL; UCHAR NEIGHBOUR_QUAL;
UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE
#define LOCKEDBYCONFIG 1
#define LOCKEDBYSYSOP 2
struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR
USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM) USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM)
@ -445,7 +467,8 @@ typedef struct NR_DEST_ROUTE_ENTRY
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
UCHAR ROUT_QUALITY; // QUALITY UCHAR ROUT_QUALITY; // QUALITY
UCHAR ROUT_OBSCOUNT; UCHAR ROUT_OBSCOUNT;
UCHAR Padding[5]; // SO Entries are the same length UCHAR ROUT_LOCKED;
UCHAR Padding[4]; // SO Entries are the same length
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct DEST_ROUTE_ENTRY typedef struct DEST_ROUTE_ENTRY
@ -467,12 +490,12 @@ typedef struct DEST_LIST
UCHAR DEST_ALIAS[6]; UCHAR DEST_ALIAS[6];
UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC
UCHAR DEST_LOCKED;
UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION
UCHAR INP3FLAGS; UCHAR INP3FLAGS;
struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest
struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION
@ -547,14 +570,14 @@ typedef struct PORTCONTROL
PMESSAGE PORTRX_Q; // FRAMES RECEIVED ON THIS PORT PMESSAGE PORTRX_Q; // FRAMES RECEIVED ON THIS PORT
PMESSAGE PORTTX_Q; // FRAMES TO BE SENT ON THIS PORT PMESSAGE PORTTX_Q; // FRAMES TO BE SENT ON THIS PORT
void (FAR * PORTTXROUTINE)(); // POINTER TO TRANSMIT ROUTINE FOR THIS PORT void (FAR * PORTTXROUTINE)(struct _EXTPORTDATA * PORTVEC, MESSAGE * Buffer); // POINTER TO TRANSMIT ROUTINE FOR THIS PORT
void (FAR * PORTRXROUTINE)(); // POINTER TO RECEIVE ROUTINE FOR THIS PORT void (FAR * PORTRXROUTINE)(struct _EXTPORTDATA * PORTVEC); // POINTER TO RECEIVE ROUTINE FOR THIS PORT
void (FAR * PORTINITCODE)(); // INITIALISATION ROUTINE void (FAR * PORTINITCODE)(struct PORTCONTROL * PortVector); // INITIALISATION ROUTINE
void (FAR * PORTTIMERCODE)(); // void (FAR * PORTTIMERCODE)(struct PORTCONTROL * PortVector); //
void (FAR * PORTCLOSECODE)(); // CLOSE ROUTINE void (FAR * PORTCLOSECODE)(struct PORTCONTROL * PortVector); // CLOSE ROUTINE
int (FAR * PORTTXCHECKCODE)(); // OK to TX Check int (FAR * PORTTXCHECKCODE)(struct PORTCONTROL * PORTVEC, int Chan); // OK to TX Check
BOOL (FAR * PORTSTOPCODE)(); // Temporarily Stop Port BOOL (FAR * PORTSTOPCODE)(struct PORTCONTROL * PORT); // Temporarily Stop Port
BOOL (FAR * PORTSTARTCODE)(); // Restart Port BOOL (FAR * PORTSTARTCODE)(struct PORTCONTROL * PORT); // Restart Port
BOOL PortStopped; // STOPPORT command used BOOL PortStopped; // STOPPORT command used
BOOL PortSuspended; // Suspended by interlock BOOL PortSuspended; // Suspended by interlock
@ -678,10 +701,11 @@ typedef struct PORTCONTROL
BOOL IgnoreUnlocked; // Ignore Unlocked routes BOOL IgnoreUnlocked; // Ignore Unlocked routes
BOOL INP3ONLY; // Default to INP3 and disallow NODES BOOL INP3ONLY; // Default to INP3 and disallow NODES
FARPROCY UIHook; // Used for KISSARQ void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ
struct PORTCONTROL * HookPort; struct PORTCONTROL * HookPort;
int PortSlot; // Index in Port Table int PortSlot; // Index in Port Table
struct TNCINFO * TNC; // Associated TNC record struct TNCINFO * TNC; // Associated TNC record
int HWType; // Hardware type of Driver. In here as external apps don't have access to TNC record
int RIGPort; // Linked port for freq resporting int RIGPort; // Linked port for freq resporting
unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED) unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED)
char * CTEXT; // Port Specific CText char * CTEXT; // Port Specific CText
@ -766,7 +790,7 @@ typedef struct _EXTPORTDATA
{ {
struct PORTCONTROL PORTCONTROL ; // REMAP HARDWARE INFO struct PORTCONTROL PORTCONTROL ; // REMAP HARDWARE INFO
void * (* PORT_EXT_ADDR) (); // ADDR OF RESIDENT ROUTINE void * (* PORT_EXT_ADDR) (int fn, int port, PDATAMESSAGE buff); // ADDR OF RESIDENT ROUTINE
char PORT_DLL_NAME[16]; char PORT_DLL_NAME[16];
UCHAR EXTRESTART; // FLAG FOR DRIVER REINIT UCHAR EXTRESTART; // FLAG FOR DRIVER REINIT
HINSTANCE DLLhandle; HINSTANCE DLLhandle;
@ -1044,6 +1068,8 @@ struct SEM
int Rels; int Rels;
DWORD SemProcessID; DWORD SemProcessID;
DWORD SemThreadID; DWORD SemThreadID;
int Line; // caller file and line
char File[MAX_PATH];
}; };

View File

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

View File

@ -687,7 +687,11 @@ int RemoveLF(char * Message, int len);
struct SEM; struct SEM;
BOOL isdigits(char * string); BOOL isdigits(char * string);
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);

View File

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

View File

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

View File

@ -33,7 +33,7 @@
#include "BPQMailrc.h" #include "BPQMailrc.h"
#include "dbghelp.h" #include "dbghelp.h"
#else #else
#include "CHeaders.h" #include "cheaders.h"
#endif #endif
#include "asmstrucs.h" #include "asmstrucs.h"
@ -471,6 +471,8 @@ struct UserInfo
{ {
// New Format - with stats maintained by message type and unused fields removed. // New Format - with stats maintained by message type and unused fields removed.
// This is no longer a fixed length record so can't be saved as a binarl
char Call[10]; // Connected call without SSID char Call[10]; // Connected call without SSID
int Length; // To make subsequent format changes easier int Length; // To make subsequent format changes easier
@ -643,9 +645,9 @@ struct MsgInfo
// For 64 bit time_t compatibility define as long long // For 64 bit time_t compatibility define as long long
// (so struct is same with 32 or 64 bit time_t) // (so struct is same with 32 or 64 bit time_t)
long long datereceived; int64_t datereceived;
long long datecreated; int64_t datecreated;
long long datechanged; int64_t datechanged;
char Spare[61 - 24]; // For future use char Spare[61 - 24]; // For future use
} ; } ;
@ -1171,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);
@ -1211,10 +1213,9 @@ VOID Do_Delete_User(HWND hDlg);
VOID FlagSentMessages(CIRCUIT * conn, struct UserInfo * user); VOID FlagSentMessages(CIRCUIT * conn, struct UserInfo * user);
VOID HoldSentMessages(CIRCUIT * conn, struct UserInfo * user); VOID HoldSentMessages(CIRCUIT * conn, struct UserInfo * user);
VOID Do_Save_User(HWND hDlg, BOOL ShowBox); VOID Do_Save_User(HWND hDlg, BOOL ShowBox);
VOID DeleteBBS(); VOID DeleteBBS(struct UserInfo * user);
VOID AddBBS();
VOID SaveBBSConfig(); VOID SaveBBSConfig();
BOOL GetChatConfig(); BOOL GetChatConfig(char * ConfigName);
VOID SaveChatConfig(); VOID SaveChatConfig();
VOID SaveISPConfig(); VOID SaveISPConfig();
VOID SaveFWDConfig(); VOID SaveFWDConfig();
@ -1288,7 +1289,9 @@ int RemoveLF(char * Message, int len);
// Utilities // Utilities
BOOL isdigits(char * string); BOOL isdigits(char * string);
void GetSemaphore(struct SEM * Semaphore, int ID);
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);

View File

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

91
cMain.c
View File

@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// C replacement for Main.asm // C replacement for Main.asm
// //
@ -34,7 +35,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <fcntl.h> #include <fcntl.h>
#include "kernelresource.h" #include "kernelresource.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "mqtt.h" #include "mqtt.h"
@ -42,7 +43,7 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer);
VOID ProcessIframe(struct _LINKTABLE * LINK, PDATAMESSAGE Buffer); VOID ProcessIframe(struct _LINKTABLE * LINK, PDATAMESSAGE Buffer);
VOID FindLostBuffers(); VOID FindLostBuffers();
VOID ReadMH(); VOID ReadMH();
void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD); void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
int upnpInit(); int upnpInit();
void AISTimer(); void AISTimer();
void ADSBTimer(); void ADSBTimer();
@ -139,6 +140,10 @@ int NODE = 1; // INCLUDE SWITCH SUPPORT
int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ
int L4Compress = 0;
int L4CompMaxframe = 3;
int L4CompPaclen = 236;
BOOL LogL4Connects = FALSE; BOOL LogL4Connects = FALSE;
BOOL LogAllConnects = FALSE; BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE; BOOL AUTOSAVEMH = TRUE;
@ -332,7 +337,7 @@ BOOL LINKTXCHECK()
return 0; return 0;
} }
void * Dummy() // Dummy for missing EXT Driver void * Dummy(int fn, int port, PDATAMESSAGE buff) // Dummy for missing EXT Driver
{ {
return 0; return 0;
} }
@ -341,26 +346,31 @@ VOID EXTINIT(PEXTPORTDATA PORTVEC)
{ {
// LOAD DLL - NAME IS IN PORT_DLL_NAME // LOAD DLL - NAME IS IN PORT_DLL_NAME
VOID * Routine; void *(* Startup) (PEXTPORTDATA PORTVEC); // ADDR OF Startup ROUTINE
PORTVEC->PORT_EXT_ADDR = Dummy; PORTVEC->PORT_EXT_ADDR = Dummy;
Routine = InitializeExtDriver(PORTVEC); Startup = InitializeExtDriver(PORTVEC);
if (Routine == 0) if (Startup == 0)
{ {
WritetoConsoleLocal("Driver installation failed\n"); WritetoConsoleLocal("Driver installation failed\n");
return; return;
} }
PORTVEC->PORT_EXT_ADDR = Routine;
// ALSO CALL THE ROUTINE TO START IT UP, ESPECIALLY IF A L2 ROUTINE
Routine = (VOID *)PORTVEC->PORT_EXT_ADDR(PORTVEC); // CALL THE ROUTINE TO START IT UP
// Startup returns address of processing routine // Startup returns address of processing routine
PORTVEC->PORT_EXT_ADDR = Routine; PORTVEC->PORT_EXT_ADDR = (void *(__cdecl *)(int,int,PDATAMESSAGE))Startup(PORTVEC);;
if (PORTVEC->PORT_EXT_ADDR == 0)
{
WritetoConsoleLocal("Driver Initialisation failed\n");
return;
}
} }
VOID EXTTX(PEXTPORTDATA PORTVEC, MESSAGE * Buffer) VOID EXTTX(PEXTPORTDATA PORTVEC, MESSAGE * Buffer)
@ -372,7 +382,7 @@ VOID EXTTX(PEXTPORTDATA PORTVEC, MESSAGE * Buffer)
if (PORT->KISSFLAGS == 255) // Used for BAYCOM if (PORT->KISSFLAGS == 255) // Used for BAYCOM
{ {
PORTVEC->PORT_EXT_ADDR(2, PORT->PORTNUMBER, Buffer); PORTVEC->PORT_EXT_ADDR(2, PORT->PORTNUMBER, (PDATAMESSAGE)Buffer);
return; // Baycom driver passes frames to trace once sent return; // Baycom driver passes frames to trace once sent
} }
@ -388,7 +398,7 @@ VOID EXTTX(PEXTPORTDATA PORTVEC, MESSAGE * Buffer)
Buffer->Linkptr = 0; // CLEAR FLAG FROM BUFFER Buffer->Linkptr = 0; // CLEAR FLAG FROM BUFFER
} }
PORTVEC->PORT_EXT_ADDR(2, PORT->PORTNUMBER, Buffer); PORTVEC->PORT_EXT_ADDR(2, PORT->PORTNUMBER, (PDATAMESSAGE)Buffer);
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF) if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF)
{ {
@ -418,7 +428,7 @@ Loop:
if (Message == NULL) if (Message == NULL)
return; return;
Len = (size_t)PORTVEC->PORT_EXT_ADDR(1, PORT->PORTNUMBER, Message); Len = (size_t)PORTVEC->PORT_EXT_ADDR(1, PORT->PORTNUMBER, (PDATAMESSAGE)Message);
if (Len == 0) if (Len == 0)
{ {
@ -502,7 +512,9 @@ VOID EXTSLOWTIMER(PEXTPORTDATA PORTVEC)
size_t EXTTXCHECK(PEXTPORTDATA PORTVEC, int Chan) size_t EXTTXCHECK(PEXTPORTDATA PORTVEC, int Chan)
{ {
return (size_t)PORTVEC->PORT_EXT_ADDR(3, PORTVEC->PORTCONTROL.PORTNUMBER, Chan); uintptr_t Temp = Chan;
return (size_t)PORTVEC->PORT_EXT_ADDR(3, PORTVEC->PORTCONTROL.PORTNUMBER, (void *)Temp);
} }
VOID PostDataAvailable(TRANSPORTENTRY * Session) VOID PostDataAvailable(TRANSPORTENTRY * Session)
@ -578,8 +590,8 @@ extern VOID HDLCTXCHECK();
#endif #endif
extern VOID KISSINIT(), KISSTX(), KISSRX(), KISSTIMER(), KISSCLOSE(); extern VOID KISSINIT(), KISSTX(), KISSRX(), KISSTIMER(), KISSCLOSE();
extern VOID EXTINIT(), EXTTX(), LINKRX(), EXTRX(); extern VOID EXTINIT(PEXTPORTDATA PORTVEC), EXTTX(PEXTPORTDATA PORTVEC, MESSAGE * Buffer), LINKRX(), EXTRX(PEXTPORTDATA PORTVEC);
extern VOID LINKCLOSE(), EXTCLOSE() ,LINKTIMER(), EXTTIMER(); extern VOID LINKCLOSE(), EXTCLOSE() ,LINKTIMER(), EXTTIMER(PEXTPORTDATA PORTVEC);
// VECTORS TO HARDWARE DEPENDENT ROUTINES // VECTORS TO HARDWARE DEPENDENT ROUTINES
@ -609,7 +621,7 @@ extern int L4TimerProc();
extern int L3FastTimer(); extern int L3FastTimer();
extern int StatsTimer(); extern int StatsTimer();
extern int COMMANDHANDLER(); extern int COMMANDHANDLER();
extern int SDETX(); VOID SDETX(struct _LINKTABLE * LINK);
extern int L4BG(); extern int L4BG();
extern int L3BG(); extern int L3BG();
extern int TNCTimerProc(); extern int TNCTimerProc();
@ -628,7 +640,7 @@ BOOL Start()
APPLCALLS * APPL; APPLCALLS * APPL;
struct ROUTE * ROUTE; struct ROUTE * ROUTE;
struct DEST_LIST * DEST; struct DEST_LIST * DEST;
CMDX * CMD; struct CMDX * CMD;
int PortSlot = 1; int PortSlot = 1;
uintptr_t int3; uintptr_t int3;
@ -815,6 +827,15 @@ BOOL Start()
MQTT_PORT = cfg->C_MQTT_PORT; MQTT_PORT = cfg->C_MQTT_PORT;
strcpy(MQTT_USER, cfg->C_MQTT_USER); strcpy(MQTT_USER, cfg->C_MQTT_USER);
strcpy(MQTT_PASS, cfg->C_MQTT_PASS); strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
L4Compress = cfg->C_L4Compress;
L4CompMaxframe = cfg->C_L4CompMaxframe;
L4CompPaclen = cfg->C_L4CompPaclen;
if (L4CompMaxframe < 1 || L4CompMaxframe > 16)
L4CompMaxframe = 3;
if (L4CompPaclen < 64 || L4CompPaclen > 236)
L4CompPaclen = 236;
// Get pointers to PASSWORD and APPL1 commands // Get pointers to PASSWORD and APPL1 commands
@ -912,7 +933,7 @@ BOOL Start()
PORT->PROTOCOL = (char)PortRec->PROTOCOL; PORT->PROTOCOL = (char)PortRec->PROTOCOL;
PORT->IOBASE = PortRec->IOADDR; PORT->IOBASE = PortRec->IOADDR;
if (PortRec->SerialPortName[0]) if (PortRec->SerialPortName && PortRec->SerialPortName[0])
PORT->SerialPortName = _strdup(PortRec->SerialPortName); PORT->SerialPortName = _strdup(PortRec->SerialPortName);
else else
{ {
@ -1331,7 +1352,7 @@ BOOL Start()
ROUTE->NBOUR_PACLEN = Rcfg->ppacl; ROUTE->NBOUR_PACLEN = Rcfg->ppacl;
ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual; ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual;
ROUTE->NEIGHBOUR_FLAG = 1; // Locked ROUTE->NEIGHBOUR_FLAG = LOCKEDBYCONFIG; // Locked
Rcfg++; Rcfg++;
ROUTE++; ROUTE++;
@ -1836,12 +1857,11 @@ VOID ReadNodes()
if (ptr == NULL) continue; if (ptr == NULL) continue;
// I don't thinlk we should load locked flag from save file - only from config // I don't thinlk we should load locked flag from save file - only from config
// Now (2025) have two locked flags, from config or by sysop. Latter is saved and restored
// But need to parse it until I stop saving it
if (ptr[0] == '!') if (ptr[0] == '!')
{ {
// ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
} }
@ -1858,7 +1878,7 @@ VOID ReadNodes()
memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7); memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE - Digi'ed routes must be locked ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE - Digi'ed routes must be locked
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
@ -1914,6 +1934,14 @@ VOID ReadNodes()
if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE
ROUTE->OtherendsRouteQual = atoi(ptr); ROUTE->OtherendsRouteQual = atoi(ptr);
ptr = strtok_s(NULL, seps, &Context); // INP3
if (ptr == NULL) continue;
if (ptr[0] == '!')
{
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context);
}
continue; continue;
} }
@ -2342,7 +2370,7 @@ L2Packet:
PORT->L2FRAMESSENT++; PORT->L2FRAMESSENT++;
OutOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN; OutOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN;
PORT->PORTTXROUTINE(PORT, Buffer); PORT->PORTTXROUTINE((struct _EXTPORTDATA *)PORT, Buffer);
Sent++; Sent++;
continue; continue;
@ -2388,7 +2416,7 @@ PACTORLOOP:
PORT->L2FRAMESSENT++; PORT->L2FRAMESSENT++;
OutOctets[PORT->PORTNUMBER] += Message->LENGTH; OutOctets[PORT->PORTNUMBER] += Message->LENGTH;
PORT->PORTTXROUTINE(PORT, Buffer); PORT->PORTTXROUTINE((struct _EXTPORTDATA *)PORT, Buffer);
Sent++; Sent++;
if (Sent < 5) if (Sent < 5)
@ -2401,7 +2429,7 @@ ENDOFLIST:
break; break;
} }
PORT->PORTRXROUTINE(PORT); // SEE IF MESSAGE RECEIVED PORT->PORTRXROUTINE((struct _EXTPORTDATA *)PORT); // SEE IF MESSAGE RECEIVED
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;
} }
@ -2461,7 +2489,7 @@ VOID DoListenMonitor(TRANSPORTENTRY * L4, MESSAGE * Msg)
PDATAMESSAGE Buffer; PDATAMESSAGE Buffer;
char MonBuffer[1024]; char MonBuffer[1024];
int len; int len;
struct tm * TM;
UCHAR * monchars = (UCHAR *)Msg; UCHAR * monchars = (UCHAR *)Msg;
if (CountFramesQueuedOnSession(L4) > 10) if (CountFramesQueuedOnSession(L4) > 10)
@ -2472,13 +2500,18 @@ VOID DoListenMonitor(TRANSPORTENTRY * L4, MESSAGE * Msg)
IntSetTraceOptionsEx(L4->LISTEN, 1, 0, 0); IntSetTraceOptionsEx(L4->LISTEN, 1, 0, 0);
len = IntDecodeFrame(Msg, MonBuffer, Msg->Timestamp, L4->LISTEN, FALSE, TRUE); TM = gmtime(&Msg->Timestamp);
sprintf(MonBuffer, "%02d:%02d:%02d ", TM->tm_hour, TM->tm_min, TM->tm_sec);
len = IntDecodeFrame(Msg, &MonBuffer[9], Msg->Timestamp, L4->LISTEN, FALSE, TRUE);
IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI); IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
if (len == 0) if (len == 0)
return; return;
len += 9;
if (len > 256) if (len > 256)
len = 256; len = 256;

View File

@ -30,6 +30,9 @@ int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BO
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly); int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
int CountBits64(uint64_t in); int CountBits64(uint64_t in);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#define GetBuff() _GetBuff(__FILE__, __LINE__) #define GetBuff() _GetBuff(__FILE__, __LINE__)
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__) #define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__) #define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
@ -64,13 +67,13 @@ DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
int * port, int * sesstype, int * paclen, int * port, int * sesstype, int * paclen,
int * maxframe, int * l4window); int * maxframe, int * l4window);
#define LIBCONFIG_STATIC
#include "libconfig.h"
struct config_setting_t; int GetIntValue(config_setting_t * group, char * name);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
int GetIntValue(struct config_setting_t * group, char * name); VOID SaveIntValue(config_setting_t * group, char * name, int value);
BOOL GetStringValue(struct config_setting_t * group, char * name, char * value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
VOID SaveIntValue(struct config_setting_t * group, char * name, int value);
VOID SaveStringValue(struct config_setting_t * group, char * name, char * value);
int EncryptPass(char * Pass, char * Encrypt); int EncryptPass(char * Pass, char * Encrypt);
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len); VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
@ -92,7 +95,6 @@ VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID DoTheCommand(TRANSPORTENTRY * Session); VOID DoTheCommand(TRANSPORTENTRY * Session);
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len); char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer); VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
char * FormatUptime(int Uptime);
char * strlop(char * buf, char delim); char * strlop(char * buf, char delim);
BOOL CompareCalls(UCHAR * c1, UCHAR * c2); BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
@ -109,7 +111,7 @@ int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
VOID SENDL4CONNECT(TRANSPORTENTRY * Session); VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
VOID CloseSessionPartner(TRANSPORTENTRY * Session); VOID CloseSessionPartner(TRANSPORTENTRY * Session);
int COUNTNODES(); int COUNTNODES(struct ROUTE * ROUTE);
int DecodeNodeName(char * NodeName, char * ptr);; int DecodeNodeName(char * NodeName, char * ptr);;
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer); VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK); int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
@ -156,7 +158,7 @@ Dll int APIENTRY SaveNodes ();
struct SEM; struct SEM;
void GetSemaphore(struct SEM * Semaphore, int ID); void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
void MySetWindowText(HWND hWnd, char * Msg); void MySetWindowText(HWND hWnd, char * Msg);
@ -359,7 +361,7 @@ extern char * ConfigBuffer;
extern char * WL2KReportLine[]; extern char * WL2KReportLine[];
extern CMDX COMMANDS[]; extern struct CMDX COMMANDS[];
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN; extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
extern char CMDALIAS[ALIASLEN][NumberofAppls]; extern char CMDALIAS[ALIASLEN][NumberofAppls];

View File

@ -208,10 +208,6 @@ VOID md5(char *arg, unsigned char * checksum);
int APIENTRY SendRaw(int port, char * msg, int len); int APIENTRY SendRaw(int port, char * msg, int len);
BOOL MySetDlgItemText();
VOID OutputDebugString(char * string); VOID OutputDebugString(char * string);
#endif #endif

View File

@ -119,7 +119,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -187,7 +187,7 @@ int FromLOC(char * Locator, double * pLat, double * pLon);
VOID Consoleprintf(const char * format, ...) VOID Consoleprintf(const char * format, ...)
{ {
char Mess[255]; char Mess[512];
va_list(arglist); va_list(arglist);
va_start(arglist, format); va_start(arglist, format);
@ -307,7 +307,8 @@ static char *keywords[] =
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL", "APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed "BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", "LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS" "EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS",
"L4Compress", "L4CompMaxframe", "L4CompPaclen"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -328,7 +329,8 @@ static void * offset[] =
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual, &xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed &xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs, &xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS}; /* offset for corresponding data in config file */ &xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS,
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -348,7 +350,8 @@ static int routine[] =
14, 14 ,14, 14, 14, 14 ,14, 14,
15, 0, 2, 9, 9, 15, 0, 2, 9, 9,
2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20} ; // Routine to process param 2, 2, 0, 1, 20, 20,
1, 1, 1} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int); int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int); //int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -370,8 +373,7 @@ static char *pkeywords[] =
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY", "BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE", "UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE", "IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort"}; /* parameter keywords */
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -512,7 +514,6 @@ BOOL ProcessConfig()
if ((fp1 = fopen(inputname,"r")) == NULL) if ((fp1 = fopen(inputname,"r")) == NULL)
{ {
Consoleprintf("Could not open file %s Error code %d", inputname, errno); Consoleprintf("Could not open file %s Error code %d", inputname, errno);
return FALSE; return FALSE;
} }
@ -617,6 +618,10 @@ BOOL ProcessConfig()
paramok[83]=1; // MQTT Params paramok[83]=1; // MQTT Params
paramok[84]=1; // MQTT Params paramok[84]=1; // MQTT Params
paramok[85]=1; // MQTT Params paramok[85]=1; // MQTT Params
paramok[86]=1; // L4Compress
paramok[87]=1; // L4Compress Maxframe
paramok[88]=1; // L4Compress Paclen
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
{ {
@ -649,7 +654,7 @@ BOOL ProcessConfig()
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0) if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{ {
Consoleprintf(""); Consoleprintf("");
Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg"); Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE"); Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf(""); Consoleprintf("");
@ -1532,7 +1537,7 @@ int dotext(char * val, char * key_word, int max)
if (len > max) if (len > max)
{ {
Consoleprintf("Text too long: %s\r\n",key_word); Consoleprintf("Text too long: %s (max %d\r\n",key_word, max);
return(0); return(0);
} }
@ -1755,8 +1760,7 @@ int tncports(int i)
/* FIND OCCURENCE OF ONE STRING WITHIN ANOTHER */ /* FIND OCCURENCE OF ONE STRING WITHIN ANOTHER */
/************************************************************************/ /************************************************************************/
int xindex(s, t) int xindex(char s[], char t[])
char s[], t[];
{ {
int i, j ,k; int i, j ,k;
@ -1775,8 +1779,7 @@ char s[], t[];
/* FIND FIRST OCCURENCE OF A CHARACTER THAT IS NOT c */ /* FIND FIRST OCCURENCE OF A CHARACTER THAT IS NOT c */
/************************************************************************/ /************************************************************************/
int verify(s, c) int verify(char s[], char c)
char s[], c;
{ {
int i; int i;
@ -2297,10 +2300,7 @@ int decode_port_rec(char * rec)
} }
int doid(i, value, rec) int doid(int i, char value[], char rec[])
int i;
char value[];
char rec[];
{ {
unsigned int j; unsigned int j;
for (j = 3;( j < (unsigned int)strlen(rec)+1); j++) for (j = 3;( j < (unsigned int)strlen(rec)+1); j++)
@ -2334,10 +2334,7 @@ char rec[];
return(1); return(1);
} }
int dodll(i, value, rec) int dodll(int i, char value[], char rec[])
int i;
char value[];
char rec[];
{ {
unsigned int j; unsigned int j;
@ -2412,11 +2409,11 @@ int doSerialPortName(int i, char * value, char * rec)
{ {
rec += 8; rec += 8;
if (strlen(rec) > 79) if (strlen(rec) > 250)
{ {
Consoleprintf("Serial Port Name too long - Truncated"); Consoleprintf("Serial Port Name too long - Truncated");
Consoleprintf("%s\r\n",rec); Consoleprintf("%s\r\n",rec);
rec[79] = 0; rec[250] = 0;
} }
strlop(rec, ' '); strlop(rec, ' ');
@ -2424,7 +2421,7 @@ int doSerialPortName(int i, char * value, char * rec)
if (IsNumeric(rec)) if (IsNumeric(rec))
xxp.IOADDR = atoi(rec); xxp.IOADDR = atoi(rec);
else else
strcpy(xxp.SerialPortName, rec); xxp.SerialPortName = _strdup(rec);
return 1; return 1;
} }
@ -2457,10 +2454,7 @@ int doKissCommand(int i, char * value, char * rec)
} }
int hwtypes(i, value, rec) int hwtypes(int i, char value[], char rec[])
int i;
char value[];
char rec[];
{ {
hw = 255; hw = 255;
if (_stricmp(value,"ASYNC") == 0) if (_stricmp(value,"ASYNC") == 0)
@ -2543,10 +2537,7 @@ char rec[];
return(1); return(1);
} }
int protocols(i, value, rec) int protocols(int i, char value[], char rec[])
int i;
char value[];
char rec[];
{ {
int hw; int hw;
@ -2580,10 +2571,7 @@ char rec[];
} }
int bbsflag(i, value, rec) int bbsflag(int i, char value[],char rec[])
int i;
char value[];
char rec[];
{ {
int hw=255; int hw=255;
@ -2634,10 +2622,7 @@ int validcalls(int i, char * value, char * rec)
} }
int kissoptions(i, value, rec) int kissoptions(int i, char value[], char rec[])
int i;
char value[];
char rec[];
{ {
int err=255; int err=255;
@ -2689,7 +2674,19 @@ static int troutine[] =
#define TPARAMLIM 6 #define TPARAMLIM 6
extern CMDX TNCCOMMANDLIST[];
typedef struct _TCMDX
{
char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH
VOID (* CMDPROC)(struct TNCDATA * TNC, char * Tail, struct _TCMDX * CMD);// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset
} TCMDX;
extern TCMDX TNCCOMMANDLIST[];
extern int NUMBEROFTNCCOMMANDS; extern int NUMBEROFTNCCOMMANDS;
int decode_tnc_rec(char * rec) int decode_tnc_rec(char * rec)
@ -2766,7 +2763,7 @@ int decode_tnc_rec(char * rec)
// Try process as TNC2 Command // Try process as TNC2 Command
int n = 0; int n = 0;
CMDX * CMD = &TNCCOMMANDLIST[0]; TCMDX * CMD = &TNCCOMMANDLIST[0];
char * ptr1 = key_word; char * ptr1 = key_word;
UCHAR * valueptr; UCHAR * valueptr;

View File

@ -67,7 +67,7 @@ struct PORTCONFIG
char Pad2[10]; // 246 char Pad2[10]; // 246
char VALIDCALLS[256]; // 256 - 512 char VALIDCALLS[256]; // 256 - 512
struct WL2KInfo * WL2K; // 512 struct WL2KInfo * WL2K; // 512
char SerialPortName[80]; // 516 char * SerialPortName; // 516
struct XDIGI * XDIGIS; // 596 Cross port digi setup struct XDIGI * XDIGIS; // 596 Cross port digi setup
int RIGPORT; // Linked port with RigControl int RIGPORT; // Linked port with RigControl
unsigned int PERMITTEDAPPLS; // Appls allowed on this port unsigned int PERMITTEDAPPLS; // Appls allowed on this port
@ -170,6 +170,10 @@ struct CONFIGTABLE
int C_MQTT_PORT; int C_MQTT_PORT;
char C_MQTT_USER[80]; char C_MQTT_USER[80];
char C_MQTT_PASS[80]; char C_MQTT_PASS[80];
int C_L4Compress;
int C_L4CompMaxframe;
int C_L4CompPaclen;
//#define ApplOffset 80000 // Applications offset in config buffer //#define ApplOffset 80000 // Applications offset in config buffer
//#define InfoOffset 85000 // Infomsg offset in buffer //#define InfoOffset 85000 // Infomsg offset in buffer

72
debian/changelog vendored
View File

@ -1,3 +1,75 @@
linbpq (6.0.24.66+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Update postinst script to be a little quieter
* MINI_BUILDD_OPTION:
auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Tue, 11 Mar 2025 00:51:35 +0000
linbpq (6.0.24.66+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.66+repack
-- Dave Hibberd <hibby@debian.org> Tue, 04 Mar 2025 22:50:09 +0000
linbpq (6.0.24.65+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
-- Dave Hibberd <hibby@debian.org> Tue, 25 Feb 2025 09:33:24 +0000
linbpq (6.0.24.59a+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* Little tweaks to makefile patch to account for new -rdynamic
-- Dave Hibberd <hibby@debian.org> Mon, 03 Feb 2025 22:32:11 +0000
linbpq (6.0.24.56+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
-- Dave Hibberd <hibby@debian.org> Mon, 06 Jan 2025 21:37:44 +0000
linbpq (6.0.24.55+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* d/rules
- Increased hardening
-- Dave Hibberd <hibby@debian.org> Sun, 05 Jan 2025 23:35:06 +0000
linbpq (6.0.24.54+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* Drop AGW Patch
* Drop Spelling Patch
* Drop Dynamic Links patch
-- Dave Hibberd <hibby@debian.org> Tue, 17 Dec 2024 16:46:05 +0000
linbpq (6.0.24.53+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream
- Patches refreshed
- dropped some edits in ftbfs-gcc14
- dropped d/patches/headers.patch
-- Dave Hibberd <hibby@debian.org> Tue, 03 Dec 2024 00:57:57 +0000
linbpq (6.0.24.52+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream
- Patches happy
-- Dave Hibberd <hibby@debian.org> Sat, 30 Nov 2024 21:47:17 +0000
linbpq (6.0.24.51.1+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Iron out an issue with time...
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 19:57:28 +0000
linbpq (6.0.24.51.1+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium linbpq (6.0.24.51.1+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import after bug report * New upstream import after bug report

9
debian/control vendored
View File

@ -2,11 +2,12 @@ Source: linbpq
Section: hamradio Section: hamradio
Priority: optional Priority: optional
Maintainer: Dave Hibberd <hibby@debian.org> Maintainer: Dave Hibberd <hibby@debian.org>
Standards-Version: 4.7.0.0 Standards-Version: 4.7.1
Vcs-Browser: https://github.com/Online-Amateur-Radio-Club-M0OUK/oarc-bpqnode Vcs-Browser: https://git.hibbian.org/Hibbian/linbpq
Vcs-Git: https://github.com/Online-Amateur-Radio-Club-M0OUK/oarc-bpqnode.git Vcs-Git: https://git.hibbian.org/Hibbian/linbpq.git
Homepage: https://www.cantab.net/users/john.wiseman/Documents/ Homepage: https://www.cantab.net/users/john.wiseman/Documents/
Build-Depends: debhelper-compat (= 13), libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev, libpng-dev Build-Depends: debhelper-compat (= 13)
Build-Depends-Arch: libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev, libpng-dev
Rules-Requires-Root: no Rules-Requires-Root: no
Package: linbpq Package: linbpq

View File

@ -1,44 +0,0 @@
--- a/LinBPQ.c
+++ b/LinBPQ.c
@@ -717,7 +717,7 @@
}
-#include "getopt.h"
+#include <getopt.h>
static struct option long_options[] =
{
--- a/DRATS.c
+++ b/DRATS.c
@@ -563,7 +563,7 @@
#define ZEXPORT __stdcall
#endif
-#include "zlib.h"
+#include <zlib.h>
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen)
--- a/HTTPcode.c
+++ b/HTTPcode.c
@@ -38,7 +38,7 @@
#define ZEXPORT __stdcall
#endif
-#include "zlib.h"
+#include <zlib.h>
#define CKernel
#include "httpconnectioninfo.h"
--- a/IPCode.c
+++ b/IPCode.c
@@ -97,8 +97,6 @@
#include "pcap.h"
-int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
-
#ifndef LINBPQ
#include "kernelresource.h"
LRESULT CALLBACK ResWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

View File

@ -1,22 +0,0 @@
--- a/Multicast.c
+++ b/Multicast.c
@@ -620,7 +620,7 @@
int r;
UINT rlen;
- UINT outlen;
+ size_t outlen;
memcpy(&rlen, &Decoded[5], 4);
--- a/AGWAPI.c
+++ b/AGWAPI.c
@@ -128,7 +128,7 @@
int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
int SendDataToAppl(int Stream, byte * Buffer, int Length);
-int InternalAGWDecodeFrame(char * msg, char * buffer, int Stamp, int * FrameType, int useLocalTime, int doNodes);
+int InternalAGWDecodeFrame(char * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes);
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
int ShowApps();

View File

@ -1,259 +0,0 @@
--- /dev/null
+++ b/bpqheaders.h
@@ -0,0 +1,8 @@
+//Header for an easier build under debian GCC-14
+#include <stdio.h>
+#include <time.h>
+#include <fcntl.h>
+
+int CanPortDigi(int Port);
+
+int KissEncode(unsigned char * inbuff, unsigned char * outbuff, int len);
--- a/cMain.c
+++ b/cMain.c
@@ -29,9 +29,10 @@
//#include "windows.h"
//#include "winerror.h"
-#include "time.h"
-#include "stdio.h"
+#include <time.h>
+#include <stdio.h>
#include <fcntl.h>
+#include "bpqheaders.h"
#include "kernelresource.h"
#include "CHeaders.h"
--- a/CHeaders.h
+++ b/CHeaders.h
@@ -93,7 +93,7 @@
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
char * FormatUptime(int Uptime);
-char * strlop(char * buf, char delim);
+char * strlop(const char * buf, char delim);
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
VOID PostDataAvailable(TRANSPORTENTRY * Session);
@@ -438,7 +438,6 @@
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
-
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
--- a/WinRPR.c
+++ b/WinRPR.c
@@ -63,7 +63,6 @@
static RECT Rect;
VOID __cdecl Debugprintf(const char * format, ...);
-char * strlop(char * buf, char delim);
char NodeCall[11]; // Nodecall, Null Terminated
--- a/bpqmail.h
+++ b/bpqmail.h
@@ -877,7 +877,6 @@
};
VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...);
-char * strlop(char * buf, char delim);
int rt_cmd(CIRCUIT *circuit, char * Buffer);
CIRCUIT *circuit_new(CIRCUIT *circuit, int flags);
VOID BBSputs(CIRCUIT * conn, char * buf);
--- a/APRSCode.c
+++ b/APRSCode.c
@@ -63,7 +63,6 @@
VOID __cdecl Consoleprintf(const char * format, ...);
BOOL APIENTRY Send_AX(PMESSAGE Block, DWORD Len, UCHAR Port);
VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port);
-char * strlop(char * buf, char delim);
int APRSDecodeFrame(char * msg, char * buffer, time_t Stamp, uint64_t Mask); // Unsemaphored DecodeFrame
APRSHEARDRECORD * UpdateHeard(UCHAR * Call, int Port);
BOOL CheckforDups(char * Call, char * Msg, int Len);
--- a/FLDigi.c
+++ b/FLDigi.c
@@ -101,8 +101,6 @@
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
-char * strlop(char * buf, char delim);
-
extern UCHAR BPQDirectory[];
#define MAXMPSKPORTS 16
--- a/MULTIPSK.c
+++ b/MULTIPSK.c
@@ -71,8 +71,6 @@
static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg);
VOID SendRPBeacon(struct TNCINFO * TNC);
-char * strlop(char * buf, char delim);
-
extern UCHAR BPQDirectory[];
#define MAXMPSKPORTS 16
--- a/AGWMoncode.c
+++ b/AGWMoncode.c
@@ -61,7 +61,6 @@
#define NODES_SIG 0xFF
-char * strlop(char * buf, char delim);
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes);
--- a/Bpq32.c
+++ b/Bpq32.c
@@ -1420,7 +1420,6 @@
VOID FindLostBuffers();
BOOL InitializeTNCEmulator();
VOID TNCTimer();
-char * strlop(char * buf, char delim);
DllExport int APIENTRY Get_APPLMASK(int Stream);
DllExport int APIENTRY GetStreamPID(int Stream);
--- a/CMSAuth.c
+++ b/CMSAuth.c
@@ -31,7 +31,7 @@
#include <windows.h>
#endif
-char * strlop(char * buf, char delim);
+char * strlop(const char * buf, char delim);
VOID APIENTRY md5 (char *arg, unsigned char * checksum);
--- a/FLDigi64.c
+++ b/FLDigi64.c
@@ -102,8 +102,6 @@
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
-char * strlop(char * buf, char delim);
-
extern UCHAR BPQDirectory[];
#define MAXBPQPORTS 32
--- a/HTTPcode.c
+++ b/HTTPcode.c
@@ -102,7 +102,6 @@
extern UCHAR ConfigDirectory[260];
-char * strlop(char * buf, char delim);
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b);
--- a/MULTIPSK64.c
+++ b/MULTIPSK64.c
@@ -74,8 +74,6 @@
static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg);
VOID SendRPBeacon(struct TNCINFO * TNC);
-char * strlop(char * buf, char delim);
-
extern UCHAR BPQDirectory[];
#define MAXBPQPORTS 32
--- a/Moncode.c
+++ b/Moncode.c
@@ -59,7 +59,6 @@
#define NODES_SIG 0xFF
-char * strlop(char * buf, char delim);
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen);
char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen);
--- a/NodeMapTest.c
+++ b/NodeMapTest.c
@@ -201,7 +201,6 @@
int ConvFromAX25(unsigned char * incall, char * outcall);
void GenerateOutputFiles(time_t Now);
void UpdateHeardData(struct NodeData * Node, struct NodeData * Call, char * Freq, char * LOC, char * Flags);
-char * strlop(char * buf, char delim);
void ProcessChatUpdate(char * From, char * Msg);
void ProcessNodeUpdate(char * From, char * Msg);
--- a/SCSTracker.c
+++ b/SCSTracker.c
@@ -52,7 +52,6 @@
static RECT Rect;
VOID __cdecl Debugprintf(const char * format, ...);
-char * strlop(char * buf, char delim);
char NodeCall[11]; // Nodecall, Null Terminated
--- a/TelnetV6.c
+++ b/TelnetV6.c
@@ -127,8 +127,6 @@
static int ProcessLine(char * buf, int Port);
VOID __cdecl Debugprintf(const char * format, ...);
-char * strlop(char * buf, char delim);
-
int DisplaySessions(struct TNCINFO * TNC);
int DoStateChange(int Stream);
--- a/UIARQ.c
+++ b/UIARQ.c
@@ -78,7 +78,6 @@
VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port);
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer);
-char * strlop(char * buf, char delim);
extern UCHAR BPQDirectory[];
extern char MYALIASLOPPED[10];
--- a/bpqchat.h
+++ b/bpqchat.h
@@ -603,7 +603,6 @@
VOID nputs(ChatCIRCUIT * conn, char * buf);
#endif
BOOL matchi(char * p1, char * p2);
-char * strlop(char * buf, char delim);
int rt_cmd(ChatCIRCUIT *circuit, char * Buffer);
ChatCIRCUIT *circuit_new(ChatCIRCUIT *circuit, int flags);
void makelinks(void);
@@ -775,4 +774,4 @@
struct ConsoleInfo * ConsHeader[2];
-extern BOOL LogCHAT;
\ No newline at end of file
+extern BOOL LogCHAT;
--- a/SCSTrackeMulti.c
+++ b/SCSTrackeMulti.c
@@ -48,7 +48,6 @@
static RECT Rect;
VOID __cdecl Debugprintf(const char * format, ...);
-char * strlop(char * buf, char delim);
BOOL KAMStartPort(struct PORTCONTROL * PORT);
BOOL KAMStopPort(struct PORTCONTROL * PORT);
--- a/SCSTrackeMulti64.c
+++ b/SCSTrackeMulti64.c
@@ -52,7 +52,6 @@
struct TNCINFO * TNCInfo[34]; // Records are Malloc'd
VOID __cdecl Debugprintf(const char * format, ...);
-char * strlop(char * buf, char delim);
BOOL KAMStartPort(struct PORTCONTROL * PORT);
BOOL KAMStopPort(struct PORTCONTROL * PORT);
--- a/CommonCode.c
+++ b/CommonCode.c
@@ -571,7 +571,7 @@
return ptr;
}
-char * strlop(char * buf, char delim)
+char * strlop(const char * buf, char delim)
{
// Terminate buf at delim, and return rest of string

View File

@ -15,13 +15,13 @@
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
+CFLAGS:=$(shell dpkg-buildflags --get CFLAGS) +CFLAGS:=$(shell dpkg-buildflags --get CFLAGS)
+CFLAGS+=$(shell dpkg-buildflags --get CPPFLAGS) +CFLAGS+=$(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) +LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS)
+ +
+all: CFLAGS += -DLINBPQ -MMD -g -fcommon +all: CFLAGS += -DLINBPQ -MMD -g -fcommon -rdynamic
+all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lrt -lm -lz -lpthread -lconfig -lpcap -lpng +all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lrt -lm -lz -lpthread -lconfig -lpcap -lpng
all: linbpq all: linbpq

View File

@ -1,5 +1,2 @@
headers.patch spelling-fixes.patch
ftbfs-gcc14.patch
spelling-errors.patch
makefile makefile
dynamic-links

View File

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

11
debian/patches/spelling-fixes.patch vendored Normal file
View File

@ -0,0 +1,11 @@
--- a/UZ7HODrv.c
+++ b/UZ7HODrv.c
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}

4
debian/postinst vendored
View File

@ -21,8 +21,12 @@ if [ "$1" = configure ]; then
# unknown adduser error, simply exit # unknown adduser error, simply exit
exit 1 exit 1
} }
if ! id -nGz linbpq | grep -qzxF 'dialout' ; then
adduser linbpq dialout adduser linbpq dialout
fi
if ! id -nGz linbpq | grep -qzxF 'plugdev' ; then
adduser linbpq plugdev adduser linbpq plugdev
fi
chown :linbpq /opt/oarc/bpq chown :linbpq /opt/oarc/bpq
chmod 775 /opt/oarc/bpq chmod 775 /opt/oarc/bpq

Some files were not shown because too many files have changed in this diff Show More