Compare commits

..

No commits in common. "hibbian/latest" and "upstream/6.0.24.59a+repack" have entirely different histories.

125 changed files with 44263 additions and 9440 deletions

139
.rej Normal file
View file

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

View file

@ -1412,11 +1412,10 @@ VOID * SIXPACKExtInit(EXTPORTDATA * PortEntry)
TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo)); TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_SIXPACK;
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

@ -382,8 +382,7 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_AEA;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
TNC->TEXTMODE = FALSE; TNC->TEXTMODE = FALSE;
@ -391,6 +390,8 @@ 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

@ -36,8 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
struct AGWHeader struct AGWHeader
{ {
uint8_t Port; unsigned int Port;
uint8_t filler1[3];
unsigned char DataKind; unsigned char DataKind;
unsigned char filler2; unsigned char filler2;
unsigned char PID; unsigned char PID;
@ -129,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(MESSAGE * msg, char * buffer, time_t 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();
@ -721,7 +720,7 @@ int AGWDoMonitorData()
RawLen = monbuff->LENGTH; RawLen = monbuff->LENGTH;
if (RawLen < MSGHDDRLEN || RawLen > 350) if (RawLen < 7 || RawLen > 350)
{ {
ReleaseBuffer(monbuff); ReleaseBuffer(monbuff);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
@ -736,15 +735,11 @@ int AGWDoMonitorData()
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
// Set monbuff to point to the copy
monbuff = (MESSAGE *)Buffer;
//' 4 byte chain //' 4 byte chain
//' 1 byte port - top bit = transmit //' 1 byte port - top bit = transmit
//' 2 byte length (LO-HI) //' 2 byte length (LO-HI)
Port = monbuff->PORT; Port = Buffer[4];
if (Port > 127) if (Port > 127)
{ {
@ -756,12 +751,6 @@ int AGWDoMonitorData()
RXFlag = TRUE; RXFlag = TRUE;
} }
if (Port == 0)
{
Debugprintf("AGWMON Port number is zero");
return 0;
}
// Can now have different mon flags per connection, so need to run decode for each socket // Can now have different mon flags per connection, so need to run decode for each socket
for (n = 1; n<= CurrentSockets; n++) for (n = 1; n<= CurrentSockets; n++)
@ -770,7 +759,7 @@ int AGWDoMonitorData()
if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag)) if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag))
{ {
Length = InternalAGWDecodeFrame(monbuff, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes); Length = InternalAGWDecodeFrame(Buffer, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes);
if (Length > 0) if (Length > 0)
{ {
@ -814,7 +803,7 @@ int AGWDoMonitorData()
} }
} }
RawLen = RawLen - (MSGHDDRLEN - 1); // One more for KISS control RawLen = RawLen - 6;
if (RXFlag || Loopflag) // Send transmitted frames if requested if (RXFlag || Loopflag) // Send transmitted frames if requested
{ {
@ -823,11 +812,7 @@ int AGWDoMonitorData()
// Send raw data to any sockets that have requested Raw frames // Send raw data to any sockets that have requested Raw frames
// //
// Format is ax.25 packet prceeded by a KISS command byte 00 for channel 1 0x10 for channel 2 etc Buffer[6]=0;
// As this is an application API I think all should go as Port 1
Buffer[MSGHDDRLEN - 1] = 0; // Just in case big-endian
AGWTXHeader.Port = Port - 1; // AGW Ports start from 0 AGWTXHeader.Port = Port - 1; // AGW Ports start from 0
AGWTXHeader.DataKind = 'K'; AGWTXHeader.DataKind = 'K';
@ -839,12 +824,14 @@ int AGWDoMonitorData()
sockptr=&Sockets[n]; sockptr=&Sockets[n];
if (sockptr->SocketActive && sockptr->RawFlag) if (sockptr->SocketActive && sockptr->RawFlag)
SendRawPacket(sockptr, &Buffer[MSGHDDRLEN - 1], RawLen); SendRawPacket(sockptr, &Buffer[6], RawLen);
} }
} }
} }
return 0; return 0;
} }
int DeleteConnection(struct BPQConnectionInfo * Con) int DeleteConnection(struct BPQConnectionInfo * Con)
@ -1141,7 +1128,6 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr) int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
{ {
int AGWVersion[2]={2003,999}; int AGWVersion[2]={2003,999};
byte AGWPortCaps[12] = { 0, 255, 30, 10, 63, 10, 4, 0, 1, 0, 0, 0 };
char AGWRegReply[1]; char AGWRegReply[1];
struct BPQConnectionInfo * Connection; struct BPQConnectionInfo * Connection;
int Stream; int Stream;
@ -1156,7 +1142,6 @@ 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
@ -1209,9 +1194,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
// Need to convert port index (used by AGW) to port number // Need to convert port index (used by AGW) to port number
conport=GetPortNumber(VisiblePortToRealPort[key[0]-49] + 1); conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]);
n = sprintf(ConnectMsg,"C %d %s",conport,ToCall); sprintf(ConnectMsg,"C %d %s",conport,ToCall);
// if 'v' command add digis // if 'v' command add digis
@ -1226,7 +1211,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
while(nDigis--) while(nDigis--)
{ {
n += sprintf(&ConnectMsg[n], " %s", Digis); sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis);
Digis += 10; Digis += 10;
} }
} }
@ -1307,7 +1292,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
// Version // Version
memset(&AGWTXHeader,0,36); memset(&AGWTXHeader,0,36);
AGWTXHeader.DataKind = 'R'; AGWTXHeader.DataKind = 'R';
AGWTXHeader.DataLength = 8; // Length AGWTXHeader.DataLength = 8; // Length
SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]); SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]);
@ -1321,7 +1308,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
memset(&AGWTXHeader,0,36); memset(&AGWTXHeader,0,36);
AGWTXHeader.DataKind = 'G'; AGWTXHeader.DataKind = 'G';
AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length
SendtoSocket(sockptr->socket, AGWPorts); SendtoSocket(sockptr->socket, AGWPorts);
@ -1329,20 +1318,6 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
return 0; return 0;
case 'g':
// Port capabilities. Currently hard-coded.
AGWTXHeader.Port = sockptr->AGWRXHeader.Port;
AGWTXHeader.DataKind = 'g';
AGWTXHeader.DataLength = 12;
SendtoSocket(sockptr->socket, (char *)&AGWPortCaps[0]);
return 0;
case 'k': case 'k':
// Toggle Raw receive // Toggle Raw receive
@ -1440,8 +1415,6 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
AGWTXHeader.DataKind = 'X'; AGWTXHeader.DataKind = 'X';
memcpy(&AGWTXHeader.callfrom, RegCall, 10);
AGWTXHeader.DataLength = 1; // Length AGWTXHeader.DataLength = 1; // Length
AGWRegReply[0] = 1; AGWRegReply[0] = 1;

View file

@ -49,14 +49,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define DM 0x0F #define DM 0x0F
#define UA 0x63 #define UA 0x63
#define FRMR 0x87 #define FRMR 0x87
#define XID 0xAF
#define TEST 0xE3
#define RR 1 #define RR 1
#define RNR 5 #define RNR 5
#define REJ 9 #define REJ 9
#define SREJ 0x0D
#define SABME 0x6F
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
@ -266,18 +261,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
strcpy(SUP, "FRMR"); strcpy(SUP, "FRMR");
FRMRFLAG = 1; FRMRFLAG = 1;
break; break;
case XID:
strcpy(SUP, "XID");
XIDFLAG = 1;
break;
case TEST:
strcpy(SUP, "TEST");
TESTFLAG = 1;
break;
} }
Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR); Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR);
@ -287,7 +270,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
// Super // Super
int NR = (CTL >> 5) & 7; int NR = (CTL >> 5) & 7;
char SUP[5] = "??"; char SUP[4] = "??";
switch (CTL & 0x0F) switch (CTL & 0x0F)
{ {
@ -305,13 +288,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
strcpy(SUP, "REJ"); strcpy(SUP, "REJ");
break; break;
case SREJ:
strcpy(SUP, "SREJ");
break;
} }
Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR); Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
@ -324,72 +300,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
if (FRMRFLAG) if (FRMRFLAG)
Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]); Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]);
if (XIDFLAG)
{
// Decode and display XID
UCHAR * ptr = &ADJBUFFER->PID;
if (*ptr++ == 0x82 && *ptr++ == 0x80)
{
int Type;
int Len;
unsigned int value;
int xidlen = *(ptr++) << 8;
xidlen += *ptr++;
// XID is set of Type, Len, Value n-tuples
// G8BPQ-2>G8BPQ:(XID cmd, p=1) Half-Duplex SREJ modulo-128 I-Field-Length-Rx=256 Window-Size-Rx=32 Ack-Timer=3000 Retries=10
while (xidlen > 0)
{
Type = *ptr++;
Len = *ptr++;
value = 0;
xidlen -= (Len + 2);
while (Len--)
{
value <<=8;
value += *ptr++;
}
switch(Type)
{
case 2: //Bin fields
case 3:
Output += sprintf((char *)Output, " %d=%x", Type, value);
break;
case 6: //RX Size
Output += sprintf((char *)Output, " RX Paclen=%d", value / 8);
break;
case 8: //RX Window
Output += sprintf((char *)Output, " RX Window=%d", value);
break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
}
}
}
}
if (Info) if (Info)
{ {
// We have an info frame // We have an info frame
@ -509,14 +419,6 @@ UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNo
return Output; return Output;
} }
if (ADJBUFFER->L2DATA[0] == 0xfe) // Paula's Nodes Poll
{
memcpy(Alias, ++ptr, 6);
Output += sprintf((char *)Output, " NODES POLL from %s\r", Alias);
return Output;
}
// Display normal NET/ROM transmissions // Display normal NET/ROM transmissions
Output += sprintf((char *)Output, " NET/ROM\r "); Output += sprintf((char *)Output, " NET/ROM\r ");

View file

@ -760,7 +760,7 @@ void SaveVesselDataBase()
void LoadNavAidDataBase() void LoadNavAidDataBase()
{ {
int i, n, count; int i;
FILE *file; FILE *file;
char buf[256]; char buf[256];
@ -793,12 +793,10 @@ 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[count] = navptr; NavRecords[i] = navptr;
memset(navptr, 0, sizeof(struct NAVAIDRECORD)); memset(navptr, 0, sizeof(struct NAVAIDRECORD));
fgets(buf, 255, file); fgets(buf, 255, file);
@ -809,19 +807,6 @@ 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);
@ -835,7 +820,6 @@ void LoadNavAidDataBase()
navptr->TimeLastUpdated = atoi(token); navptr->TimeLastUpdated = atoi(token);
} }
NavAidCount = count;
fclose(file); fclose(file);
} }

View file

@ -553,8 +553,6 @@ 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,9 +574,8 @@ int APRSWriteLog(char * msg)
strcat(Value, "logs/APRS_"); strcat(Value, "logs/APRS_");
} }
n = strlen(Value); sprintf(Value, "%s%02d%02d%02d.log", 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;

9223
APRSCode.c.orig Normal file

File diff suppressed because it is too large Load diff

139
APRSCode.c.rej Normal file
View file

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

77
ARDOP.c
View file

@ -62,12 +62,6 @@ int (WINAPI FAR *EnumProcessesPtr)();
#include "tncinfo.h" #include "tncinfo.h"
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
#define WSA_ACCEPT WM_USER + 1 #define WSA_ACCEPT WM_USER + 1
#define WSA_DATA WM_USER + 2 #define WSA_DATA WM_USER + 2
#define WSA_CONNECT WM_USER + 3 #define WSA_CONNECT WM_USER + 3
@ -142,7 +136,6 @@ 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].Connected = 0;
TNC->Streams[0].Attached = 0; TNC->Streams[0].Attached = 0;
@ -573,7 +566,7 @@ static int ProcessLine(char * buf, int Port)
} }
void ARDOPThread(VOID * Param); void ARDOPThread(struct TNCINFO * TNC);
VOID ARDOPProcessDataSocketData(int port); VOID ARDOPProcessDataSocketData(int port);
int ConnecttoARDOP(struct TNCINFO * TNC); int ConnecttoARDOP(struct TNCINFO * TNC);
static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC); static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
@ -894,10 +887,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))
{ {
Debugprintf("ARDOP closing session on SessionTimelimit");
ARDOPSendCommand(TNC, "DISCONNECT", TRUE); ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
STREAM->ReportDISC = 1; STREAM->Disconnecting = TRUE;
STREAM->AttachTime = 0;
} }
} }
@ -907,7 +898,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime)) if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
{ {
Debugprintf("ARDOP closing session on AttachTimelimit");
STREAM->ReportDISC = 1; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0; STREAM->AttachTime = 0;
} }
@ -1502,10 +1492,7 @@ 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)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -1992,7 +1979,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->LogPath) if (TNC->LogPath)
ARDOPOpenLogFiles(TNC); ARDOPOpenLogFiles(TNC);
@ -2005,7 +1991,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP; TNC->Hardware = H_ARDOP;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -2013,6 +1999,7 @@ 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);
@ -2067,12 +2054,21 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
strcat(TempScript, "ARQTIMEOUT 90\r"); strcat(TempScript, "ARQTIMEOUT 90\r");
// strcat(TempScript, "ROBUST False\r"); // strcat(TempScript, "ROBUST False\r");
// Make MYAUX and MYCALL overridable strcat(TempScript, TNC->InitScript);
free(TNC->InitScript);
TNC->InitScript = TempScript;
// Set MYCALL
// strcat(TNC->InitScript,"FECRCV True\r");
// strcat(TNC->InitScript,"AUTOBREAK True\r");
sprintf(Msg, "MYCALL %s\r", TNC->NodeCall); sprintf(Msg, "MYCALL %s\r", TNC->NodeCall);
strcat(TempScript, Msg); strcat(TNC->InitScript, Msg);
// strcat(TNC->InitScript,"PROCESSID\r");
// strcat(TNC->InitScript,"CODEC TRUE\r");
// strcat(TNC->InitScript,"LISTEN TRUE\r");
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
@ -2096,25 +2092,9 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (strlen(Aux) > 8) if (strlen(Aux) > 8)
{ {
Aux[strlen(Aux) - 1] = '\r'; Aux[strlen(Aux) - 1] = '\r';
strcat(TempScript, Aux); strcat(TNC->InitScript, Aux);
} }
strcat(TempScript, TNC->InitScript);
free(TNC->InitScript);
TNC->InitScript = TempScript;
// strcat(TNC->InitScript,"FECRCV True\r");
// strcat(TNC->InitScript,"AUTOBREAK True\r");
// strcat(TNC->InitScript,"PROCESSID\r");
// strcat(TNC->InitScript,"CODEC TRUE\r");
// strcat(TNC->InitScript,"LISTEN TRUE\r");
strcpy(TNC->CurrentMYC, TNC->NodeCall); strcpy(TNC->CurrentMYC, TNC->NodeCall);
if (TNC->WL2K == NULL) if (TNC->WL2K == NULL)
@ -2302,11 +2282,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;
}
} }
} }
@ -2318,13 +2298,12 @@ int ConnecttoARDOP(struct TNCINFO * TNC)
return 0; return 0;
} }
VOID ARDOPThread(VOID * Param) VOID ARDOPThread(struct TNCINFO * TNC)
{ {
// Opens sockets and looks for data on control and data sockets. // Opens sockets and looks for data on control and data sockets.
// Socket may be TCP/IP or Serial // Socket may be TCP/IP or Serial
struct TNCINFO * TNC = (struct TNCINFO *) Param;
char Msg[255]; char Msg[255];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
@ -3157,7 +3136,6 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Incoming Connect // Incoming Connect
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
STREAM->AttachTime = time(NULL);
// Stop other ports in same group // Stop other ports in same group
@ -3340,9 +3318,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)
@ -5765,7 +5743,8 @@ VOID ARDOPSCSPoll(struct TNCINFO * TNC)
// Probably only for Teensy with ESP01. Runs SCS Emulator over a TCP Link // Probably only for Teensy with ESP01. Runs SCS Emulator over a TCP Link
VOID SerialConnecttoTCPThread(VOID * Param);
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC);
int SerialConnecttoTCP(struct TNCINFO * TNC) int SerialConnecttoTCP(struct TNCINFO * TNC)
{ {
@ -5773,9 +5752,9 @@ int SerialConnecttoTCP(struct TNCINFO * TNC)
return 0; return 0;
} }
VOID SerialConnecttoTCPThread(VOID * Param)
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC)
{ {
struct TNCINFO * TNC = (struct TNCINFO *) Param;
char Msg[255]; char Msg[255];
int i; int i;
u_long param = 1; u_long param = 1;
@ -5974,7 +5953,7 @@ VOID ARAXINIT(struct PORTCONTROL * PORT)
char Msg[80] = ""; char Msg[80] = "";
memcpy(Msg, PORT->PORTDESCRIPTION, 30); memcpy(Msg, PORT->PORTDESCRIPTION, 30);
strcat(Msg, "\n); sprintf(Msg, "%s\n", Msg);
WritetoConsoleLocal(Msg); WritetoConsoleLocal(Msg);
} }

View file

@ -117,8 +117,6 @@ struct UserInfo * FindBBS(char * Name);
void ReleaseWebMailStruct(WebMailInfo * WebMail); void ReleaseWebMailStruct(WebMailInfo * WebMail);
VOID TidyWelcomeMsg(char ** pPrompt); VOID TidyWelcomeMsg(char ** pPrompt);
int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token); int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token);
void UndoTransparency(char * input);
int GetMessageSlotFromMessageNumber(int msgno);
char UNC[] = ""; char UNC[] = "";
char CHKD[] = "checked=checked "; char CHKD[] = "checked=checked ";
@ -188,7 +186,7 @@ char RefreshMainPage[] = "<html><head>"
char StatusPage [] = char StatusPage [] =
"<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>" "<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>"
"<br>User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callsign&nbsp;&nbsp; Stream &nbsp;Queue &nbsp;Sent &nbsp;Rxed<br>" "<br>User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callsign&nbsp;&nbsp; Stream Queue<br>"
"<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>"; "<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>";
char StreamEnd[] = char StreamEnd[] =
@ -1703,8 +1701,6 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
free(Filters); free(Filters);
Filters = NULL; Filters = NULL;
UndoTransparency(input);
while (input) while (input)
{ {
// extract and validate before saving // extract and validate before saving
@ -1718,7 +1714,7 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
input = strstr(input, "&Type="); input = strstr(input, "&Type=");
if (Filter.Action == 'H' || Filter.Action == 'R' || Filter.Action == 'A') if (Filter.Action == 'H' || Filter.Action == 'R')
{ {
Filter.Type = toupper(input[6]); Filter.Type = toupper(input[6]);
input = strstr(input, "&From="); input = strstr(input, "&From=");
@ -2443,8 +2439,8 @@ VOID ProcessMsgFwdUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
set_fwd_bit(Msg->fbbs, BBSNumber); set_fwd_bit(Msg->fbbs, BBSNumber);
User->ForwardingInfo->MsgCount++; User->ForwardingInfo->MsgCount++;
clear_fwd_bit(Msg->forw, BBSNumber); clear_fwd_bit(Msg->forw, BBSNumber);
if (FirstMessageIndextoForward > GetMessageSlotFromMessageNumber(Msg->number)) if (FirstMessageIndextoForward > Msg->number)
FirstMessageIndextoForward = GetMessageSlotFromMessageNumber(Msg->number); FirstMessageIndextoForward = Msg->number;
} }
*RLen = SendMessageDetails(Msg, Reply, Session->Key); *RLen = SendMessageDetails(Msg, Reply, Session->Key);
@ -2759,19 +2755,6 @@ VOID SendUIPage(char * Reply, int * ReplyLen, char * Key)
*ReplyLen = Len; *ReplyLen = Len;
} }
void ConvertSpaceTonbsp(char * msg)
{
// Replace any space with &nbsp;
char * ptr;
while (ptr = strchr(msg, ' '))
{
memmove(ptr + 5, ptr, strlen(ptr) + 1);
memcpy(ptr, "&nbsp;", 6);
}
}
VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key) VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
{ {
int Len; int Len;
@ -2793,8 +2776,6 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
if (!conn->Active) if (!conn->Active)
{ {
strcpy(msg,"Idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" strcpy(msg,"Idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n"); "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n");
} }
@ -2808,16 +2789,16 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
strcpy(Name, conn->UserPointer->Name); strcpy(Name, conn->UserPointer->Name);
Name[9] = 0; Name[9] = 0;
i=sprintf_s(msg, sizeof(msg), "%-12s %-9s %3d %6d%6d%6d\r\n", i=sprintf_s(msg, sizeof(msg), "%s%s%s%s%2d&nbsp;%5d\r\n",
Name, Name,
&TenSpaces[strlen(Name) * 6],
conn->UserPointer->Call, conn->UserPointer->Call,
&TenSpaces[strlen(conn->UserPointer->Call) * 6],
conn->BPQStream, conn->BPQStream,
conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed); conn->OutputQueueLength - conn->OutputGetPointer);
} }
} }
} }
ConvertSpaceTonbsp(msg);
Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg); Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg);
} }

View file

@ -69,10 +69,6 @@ extern BPQVECSTRUC ** BPQHOSTVECPTR;
UCHAR * GetLogDirectory(); UCHAR * GetLogDirectory();
DllExport int APIENTRY SessionStateNoAck(int stream, int * state); DllExport int APIENTRY SessionStateNoAck(int stream, int * state);
int RefreshWebMailIndex(); int RefreshWebMailIndex();
struct PORTCONTROL * GetPortTableEntryFromSlot(int portslot);
int GetPortHardwareType(struct PORTCONTROL *PORT);
int GetNumberofPorts();
#else #else
__declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR; __declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR;
typedef char * (WINAPI FAR *FARPROCZ)(); typedef char * (WINAPI FAR *FARPROCZ)();
@ -532,19 +528,6 @@ struct MsgInfo * GetMsgFromNumber(int msgno)
return MsgnotoMsg[msgno]; return MsgnotoMsg[msgno];
} }
int GetMessageSlotFromMessageNumber(int msgno)
{
int i;
for (i=1; i <= NumberofMessages; i++)
{
if (MsgHddrPtr[i]->number == msgno)
return i;
}
return 0;
}
struct UserInfo * AllocateUserRecord(char * Call) struct UserInfo * AllocateUserRecord(char * Call)
{ {
struct UserInfo * User = zalloc(sizeof (struct UserInfo)); struct UserInfo * User = zalloc(sizeof (struct UserInfo));
@ -2102,7 +2085,6 @@ hold certain types or sizes of messages.
The first letter of each valid line specifies the action : The first letter of each valid line specifies the action :
A = Accept : Message is accepted without checking other filters
R = Reject : The message will not be received. R = Reject : The message will not be received.
H = Hold : The message will be received but held until the sysop reviews. H = Hold : The message will be received but held until the sysop reviews.
L = Local Hold : Only messages created on this BBS will be held. L = Local Hold : Only messages created on this BBS will be held.
@ -2197,38 +2179,21 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
while (p) while (p)
{ {
if (p->Action != 'R' && p->Action != 'A') if (p->Action != 'R')
goto Continue; goto Continue;
if (p->Type != Type && p->Type != '*') if (p->Type != Type && p->Type != '*')
goto Continue; goto Continue;
// wildcardcompare returns true on a match
if (wildcardcompare(From, p->From) == 0) if (wildcardcompare(From, p->From) == 0)
goto Continue; goto Continue;
if (p->TO[0] == '!')
{
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
goto Continue;
}
else
{
if (wildcardcompare(ToCopy, p->TO) == 0) if (wildcardcompare(ToCopy, p->TO) == 0)
goto Continue; goto Continue;
}
if (ATBBS) if (ATBBS)
{ if (wildcardcompare(ATBBS, p->AT) == 0)
char AtCopy[256];
strcpy(AtCopy, ATBBS);
_strupr(AtCopy);
if (wildcardcompare(AtCopy, p->AT) == 0)
goto Continue; goto Continue;
}
if (BID) if (BID)
if (wildcardcompare(BID, p->BID) == 0) if (wildcardcompare(BID, p->BID) == 0)
@ -2237,11 +2202,6 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
if (p->MaxLen && Len < p->MaxLen) if (p->MaxLen && Len < p->MaxLen)
goto Continue; goto Continue;
// if type 'A' matches all rules then accept without checking rest
if (p->Action == 'A')
return FALSE;
return TRUE; // Hold return TRUE; // Hold
Continue: Continue:
@ -2284,7 +2244,6 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
{ {
char ** Calls; char ** Calls;
FBBFilter * p = Filters; FBBFilter * p = Filters;
char ToCopy[256];
if (HoldFrom && From) if (HoldFrom && From)
{ {
@ -2348,9 +2307,6 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
// check fbb reject.sys type filters // check fbb reject.sys type filters
strcpy(ToCopy, To);
_strupr(ToCopy);
while (p) while (p)
{ {
if (p->Action != 'H') if (p->Action != 'H')
@ -2362,16 +2318,9 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
if (wildcardcompare(Msg->from, p->From) == 0) if (wildcardcompare(Msg->from, p->From) == 0)
goto Continue; goto Continue;
if (p->TO[0] == '!') if (wildcardcompare(Msg->to, p->TO) == 0)
{
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
goto Continue; goto Continue;
}
else
{
if (wildcardcompare(ToCopy, p->TO) == 0)
goto Continue;
}
if (wildcardcompare(Msg->via, p->AT) == 0) if (wildcardcompare(Msg->via, p->AT) == 0)
goto Continue; goto Continue;
@ -3439,7 +3388,6 @@ void Flush(CIRCUIT * conn)
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len); SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->OutputGetPointer+=len; conn->OutputGetPointer+=len;
conn->bytesSent += len;
tosend-=len; tosend-=len;
SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25); SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25);
FreeSemaphore(&OutputSEM); FreeSemaphore(&OutputSEM);
@ -3451,7 +3399,6 @@ void Flush(CIRCUIT * conn)
} }
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len); SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->bytesSent += len;
conn->OutputGetPointer+=len; conn->OutputGetPointer+=len;
@ -5269,6 +5216,7 @@ char * CheckToAddress(CIRCUIT * conn, char * Addr)
return NewAddr; return NewAddr;
} }
} }
else
{ {
WPRecP WP = LookupWP(Addr); WPRecP WP = LookupWP(Addr);
@ -5489,17 +5437,6 @@ BOOL DecodeSendParams(CIRCUIT * conn, char * Context, char ** From, char *To, ch
} }
else else
{ {
// See if a WP entry
WP = LookupWP(To);
if (WP)
{
*ATBBS = WP->first_homebbs;
nodeprintf(conn, "Address @%s added from WP\r", *ATBBS);
conn->LocalMsg = FALSE;
}
else
conn->LocalMsg = TRUE; conn->LocalMsg = TRUE;
} }
} }
@ -5873,12 +5810,12 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
continue; continue;
} }
} }
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", Addr, Via); ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, Addr, Via);
continue; continue;
} }
@ -5896,7 +5833,7 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
// Add to B2 Message for RMS // Add to B2 Message for RMS
@ -9079,10 +9016,6 @@ CheckForSID:
return TRUE; return TRUE;
} }
#ifndef LINBPQ
extern FARPROCX pGetPortHardwareType;
#endif
VOID Parse_SID(CIRCUIT * conn, char * SID, int len) VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
{ {
ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME); // Default Idletime for BBS Sessions ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME); // Default Idletime for BBS Sessions
@ -9139,43 +9072,9 @@ VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
{ {
// We should really only do this on Telnet Connections, as OpenBCM flag is used to remove relnet transparency // We should really only do this on Telnet Connections, as OpenBCM flag is used to remove relnet transparency
// See if Telnet
struct PORTCONTROL * PORT;
char Call[11] = "";
int port, dummy;
GetConnectionInfo(conn->BPQStream, Call, &port, &dummy, &dummy, &dummy, &dummy);
PORT = GetPortTableEntryFromSlot(0); // Get first entry
do
{
if (PORT->PORTNUMBER == port)
break;
PORT=PORT->PORTPOINTER;
} while (PORT);
#define H_TELNET 6
#ifndef LINBPQ
if (pGetPortHardwareType)
{
if (PORT && GetPortHardwareType(PORT) == H_TELNET)
conn->OpenBCM = TRUE; conn->OpenBCM = TRUE;
} }
else
conn->OpenBCM = TRUE; // Old Node version so follow old behavoiur and treat all as telnet
#else
if (PORT && GetPortHardwareType(PORT) == H_TELNET)
conn->OpenBCM = TRUE;
#endif
}
if (_memicmp(SID, "PMS-3.2", 7) == 0) if (_memicmp(SID, "PMS-3.2", 7) == 0)
{ {
@ -10346,7 +10245,7 @@ BOOL GetConfig(char * ConfigName)
GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100); GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default
GetStringValue(group, "SignoffMsg", SignoffMsg, 50); GetStringValue(group, "SignoffMsg", ISPAccountName, 50);
DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass)); DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
@ -10651,7 +10550,7 @@ int Connected(int Stream)
char callsign[10]; char callsign[10];
int port, paclen, maxframe, l4window; int port, paclen, maxframe, l4window;
char ConnectedMsg[] = "*** CONNECTED "; char ConnectedMsg[] = "*** CONNECTED ";
char Msg[256]; char Msg[100];
char Title[100]; char Title[100];
int64_t Freq = 0; int64_t Freq = 0;
int Mode = 0; int Mode = 0;
@ -10735,12 +10634,6 @@ int Connected(int Stream)
} }
} }
if (Mode < 0 || Mode > 54)
Mode = 0;
if (Freq < 0 || Freq > 11000000000)
Freq = 0;
memset(conn, 0, sizeof(ConnectionInfo)); // Clear everything memset(conn, 0, sizeof(ConnectionInfo)); // Clear everything
conn->Active = TRUE; conn->Active = TRUE;
conn->BPQStream = Stream; conn->BPQStream = Stream;
@ -10805,7 +10698,7 @@ int Connected(int Stream)
LongFreq = GetPortFrequency(port, FreqString); LongFreq = GetPortFrequency(port, FreqString);
#endif #endif
} }
Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %lld Mode %d\r\n", callsign, port, LongFreq, Mode); Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %d Mode %ld\r\n", callsign, port, LongFreq, Mode);
sprintf(Title, "New User %s", callsign); sprintf(Title, "New User %s", callsign);
@ -10865,10 +10758,10 @@ int Connected(int Stream)
} }
if (port) if (port)
n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %lld Mode %s", n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %d Mode %s",
user->Call, port, Freq, WL2KModes[Mode]); user->Call, port, Freq, WL2KModes[Mode]);
else else
n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call); n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call);
// Send SID and Prompt (Unless Sync) // Send SID and Prompt (Unless Sync)
@ -11158,6 +11051,7 @@ int DoReceivedData(int Stream)
if (Stream == conn->BPQStream) if (Stream == conn->BPQStream)
{ {
conn->SIDResponseTimer = 0; // Got a message, so cancel timeout. conn->SIDResponseTimer = 0; // Got a message, so cancel timeout.
do do
{ {
// May have several messages per packet, or message split over packets // May have several messages per packet, or message split over packets
@ -11174,7 +11068,6 @@ int DoReceivedData(int Stream)
if (InputLen == 0 && conn->InputMode != 'Y') if (InputLen == 0 && conn->InputMode != 'Y')
return 0; return 0;
conn->bytesRxed += InputLen;
conn->InputLen += InputLen; conn->InputLen += InputLen;
if (conn->InputLen == 0) return 0; if (conn->InputLen == 0) return 0;

674
BPQINP3.c

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -1147,15 +1147,6 @@
// Send forwarding info to packetnodes.spots.radio database (51) // Send forwarding info to packetnodes.spots.radio database (51)
// Fix bug in WP Message processing (56) // Fix bug in WP Message processing (56)
// Fix treating addresses ending in WW as Internet (57) // Fix treating addresses ending in WW as Internet (57)
// Run sending to packetnodes.spots.radio in a separate thread (61)
// Fix loading ISP Account Name from config file (67)
// Fixes to using {FormFolder} in Webmail Templates (68)
// Save FBB transfer restart data over program restarts (69)
// Add Send and Receive byte counts to status displays (69)
// Validate Mode and Frequency and fix formatting in Connected Message (71)
// Fix using OpenBCM on other than Telnet connections (75)
// Fix sending + in Webmail (80)
// Fix forwarding problem when using Web interface to change message routing (73)
#include "bpqmail.h" #include "bpqmail.h"
#include "winstdint.h" #include "winstdint.h"
@ -1176,7 +1167,6 @@ FARPROCX pRunEventProgram;
FARPROCX pGetPortFrequency; FARPROCX pGetPortFrequency;
FARPROCX pSendWebRequest; FARPROCX pSendWebRequest;
FARPROCX pGetLatLon; FARPROCX pGetLatLon;
FARPROCX pGetPortHardwareType;
BOOL WINE = FALSE; BOOL WINE = FALSE;
@ -1733,7 +1723,6 @@ int APIENTRY WinMain(HINSTANCE hInstance,
// SaveUserDatabase(); // SaveUserDatabase();
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveRestartData();
configSaved = 1; configSaved = 1;
SaveConfig(ConfigName); SaveConfig(ConfigName);
@ -1960,8 +1949,6 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8"); pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8");
pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16"); pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16");
pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8"); pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8");
pGetPortHardwareType = GetProcAddress(ExtDriver,"_GetPortHardwareType@4");
if (pGetLOC) if (pGetLOC)
@ -3032,9 +3019,9 @@ int RefreshMainWindow()
strcpy(msg,"Logging in"); strcpy(msg,"Logging in");
else else
{ {
i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d %5d %5d", i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d",
conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream, conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream,
"BBS", conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed); "BBS", conn->OutputQueueLength - conn->OutputGetPointer);
} }
} }
} }
@ -3095,7 +3082,6 @@ static PSOCKADDR_IN psin;
SOCKET sock; SOCKET sock;
void GetRestartData();
BOOL Initialise() BOOL Initialise()
{ {
@ -3283,8 +3269,6 @@ BOOL Initialise()
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetRestartData();
UsingingRegConfig = FALSE; UsingingRegConfig = FALSE;
// Make sure SYSOPCALL is set // Make sure SYSOPCALL is set

1090
BPQMail.rc

File diff suppressed because it is too large Load diff

View file

@ -45,8 +45,6 @@ extern VOID Q_ADD();
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
TRANSPORTENTRY * NRRSession; TRANSPORTENTRY * NRRSession;
int NRRID = 1; // Id to correlate requests and responses
/* /*
datagrams (and other things) to be transported in Netrom L3 frames. datagrams (and other things) to be transported in Netrom L3 frames.
@ -77,9 +75,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
{ {
UCHAR * BUFFER = GetBuff(); UCHAR * BUFFER = GetBuff();
UCHAR * ptr1; UCHAR * ptr1;
struct _MESSAGE * Msg1; struct _MESSAGE * Msg;
time_t Now = time(NULL);
int ID = (Msg->L4TXNO << 8) | Msg->L4RXNO;
if (BUFFER == NULL) if (BUFFER == NULL)
return; return;
@ -88,18 +84,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
*ptr1++ = 0xf0; // PID *ptr1++ = 0xf0; // PID
ptr1 += sprintf(ptr1, "NRR Response:");
if (BUFFER == NULL)
return;
ptr1 = &BUFFER[MSGHDDRLEN];
*ptr1++ = 0xf0; // PID
if (ID == NRRSession->NRRID)
ptr1 += sprintf(ptr1, "NRR Response in %d Secs:", (int)(Now - NRRSession->NRRTime));
else
ptr1 += sprintf(ptr1, "NRR Response:", (int)(Now - NRRSession->NRRTime));
Buff += 21 + MSGHDDRLEN; Buff += 21 + MSGHDDRLEN;
Len -= (21 + MSGHDDRLEN); Len -= (21 + MSGHDDRLEN);
@ -112,7 +97,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
if ((Buff[7] & 0x80) == 0x80) // Check turnround bit if ((Buff[7] & 0x80) == 0x80) // Check turnround bit
*ptr1++ = '*'; *ptr1++ = '*';
Buff += 8; Buff+=8;
Len -= 8; Len -= 8;
} }
@ -126,11 +111,11 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
Len = (int)(ptr1 - BUFFER); Len = (int)(ptr1 - BUFFER);
Msg1 = (struct _MESSAGE *)BUFFER; Msg = (struct _MESSAGE *)BUFFER;
Msg1->LENGTH = Len; Msg->LENGTH = Len;
Msg1->CHAIN = NULL; Msg->CHAIN = NULL;
C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER); C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER);
@ -198,16 +183,11 @@ VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session)
Msg->L4ID = 1; Msg->L4ID = 1;
Msg->L4INDEX = 0; Msg->L4INDEX = 0;
Msg->L4FLAGS = 0; Msg->L4FLAGS = 0;
Msg->L4TXNO = NRRID << 8;
Msg->L4RXNO = NRRID & 0xff;
memcpy(Msg->L4DATA, MYCALL, 7); memcpy(Msg->L4DATA, MYCALL, 7);
Msg->L4DATA[7] = Stream + 28; Msg->L4DATA[7] = Stream + 28;
Msg->LENGTH = 8 + 21 + MSGHDDRLEN; Msg->LENGTH = 8 + 21 + MSGHDDRLEN;
Session->NRRTime = time(NULL);
Session->NRRID = NRRID++;
C_Q_ADD(&DEST->DEST_Q, Msg); C_Q_ADD(&DEST->DEST_Q, Msg);
} }

12
BPQRemotePTT.cfg Normal file
View file

@ -0,0 +1,12 @@
main :
{
BPQHostIP = "192.168.1.64";
COM1 = "COM43";
COM2 = "";
COM3 = "";
COM4 = "";
HamLibPort1 = 4534;
HamLibPort2 = 0;
HamLibPort3 = 0;
HamLibPort4 = 0;
};

View file

@ -2974,30 +2974,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
if (wParam == 0x7) // BEL (Ctrl/G)
{
// Get buffer, append 07 and write back
Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1,
(LPARAM) (LPCSTR)Cinfo->kbbuf);
Cinfo->kbbuf[Cinfo->kbptr++] = 7;
Cinfo->kbbuf[Cinfo->kbptr] = 0;
SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
// Send cursor right
for (i = 0; i < strlen(Cinfo->kbbuf); i++)
{
SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
}
return 0;
}
} }
return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam);

6741
Bpq32-skigdebian.c Normal file

File diff suppressed because it is too large Load diff

150
Bpq32.c
View file

@ -1180,7 +1180,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix processing of the Winlink API /account/exists response (82) // Fix processing of the Winlink API /account/exists response (82)
// Fix sending CTEXT to L4 connects to Node when FULL_CTEXT is not set // Fix sending CTEXT to L4 connects to Node when FULL_CTEXT is not set
// Version 6.0.25.1 Sept 2025 // Version 6.0.25.?
// Fix 64 bit compatibility problems in SCSTracker and UZ7HO drivers // Fix 64 bit compatibility problems in SCSTracker and UZ7HO drivers
// Add Chat PACLEN config (5) // Add Chat PACLEN config (5)
@ -1243,61 +1243,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix MailAPI msgs endpoint // Fix MailAPI msgs endpoint
// Attempt to fix NC going to wrong application. (57) // Attempt to fix NC going to wrong application. (57)
// Improve ARDOP end of session code (58) // Improve ARDOP end of session code (58)
// Run M0LTE Map reporting in a separate thread (59/60) // Run M0LTE Map repoorting in a separate thread (59)
// Add RHP support for WhatsPac (59) // Add support fro WhatsPac (59)
// Add timestamps to LIS monitor (60) // Add timestamps to LIS monitor
// 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)
// Add option to compress L2 frames (67)
// Sort Routes displays (67)
// Fix Ardop session premature close (70)
// Add timestamps to log entries in Web Driver windows (70)
// Generate stack backtrace if SIGSEGV or SIGABRT occur (Linux) (70)
// Remove some debug logging from L2 code (70)
// Fix compiling LinBPQ with nomqtt option (70)
// Improve handling of binary data in RHP interface (70)
// Fix sending KISS commands to multiport or multidropped TNCs (70)
// Add MHUV and MHLV commands (Verbose listing with timestamps in clock time) (70)
// Improvements to INP3 (71)
// Improvements to KAM driver including support for GTOR connects (71)
// Support IPv6 for Telnet outward connects (72)
// Fix decaying NETROM routes (72)
// Add OnlyVer2point0 config command (72)
// Add option to allow AX/UDP on a network using NAT (72)
// Include AGWAPI fixes from Martin KD6YAM to enable use with Paracon terminal (72)
// Fix 64 bit compatiblility issues with AGWAPI (73)
// Fix KAM Pactor Interlock (73)
// Fix Node map reporting, broken in .73 (74)
// Fixes to build on FreeBSD and NetBSD from jg1uaa (77)
// Fix to L4Compress from Steve G7TAJ (77)
// Fix possible FRMR when RNR is cleared by SREJ (78)
// Fix error in .77 L4Compress fix (mine, not Steve's!) (78)
// Fix possible stuck L2 session when handling SREJ (79)
// Allow sending CTRL/G From console (Windows) (80)
// Fix Webmail autorefresh extra threads problem (websock connection lost handling) (82)
// Fix overwriting application alias (83)
// Version 6.0.26.?
// Fix for compiling with gcc15 (2)
// Fix possble stuck L2 session caused by window being set to zero (3)
// Improvments to INP3 (4, 5)
// Add Node API /api/tcpqueues (5)
// Add sending link events to OARC API (disabled by default) (6)
// Fix possible program error in Telnet_Connected (7)
// Close links when program is closed down (7)
// Fix possible problem with deleting routes when using both NODES and INP3 routing on same link (7)
// Add Paula's Netromx (allows connects to different applications using Node call) (8)
// Add Netrom over TCP (8)
// Fix FRMR caused by sending SREJ when no frames outstanding (8)
#define CKernel #define CKernel
@ -1393,8 +1343,6 @@ void * HSMODEMExtInit(EXTPORTDATA * PortEntry);
void * FreeDataExtInit(EXTPORTDATA * PortEntry); void * FreeDataExtInit(EXTPORTDATA * PortEntry);
void * SIXPACKExtInit(EXTPORTDATA * PortEntry); void * SIXPACKExtInit(EXTPORTDATA * PortEntry);
VOID RealCloseAllPrograms();
extern char * ConfigBuffer; // Config Area extern char * ConfigBuffer; // Config Area
VOID REMOVENODE(dest_list * DEST); VOID REMOVENODE(dest_list * DEST);
DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall); DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
@ -1404,8 +1352,6 @@ VOID ADIFWriteFreqList();
void SaveAIS(); void SaveAIS();
void initAIS(); void initAIS();
void initADSB(); void initADSB();
int CloseAllSessions();
int CloseAllLinks();
extern BOOL ADIFLogEnabled; extern BOOL ADIFLogEnabled;
@ -1465,7 +1411,6 @@ extern HWND hIPResWnd;
extern BOOL IPMinimized; extern BOOL IPMinimized;
extern int NODESINPROGRESS; extern int NODESINPROGRESS;
extern int NODESToOnePort;
extern VOID * CURRENTNODE; extern VOID * CURRENTNODE;
@ -1535,7 +1480,7 @@ extern char ReportDest[7];
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
extern uint64_t INP3timeLoadedMS; extern uint64_t timeLoadedMS;
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Consoleprintf(const char * format, ...); VOID __cdecl Consoleprintf(const char * format, ...);
@ -1653,8 +1598,6 @@ BOOL IGateEnabled = TRUE;
extern int ISDelayTimer; // Time before trying to reopen APRS-IS link extern int ISDelayTimer; // Time before trying to reopen APRS-IS link
extern int ISPort; extern int ISPort;
int CLOSING = 0;
UINT * WINMORTraceQ = NULL; UINT * WINMORTraceQ = NULL;
UINT * SetWindowTextQ = NULL; UINT * SetWindowTextQ = NULL;
@ -1710,8 +1653,6 @@ BOOL ReconfigFlag = FALSE;
BOOL RigReconfigFlag = FALSE; BOOL RigReconfigFlag = FALSE;
BOOL APRSReconfigFlag = FALSE; BOOL APRSReconfigFlag = FALSE;
BOOL CloseAllNeeded = FALSE; BOOL CloseAllNeeded = FALSE;
int CloseAllTimer = 0;
BOOL NeedWebMailRefresh = FALSE; BOOL NeedWebMailRefresh = FALSE;
int AttachedPIDList[100] = {0}; int AttachedPIDList[100] = {0};
@ -2393,52 +2334,6 @@ VOID TimerProcX()
CheckGuardZone(); CheckGuardZone();
if (CloseAllTimer == 50) // First entry
{
if (CloseAllSessions() == 0)
{
if (CloseAllLinks() == 0) // No sessions closed so close links now
CloseAllTimer = 0; // No Links so close now
else
CloseAllTimer = 39; // ~4 secs for links to close
}
}
if (CloseAllTimer == 40) // First entry
CloseAllLinks(); // No sessions closed so close links now
if (CloseAllTimer)
{
// See if any links left
struct _LINKTABLE * LINK = LINKS;
int i = MAXLINKS;
if (CloseAllTimer == 0)
RealCloseAllPrograms();
while (i--)
{
if (LINK->LINKCALL[0])
{
break;
}
if (i == 0)
{
CloseAllTimer = 0;
RealCloseAllPrograms();
return;
}
LINK++;
continue;
}
CloseAllTimer--;
if(CloseAllTimer == 0)
RealCloseAllPrograms();
}
return; return;
} }
@ -2474,9 +2369,7 @@ FirstInit()
EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses"); EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses");
} }
INP3timeLoadedMS = GetTickCount(); timeLoadedMS = GetTickCount();
srand(time(NULL));
INITIALISEPORTS(); INITIALISEPORTS();
@ -5965,24 +5858,13 @@ DllExport VOID APIENTRY CreateNewTrayIcon()
trayMenu = NULL; trayMenu = NULL;
} }
void hookNodeClosing(char * Reason);
DllExport VOID APIENTRY CloseAllPrograms() DllExport VOID APIENTRY CloseAllPrograms()
{ {
CLOSING = TRUE; // HANDLE hProc;
// Tell BG to shut when all links are gone or after 5 secs // Close all attached BPQ32 programs
CloseAllTimer = 50; Closing = TRUE;
}
VOID RealCloseAllPrograms()
{
hookNodeClosing("Shutdown");
Sleep(500);
Closing = 1;
ShowWindow(FrameWnd, SW_RESTORE); ShowWindow(FrameWnd, SW_RESTORE);
@ -6230,14 +6112,13 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n", RegLine); len = sprintf(RegLine, "%s\\\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[len], "%02x,", Value[k]); len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;
RegLine[++len] = 0x0a; RegLine[++len] = 0x0a;
@ -6263,20 +6144,19 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n"); len = sprintf(RegLine, "%s\\\r\n", RegLine);
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[len], "\\\r\n"); len = sprintf(RegLine, "%s\\\r\n", RegLine);
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
} }
len += sprintf(&RegLine[len], "00,"); len = sprintf(RegLine, "%s00,", RegLine);
} }
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,8 +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

@ -590,7 +590,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
{ {
if (conn->Flags & CHATLINK) if (conn->Flags & CHATLINK)
{ {
if (conn->BPQStream > 64 || conn->u.link == 0 || conn->u.link->alias == 0) if (conn->BPQStream > 64 || conn->u.link == 0)
Len += sprintf(&Streams[Len], "<tr><td onclick= SelectRow(%d) id=cell_%d>** Corrupt ChatLink **</td>" Len += sprintf(&Streams[Len], "<tr><td onclick= SelectRow(%d) id=cell_%d>** Corrupt ChatLink **</td>"
"<td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td></tr>", i, i); "<td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td></tr>", i, i);
else else
@ -600,7 +600,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
"", conn->OutputQueueLength - conn->OutputGetPointer); "", conn->OutputQueueLength - conn->OutputGetPointer);
} }
else else
if ((conn->Flags & CHATMODE) && conn->topic && conn->u.user && conn->u.user->call) if ((conn->Flags & CHATMODE) && conn->topic)
{ {
Len += sprintf(&Streams[Len], "<tr><td onclick='SelectRow(%d)' id='cell_%d'>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%d</td></tr>", Len += sprintf(&Streams[Len], "<tr><td onclick='SelectRow(%d)' id='cell_%d'>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%d</td></tr>",
i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream, i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream,

View file

@ -984,29 +984,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
if (wParam == 0x7) // BEL (Ctrl/G)
{
// Get buffer, append 07 and write back
Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1,
(LPARAM) (LPCSTR)Cinfo->kbbuf);
Cinfo->kbbuf[Cinfo->kbptr++] = 7;
Cinfo->kbbuf[Cinfo->kbptr] = 0;
SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
// Send cursor right
for (i = 0; i < strlen(Cinfo->kbbuf); i++)
{
SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
}
return 0;
}
} }
return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam);

716
Cmd.c

File diff suppressed because it is too large Load diff

5647
CommonCode-skigdebian.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -18,6 +18,7 @@ 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")
@ -49,12 +50,6 @@ extern struct CONFIGTABLE xxcfg;
#endif #endif
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
struct TNCINFO * TNCInfo[71]; // Records are Malloc'd struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
extern int ReportTimer; extern int ReportTimer;
@ -83,9 +78,6 @@ char * stristr (char *ch1, char *ch2);
extern VOID * ENDBUFFERPOOL; extern VOID * ENDBUFFERPOOL;
extern int PoolBuilt;
extern int EnableOARCAPI;
// Read/Write length field in a buffer header // Read/Write length field in a buffer header
@ -372,7 +364,7 @@ BOK1:
if (n > 1000) if (n > 1000)
{ {
Debugprintf("Releasebuffer Loop searching free chain - pointer = %p %p from %s Line %d", debug, pointer, File, Line); Debugprintf("Loop searching free chain - pointer = %p %p", debug, pointer);
return 0; return 0;
} }
} }
@ -385,11 +377,6 @@ BOK1:
QCOUNT++; QCOUNT++;
if (PoolBuilt && QCOUNT > MAXBUFFS)
{
Debugprintf("Releasebuffer QCOUNT > MAXBUFFS - pointer = %p from %s Line %d", pointer, File, Line);
return 0;
}
return 0; return 0;
} }
@ -487,7 +474,7 @@ int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF)
next = Q[0]; next = Q[0];
while (next[0] != 0) while (next[0] != 0)
next = next[0]; // Chain to end of queue next=next[0]; // Chain to end of queue
next[0] = BUFF; // New one on end next[0] = BUFF; // New one on end
@ -927,7 +914,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
sprintf(Msg, "%d SCANSTOP", TNC->Port); sprintf(Msg, "%d SCANSTOP", TNC->Port);
Rig_Command((TRANSPORTENTRY *) -1, Msg); Rig_Command( (TRANSPORTENTRY *) -1, Msg);
UpdateMH(TNC, Call, '+', 'I'); UpdateMH(TNC, Call, '+', 'I');
} }
@ -1075,7 +1062,6 @@ BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
WritetoConsoleLocal("\n"); WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record "); WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf); WritetoConsoleLocal(errbuf);
WritetoConsoleLocal("\n");
} }
} }
} }
@ -1139,11 +1125,6 @@ int CompareNode(struct DEST_LIST ** a, struct DEST_LIST ** b)
return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7); return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7);
} }
int CompareRoutes(struct ROUTE ** a, struct ROUTE ** b)
{
return memcmp(a[0]->NEIGHBOUR_CALL, b[0]->NEIGHBOUR_CALL, 7);
}
DllExport int APIENTRY CountFramesQueuedOnStream(int Stream) DllExport int APIENTRY CountFramesQueuedOnStream(int Stream)
{ {
BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1 BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1
@ -1642,7 +1623,7 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
MSG->LENGTH = len + MSGHDDRLEN; MSG->LENGTH = len + MSGHDDRLEN;
if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF) // PACTOR/WINMOR Style if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF) // PACTOR/WINMOR Style
{ {
// Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR // Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
@ -2149,16 +2130,7 @@ int CanPortDigi(int Port)
return TRUE; return TRUE;
} }
DllExport int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT) struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
{
if (PORT)
return PORT->Hardware;
return 0;
}
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
{ {
struct PORTCONTROL * PORTVEC = PORTTABLE; struct PORTCONTROL * PORTVEC = PORTTABLE;
@ -2715,14 +2687,6 @@ 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;
@ -2746,7 +2710,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 %c\n", "ROUTE ADD %s %d %d %s %d %d %d %d %d\n",
Normcall, Normcall,
Routes->NEIGHBOUR_PORT, Routes->NEIGHBOUR_PORT,
Routes->NEIGHBOUR_QUAL, digis, Routes->NEIGHBOUR_QUAL, digis,
@ -2754,8 +2718,7 @@ 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);
} }
@ -3320,12 +3283,8 @@ SOCKADDR_IN reportdest = {0};
SOCKET ReportSocket = 0; SOCKET ReportSocket = 0;
SOCKET NodeAPISocket = 0 ;
SOCKADDR_IN Chatreportdest = {0}; SOCKADDR_IN Chatreportdest = {0};
SOCKADDR_IN UDPreportdest = {0};
extern char LOCATOR[]; // Locator for Reporting - may be Maidenhead or LAT:LON extern char LOCATOR[]; // Locator for Reporting - may be Maidenhead or LAT:LON
extern char MAPCOMMENT[]; // Locator for Reporting - may be Maidenhead or LAT:LON extern char MAPCOMMENT[]; // Locator for Reporting - may be Maidenhead or LAT:LON
extern char LOC[7]; // Maidenhead Locator for Reporting extern char LOC[7]; // Maidenhead Locator for Reporting
@ -3681,22 +3640,11 @@ pthread_t ResolveUpdateThreadId = 0;
char NodeMapServer[80] = "update.g8bpq.net"; char NodeMapServer[80] = "update.g8bpq.net";
char ChatMapServer[80] = "chatupdate.g8bpq.net"; char ChatMapServer[80] = "chatupdate.g8bpq.net";
char NodeAPIServer[80] = "node-api.packet.oarc.uk";
int NodeAPIPort = 13579;
int nodeStartedSent = 0;
extern time_t LastNodeStatus;
void hookNodeStarted();
VOID ResolveUpdateThread(void * Unused) VOID ResolveUpdateThread(void * Unused)
{ {
struct hostent * HostEnt1; struct hostent * HostEnt1;
struct hostent * HostEnt2; struct hostent * HostEnt2;
struct hostent * HostEnt3;
ResolveUpdateThreadId = GetCurrentThreadId(); ResolveUpdateThreadId = GetCurrentThreadId();
@ -3724,22 +3672,6 @@ VOID ResolveUpdateThread(void * Unused)
if (HostEnt2) if (HostEnt2)
memcpy(&Chatreportdest.sin_addr.s_addr,HostEnt2->h_addr,4); memcpy(&Chatreportdest.sin_addr.s_addr,HostEnt2->h_addr,4);
Debugprintf("Resolving %s", NodeAPIServer);
HostEnt3 = gethostbyname(NodeAPIServer);
if (HostEnt3)
{
memcpy(&UDPreportdest.sin_addr.s_addr,HostEnt3->h_addr,4);
if (nodeStartedSent == 0)
{
hookNodeStarted();
nodeStartedSent = 1;
LastNodeStatus = time(NULL);
}
}
if (HostEnt1 && HostEnt2) if (HostEnt1 && HostEnt2)
{ {
Sleep(1000 * 60 * 30); Sleep(1000 * 60 * 30);
@ -4852,7 +4784,6 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
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)
{ {
@ -4894,7 +4825,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
*ptr = '\r'; *ptr = '\r';
len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER); sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER);
} }
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;
@ -5232,14 +5163,14 @@ skipit:
} }
} }
void SendDataToPktMapThread(void * Param); void SendDataToPktMapThread();
void SendDataToPktMap() void SendDataToPktMap()
{ {
_beginthread(SendDataToPktMapThread,2048000,0); _beginthread(SendDataToPktMapThread,2048000,0);
} }
void SendDataToPktMapThread(void * Param) void SendDataToPktMapThread()
{ {
char Return[256] = ""; char Return[256] = "";
char Request[64]; char Request[64];

941
Events.c

File diff suppressed because it is too large Load diff

View file

@ -27,8 +27,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line); void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void DeleteRestartData(CIRCUIT * conn);
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress); int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
@ -43,130 +41,6 @@ int B2RestartCount = 0;
extern char ProperBaseDir[]; extern char ProperBaseDir[];
char RestartDir[MAX_PATH] = "";
void GetRestartData()
{
int i;
struct FBBRestartData Restart;
struct FBBRestartData * RestartRec;
char MsgFile[MAX_PATH];
FILE * hFile;
int FileSize;
struct stat STAT;
size_t ReadLen = 0;
time_t Age;
strcpy(RestartDir, MailDir);
strcat(RestartDir, "/Restart");
// Make sure RestartDir exists
#ifdef WIN32
CreateDirectory(RestartDir, NULL); // Just in case
#else
mkdir(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
chmod(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif
// look for restart files. These will be numbered from 1 up
for (i = 1; 1; i++)
{
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
if (stat(MsgFile, &STAT) == -1)
break;
FileSize = STAT.st_size;
Age = time(NULL) - STAT.st_ctime;
if (Age > 86400 * 2) // Max 2 days
continue;
hFile = fopen(MsgFile, "rb");
if (hFile == NULL)
break;
// Read Restart Record
fread(&Restart, 1, sizeof(struct FBBRestartData), hFile);
if ((Restart.MailBufferSize + sizeof(struct FBBRestartData)) != FileSize) // Duff file
{
fclose(hFile);
break;
}
RestartRec = zalloc(sizeof (struct FBBRestartData));
GetSemaphore(&AllocSemaphore, 0);
RestartData = realloc(RestartData,(++RestartCount+1) * sizeof(void *));
RestartData[RestartCount] = RestartRec;
FreeSemaphore(&AllocSemaphore);
memcpy(RestartRec, &Restart, sizeof(struct FBBRestartData));
RestartRec->MailBuffer = malloc(RestartRec->MailBufferSize);
ReadLen = fread(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile);
Logprintf(LOG_BBS, 0, '?', "Restart Data for %s %s Len %d Loaded", RestartRec->Call, RestartRec->bid, RestartRec->length);
fclose(hFile);
}
}
void SaveRestartData()
{
// Save restart data to file so we can reload on restart
// Restart data has pointers to buffers so we must save copy of data and reconstitue on restart
// Delete and resave all restart data to keep restart directory clean
int i, n = 1;
char MsgFile[MAX_PATH];
FILE * hFile;
size_t WriteLen=0;
struct FBBRestartData * RestartRec = NULL;
struct stat STAT;
time_t NOW = time(NULL);
for (i = 1; 1; i++)
{
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
if (stat(MsgFile, &STAT) == -1)
break;
DeleteFile(MsgFile);
}
for (i = 1; i <= RestartCount; i++)
{
RestartRec = RestartData[i];
if (RestartRec == 0)
return; // Shouldn't happen!
if ((NOW - RestartRec->TimeCreated) > 86400 * 2) // Max 2 days
continue;
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, n++);
hFile = fopen(MsgFile, "wb");
if (hFile)
{
WriteLen = fwrite(RestartRec, 1, sizeof(struct FBBRestartData), hFile); // Save Header
WriteLen = fwrite(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile); // Save Data
fclose(hFile);
}
}
}
VOID FBBputs(CIRCUIT * conn, char * buf) VOID FBBputs(CIRCUIT * conn, char * buf)
{ {
// Sends to user and logs // Sends to user and logs
@ -1111,12 +985,12 @@ loop:
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0) if ((RestartRec->UserPointer == conn->UserPointer)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0)) && (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0))
{ {
if (RestartRec->length <= offset) if (RestartRec->TempMsg->length <= offset)
{ {
conn->TempMsg->length = RestartRec->length; conn->TempMsg->length = RestartRec->TempMsg->length;
conn->MailBuffer = RestartRec->MailBuffer; conn->MailBuffer = RestartRec->MailBuffer;
conn->MailBufferSize = RestartRec->MailBufferSize; conn->MailBufferSize = RestartRec->MailBufferSize;
@ -1145,7 +1019,6 @@ loop:
RestartData[n] = RestartData[n+1]; // move down all following entries RestartData[n] = RestartData[n+1]; // move down all following entries
} }
RestartCount--; RestartCount--;
SaveRestartData();
} }
} }
@ -1273,7 +1146,6 @@ loop:
{ {
#endif #endif
conn->InputMode = 0; // So we won't save Restart data if decode fails conn->InputMode = 0; // So we won't save Restart data if decode fails
DeleteRestartData(conn);
Decode(conn, 0); // Setup Next Message will reset InputMode if needed Decode(conn, 0); // Setup Next Message will reset InputMode if needed
#ifndef LINBPQ #ifndef LINBPQ
} }
@ -1973,14 +1845,14 @@ VOID SaveFBBBinary(CIRCUIT * conn)
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0) if ((RestartRec->UserPointer == conn->UserPointer)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0)) && (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0))
{ {
// Found it, so reuse // Fund it, so reuse
// If we have more data, reset retry count // If we have more data, reset retry count
if (RestartRec->length < conn->TempMsg->length) if (RestartRec->TempMsg->length < conn->TempMsg->length)
RestartRec->Count = 0;; RestartRec->Count = 0;;
break; break;
@ -1997,53 +1869,19 @@ VOID SaveFBBBinary(CIRCUIT * conn)
RestartData[RestartCount] = RestartRec; RestartData[RestartCount] = RestartRec;
FreeSemaphore(&AllocSemaphore); FreeSemaphore(&AllocSemaphore);
RestartRec->TimeCreated = time(NULL);
} }
strcpy(RestartRec->Call, conn->UserPointer->Call); RestartRec->UserPointer = conn->UserPointer;
RestartRec->length = conn->TempMsg->length; RestartRec->TempMsg = conn->TempMsg;
strcpy(RestartRec->bid, conn->TempMsg->bid);
RestartRec->MailBuffer = conn->MailBuffer; RestartRec->MailBuffer = conn->MailBuffer;
RestartRec->MailBufferSize = conn->MailBufferSize; RestartRec->MailBufferSize = conn->MailBufferSize;
len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart", len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart",
conn->Callsign, conn->TempMsg->length); conn->Callsign, conn->TempMsg->length);
SaveRestartData();
WriteLogLine(conn, '|',Msg, len, LOG_BBS); WriteLogLine(conn, '|',Msg, len, LOG_BBS);
} }
void DeleteRestartData(CIRCUIT * conn)
{
struct FBBRestartData * RestartRec = NULL;
int i, n;
if (conn->TempMsg == NULL)
return;
for (i = 1; i <= RestartCount; i++)
{
RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
{
// Remove restrt data
for (n = i; n < RestartCount; n++)
{
RestartData[n] = RestartData[n+1]; // move down all following entries
}
RestartCount--;
SaveRestartData();
return;
}
}
}
BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader) BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
{ {
int i, n; int i, n;
@ -2057,15 +1895,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0) if ((RestartRec->UserPointer == conn->UserPointer)
&& (strcmp(RestartRec->bid, FBBHeader->BID) == 0)) && (strcmp(RestartRec->TempMsg->bid, FBBHeader->BID) == 0))
{ {
char Msg[120]; char Msg[120];
int len; int len;
RestartRec->Count++; RestartRec->Count++;
if (RestartRec->Count > 10) if (RestartRec->Count > 3)
{ {
len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning", len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning",
FBBHeader->BID); FBBHeader->BID);
@ -2080,16 +1918,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
} }
RestartCount--; RestartCount--;
SaveRestartData();
return FALSE; return FALSE;
} }
len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d", len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d",
FBBHeader->BID, RestartRec->length); FBBHeader->BID, RestartRec->TempMsg->length);
WriteLogLine(conn, '|',Msg, len, LOG_BBS); WriteLogLine(conn, '|',Msg, len, LOG_BBS);
return (RestartRec->length); return (RestartRec->TempMsg->length);
} }
} }

View file

@ -36,12 +36,6 @@ extern int (WINAPI FAR *EnumProcessesPtr)();
#include "bpq32.h" #include "bpq32.h"
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
#define VERSION_MAJOR 2 #define VERSION_MAJOR 2
#define VERSION_MINOR 0 #define VERSION_MINOR 0
@ -544,11 +538,7 @@ pollloop:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -825,7 +815,7 @@ pollloop:
char outbuff[1000]; char outbuff[1000];
int newlen; int newlen;
buff->PID = 6; // KISS Control (PID is just before Data) buff->L2DATA[-1] = 6; // KISS Control
newlen = KissEncode(&buff->L2DATA[-1], outbuff, txlen); newlen = KissEncode(&buff->L2DATA[-1], outbuff, txlen);
sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr)); sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr));
@ -1190,6 +1180,7 @@ 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)
@ -1220,7 +1211,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->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI; TNC->Hardware = H_FLDIGI;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View file

@ -43,11 +43,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
static int RestartTNC(struct TNCINFO * TNC); static int RestartTNC(struct TNCINFO * TNC);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
static int Socket_Data(int sock, int error, int eventcode); static int Socket_Data(int sock, int error, int eventcode);
@ -457,11 +452,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC->lasttime = ltime; TNC->lasttime = ltime;
ConnecttoFreeData(port); ConnecttoFreeData(port);
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
@ -750,10 +740,7 @@ 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)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -1406,14 +1393,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_FREEDATA;
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);
@ -4152,7 +4139,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[strlen(line)], " --rigctld_ip %s --rigctld_port %d", FDI->hamlibHost, FDI->hamlibPort); sprintf(line, "%s --rigctld_ip %s --rigctld_port %d", line, FDI->hamlibHost, FDI->hamlibPort);
if (FDI->LimitBandWidth) if (FDI->LimitBandWidth)
strcat(line, " --500hz"); strcat(line, " --500hz");

View file

@ -499,15 +499,15 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HAL; TNC->Hardware = H_HAL;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
PortEntry->MAXHOSTMODESESSIONS = 1; // Default PortEntry->MAXHOSTMODESESSIONS = 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {

View file

@ -336,8 +336,7 @@ 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, BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc())
VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream))
{ {
#ifdef LINBPQ #ifdef LINBPQ
return FALSE; return FALSE;
@ -1866,6 +1865,9 @@ static char ** SeparateMultiString(char * MultiString)
return Value; return Value;
} }
extern int nextDummyInterlock; extern int nextDummyInterlock;
int standardParams(struct TNCINFO * TNC, char * buf) int standardParams(struct TNCINFO * TNC, char * buf)
@ -1914,7 +1916,7 @@ int standardParams(struct TNCINFO * TNC, char * buf)
TNC->ActiveTXFreq = atof(&buf[13]); TNC->ActiveTXFreq = atof(&buf[13]);
else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session
TNC->ActiveRXFreq = atof(&buf[13]); TNC->ActiveRXFreq = atof(&buf[13]);
else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at end of session else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at start of session
TNC->DisconnectScript = SeparateMultiString(&buf[17]); TNC->DisconnectScript = SeparateMultiString(&buf[17]);
else if (_memicmp(buf, "PTTONHEX", 8) == 0) else if (_memicmp(buf, "PTTONHEX", 8) == 0)
{ {

View file

@ -648,11 +648,7 @@ 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)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -1181,9 +1177,9 @@ 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->PortRecord = PortEntry; TNC->Hardware = H_HSMODEM;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HSMODEM; 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);

5175
HTTPcode-skigdebian.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -71,8 +71,6 @@ 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); 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;
@ -105,13 +103,9 @@ extern int NumberofPorts;
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
extern struct AXIPPORTINFO * Portlist[];
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);
int CompareRoutes(const void * a, const void * b);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token); void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen); void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
@ -149,7 +143,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%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 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 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>"
@ -2418,10 +2412,7 @@ doHeader:
if (Session == 0) if (Session == 0)
Session = &Dummy; Session = &Dummy;
if (LOCAL) Session->TNC = LOCAL; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
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);
@ -3798,129 +3789,33 @@ doHeader:
*/ */
// AXIP Partners
if (_stricmp(NodeURL, "/Node/AXIP.html") == 0)
{
int i;
char Normcall[10];
int Width = 5;
int x = 0, n = 0, nd = 0;
struct arp_table_entry * List[1000];
struct arp_table_entry * ListD[1000];
char AXIPList[10000] = "";
int ListLen = 0;
struct AXIPPORTINFO * AXPORT = Portlist[0];
struct PORTCONTROL * PORT = PORTTABLE;
struct arp_table_entry * arp;
time_t NOW = time(NULL);
char AXIPHeader[] =
"<table align='center' bgcolor='ffffff' border=2 cellpadding=10 cellspacing=2 style=font-family:monospace>"
"<tr><td align='center'>AXIP Up</td><td align='center'>AXIP Down</td></tr><tr><td valign='top'>%s";
while (PORT)
{
AXPORT = Portlist[PORT->PORTNUMBER];
if (AXPORT)
{
// Get ARP entries
for (i = 0; i < AXPORT->arp_table_len; i++)
{
arp = &AXPORT->arp_table[i];
if (arp->LastHeard == 0 || (NOW - arp->LastHeard) > 3600) // Considered down
ListD[nd++] = arp;
else
List[n++] = arp;
}
}
PORT = PORT->PORTPOINTER;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareNode);
if (nd > 1)
qsort(ListD, nd, sizeof(void *), CompareNode);
for (i = 0; i < n; i++)
{
int len = ConvFromAX25(List[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (List[i]->LastHeard)?(NOW - List[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], AXIPHeader, AXIPList);
ListLen = 0;
for (i = 0; i < nd; i++)
{
int len = ConvFromAX25(ListD[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (ListD[i]->LastHeard)?(NOW - ListD[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td><td valign='top'>%s", AXIPList);
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td></tr></table></body></html>");
}
if (_stricmp(NodeURL, "/Node/Routes.html") == 0) if (_stricmp(NodeURL, "/Node/Routes.html") == 0)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int count, i; int count;
char Normcall[10]; char Normcall[10];
char locked[4] = " "; char locked;
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
int Iframes, Retries; int Iframes, Retries;
char Active[10]; char Active[10];
int Queued; int Queued;
int x = 0, n = 0;
struct ROUTE * List[1000];
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr); ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr);
// Build and sort list of routes for (count=0; count<MaxRoutes; count++)
for (count = 0; count < MaxRoutes; count++)
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{
List[n++] = Routes;
if (n > 999)
break;
}
Routes++;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareRoutes);
for (i = 0; i < n; i++)
{
Routes = List[i];
{ {
int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall); int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
Normcall[len]=0; Normcall[len]=0;
if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG) if ((Routes->NEIGHBOUR_FLAG & 1) == 1)
strcpy(locked, "!"); locked = '!';
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
strcpy(locked, " "); locked = ' ';
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
@ -4427,7 +4322,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; char * user, * password, * Key;
struct HTTPConnectionInfo * NewSession; struct HTTPConnectionInfo * NewSession;
int i; int i;
struct UserRec * USER; struct UserRec * USER;
@ -4476,7 +4371,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[strlen(MsgPtr)], "?%s&%s", user, password); sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password);
} }
} }
@ -4839,14 +4734,7 @@ void ProcessWebmailWebSockThread(void * conn)
Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0); Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0);
if (Sent == -1) // Connecton lost while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
{
closesocket(sockptr->socket);
free(conn);
return;
}
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
{ {
if (Sent > 0) // something sent if (Sent > 0) // something sent
{ {
@ -4892,16 +4780,11 @@ void ProcessWebmailWebSockThread(void * conn)
CloseHandle(hPipe); CloseHandle(hPipe);
// ?? do we need a thread to handle write which may block
Sent = send(sockptr->socket, Reply, ReplyLen, 0); Sent = send(sockptr->socket, Reply, ReplyLen, 0);
if (Sent == -1) // Connecton lost while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
{
free(conn);
closesocket(sockptr->socket);
return;
}
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
{ {
// Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops); // Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);

View file

@ -426,7 +426,7 @@ VOID ChatExpandAndSendMessage(ChatCIRCUIT * conn, char * Msg, int LOG)
len = RemoveLF(NewMessage, (int)strlen(NewMessage)); len = RemoveLF(NewMessage, (int)strlen(NewMessage));
ChatWriteLogLine(conn, '>', NewMessage, len, LOG_CHAT); ChatWriteLogLine(conn, '>', NewMessage, len, LOG);
ChatQueueMsg(conn, NewMessage, len); ChatQueueMsg(conn, NewMessage, len);
} }
@ -1229,7 +1229,7 @@ void chkctl(ChatCIRCUIT *ckt_from, char * Buffer, int Len)
for (i = 1; i < (Len - 1); i++) for (i = 1; i < (Len - 1); i++)
{ {
if (Buffer[i] < 32 && Buffer[i] != 7) // Accept BELL if (Buffer[i] < 32)
{ {
if (Buffer[i] == 9) if (Buffer[i] == 9)
{ {
@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
__try __try
{ {
#endif #endif
len += sprintf(&line[len], " %p %s", cn->node, cn->node->alias); len = sprintf(line, "%s %p %s", line, 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 = 0; int len;
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')
len = sprintf(line, "Here %-6.6s <-", OurNode); sprintf(line, "Here %-6.6s <-", OurNode);
else else
len = sprintf(line, "Here %-6.6s <-", OurAlias); 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[len], " %s", node->call); len = sprintf(line, "%s %s", line, node->call);
else else
len += sprintf(&line[len], " %s", node->alias); len = sprintf(line, "%s %s", line, 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[len], " %s", cn->node->call); len = sprintf(line, "%s %s", line, cn->node->call);
else else
len += sprintf(&line[len], " %s", cn->node->alias); len = sprintf(line, "%s %s", line, 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[len], " *PE* Corrupt Rec %x %x", cn, cn->node);} {len = sprintf(line, "%s *PE* Corrupt Rec %x %x", line, cn, cn->node);}
} }
else else
len = sprintf(&line[len], " Corrupt Rec %x %x ", cn, cn->node); len = sprintf(line, "%s Corrupt Rec %x %x ", line, cn, cn->node);
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x ", cn, cn->node);} {len = sprintf(line, "%s *PE* Corrupt Rec %x %x ", line, 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[len], " %s", cn->node->call); len = sprintf(line, "%s %s", line, cn->node->call);
else else
len += sprintf(&line[len], " %s", cn->node->alias); len = sprintf(line, "%s %s", line, 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[len], " Corrupt Rec %p %p ", cn, cn->node); len = sprintf(line, "%s Corrupt Rec %p %p ", line, cn, cn->node);
} }
#endif #endif
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -3682,7 +3682,7 @@ VOID SendChatLinkStatus()
} }
} }
len += sprintf(&Msg[len], "%s %c ", link->call, '0' + link->flags); len = sprintf(Msg, "%s%s %c ", Msg, link->call, '0' + link->flags);
if (len > 240) if (len > 240)
break; break;

View file

@ -100,10 +100,7 @@ TODo ?Multiple Adapters
#ifdef WIN32 #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 #else
#ifndef PCAP_API PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#define PCAP_API extern
#endif
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#endif #endif
#ifndef LINBPQ #ifndef LINBPQ
@ -390,7 +387,7 @@ char * FormatIP(uint32_t Addr)
return FormatIPWork; return FormatIPWork;
} }
int CompareIPRoutes (const VOID * a, const VOID * b) int CompareRoutes (const VOID * a, const VOID * b)
{ {
PROUTEENTRY x; PROUTEENTRY x;
PROUTEENTRY y; PROUTEENTRY y;
@ -4975,7 +4972,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, str
Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes); Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
if (NumberofRoutes) if (NumberofRoutes)
qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareIPRoutes); qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareRoutes);
for (i=0; i < NumberofRoutes; i++) for (i=0; i < NumberofRoutes; i++)
{ {
@ -5416,8 +5413,11 @@ 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 SendLen; int PDULen, SendLen;
int Offset = 0; int Offset = 0;
Len = ntohs(IPptr->IPLENGTH); Len = ntohs(IPptr->IPLENGTH);

View file

@ -70,8 +70,6 @@ static RECT Rect;
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len); int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
static FILE * LogHandle[32] = {0}; static FILE * LogHandle[32] = {0};
@ -519,28 +517,6 @@ ok:
return 0; return 0;
} }
VOID KAMSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC)
{
struct STREAMINFO * STREAM = &TNC->Streams[0];
strcpy(TNC->WEB_TNCSTATE, "Interlocked");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
// STREAM->CmdSet = STREAM->CmdSave = zalloc(100);
// sprintf(STREAM->CmdSet, "I%s\r", "SCSPTC"); // Should prevent connects
}
VOID KAMReleasePort(struct TNCINFO * TNC)
{
struct STREAMINFO * STREAM = &TNC->Streams[0];
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
}
static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL) static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
{ {
int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>" int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>"
@ -591,15 +567,15 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
return ExtProc; return ExtProc;
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KAM; 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);
@ -619,11 +595,6 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort; PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort;
PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort; PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort;
// TNC->SuspendPortProc = KAMSuspendPort;
// TNC->ReleasePortProc = KAMReleasePort;
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
@ -916,30 +887,15 @@ VOID KAMPoll(int Port)
TNC->Streams[0].MyCall[calllen] = 0; TNC->Streams[0].MyCall[calllen] = 0;
EncodeAndSend(TNC, "X", 1); // ??Return to packet mode?? EncodeAndSend(TNC, "X", 1); // ??Return to packet mode??
if (TNC->VeryOldMode) if (TNC->VeryOldMode)
{
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall); datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall);
EncodeAndSend(TNC, TXMsg, datalen);
}
else else
{
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall); datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall);
EncodeAndSend(TNC, TXMsg, datalen); EncodeAndSend(TNC, TXMsg, datalen);
if (TNC->OldMode == 0)
{
EncodeAndSend(TNC, TXMsg, datalen);
datalen = sprintf(TXMsg, "C20MYGTCALL %s", TNC->Streams[0].MyCall);
}
}
TNC->InternalCmd = 'M'; TNC->InternalCmd = 'M';
TNC->NeedPACTOR = 0; // Cancel enter Pactor TNC->NeedPACTOR = 0; // Cancel enter Pactor
SuspendOtherPorts(TNC);
sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall); sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE); SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
@ -1080,30 +1036,16 @@ VOID KAMPoll(int Port)
UCHAR TXMsg[80] = "D20"; UCHAR TXMsg[80] = "D20";
if (TNC->VeryOldMode) if (TNC->VeryOldMode)
{
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall); datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall);
EncodeAndSend(TNC, TXMsg, datalen);
}
else else
{
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall); datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall);
EncodeAndSend(TNC, TXMsg, datalen); EncodeAndSend(TNC, TXMsg, datalen);
if (TNC->OldMode == 0)
{
datalen = sprintf(TXMsg, "C20MYGTCALL %s", TNC->NodeCall);
EncodeAndSend(TNC, TXMsg, datalen);
}
}
EncodeAndSend(TNC, TXMsg, datalen);
if (TNC->OldMode) if (TNC->OldMode)
EncodeAndSend(TNC, "C20PACTOR", 9); // Back to Listen EncodeAndSend(TNC, "C20PACTOR", 9); // Back to Listen
else else
EncodeAndSend(TNC, "C20TOR", 6); // Back to Listen EncodeAndSend(TNC, "C20TOR", 6); // Back to Listen
TNC->InternalCmd = 'T'; TNC->InternalCmd = 'T';
TNC->Timeout = 50; TNC->Timeout = 50;
TNC->IntCmdDelay--; TNC->IntCmdDelay--;
@ -1324,51 +1266,6 @@ VOID KAMPoll(int Port)
return; return;
} }
if (memcmp(MsgPtr, "GTOR ", 5) == 0) // GTOR Connect
{
memcpy(STREAM->RemoteCall, &MsgPtr[5], 9);
STREAM->Connecting = TRUE;
// If Stream 0, Convert C CALL to PACTOR CALL
if (Stream == 0)
{
datalen = sprintf(TXMsg, "C20GTOR %s", TNC->Streams[0].RemoteCall);
// If Pactor, check busy detecters on any interlocked ports
if (TNC->HFPacket == 0 && InterlockedCheckBusy(TNC) && TNC->OverrideBusy == 0)
{
// Channel Busy. Wait
TNC->ConnectCmd = _strdup(TXMsg);
sprintf(TNC->WEB_TNCSTATE, "Waiting for clear channel");
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
TNC->BusyDelay = TNC->BusyWait * 10;
return;
}
TNC->OverrideBusy = FALSE;
sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s",
TNC->Streams[0].MyCall, TNC->Streams[0].RemoteCall);
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
}
else
datalen = sprintf(TXMsg, "C1%cC %s", Stream + '@', STREAM->RemoteCall);
EncodeAndSend(TNC, TXMsg, datalen);
TNC->Timeout = 50;
TNC->InternalCmd = 'C'; // So we dont send the reply to the user.
ReleaseBuffer(buffptr);
STREAM->Connecting = TRUE;
return;
}
if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0) // Disconnect if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0) // Disconnect
{ {
if (Stream == 0) if (Stream == 0)
@ -1747,10 +1644,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
return; return;
} }
WritetoTrace(TNC, Buffer, Len);
// Pass to Appl // Pass to Appl
Stream = TNC->CmdStream; Stream = TNC->CmdStream;
@ -1787,76 +1680,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Msg[0] == '?') // Status if (Msg[0] == '?') // Status
{ {
TNC->Timeout = 0; TNC->Timeout = 0;
/*
The response frame from the TNC will be:
<FEND>?0MSXY<FEND> - where MSXY are coded as follows:
M One byte indicating the current mode of operation.
A=Packet
B=RTTY
C=ASCII
D=AMTOR
E=FEC
F=SELFEC
G=LAMTOR
H=PACTOR
I=PTLISTEN
J=GTOR
K=NAVTEX
L=CW
M=TOR Standby
N=GMON
O=PSK31
S One byte indicating a sub-mode of operation. The byte
contains an ASCII character as follows:
0=Standby
1=Phasing
2=Connected
3=Disconnecting
4=FEC
5=SELFEC
6=PTFEC
X One byte (called status byte X). This byte is bit-
encoded to indicate specific conditions as follows:
Bit 0 = (IDLE) set to 1 when receiving IDLE
characters in a frame.
Bit 1 = (ERR) set to 1 to indicate the received frame
failed CRC check, or was not a valid CS
response frame.
Bit 2 = (Combined receive) set to 1 to indicate that
the data was constructed through the use of
error correction (i.e. Golay error correction
for G-TOR or Memory ARQ for Pactor).
Bit 3 = (RQ) set to 1 to indicate an RQ frame. If you
are the ISS, it indicates that the receiving
station has asked for a repeat of the last
data due to received errors. When you are the
IRS, it indicates that the transmitting
station has sent the same data that you have
already received. This means that the sending
station did not properly copy your
acknowledgement (CS code).
Bit 4 = (Huffman) set to 1 to indicate that this
frame contains data which uses Huffman
compression.
Bit 5 = (ISS) set to 1 to indicate that your station
is currently the ISS.
Bit 6&7 = (Speed) these two bits indicate the current
speed of an ARQ link or the PSK31 mode. The
coding of the bits is:
00 = 100 baud or BPSK31
01 = 200 baud or QPSK31
10 = 300 baud
Y One byte (called status byte Y). This byte is bit-
encoded to indicate specific conditions as follows:
Bit 0 = reserved (set to 0).
Bit 1 = (PTT) PTT is active.
Bit 2 = (Changeover) changeover in progress
Bits 3-7 = reserved (set to 0).
*/
return; return;
} }
@ -1967,10 +1790,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Msg[1] == '2' && Msg[2] == 'A') if (Msg[1] == '2' && Msg[2] == 'A')
TNC->HFPacket = TRUE; TNC->HFPacket = TRUE;
// Stop other ports in same group
SuspendOtherPorts(TNC);
ProcessIncommingConnect(TNC, Call, Stream, TRUE); ProcessIncommingConnect(TNC, Call, Stream, TRUE);
SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream]; SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
@ -2228,10 +2047,6 @@ VOID ForcedClose(struct TNCINFO * TNC, int Stream)
VOID CloseComplete(struct TNCINFO * TNC, int Stream) VOID CloseComplete(struct TNCINFO * TNC, int Stream)
{ {
sprintf(TNC->WEB_TNCSTATE, "Free");
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
ReleaseOtherPorts(TNC);
TNC->NeedPACTOR = 50; TNC->NeedPACTOR = 50;
} }

View file

@ -458,11 +458,7 @@ ok:
if (_memicmp(txbuff, "RADIO ", 6) == 0) if (_memicmp(txbuff, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &txbuff[6]);
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]))
{ {
@ -813,10 +809,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_KISSHF;
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);

715
L2Code.c

File diff suppressed because it is too large Load diff

148
L3Code.c
View file

@ -60,12 +60,6 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE);
VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall); VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall);
void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer); void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer);
void SendVARANetromMsg(struct TNCINFO * TNC,L3MESSAGEBUFFER * Buffer); void SendVARANetromMsg(struct TNCINFO * TNC,L3MESSAGEBUFFER * Buffer);
VOID SENDNODESMSG(int Portnum);
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
extern int NODESINPROGRESS;
extern int NODESToOnePort;
extern int CLOSING;
extern BOOL NODESINPROGRESS ;; extern BOOL NODESINPROGRESS ;;
PPORTCONTROL L3CURRENTPORT; PPORTCONTROL L3CURRENTPORT;
@ -73,8 +67,6 @@ extern dest_list * CURRENTNODE;
int L3_10SECS = 10; int L3_10SECS = 10;
extern int PREFERINP3ROUTES;
VOID L3BG() VOID L3BG()
{ {
@ -100,15 +92,7 @@ VOID L3BG()
{ {
ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR; ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR;
// if NetROM over VARA or NetROM over TCP pass direct to the driver // if NetROM over VARA pass direct to the driver
if (ROUTE && ROUTE->TCPPort)
{
PL3MESSAGEBUFFER Frame = (PL3MESSAGEBUFFER)Q_REM(&DEST->DEST_Q);
TCPNETROMSend(ROUTE, Frame);
ReleaseBuffer(Frame);
continue;
}
if (ROUTE) if (ROUTE)
{ {
@ -151,14 +135,12 @@ VOID L3BG()
// Drop through to Activate // Drop through to Activate
} }
// No Active Route
if (ACTIVATE_DEST(DEST) == FALSE) if (ACTIVATE_DEST(DEST) == FALSE)
{ {
// Node has no routes - get rid of it // Node has no routes - get rid of it
REMOVENODE(DEST); REMOVENODE(DEST);
return; // Avoid risk of looking at old entries return; // Avoid riskof looking at lod entries
} }
} }
} }
@ -172,24 +154,14 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
{ {
int n = MAXDESTS; int n = MAXDESTS;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE = NULL; struct ROUTE * ROUTE;
struct _LINKTABLE * LINK; struct _LINKTABLE * LINK;
struct TNCINFO * TNC; struct TNCINFO * TNC;
int ActiveRoute; int ActiveRoute;
if (DEST->DEST_ROUTE == 0) // Don't ALREADY HAVE A SELECTED ROUTE? if (DEST->DEST_ROUTE == 0) // ALREADY HAVE A SELECTED ROUTE?
{ DEST->DEST_ROUTE = 1; // TRY TO ACTIVATE FIRST
DEST->DEST_ROUTE = 1;
if (PREFERINP3ROUTES)
{
// if we have any INP3 routes use the first. It will always be the fastest. The others are there for fallback if the first fails.
if (ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR)
DEST->DEST_ROUTE = 4; // TRY TO ACTIVATE FIRST
}
}
ActiveRoute = DEST->DEST_ROUTE - 1; ActiveRoute = DEST->DEST_ROUTE - 1;
@ -197,7 +169,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
if (ROUTE == 0) if (ROUTE == 0)
{ {
// Current Route not present // Currnet Route not present
// If current route is 1, then we must have INP3 routes (or entry is corrupt) // If current route is 1, then we must have INP3 routes (or entry is corrupt)
if (DEST->DEST_ROUTE != 1) if (DEST->DEST_ROUTE != 1)
@ -205,17 +177,13 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
// Current Route is 1 // Current Route is 1
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
return FALSE; // No INP3 so No Routes return FALSE; // No INP3 so No Routes
DEST->DEST_ROUTE = 4; // First INP3 DEST->DEST_ROUTE = 4; // First INP3
ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR; ROUTE = DEST->ROUTE[0].ROUT_NEIGHBOUR;
} }
if (ROUTE == 0) // Shouldn't happen
return FALSE;
// if NetROM over VARA conection is made by the driver // if NetROM over VARA conection is made by the driver
TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT]; TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
@ -236,7 +204,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
return L2SETUPCROSSLINK(ROUTE); return L2SETUPCROSSLINK(ROUTE);
} }
// We umst be waiting for link to come up // We mst be waiting for link to come up
return TRUE; return TRUE;
@ -255,13 +223,6 @@ char Call1[10];
char Call2[10]; char Call2[10];
char Call3[10]; char Call3[10];
VOID PROCESSNODESPOLL(struct PORTCONTROL * PORT)
{
// Pauls G8BPT's request NODES Broadcast
SENDNODESMSG(PORT->PORTNUMBER);
return;
}
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT) VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
{ {
// PROCESS A NET/ROM 'NODES' MESSAGE // PROCESS A NET/ROM 'NODES' MESSAGE
@ -298,7 +259,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
{ {
APPL=&APPLCALLTABLE[App]; APPL=&APPLCALLTABLE[App];
if (CompareCalls(Msg->ORIGIN, APPL->APPLCALL)) if (APPL->APPLHASALIAS == 0 && CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
return; return;
} }
@ -358,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)) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG & 1)) // 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) == 0) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // LOCKED ROUTE
if (PORT->IgnoreUnlocked) if (PORT->IgnoreUnlocked)
return; return;
@ -372,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 == 0) // Not LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG & 1) == 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
@ -475,10 +436,10 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
if (CheckExcludeList(ptr1) == 0) // Excluded if (CheckExcludeList(ptr1) == 0) // Excluded
continue; continue;
for (n = 0; n < NumberofAppls; n++) for (n = 0; n < 32; n++)
{ {
if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL)) if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL))
goto IgnoreNode; // Don't update our applications continue;
} }
// MAKE SURE ITS NOT CORRUPTED // MAKE SURE ITS NOT CORRUPTED
@ -587,7 +548,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
ptr1 += 7; ptr1 += 7;
// UPDATE ALIAS# // UPDATE ALIAS
memcpy(DEST->DEST_ALIAS, ptr1, 6); memcpy(DEST->DEST_ALIAS, ptr1, 6);
@ -746,11 +707,11 @@ int COUNTNODES(struct ROUTE * ROUTE)
count++; count++;
else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
DEST++; DEST++;
@ -765,26 +726,12 @@ VOID L3BG();
VOID SENDNEXTNODESFRAGMENT(); VOID SENDNEXTNODESFRAGMENT();
VOID SENDNODESMSG(int Portnum) VOID SENDNODESMSG()
{ {
if (NODESINPROGRESS) if (NODESINPROGRESS)
return; return;
NODESToOnePort = Portnum;
if (Portnum) // Nodes to one port only
{
L3CURRENTPORT = GetPortTableEntryFromPortNum(Portnum);
if (L3CURRENTPORT == 0)
{
NODESToOnePort = 0;
return;
}
}
else
L3CURRENTPORT = PORTTABLE; L3CURRENTPORT = PORTTABLE;
SENDNEXTNODESFRAGMENT(); SENDNEXTNODESFRAGMENT();
} }
@ -820,18 +767,15 @@ VOID SENDNEXTNODESFRAGMENT()
// No NODES to this port, so go to next // No NODES to this port, so go to next
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;
if (PORT == NULL)
if (PORT == NULL || NODESToOnePort)
{ {
// Finished // Finished
NODESToOnePort = 0;
NODESINPROGRESS = 0; NODESINPROGRESS = 0;
return; return;
} }
} }
if (NODESToOnePort == 0) // CurrentPort already set if NODESToOnePort
L3CURRENTPORT = PORT; L3CURRENTPORT = PORT;
DEST = CURRENTNODE = DESTS; // START OF LIST DEST = CURRENTNODE = DESTS; // START OF LIST
@ -889,16 +833,6 @@ VOID SENDNEXTNODESFRAGMENT()
if (DEST >= ENDDESTLIST) if (DEST >= ENDDESTLIST)
{ {
CURRENTNODE = 0; // Finished on this port CURRENTNODE = 0; // Finished on this port
// if sending to only one port then stop
if (NODESToOnePort)
{
NODESToOnePort = 0;
NODESINPROGRESS = 0;
}
else
{
L3CURRENTPORT = PORT->PORTPOINTER; L3CURRENTPORT = PORT->PORTPOINTER;
if (L3CURRENTPORT == NULL) if (L3CURRENTPORT == NULL)
{ {
@ -906,13 +840,12 @@ VOID SENDNEXTNODESFRAGMENT()
NODESINPROGRESS = 0; NODESINPROGRESS = 0;
} }
}
goto Sendit; goto Sendit;
} }
if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL && if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN && DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
(NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if NODE = 0; (NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if DEST = 0;
{ {
// Send it // Send it
@ -945,9 +878,6 @@ VOID SENDNEXTNODESFRAGMENT()
*(ptr1++) = (UCHAR)Qual; *(ptr1++) = (UCHAR)Qual;
if (Qual == 0)
continue;
Count--; Count--;
} }
DEST++; DEST++;
@ -994,15 +924,13 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason)
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason) VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
{ {
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
// SET INACTIVE // SET INACTIVE
dest_list * DEST; dest_list * DEST;
int n; int n;
// If a link restarts and is no longer inp3 we must still clear any inp3 routes if (Reason != NORMALCLOSE || ROUTE->INP3Node)
// if (Reason != NORMALCLOSE || ROUTE->INP3Node)
TellINP3LinkGone(ROUTE); TellINP3LinkGone(ROUTE);
DEST = DESTS; DEST = DESTS;
@ -1017,7 +945,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
if (DEST->DEST_ROUTE == 0) if (DEST->DEST_ROUTE == 0)
continue; continue;
if (DEST->INP3ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route if (DEST->ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route
{ {
// Yes, so clear // Yes, so clear
@ -1095,7 +1023,7 @@ VOID L3TimerProc()
L3TIMER = L3INTERVAL; L3TIMER = L3INTERVAL;
UPDATEDESTLIST(); UPDATEDESTLIST();
SENDNODESMSG(0); SENDNODESMSG();
} }
} }
@ -1110,7 +1038,7 @@ VOID L3TimerProc()
{ {
ROUTE++; ROUTE++;
if (ROUTE->NEIGHBOUR_FLAG) // Locked? if (ROUTE->NEIGHBOUR_FLAG & 1) // Locked?
continue; continue;
if (ROUTE->NEIGHBOUR_LINK) // Has an active Session if (ROUTE->NEIGHBOUR_LINK) // Has an active Session
@ -1133,11 +1061,6 @@ VOID L3FastTimer()
MESSAGE * Msg; MESSAGE * Msg;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
// Not if Node is closing
if (CLOSING)
return;
INP3TIMER(); INP3TIMER();
// Send Node faster if VARA // Send Node faster if VARA
@ -1197,7 +1120,7 @@ UPDEST000:
{ {
// Any INP3 Routes? // Any INP3 Routes?
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
{ {
// NO ROUTES LEFT TO DEST - REMOVE IT // NO ROUTES LEFT TO DEST - REMOVE IT
@ -1369,25 +1292,19 @@ VOID REMOVENODE(dest_list * DEST)
NUMBEROFNODES--; NUMBEROFNODES--;
} }
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK) VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
{ {
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED // L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE; struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL) if (ROUTE == NULL)
return; // NOTHING ??? return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
TellINP3LinkSetupFailed(ROUTE); TellINP3LinkSetupFailed(ROUTE);
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
@ -1396,10 +1313,9 @@ VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
} }
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE) VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
{ {
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
// SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE // SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
int n = MAXDESTS; int n = MAXDESTS;
@ -1412,7 +1328,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
if (ActiveRoute) if (ActiveRoute)
{ {
ActiveRoute --; // Routes numbered 1 - 6, index from 0 ActiveRoute --; // Routes numbered 1 - 6, idex from 0
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE) if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
{ {

957
L4Code.c

File diff suppressed because it is too large Load diff

2154
LinBPQ-skigdebian.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -83,10 +83,8 @@ void RHPPoll();
VOID GetPGConfig(); VOID GetPGConfig();
void SendBBSDataToPktMap(); void SendBBSDataToPktMap();
void CloseAllLinks();
void hookNodeClosing(char * Reason);
extern uint64_t INP3timeLoadedMS; extern uint64_t timeLoadedMS;
BOOL IncludesMail = FALSE; BOOL IncludesMail = FALSE;
BOOL IncludesChat = FALSE; BOOL IncludesChat = FALSE;
@ -264,9 +262,9 @@ extern char MailDir[MAX_PATH];
extern time_t MaintClock; // Time to run housekeeping extern time_t MaintClock; // Time to run housekeeping
#ifdef WIN32 #ifdef WIN32
int KEEPGOING = 30; // 5 secs to shut down BOOL KEEPGOING = 30; // 5 secs to shut down
#else #else
int KEEPGOING = 50; // 5 secs to shut down BOOL KEEPGOING = 50; // 5 secs to shut down
#endif #endif
BOOL Restarting = FALSE; BOOL Restarting = FALSE;
BOOL CLOSING = FALSE; BOOL CLOSING = FALSE;
@ -339,7 +337,6 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
// Handle the CTRL-C signal. // Handle the CTRL-C signal.
case CTRL_C_EVENT: case CTRL_C_EVENT:
printf( "Ctrl-C event\n\n" ); printf( "Ctrl-C event\n\n" );
CloseAllLinks();
CLOSING = TRUE; CLOSING = TRUE;
Beep( 750, 300 ); Beep( 750, 300 );
return( TRUE ); return( TRUE );
@ -347,7 +344,6 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
// CTRL-CLOSE: confirm that the user wants to exit. // CTRL-CLOSE: confirm that the user wants to exit.
case CTRL_CLOSE_EVENT: case CTRL_CLOSE_EVENT:
CloseAllLinks();
CLOSING = TRUE; CLOSING = TRUE;
printf( "Ctrl-Close event\n\n" ); printf( "Ctrl-Close event\n\n" );
Sleep(20000); Sleep(20000);
@ -358,7 +354,6 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
case CTRL_BREAK_EVENT: case CTRL_BREAK_EVENT:
Beep( 900, 200 ); Beep( 900, 200 );
printf( "Ctrl-Break event\n\n" ); printf( "Ctrl-Break event\n\n" );
CloseAllLinks();
CLOSING = TRUE; CLOSING = TRUE;
Beep( 750, 300 ); Beep( 750, 300 );
return FALSE; return FALSE;
@ -371,7 +366,6 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
case CTRL_SHUTDOWN_EVENT: case CTRL_SHUTDOWN_EVENT:
Beep( 750, 500 ); Beep( 750, 500 );
printf( "Ctrl-Shutdown event\n\n" ); printf( "Ctrl-Shutdown event\n\n" );
CloseAllLinks();
CLOSING = TRUE; CLOSING = TRUE;
Beep( 750, 300 ); Beep( 750, 300 );
return FALSE; return FALSE;
@ -387,11 +381,12 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#include <signal.h> #include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig) static void segvhandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "\nSIGSEGV Received\n"; char msg[] = "SIGSEGV Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
@ -402,12 +397,6 @@ static void segvhandler(int sig)
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
hookNodeClosing("sigsegv");
Sleep(500);
exit(1); exit(1);
} }
@ -415,38 +404,28 @@ static void abrthandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "\nSIGABRT Received\n"; char msg[] = "SIGABRT Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
write(STDOUT_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
hookNodeClosing("sigabrt");
Sleep(500);
exit(1); 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");
CLOSING = TRUE; CLOSING = TRUE;
CloseAllLinks();
} }
static void sigint_handler(int sig) static void sigint_handler(int sig)
{ {
printf("terminating on SIGINT\n"); printf("terminating on SIGINT\n");
CLOSING = TRUE; CLOSING = TRUE;
CloseAllLinks();
} }
@ -808,8 +787,6 @@ int Redirected = 0;
static void segvhandler(int sig); static void segvhandler(int sig);
static void abrthandler(int sig); static void abrthandler(int sig);
void GetRestartData();
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -853,22 +830,21 @@ int main(int argc, char * argv[])
#endif #endif
#endif #endif
// Disable Console Terminal if stdout redirected // Disable Console Terminal if stdout redirected
// printf("STDOUT %d\n",isatty(STDOUT_FILENO)); // printf("STDOUT %d\n",isatty(STDOUT_FILENO));
// printf("STDIN %d\n",isatty(STDIN_FILENO)); // printf("STDIN %d\n",isatty(STDIN_FILENO));
if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)) if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO))
Redirected = 1; Redirected = 1;
INP3timeLoadedMS = GetTickCount(); timeLoadedMS = GetTickCount();
#endif #endif
printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring); printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
printf("%s\n", VerCopyright); printf("%s\n", VerCopyright);
srand(time(NULL));
// look for optarg format parameters // look for optarg format parameters
@ -926,10 +902,7 @@ int main(int argc, char * argv[])
Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring); Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring);
#if defined(MACBPQ) || defined(FREEBSD) #ifndef MACBPQ
time_t dummy;
_MYTIMEZONE = -localtime(&dummy)->tm_gmtoff;
#else
_MYTIMEZONE = _timezone; _MYTIMEZONE = _timezone;
#endif #endif
@ -1201,8 +1174,6 @@ int main(int argc, char * argv[])
chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO); chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif #endif
// Make backup copies of Databases // Make backup copies of Databases
// CopyConfigFile(ConfigName); // CopyConfigFile(ConfigName);
@ -1224,7 +1195,6 @@ int main(int argc, char * argv[])
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetPGConfig(); GetPGConfig();
GetRestartData();
// Make sure there is a user record for the BBS, with BBS bit set. // Make sure there is a user record for the BBS, with BBS bit set.
@ -1472,7 +1442,6 @@ int main(int argc, char * argv[])
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveConfig(ConfigName); SaveConfig(ConfigName);
SaveRestartData();
} }
KEEPGOING--; // Give time for links to close KEEPGOING--; // Give time for links to close
@ -1696,9 +1665,6 @@ int main(int argc, char * argv[])
Slowtimer = 0; Slowtimer = 0;
} }
hookNodeClosing("Shutdown");
Sleep(500);
printf("Closing Ports\n"); printf("Closing Ports\n");
CloseTNCEmulator(); CloseTNCEmulator();

View file

@ -407,10 +407,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
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))
{ {
@ -713,7 +710,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK; TNC->Hardware = H_MPSK;
MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
@ -1542,7 +1539,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[strlen(Cmd)], "%cBEACON_ARQ_FAE\x1b", '\x1a'); sprintf(Cmd, "%s%cBEACON_ARQ_FAE\x1b", Cmd, '\x1a');
Len = strlen(Cmd); Len = strlen(Cmd);

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[strlen(ToString)], "To: %s\r\n", &Addr[4]); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, &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[strlen(ToString)], "To: %s@%s\r\n", &Addr[4], Via); ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, &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[strlen(ToString)], "To: %s\r\n", Addr); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, 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;

134
Moncode.c
View file

@ -59,7 +59,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define NODES_SIG 0xFF #define NODES_SIG 0xFF
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, 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);
UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen); UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
@ -535,16 +535,6 @@ KC6OAR*>ID:
Output += sprintf((char *)Output, " RX Window=%d", value); Output += sprintf((char *)Output, " RX Window=%d", value);
break; break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
} }
} }
} }
@ -561,15 +551,6 @@ KC6OAR*>ID:
switch (ADJBUFFER->PID) switch (ADJBUFFER->PID)
{ {
case 0xF1:
case 0xF2:
// Compressed L2 Data
Output += sprintf((char *)Output, " <%d Bytes of Compressed L2 Data>", MsgLen - (19 + sizeof(void *)));
break;
case 0xF0: // Normal Data case 0xF0: // Normal Data
{ {
char Infofield[257]; char Infofield[257];
@ -655,13 +636,12 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
char Node[10]; char Node[10];
UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window; UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window;
UCHAR * ptr = &ADJBUFFER->L2DATA[0]; UCHAR * ptr = &ADJBUFFER->L2DATA[0];
int service = 0;
int netromx = 0; // Set if Paula's connect to service
if (ADJBUFFER->L2DATA[0] == NODES_SIG) if (ADJBUFFER->L2DATA[0] == NODES_SIG)
{ {
// Display NODES // Display NODES
// If an INP3 RIF (type <> UI) decode as such // If an INP3 RIF (type <> UI) decode as such
if (ADJBUFFER->CTL != 3) // UI if (ADJBUFFER->CTL != 3) // UI
@ -692,14 +672,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
return Output; return Output;
} }
if (ADJBUFFER->L2DATA[0] == 0xfe) // Paula's Nodes Poll
{
memcpy(Alias, ++ptr, 6);
Output += sprintf((char *)Output, " NODES POLL from %s\r", Alias);
return Output;
}
// Display normal NET/ROM transmissions // Display normal NET/ROM transmissions
Output += sprintf((char *)Output, " NET/ROM\r "); Output += sprintf((char *)Output, " NET/ROM\r ");
@ -723,12 +695,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
switch (OpCode) switch (OpCode)
{ {
case L4CREQX: // Paula's connect to service
netromx = 1;
service = (RXNO << 8) | TXNO;
case L4CREQ: case L4CREQ:
Window = *(ptr++); Window = *(ptr++);
@ -737,9 +703,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
Node[ConvFromAX25(ptr, Node)] = 0; Node[ConvFromAX25(ptr, Node)] = 0;
ptr +=7; ptr +=7;
if (netromx)
Output += sprintf((char *)Output, "<CON REQX> w=%d %d@%s at %s", Window, service, Dest, Node);
else
Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node); Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node);
if (MsgLen > 38) // BPQ Extended Params if (MsgLen > 38) // BPQ Extended Params
@ -755,7 +718,7 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
if (Flags & L4BUSY) // BUSY RETURNED if (Flags & L4BUSY) // BUSY RETURNED
return Output + sprintf((char *)Output, " <CON NAK> - BUSY"); return Output + sprintf((char *)Output, " <CON NAK> - BUSY");
return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[0], TXNO, RXNO); return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[1], TXNO, RXNO);
case L4DREQ: case L4DREQ:
@ -765,10 +728,6 @@ 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];
@ -787,9 +746,6 @@ 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)
@ -1003,87 +959,3 @@ char * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output)
ptr[15], ptr[16], ptr[17], ptr[18], Dest, ptr[26], ptr[27], ptr[28], ptr[29]); ptr[15], ptr[16], ptr[17], ptr[18], Dest, ptr[26], ptr[27], ptr[28], ptr[29]);
} }
char Lastpacketlog[256];
int PacketLogDelay = 30000;
extern BPQVECSTRUC * FILEMONVECTOR;
extern UCHAR LogDirectory[260];
void WritePacketLogThread(void * param)
{
char FN[256];
time_t T;
struct tm * tm;
FILE * Handle;
int MsgLen;
MESSAGE * MSG;
MESSAGE * Q;
char buffer[512];
while(1)
{
BOOL SaveMTX = MTX;
BOOL SaveMCOM = MCOM;
BOOL SaveMUI = MUIONLY;
Sleep(PacketLogDelay);
// Get chain of queued packets under semaphore
GetSemaphore(&Semaphore, 101);
Q = FILEMONVECTOR->HOSTTRACEQ;
FILEMONVECTOR->HOSTTRACEQ = 0;
FreeSemaphore(&Semaphore);
if (Q == 0)
continue;
// Open log file and write decoded packets
T = time(NULL);
tm = gmtime(&T);
if (LogDirectory[0] == 0)
{
strcpy(FN, "logs/PacketLog");
}
else
{
strcpy(FN, LogDirectory);
strcat(FN, "/");
strcat(FN, "logs/PacketLog");
}
sprintf(&FN[strlen(FN)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(FN, "ab");
if (Handle == NULL)
return;
while (Q)
{
MSG = Q;
Q = MSG->CHAIN; // get first
IntSetTraceOptionsEx(MMASK, 1, 1, 0);
MsgLen = IntDecodeFrame(MSG, buffer, MSG->Timestamp, 0xffffffffffffffff, FALSE, FALSE);
IntSetTraceOptionsEx(MMASK, SaveMTX, SaveMCOM, SaveMUI);
fwrite(buffer , 1, MsgLen, Handle);
GetSemaphore(&Semaphore, 101);
ReleaseBuffer(MSG);
FreeSemaphore(&Semaphore);
}
fclose(Handle);
}
return;
}

View file

@ -919,9 +919,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
DoRefresh(Cinfo); DoRefresh(Cinfo);
Cinfo->Console->bytesRxed += Cinfo->kbptr+1;
if (Cinfo->Console->SysopChatStream) if (Cinfo->Console->SysopChatStream)
SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1); SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1);
else else
@ -945,30 +942,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
if (wParam == 0x7) // BEL (Ctrl/G)
{
// Get buffer, append 07 and write back
Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1,
(LPARAM) (LPCSTR)Cinfo->kbbuf);
Cinfo->kbbuf[Cinfo->kbptr++] = 7;
Cinfo->kbbuf[Cinfo->kbptr] = 0;
SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
// Send cursor right
for (i = 0; i < strlen(Cinfo->kbbuf); i++)
{
SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
}
return 0;
}
} }
return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam);

View file

@ -1,551 +0,0 @@
/*
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
*/
/*
Netrom over TCP Support
This is intended for operation over radio links with an IP interface, eg New Packet Radio or possibly microwave links
To simplify interface to the rest of the oode dummy LINK and PORT records are created
Packet Format is Length (2 byte little endian) Call (10 bytes ASCII) NETROM L3/4 Packet, starting 0xcf (to detect framing errors).
A TCP message can contain multiple packets and/or partial packets
It uses the Telnet Server, with port defined in NETROMPORT
ROUTE definitions have an extra field, the TCP Port Number
*/
//#pragma data_seg("_BPQDATA")
#define _CRT_SECURE_NO_DEPRECATE
#include "time.h"
#include "stdio.h"
#include <fcntl.h>
//#include "vmm.h"
#include "cheaders.h"
#include "asmstrucs.h"
#include "telnetserver.h"
#define NETROM_PID 0xCF
void NETROMConnectionLost(struct ConnectionInfo * sockptr);
int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo);
int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr);
void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info);
VOID SendRTTMsg(struct ROUTE * Route);
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
struct NRTCPMsg
{
short Length;
char Call[10];
unsigned char PID;
char Packet[1024];
};
struct NRTCPSTRUCT
{
struct ConnectionInfo * sockptr;
struct _LINKTABLE * LINK; // Dummy Link Record for this ROUTE
struct ROUTE * Route; // May need backlink
char Call[10];
};
struct NRTCPSTRUCT * NRTCPInfo[256] = {0};
// Do we want to use normal TCP server connections, which are limited, or our own. Let's try our own for now
struct ConnectionInfo * AllocateNRTCPRec()
{
struct ConnectionInfo * sockptr = 0;
struct NRTCPSTRUCT * Info;
int i;
for (i = 0; i < 255; i++)
{
if (NRTCPInfo[i] == 0)
{
// only allocate as many as needed
Info = NRTCPInfo[i] = (struct NRTCPSTRUCT *)zalloc(sizeof(struct NRTCPSTRUCT));
Info->sockptr = (struct ConnectionInfo *)zalloc(sizeof(struct ConnectionInfo));
Info->LINK = (struct _LINKTABLE *)zalloc(sizeof(struct _LINKTABLE));
Info->sockptr->Number = i;
}
else
Info = NRTCPInfo[i];
sockptr = Info->sockptr;
if (sockptr->SocketActive == FALSE)
{
sockptr->SocketActive = TRUE;
sockptr->ConnectTime = sockptr->LastSendTime = time(NULL);
Debugprintf("NRTCP Allocated %d", i);
return sockptr;
}
}
return 0;
}
void checkNRTCPSockets(int portNo)
{
SOCKET sock;
int Active = 0;
SOCKET maxsock;
int retval;
int i;
struct timeval timeout;
fd_set readfd, writefd, exceptfd;
struct ConnectionInfo * sockptr;
timeout.tv_sec = 0;
timeout.tv_usec = 0; // poll
maxsock = 0;
FD_ZERO(&readfd);
FD_ZERO(&writefd);
FD_ZERO(&exceptfd);
for (i = 0; i < 255; i++)
{
if (NRTCPInfo[i] == 0)
break; // only as many as have been used
sockptr = NRTCPInfo[i]->sockptr;
if (sockptr->SocketActive == 0)
continue;
if (sockptr->Connecting)
{
// look for complete or failed
FD_SET(sockptr->socket, &writefd);
FD_SET(sockptr->socket, &exceptfd);
}
else
{
FD_SET(sockptr->socket, &readfd);
FD_SET(sockptr->socket, &exceptfd);
}
Active++;
if (sockptr->socket > maxsock)
maxsock = sockptr->socket;
}
if (Active)
{
retval = select((int)maxsock + 1, &readfd, &writefd, &exceptfd, &timeout);
if (retval == -1)
{
perror("data select");
Debugprintf("NRTCP Select Error %d Active %d", WSAGetLastError(), Active);
}
else
{
if (retval)
{
// see who has data
for (i = 0; i < 255; i++)
{
if (NRTCPInfo[i] == 0)
break;
sockptr = NRTCPInfo[i]->sockptr;
if (sockptr->SocketActive == 0)
continue;
sock = sockptr->socket;
if (FD_ISSET(sock, &writefd))
NETROMConnected(sockptr, sock, NRTCPInfo[i]);
if (FD_ISSET(sock, &readfd))
DataSocket_ReadNETROM(sockptr, sock, NRTCPInfo[i], portNo);
if (FD_ISSET(sock, &exceptfd))
NETROMConnectionLost(sockptr);
}
}
}
}
}
int NETROMOpenConnection(struct ROUTE * Route)
{
struct NRTCPSTRUCT * Info;
struct ConnectionInfo * sockptr;
Debugprintf("Opening NRTCP Connection");
if (Route->TCPSession)
{
// SESSION ALREADY EXISTS
sockptr = Route->TCPSession->sockptr;
if (sockptr->Connected || sockptr->Connecting)
return TRUE;
// previous connect failed
}
else
{
sockptr = AllocateNRTCPRec();
if (sockptr == NULL)
return 0;
Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
memcpy(Info->Call, MYNETROMCALL, 10);
Route->NEIGHBOUR_LINK = Info->LINK;
Info->Route = Route;
Info->LINK->NEIGHBOUR = Route;
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
}
return NETROMTCPConnect(Route, sockptr);
}
int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
{
int err;
u_long param=1;
BOOL bcopt=TRUE;
SOCKET sock;
struct sockaddr_in sinx;
int addrlen=sizeof(sinx);
char PortString[20];
struct addrinfo hints, *res = 0, *saveres;
int Port = Route->TCPPort;
sprintf(PortString, "%d", Port);
// get host info, make socket, and connect it
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(Route->TCPHost, PortString, &hints, &res);
if (!res)
{
err = WSAGetLastError();
Debugprintf("Resolve HostName %s Failed - Error %d", Route->TCPHost, err);
return FALSE; // Resolve failed
}
// Step thorough the list of hosts
saveres = res; // Save for free
sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sock == INVALID_SOCKET)
{
Debugprintf, ("Netrom over TCP Create Socket Failed");
return FALSE;
}
ioctl(sock, FIONBIO, &param);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
{
//
// Connected successful
//
sockptr->Connected = TRUE;
freeaddrinfo(saveres);
return TRUE;
}
else
{
freeaddrinfo(saveres);
err=WSAGetLastError();
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
{
// Connect in Progress
sockptr->Connecting = TRUE;
return TRUE;
}
else
{
// Connect failed
closesocket(sockptr->socket);
return FALSE;
}
}
return FALSE;
}
void NETROMConnectionAccepted(struct ConnectionInfo * sockptr)
{
// Not sure we can do much here until first message arrives with callsign
sockptr->Connected = TRUE;
Debugprintf("NRTCP Connection Accepted");
}
void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info)
{
// Connection Complete
Debugprintf("NRTCP Connected");
sockptr->Connecting = FALSE;
sockptr->Connected = TRUE;
Info->LINK->L2STATE = 5;
if (Info->Route->INP3Node)
SendRTTMsg(Info->Route);
}
int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo)
{
int len=0, maxlen;
struct NRTCPMsg * Msg;
struct _L3MESSAGEBUFFER * L3Msg;
struct ROUTE * Route;
UCHAR axCall[7];
PMESSAGE Buffer;
ioctl(sock,FIONREAD,&len);
maxlen = InputBufferLen - sockptr->InputLen;
if (len > maxlen) len = maxlen;
len = recv(sock, &sockptr->InputBuffer[sockptr->InputLen], len, 0);
if (len == SOCKET_ERROR || len == 0)
{
// Failed or closed - clear connection
NETROMConnectionLost(sockptr);
return 0;
}
sockptr->InputLen += len;
// Process data
checkLen:
// See if we have a whole packet
Msg = (struct NRTCPMsg *)&sockptr->InputBuffer[0];
if (Msg->Length > sockptr->InputLen) // if not got whole frame wait
return 0;
if (Info->Call[0] == 0)
{
// first packet - do we need to do anything?
// This must be an incoming connection as Call is set before calling so need to find route record and set things up.
memcpy(Info->Call, Msg->Call, 10);
ConvToAX25(Msg->Call, axCall);
if (FindNeighbour(axCall, portNo, &Route))
{
Info->Route = Route;
Route->NEIGHBOUR_LINK = Info->LINK;
Info->LINK->NEIGHBOUR = Route;
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
Route->TCPSession = Info;
Info->LINK->L2STATE = 5;
if (Info->Route->INP3Node)
SendRTTMsg(Info->Route);
}
else
goto seeifMore; // Should we kill connection?
}
if (memcmp(Info->Call, Msg->Call, 10) != 0)
{
// something wrong - maybe connection reused
}
// Format as if come from an ax.25 link
L3Msg = GetBuff();
if (L3Msg == 0)
goto seeifMore;
L3Msg->LENGTH = (Msg->Length - 12) + MSGHDDRLEN;
L3Msg->Next = 0;
L3Msg->Port = 0;
L3Msg->L3PID = NETROM_PID;
memcpy(&L3Msg->L3SRCE, Msg->Packet, Msg->Length - 13);
// Create a dummy L2 message so we can trace it
Buffer = GetBuff();
if (Buffer)
{
Buffer->CHAIN = 0;
Buffer->CTL = 0;
Buffer->PORT = portNo;
ConvToAX25(Info->Call, Buffer->ORIGIN);
ConvToAX25(MYNETROMCALL, Buffer->DEST);
memcpy(Buffer->L2DATA, &L3Msg->L3SRCE[0], Msg->Length - 13);
Buffer->ORIGIN[6] |= 1; // Set end of calls
Buffer->PID = NETROM_PID;
Buffer->LENGTH = Msg->Length + 10;
time(&Buffer->Timestamp);
BPQTRACE(Buffer, FALSE);
ReleaseBuffer(Buffer);
}
NETROMMSG(Info->LINK, L3Msg);
seeifMore:
sockptr->InputLen -= Msg->Length;
if (sockptr->InputLen > 0)
{
memmove(sockptr->InputBuffer, &sockptr->InputBuffer[Msg->Length], sockptr->InputLen);
goto checkLen;
}
return 0;
}
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
{
struct NRTCPMsg Msg;
unsigned char * Data = (unsigned char *)&Frame->L3SRCE[0];
int DataLen = Frame->LENGTH - (MSGHDDRLEN + 1); // Not including PID
int Ret;
PMESSAGE Buffer;
Msg.Length = DataLen + 13; // include PID
memcpy(Msg.Call, MYNETROMCALL, 10);
Msg.PID = NETROM_PID;
memcpy(Msg.Packet, Data, DataLen);
if (Route->TCPSession == 0)
return;
Ret = send(Route->TCPSession->sockptr->socket, (char *)&Msg, DataLen + 13, 0);
// Create a dummy L2 message so we can trace it
Buffer = GetBuff();
if (Buffer)
{
Buffer->CHAIN = 0;
Buffer->CTL = 0;
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
memcpy(Buffer->L2DATA, &Frame->L3SRCE[0], DataLen);
Buffer->ORIGIN[6] |= 1; // Set end of calls
Buffer->PID = NETROM_PID;
Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
time(&Buffer->Timestamp);
BPQTRACE(Buffer, FALSE);
ReleaseBuffer(Buffer);
}
}
void NETROMConnectionLost(struct ConnectionInfo * sockptr)
{
struct NRTCPSTRUCT * Info = NRTCPInfo[sockptr->Number];
struct ROUTE * Route;
closesocket(sockptr->socket);
// If there is an attached route (there should be) clear all connections
if (Info)
{
Route = Info->Route;
if (sockptr->Connected)
L3LINKCLOSED(Info->LINK, LINKLOST);
if (sockptr->Connecting)
L3LINKCLOSED(Info->LINK, SETUPFAILED);
Route->TCPSession = 0;
Info->Call[0] = 0;
}
sockptr->SocketActive = FALSE;
memset(sockptr, 0, sizeof(struct ConnectionInfo));
}

BIN
PG/Loop.obj Normal file

Binary file not shown.

BIN
PG/PGTest.obj Normal file

Binary file not shown.

641
RHP-skigdebian.c Normal file
View file

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

136
RHP.c
View file

@ -28,7 +28,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "cheaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "telnetserver.h"
int FindFreeStreamNoSem(); int FindFreeStreamNoSem();
DllExport int APIENTRY DeallocateStream(int stream); DllExport int APIENTRY DeallocateStream(int stream);
@ -41,7 +40,6 @@ static int GetJSONInt(char * _REPLYBUFFER, char * Name);
struct RHPSessionInfo struct RHPSessionInfo
{ {
struct ConnectionInfo * sockptr;
SOCKET Socket; // Websocks Socket SOCKET Socket; // Websocks Socket
int BPQStream; int BPQStream;
int Handle; // RHP session ID int Handle; // RHP session ID
@ -51,7 +49,6 @@ struct RHPSessionInfo
BOOL Connecting; // Set while waiting for connection to complete BOOL Connecting; // Set while waiting for connection to complete
BOOL Listening; BOOL Listening;
BOOL Connected; BOOL Connected;
int Busy;
}; };
struct RHPConnectionInfo struct RHPConnectionInfo
@ -68,7 +65,6 @@ struct RHPParamBlock
unsigned char * Msg; unsigned char * Msg;
int Len; int Len;
SOCKET Socket; SOCKET Socket;
struct ConnectionInfo * sockptr;
}; };
@ -80,13 +76,8 @@ struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions; int NumberofRHPSessions;
char ErrCodes[18][24] = char ErrCodes[18][24] =
{ {"Ok", "Unspecified", "Bad or missing type", "Invalid handle", "No memory", "Bad or missing mode",
"Ok",
"Unspecified",
"Bad or missing type",
"Invalid handle",
"No memory",
"Bad or missing mode",
"Invalid local address", "Invalid local address",
"Invalid remote address" , "Invalid remote address" ,
"Bad or missing family" , "Bad or missing family" ,
@ -116,10 +107,9 @@ int WhatsPacConfigured = 1;
int RHPPaclen = 236; int RHPPaclen = 236;
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer); int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer); int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer); int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer);
@ -132,6 +122,7 @@ void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len // WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
if (Len < 126) if (Len < 126)
{ {
// Two Byte Header // Two Byte Header
@ -191,7 +182,7 @@ void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
return; return;
} }
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen); void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen);
void RHPThread(void * Params) void RHPThread(void * Params)
{ {
@ -199,7 +190,7 @@ void RHPThread(void * Params)
struct RHPParamBlock * Block = (struct RHPParamBlock *)Params; struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
ProcessRHPWebSock(Block->sockptr, Block->Socket, Block->Msg, Block->Len); ProcessRHPWebSock(Block->Socket, Block->Msg, Block->Len);
free(Block->Msg); free(Block->Msg);
free(Params); free(Params);
@ -211,7 +202,7 @@ int RHPProcessHTTPMessage(void * conn, char * response, char * Method, char * UR
return 0; return 0;
} }
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen) void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen)
{ {
int Loops = 0; int Loops = 0;
int InputLen = 0; int InputLen = 0;
@ -273,14 +264,11 @@ void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Ms
// {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~. // {"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"}. // {"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); GetJSONValue(Msg, "\"type\":", Value, 15);
if (_stricmp(Value, "open") == 0) if (_stricmp(Value, "open") == 0)
{ {
Len = processRHCPOpen(sockptr, Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header Len = processRHCPOpen(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
if (Len) if (Len)
SendWebSockMessage(Socket, OutBuffer, Len); SendWebSockMessage(Socket, OutBuffer, Len);
return; return;
@ -299,22 +287,7 @@ void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Ms
SendWebSockMessage(Socket, OutBuffer, Len); SendWebSockMessage(Socket, OutBuffer, Len);
return; return;
} }
Debugprintf(Msg);
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) void ProcessRHPWebSockClosed(SOCKET socket)
@ -353,7 +326,7 @@ void ProcessRHPWebSockClosed(SOCKET socket)
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer) int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
{ {
//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128} //{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
@ -371,7 +344,7 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
int Handle = 1; int Handle = 1;
int Stream; int Stream;
unsigned char AXCall[10]; unsigned char AXCall[10];
int Len;
int n; int n;
// ID seems to be used for control commands like open. SeqNo for data within a session (i Think! // ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
@ -416,7 +389,7 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
} }
strcpy(pgm, "RHP"); strcpy(pgm, "RHP");
Stream = FindFreeStream(); Stream = FindFreeStreamNoSem();
strcpy(pgm, "bpq32.exe"); strcpy(pgm, "bpq32.exe");
if (Stream == 255) if (Stream == 255)
@ -426,7 +399,6 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
RHPSession->Handle = Handle; RHPSession->Handle = Handle;
RHPSession->Connecting = TRUE; RHPSession->Connecting = TRUE;
RHPSession->Socket = Socket; RHPSession->Socket = Socket;
RHPSession->sockptr = sockptr;
strcpy(RHPSession->Local, Local); strcpy(RHPSession->Local, Local);
strcpy(RHPSession->Remote, Remote); strcpy(RHPSession->Remote, Remote);
@ -451,13 +423,8 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
int ID; int ID;
char * Data; char * Data;
char * ptr; char * ptr;
unsigned char * uptr;
int c; int c;
int Len; int Len;
unsigned int HexCode1;
unsigned int HexCode2;
int n;
int Handle = 1; int Handle = 1;
@ -470,15 +437,14 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
if (Handle < 1 || Handle > NumberofRHPSessions) if (Handle < 1 || Handle > NumberofRHPSessions)
{ {
free(Data); free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle); return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
} }
RHPSession = RHPSessions[Handle - 1]; RHPSession = RHPSessions[Handle - 1];
// Look for \ escapes, Can now also get \u00c3 // Look for \ escapes
ptr = Data; ptr = Data;
Len = strlen(Data); // in case no escapes
while (ptr = strchr(ptr, '\\')) while (ptr = strchr(ptr, '\\'))
{ {
@ -489,70 +455,36 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
case 'r': case 'r':
*ptr = 13; *ptr = 13;
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
case 'u':
HexCode1 = HexCode2 = 0;
n = toupper(ptr[2]) - '0';
if (n > 9) n = n - 7;
HexCode1 |= n << 4;
n = toupper(ptr[3]) - '0';
if (n > 9) n = n - 7;
HexCode1 |= n;
n = toupper(ptr[4]) - '0';
if (n > 9) n = n - 7;
HexCode2 |= n << 4;
n = toupper(ptr[5]) - '0';
if (n > 9) n = n - 7;
HexCode2 |= n;
if (HexCode1 == 0 || HexCode1 == 0xC2)
{
uptr = ptr;
*uptr = HexCode2;
}
else if (HexCode1 == 0xc2)
{
uptr = ptr;
*uptr = HexCode2 + 0x40;
}
memmove(ptr + 1, ptr + 6, strlen(ptr + 5));
break;
case '\\': case '\\':
*ptr = '\\'; *ptr = '\\';
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
case '"': case '"':
*ptr = '"'; *ptr = '"';
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
} }
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
ptr++; ptr++;
Len = ptr - Data;
} }
Debugprintf(Data);
Len = strlen(Data);
ptr = Data; ptr = Data;
while (Len > RHPPaclen) while (Len > RHPPaclen)
{ {
SendMsg(RHPSession->BPQStream, ptr, RHPPaclen); SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
Len -= RHPPaclen; Len -= RHPPaclen;
ptr += RHPPaclen; ptr += RHPPaclen;
} }
SendMsg(RHPSession->BPQStream, ptr, Len); SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
free(Data); free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2); return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
@ -576,7 +508,7 @@ int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
Handle = GetJSONInt(Msg, "\"handle\":"); Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions) if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle); return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
RHPSession = RHPSessions[Handle - 1]; RHPSession = RHPSessions[Handle - 1];
@ -590,24 +522,6 @@ int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle); 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"; char toHex[] = "0123456789abcdef";
void RHPPoll() void RHPPoll()
@ -678,12 +592,9 @@ void RHPPoll()
Buffer[pktlen] = 0; Buffer[pktlen] = 0;
RHPSession->sockptr->LastSendTime = time(NULL);
// Message is JSON so Convert CR to \r, \ to \\ " to \" // Message is JSON so Convert CR to \r, \ to \\ " to \"
// Looks like I need to escape everything not between 0x20 and 0x7f eg \u00c3 // Looks like I need to escape everything not between 0x20 and 0x7f eg \U00c3
while (c = *(ptr)) while (c = *(ptr))
@ -738,6 +649,7 @@ void RHPPoll()
} }
while (count > 0); while (count > 0);
} }
} }

View file

@ -110,7 +110,7 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT);
int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr); int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr);
void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length); void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length);
VOID HAMLIBPoll(struct RIGPORTINFO * PORT); VOID HAMLIBPoll(struct RIGPORTINFO * PORT);
void HAMLIBSlaveThread(VOID * Param); void HAMLIBSlaveThread(struct RIGINFO * RIG);
void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT); void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT);
VOID RTLUDPPoll(struct RIGPORTINFO * PORT); VOID RTLUDPPoll(struct RIGPORTINFO * PORT);
VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT); VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT);
@ -122,8 +122,8 @@ VOID ProcessSDRRadioFrame(struct RIGPORTINFO * PORT, int Length);
VOID SDRRadioPoll(struct RIGPORTINFO * PORT); VOID SDRRadioPoll(struct RIGPORTINFO * PORT);
VOID SetupPortRIGPointers(); VOID SetupPortRIGPointers();
VOID PTTCATThread(void * Param); VOID PTTCATThread(struct RIGINFO *RIG);
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT);
// ----- G7TAJ ---- // ----- G7TAJ ----
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT); VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT);
@ -2217,7 +2217,7 @@ int BittoInt(UINT BitMask)
return i; return i;
} }
extern char * RadioConfigMsg[70]; extern char * RadioConfigMsg[36];
struct TNCINFO RIGTNC; // Dummy TNC Record for Rigcontrol without a corresponding TNC struct TNCINFO RIGTNC; // Dummy TNC Record for Rigcontrol without a corresponding TNC
@ -5286,12 +5286,8 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
ptr = strtok_s(NULL, ",", &Context); ptr = strtok_s(NULL, ",", &Context);
if (ptr == NULL)
if (*MemoryNumber) // If channel, dont need mode
return TRUE;
if (ptr == NULL || strlen(ptr) > 8) if (ptr == NULL || strlen(ptr) > 8)
return FALSE; // Mode Missing return FALSE;
// If channel, dont need mode // If channel, dont need mode
@ -5450,26 +5446,7 @@ void DecodeCM108(int Port, char * ptr)
hid_device *handle = NULL; hid_device *handle = NULL;
if (strlen(ptr) > 16) if (strlen(ptr) > 16)
{ CM108Device = _strdup(ptr);
path_to_open = _strdup(ptr);
handle = hid_open_path(path_to_open);
if (handle)
{
hid_close(handle);
CM108Device = _strdup(path_to_open);
}
else
{
char msg[128];
sprintf(msg,"Port %d Unable to open CM108 device %s", Port, path_to_open);
WritetoConsole(msg);
}
}
else else
{ {
VID = strtol(ptr, &next, 0); VID = strtol(ptr, &next, 0);
@ -7416,8 +7393,6 @@ 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
@ -7434,7 +7409,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);
n += sprintf(&PortString[n], ",%d", p); sprintf(PortString, "%s,%d", PortString, p);
TNC->RIG = RIG; TNC->RIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7444,7 +7419,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);
nn += sprintf(&TxPortString[nn], ",%d", p); sprintf(TxPortString, "%s,%d", TxPortString, p);
TNC->TXRIG = RIG; TNC->TXRIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7484,9 +7459,8 @@ VOID SetupPortRIGPointers()
#ifdef WIN32 #ifdef WIN32
VOID PTTCATThread(void * Param) VOID PTTCATThread(struct RIGINFO *RIG)
{ {
struct RIGINFO * RIG = (struct RIGINFO *)Param;
DWORD dwLength = 0; DWORD dwLength = 0;
int Length, ret, i; int Length, ret, i;
UCHAR * ptr1; UCHAR * ptr1;
@ -8472,7 +8446,7 @@ int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr)
return 1; return 1;
} }
VOID HAMLIBThread(void * Param); VOID HAMLIBThread(struct RIGPORTINFO * PORT);
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT) VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
{ {
@ -8482,11 +8456,10 @@ VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
return ; return ;
} }
VOID HAMLIBThread(void * Param) VOID HAMLIBThread(struct RIGPORTINFO * PORT)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
struct RIGPORTINFO * PORT = (struct RIGPORTINFO * )Param;
char Msg[255]; char Msg[255];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
@ -8608,11 +8581,10 @@ Lost:
void HAMLIBSlaveThread(VOID * Param) void HAMLIBSlaveThread(struct RIGINFO * RIG)
{ {
// Wait for connections and messages from HAMLIB Clients // Wait for connections and messages from HAMLIB Clients
struct RIGINFO * RIG = (struct RIGINFO *)Param;
fd_set readfs; fd_set readfs;
fd_set errorfs; fd_set errorfs;
struct timeval timeout; struct timeval timeout;
@ -8928,7 +8900,7 @@ VOID FLRIGSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value)
VOID FLRIGThread(VOID * Param); VOID FLRIGThread(struct RIGPORTINFO * PORT);
VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT) VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
{ {
@ -8937,11 +8909,10 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
return ; return ;
} }
VOID FLRIGThread(VOID * Param) VOID FLRIGThread(struct RIGPORTINFO * PORT)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
char Msg[255]; char Msg[255];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
@ -10181,7 +10152,7 @@ void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT)
VOID SDRANGELThread(VOID * Param); VOID SDRANGELThread(struct RIGPORTINFO * PORT);
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT) VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
{ {
@ -10190,11 +10161,9 @@ VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
return ; return ;
} }
VOID SDRANGELThread(VOID * Param) VOID SDRANGELThread(struct RIGPORTINFO * PORT)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
char Msg[512]; char Msg[512];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;

View file

@ -854,8 +854,7 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_SCS;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
OpenLogFile(TNC->Port); OpenLogFile(TNC->Port);
CloseLogFile(TNC->Port); CloseLogFile(TNC->Port);
@ -886,6 +885,8 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;

View file

@ -376,8 +376,7 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_TRKM;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -393,6 +392,8 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View file

@ -666,8 +666,7 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_TRK;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -683,6 +682,8 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View file

@ -1,51 +0,0 @@
// ScanHID.cpp : Defines the entry point for the console application.
//
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "hidapi.h"
int main(int argc, char* argv[])
{
char product[256];
char sernum[256] = "NULL";
struct hid_device_info *devs, *cur_dev;
const char *path_to_open = NULL;
hid_device *handle = NULL;
// Look for Device
devs = hid_enumerate(0,0); // so we list devices(USHORT)VID, (USHORT)PID);
cur_dev = devs;
while (cur_dev)
{
wcstombs(product, cur_dev->product_string, 255);
if (cur_dev->serial_number)
wcstombs(sernum, cur_dev->serial_number, 255);
if (product)
printf("HID Device %s VID %X PID %X Ser %s\r\n Path %s\r\n\r\n", product, cur_dev->vendor_id, cur_dev->product_id, sernum, cur_dev->path);
else
printf("HID Device %s VID %X PID %X Ser %s\r\n Path %s\r\n\r\n", "Missing Product", cur_dev->vendor_id, cur_dev->product_id, sernum, cur_dev->path);
cur_dev = cur_dev->next;
}
hid_free_enumeration(devs);
printf("Press any key to Exit");
_getch();
}

View file

@ -508,10 +508,7 @@ ok:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -773,9 +770,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_SERIAL;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
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

@ -322,9 +322,6 @@ Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR Port)
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT; EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
if (EXTPORT->UI_Q)
C_Q_ADD(&EXTPORT->UI_Q, Copy);
else
C_Q_ADD(&EXTPORT->UI_Q, Copy); C_Q_ADD(&EXTPORT->UI_Q, Copy);
return; return;
} }

View file

@ -241,14 +241,8 @@ typedef struct _SERIAL_STATUS {
#ifndef WIN32 #ifndef WIN32
#if defined(MACBPQ) #ifdef MACBPQ
#include <util.h> #include <util.h>
#elif defined(FREEBSD)
#if defined(__FreeBSD__) || defined(__DragonFly__)
#include <libutil.h>
#else
#include <util.h>
#endif
#endif #endif
extern int posix_openpt (int __oflag); extern int posix_openpt (int __oflag);
@ -268,7 +262,7 @@ HANDLE LinuxOpenPTY(char * Name)
u_long param=1; u_long param=1;
struct termios term; struct termios term;
#if defined(MACBPQ) || defined(FREEBSD) #ifdef MACBPQ
// Create a pty pair // Create a pty pair

7157
TelnetV6-skigdebian.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -17,7 +17,6 @@ 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
// //
@ -90,7 +89,7 @@ void RHPThread(void * Params);
void ProcessRHPWebSockClosed(SOCKET socket); 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); int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
void checkNRTCPSockets(int portNo);
#ifndef LINBPQ #ifndef LINBPQ
extern HKEY REGTREE; extern HKEY REGTREE;
@ -114,7 +113,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;
@ -172,14 +171,12 @@ VOID Tel_Format_Addr(struct ConnectionInfo * sockptr, char * dst);
VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr); VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr);
VOID ProcessTrimodeResponse(struct TNCINFO * TNC, struct STREAMINFO * STREAM, unsigned char * MsgPtr, int Msglen); VOID ProcessTrimodeResponse(struct TNCINFO * TNC, struct STREAMINFO * STREAM, unsigned char * MsgPtr, int Msglen);
VOID ProcessTriModeDataMessage(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, struct STREAMINFO * STREAM); VOID ProcessTriModeDataMessage(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, struct STREAMINFO * STREAM);
void processNETROMFrame(unsigned char * Message, int Len, struct ConnectionInfo * sockptr);
void NETROMConnectionLost(struct ConnectionInfo * sockptr);
void NETROMConnectionAccepted(struct ConnectionInfo * sockptr);
struct ConnectionInfo * AllocateNRTCPRec();
static int LogAge = 13; static int LogAge = 13;
#ifdef WIN32 #ifdef WIN32
int DeleteLogFile(char * Log); int DeleteLogFile(char * Log);
@ -544,9 +541,6 @@ int ProcessLine(char * buf, int Port)
else if (_stricmp(param,"HTTPPORT") == 0) else if (_stricmp(param,"HTTPPORT") == 0)
HTTPPort = TCP->HTTPPort = atoi(value); HTTPPort = TCP->HTTPPort = atoi(value);
else if (_stricmp(param,"NETROMPORT") == 0)
TCP->NETROMPort = atoi(value);
else if (_stricmp(param,"APIPORT") == 0) else if (_stricmp(param,"APIPORT") == 0)
TCP->APIPort = atoi(value); TCP->APIPort = atoi(value);
@ -959,27 +953,13 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (sockptr->WebSocks == 0) if (sockptr->WebSocks == 0)
{ {
if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 150) // ~ 2.5 mins if (sockptr->LastSendTime && (REALTIMETICKS - sockptr->LastSendTime) > 1500) // ~ 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
{ {
@ -1144,7 +1124,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
shutdown(TCP->FBBsock[n++], SD_BOTH); shutdown(TCP->FBBsock[n++], SD_BOTH);
shutdown(TCP->Relaysock, SD_BOTH); shutdown(TCP->Relaysock, SD_BOTH);
shutdown(TCP->HTTPSock, SD_BOTH); shutdown(TCP->HTTPsock, SD_BOTH);
shutdown(TCP->HTTPsock6, SD_BOTH); shutdown(TCP->HTTPsock6, SD_BOTH);
@ -1168,7 +1148,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
closesocket(TCP->Relaysock); closesocket(TCP->Relaysock);
closesocket(TCP->Relaysock6); closesocket(TCP->Relaysock6);
closesocket(TCP->HTTPSock); closesocket(TCP->HTTPsock);
closesocket(TCP->HTTPsock6); closesocket(TCP->HTTPsock6);
// Save info from old TNC record // Save info from old TNC record
@ -1194,7 +1174,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET; 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
@ -1253,7 +1233,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
shutdown(TCP->FBBsock[n++], SD_BOTH); shutdown(TCP->FBBsock[n++], SD_BOTH);
shutdown(TCP->Relaysock, SD_BOTH); shutdown(TCP->Relaysock, SD_BOTH);
shutdown(TCP->HTTPSock, SD_BOTH); shutdown(TCP->HTTPsock, SD_BOTH);
shutdown(TCP->HTTPsock6, SD_BOTH); shutdown(TCP->HTTPsock6, SD_BOTH);
shutdown(TCP->sock6, SD_BOTH); shutdown(TCP->sock6, SD_BOTH);
@ -1280,7 +1260,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
closesocket(TCP->FBBsock6[n++]); closesocket(TCP->FBBsock6[n++]);
closesocket(TCP->Relaysock6); closesocket(TCP->Relaysock6);
closesocket(TCP->HTTPSock); closesocket(TCP->HTTPsock);
closesocket(TCP->HTTPsock6); closesocket(TCP->HTTPsock6);
return (0); return (0);
@ -1469,12 +1449,13 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
TCP = TNC->TCPInfo; TCP = TNC->TCPInfo;
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET; 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);
@ -1503,8 +1484,6 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
PortEntry->PORTCONTROL.TNC = TNC; PortEntry->PORTCONTROL.TNC = TNC;
PortEntry->PORTCONTROL.Hardware = TNC->Hardware;
TNC->WebWindowProc = WebProc; TNC->WebWindowProc = WebProc;
TNC->WebWinX = 260; TNC->WebWinX = 260;
TNC->WebWinY = 325; TNC->WebWinY = 325;
@ -1718,14 +1697,11 @@ BOOL OpenSockets(struct TNCINFO * TNC)
} }
if (TCP->HTTPPort) if (TCP->HTTPPort)
TCP->HTTPSock = OpenSocket4(TNC, TCP->HTTPPort); TCP->HTTPsock = OpenSocket4(TNC, TCP->HTTPPort);
if (TCP->APIPort) if (TCP->APIPort)
TCP->APIsock = OpenSocket4(TNC, TCP->APIPort); TCP->APIsock = OpenSocket4(TNC, TCP->APIPort);
if (TCP->NETROMPort)
TCP->NETROMSock = OpenSocket4(TNC, TCP->NETROMPort);
if (TCP->SyncPort) if (TCP->SyncPort)
TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort); TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort);
@ -1844,9 +1820,6 @@ BOOL OpenSockets6(struct TNCINFO * TNC)
if (TCP->APIPort) if (TCP->APIPort)
TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort); TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort);
if (TCP->NETROMPort)
TCP->NETROMSock6 = OpenSocket6(TNC, TCP->NETROMPort);
if (TCP->SyncPort) if (TCP->SyncPort)
TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort); TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort);
@ -1899,7 +1872,7 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
maxsock = sock; maxsock = sock;
} }
sock = TCP->HTTPSock; sock = TCP->HTTPsock;
if (sock) if (sock)
{ {
FD_SET(sock, readfd); FD_SET(sock, readfd);
@ -1915,14 +1888,6 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
maxsock = sock; maxsock = sock;
} }
sock = TCP->NETROMSock;
if (sock)
{
FD_SET(sock, readfd);
if (sock > maxsock)
maxsock = sock;
}
sock = TCP->Syncsock; sock = TCP->Syncsock;
if (sock) if (sock)
{ {
@ -1998,14 +1963,6 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
maxsock = sock; maxsock = sock;
} }
sock = TCP->NETROMSock6;
if (sock)
{
FD_SET(sock, readfd);
if (sock > maxsock)
maxsock = sock;
}
sock = TCP->DRATSsock6; sock = TCP->DRATSsock6;
if (sock) if (sock)
@ -2093,20 +2050,13 @@ VOID TelnetPoll(int Port)
Socket_Accept(TNC, sock, TCP->RelayPort); Socket_Accept(TNC, sock, TCP->RelayPort);
} }
sock = TCP->HTTPSock; sock = TCP->HTTPsock;
if (sock) if (sock)
{ {
if (FD_ISSET(sock, &readfd)) if (FD_ISSET(sock, &readfd))
Socket_Accept(TNC, sock, TCP->HTTPPort); Socket_Accept(TNC, sock, TCP->HTTPPort);
} }
sock = TCP->NETROMSock;
if (sock)
{
if (FD_ISSET(sock, &readfd))
Socket_Accept(TNC, sock, TCP->NETROMPort);
}
sock = TCP->DRATSsock; sock = TCP->DRATSsock;
if (sock) if (sock)
{ {
@ -2154,14 +2104,6 @@ VOID TelnetPoll(int Port)
Socket_Accept(TNC, sock, TCP->HTTPPort); Socket_Accept(TNC, sock, TCP->HTTPPort);
} }
sock = TCP->NETROMSock6;
if (sock)
{
if (FD_ISSET(sock, &readfd))
Socket_Accept(TNC, sock, TCP->NETROMPort);
}
sock = TCP->DRATSsock6; sock = TCP->DRATSsock6;
if (sock) if (sock)
{ {
@ -2289,12 +2231,9 @@ VOID TelnetPoll(int Port)
} }
} }
nosocks: nosocks:
// Poll TCPNR
checkNRTCPSockets(Port);
// Try SNMP // Try SNMP
if (TCP->SNMPsock) if (TCP->SNMPsock)
@ -2534,11 +2473,15 @@ nosocks:
if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT) if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
{ {
if ((time(NULL) - sockptr->LastSendTime) > (L4LIMIT - 60)) // PC Ticks are about 10% slow #ifdef WIN32
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 = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
BuffertoNode(sockptr, "Keepalive\r", 10); BuffertoNode(sockptr, "Keepalive\r", 10);
} }
} }
@ -2668,7 +2611,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 = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
} }
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')
@ -2900,7 +2843,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 = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
} }
} }
} }
@ -3107,7 +3050,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
shutdown(TCP->FBBsock[n++], SD_BOTH); shutdown(TCP->FBBsock[n++], SD_BOTH);
shutdown(TCP->Relaysock, SD_BOTH); shutdown(TCP->Relaysock, SD_BOTH);
shutdown(TCP->HTTPSock, SD_BOTH); shutdown(TCP->HTTPsock, SD_BOTH);
shutdown(TCP->HTTPsock6, SD_BOTH); shutdown(TCP->HTTPsock6, SD_BOTH);
@ -3132,7 +3075,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
closesocket(TCP->Relaysock); closesocket(TCP->Relaysock);
closesocket(TCP->Relaysock6); closesocket(TCP->Relaysock6);
closesocket(TCP->HTTPSock); closesocket(TCP->HTTPsock);
closesocket(TCP->HTTPsock6); closesocket(TCP->HTTPsock6);
// Save info from old TNC record // Save info from old TNC record
@ -3157,10 +3100,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->PortRecord = PortRecord; TNC->Hardware = H_TELNET;
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
@ -3191,6 +3131,8 @@ 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);
@ -3301,35 +3243,6 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
return 0; return 0;
} }
// Netrom Over TCP uses its own Connection Entries
if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
{
sockptr = AllocateNRTCPRec();
if (sockptr == 0)
{
// No entries - accept and close
sock = accept(SocketId, (struct sockaddr *)&sin6, &addrlen);
send(sock,"No Free Sessions\r\n", 18,0);
Debugprintf("No Free Netrom Telnet Sessions");
Sleep (500);
closesocket(sock);
return 0;
}
sock = accept(SocketId, (struct sockaddr *)&sockptr->sin, &addrlen);
sockptr->socket = sock;
ioctl(sock, FIONBIO, &param);
sockptr->NETROMMode = TRUE;
NETROMConnectionAccepted(sockptr);
return 0;
}
// Find a free Session // Find a free Session
for (n = 1; n <= TCP->MaxSessions; n++) for (n = 1; n <= TCP->MaxSessions; n++)
@ -3382,7 +3295,6 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
sockptr->HTTPMode = FALSE; sockptr->HTTPMode = FALSE;
sockptr->APIMode = FALSE; sockptr->APIMode = FALSE;
sockptr->NETROMMode = FALSE;
sockptr->SyncMode = FALSE; sockptr->SyncMode = FALSE;
sockptr->DRATSMode = FALSE; sockptr->DRATSMode = FALSE;
sockptr->FBBMode = FALSE; sockptr->FBBMode = FALSE;
@ -3397,12 +3309,9 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
memset(sockptr->ADIF, 0, sizeof(struct ADIF)); memset(sockptr->ADIF, 0, sizeof(struct ADIF));
if (SocketId == TCP->HTTPSock || SocketId == TCP->HTTPsock6) if (SocketId == TCP->HTTPsock || SocketId == TCP->HTTPsock6)
sockptr->HTTPMode = TRUE; sockptr->HTTPMode = TRUE;
if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
sockptr->NETROMMode = TRUE;
if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6) if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6)
{ {
sockptr->HTTPMode = TRUE; // API is a type of HTTP socket sockptr->HTTPMode = TRUE; // API is a type of HTTP socket
@ -3846,7 +3755,7 @@ MsgLoop:
BuffertoNode(sockptr, NodeLine, len); BuffertoNode(sockptr, NodeLine, len);
sockptr->InputLen = 0; sockptr->InputLen = 0;
ShowConnections(TNC); ShowConnections(TNC);;
return 0; return 0;
} }
@ -4020,7 +3929,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;
} }
@ -4276,7 +4185,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;
@ -4396,7 +4305,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;
@ -4895,7 +4804,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);
@ -4971,7 +4880,7 @@ MsgLoop:
WriteLog (logmsg); WriteLog (logmsg);
} }
ShowConnections(TNC); ShowConnections(TNC);;
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
sockptr->InputLen=InputLen; sockptr->InputLen=InputLen;
@ -5069,7 +4978,6 @@ struct RHPParamBlock
unsigned char * Msg; unsigned char * Msg;
int Len; int Len;
SOCKET Socket; SOCKET Socket;
struct ConnectionInfo * sockptr;
}; };
@ -5096,21 +5004,24 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
// Failed or closed - clear connection // Failed or closed - clear connection
// if Websock connection tell app // if Websock connection till app
if (sockptr->WebSocks) if (sockptr->WebSocks)
{ {
if (memcmp(sockptr->WebURL, "rhp", 3) == 0) if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
ProcessRHPWebSockClosed(sockptr->socket); ProcessRHPWebSockClosed(sockptr->socket);
DataSocket_Disconnect(TNC, sockptr); DataSocket_Disconnect(TNC, sockptr);
return 0; 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;
@ -5196,7 +5107,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 = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5209,13 +5120,10 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock)); struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
ParamBlock->sockptr = sockptr;
ParamBlock->Socket = sockptr->socket; ParamBlock->Socket = sockptr->socket;
ParamBlock->Len = Len; ParamBlock->Len = Len;
ParamBlock->Msg = malloc(Len + 10); ParamBlock->Msg = malloc(Len + 10);
memcpy(ParamBlock->Msg, Payload, Len); memcpy(ParamBlock->Msg, Payload, Len);
sockptr->LastSendTime = time(NULL);
_beginthread(RHPThread, 0, (VOID *)ParamBlock); _beginthread(RHPThread, 0, (VOID *)ParamBlock);
sockptr->InputLen = 0; sockptr->InputLen = 0;
@ -5223,13 +5131,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
} }
} }
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;
@ -5256,7 +5158,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 = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5349,7 +5251,6 @@ int DataSocket_ReadDRATS(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
} }
int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr) int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr)
{ {
int n; int n;
@ -5364,7 +5265,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;
} }
@ -5551,7 +5452,8 @@ int WriteLog(char * msg)
strcat(Value, "logs/Telnet_"); strcat(Value, "logs/Telnet_");
} }
sprintf(&Value[strlen(Value)], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday); sprintf(Value, "%s%02d%02d%02d.log", Value,
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;
@ -5606,7 +5508,8 @@ VOID WriteCMSLog(char * msg)
strcat(Value, "logs/CMSAccess"); strcat(Value, "logs/CMSAccess");
} }
sprintf(&Value[strlen(Value)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday); sprintf(Value, "%s_%04d%02d%02d.log", Value,
tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(Value, "ab"); Handle = fopen(Value, "ab");
@ -5764,9 +5667,7 @@ int Telnet_Connected(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCK
} }
else else
{ {
struct _TRANSPORTENTRY * CROSSLINK = TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK; if (TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL[0])
if (CROSSLINK && CROSSLINK->APPL[0])
buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r", buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r",
TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL); TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL);
else else
@ -6422,80 +6323,26 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
struct ConnectionInfo * sockptr; struct ConnectionInfo * sockptr;
SOCKET sock; SOCKET sock;
struct sockaddr_in sinx; struct sockaddr_in sinx;
struct sockaddr_in destaddr;
int addrlen=sizeof(sinx); int addrlen=sizeof(sinx);
char PortString[20]; int i;
struct addrinfo hints, *res = 0, *saveres;
sprintf(PortString, "%d", Port);
// get host info, make socket, and connect it
memset(&hints, 0, sizeof hints);
if (TCP->IPV6 == 0 && TCP->IPV4)
hints.ai_family = AF_INET;
else if (TCP->IPV4 == 0 && TCP->IPV6)
hints.ai_family = AF_INET6;
else if (TCP->IPV4 && TCP->IPV6)
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
else
{
ReportError(STREAM, "Neither IPv4 nor IPv5 are enabled");
return FALSE; // Resolve failed
}
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(Host, PortString, &hints, &res);
if (!res)
{
char Msg[256];
err = WSAGetLastError();
sprintf(Msg, "Resolve HostName Failed - Error %d", err);
ReportError(STREAM, Msg);
return FALSE; // Resolve failed
}
// Step thorough the list of hosts
saveres = res; // Save for free
/* if (res->ai_next) // More than one
{
int n = ISHostIndex;
while (n && res->ai_next)
{
res = res->ai_next;
n--;
}
if (n)
{
// We have run off the end of the list
ISHostIndex = 0; // Back to start
res = saveres;
}
else
ISHostIndex++;
}
*/
// getnameinfo(res->ai_addr, (int)res->ai_addrlen, RealISHost, 256, serv, 256, 0);
sockptr = STREAM->ConnectionInfo; sockptr = STREAM->ConnectionInfo;
sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); sock = sockptr->socket = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
ReportError(STREAM, "Create Socket Failed");
return FALSE;
}
sockptr->SocketActive = TRUE; sockptr->SocketActive = TRUE;
sockptr->InputLen = 0; sockptr->InputLen = 0;
sockptr->LoginState = 2; sockptr->LoginState = 2;
sockptr->UserPointer = 0; sockptr->UserPointer = 0;
sockptr->DoEcho = FALSE; sockptr->DoEcho = FALSE;
sockptr->FBBMode = FBB; // Raw Data sockptr->FBBMode = FBB; // Raw Data
if (sockptr->ADIF == NULL) if (sockptr->ADIF == NULL)
@ -6504,18 +6351,48 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
memset(sockptr->ADIF, 0, sizeof(struct ADIF)); memset(sockptr->ADIF, 0, sizeof(struct ADIF));
if (sock == INVALID_SOCKET) // Resolve Name if needed
sockptr->sin.sin_family = AF_INET;
sockptr->sin.sin_port = htons(Port);
sockptr->sin.sin_addr.s_addr = inet_addr(Host);
if (sockptr->sin.sin_addr.s_addr == INADDR_NONE)
{ {
ReportError(STREAM, "Create Socket Failed"); struct hostent * HostEnt;
return FALSE;
// Resolve name to address
HostEnt = gethostbyname(Host);
if (!HostEnt)
{
ReportError(STREAM, "Resolve HostName Failed");
return FALSE; // Resolve failed
}
i = 0;
while (HostEnt->h_addr_list[i] != 0)
{
struct in_addr addr;
addr.s_addr = *(u_long *) HostEnt->h_addr_list[i++];
}
memcpy(&sockptr->sin.sin_addr.s_addr, HostEnt->h_addr, 4);
} }
ioctl (sock, FIONBIO, &param); ioctl (sockptr->socket, FIONBIO, &param);
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4); setsockopt (sockptr->socket, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
// memcpy(work, res->ai_addr->sa_data, 4); sinx.sin_family = AF_INET;
sinx.sin_addr.s_addr = INADDR_ANY;
sinx.sin_port = 0;
if (bind(sockptr->socket, (struct sockaddr *) &sinx, addrlen) != 0 )
{
ReportError(STREAM, "Bind Failed");
return FALSE;
}
if (LogEnabled) if (LogEnabled)
{ {
@ -6525,21 +6402,21 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
WriteLog (logmsg); WriteLog (logmsg);
} }
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
if (connect(sockptr->socket,(struct sockaddr *) &sockptr->sin, sizeof(destaddr)) == 0)
{ {
// //
// Connected successful // Connected successful
// //
ReportError(STREAM, "*** Connected"); ReportError(STREAM, "*** Connected");
freeaddrinfo(saveres);
// Get Send Buffer Size
return TRUE; return TRUE;
} }
else else
{ {
freeaddrinfo(saveres);
err=WSAGetLastError(); err=WSAGetLastError();
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
@ -6565,6 +6442,7 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
} }
return FALSE; return FALSE;
} }
@ -7276,7 +7154,7 @@ int DoRefreshWebMailIndex()
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));

View file

@ -80,11 +80,6 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer); VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer);
char * strlop(char * buf, char delim); char * strlop(char * buf, char delim);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
extern char MYALIASLOPPED[10]; extern char MYALIASLOPPED[10];
@ -469,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->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ; TNC->Hardware = H_UIARQ;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View file

@ -78,11 +78,6 @@ VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len); int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
int standardParams(struct TNCINFO * TNC, char * buf); int standardParams(struct TNCINFO * TNC, char * buf);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
#define MAXUZ7HOPORTS 16 #define MAXUZ7HOPORTS 16
@ -690,11 +685,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ConnecttoUZ7HO(port); ConnecttoUZ7HO(port);
lasttime[port] = ltime; lasttime[port] = ltime;
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
else else
{ {
@ -1033,11 +1023,7 @@ 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)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -1414,7 +1400,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO; TNC->Hardware = H_UZ7HO;
UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;

9
V4.c
View file

@ -622,10 +622,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
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))
{ {
@ -974,13 +971,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_V4; TNC->Hardware = H_V4;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

45
VARA.c
View file

@ -73,11 +73,6 @@ int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT); VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT);
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG); VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
#ifndef LINBPQ #ifndef LINBPQ
BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM lParam); BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM lParam);
#endif #endif
@ -1168,7 +1163,6 @@ 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);
@ -1176,7 +1170,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_VARA; TNC->Hardware = H_VARA;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1184,6 +1178,8 @@ 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
@ -1450,6 +1446,9 @@ 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
@ -1565,11 +1564,14 @@ 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)
@ -2228,7 +2230,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (App < 32) if (App < 32)
{ {
char AppName[13]; char AppName[13];
char AppBuffer[64];
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
@ -2243,7 +2244,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (CheckAppl(TNC, AppName)) if (CheckAppl(TNC, AppName))
{ {
MsgLen = sprintf(AppBuffer, "%s\r", AppName); MsgLen = sprintf(Buffer, "%s\r", AppName);
buffptr = GetBuff(); buffptr = GetBuff();
@ -2253,9 +2254,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
buffptr->Len = MsgLen; buffptr->Len = MsgLen;
memcpy(buffptr->Data, AppBuffer, MsgLen); memcpy(buffptr->Data, Buffer, MsgLen);
Debugprintf("Calling Application %s", AppBuffer);
C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
@ -2430,7 +2429,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// return; // return;
} }
if (_memicmp(Buffer, "LINK REGISTERED", 9) == 0) if (_memicmp(Buffer, "REGISTERED", 9) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer)); WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
@ -2444,13 +2443,6 @@ 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");
@ -2676,7 +2668,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
{ {
int InputLen, MsgLen; int InputLen, MsgLen;
char * ptr, * ptr2; char * ptr, * ptr2;
char Buffer[8192]; char Buffer[4096];
// 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
@ -2684,7 +2676,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], 8191 - TNC->InputLen, 0); InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8192 - TNC->InputLen, 0);
if (InputLen == 0 || InputLen == SOCKET_ERROR) if (InputLen == 0 || InputLen == SOCKET_ERROR)
{ {
@ -2707,18 +2699,12 @@ 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];
@ -2741,10 +2727,9 @@ loop:
if (TNC->InputLen < MsgLen) if (TNC->InputLen < MsgLen)
{ {
TNC->InputLen = 0; TNC->InputLen = 0;
Debugprintf("VARA Corrupt multi command input");
return; return;
} }
memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen - MsgLen); memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen-MsgLen);
TNC->InputLen -= MsgLen; TNC->InputLen -= MsgLen;
goto loop; goto loop;

125
Versions-skigdebian.h Normal file
View file

@ -0,0 +1,125 @@
#ifdef Kernel
#define Vers 5,2,9,2
#define Verstring "5.2.9.2\0"
#define Datestring "September 2012"
#define VerComments "G8BPQ Packet Switch V5.2.9.2\0"
#define VerCopyright "Copyright © 2001-2012 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"
#endif
#define KVers 6,0,24,59
#define KVerstring "6.0.24.59\0"
#ifdef CKernel
#define Vers KVers
#define Verstring KVerstring
#define Datestring "January 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"
#define VerProduct "BPQ32"
#endif
#ifdef TermTCP
#define Vers 1,0,16,2
#define Verstring "1.0.16.2\0"
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTermTCP"
#endif
#ifdef BPQTerm
#define Vers 2,2,5,2
#define Verstring "2.2.5.2\0"
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTerminal"
#endif
#ifdef BPQTermMDI
#define Vers 2,2,0,3
#define Verstring "2.2.0.3\0"
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
#endif
#ifdef MAIL
#define Vers KVers
#define Verstring KVerstring
#define VerComments "Mail server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQMail"
#endif
#ifdef HOSTMODES
#define Vers 1,1,8,1
#define Verstring "1.1.8.1\0"
//#define SPECIALVERSION "Test 3"
#define VerComments "Host Modes Emulator for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2019 John Wiseman G8BPQ\0"
#define VerDesc "Host Modes Emulator for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQHostModes"
#endif
#ifdef UIUTIL
#define Vers 0,1,3,1
#define Verstring "0.1.3.1\0"
#define VerComments "Beacon Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2019 John Wiseman G8BPQ\0"
#define VerDesc "Beacon Utility for G8BPQ Switch\0"
#define VerProduct "BPQUIUtil"
#endif
#ifdef AUTH
#define Vers 0,1,0,0
#define Verstring "0.1.0.0\0"
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
#endif
#ifdef APRS
#define Vers KVers
#define Verstring KVerstring
#define VerComments "APRS Client for G8BPQ Switch\0"
#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
#define VerDesc "APRS Client for G8BPQ Switch\0"
#define VerProduct "BPQAPRS"
#endif
#ifdef CHAT
#define Vers KVers
#define Verstring KVerstring
#define VerComments "Chat server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQChat"
#endif

View file

@ -10,15 +10,14 @@
#endif #endif
#define KVers 6,0,25,8 #define KVers 6,0,24,59
#define KVerstring "6.0.25.8\0" #define KVerstring "6.0.24.59\0"
#ifdef CKernel #ifdef CKernel
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define Datestring "October 2025" #define Datestring "February 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring #define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0" #define VerDesc "BPQ32 Switch\0"

View file

@ -105,11 +105,6 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
BOOL KillOldTNC(char * Path); BOOL KillOldTNC(char * Path);
int standardParams(struct TNCINFO * TNC, char * buf); int standardParams(struct TNCINFO * TNC, char * buf);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
static char ClassName[]="WINMORSTATUS"; static char ClassName[]="WINMORSTATUS";
static char WindowTitle[] = "WINMOR"; static char WindowTitle[] = "WINMOR";
static int RigControlRow = 165; static int RigControlRow = 165;
@ -144,10 +139,6 @@ VOID WritetoTraceSupport(struct TNCINFO * TNC, char * Msg, int Len)
int LineLen, i; int LineLen, i;
UCHAR Save; UCHAR Save;
int SaveLen = Len; int SaveLen = Len;
char Time[16];
time_t T;
struct tm * tm;
if (Len < 0) if (Len < 0)
return; return;
@ -215,16 +206,10 @@ lineloop:
#endif #endif
// Write to Web Buffer // Write to Web Buffer
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, Line); strcat(TNC->WebBuffer, Line);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved
Skip: Skip:
ptr1 = ptr2; ptr1 = ptr2;
@ -263,16 +248,10 @@ lineloop:
#else #else
index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 ); index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
#endif #endif
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, ptr1); strcat(TNC->WebBuffer, ptr1);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved
} }
} }
@ -1005,11 +984,7 @@ 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)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
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]))
{ {
@ -1487,12 +1462,11 @@ 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->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR; TNC->Hardware = H_WINMOR;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1500,6 +1474,7 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View file

@ -37,7 +37,6 @@ 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);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
WPRec * AllocateWPRecord() WPRec * AllocateWPRecord()

261
WebMail.c
View file

@ -1446,88 +1446,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// Neither do js or file downloads // Neither do js or file downloads
// This could be a request for a Template file
// WebMail/Local_Templates/My Forms/inc/logo_ad63.png
// WebMail/Standard Templates/
if (_memicmp(NodeURL, "/WebMail/Local", 14) == 0 || (_memicmp(NodeURL, "/WebMail/Standard", 17) == 0))
{
int FileSize;
char * MsgBytes;
char MsgFile[512];
FILE * hFile;
size_t ReadLen;
char TimeString[64];
char FileTimeString[64];
struct stat STAT;
char * FN = &NodeURL[9];
char * fileBit = FN;
char * ext;
char Type[64] = "Content-Type: text/html\r\n";
UndoTransparency(FN);
ext = strchr(FN, '.');
sprintf(MsgFile, "%s/%s", BPQDirectory, FN);
while (strchr(fileBit, '/'))
fileBit = strlop(fileBit, '/');
if (stat(MsgFile, &STAT) == -1)
{
*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
return;
}
hFile = fopen(MsgFile, "rb");
if (hFile == 0)
{
*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
return;
}
FileSize = STAT.st_size;
MsgBytes = malloc(FileSize + 1);
ReadLen = fread(MsgBytes, 1, FileSize, hFile);
fclose(hFile);
FormatTime2(FileTimeString, STAT.st_ctime);
FormatTime2(TimeString, time(NULL));
ext++;
if (_stricmp(ext, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ext, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ext, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
// File may be binary so output header then copy in message
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"%s"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n", FileSize, Type,TimeString, FileTimeString);
memcpy(&Reply[*RLen], MsgBytes, FileSize);
*RLen += FileSize;
free (MsgBytes);
return;
}
//
if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0) if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0)
{ {
int FileSize; int FileSize;
@ -1541,8 +1459,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
char * FN = &NodeURL[16]; char * FN = &NodeURL[16];
char * fileBit = FN; char * fileBit = FN;
char * ext; char * ext;
char Type[64] = "Content-Type: text/html\r\n";
UndoTransparency(FN); UndoTransparency(FN);
ext = strchr(FN, '.'); ext = strchr(FN, '.');
@ -1575,31 +1491,24 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
FormatTime2(FileTimeString, STAT.st_ctime); FormatTime2(FileTimeString, STAT.st_ctime);
FormatTime2(TimeString, time(NULL)); FormatTime2(TimeString, time(NULL));
ext++; if (_stricmp(ext, ".htm") == 0 || _stricmp(ext, ".html") == 0 || _stricmp(ext, ".css") == 0 || _stricmp(ext, ".js") == 0)
{
if (_stricmp(ext, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ext, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ext, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
// File may be binary so output header then copy in message
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n" *RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"%s" "Content-Type: text/css\r\n"
"Date: %s\r\n" "Date: %s\r\n"
"Last-Modified: %s\r\n" "Last-Modified: %s\r\n"
"\r\n", FileSize, Type,TimeString, FileTimeString); "\r\n%s", FileSize, TimeString, FileTimeString, MsgBytes);
}
else
{
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"Content-Type: application/octet-stream\r\n"
"Content-Disposition: attachment; filename=\"%s\"\r\n"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n%s", FileSize, fileBit, TimeString, FileTimeString, MsgBytes);
memcpy(&Reply[*RLen], MsgBytes, FileSize); }
*RLen += FileSize;
free (MsgBytes); free (MsgBytes);
return; return;
} }
@ -2384,7 +2293,6 @@ 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]);
@ -2405,9 +2313,9 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (SubDir) if (SubDir)
len = sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName); sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
else else
len = sprintf(popup, popuphddr, Key, Dir->DirName); sprintf(popup, popuphddr, Key, Dir->DirName);
if (SubDir) if (SubDir)
{ {
@ -2418,7 +2326,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)
len += sprintf(&popup[len], " <option value=%d:%d,%d>%s", DirNo, SubDirNo, i, Name); sprintf(popup, "%s <option value=%d:%d,%d>%s", popup, DirNo, SubDirNo, i, Name);
} }
} }
else else
@ -2430,10 +2338,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)
len += sprintf(&popup[len], " <option value=%d,%d>%s", DirNo, i, Name); sprintf(popup, "%s <option value=%d,%d>%s", popup, DirNo, i, Name);
} }
} }
len += sprintf(&popup[len], "</select></p>"); sprintf(popup, "%s</select></p>", popup);
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -2501,7 +2409,6 @@ 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;
@ -2548,7 +2455,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
len = sprintf(popup, popuphddr, Session->Key); 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
@ -2561,21 +2468,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;
len += sprintf(&popup[len], "%s", NewGroup); sprintf(popup, "%s%s", popup, NewGroup);
} }
len += sprintf(&popup[len], " <option value=%d>%s", i, Dir->DirName); sprintf(popup, "%s <option value=%d>%s", popup, i, Dir->DirName);
// Recurse any Subdirs // Recurse any Subdirs
n = 0; n = 0;
while (n < Dir->DirCount) while (n < Dir->DirCount)
{ {
len += sprintf(&popup[len], " <option value=%d:%d>%s", i, n, Dir->Dirs[n]->DirName); sprintf(popup, "%s <option value=%d:%d>%s", popup, i, n, Dir->Dirs[n]->DirName);
n++; n++;
} }
} }
len += sprintf(&popup[len], "%</select></td></tr></table></p>"); sprintf(popup, "%s</select></td></tr></table></p>", popup);
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
@ -2662,10 +2569,10 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
if (strlen(WebMail->BID) > 12) if (strlen(WebMail->BID) > 12)
WebMail->BID[12] = 0; WebMail->BID[12] = 0;
// UndoTransparency(WebMail->BID); UndoTransparency(WebMail->BID);
// UndoTransparency(WebMail->To); UndoTransparency(WebMail->To);
// UndoTransparency(WebMail->Subject); UndoTransparency(WebMail->Subject);
// UndoTransparency(WebMail->Body); UndoTransparency(WebMail->Body);
MsgLen = strlen(WebMail->Body); MsgLen = strlen(WebMail->Body);
@ -2822,18 +2729,6 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
strcpy(Msg->via, ToUser->HomeBBS); strcpy(Msg->via, ToUser->HomeBBS);
sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via); sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
} }
else
{
// No HomeBBS - check WP
WPRecP WP = LookupWP(Msg->to);
if (WP)
{
strcpy(Msg->via, WP->first_homebbs);
sprintf(Prompt, "%s added from WP", Msg->via);
}
}
} }
else else
{ {
@ -2986,7 +2881,7 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
// RMS Express Forms Support // RMS Express Forms Support
char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir) char * GetHTMLViewerTemplate(char * FN)
{ {
int i, j, k, l; int i, j, k, l;
@ -3000,7 +2895,6 @@ char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
{ {
if (strcmp(FN, Dir->Forms[j]->FileName) == 0) if (strcmp(FN, Dir->Forms[j]->FileName) == 0)
{ {
*FormDir = Dir;
return CheckFile(Dir, FN); return CheckFile(Dir, FN);
} }
} }
@ -3021,7 +2915,6 @@ char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
{ {
if (_stricmp(FN, SDir->Forms[k]->FileName) == 0) if (_stricmp(FN, SDir->Forms[k]->FileName) == 0)
{ {
*FormDir = SDir;
return CheckFile(SDir, SDir->Forms[k]->FileName); return CheckFile(SDir, SDir->Forms[k]->FileName);
} }
} }
@ -3085,13 +2978,6 @@ VOID GetPage(struct HTTPConnectionInfo * Session, char * NodeURL)
ptr = strchr(&NodeURL[17], ','); ptr = strchr(&NodeURL[17], ',');
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (DirNo == -1)
{
*WebMail->RLen = sprintf(WebMail->Reply, "<html><script>alert(\"No Page Selected. \");window.location.href = '/Webmail/NewMsg?%s';</script></html>", Session->Key);
return;
}
SubDir = strlop(&NodeURL[17], ':'); SubDir = strlop(&NodeURL[17], ':');
if (SubDir) if (SubDir)
{ {
@ -3405,13 +3291,6 @@ BOOL ParseXML(WebMailInfo * WebMail, char * XMLOrig)
// Extract Fields (stuff between < and >. Ignore Whitespace between fields // Extract Fields (stuff between < and >. Ignore Whitespace between fields
// Add FormFolder Key with our folder
// XMLKeys->Key = "FormFolder";
// XMLKeys->Value = _strdup(FormDir);
// XMLKeys++;
ptr1 = strstr(XML, "<xml_file_version>"); ptr1 = strstr(XML, "<xml_file_version>");
while (ptr1) while (ptr1)
@ -3515,8 +3394,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
size_t varlen, xmllen; size_t varlen, xmllen;
char var[100] = "<"; char var[100] = "<";
KeyValues * KeyValue; KeyValues * KeyValue;
struct HtmlFormDir * Dir;
char FormDir[MAX_PATH];
if (ParseXML(WebMail, XML)) if (ParseXML(WebMail, XML))
ptr = FindXMLVariable(WebMail, "display_form"); ptr = FindXMLVariable(WebMail, "display_form");
@ -3530,11 +3407,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
strcpy(FN, ptr); strcpy(FN, ptr);
Form = GetHTMLViewerTemplate(FN, &Dir); Form = GetHTMLViewerTemplate(FN);
sprintf(FormDir, "WMFile/%s/%s/", Dir->FormSet, Dir->DirName);
if (Form == NULL) if (Form == NULL)
{ {
@ -3550,15 +3423,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
// Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody} // Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody}
// So is {FormFolder} instread of {var FormFolder}
// As a fiddle replace {FormFolder} with {var Folder} and look for that
while (varptr = stristr(Form, "{FormFolder}"))
{
memcpy(varptr, "{var ", 5);
}
varptr = stristr(Form, "{MsgOriginalBody}"); varptr = stristr(Form, "{MsgOriginalBody}");
{ {
char * temp, * tempsave; char * temp, * tempsave;
@ -3698,23 +3562,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
while (KeyValue->Key) while (KeyValue->Key)
{ {
if (_stricmp(var, "Folder") == 0)
{
// Local form folder, not senders
xmllen = strlen(FormDir);
// Ok, we have the position of the variable and the substitution text.
// Copy message up to variable to Result, then copy value
memcpy(Reply, formptr, varptr - formptr - 5); // omit "{var "
Reply += (varptr - formptr - 5);
strcpy(Reply, FormDir);
Reply += xmllen;
break;
}
if (_stricmp(var, KeyValue->Key) == 0) if (_stricmp(var, KeyValue->Key) == 0)
{ {
xmllen = strlen(KeyValue->Value); xmllen = strlen(KeyValue->Value);
@ -3730,8 +3577,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
break; break;
} }
KeyValue++;
if (KeyValue->Key == NULL) if (KeyValue->Key == NULL)
{ {
// Not found in XML // Not found in XML
@ -3741,7 +3586,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
sprintf(Err, VarNotFoundMsg, var, "%s"); sprintf(Err, VarNotFoundMsg, var, "%s");
return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err); return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err);
} }
KeyValue++;
} }
formptr = endptr + 1; formptr = endptr + 1;
@ -4251,18 +4096,6 @@ VOID SaveTemplateMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
strcpy(Msg->via, ToUser->HomeBBS); strcpy(Msg->via, ToUser->HomeBBS);
sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via); sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
} }
else
{
// No HomeBBS - Check WP
WPRecP WP = LookupWP(Msg->to);
if (WP)
{
strcpy(Msg->via, WP->first_homebbs);
sprintf(Prompt, "%s added from WP", Msg->via);
}
}
} }
else else
{ {
@ -4483,18 +4316,6 @@ VOID BuildMessageFromHTMLInput(struct HTTPConnectionInfo * Session, char * Reply
strcpy(Msg->via, ToUser->HomeBBS); strcpy(Msg->via, ToUser->HomeBBS);
sprintf(Prompt, "%s added from HomeBBS", Msg->via); sprintf(Prompt, "%s added from HomeBBS", Msg->via);
} }
else
{
// No HomeBBS - Check WP
WPRecP WP = LookupWP(Msg->to);
if (WP)
{
strcpy(Msg->via, WP->first_homebbs);
sprintf(Prompt, "%s added from WP", Msg->via);
}
}
} }
else else
{ {
@ -5625,6 +5446,8 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
#endif #endif
printf("%s\n", MsgFile);
if (stat(MsgFile, &STAT) != -1) if (stat(MsgFile, &STAT) != -1)
{ {
hFile = fopen(MsgFile, "rb"); hFile = fopen(MsgFile, "rb");
@ -5641,6 +5464,8 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
MsgBytes[FileSize] = 0; MsgBytes[FileSize] = 0;
fclose(hFile); fclose(hFile);
printf("%d %s\n", strlen(MsgBytes), MsgBytes);
return MsgBytes; return MsgBytes;
} }
return NULL; return NULL;
@ -5670,7 +5495,6 @@ 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;
@ -5740,7 +5564,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
ptr = ptr1; ptr = ptr1;
} }
len = sprintf(popup, popuphddr, Session->Key, prompt, vars + 1); sprintf(popup, popuphddr, Session->Key, prompt, vars + 1);
for (i = 0; i < vars; i++) for (i = 0; i < vars; i++)
{ {
@ -5749,9 +5573,9 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
if (key == NULL) if (key == NULL)
key = var[i]; key = var[i];
len += sprintf(&popup[len], " <option value='%s'>%s", key, var[i]); sprintf(popup, "%s <option value='%s'>%s", popup, key, var[i]);
} }
len += sprintf(&popup[len], "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>"); sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup);
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
free(SelCopy); free(SelCopy);
@ -6310,17 +6134,16 @@ 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;
len = sprintf(popup, popuphddr, Session->Key, WebMail->Files); 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)
len += sprintf(&popup[len], " <option value=%d>%s (Len %d)", i + 1, WebMail->FileName[i], WebMail->FileLen[i]); sprintf(popup, "%s <option value=%d>%s (Len %d)", popup, i + 1, WebMail->FileName[i], WebMail->FileLen[i]);
} }
len += sprintf(&popup[len], "%</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>"); sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup);
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -6466,7 +6289,7 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
} }
} }
ptr += sprintf(&ptr[strlen(ptr)], "</pre> \r\n"); ptr += sprintf(ptr, "%s</pre> \r\n", ptr);
Len = ptr - &OutBuffer[10]; Len = ptr - &OutBuffer[10];

View file

@ -795,8 +795,7 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
WritetoConsoleLocal(msg); WritetoConsoleLocal(msg);
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_WINRPR;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -812,6 +811,8 @@ 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
@ -1580,6 +1581,8 @@ TNCRunning:
// Send INIT script // Send INIT script
// VARA needs each command in a separate send
ptr1 = &TNC->InitScript[0]; ptr1 = &TNC->InitScript[0];
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
@ -1604,6 +1607,7 @@ TNCRunning:
c = *(ptr2 + 1); // Save next char c = *(ptr2 + 1); // Save next char
*(ptr2 + 1) = 0; // Terminate string *(ptr2 + 1) = 0; // Terminate string
} }
// VARASendCommand(TNC, ptr1, TRUE);
if (ptr2) if (ptr2)
*(1 + ptr2++) = c; // Put char back *(1 + ptr2++) = c; // Put char back

3
adif.c
View file

@ -409,7 +409,8 @@ BOOL WriteADIFRecord(ADIF * ADIF)
strcat(Value, "logs/BPQ_CMS_ADIF"); strcat(Value, "logs/BPQ_CMS_ADIF");
} }
sprintf(&Value[strlen(Value)], "_%04d%02d.adi", tm->tm_year +1900, tm->tm_mon+1); sprintf(Value, "%s_%04d%02d.adi", Value,
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,7 +33,6 @@ 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
@ -41,8 +40,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
#define L4CREQX 8 // Paula's extension
extern char MYCALL[]; // 7 chars, ax.25 format extern char MYCALL[]; // 7 chars, ax.25 format
extern char MYALIASTEXT[]; // 6 chars, not null terminated extern char MYALIASTEXT[]; // 6 chars, not null terminated
@ -64,6 +62,15 @@ extern int ENDOFDATA;
extern int L3LIVES; extern int L3LIVES;
extern int NUMBEROFNODES; extern int NUMBEROFNODES;
struct CMDX
{
char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH
// VOID (*CMDPROC)(struct _TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);// COMMAND PROCESSOR
VOID (*CMDPROC)();// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset
};
struct APPLCONFIG struct APPLCONFIG
{ {
@ -163,29 +170,6 @@ 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 * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
int segsSent;
int segsRcvd;
int segsResent;
int NRRID;
time_t NRRTime;
int Service; // For Paula's Connnect to Service
} TRANSPORTENTRY; } TRANSPORTENTRY;
// //
@ -211,9 +195,6 @@ 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)
@ -228,15 +209,13 @@ typedef struct ROUTE
BOOL INP3Node; BOOL INP3Node;
BOOL NoKeepAlive; // Suppress Keepalive Processing BOOL NoKeepAlive; // Suppress Keepalive Processing
int LastConnectAttempt; // To stop us trying too often int LastConnectAttempt; // To stop us trying too often
int ConnectionAttempts;
int Status; // int Status; //
int OldBPQ; // Set if other end is BPQ sending RIF in mS
int LastRTT; // Last Value Reported int LastRTT; // Last Value Reported
int RTT; // Current int RTT; // Current
int SRTT; // Smoothed RTT int SRTT; // Smoothed RTT
int NeighbourSRTT; // Other End SRTT int NeighbourSRTT; // Other End SRTT
int RTTIncrement; // Average of Ours and Neighbours SRTT in 10 ms - smoothed neighbor transport time (SNTT) in spec // int RTTIncrement; // Average of Ours and Neighbours SRTT in 10 ms
int BCTimer; // Time to next L3RTT Broadcast int BCTimer; // Time to next L3RTT Broadcast
int Timeout; // Lost Response Timer int Timeout; // Lost Response Timer
int Retries; // Lost Response Count int Retries; // Lost Response Count
@ -245,12 +224,6 @@ typedef struct ROUTE
int OtherendsRouteQual; // Route quality used by other end. int OtherendsRouteQual; // Route quality used by other end.
int OtherendLocked; // Route quality locked by ROUTES entry. int OtherendLocked; // Route quality locked by ROUTES entry.
int FirstTimeFlag; // Set once quality has been set by direct receive int FirstTimeFlag; // Set once quality has been set by direct receive
int RemoteMAXRTT; // For INP3
int RemoteMAXHOPS;
char * TCPHost; // For NETROM over TCP
int TCPPort;
struct NRTCPSTRUCT * TCPSession;
} *PROUTE; } *PROUTE;
@ -260,7 +233,6 @@ typedef struct ROUTE
#define GotRTTResponse 2 // Other end has sent us a RTT Response #define GotRTTResponse 2 // Other end has sent us a RTT Response
#define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node #define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node
// (could just be monitoring RTT for some reason // (could just be monitoring RTT for some reason
#define SentRTTRequest 8
#define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls #define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls
// (only sent when we have seen both a request and response) // (only sent when we have seen both a request and response)
@ -468,18 +440,15 @@ typedef struct _APPLCALLS
// This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs, // This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs,
// But if these are significant (say 25% or 100 ms) they will be retransmitted // But if these are significant (say 25% or 100 ms) they will be retransmitted
// We treat the Routes as an array of 6. First 3 are NODES routes, next 3 are INP3 Routes. This works, but maybe is not ideal
typedef struct NR_DEST_ROUTE_ENTRY 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 ROUT_LOCKED; UCHAR Padding[5]; // SO Entries are the same length
UCHAR Padding[4]; // So Entries are the same length
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct INP3_DEST_ROUTE_ENTRY typedef struct DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
USHORT LastRTT; // Last Value Reported USHORT LastRTT; // Last Value Reported
@ -498,13 +467,13 @@ 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 INP3_DEST_ROUTE_ENTRY INP3ROUTE[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
@ -708,14 +677,11 @@ typedef struct PORTCONTROL
BOOL NormalizeQuality; // Normalise Node Qualities BOOL NormalizeQuality; // Normalise Node Qualities
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
BOOL ALLOWINP3; // Accept INP3 if offered by other end
BOOL ENABLEINP3; // Send INP3 RTT probes to discovered neighbours
void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // 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
@ -735,9 +701,6 @@ typedef struct PORTCONTROL
UCHAR * TX; // % Sending UCHAR * TX; // % Sending
UCHAR * BUSY; // % Active (Normally DCD active or TX) UCHAR * BUSY; // % Active (Normally DCD active or TX)
int Hardware; // TNC H_TYPE. Copied here for access from application context
} PORTCONTROLX, *PPORTCONTROL; } PORTCONTROLX, *PPORTCONTROL;
typedef struct FULLPORTDATA typedef struct FULLPORTDATA
@ -938,9 +901,6 @@ typedef struct _LINKTABLE
VOID * FRAMES[8]; // FRAMES WAITING ACK VOID * FRAMES[8]; // FRAMES WAITING ACK
VOID * RXFRAMES[8]; // Frames received out of sequence VOID * RXFRAMES[8]; // Frames received out of sequence
time_t LASTFRAMESENT; // For detecting stuck links
int LASTSENTQCOUNT; //
UCHAR L2STATE; // PROCESSING STATE UCHAR L2STATE; // PROCESSING STATE
UCHAR Ver2point2; // Set if running 2.2 UCHAR Ver2point2; // Set if running 2.2
USHORT L2TIMER; // FRAME RETRY TIMER USHORT L2TIMER; // FRAME RETRY TIMER
@ -974,26 +934,6 @@ typedef struct _LINKTABLE
time_t ConnectTime; // For session stats time_t ConnectTime; // For session stats
int bytesRXed; // Info bytes only int bytesRXed; // Info bytes only
int bytesTXed; int bytesTXed;
int framesRXed;
int framesTXed;
int framesResent;
// Now support compressing L2 Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
char ApplName[16];
time_t lastStatusSentTime;
} LINKTABLE; } LINKTABLE;
@ -1103,11 +1043,7 @@ struct SEM
int Gets; int Gets;
int Rels; int Rels;
DWORD SemProcessID; DWORD SemProcessID;
#ifdef WIN32
DWORD SemThreadID; DWORD SemThreadID;
#else
pthread_t SemThreadID;
#endif
int Line; // caller file and line int Line; // caller file and line
char File[MAX_PATH]; char File[MAX_PATH];
}; };
@ -1394,8 +1330,6 @@ struct arp_table_entry
// SOCKET SourceSocket; // SOCKET SourceSocket;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
BOOL noUpdate; // Don't update dest address from incoming packet BOOL noUpdate; // Don't update dest address from incoming packet
BOOL replytoSourcePort; // Update map entry dest port from source port of each packet.
time_t LastHeard; // Last Packet received from this ststiom
}; };
@ -1485,25 +1419,6 @@ struct AXIPPORTINFO
}; };
struct CMDX
{
char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH
VOID (*CMDPROC)(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);// COMMAND PROCESSOR
// VOID (*CMDPROC)();// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset
};
struct NETROMX
{
int ServiceNo;
char ServiceName[10];
};
extern struct NETROMX SERVICES[];
extern int NUMBEROFSSERVICES;
#define Disconnect(stream) SessionControl(stream,2,0) #define Disconnect(stream) SessionControl(stream,2,0)
#define Connect(stream) SessionControl(stream,1,0) #define Connect(stream) SessionControl(stream,1,0)

View file

@ -22,8 +22,6 @@ count on BPQ32.dll gets messed up, and the code will not unload cleanly.
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT);
// Returns number of free buffers // Returns number of free buffers
// (BPQHOST function 7 (part)). // (BPQHOST function 7 (part)).

View file

@ -192,8 +192,8 @@ extern UCHAR BPQDirectory[];
extern int OffsetH, OffsetW; extern int OffsetH, OffsetW;
static void ResolveNames(VOID * Param); static void ResolveNames(struct AXIPPORTINFO * PORT);
void OpenSockets(VOID * Param); void OpenSockets(struct AXIPPORTINFO * PORT);
void CloseSockets(struct AXIPPORTINFO * PORT); void CloseSockets(struct AXIPPORTINFO * PORT);
@ -204,7 +204,7 @@ int Update_MH_KeepAlive(struct AXIPPORTINFO * PORT, struct in_addr ipad, char pr
unsigned short int compute_crc(unsigned char *buf,int l); unsigned short int compute_crc(unsigned char *buf,int l);
unsigned int find_arp(unsigned char * call); unsigned int find_arp(unsigned char * call);
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name, BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name,
int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort); int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate);
BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len); BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len);
BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen); BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
static BOOL ReadConfigFile(int Port); static BOOL ReadConfigFile(int Port);
@ -213,7 +213,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT);
BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT); BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
int DumpFrameInHex(unsigned char * msg, int len); int DumpFrameInHex(unsigned char * msg, int len);
VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen); VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen);
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort); BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr);
int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock); int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock);
int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer); int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
@ -221,7 +221,7 @@ int KissDecode(UCHAR * inbuff, int len);
int Socket_Accept(int SocketId); int Socket_Accept(int SocketId);
int Socket_Connect(int SocketId, int Error); int Socket_Connect(int SocketId, int Error);
int Socket_Data(int sock, int error, int eventcode); int Socket_Data(int sock, int error, int eventcode);
VOID TCPConnectThread(VOID * Param); VOID TCPConnectThread(struct arp_table_entry * arp);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Consoleprintf(const char * format, ...); VOID __cdecl Consoleprintf(const char * format, ...);
BOOL OpenListeningSocket(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp); BOOL OpenListeningSocket(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp);
@ -429,7 +429,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply) if (PORT->Checkifcanreply)
{ {
if (CheckSourceisResolvable(PORT, call, 0, &RXaddr, 0)) if (CheckSourceisResolvable(PORT, call, 0, &RXaddr))
return 1; return 1;
@ -437,7 +437,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
// Can't reply. If AutoConfig is set, add to table and accept, else reject // Can't reply. If AutoConfig is set, add to table and accept, else reject
if (PORT->AutoAddARP) if (PORT->AutoAddARP)
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0);
else else
{ {
char From[11] = "|"; char From[11] = "|";
@ -536,7 +536,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply) if (PORT->Checkifcanreply)
{ {
if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr, PORT->udpport[i])) if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr))
return 1; return 1;
else else
{ {
@ -547,10 +547,10 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
{ {
char Addr[80]; char Addr[80];
Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE); Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0);
} }
else else
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0);
else else
{ {
char From[11] = "|"; char From[11] = "|";
@ -692,7 +692,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
else else
Consoleprintf("Failed to reread config file - leaving config unchanged"); Consoleprintf("Failed to reread config file - leaving config unchanged");
_beginthread(OpenSockets, 0, PORT); _beginthread(OpenSockets, 0, PORT );
GetAXIPCache(PORT); GetAXIPCache(PORT);
@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
return; return;
} }
// Select source port by choosing right socket // Seelcte source port by choosing right socket
// First Set Default for Protocol // First Set Default for Protocol
@ -844,9 +844,8 @@ int InitAXIP(int Port)
return (TRUE); return (TRUE);
} }
void OpenSockets(void * Param) void OpenSockets(struct AXIPPORTINFO * PORT)
{ {
struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
char Msg[255]; char Msg[255];
int err; int err;
u_long param=1; u_long param=1;
@ -1344,7 +1343,6 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
char axcall[7]; char axcall[7];
BOOL UDPFlag, BCFlag; BOOL UDPFlag, BCFlag;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
int useSourcePort = 0;
for (i=1; i <= MAXBPQPORTS; i++) for (i=1; i <= MAXBPQPORTS; i++)
{ {
@ -1393,7 +1391,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
{ {
if (convtoax25(call,axcall,&calllen)) if (convtoax25(call,axcall,&calllen))
{ {
add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0, useSourcePort); add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0);
ResolveDelay = 2; ResolveDelay = 2;
return(DestroyWindow(hWnd)); return(DestroyWindow(hWnd));
} }
@ -1529,9 +1527,8 @@ static void CreateResolverWindow(struct AXIPPORTINFO * PORT)
extern HWND hWndPopup; extern HWND hWndPopup;
static void ResolveNames(VOID * Param) static void ResolveNames(struct AXIPPORTINFO * PORT)
{ {
struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
int count = 0; int count = 0;
PORT->ResolveNamesThreadId = GetCurrentThreadId(); // Detect if another started PORT->ResolveNamesThreadId = GetCurrentThreadId(); // Detect if another started
@ -2150,7 +2147,6 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
int Interval; int Interval;
int noUpdate=FALSE; int noUpdate=FALSE;
int TCPMode; int TCPMode;
int useSourcePort = 0;
ptr = strtok(buf, " \t\n\r"); ptr = strtok(buf, " \t\n\r");
@ -2238,7 +2234,6 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
bcflag=0; bcflag=0;
TCPMode=0; TCPMode=0;
SourcePort = 0; SourcePort = 0;
useSourcePort = 0;
// //
// Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params // Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params
@ -2269,14 +2264,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (p_udpport == NULL) return (FALSE); if (p_udpport == NULL) return (FALSE);
if (_stricmp(p_udpport,"FROMPORT") == 0)
{
useSourcePort = TRUE;
port = 0;
}
else
port = atoi(p_udpport); port = atoi(p_udpport);
p_UDP = strtok(NULL, " \t\n\r"); p_UDP = strtok(NULL, " \t\n\r");
continue; continue;
} }
@ -2339,7 +2327,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (SourcePort == 0) if (SourcePort == 0)
SourcePort = port; SourcePort = port;
add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate, useSourcePort); add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate);
return (TRUE); return (TRUE);
} }
} // End of Process MAP } // End of Process MAP
@ -2450,7 +2438,7 @@ BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call,int * calllen
} }
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port, BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port,
UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort) UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate)
{ {
struct arp_table_entry * arp; struct arp_table_entry * arp;
@ -2469,8 +2457,7 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->PORT = PORT; arp->PORT = PORT;
if (port == 0 && arp->replytoSourcePort == 0) if (port == 0) PORT->needip = 1; // Enable Raw IP Mode
PORT->needip = 1; // Enable Raw IP Mode
arp->ResolveFlag=TRUE; arp->ResolveFlag=TRUE;
PORT->NeedResolver=TRUE; PORT->NeedResolver=TRUE;
@ -2489,7 +2476,6 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->TCPMode = TCPFlag; arp->TCPMode = TCPFlag;
arp->noUpdate = noUpdate; arp->noUpdate = noUpdate;
PORT->arp_table_len++; PORT->arp_table_len++;
arp->replytoSourcePort = useSourcePort;
if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70) if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70)
PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70; PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70;
@ -2590,7 +2576,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT)
return (0); return (0);
} }
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort) BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr)
{ {
// Makes sure we can reply to call before accepting message // Makes sure we can reply to call before accepting message
@ -2620,17 +2606,10 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPo
struct sockaddr_in * SA = rxaddr; struct sockaddr_in * SA = rxaddr;
memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4); memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4);
} }
// Dont think I should update port unless using source port for dest // Dont think I should update port
if (arp->replytoSourcePort) //arp->port = Port;
{
arp->port = FromPort;
arp->destaddr.sin_port = htons(arp->port);
if (arp->SourcePort == 0)
arp->SourcePort = ToPort;
} }
}
arp->LastHeard = time(NULL);
return 1; // Ok to process return 1; // Ok to process
} }
index++; index++;
@ -2998,9 +2977,8 @@ int KissDecode(UCHAR * inbuff, int len)
return txptr; return txptr;
} }
VOID TCPConnectThread(void * Param) VOID TCPConnectThread(struct arp_table_entry * arp)
{ {
struct arp_table_entry * arp = (struct arp_table_entry *)Param;
char Msg[255]; char Msg[255];
int err, i; int err, i;
u_long param=1; u_long param=1;

View file

@ -73,9 +73,6 @@
//.25 //.25
// Increase size of status display buffers (7) // Increase size of status display buffers (7)
// Allow sending BEL (CTRL/G) (79)
// Fix sending BEL (CTRL/G) (81)
#include "BPQChat.h" #include "BPQChat.h"
#include "Dbghelp.h" #include "Dbghelp.h"

View file

@ -290,9 +290,6 @@ typedef struct ConnectionInfo_S
struct ConnectionInfo_S * SysopChatStream; // Stream sysop is chatting to struct ConnectionInfo_S * SysopChatStream; // Stream sysop is chatting to
int bytesSent;
int bytesRxed;
} ConnectionInfo, CIRCUIT; } ConnectionInfo, CIRCUIT;
// Flags Equates // Flags Equates
@ -339,13 +336,11 @@ typedef struct ConnectionInfo_S
struct FBBRestartData struct FBBRestartData
{ {
char Call[10]; struct MsgInfo * TempMsg; // Header while message is being received
char bid[13]; struct UserInfo * UserPointer;
int length;
UCHAR * MailBuffer; // Mail Message being received UCHAR * MailBuffer; // Mail Message being received
int MailBufferSize; // Total Malloc'ed size. Actual size in in Msg Struct int MailBufferSize; // Total Malloc'ed size. Actual size in in Msg Struct
int Count; // Give up if too many restarts int Count; // Give up if too many restarts
time_t TimeCreated;
}; };
// We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so // We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so
@ -1392,7 +1387,6 @@ BOOL CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSFo
BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements); BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements);
int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo); int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo);
int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS); int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS);
void SaveRestartData();
VOID ReRouteMessages(); VOID ReRouteMessages();

2788
cMain-skigdebian.c Normal file

File diff suppressed because it is too large Load diff

200
cMain.c
View file

@ -17,7 +17,6 @@ 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
// //
@ -52,33 +51,16 @@ int CanPortDigi(int Port);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
void MQTTTimer(); void MQTTTimer();
void SaveMH(); void SaveMH();
VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
void WritePacketLogThread(void * param);
void hookNodeStarted();
void hookNodeRunning();
void APIL2Trace(struct _MESSAGE * Message, char Dirn);
#include "configstructs.h" #include "configstructs.h"
extern struct CONFIGTABLE xxcfg; extern struct CONFIGTABLE xxcfg;
extern BOOL needAIS; extern BOOL needAIS;
extern int needADSB; extern int needADSB;
extern int EnableOARCAPI;
extern SOCKET NodeAPISocket;
extern int nodeStartedSent;
extern SOCKADDR_IN UDPreportdest;
extern char NodeAPIServer[80];
extern int NodeAPIPort;
time_t LastNodeStatus = 0;
int nodeStatusTimer = 20 * 60; // 20 mins
struct PORTCONFIG * PortRec; struct PORTCONFIG * PortRec;
#define RNRSET 0x2 // RNR RECEIVED FROM OTHER END #define RNRSET 0x2 // RNR RECEIVED FROM OTHER END
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
// STATION INFORMATION // STATION INFORMATION
@ -157,16 +139,6 @@ 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;
int L2Compress = 0;
int L2CompMaxframe = 3;
int L2CompPaclen = 236;
int PREFERINP3ROUTES = 0;
BOOL LogL4Connects = FALSE; BOOL LogL4Connects = FALSE;
BOOL LogAllConnects = FALSE; BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE; BOOL AUTOSAVEMH = TRUE;
@ -184,8 +156,6 @@ char MQTT_PASS[80] = "";
int MQTT_Connecting = 0; int MQTT_Connecting = 0;
int MQTT_Connected = 0; int MQTT_Connected = 0;
int PoolBuilt = 0;
//TNCTABLE DD 0 //TNCTABLE DD 0
//NUMBEROFSTREAMS DD 0 //NUMBEROFSTREAMS DD 0
@ -194,7 +164,6 @@ extern VOID * ENDPOOL;
extern void * APPL_Q; // Queue of frames for APRS Appl extern void * APPL_Q; // Queue of frames for APRS Appl
extern BOOL APRSActive; extern BOOL APRSActive;
extern int DEBUGINP3;
#define BPQHOSTSTREAMS 64 #define BPQHOSTSTREAMS 64
@ -208,12 +177,9 @@ BPQVECSTRUC * TELNETMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS];
BPQVECSTRUC * AGWMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 1]; BPQVECSTRUC * AGWMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 1];
BPQVECSTRUC * APRSMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 2]; BPQVECSTRUC * APRSMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 2];
BPQVECSTRUC * IPHOSTVECTORPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 3]; BPQVECSTRUC * IPHOSTVECTORPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 3];
BPQVECSTRUC * FILEMONVECTOR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 4];
int BPQVECLENGTH = sizeof(BPQVECSTRUC); int BPQVECLENGTH = sizeof(BPQVECSTRUC);
int MONTOFILEFLAG = 0;
int NODEORDER = 0; int NODEORDER = 0;
UCHAR LINKEDFLAG = 0; UCHAR LINKEDFLAG = 0;
@ -267,8 +233,6 @@ int CFLAG = 0; // C =HOST Command
VOID * IDMSG_Q = NULL; // ID/BEACONS WAITING TO BE SENT VOID * IDMSG_Q = NULL; // ID/BEACONS WAITING TO BE SENT
int NODESINPROGRESS = 0; int NODESINPROGRESS = 0;
int NODESToOnePort = 0; // Set to port num to send NODES to only one port.
VOID * CURRENTNODE = NULL; // NEXT _NODE TO SEND VOID * CURRENTNODE = NULL; // NEXT _NODE TO SEND
VOID * DESTHEADER = NULL; // HEAD OF SORTED NODES CHAIN VOID * DESTHEADER = NULL; // HEAD OF SORTED NODES CHAIN
@ -324,8 +288,8 @@ VOID LINKINIT(PEXTPORTDATA PORTVEC)
VOID LINKTX(PEXTPORTDATA PORTVEC, PMESSAGE Buffer) VOID LINKTX(PEXTPORTDATA PORTVEC, PMESSAGE Buffer)
{ {
// LOOP BACK TO SWITCH // LOOP BACK TO SWITCH
struct _LINKTABLE * LINK; struct _LINKTABLE * LINK;
LINK = Buffer->Linkptr; LINK = Buffer->Linkptr;
if (LINK) if (LINK)
@ -858,37 +822,6 @@ 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;
L2Compress = cfg->C_L2Compress;
L2CompMaxframe = cfg->C_L2CompMaxframe;
L2CompPaclen = cfg->C_L2CompPaclen;
if (L2CompMaxframe < 1 || L2CompMaxframe > 16)
L2CompMaxframe = 3;
if (L2CompPaclen < 64 || L2CompPaclen > 236)
L2CompPaclen = 236;
PREFERINP3ROUTES = cfg->C_PREFERINP3ROUTES;
if (cfg->C_DEBUGINP3)
DEBUGINP3 = 0;
EnableOARCAPI = cfg->C_OARCAPI;
if (cfg->C_OnlyVer2point0)
SUPPORT2point2 = 0;
// Get pointers to PASSWORD and APPL1 commands // Get pointers to PASSWORD and APPL1 commands
@ -1015,8 +948,6 @@ BOOL Start()
PORT->NormalizeQuality = !PortRec->NoNormalize; PORT->NormalizeQuality = !PortRec->NoNormalize;
PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED; PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED;
PORT->INP3ONLY = PortRec->INP3ONLY; PORT->INP3ONLY = PortRec->INP3ONLY;
PORT->ALLOWINP3 = PortRec->AllowINP3;
PORT->ENABLEINP3 = PortRec->EnableINP3;
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME; PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
@ -1041,9 +972,6 @@ BOOL Start()
PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN; PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN;
PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST; PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST;
if (PORT->QUAL_ADJUST < 0 || PORT->QUAL_ADJUST > 100)
PORT->QUAL_ADJUST = 100;
PORT->DIGIFLAG = PortRec->DIGIFLAG; PORT->DIGIFLAG = PortRec->DIGIFLAG;
if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT)) if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT))
PORT->DIGIPORT = PortRec->DIGIPORT; PORT->DIGIPORT = PortRec->DIGIPORT;
@ -1391,13 +1319,13 @@ BOOL Start()
PORT = GetPortTableEntryFromPortNum(ROUTE->NEIGHBOUR_PORT); PORT = GetPortTableEntryFromPortNum(ROUTE->NEIGHBOUR_PORT);
if (Rcfg->nokeepalives) if (Rcfg->pwind & 0x40)
ROUTE->NoKeepAlive = 1; ROUTE->NoKeepAlive = 1;
else else
if (PORT != NULL) if (PORT != NULL)
ROUTE->NoKeepAlive = PORT->PortNoKeepAlive; ROUTE->NoKeepAlive = PORT->PortNoKeepAlive;
if (Rcfg->inp3 || (PORT && PORT->INP3ONLY)) if (Rcfg->pwind & 0x80 || (PORT && PORT->INP3ONLY))
{ {
ROUTE->INP3Node = 1; ROUTE->INP3Node = 1;
ROUTE->NoKeepAlive = 0; // Cant have INP3 and NOKEEPALIVES ROUTE->NoKeepAlive = 0; // Cant have INP3 and NOKEEPALIVES
@ -1410,13 +1338,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 = LOCKEDBYCONFIG; // Locked ROUTE->NEIGHBOUR_FLAG = 1; // Locked
if (Rcfg->tcphost)
{
ROUTE->TCPHost = Rcfg->tcphost;
ROUTE->TCPPort = Rcfg->tcpport;
}
Rcfg++; Rcfg++;
ROUTE++; ROUTE++;
@ -1507,8 +1429,6 @@ BOOL Start()
ENDBUFFERPOOL = NEXTFREEDATA; ENDBUFFERPOOL = NEXTFREEDATA;
PoolBuilt = 1;
// Copy Bridge Map // Copy Bridge Map
@ -1595,34 +1515,8 @@ BOOL Start()
upnpInit(); upnpInit();
// Start Monitor to file thread
_beginthread(WritePacketLogThread, 0, NULL);
lastSaveSecs = CurrentSecs = lastSlowSecs = time(NULL); lastSaveSecs = CurrentSecs = lastSlowSecs = time(NULL);
// if EnableOARCAPI set try to resolve host here so we can send Node up event before anything else
if (EnableOARCAPI)
{
struct hostent * HostEnt3;
HostEnt3 = gethostbyname(NodeAPIServer);
NodeAPISocket = socket(AF_INET, SOCK_DGRAM, 0);
UDPreportdest.sin_family = AF_INET;
UDPreportdest.sin_port = htons(NodeAPIPort);
if (HostEnt3)
{
memcpy(&UDPreportdest.sin_addr.s_addr,HostEnt3->h_addr,4);
hookNodeStarted();
nodeStartedSent = 1;
LastNodeStatus = time(NULL);
}
}
return 0; return 0;
} }
@ -1652,7 +1546,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
struct ROUTE * ROUTE = NEIGHBOURS; struct ROUTE * ROUTE = NEIGHBOURS;
struct ROUTE * FIRSTSPARE = NULL; struct ROUTE * FIRSTSPARE = NULL;
int n = MAXNEIGHBOURS; int n = MAXNEIGHBOURS;
char Normcall[10];
while (n--) while (n--)
{ {
@ -1665,10 +1558,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
ROUTE++; ROUTE++;
continue; continue;
} }
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call)) if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
{ {
*REQROUTE = ROUTE; *REQROUTE = ROUTE;
@ -1954,11 +1843,12 @@ 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 = LOCKEDBYSYSOP; // LOCKED ROUTE // ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
} }
@ -1975,7 +1865,7 @@ VOID ReadNodes()
memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7); memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE - Digi'ed routes must be locked ROUTE->NEIGHBOUR_FLAG = 1; // 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;
@ -2031,14 +1921,6 @@ 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;
} }
@ -2216,12 +2098,6 @@ VOID TIMERINTERRUPT()
if (MQTT) if (MQTT)
MQTTTimer(); MQTTTimer();
if (LastNodeStatus && (time(NULL) - LastNodeStatus) > nodeStatusTimer)
{
LastNodeStatus = time(NULL);
hookNodeRunning();
}
/* /*
if (QCOUNT < 200) if (QCOUNT < 200)
{ {
@ -2277,10 +2153,6 @@ VOID TIMERINTERRUPT()
} }
Message = (struct _MESSAGE *)Buffer; Message = (struct _MESSAGE *)Buffer;
if(NodeAPISocket)
APIL2Trace(Message, 'T');
Message->PORT |= 0x80; // Set TX Bit Message->PORT |= 0x80; // Set TX Bit
BPQTRACE(Message, FALSE); // Dont send TX'ed frames to APRS BPQTRACE(Message, FALSE); // Dont send TX'ed frames to APRS
@ -2393,9 +2265,6 @@ L2Packet:
if (MQTT && PORT->PROTOCOL == 0) if (MQTT && PORT->PROTOCOL == 0)
MQTTKISSRX(Buffer); MQTTKISSRX(Buffer);
if(NodeAPISocket &&PORT->PROTOCOL == 0)
APIL2Trace(Message, 'R');
// Bridge if requested // Bridge if requested
for (toPort = 1; toPort <= MaxBPQPortNo; toPort++) for (toPort = 1; toPort <= MaxBPQPortNo; toPort++)
@ -2580,47 +2449,6 @@ ENDOFLIST:
if ((LINK->L2FLAGS & RNRSET) == 0) if ((LINK->L2FLAGS & RNRSET) == 0)
SDETX(LINK); SDETX(LINK);
else
{
// Stuck link debug check
if (LINK->LINKWINDOW == 0 || LINK->LASTFRAMESENT == 0 || (time(NULL) - LINK->LASTFRAMESENT) > 60) // No send for 60 secs
{
if (COUNT_AT_L2(LINK) > 16 || LINK->LINKWINDOW == 0)
{
// Dump Link State
char Normcall[11] = "";
char Normcall2[11] = "";
int Count = COUNT_AT_L2(LINK);
int secs = time(NULL) - LINK->LASTFRAMESENT;
ConvFromAX25(LINK->LINKCALL, Normcall);
ConvFromAX25(LINK->OURCALL, Normcall2);
Debugprintf("*** Stuck L2 Session for %d Secs RNR Set %s %s %d", secs, Normcall, Normcall2, Count);
Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS);
Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3],
LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]);
// Reset Link
InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE
LINK->L2RETRIES -= 1; // Just send one DISC
LINK->L2STATE = 4; // CLOSING
L2SENDCOMMAND(LINK, DISC | PFBIT);
return;
}
}
}
} }
} }
LINK++; LINK++;
@ -2745,18 +2573,6 @@ int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS)
L4++; L4++;
} }
// And to the Monitor to File system.
if (MONTOFILEFLAG) // Trace Enabled?
{
Buffer = GetBuff();
if (Buffer)
{
memcpy(&Buffer->PORT, &Msg->PORT, BUFFLEN - sizeof(void *)); // Dont copy chain word
C_Q_ADD(&FILEMONVECTOR->HOSTTRACEQ, Buffer);
}
}
return TRUE; return TRUE;
} }
; ;

View file

@ -18,5 +18,5 @@ Chat :
MonitorSize = "828,1644,148,770"; MonitorSize = "828,1644,148,770";
DebugSize = "0,0,0,0"; DebugSize = "0,0,0,0";
WindowSize = "231,835,254,602"; WindowSize = "231,835,254,602";
Version = "6,0,24,81"; Version = "6,0,24,32";
}; };

View file

@ -2,6 +2,7 @@
// Prototypes for BPQ32 Node Functions // Prototypes for BPQ32 Node Functions
// //
#define DllImport #define DllImport
#define EXCLUDEBITS #define EXCLUDEBITS
@ -105,10 +106,10 @@ VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len); VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum); struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK); int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
VOID SENDL4CONNECT(TRANSPORTENTRY * Session, int Service); VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
VOID CloseSessionPartner(TRANSPORTENTRY * Session); VOID CloseSessionPartner(TRANSPORTENTRY * Session);
int COUNTNODES(struct ROUTE * ROUTE); int COUNTNODES(struct ROUTE * ROUTE);
@ -202,6 +203,8 @@ int TrytoGuessCode(unsigned char * Char, int Len);
#define XID 0xAF #define XID 0xAF
#define TEST 0xE3 #define TEST 0xE3
#define SUPPORT2point2 1
// XID Optional Functions // XID Optional Functions
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address #define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
@ -436,12 +439,13 @@ extern int MQTT_PORT;
extern char MQTT_USER[80]; extern char MQTT_USER[80];
extern char MQTT_PASS[80]; extern char MQTT_PASS[80];
extern int SUPPORT2point2;
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz); DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK); void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK); void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK); void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);

View file

@ -49,39 +49,7 @@ Stuff to make compiling on WINDOWS and LINUX easier
int pthread_equal(pthread_t T1, pthread_t T2); int pthread_equal(pthread_t T1, pthread_t T2);
uintptr_t _beginthread(void(__cdecl start_address)(void *), unsigned stack_size, void *arglist); uintptr_t _beginthread(void(__cdecl *start_address)(void *), unsigned stack_size, void *arglist);
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf
__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
int count = -1;
if (size != 0)
count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
if (count == -1)
count = _vscprintf(format, ap);
return count;
}
__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
int count;
va_list ap;
va_start(ap, format);
count = c99_vsnprintf(outBuf, size, format, ap);
va_end(ap);
return count;
}
#endif
#else #else
@ -184,7 +152,9 @@ int stricmp(const unsigned char * pStr1, const unsigned char *pStr2);
char * strupr(char* s); char * strupr(char* s);
char * strlwr(char* s); char * strlwr(char* s);
pthread_t _beginthread(void(start_address)(void *), unsigned stack_size, VOID * arglist); pthread_t _beginthread(void(*start_address)(), unsigned stack_size, VOID * arglist);
#define WSAGetLastError() errno #define WSAGetLastError() errno
#define GetLastError() errno #define GetLastError() errno

177
config.c
View file

@ -305,12 +305,9 @@ static char *keywords[] =
"APPL5ALIAS", "APPL6ALIAS", "APPL7ALIAS", "APPL8ALIAS", "APPL5ALIAS", "APPL6ALIAS", "APPL7ALIAS", "APPL8ALIAS",
"APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL", "APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL",
"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", "MAXTT", "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", "L2Compress", "L2CompMaxframe",
"L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0", "DEBUGINP3", "ENABLEOARCAPI"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -329,12 +326,9 @@ static void * offset[] =
&xxcfg.C_APPL[4].ApplAlias, &xxcfg.C_APPL[5].ApplAlias, &xxcfg.C_APPL[6].ApplAlias, &xxcfg.C_APPL[7].ApplAlias, &xxcfg.C_APPL[4].ApplAlias, &xxcfg.C_APPL[5].ApplAlias, &xxcfg.C_APPL[6].ApplAlias, &xxcfg.C_APPL[7].ApplAlias,
&xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual, &xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual,
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual, &xxcfg.C_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_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, &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_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe,
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0, &xxcfg.C_DEBUGINP3, &xxcfg.C_OARCAPI}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -352,12 +346,9 @@ static int routine[] =
13, 13 ,13, 13, 13, 13 ,13, 13,
14, 14, 14, 14, 14, 14, 14, 14,
14, 14 ,14, 14, 14, 14 ,14, 14,
15, 0, 2, 9, 9,
15, 0, 2, 9, 9, 9,
2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20, 2, 2, 0, 1, 20, 20} ; // Routine to process param
1, 1, 1, 1, 1,
1, 1, 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);
@ -379,7 +370,8 @@ 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", "ALLOWINP3", "ENABLEINP3"}; /* parameter keywords */ "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort",
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -393,7 +385,7 @@ static void * poffset[] =
&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY, &xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize, &xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide, &xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, &xxp.AllowINP3, &xxp.EnableINP3}; /* offset for corresponding data in config file */ &xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort}; /* offset for corresponding data in config file */
static int proutine[] = static int proutine[] =
{ {
@ -407,7 +399,7 @@ static int proutine[] =
0, 1, 2, 18, 15, 16, 2, 0, 1, 2, 18, 15, 16, 2,
1, 17, 1, 1, 1, 1, 2, 1, 17, 1, 1, 1, 1, 2,
2, 2, 1, 1, 19, 2, 2, 2, 1, 1, 19, 2,
1, 20, 1, 21, 22, 1, 1, 1}; /* routine to process parameter */ 1, 20, 1, 21, 22, 1}; /* routine to process parameter */
int PPARAMLIM = sizeof(proutine)/sizeof(int); int PPARAMLIM = sizeof(proutine)/sizeof(int);
@ -541,8 +533,6 @@ BOOL ProcessConfig()
// xxcfg.SaveMH = TRUE; // Default to save // xxcfg.SaveMH = TRUE; // Default to save
xxcfg.C_PREFERINP3ROUTES = 0; // Default to false
GetNextLine(rec); GetNextLine(rec);
while (rec[0]) while (rec[0])
@ -604,6 +594,7 @@ BOOL ProcessConfig()
for (i=0;i<24;i++) for (i=0;i<24;i++)
paramok[45+i]=1; /* or APPLCALLS, APPLALIASS APPLQUAL */ paramok[45+i]=1; /* or APPLCALLS, APPLALIASS APPLQUAL */
paramok[69]=1; // BText optional paramok[69]=1; // BText optional
@ -625,16 +616,6 @@ 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
paramok[89]=1; // L2Compress
paramok[90]=1; // L2Compress Maxframe
paramok[91]=1; // L2Compress Paclen
paramok[92]=1; // PREFERINP3ROUTES
paramok[93]=1; // ONLYVer2point0
paramok[94]=1; // DEBUGINP3
paramok[95]=1; // EnableOARCAPI
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
{ {
@ -1587,127 +1568,6 @@ int routes(int i)
// strtok and sscanf can't handle successive commas, so split up usig strchr // strtok and sscanf can't handle successive commas, so split up usig strchr
// Now support keyword=value format
if (strchr(rec, '='))
{
// New format
// call quality port window frack paclen farquality inp3 nokeepalives tcp
char * ptr, *context;
char copy[512] = "";
if (strlen(rec) < 512)
strcpy(copy, rec);
_strupr(rec);
ptr = strtok_s(rec, " ,=", &context);
while (ptr)
{
if (strcmp(ptr, "CALL") == 0)
{
char * Call = strtok_s(NULL, ",=", &context);
if (strlen(Call) < 80)
strcpy(Route->call, Call);
}
else if (strcmp(ptr, "PORT") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->port = atoi(val);
}
else if (strcmp(ptr, "QUALITY") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->quality = atoi(val);
}
else if (strcmp(ptr, "FRACK") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->pfrack = atoi(val);
}
else if (strcmp(ptr, "PACLEN") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->pwind = atoi(val);
}
else if (strcmp(ptr, "WINDOW") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->pwind = atoi(val);
}
else if (strcmp(ptr, "FARQUALITY") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->farQual = atoi(val);
}
else if (strcmp(ptr, "INP3") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->inp3 = atoi(val);
}
else if (strcmp(ptr, "NOKEEPALIVES") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->farQual = atoi(val);
}
else if (strcmp(ptr, "TCP") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
{
char * port = strlop(val, ':');
Route->tcphost = _strdup(val);
if (port)
Route->tcpport = atoi(port);
else
Route->tcpport = 53119;
}
}
else
{
Consoleprintf("Bad Route %s\r\n",rec);
err_flag = 1;
break;
}
ptr = strtok_s(NULL, " ,=", &context);
}
}
else
{
memset(Param, 0, 2048); memset(Param, 0, 2048);
strlop(rec, 13); strlop(rec, 13);
strlop(rec, ';'); strlop(rec, ';');
@ -1735,13 +1595,6 @@ int routes(int i)
inp3 = atoi(Param[6]); inp3 = atoi(Param[6]);
Route->farQual = atoi(Param[7]); Route->farQual = atoi(Param[7]);
if (inp3 & 1)
Route->inp3 = 1;
if (inp3 & 2)
Route->nokeepalives = 1;
}
if (Route->farQual < 0 || Route->farQual > 255) if (Route->farQual < 0 || Route->farQual > 255)
{ {
Consoleprintf("Remote Quality must be between 0 and 255"); Consoleprintf("Remote Quality must be between 0 and 255");
@ -1765,6 +1618,14 @@ int routes(int i)
err_flag = 1; err_flag = 1;
} }
// Use top bit of window as INP3 Flag, next as NoKeepAlive
if (inp3 & 1)
Route->pwind |= 0x80;
if (inp3 & 2)
Route->pwind |= 0x40;
if (err_flag == 1) if (err_flag == 1)
{ {
Consoleprintf("%s\r\n",rec); Consoleprintf("%s\r\n",rec);

View file

@ -81,8 +81,6 @@ struct PORTCONFIG
uint64_t PortFreq; uint64_t PortFreq;
char * M0LTEMapInfo; char * M0LTEMapInfo;
int QtSMPort; int QtSMPort;
int AllowINP3;
int EnableINP3;
}; };
struct ROUTECONFIG struct ROUTECONFIG
@ -94,10 +92,6 @@ struct ROUTECONFIG
int pfrack; int pfrack;
int ppacl; int ppacl;
int farQual; int farQual;
int inp3;
int nokeepalives;
char * tcphost;
int tcpport;
}; };
struct CONFIGTABLE struct CONFIGTABLE
@ -176,17 +170,6 @@ 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;
int C_L2Compress;
int C_L2CompMaxframe;
int C_L2CompPaclen;
int C_PREFERINP3ROUTES;
int C_OnlyVer2point0;
int C_DEBUGINP3;
int C_OARCAPI;
//#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

View file

@ -35,9 +35,6 @@ int RFOnly = 0;
int MAXRTT = 9000; // 90 secs int MAXRTT = 9000; // 90 secs
int MaxHops = 4; int MaxHops = 4;
int DEBUGINP3 = 0;
int EnableOARCAPI = 0;
int RTTInterval = 24; // 4 Minutes int RTTInterval = 24; // 4 Minutes

11
debian/NEWS vendored
View file

@ -1,11 +0,0 @@
linbpq (6.0.24.22-2) unstable; urgency=medium
This is quite a big update, with config moving from /opt/oarc/bpq/bpq32.cfg to
/etc/bpq32.cfg. The system shall do this automatically for you, however
computers and their programmers are not perfect.
I strongly recommend at this point backing up your entire
/opt/oarc/bpq/ directory (cp -r /opt/oarc/bpq/ ~/bpq-backup/) before
proceeding with the upgrade
-- Dave Hibberd <d@vehibberd.com> Sat, 16 Dec 2023 13:30:06 +0000

23
debian/README.Debian vendored
View file

@ -1,23 +0,0 @@
README for linbpq on Debian
===========================
Please see https://wiki.oarc.uk/packet:linbpq-apt-installation for this guide
# Set config
Copy the config, edit it & set permissions.
The permissions are so linbpq web interface can edit the config.
sudo mv /usr/share/doc/linbpq/examples/bpq32.cfg /etc/bpq32.cfg
sudo nano /etc/bpq32.cfg
sudo chown :linbpq /etc/bpq32.cfg
sudo chmod 644 /etc/bpq32.cfg
# Start linbpq
sudo systemctl start linbpq
# Access your node
It shall be available by accessing http://localhost:8008 in the browser or telnet localhost 8010
-- Dave Hibberd <hibby@debian.org> Tue, 26 Mar 2024 00:53:42 +0000

50
debian/bpq32.cfg vendored
View file

@ -1,50 +0,0 @@
SIMPLE
NODECALL=MB7NAA
NODEALIAS=AANODE
LOCATOR=AA00aa
PASSWORD=xxxxxxxx
AUTOSAVE=1
NODESINTERVAL=10
MINQUAL=10
CTEXT:
Thanks for connecting.
Type ? for help.
***
PORT
PORTNUM=1
ID=VHF
TYPE=ASYNC
PROTOCOL=KISS
KISSOPTIONS=ACKMODE
COMPORT=/dev/ttyACM0
SPEED=57600
FRACK=4000
PACLEN=150
DIGIFLAG=0
QUALITY=192
MINQUAL=20
ENDPORT
PORT
PORTNUM=9
ID=Telnet
DRIVER=Telnet
CONFIG
LOGGING=1
CMS=1
DisconnectOnClose=1
SECURETELNET=1
TCPPORT=8010
FBBPORT=8011
HTTPPORT=8008
LOGINPROMPT=user:
PASSWORDPROMPT=password:
MAXSESSIONS=10
CTEXT=Thanks for connecting\n Enter ? for list of commands\n\n
USER=username,xxxxxxxx,m0aaa,,SYSOP
ENDPORT
LINCHAT
APPLICATION 2,CHAT,,MB7NAA-9,AACHAT,255

320
debian/changelog vendored
View file

@ -1,320 +0,0 @@
linbpq (6.0.25.8+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* Build on latest gcc standards
* New upstream version 6.0.25.8+repack
* Refresh patches with gbp pq!
* 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> Fri, 24 Oct 2025 00:45:16 +0100
linbpq (6.0.25.06+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.06+repack
* 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> Fri, 10 Oct 2025 23:42:04 +0100
linbpq (6.0.25.1+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.1+repack
* 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> Sat, 20 Sep 2025 15:43:32 +0100
linbpq (6.0.24.82+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.82+repack
* 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> Sun, 17 Aug 2025 22:36:49 +0100
linbpq (6.0.24.78+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
* New Upstream
* New files excluded
- No binaries in this release at all maybe!
* 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> Thu, 31 Jul 2025 01:31:38 +0100
linbpq (6.0.24.77+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.77+repack
* 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, 22 Jul 2025 21:46:13 +0100
linbpq (6.0.24.75+repack-1~hibbian~TRIXIE+2) trixie-hibbian-unstable; urgency=medium
* First trixie release
* Drop hard-dep on hibbian-archive-keyring
-- Dave Hibberd <hibby@debian.org> Wed, 16 Jul 2025 19:10:33 +0100
linbpq (6.0.24.75+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.75+repack
* 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, 15 Jul 2025 01:10:43 +0100
linbpq (6.0.24.71+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.67+repack
* New upstream version 6.0.24.69+repack
* New upstream version 6.0.24.69.1+repack
* New upstream version 6.0.24.71+repack
* Okay that's a lot of updates.
* Refreshed d/p/makefile to reflect new CFLAG
* 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> Wed, 21 May 2025 21:45:59 +0100
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
* New upstream import after bug report
* Roll back some ftbfs-gcc14 edits
* Remove some more lib headers
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 19:30:22 +0000
linbpq (6.0.24.51+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
- Patches refreshed
* Upstream is now repacked to include less files
* Big build system review, now using Debian CFLAGS and LDFLAGS
- Hardening enabled, mostly
- A debug symbols package is now available
* Oh yeah, everything is now dynamic linking
- libpng
- libpaho-mqtt
- libjansson
- libminiupnpc
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 13:08:38 +0000
linbpq (6.0.24.50-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
* Files excluded at origtargz generation time for cleanliness
-- Dave Hibberd <hibby@debian.org> Tue, 12 Nov 2024 21:56:38 +0000
linbpq (6.0.24.49-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream import
* Patches refreshed
* Add mqtt requirements
-- Dave Hibberd <hibby@debian.org> Tue, 05 Nov 2024 21:52:29 +0000
linbpq (6.0.24.45-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
* Patches refreshed
-- Dave Hibberd <hibby@debian.org> Fri, 11 Oct 2024 15:48:41 +0100
linbpq (6.0.24.42-1~hibbian+3) bookworm-hibbian-unstable; urgency=medium
* 32bit build error
- Patch updated to fix hopefully
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 12:21:57 +0100
linbpq (6.0.24.42-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Forgot to fix the ninotnc-smt issue, fixed now
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 12:05:54 +0100
linbpq (6.0.24.42-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* Install config to /etc
* New upstream update
* Patches refreshed
* Debian hardening enabled
- 2 new patches created that touch almost every file
- Considered experimental.
- gcc14 builds for Debian Trixie!
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 10:15:11 +0100
linbpq (6.0.24.40-1) unstable; urgency=medium
* Fresh upstream release
- Patches refreshed
* Secure by default patch
-- Dave Hibberd <hibby@debian.org> Sun, 07 Jul 2024 16:09:28 +0100
linbpq (6.0.24.38-1) unstable; urgency=medium
* New Upstream
* Tweak config file per recommendation from 2M0MQN to make first start simple
* Bump standards to 4.7.0.0
-- Dave Hibberd <hibby@debian.org> Sun, 09 Jun 2024 22:38:40 +0100
linbpq (6.0.24.34-2) unstable; urgency=medium
* Fix config permissions bug as reported by Alex 2E1PKY
-- Dave Hibberd <hibby@debian.org> Mon, 08 Apr 2024 22:27:02 +0100
linbpq (6.0.24.34-1) unstable; urgency=medium
* Upstream bump
-- Dave Hibberd <hibby@debian.org> Sat, 06 Apr 2024 02:15:28 +0100
linbpq (6.0.24.33-1) unstable; urgency=medium
* Upstream bump
* Moved config file to examples
* Updated service to fail on no config
* Added helpful README.Debian
-- Dave Hibberd <hibby@debian.org> Tue, 26 Mar 2024 20:24:08 +0000
linbpq (6.0.24.30-1) unstable; urgency=medium
* Upstream bump
-- Dave Hibberd <hibby@debian.org> Fri, 23 Feb 2024 23:24:46 +0000
linbpq (6.0.24.29-1) unstable; urgency=medium
* Upstream bump
* Added my new details
* Tidied up some packaging errors
-- Dave Hibberd <hibby@debian.org> Tue, 13 Feb 2024 00:06:33 +0000
linbpq (6.0.24.27-2) unstable; urgency=medium
* Permissions fix for web-config-editor users
-- Dave Hibberd <d@vehibberd.com> Thu, 18 Jan 2024 10:31:56 +0000
linbpq (6.0.24.27-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Tue, 16 Jan 2024 20:51:43 +0000
linbpq (6.0.24.25-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Thu, 28 Dec 2023 10:44:47 +0000
linbpq (6.0.24.22-2) unstable; urgency=medium
* Moved config file home, caused chaos
-- Dave Hibberd <d@vehibberd.com> Sat, 16 Dec 2023 14:40:20 +0000
linbpq (6.0.24.22-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Fri, 08 Dec 2023 12:29:40 +0000
linbpq (6.0.24.16-1) unstable; urgency=medium
* New Upstream release
-- Dave Hibberd <d@vehibberd.com> Tue, 31 Oct 2023 22:50:01 +0000
linbpq (6.0.24.15-2) unstable; urgency=medium
* debian/conffiles introduced to stop linbpq overwriting config files
- Thanks to Mark 2M0IIG for raising concern about this bug!
-- Dave Hibberd <d@vehibberd.com> Sun, 15 Oct 2023 21:45:24 +0100
linbpq (6.0.24.15-1) unstable; urgency=medium
* New upstream release
-- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 22:19:48 +0100
linbpq (6.0.24.2-1) unstable; urgency=medium
* Initial release.
-- Dave Hibberd <d@vehibberd.com> Mon, 28 Aug 2023 23:20:45 +0100

20
debian/control vendored
View file

@ -1,20 +0,0 @@
Source: linbpq
Section: hamradio
Priority: optional
Maintainer: Dave Hibberd <hibby@debian.org>
Standards-Version: 4.7.2
Vcs-Browser: https://git.hibbian.org/Hibbian/linbpq
Vcs-Git: https://git.hibbian.org/Hibbian/linbpq.git
Homepage: https://www.cantab.net/users/john.wiseman/Documents/
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
Package: linbpq
Architecture: linux-any
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser
Description: Packet node and ax25 stack
LINBPQ is a Linux version of the BPQ32 Node, BBS and Chat Server components.
It is actively developed by John G8BPQ and contains a complete, independent
implementation of ax.25 and net/rom as well as BBS and Chat applications and
can be used either as a packet switch or as a full featured node.

37
debian/copyright vendored
View file

@ -1,37 +0,0 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: linBPQ
Upstream-Contact: John Wiseman G8BPQ <john.wiseman@cantab.net>
Source: https://www.cantab.net/users/john.wiseman/Documents/
Files-Excluded: *.vcproj* *.bak *.lib *.dll *.wav *.asm *.vcxproj* *.pdb *.exe
.gitignore XAprs zlib.h zconf.h MQTT* pcap.h miniupnpc.h upnpdev.h
igd_desc_parse.h upnpcommands.h upnperrors.h miniupnpctypes.h
*.svn-base *.db *.obj
Files: *
Copyright: 1990-2025 John Wiseman G8BPQ <john.wiseman@cantab.net>
License: GPL-3
Files: debian/*
Copyright: 2016-2025 Dave Hibberd <d@vehibberd.com>
License: GPL-3
Files: debian/linbpq.service
Copyright: 2024-2025 Tom Fanning M0LTE
License: GPL-3
License: GPL-3
This program 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.
.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
.
The GPL License which applies to this package can be found on your Debian
system at /usr/share/common-licenses/GPL-3.

2
debian/dirs vendored
View file

@ -1,2 +0,0 @@
usr/sbin
opt/oarc/bpq

3
debian/gbp.conf vendored
View file

@ -1,3 +0,0 @@
[DEFAULT]
debian-branch = hibbian/latest
upstream-branch = upstream/latest

View file

@ -1,6 +0,0 @@
include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
reprotest:
extends: .test-reprotest-diffoscope

1
debian/install vendored
View file

@ -1 +0,0 @@
debian/bpq32.cfg etc/

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