Compare commits
No commits in common. "hibbian/latest" and "debian/6.0.24.50-1" have entirely different histories.
hibbian/la
...
debian/6.0
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.pc/
|
||||
7
6pack.c
7
6pack.c
|
|
@ -72,7 +72,7 @@ Using code from 6pack Linux Kernel driver with the following licence and credits
|
|||
|
||||
#include "compatbits.h"
|
||||
#include <string.h>
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
||||
|
|
@ -1412,11 +1412,10 @@ VOID * SIXPACKExtInit(EXTPORTDATA * PortEntry)
|
|||
TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SIXPACK;
|
||||
|
||||
TNC->Hardware = H_SIXPACK;
|
||||
TNC->ARDOPBuffer = malloc(8192);
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
|
|||
10
AEAPactor.c
10
AEAPactor.c
|
|
@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
//#include <process.h>
|
||||
//#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
|
@ -292,7 +292,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
// Send Error Response
|
||||
|
||||
buffptr->Len = sprintf(buffptr->Data, "No Connection to PACTOR TNC\r");
|
||||
buffptr->Len = 36;
|
||||
memcpy(buffptr->Data, "No Connection to PACTOR TNC\r", 36);
|
||||
|
||||
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
|
||||
|
||||
|
|
@ -382,8 +383,7 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
|
|||
|
||||
TNC->Port = port;
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
|
||||
TNC->Hardware = H_AEA;
|
||||
|
||||
TNC->TEXTMODE = FALSE;
|
||||
|
||||
|
|
@ -391,6 +391,8 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
|
|||
|
||||
TNC->InitScript = _strupr(TNC->InitScript);
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
{
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
|
|||
194
AGWAPI.c
194
AGWAPI.c
|
|
@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
*/
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
||||
|
|
@ -36,8 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
struct AGWHeader
|
||||
{
|
||||
uint8_t Port;
|
||||
uint8_t filler1[3];
|
||||
unsigned int Port;
|
||||
unsigned char DataKind;
|
||||
unsigned char filler2;
|
||||
unsigned char PID;
|
||||
|
|
@ -129,7 +128,7 @@ int DataSocket_Write(struct AGWSocketConnectionInfo * sockptr, SOCKET sock);
|
|||
int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
|
||||
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
|
||||
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, int Stamp, int * FrameType, int useLocalTime, int doNodes);
|
||||
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
|
||||
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
|
||||
int ShowApps();
|
||||
|
|
@ -403,7 +402,7 @@ int SetUpHostSessions()
|
|||
extern struct DATAMESSAGE * REPLYBUFFER;
|
||||
extern BOOL AGWActive;
|
||||
|
||||
VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// DISPLAY AGW Session Status
|
||||
|
||||
|
|
@ -721,7 +720,7 @@ int AGWDoMonitorData()
|
|||
|
||||
RawLen = monbuff->LENGTH;
|
||||
|
||||
if (RawLen < MSGHDDRLEN || RawLen > 350)
|
||||
if (RawLen < 7 || RawLen > 350)
|
||||
{
|
||||
ReleaseBuffer(monbuff);
|
||||
FreeSemaphore(&Semaphore);
|
||||
|
|
@ -735,16 +734,12 @@ int AGWDoMonitorData()
|
|||
ReleaseBuffer(monbuff);
|
||||
|
||||
FreeSemaphore(&Semaphore);
|
||||
|
||||
// Set monbuff to point to the copy
|
||||
|
||||
monbuff = (MESSAGE *)Buffer;
|
||||
|
||||
//' 4 byte chain
|
||||
//' 1 byte port - top bit = transmit
|
||||
//' 2 byte length (LO-HI)
|
||||
|
||||
Port = monbuff->PORT;
|
||||
Port = Buffer[4];
|
||||
|
||||
if (Port > 127)
|
||||
{
|
||||
|
|
@ -756,12 +751,6 @@ int AGWDoMonitorData()
|
|||
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
|
||||
|
||||
for (n = 1; n<= CurrentSockets; n++)
|
||||
|
|
@ -770,7 +759,7 @@ int AGWDoMonitorData()
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
@ -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
|
||||
{
|
||||
|
|
@ -822,12 +811,8 @@ int AGWDoMonitorData()
|
|||
//
|
||||
// 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
|
||||
// As this is an application API I think all should go as Port 1
|
||||
|
||||
|
||||
Buffer[MSGHDDRLEN - 1] = 0; // Just in case big-endian
|
||||
|
||||
Buffer[6]=0;
|
||||
|
||||
AGWTXHeader.Port = Port - 1; // AGW Ports start from 0
|
||||
AGWTXHeader.DataKind = 'K';
|
||||
|
|
@ -839,12 +824,14 @@ int AGWDoMonitorData()
|
|||
sockptr=&Sockets[n];
|
||||
|
||||
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)
|
||||
|
|
@ -1030,7 +1017,6 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
|
|||
{
|
||||
int i;
|
||||
int DataLength;
|
||||
struct AGWHeader * AGW = &sockptr->AGWRXHeader;
|
||||
|
||||
ioctlsocket(sock,FIONREAD,&DataLength);
|
||||
|
||||
|
|
@ -1042,83 +1028,18 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (DataLength < 36) // A header
|
||||
{
|
||||
// If we don't get a header within a few ms assume a rogue connection and close it
|
||||
|
||||
int n = 50;
|
||||
|
||||
while (n--)
|
||||
{
|
||||
Sleep(10);
|
||||
ioctlsocket(sock,FIONREAD,&DataLength);
|
||||
|
||||
if (DataLength >= 36)
|
||||
break;
|
||||
}
|
||||
|
||||
if (n < 1)
|
||||
{
|
||||
Debugprintf("Corrupt AGW Packet Received");
|
||||
AGWDataSocket_Disconnect(sockptr);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Have a header
|
||||
|
||||
i=recv(sock,(char *)&sockptr->AGWRXHeader, 36, 0);
|
||||
|
||||
if (i == SOCKET_ERROR)
|
||||
{
|
||||
i=WSAGetLastError();
|
||||
AGWDataSocket_Disconnect(sockptr);
|
||||
}
|
||||
|
||||
sockptr->MsgDataLength = sockptr->AGWRXHeader.DataLength;
|
||||
|
||||
// Validate packet to protect against accidental (or malicious!) connects from a non-agw application
|
||||
|
||||
if (AGW->Port > 64 || AGW->filler2 != 0 || AGW->filler3 != 0 || AGW->DataLength > 400)
|
||||
{
|
||||
Debugprintf("Corrupt AGW Packet Received");
|
||||
AGWDataSocket_Disconnect(sockptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sockptr->MsgDataLength == 0)
|
||||
ProcessAGWCommand (sockptr);
|
||||
else
|
||||
sockptr->GotHeader = TRUE; // Wait for data
|
||||
|
||||
ioctlsocket(sock,FIONREAD,&DataLength); // See if more data
|
||||
|
||||
if (sockptr->GotHeader)
|
||||
{
|
||||
// Received a header, without sufficient data bytes
|
||||
|
||||
if (DataLength < sockptr->MsgDataLength)
|
||||
{
|
||||
// Fiddle - seem to be problems somtimes with un-Neagled hosts so wait a few ms
|
||||
// if we don't get a full packet assume a rogue connection and close it
|
||||
// Fiddle - seem to be problems somtimes with un-Neagled hosts
|
||||
|
||||
Sleep(500);
|
||||
|
||||
int n = 50;
|
||||
|
||||
while (n--)
|
||||
{
|
||||
Sleep(10);
|
||||
ioctlsocket(sock,FIONREAD,&DataLength);
|
||||
|
||||
if (DataLength >= sockptr->MsgDataLength)
|
||||
break;
|
||||
}
|
||||
|
||||
if (n < 1)
|
||||
{
|
||||
Debugprintf("Corrupt AGW Packet Received");
|
||||
AGWDataSocket_Disconnect(sockptr);
|
||||
return 0;
|
||||
}
|
||||
ioctlsocket(sock,FIONREAD,&DataLength);
|
||||
}
|
||||
|
||||
if (DataLength >= sockptr->MsgDataLength)
|
||||
|
|
@ -1131,9 +1052,60 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
|
|||
|
||||
ProcessAGWCommand (sockptr);
|
||||
free(sockptr->MsgData);
|
||||
|
||||
sockptr->GotHeader = FALSE;
|
||||
}
|
||||
|
||||
// Not Enough Data - wait
|
||||
|
||||
}
|
||||
else // Not got header
|
||||
{
|
||||
if (DataLength > 35)// A header
|
||||
{
|
||||
struct AGWHeader * AGW = &sockptr->AGWRXHeader;
|
||||
|
||||
i=recv(sock,(char *)&sockptr->AGWRXHeader, 36, 0);
|
||||
|
||||
if (i == SOCKET_ERROR)
|
||||
{
|
||||
i=WSAGetLastError();
|
||||
|
||||
AGWDataSocket_Disconnect(sockptr);
|
||||
}
|
||||
|
||||
|
||||
sockptr->MsgDataLength = sockptr->AGWRXHeader.DataLength;
|
||||
|
||||
// Validate packet to protect against accidental (or malicious!) connects from a non-agw application
|
||||
|
||||
|
||||
if (AGW->Port > 64 || AGW->filler2 != 0 || AGW->filler3 != 0 || AGW->DataLength > 400)
|
||||
{
|
||||
Debugprintf("Corrupt AGW Packet Received");
|
||||
AGWDataSocket_Disconnect(sockptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sockptr->MsgDataLength > 500)
|
||||
OutputDebugString("Corrupt AGW message");
|
||||
|
||||
|
||||
if (sockptr->MsgDataLength == 0)
|
||||
{
|
||||
ProcessAGWCommand (sockptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
sockptr->GotHeader = TRUE; // Wait for data
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// not got 36 bytes
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1141,7 +1113,6 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
|
|||
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
||||
{
|
||||
int AGWVersion[2]={2003,999};
|
||||
byte AGWPortCaps[12] = { 0, 255, 30, 10, 63, 10, 4, 0, 1, 0, 0, 0 };
|
||||
char AGWRegReply[1];
|
||||
struct BPQConnectionInfo * Connection;
|
||||
int Stream;
|
||||
|
|
@ -1156,7 +1127,6 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
|||
int con,conport;
|
||||
int AGWYReply = 0;
|
||||
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,
|
||||
// not the real port number
|
||||
|
|
@ -1209,9 +1179,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
|||
|
||||
// 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
|
||||
|
||||
|
|
@ -1226,7 +1196,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
|||
|
||||
while(nDigis--)
|
||||
{
|
||||
n += sprintf(&ConnectMsg[n], " %s", Digis);
|
||||
sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis);
|
||||
Digis += 10;
|
||||
}
|
||||
}
|
||||
|
|
@ -1307,7 +1277,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
|||
// Version
|
||||
|
||||
memset(&AGWTXHeader,0,36);
|
||||
|
||||
AGWTXHeader.DataKind = 'R';
|
||||
|
||||
AGWTXHeader.DataLength = 8; // Length
|
||||
|
||||
SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]);
|
||||
|
|
@ -1321,27 +1293,15 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
|||
|
||||
|
||||
memset(&AGWTXHeader,0,36);
|
||||
|
||||
AGWTXHeader.DataKind = 'G';
|
||||
|
||||
AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length
|
||||
|
||||
SendtoSocket(sockptr->socket, AGWPorts);
|
||||
|
||||
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':
|
||||
|
||||
|
|
@ -1440,8 +1400,6 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
|
|||
|
||||
AGWTXHeader.DataKind = 'X';
|
||||
|
||||
memcpy(&AGWTXHeader.callfrom, RegCall, 10);
|
||||
|
||||
AGWTXHeader.DataLength = 1; // Length
|
||||
|
||||
AGWRegReply[0] = 1;
|
||||
|
|
|
|||
103
AGWMoncode.c
103
AGWMoncode.c
|
|
@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
// MSGFLAG contains CMD/RESPONSE BITS
|
||||
|
|
@ -49,14 +49,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#define DM 0x0F
|
||||
#define UA 0x63
|
||||
#define FRMR 0x87
|
||||
#define XID 0xAF
|
||||
#define TEST 0xE3
|
||||
#define RR 1
|
||||
#define RNR 5
|
||||
#define REJ 9
|
||||
#define SREJ 0x0D
|
||||
#define SABME 0x6F
|
||||
|
||||
|
||||
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
|
||||
|
||||
|
|
@ -66,6 +61,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define NODES_SIG 0xFF
|
||||
|
||||
char * strlop(char * buf, char delim);
|
||||
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
|
||||
|
||||
static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes);
|
||||
|
|
@ -266,18 +262,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
|
|||
strcpy(SUP, "FRMR");
|
||||
FRMRFLAG = 1;
|
||||
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);
|
||||
|
|
@ -287,7 +271,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
|
|||
// Super
|
||||
|
||||
int NR = (CTL >> 5) & 7;
|
||||
char SUP[5] = "??";
|
||||
char SUP[4] = "??";
|
||||
|
||||
switch (CTL & 0x0F)
|
||||
{
|
||||
|
|
@ -305,13 +289,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
|
|||
|
||||
strcpy(SUP, "REJ");
|
||||
break;
|
||||
|
||||
|
||||
case SREJ:
|
||||
|
||||
strcpy(SUP, "SREJ");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
|
||||
|
|
@ -324,72 +301,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
|
|||
if (FRMRFLAG)
|
||||
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)
|
||||
{
|
||||
// We have an info frame
|
||||
|
|
@ -509,14 +420,6 @@ UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNo
|
|||
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
|
||||
|
||||
Output += sprintf((char *)Output, " NET/ROM\r ");
|
||||
|
|
|
|||
25
AISCommon.c
25
AISCommon.c
|
|
@ -7,7 +7,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include "time.h"
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
//#include "tncinfo.h"
|
||||
//#include "adif.h"
|
||||
//#include "telnetserver.h"
|
||||
|
|
@ -760,7 +760,7 @@ void SaveVesselDataBase()
|
|||
|
||||
void LoadNavAidDataBase()
|
||||
{
|
||||
int i, n, count;
|
||||
int i;
|
||||
|
||||
FILE *file;
|
||||
char buf[256];
|
||||
|
|
@ -793,12 +793,10 @@ void LoadNavAidDataBase()
|
|||
|
||||
NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *));
|
||||
|
||||
count = 0;
|
||||
|
||||
for (i = 0; i < NavAidCount; i++)
|
||||
{
|
||||
navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD));
|
||||
NavRecords[count] = navptr;
|
||||
NavRecords[i] = navptr;
|
||||
memset(navptr, 0, sizeof(struct NAVAIDRECORD));
|
||||
|
||||
fgets(buf, 255, file);
|
||||
|
|
@ -809,19 +807,6 @@ void LoadNavAidDataBase()
|
|||
token = strtok(NULL, "|\n" );
|
||||
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" );
|
||||
navptr->lat = atof(token);
|
||||
|
||||
|
|
@ -835,7 +820,6 @@ void LoadNavAidDataBase()
|
|||
navptr->TimeLastUpdated = atoi(token);
|
||||
}
|
||||
|
||||
NavAidCount = count;
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
|
|
@ -848,7 +832,6 @@ void SaveNavAidDataBase()
|
|||
char FN[256];
|
||||
struct NAVAIDRECORD * navptr;
|
||||
|
||||
|
||||
if (BPQDirectory[0] == 0)
|
||||
{
|
||||
strcpy(FN, "AIS_NavAids.txt");
|
||||
|
|
@ -2389,8 +2372,6 @@ void ProcessAISNavAidMessage()
|
|||
NavAidCount++;
|
||||
|
||||
ProcessAISNavAidMessage();
|
||||
NavAidDBChanged = 1;
|
||||
|
||||
|
||||
return;
|
||||
|
||||
|
|
|
|||
56
APRSCode.c
56
APRSCode.c
|
|
@ -22,10 +22,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
// First Version, November 2011
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "bpq32.h"
|
||||
#include <time.h>
|
||||
#include "kernelresource.h"
|
||||
|
|
@ -62,6 +63,7 @@ VOID __cdecl Debugprintf(const char * format, ...);
|
|||
VOID __cdecl Consoleprintf(const char * format, ...);
|
||||
BOOL APIENTRY Send_AX(PMESSAGE Block, DWORD Len, UCHAR Port);
|
||||
VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port);
|
||||
char * strlop(char * buf, char delim);
|
||||
int APRSDecodeFrame(char * msg, char * buffer, time_t Stamp, uint64_t Mask); // Unsemaphored DecodeFrame
|
||||
APRSHEARDRECORD * UpdateHeard(UCHAR * Call, int Port);
|
||||
BOOL CheckforDups(char * Call, char * Msg, int Len);
|
||||
|
|
@ -86,7 +88,7 @@ double myDistance(double laa, double loa, BOOL KM);
|
|||
struct STATIONRECORD * FindStation(char * Call, BOOL AddIfNotFound);
|
||||
int DecodeAPRSPayload(char * Payload, struct STATIONRECORD * Station);
|
||||
BOOL KillOldTNC(char * Path);
|
||||
|
||||
int FromLOC(char * Locator, double * pLat, double * pLon);
|
||||
BOOL ToLOC(double Lat, double Lon , char * Locator);
|
||||
BOOL InternalSendAPRSMessage(char * Text, char * Call);
|
||||
void UndoTransparency(char * input);
|
||||
|
|
@ -102,7 +104,6 @@ void ClearSavedMessages();
|
|||
void GetSavedAPRSMessages();
|
||||
static VOID GPSDConnect(void * unused);
|
||||
int CanPortDigi(int Port);
|
||||
int FromLOC(char * Locator, double * pLat, double * pLon);
|
||||
|
||||
extern int SemHeldByAPI;
|
||||
extern int APRSMONDECODE();
|
||||
|
|
@ -347,7 +348,7 @@ APRSHEARDRECORD MHTABLE[MAXHEARD] = {0};
|
|||
|
||||
APRSHEARDRECORD * MHDATA = &MHTABLE[0];
|
||||
|
||||
static SOCKET sock = 0;
|
||||
static SOCKET sock = (SOCKET)0;
|
||||
|
||||
//Duplicate suppression Code
|
||||
|
||||
|
|
@ -553,8 +554,6 @@ int APRSWriteLog(char * msg)
|
|||
UCHAR Value[MAX_PATH];
|
||||
time_t T;
|
||||
struct tm * tm;
|
||||
int n;
|
||||
|
||||
|
||||
if (LogAPRSIS == 0)
|
||||
return 0;
|
||||
|
|
@ -576,9 +575,8 @@ int APRSWriteLog(char * msg)
|
|||
strcat(Value, "logs/APRS_");
|
||||
}
|
||||
|
||||
n = strlen(Value);
|
||||
|
||||
sprintf(&Value[n], "%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, "ab")) == NULL)
|
||||
return FALSE;
|
||||
|
|
@ -3115,7 +3113,7 @@ VOID APRSISThread(void * Report)
|
|||
BOOL bcopt=TRUE;
|
||||
char Buffer[1000];
|
||||
int InputLen = 1; // Non-zero
|
||||
char errmsg[300];
|
||||
char errmsg[100];
|
||||
char * ptr;
|
||||
size_t inptr = 0;
|
||||
char APRSinMsg[1000];
|
||||
|
|
@ -3676,7 +3674,7 @@ BOOL CheckforDups(char * Call, char * Msg, int Len)
|
|||
if (ptr1)
|
||||
*ptr1 = 0;
|
||||
|
||||
// Debugprintf("Duplicate Message suppressed %s", Msg);
|
||||
// Debugprintf("Duplicate Message supressed %s", Msg);
|
||||
return TRUE; // Duplicate
|
||||
}
|
||||
}
|
||||
|
|
@ -7668,7 +7666,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
|
|||
|
||||
}
|
||||
|
||||
OutputLen += sprintf(&OutBuffer[OutputLen], "%s", WebTrailer);
|
||||
OutputLen += sprintf(&OutBuffer[OutputLen], WebTrailer);
|
||||
|
||||
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
|
||||
sendandcheck(sock, Header, HeaderLen);
|
||||
|
|
@ -7693,7 +7691,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
|
|||
while (ptr)
|
||||
{
|
||||
char ToLopped[11] = "";
|
||||
|
||||
|
||||
if (ptr->Acked)
|
||||
strcpy(Retries, "A");
|
||||
else if (ptr->Retries == 0)
|
||||
|
|
@ -7701,26 +7699,26 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
|
|||
else
|
||||
sprintf(Retries, "%d", ptr->Retries);
|
||||
|
||||
memcpy(ToLopped, ptr->ToCall, 10);
|
||||
strlop(ToLopped, ' ');
|
||||
memcpy(ToLopped, ptr->ToCall, 10);
|
||||
strlop(ToLopped, ' ');
|
||||
|
||||
OutputLen += sprintf(&OutBuffer[OutputLen], WebTXLine,
|
||||
ptr->ToCall, ptr->Seq, ptr->Time, Retries, ptr->Text);
|
||||
ptr = ptr->Next;
|
||||
OutputLen += sprintf(&OutBuffer[OutputLen], WebTXLine,
|
||||
ptr->ToCall, ptr->Seq, ptr->Time, Retries, ptr->Text);
|
||||
ptr = ptr->Next;
|
||||
|
||||
if (OutputLen > 99000)
|
||||
break;
|
||||
if (OutputLen > 99000)
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
OutputLen += sprintf(&OutBuffer[OutputLen], "%s", WebTrailer);
|
||||
OutputLen += sprintf(&OutBuffer[OutputLen], WebTrailer);
|
||||
|
||||
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
|
||||
sendandcheck(sock, Header, HeaderLen);
|
||||
sendandcheck(sock, OutBuffer, OutputLen);
|
||||
|
||||
return;
|
||||
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
|
||||
sendandcheck(sock, Header, HeaderLen);
|
||||
sendandcheck(sock, OutBuffer, OutputLen);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -8115,7 +8113,7 @@ extern char OrigCmdBuffer[81];
|
|||
|
||||
BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr);
|
||||
|
||||
VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// APRS Subcommands. Default for compatibility is APRSMH
|
||||
|
||||
|
|
@ -9180,7 +9178,7 @@ void GetSavedAPRSMessages()
|
|||
if ((file = fopen(FN, "r")) == NULL)
|
||||
return ;
|
||||
|
||||
while (fgets(Line, sizeof(Line), file))
|
||||
while (fgets(Line, 512, file))
|
||||
{
|
||||
Stamp = Line;
|
||||
From = strlop(Stamp, ' ');
|
||||
|
|
|
|||
290
ARDOP.c
290
ARDOP.c
|
|
@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
|
||||
int (WINAPI FAR *GetModuleFileNameExPtr)();
|
||||
|
|
@ -62,12 +62,6 @@ int (WINAPI FAR *EnumProcessesPtr)();
|
|||
#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_DATA WM_USER + 2
|
||||
#define WSA_CONNECT WM_USER + 3
|
||||
|
|
@ -142,10 +136,6 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
|
|||
if (TNC->Streams[0].Attached)
|
||||
TNC->Streams[0].ReportDISC = TRUE;
|
||||
|
||||
TNC->Streams[0].Connecting = 0;
|
||||
TNC->Streams[0].Connected = 0;
|
||||
TNC->Streams[0].Attached = 0;
|
||||
|
||||
if (TNC->TCPSock)
|
||||
{
|
||||
shutdown(TNC->TCPSock, SD_BOTH);
|
||||
|
|
@ -172,9 +162,6 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
|
|||
sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped");
|
||||
MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE);
|
||||
|
||||
strcpy(TNC->WEB_TNCSTATE, "Free");
|
||||
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -466,116 +453,116 @@ static int ProcessLine(char * buf, int Port)
|
|||
else
|
||||
return FALSE; // Must start with ADDR
|
||||
|
||||
TNC->InitScript = malloc(1000);
|
||||
TNC->InitScript[0] = 0;
|
||||
TNC->InitScript = malloc(1000);
|
||||
TNC->InitScript[0] = 0;
|
||||
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
if (_stricmp(ptr, "PTT") == 0)
|
||||
{
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
DecodePTTString(TNC, ptr);
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
if (_memicmp(ptr, "PATH", 4) == 0)
|
||||
{
|
||||
p_cmd = strtok(NULL, "\n\r");
|
||||
if (p_cmd) TNC->ProgramPath = _strdup(p_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
TNC->MaxConReq = 10; // Default
|
||||
TNC->OldMode = FALSE; // Default
|
||||
|
||||
// Read Initialisation lines
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
if (GetLine(buf) == 0)
|
||||
return TRUE;
|
||||
|
||||
strcpy(errbuf, buf);
|
||||
|
||||
if (memcmp(buf, "****", 4) == 0)
|
||||
return TRUE;
|
||||
|
||||
ptr = strchr(buf, ';');
|
||||
if (ptr)
|
||||
{
|
||||
*ptr++ = 13;
|
||||
*ptr = 0;
|
||||
if (_stricmp(ptr, "PTT") == 0)
|
||||
{
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
DecodePTTString(TNC, ptr);
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
if (_memicmp(ptr, "PATH", 4) == 0)
|
||||
{
|
||||
p_cmd = strtok(NULL, "\n\r");
|
||||
if (p_cmd) TNC->ProgramPath = _strdup(p_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
if ((_memicmp(buf, "CAPTURE", 7) == 0) || (_memicmp(buf, "PLAYBACK", 8) == 0))
|
||||
{} // Ignore
|
||||
else
|
||||
/*
|
||||
TNC->MaxConReq = 10; // Default
|
||||
TNC->OldMode = FALSE; // Default
|
||||
|
||||
// Read Initialisation lines
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
if (GetLine(buf) == 0)
|
||||
return TRUE;
|
||||
|
||||
strcpy(errbuf, buf);
|
||||
|
||||
if (memcmp(buf, "****", 4) == 0)
|
||||
return TRUE;
|
||||
|
||||
ptr = strchr(buf, ';');
|
||||
if (ptr)
|
||||
{
|
||||
*ptr++ = 13;
|
||||
*ptr = 0;
|
||||
}
|
||||
|
||||
if ((_memicmp(buf, "CAPTURE", 7) == 0) || (_memicmp(buf, "PLAYBACK", 8) == 0))
|
||||
{} // Ignore
|
||||
else
|
||||
/*
|
||||
if (_memicmp(buf, "PATH", 4) == 0)
|
||||
{
|
||||
char * Context;
|
||||
p_cmd = strtok_s(&buf[5], "\n\r", &Context);
|
||||
if (p_cmd) TNC->ProgramPath = _strdup(p_cmd);
|
||||
char * Context;
|
||||
p_cmd = strtok_s(&buf[5], "\n\r", &Context);
|
||||
if (p_cmd) TNC->ProgramPath = _strdup(p_cmd);
|
||||
}
|
||||
else
|
||||
*/
|
||||
*/
|
||||
|
||||
if (_memicmp(buf, "PACKETCHANNELS", 14) == 0) // Packet Channels
|
||||
TNC->PacketChannels = atoi(&buf[14]);
|
||||
else
|
||||
if (_memicmp(buf, "MAXCONREQ", 9) == 0) // Hold Time for Busy Detect
|
||||
TNC->MaxConReq = atoi(&buf[9]);
|
||||
if (_memicmp(buf, "MAXCONREQ", 9) == 0) // Hold Time for Busy Detect
|
||||
TNC->MaxConReq = atoi(&buf[9]);
|
||||
|
||||
else
|
||||
if (_memicmp(buf, "STARTINROBUST", 13) == 0)
|
||||
TNC->StartInRobust = TRUE;
|
||||
else
|
||||
if (_memicmp(buf, "STARTINROBUST", 13) == 0)
|
||||
TNC->StartInRobust = TRUE;
|
||||
|
||||
else
|
||||
if (_memicmp(buf, "ROBUST", 6) == 0)
|
||||
{
|
||||
if (_memicmp(&buf[7], "TRUE", 4) == 0)
|
||||
TNC->Robust = TRUE;
|
||||
|
||||
strcat (TNC->InitScript, buf);
|
||||
}
|
||||
else
|
||||
if (_memicmp(buf, "LOGDIR ", 7) == 0)
|
||||
TNC->LogPath = _strdup(&buf[7]);
|
||||
else
|
||||
if (_memicmp(buf, "ENABLEPACKET", 12) == 0)
|
||||
{
|
||||
if (TNC->PacketChannels == 0)
|
||||
TNC->PacketChannels = 5;
|
||||
// AddVirtualKISSPort(TNC, Port, buf);
|
||||
}
|
||||
|
||||
else
|
||||
if (_memicmp(buf, "ROBUST", 6) == 0)
|
||||
{
|
||||
if (_memicmp(&buf[7], "TRUE", 4) == 0)
|
||||
TNC->Robust = TRUE;
|
||||
|
||||
strcat (TNC->InitScript, buf);
|
||||
}
|
||||
else
|
||||
if (_memicmp(buf, "LOGDIR ", 7) == 0)
|
||||
TNC->LogPath = _strdup(&buf[7]);
|
||||
else
|
||||
if (_memicmp(buf, "ENABLEPACKET", 12) == 0)
|
||||
{
|
||||
if (TNC->PacketChannels == 0)
|
||||
TNC->PacketChannels = 5;
|
||||
// AddVirtualKISSPort(TNC, Port, buf);
|
||||
}
|
||||
|
||||
// else if (_memicmp(buf, "PAC ", 4) == 0 && _memicmp(buf, "PAC MODE", 8) != 0)
|
||||
// {
|
||||
// PAC MODE goes to TNC, others are parsed locally
|
||||
//
|
||||
// ConfigVirtualKISSPort(TNC, buf);
|
||||
// }
|
||||
else if (standardParams(TNC, buf) == FALSE)
|
||||
strcat(TNC->InitScript, buf);
|
||||
}
|
||||
// else if (_memicmp(buf, "PAC ", 4) == 0 && _memicmp(buf, "PAC MODE", 8) != 0)
|
||||
// {
|
||||
// PAC MODE goes to TNC, others are parsed locally
|
||||
//
|
||||
// ConfigVirtualKISSPort(TNC, buf);
|
||||
// }
|
||||
else if (standardParams(TNC, buf) == FALSE)
|
||||
strcat(TNC->InitScript, buf);
|
||||
}
|
||||
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
void ARDOPThread(VOID * Param);
|
||||
void ARDOPThread(struct TNCINFO * TNC);
|
||||
VOID ARDOPProcessDataSocketData(int port);
|
||||
int ConnecttoARDOP(struct TNCINFO * TNC);
|
||||
int ConnecttoARDOP();
|
||||
static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
|
||||
static VOID ARDOPProcessReceivedControl(struct TNCINFO * TNC);
|
||||
int V4ProcessReceivedData(struct TNCINFO * TNC);
|
||||
|
|
@ -656,12 +643,6 @@ VOID ARDOPSendCommand(struct TNCINFO * TNC, char * Buff, BOOL Queue)
|
|||
if (Buff[0] == 0) // Terminal Keepalive?
|
||||
return;
|
||||
|
||||
if (memcmp(Buff, "LISTEN ", 7) == 0)
|
||||
{
|
||||
strcpy(TNC->WEB_MODE, &Buff[7]);
|
||||
MySetWindowText(TNC->xIDC_MODE, &Buff[7]);
|
||||
}
|
||||
|
||||
EncLen = sprintf(Encoded, "%s\r", Buff);
|
||||
|
||||
// it is possible for binary data to be dumped into the command
|
||||
|
|
@ -894,10 +875,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
|
||||
{
|
||||
Debugprintf("ARDOP closing session on SessionTimelimit");
|
||||
ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
|
||||
STREAM->ReportDISC = 1;
|
||||
STREAM->AttachTime = 0;
|
||||
STREAM->Disconnecting = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -907,7 +886,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
|
||||
{
|
||||
Debugprintf("ARDOP closing session on AttachTimelimit");
|
||||
STREAM->ReportDISC = 1;
|
||||
STREAM->AttachTime = 0;
|
||||
}
|
||||
|
|
@ -1041,10 +1019,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
TNC->Busy--;
|
||||
if (TNC->Busy == 0)
|
||||
{
|
||||
MySetWindowText(TNC->xIDC_CHANSTATE, "Clear");
|
||||
strcpy(TNC->WEB_CHANSTATE, "Clear");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1504,10 +1480,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
|
||||
{
|
||||
char cmd[56];
|
||||
|
||||
strcpy(cmd, &buff->L2DATA[6]);
|
||||
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
|
||||
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
|
||||
|
||||
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
|
||||
{
|
||||
|
|
@ -1746,7 +1719,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
return TNC->CONNECTED << 8 | 1;
|
||||
|
||||
return (TNC->CONNECTED << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK
|
||||
|
||||
|
||||
|
||||
case 4: // reinit7
|
||||
|
||||
|
|
@ -1945,7 +1918,7 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
|
|||
|
||||
Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
|
||||
Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
|
||||
Len += sprintf(&Buff[Len], "<tr><td>Listen</td><td>%s</td></tr>", TNC->WEB_MODE);
|
||||
Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE);
|
||||
Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
|
||||
Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
|
||||
Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
|
||||
|
|
@ -1994,7 +1967,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (TNC->LogPath)
|
||||
ARDOPOpenLogFiles(TNC);
|
||||
|
|
@ -2007,7 +1979,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
|
|||
if (TNC->ProgramPath)
|
||||
TNC->WeStartedTNC = RestartTNC(TNC);
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP;
|
||||
TNC->Hardware = H_ARDOP;
|
||||
|
||||
if (TNC->BusyWait == 0)
|
||||
TNC->BusyWait = 10;
|
||||
|
|
@ -2015,6 +1987,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
|
|||
if (TNC->BusyHold == 0)
|
||||
TNC->BusyHold = 1;
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
@ -2069,12 +2042,21 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
|
|||
strcat(TempScript, "ARQTIMEOUT 90\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);
|
||||
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++)
|
||||
{
|
||||
|
|
@ -2098,25 +2080,9 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
|
|||
if (strlen(Aux) > 8)
|
||||
{
|
||||
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);
|
||||
|
||||
if (TNC->WL2K == NULL)
|
||||
|
|
@ -2168,7 +2134,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
|
|||
CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL);
|
||||
TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL);
|
||||
|
||||
CreateWindowEx(0, "STATIC", "Listen", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
|
||||
CreateWindowEx(0, "STATIC", "Mode", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
|
||||
TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL);
|
||||
|
||||
CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL);
|
||||
|
|
@ -2304,11 +2270,11 @@ VOID TNCLost(struct TNCINFO * TNC)
|
|||
}
|
||||
|
||||
if (STREAM->Attached)
|
||||
{
|
||||
STREAM->Connected = FALSE;
|
||||
STREAM->Connecting = FALSE;
|
||||
STREAM->ReportDISC = TRUE;
|
||||
|
||||
STREAM->Connected = FALSE;
|
||||
STREAM->Connecting = FALSE;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2320,13 +2286,12 @@ int ConnecttoARDOP(struct TNCINFO * TNC)
|
|||
return 0;
|
||||
}
|
||||
|
||||
VOID ARDOPThread(VOID * Param)
|
||||
VOID ARDOPThread(struct TNCINFO * TNC)
|
||||
{
|
||||
// Opens sockets and looks for data on control and data sockets.
|
||||
|
||||
// Socket may be TCP/IP or Serial
|
||||
|
||||
struct TNCINFO * TNC = (struct TNCINFO *) Param;
|
||||
char Msg[255];
|
||||
int err, i, ret;
|
||||
u_long param=1;
|
||||
|
|
@ -2635,8 +2600,6 @@ VOID ARDOPThread(VOID * Param)
|
|||
|
||||
TNC->Alerted = TRUE;
|
||||
|
||||
ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
|
||||
|
||||
sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC");
|
||||
MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
|
||||
|
||||
|
|
@ -2716,10 +2679,6 @@ VOID ARDOPThread(VOID * Param)
|
|||
sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost");
|
||||
MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
|
||||
|
||||
strcpy(TNC->WEB_TNCSTATE, "Free");
|
||||
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
|
||||
|
||||
|
||||
TNC->CONNECTED = FALSE;
|
||||
TNC->Alerted = FALSE;
|
||||
|
||||
|
|
@ -3159,7 +3118,6 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
// Incoming Connect
|
||||
|
||||
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
|
||||
STREAM->AttachTime = time(NULL);
|
||||
|
||||
// Stop other ports in same group
|
||||
|
||||
|
|
@ -3254,7 +3212,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
if (TNC->SendTandRtoRelay && memcmp(AppName, "RMS ", 4) == 0
|
||||
|
|
@ -3342,9 +3300,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (_memicmp(Buffer, "DISCONNECTED", 12) == 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, "NEWSTATE DISC", 13) == 0
|
||||
|| _memicmp(Buffer, "ABORT", 5) == 0)
|
||||
|
|
@ -3386,9 +3344,6 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
RestartTNC(TNC);
|
||||
}
|
||||
|
||||
sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
|
||||
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -5108,7 +5063,7 @@ tcpHostFrame:
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
@ -5767,7 +5722,8 @@ VOID ARDOPSCSPoll(struct TNCINFO * TNC)
|
|||
|
||||
// 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)
|
||||
{
|
||||
|
|
@ -5775,9 +5731,9 @@ int SerialConnecttoTCP(struct TNCINFO * TNC)
|
|||
|
||||
return 0;
|
||||
}
|
||||
VOID SerialConnecttoTCPThread(VOID * Param)
|
||||
|
||||
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC)
|
||||
{
|
||||
struct TNCINFO * TNC = (struct TNCINFO *) Param;
|
||||
char Msg[255];
|
||||
int i;
|
||||
u_long param = 1;
|
||||
|
|
@ -5976,8 +5932,8 @@ VOID ARAXINIT(struct PORTCONTROL * PORT)
|
|||
char Msg[80] = "";
|
||||
|
||||
memcpy(Msg, PORT->PORTDESCRIPTION, 30);
|
||||
strcat(Msg, "\n);
|
||||
|
||||
sprintf(Msg, "%s\n", Msg);
|
||||
|
||||
WritetoConsoleLocal(Msg);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "bpqmail.h"
|
||||
|
||||
#ifdef WIN32
|
||||
|
|
@ -117,8 +117,6 @@ struct UserInfo * FindBBS(char * Name);
|
|||
void ReleaseWebMailStruct(WebMailInfo * WebMail);
|
||||
VOID TidyWelcomeMsg(char ** pPrompt);
|
||||
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 CHKD[] = "checked=checked ";
|
||||
|
|
@ -188,7 +186,7 @@ char RefreshMainPage[] = "<html><head>"
|
|||
char StatusPage [] =
|
||||
|
||||
"<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>"
|
||||
"<br>User Callsign Stream Queue Sent Rxed<br>"
|
||||
"<br>User Callsign Stream Queue<br>"
|
||||
"<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>";
|
||||
|
||||
char StreamEnd[] =
|
||||
|
|
@ -1703,8 +1701,6 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
|
|||
free(Filters);
|
||||
Filters = NULL;
|
||||
|
||||
UndoTransparency(input);
|
||||
|
||||
while (input)
|
||||
{
|
||||
// extract and validate before saving
|
||||
|
|
@ -1718,7 +1714,7 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
|
|||
|
||||
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]);
|
||||
input = strstr(input, "&From=");
|
||||
|
|
@ -2223,21 +2219,21 @@ VOID ProcessUserUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
|
|||
ptr1 = GetNextParam(&ptr2); // Last Listed
|
||||
USER->lastmsg = atoi(ptr1);
|
||||
ptr1 = GetNextParam(&ptr2); // Name
|
||||
memcpy(USER->Name, ptr1, 17);
|
||||
strcpy(USER->Name, ptr1);
|
||||
ptr1 = GetNextParam(&ptr2); // Pass
|
||||
memcpy(USER->pass, ptr1, 12);
|
||||
strcpy(USER->pass, ptr1);
|
||||
ptr1 = GetNextParam(&ptr2); // CMS Pass
|
||||
if (memcmp("****************", ptr1, strlen(ptr1) != 0))
|
||||
{
|
||||
memcpy(USER->CMSPass, ptr1, 15);
|
||||
strcpy(USER->CMSPass, ptr1);
|
||||
}
|
||||
|
||||
ptr1 = GetNextParam(&ptr2); // QTH
|
||||
memcpy(USER->Address, ptr1, 60);
|
||||
strcpy(USER->Address, ptr1);
|
||||
ptr1 = GetNextParam(&ptr2); // ZIP
|
||||
memcpy(USER->ZIP, ptr1, 8);
|
||||
strcpy(USER->ZIP, ptr1);
|
||||
ptr1 = GetNextParam(&ptr2); // HomeBBS
|
||||
memcpy(USER->HomeBBS, ptr1, 40);
|
||||
strcpy(USER->HomeBBS, ptr1);
|
||||
_strupr(USER->HomeBBS);
|
||||
|
||||
SaveUserDatabase();
|
||||
|
|
@ -2443,8 +2439,8 @@ VOID ProcessMsgFwdUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
|
|||
set_fwd_bit(Msg->fbbs, BBSNumber);
|
||||
User->ForwardingInfo->MsgCount++;
|
||||
clear_fwd_bit(Msg->forw, BBSNumber);
|
||||
if (FirstMessageIndextoForward > GetMessageSlotFromMessageNumber(Msg->number))
|
||||
FirstMessageIndextoForward = GetMessageSlotFromMessageNumber(Msg->number);
|
||||
if (FirstMessageIndextoForward > Msg->number)
|
||||
FirstMessageIndextoForward = Msg->number;
|
||||
|
||||
}
|
||||
*RLen = SendMessageDetails(Msg, Reply, Session->Key);
|
||||
|
|
@ -2759,19 +2755,6 @@ VOID SendUIPage(char * Reply, int * ReplyLen, char * Key)
|
|||
*ReplyLen = Len;
|
||||
}
|
||||
|
||||
void ConvertSpaceTonbsp(char * msg)
|
||||
{
|
||||
// Replace any space with
|
||||
|
||||
char * ptr;
|
||||
|
||||
while (ptr = strchr(msg, ' '))
|
||||
{
|
||||
memmove(ptr + 5, ptr, strlen(ptr) + 1);
|
||||
memcpy(ptr, " ", 6);
|
||||
}
|
||||
}
|
||||
|
||||
VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
|
||||
{
|
||||
int Len;
|
||||
|
|
@ -2793,8 +2776,6 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
|
|||
if (!conn->Active)
|
||||
{
|
||||
strcpy(msg,"Idle "
|
||||
" "
|
||||
" "
|
||||
" "
|
||||
" \r\n");
|
||||
}
|
||||
|
|
@ -2808,16 +2789,16 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
|
|||
strcpy(Name, conn->UserPointer->Name);
|
||||
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 %5d\r\n",
|
||||
Name,
|
||||
&TenSpaces[strlen(Name) * 6],
|
||||
conn->UserPointer->Call,
|
||||
&TenSpaces[strlen(conn->UserPointer->Call) * 6],
|
||||
conn->BPQStream,
|
||||
conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed);
|
||||
conn->OutputQueueLength - conn->OutputGetPointer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ConvertSpaceTonbsp(msg);
|
||||
Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg);
|
||||
}
|
||||
|
||||
|
|
@ -3057,10 +3038,13 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
|
|||
|
||||
const char * auth_header = "Authorization: Bearer ";
|
||||
char * token_begin = strstr(MsgPtr, auth_header);
|
||||
int Flags = 0;
|
||||
int Flags = 0, n;
|
||||
|
||||
// Node Flags isn't currently used
|
||||
|
||||
char * Tok;
|
||||
char * param;
|
||||
|
||||
if (token_begin)
|
||||
{
|
||||
// Using Auth Header
|
||||
|
|
|
|||
347
BBSUtilities.c
347
BBSUtilities.c
|
|
@ -28,10 +28,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
|
||||
|
||||
BOOL Bells;
|
||||
BOOL FlashOnBell; // Flash instead of Beep
|
||||
|
|
@ -55,8 +51,6 @@ extern struct ConsoleInfo BBSConsole;
|
|||
|
||||
extern char LOC[7];
|
||||
|
||||
extern BOOL MQTT;
|
||||
|
||||
//#define BBSIDLETIME 120
|
||||
//#define USERIDLETIME 300
|
||||
|
||||
|
|
@ -69,10 +63,6 @@ extern BPQVECSTRUC ** BPQHOSTVECPTR;
|
|||
UCHAR * GetLogDirectory();
|
||||
DllExport int APIENTRY SessionStateNoAck(int stream, int * state);
|
||||
int RefreshWebMailIndex();
|
||||
struct PORTCONTROL * GetPortTableEntryFromSlot(int portslot);
|
||||
int GetPortHardwareType(struct PORTCONTROL *PORT);
|
||||
int GetNumberofPorts();
|
||||
|
||||
#else
|
||||
__declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR;
|
||||
typedef char * (WINAPI FAR *FARPROCZ)();
|
||||
|
|
@ -85,7 +75,7 @@ FARPROCX pRefreshWebMailIndex;
|
|||
Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall);
|
||||
VOID APIENTRY md5 (char *arg, unsigned char * checksum);
|
||||
int APIENTRY GetRaw(int stream, char * msg, int * len, int * count);
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID);
|
||||
void FreeSemaphore(struct SEM * Semaphore);
|
||||
int EncryptPass(char * Pass, char * Encrypt);
|
||||
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
|
||||
|
|
@ -136,7 +126,6 @@ int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compre
|
|||
int APIENTRY ChangeSessionCallsign(int Stream, unsigned char * AXCall);
|
||||
void SendMessageReadEvent(char * call, struct MsgInfo * Msg);
|
||||
void SendNewMessageEvent(char * call, struct MsgInfo * Msg);
|
||||
void MQTTMessageEvent(struct MsgInfo * message);
|
||||
|
||||
config_t cfg;
|
||||
config_setting_t * group;
|
||||
|
|
@ -531,20 +520,7 @@ struct MsgInfo * GetMsgFromNumber(int 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 * User = zalloc(sizeof (struct UserInfo));
|
||||
|
|
@ -2102,7 +2078,6 @@ hold certain types or sizes of messages.
|
|||
|
||||
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.
|
||||
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.
|
||||
|
|
@ -2197,38 +2172,21 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
|
|||
|
||||
while (p)
|
||||
{
|
||||
if (p->Action != 'R' && p->Action != 'A')
|
||||
if (p->Action != 'R')
|
||||
goto Continue;
|
||||
|
||||
if (p->Type != Type && p->Type != '*')
|
||||
goto Continue;
|
||||
|
||||
// wildcardcompare returns true on a match
|
||||
|
||||
if (wildcardcompare(From, p->From) == 0)
|
||||
goto Continue;
|
||||
|
||||
if (p->TO[0] == '!')
|
||||
{
|
||||
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
|
||||
goto Continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wildcardcompare(ToCopy, p->TO) == 0)
|
||||
goto Continue;
|
||||
}
|
||||
if (wildcardcompare(ToCopy, p->TO) == 0)
|
||||
goto Continue;
|
||||
|
||||
if (ATBBS)
|
||||
{
|
||||
char AtCopy[256];
|
||||
|
||||
strcpy(AtCopy, ATBBS);
|
||||
_strupr(AtCopy);
|
||||
|
||||
if (wildcardcompare(AtCopy, p->AT) == 0)
|
||||
if (wildcardcompare(ATBBS, p->AT) == 0)
|
||||
goto Continue;
|
||||
}
|
||||
|
||||
if (BID)
|
||||
if (wildcardcompare(BID, p->BID) == 0)
|
||||
|
|
@ -2237,11 +2195,6 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
|
|||
if (p->MaxLen && Len < p->MaxLen)
|
||||
goto Continue;
|
||||
|
||||
// if type 'A' matches all rules then accept without checking rest
|
||||
|
||||
if (p->Action == 'A')
|
||||
return FALSE;
|
||||
|
||||
return TRUE; // Hold
|
||||
|
||||
Continue:
|
||||
|
|
@ -2284,7 +2237,6 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
|
|||
{
|
||||
char ** Calls;
|
||||
FBBFilter * p = Filters;
|
||||
char ToCopy[256];
|
||||
|
||||
if (HoldFrom && From)
|
||||
{
|
||||
|
|
@ -2348,9 +2300,6 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
|
|||
|
||||
// check fbb reject.sys type filters
|
||||
|
||||
strcpy(ToCopy, To);
|
||||
_strupr(ToCopy);
|
||||
|
||||
while (p)
|
||||
{
|
||||
if (p->Action != 'H')
|
||||
|
|
@ -2362,16 +2311,9 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
|
|||
if (wildcardcompare(Msg->from, p->From) == 0)
|
||||
goto Continue;
|
||||
|
||||
if (p->TO[0] == '!')
|
||||
{
|
||||
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
|
||||
goto Continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wildcardcompare(ToCopy, p->TO) == 0)
|
||||
goto Continue;
|
||||
}
|
||||
if (wildcardcompare(Msg->to, p->TO) == 0)
|
||||
goto Continue;
|
||||
|
||||
if (wildcardcompare(Msg->via, p->AT) == 0)
|
||||
goto Continue;
|
||||
|
||||
|
|
@ -3439,7 +3381,6 @@ void Flush(CIRCUIT * conn)
|
|||
|
||||
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
|
||||
conn->OutputGetPointer+=len;
|
||||
conn->bytesSent += len;
|
||||
tosend-=len;
|
||||
SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25);
|
||||
FreeSemaphore(&OutputSEM);
|
||||
|
|
@ -3451,7 +3392,6 @@ void Flush(CIRCUIT * conn)
|
|||
}
|
||||
|
||||
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
|
||||
conn->bytesSent += len;
|
||||
|
||||
conn->OutputGetPointer+=len;
|
||||
|
||||
|
|
@ -3512,11 +3452,6 @@ VOID FlagAsKilled(struct MsgInfo * Msg, BOOL SaveDB)
|
|||
if (SaveDB)
|
||||
SaveMessageDatabase();
|
||||
RebuildNNTPList();
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void DoDeliveredCommand(CIRCUIT * conn, struct UserInfo * user, char * Cmd, char * Arg1, char * Context)
|
||||
|
|
@ -3701,10 +3636,10 @@ void DoKillCommand(CIRCUIT * conn, struct UserInfo * user, char * Cmd, char * Ar
|
|||
if (conn->sysop)
|
||||
{
|
||||
if (Arg1)
|
||||
if (KillMessagesFrom(conn, user, Arg1) == 0)
|
||||
if (KillMessagesFrom(conn, user, Arg1) == 0);
|
||||
BBSputs(conn, "No Messages found\r");
|
||||
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4961,10 +4896,6 @@ sendEOM:
|
|||
Msg->datechanged=time(NULL);
|
||||
SaveMessageDatabase();
|
||||
SendMessageReadEvent(user->Call, Msg);
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5269,6 +5200,7 @@ char * CheckToAddress(CIRCUIT * conn, char * Addr)
|
|||
return NewAddr;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WPRecP WP = LookupWP(Addr);
|
||||
|
||||
|
|
@ -5489,18 +5421,7 @@ BOOL DecodeSendParams(CIRCUIT * conn, char * Context, char ** From, char *To, ch
|
|||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -5645,19 +5566,14 @@ BOOL CreateMessage(CIRCUIT * conn, char * From, char * ToCall, char * ATBBS, cha
|
|||
{
|
||||
if (_memicmp(ToCall, "rms:", 4) == 0)
|
||||
{
|
||||
// Could be ampr.org message
|
||||
|
||||
if (!isAMPRMsg(ToCall))
|
||||
if (!FindRMS())
|
||||
{
|
||||
if (!FindRMS())
|
||||
{
|
||||
nodeprintf(conn, "*** Error - Forwarding via RMS is not configured on this BBS\r");
|
||||
return FALSE;
|
||||
}
|
||||
nodeprintf(conn, "*** Error - Forwarding via RMS is not configured on this BBS\r");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
via=strlop(ToCall, ':');
|
||||
_strupr(ToCall);
|
||||
|
||||
}
|
||||
else if (_memicmp(ToCall, "rms/", 4) == 0)
|
||||
{
|
||||
|
|
@ -5873,12 +5789,12 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
|
|||
}
|
||||
else
|
||||
{
|
||||
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
|
||||
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -5896,7 +5812,7 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
|
|||
}
|
||||
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
|
||||
|
||||
|
|
@ -6536,10 +6452,6 @@ nextline:
|
|||
user = LookupCall(Msg->to);
|
||||
|
||||
SendNewMessageEvent(user->Call, Msg);
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
if (EnableUI)
|
||||
#ifdef LINBPQ
|
||||
|
|
@ -6556,7 +6468,7 @@ nextline:
|
|||
{
|
||||
char APRS[128];
|
||||
char Call[16];
|
||||
int SSID = (user->flags >> 28) & 15; // on some platforms this is treated as signed ??
|
||||
int SSID = user->flags >> 28;
|
||||
|
||||
if (SSID)
|
||||
sprintf(Call, "%s-%d", Msg->to, SSID);
|
||||
|
|
@ -6641,6 +6553,8 @@ VOID CreateMessageFile(ConnectionInfo * conn, struct MsgInfo * Msg)
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
VOID SendUnbuffered(int stream, char * msg, int len)
|
||||
{
|
||||
#ifndef LINBPQ
|
||||
|
|
@ -6963,7 +6877,7 @@ int CountMessagestoForward (struct UserInfo * user)
|
|||
if ((Msg->status != 'H') && (Msg->status != 'D') && Msg->type && check_fwd_bit(Msg->fbbs, BBSNumber))
|
||||
{
|
||||
n++;
|
||||
continue; // So we dont count twice if Flag set and NTS MPS
|
||||
continue; // So we dont count twice in Flag set and NTS MPS
|
||||
}
|
||||
|
||||
// if an NTS MPS, also check for any matches
|
||||
|
|
@ -7004,66 +6918,6 @@ int CountMessagestoForward (struct UserInfo * user)
|
|||
return n;
|
||||
}
|
||||
|
||||
int CountBytestoForward (struct UserInfo * user)
|
||||
{
|
||||
// See if any messages are queued for this BBS. If so return total bytes queued
|
||||
|
||||
int m, n=0;
|
||||
struct MsgInfo * Msg;
|
||||
int BBSNumber = user->BBSNumber;
|
||||
int FirstMessage = FirstMessageIndextoForward;
|
||||
|
||||
if ((user->flags & F_NTSMPS))
|
||||
FirstMessage = 1;
|
||||
|
||||
for (m = FirstMessage; m <= NumberofMessages; m++)
|
||||
{
|
||||
Msg=MsgHddrPtr[m];
|
||||
|
||||
if ((Msg->status != 'H') && (Msg->status != 'D') && Msg->type && check_fwd_bit(Msg->fbbs, BBSNumber))
|
||||
{
|
||||
n += Msg->length;
|
||||
continue; // So we dont count twice if Flag set and NTS MPS
|
||||
}
|
||||
|
||||
// if an NTS MPS, also check for any matches
|
||||
|
||||
if (Msg->type == 'T' && (user->flags & F_NTSMPS))
|
||||
{
|
||||
struct BBSForwardingInfo * ForwardingInfo = user->ForwardingInfo;
|
||||
int depth;
|
||||
|
||||
if (Msg->status == 'N' && ForwardingInfo)
|
||||
{
|
||||
depth = CheckBBSToForNTS(Msg, ForwardingInfo);
|
||||
|
||||
if (depth > -1 && Msg->Locked == 0)
|
||||
{
|
||||
n += Msg->length;
|
||||
continue;
|
||||
}
|
||||
depth = CheckBBSAtList(Msg, ForwardingInfo, Msg->via);
|
||||
|
||||
if (depth && Msg->Locked == 0)
|
||||
{
|
||||
n += Msg->length;
|
||||
continue;
|
||||
}
|
||||
|
||||
depth = CheckBBSATListWildCarded(Msg, ForwardingInfo, Msg->via);
|
||||
|
||||
if (depth > -1 && Msg->Locked == 0)
|
||||
{
|
||||
n += Msg->length;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
int ListMessagestoForward(CIRCUIT * conn, struct UserInfo * user)
|
||||
{
|
||||
// See if any messages are queued for this BBS
|
||||
|
|
@ -7367,7 +7221,7 @@ VOID SetupForwardingStruct(struct UserInfo * user)
|
|||
if (ForwardingInfo->ConTimeout == 0)
|
||||
ForwardingInfo->ConTimeout = 120;
|
||||
|
||||
GetStringValue(group, "BBSHA", Temp, 100);
|
||||
GetStringValue(group, "BBSHA", Temp);
|
||||
|
||||
if (Temp[0])
|
||||
ForwardingInfo->BBSHA = _strdup(Temp);
|
||||
|
|
@ -9079,10 +8933,6 @@ CheckForSID:
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#ifndef LINBPQ
|
||||
extern FARPROCX pGetPortHardwareType;
|
||||
#endif
|
||||
|
||||
VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
|
||||
{
|
||||
ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME); // Default Idletime for BBS Sessions
|
||||
|
|
@ -9139,44 +8989,10 @@ 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
|
||||
|
||||
// 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;
|
||||
}
|
||||
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
|
||||
|
||||
conn->OpenBCM = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (_memicmp(SID, "PMS-3.2", 7) == 0)
|
||||
{
|
||||
// Paccom TNC that doesn't send newline prompt ater receiving subject
|
||||
|
|
@ -10239,20 +10055,15 @@ int GetIntValueWithDefault(config_setting_t * group, char * name, int Default)
|
|||
}
|
||||
|
||||
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value)
|
||||
{
|
||||
char * str;
|
||||
const char * str;
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_get_member (group, name);
|
||||
if (setting)
|
||||
{
|
||||
str = (char *)config_setting_get_string (setting);
|
||||
if (strlen(str) > maxlen)
|
||||
{
|
||||
Debugprintf("Suspect config record %s", str);
|
||||
str[maxlen] = 0;
|
||||
}
|
||||
str = config_setting_get_string (setting);
|
||||
strcpy(value, str);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -10265,6 +10076,7 @@ BOOL GetConfig(char * ConfigName)
|
|||
int i;
|
||||
char Size[80];
|
||||
config_setting_t *setting;
|
||||
const char * ptr;
|
||||
char * ptr1;
|
||||
char FBBString[8192]= "";
|
||||
FBBFilter f;
|
||||
|
|
@ -10329,24 +10141,25 @@ BOOL GetConfig(char * ConfigName)
|
|||
|
||||
Localtime = GetIntValue(group, "Localtime");
|
||||
AliasText = GetMultiStringValue(group, "FWDAliases");
|
||||
GetStringValue(group, "BBSName", BBSName, 100);
|
||||
GetStringValue(group, "MailForText", MailForText, 100);
|
||||
GetStringValue(group, "SYSOPCall", SYSOPCall, 100);
|
||||
GetStringValue(group, "H-Route", HRoute, 100);
|
||||
GetStringValue(group, "AMPRDomain", AMPRDomain, 100);
|
||||
GetStringValue(group, "BBSName", BBSName);
|
||||
GetStringValue(group, "MailForText", MailForText);
|
||||
GetStringValue(group, "SYSOPCall", SYSOPCall);
|
||||
GetStringValue(group, "H-Route", HRoute);
|
||||
GetStringValue(group, "AMPRDomain", AMPRDomain);
|
||||
SendAMPRDirect = GetIntValue(group, "SendAMPRDirect");
|
||||
ISP_Gateway_Enabled = GetIntValue(group, "SMTPGatewayEnabled");
|
||||
ISPPOP3Interval = GetIntValue(group, "POP3PollingInterval");
|
||||
GetStringValue(group, "MyDomain", MyDomain, 50);
|
||||
GetStringValue(group, "ISPSMTPName", ISPSMTPName, 50);
|
||||
GetStringValue(group, "ISPPOP3Name", ISPPOP3Name, 50);
|
||||
GetStringValue(group, "MyDomain", MyDomain);
|
||||
GetStringValue(group, "ISPSMTPName", ISPSMTPName);
|
||||
GetStringValue(group, "ISPPOP3Name", ISPPOP3Name);
|
||||
ISPSMTPPort = GetIntValue(group, "ISPSMTPPort");
|
||||
ISPPOP3Port = GetIntValue(group, "ISPPOP3Port");
|
||||
GetStringValue(group, "ISPAccountName", ISPAccountName, 50);
|
||||
GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
|
||||
GetStringValue(group, "ISPAccountName", ISPAccountName);
|
||||
GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass);
|
||||
GetStringValue(group, "ISPAccountName", ISPAccountName);
|
||||
|
||||
sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default
|
||||
GetStringValue(group, "SignoffMsg", SignoffMsg, 50);
|
||||
GetStringValue(group, "SignoffMsg", SignoffMsg);
|
||||
|
||||
DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
|
||||
|
||||
|
|
@ -10358,10 +10171,10 @@ BOOL GetConfig(char * ConfigName)
|
|||
|
||||
#ifndef LINBPQ
|
||||
|
||||
GetStringValue(group, "MonitorSize", Size, sizeof(Size));
|
||||
GetStringValue(group, "MonitorSize", Size);
|
||||
sscanf(Size,"%d,%d,%d,%d,%d",&MonitorRect.left,&MonitorRect.right,&MonitorRect.top,&MonitorRect.bottom,&OpenMon);
|
||||
|
||||
GetStringValue(group, "WindowSize", Size, sizeof(Size));
|
||||
GetStringValue(group, "WindowSize", Size);
|
||||
sscanf(Size,"%d,%d,%d,%d",&MainRect.left,&MainRect.right,&MainRect.top,&MainRect.bottom);
|
||||
|
||||
Bells = GetIntValue(group, "Bells");
|
||||
|
|
@ -10374,7 +10187,7 @@ BOOL GetConfig(char * ConfigName)
|
|||
WrapInput = GetIntValue(group, "WrapInput");
|
||||
FlashOnConnect = GetIntValue(group, "FlashOnConnect");
|
||||
|
||||
GetStringValue(group, "ConsoleSize", Size, 80);
|
||||
GetStringValue(group, "ConsoleSize", Size);
|
||||
sscanf(Size,"%d,%d,%d,%d,%d", &ConsoleRect.left, &ConsoleRect.right,
|
||||
&ConsoleRect.top, &ConsoleRect.bottom,&OpenConsole);
|
||||
|
||||
|
|
@ -10386,7 +10199,8 @@ BOOL GetConfig(char * ConfigName)
|
|||
|
||||
if (setting && setting->value.sval[0])
|
||||
{
|
||||
WelcomeMsg = _strdup(config_setting_get_string (setting));
|
||||
ptr = config_setting_get_string (setting);
|
||||
WelcomeMsg = _strdup(ptr);
|
||||
}
|
||||
else
|
||||
WelcomeMsg = _strdup("Hello $I. Latest Message is $L, Last listed is $Z\r\n");
|
||||
|
|
@ -10395,7 +10209,10 @@ BOOL GetConfig(char * ConfigName)
|
|||
setting = config_setting_get_member (group, "NewUserWelcomeMsg");
|
||||
|
||||
if (setting && setting->value.sval[0])
|
||||
NewWelcomeMsg = _strdup(config_setting_get_string (setting));
|
||||
{
|
||||
ptr = config_setting_get_string (setting);
|
||||
NewWelcomeMsg = _strdup(ptr);
|
||||
}
|
||||
else
|
||||
NewWelcomeMsg = _strdup("Hello $I. Latest Message is $L, Last listed is $Z\r\n");
|
||||
|
||||
|
|
@ -10403,7 +10220,10 @@ BOOL GetConfig(char * ConfigName)
|
|||
setting = config_setting_get_member (group, "ExpertWelcomeMsg");
|
||||
|
||||
if (setting && setting->value.sval[0])
|
||||
ExpertWelcomeMsg = _strdup(config_setting_get_string (setting));
|
||||
{
|
||||
ptr = config_setting_get_string (setting);
|
||||
ExpertWelcomeMsg = _strdup(ptr);
|
||||
}
|
||||
else
|
||||
ExpertWelcomeMsg = _strdup("");
|
||||
|
||||
|
|
@ -10412,7 +10232,10 @@ BOOL GetConfig(char * ConfigName)
|
|||
setting = config_setting_get_member (group, "Prompt");
|
||||
|
||||
if (setting && setting->value.sval[0])
|
||||
Prompt = _strdup(config_setting_get_string (setting));
|
||||
{
|
||||
ptr = config_setting_get_string (setting);
|
||||
Prompt = _strdup(ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
Prompt = malloc(20);
|
||||
|
|
@ -10422,7 +10245,10 @@ BOOL GetConfig(char * ConfigName)
|
|||
setting = config_setting_get_member (group, "NewUserPrompt");
|
||||
|
||||
if (setting && setting->value.sval[0])
|
||||
NewPrompt = _strdup(config_setting_get_string (setting));
|
||||
{
|
||||
ptr = config_setting_get_string (setting);
|
||||
NewPrompt = _strdup(ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
NewPrompt = malloc(20);
|
||||
|
|
@ -10432,7 +10258,10 @@ BOOL GetConfig(char * ConfigName)
|
|||
setting = config_setting_get_member (group, "ExpertPrompt");
|
||||
|
||||
if (setting && setting->value.sval[0])
|
||||
ExpertPrompt = _strdup(config_setting_get_string (setting));
|
||||
{
|
||||
ptr = config_setting_get_string (setting);
|
||||
ExpertPrompt = _strdup(ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
ExpertPrompt = malloc(20);
|
||||
|
|
@ -10453,7 +10282,7 @@ BOOL GetConfig(char * ConfigName)
|
|||
|
||||
// Get FBB Filters
|
||||
|
||||
GetStringValue(group, "FBBFilters", FBBString, sizeof(FBBString));
|
||||
GetStringValue(group, "FBBFilters", FBBString);
|
||||
|
||||
ptr1 = FBBString;
|
||||
|
||||
|
|
@ -10539,8 +10368,8 @@ BOOL GetConfig(char * ConfigName)
|
|||
SendWP = GetIntValue(group, "SendWP");
|
||||
SendWPType = GetIntValue(group, "SendWPType");
|
||||
|
||||
GetStringValue(group, "SendWPTO", SendWPTO, sizeof(SendWPTO));
|
||||
GetStringValue(group, "SendWPVIA", SendWPVIA, sizeof(SendWPVIA));
|
||||
GetStringValue(group, "SendWPTO", SendWPTO);
|
||||
GetStringValue(group, "SendWPVIA", SendWPVIA);
|
||||
|
||||
SendWPAddrs = GetMultiStringValue(group, "SendWPAddrs");
|
||||
|
||||
|
|
@ -10570,7 +10399,7 @@ BOOL GetConfig(char * ConfigName)
|
|||
SendWPVIA[0] = 0;
|
||||
}
|
||||
|
||||
GetStringValue(group, "Version", Size, sizeof(Size));
|
||||
GetStringValue(group, "Version", Size);
|
||||
sscanf(Size,"%d,%d,%d,%d", &LastVer[0], &LastVer[1], &LastVer[2], &LastVer[3]);
|
||||
|
||||
for (i =1 ; i <= GetNumberofPorts(); i++)
|
||||
|
|
@ -10588,7 +10417,7 @@ BOOL GetConfig(char * ConfigName)
|
|||
UIHDDR[i] = GetIntValueWithDefault(group, "SendHDDR", UIEnabled[i]);
|
||||
UINull[i] = GetIntValue(group, "SendNull");
|
||||
Size[0] = 0;
|
||||
GetStringValue(group, "Digis", Size, sizeof(Size));
|
||||
GetStringValue(group, "Digis", Size);
|
||||
if (Size[0])
|
||||
UIDigi[i] = _strdup(Size);
|
||||
}
|
||||
|
|
@ -10651,9 +10480,9 @@ int Connected(int Stream)
|
|||
char callsign[10];
|
||||
int port, paclen, maxframe, l4window;
|
||||
char ConnectedMsg[] = "*** CONNECTED ";
|
||||
char Msg[256];
|
||||
char Msg[100];
|
||||
char Title[100];
|
||||
int64_t Freq = 0;
|
||||
int Freq = 0;
|
||||
int Mode = 0;
|
||||
BPQVECSTRUC * SESS;
|
||||
TRANSPORTENTRY * Sess1 = NULL, * Sess2;
|
||||
|
|
@ -10734,13 +10563,7 @@ 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
|
||||
conn->Active = TRUE;
|
||||
conn->BPQStream = Stream;
|
||||
|
|
@ -10805,7 +10628,7 @@ int Connected(int Stream)
|
|||
LongFreq = GetPortFrequency(port, FreqString);
|
||||
#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);
|
||||
|
||||
|
|
@ -10865,10 +10688,10 @@ int Connected(int Stream)
|
|||
}
|
||||
|
||||
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]);
|
||||
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)
|
||||
|
||||
|
|
@ -11158,6 +10981,7 @@ int DoReceivedData(int Stream)
|
|||
if (Stream == conn->BPQStream)
|
||||
{
|
||||
conn->SIDResponseTimer = 0; // Got a message, so cancel timeout.
|
||||
|
||||
do
|
||||
{
|
||||
// May have several messages per packet, or message split over packets
|
||||
|
|
@ -11174,7 +10998,6 @@ int DoReceivedData(int Stream)
|
|||
if (InputLen == 0 && conn->InputMode != 'Y')
|
||||
return 0;
|
||||
|
||||
conn->bytesRxed += InputLen;
|
||||
conn->InputLen += InputLen;
|
||||
|
||||
if (conn->InputLen == 0) return 0;
|
||||
|
|
@ -11893,11 +11716,6 @@ VOID ProcessTextFwdLine(ConnectionInfo * conn, struct UserInfo * user, char * Bu
|
|||
|
||||
SaveMessageDatabase();
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(conn->FwdMsg);
|
||||
#endif
|
||||
|
||||
conn->UserPointer->ForwardingInfo->MsgCount--;
|
||||
|
||||
// See if any more to forward
|
||||
|
|
@ -13395,7 +13213,7 @@ int DeleteRedundantMessages()
|
|||
{
|
||||
while(n--)
|
||||
{
|
||||
if (stat(namelist[n]->d_name, &STAT) == 0)
|
||||
if (stat(namelist[n]->d_name, &STAT) == 0);
|
||||
{
|
||||
Msgno = atoi(&namelist[n]->d_name[2]);
|
||||
|
||||
|
|
@ -16005,11 +15823,6 @@ void SendMessageReadEvent(char * call, struct MsgInfo * Msg)
|
|||
}
|
||||
}
|
||||
|
||||
void SendMessageForwardedToM0LTE(char * call, struct MsgInfo * Msg)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SendNewMessageEvent(char * call, struct MsgInfo * Msg)
|
||||
{
|
||||
if (reportMailEvents)
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ BEGIN
|
|||
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 separared 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 seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
|
||||
IDC_STATIC,9,52,355,24
|
||||
END
|
||||
|
||||
|
|
|
|||
BIN
BPQMail.aps
BIN
BPQMail.aps
Binary file not shown.
53
BPQMail.c
53
BPQMail.c
|
|
@ -1143,19 +1143,6 @@
|
|||
// Semaphore calls to SaveConfig
|
||||
// Include SERVIC as valid from call (for Winlink Service messages) (49)
|
||||
// Attempt to detect line draw characters in Webmail (50)
|
||||
// Fix sending ampr.org mail when RMS is not enabled (51)
|
||||
// Send forwarding info to packetnodes.spots.radio database (51)
|
||||
// Fix bug in WP Message processing (56)
|
||||
// Fix treating addresses ending in WW as Internet (57)
|
||||
// Run sending to packetnodes.spots.radio in a separate thread (61)
|
||||
// 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 "winstdint.h"
|
||||
|
|
@ -1174,9 +1161,6 @@ FARPROCZ pGetLOC;
|
|||
FARPROCX pRefreshWebMailIndex;
|
||||
FARPROCX pRunEventProgram;
|
||||
FARPROCX pGetPortFrequency;
|
||||
FARPROCX pSendWebRequest;
|
||||
FARPROCX pGetLatLon;
|
||||
FARPROCX pGetPortHardwareType;
|
||||
|
||||
BOOL WINE = FALSE;
|
||||
|
||||
|
|
@ -1401,7 +1385,6 @@ char * CheckToAddress(CIRCUIT * conn, char * Addr);
|
|||
BOOL CheckifPacket(char * Via);
|
||||
int GetHTMLForms();
|
||||
VOID GetPGConfig();
|
||||
void SendBBSDataToPktMap();
|
||||
|
||||
struct _EXCEPTION_POINTERS exinfox;
|
||||
|
||||
|
|
@ -1548,11 +1531,7 @@ VOID WriteMiniDump()
|
|||
}
|
||||
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID)
|
||||
{
|
||||
//
|
||||
// Wait for it to be free
|
||||
|
|
@ -1733,7 +1712,6 @@ int APIENTRY WinMain(HINSTANCE hInstance,
|
|||
// SaveUserDatabase();
|
||||
SaveMessageDatabase();
|
||||
SaveBIDDatabase();
|
||||
SaveRestartData();
|
||||
|
||||
configSaved = 1;
|
||||
SaveConfig(ConfigName);
|
||||
|
|
@ -1958,10 +1936,6 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
|||
pRefreshWebMailIndex = GetProcAddress(ExtDriver,"_RefreshWebMailIndex@0");
|
||||
pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8");
|
||||
pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8");
|
||||
pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16");
|
||||
pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8");
|
||||
pGetPortHardwareType = GetProcAddress(ExtDriver,"_GetPortHardwareType@4");
|
||||
|
||||
|
||||
|
||||
if (pGetLOC)
|
||||
|
|
@ -2209,13 +2183,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
Debugprintf("|Enter HouseKeeping");
|
||||
DoHouseKeeping(FALSE);
|
||||
}
|
||||
|
||||
if (APIClock < NOW)
|
||||
{
|
||||
SendBBSDataToPktMap();
|
||||
APIClock = NOW + 7200; // Every 2 hours
|
||||
}
|
||||
|
||||
tm = gmtime(&NOW);
|
||||
|
||||
if (tm->tm_wday == 0) // Sunday
|
||||
|
|
@ -2849,12 +2816,6 @@ gotAddr:
|
|||
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -3032,9 +2993,9 @@ int RefreshMainWindow()
|
|||
strcpy(msg,"Logging in");
|
||||
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,
|
||||
"BBS", conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed);
|
||||
"BBS", conn->OutputQueueLength - conn->OutputGetPointer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3095,7 +3056,7 @@ static PSOCKADDR_IN psin;
|
|||
|
||||
SOCKET sock;
|
||||
|
||||
void GetRestartData();
|
||||
|
||||
|
||||
BOOL Initialise()
|
||||
{
|
||||
|
|
@ -3111,8 +3072,6 @@ BOOL Initialise()
|
|||
|
||||
GetTimeZoneInformation(&TimeZoneInformation);
|
||||
|
||||
Debugprintf("%d", sizeof(struct MsgInfo));
|
||||
|
||||
_tzset();
|
||||
_MYTIMEZONE = timezone;
|
||||
_MYTIMEZONE = TimeZoneInformation.Bias * 60;
|
||||
|
|
@ -3283,8 +3242,6 @@ BOOL Initialise()
|
|||
GetBadWordFile();
|
||||
GetHTMLForms();
|
||||
|
||||
GetRestartData();
|
||||
|
||||
UsingingRegConfig = FALSE;
|
||||
|
||||
// Make sure SYSOPCALL is set
|
||||
|
|
@ -3426,8 +3383,6 @@ BOOL Initialise()
|
|||
CreatePipeThread();
|
||||
GetPGConfig();
|
||||
|
||||
APIClock = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
1090
BPQMail.rc
1090
BPQMail.rc
File diff suppressed because it is too large
Load diff
36
BPQNRR.c
36
BPQNRR.c
|
|
@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
//#include "vmm.h"
|
||||
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
|
||||
extern int SENDNETFRAME();
|
||||
|
|
@ -45,8 +45,6 @@ extern VOID Q_ADD();
|
|||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
|
||||
TRANSPORTENTRY * NRRSession;
|
||||
int NRRID = 1; // Id to correlate requests and responses
|
||||
|
||||
|
||||
/*
|
||||
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 * ptr1;
|
||||
struct _MESSAGE * Msg1;
|
||||
time_t Now = time(NULL);
|
||||
int ID = (Msg->L4TXNO << 8) | Msg->L4RXNO;
|
||||
struct _MESSAGE * Msg;
|
||||
|
||||
if (BUFFER == NULL)
|
||||
return;
|
||||
|
|
@ -88,18 +84,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
|
|||
|
||||
*ptr1++ = 0xf0; // PID
|
||||
|
||||
|
||||
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));
|
||||
ptr1 += sprintf(ptr1, "NRR Response:");
|
||||
|
||||
Buff += 21 + MSGHDDRLEN;
|
||||
Len -= (21 + MSGHDDRLEN);
|
||||
|
|
@ -112,7 +97,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
|
|||
if ((Buff[7] & 0x80) == 0x80) // Check turnround bit
|
||||
*ptr1++ = '*';
|
||||
|
||||
Buff += 8;
|
||||
Buff+=8;
|
||||
Len -= 8;
|
||||
}
|
||||
|
||||
|
|
@ -126,11 +111,11 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
|
|||
|
||||
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);
|
||||
|
||||
|
|
@ -198,16 +183,11 @@ VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session)
|
|||
Msg->L4ID = 1;
|
||||
Msg->L4INDEX = 0;
|
||||
Msg->L4FLAGS = 0;
|
||||
Msg->L4TXNO = NRRID << 8;
|
||||
Msg->L4RXNO = NRRID & 0xff;
|
||||
|
||||
memcpy(Msg->L4DATA, MYCALL, 7);
|
||||
Msg->L4DATA[7] = Stream + 28;
|
||||
|
||||
Msg->LENGTH = 8 + 21 + MSGHDDRLEN;
|
||||
|
||||
Session->NRRTime = time(NULL);
|
||||
Session->NRRID = NRRID++;
|
||||
|
||||
|
||||
C_Q_ADD(&DEST->DEST_Q, Msg);
|
||||
}
|
||||
|
|
|
|||
12
BPQRemotePTT.cfg
Normal file
12
BPQRemotePTT.cfg
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
main :
|
||||
{
|
||||
BPQHostIP = "192.168.1.64";
|
||||
COM1 = "COM43";
|
||||
COM2 = "";
|
||||
COM3 = "";
|
||||
COM4 = "";
|
||||
HamLibPort1 = 4534;
|
||||
HamLibPort2 = 0;
|
||||
HamLibPort3 = 0;
|
||||
HamLibPort4 = 0;
|
||||
};
|
||||
26
BPQTermMDI.c
26
BPQTermMDI.c
|
|
@ -214,7 +214,7 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
|||
LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
|
||||
|
||||
|
||||
extern struct CMDX COMMANDS[];
|
||||
extern CMDX COMMANDS[];
|
||||
extern int APPL1;
|
||||
|
||||
static HMENU trayMenu;
|
||||
|
|
@ -2973,30 +2973,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#ifndef WIN32
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
|
@ -87,7 +87,7 @@ void CreateMHWindow();
|
|||
int Update_MH_List(struct in_addr ipad, char * call, char proto);
|
||||
|
||||
static BOOL ReadConfigFile(int Port);
|
||||
int ConnecttoAGW(int port);
|
||||
int ConnecttoAGW();
|
||||
int ProcessReceivedData(int bpqport);
|
||||
static int ProcessLine(char * buf, int Port, BOOL CheckPort);
|
||||
|
||||
|
|
|
|||
283
Bpq32.c
283
Bpq32.c
|
|
@ -3,7 +3,7 @@ Copyright 2001-2022 John Wiseman G8BPQ
|
|||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 is free software: you can redistribute it and/or modifyextern int HTTP
|
||||
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.
|
||||
|
|
@ -1086,7 +1086,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
// Add ? and * wildcards to NODES command (74)
|
||||
// Add Port RADIO config parameter (74)
|
||||
|
||||
// Version 6.0.24.1 August 2023
|
||||
// Version 6.0.24.1 August 2024
|
||||
|
||||
// Apply NODES command wildcard to alias as well a call (2)
|
||||
// Add STOPPORT/STARTPORT to VARA Driver (2)
|
||||
|
|
@ -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 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
|
||||
// Add Chat PACLEN config (5)
|
||||
|
|
@ -1234,75 +1234,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
// Add optional ATTACH time limit for VARA (48)
|
||||
// API format fixes (48)
|
||||
// AGWAPI Add protection against accidental connects from a non-agw application (50)
|
||||
// Save MH and NODES every hour (51)
|
||||
// Fix handling long unix device names (now max 250 bytes) (52)
|
||||
// Fix error reporting in api update (53)
|
||||
// Coding changes to remove some compiler warnings (53, 54)
|
||||
// Add MQTT reporting of Mail Events (54)
|
||||
// Fix beaconong on KISSHF ports (55)
|
||||
// Fix MailAPI msgs endpoint
|
||||
// Attempt to fix NC going to wrong application. (57)
|
||||
// Improve ARDOP end of session code (58)
|
||||
// Run M0LTE Map reporting in a separate thread (59/60)
|
||||
// Add RHP support for WhatsPac (59)
|
||||
// Add timestamps to LIS monitor (60)
|
||||
// Fix problem with L4 frames being delivered out of sequence (60)
|
||||
// Add Compression of Netrom connections (62)
|
||||
// Improve handling of Locked Routes (62)
|
||||
// Add L4 RESET (Paula G8PZT's extension to NETROM)
|
||||
// Fix problem using SENDRAW from BPQMail (63)
|
||||
// Fix compatibility with latest ardopcf (64)
|
||||
// Fix bug in RHP socket timeout code (65)
|
||||
// Fix L4 RTT (66)
|
||||
// Fix RigConrol with Chanxx but no other settings (66)
|
||||
// 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)
|
||||
// Fix some issues with NetromX connects and Route Selection when running INP3 and NODES routing (9)
|
||||
// Fix connecting to a netrom node with c p node command (10)
|
||||
// Add validation of INP3 RTT messages and various INP3 fixes (12)
|
||||
// Change NetromX connect syntax to Service@Node to fix passing commands to local applications (12)
|
||||
|
||||
|
||||
#define CKernel
|
||||
|
||||
|
|
@ -1397,8 +1328,6 @@ void * HSMODEMExtInit(EXTPORTDATA * PortEntry);
|
|||
void * FreeDataExtInit(EXTPORTDATA * PortEntry);
|
||||
void * SIXPACKExtInit(EXTPORTDATA * PortEntry);
|
||||
|
||||
VOID RealCloseAllPrograms();
|
||||
|
||||
extern char * ConfigBuffer; // Config Area
|
||||
VOID REMOVENODE(dest_list * DEST);
|
||||
DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
|
||||
|
|
@ -1408,9 +1337,6 @@ VOID ADIFWriteFreqList();
|
|||
void SaveAIS();
|
||||
void initAIS();
|
||||
void initADSB();
|
||||
int CloseAllSessions();
|
||||
int CloseAllLinks();
|
||||
void NETROMTCPResolve();
|
||||
|
||||
extern BOOL ADIFLogEnabled;
|
||||
|
||||
|
|
@ -1418,8 +1344,6 @@ int CloseOnError = 0;
|
|||
|
||||
char UIClassName[]="UIMAINWINDOW"; // the main window class name
|
||||
|
||||
char ClosingClassName[]="CLOSING"; // the main window class name
|
||||
|
||||
HWND UIhWnd;
|
||||
|
||||
extern char AUTOSAVE;
|
||||
|
|
@ -1450,9 +1374,6 @@ extern struct _LINKTABLE * LINKS;
|
|||
extern int LINK_TABLE_LEN;
|
||||
extern int MAXLINKS;
|
||||
|
||||
extern double LatFromLOC;
|
||||
extern double LonFromLOC;
|
||||
|
||||
|
||||
extern int BPQHOSTAPI();
|
||||
extern int INITIALISEPORTS();
|
||||
|
|
@ -1471,8 +1392,7 @@ extern char MYCALL[]; // 7 chars, ax.25 format
|
|||
extern HWND hIPResWnd;
|
||||
extern BOOL IPMinimized;
|
||||
|
||||
extern int NODESINPROGRESS;
|
||||
extern int NODESToOnePort;
|
||||
extern int NODESINPROGRESS;
|
||||
extern VOID * CURRENTNODE;
|
||||
|
||||
|
||||
|
|
@ -1542,6 +1462,7 @@ extern char ReportDest[7];
|
|||
|
||||
extern UCHAR ConfigDirectory[260];
|
||||
|
||||
extern uint64_t timeLoadedMS;
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
VOID __cdecl Consoleprintf(const char * format, ...);
|
||||
|
|
@ -1571,7 +1492,6 @@ VOID APRSClose();
|
|||
VOID CloseTNCEmulator();
|
||||
|
||||
VOID Poll_AGW();
|
||||
void RHPPoll();
|
||||
BOOL AGWAPIInit();
|
||||
int AGWAPITerminate();
|
||||
|
||||
|
|
@ -1590,9 +1510,7 @@ UINT Sem_edx = 0;
|
|||
UINT Sem_esi = 0;
|
||||
UINT Sem_edi = 0;
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID);
|
||||
void FreeSemaphore(struct SEM * Semaphore);
|
||||
|
||||
DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI;
|
||||
|
|
@ -1659,8 +1577,6 @@ BOOL IGateEnabled = TRUE;
|
|||
extern int ISDelayTimer; // Time before trying to reopen APRS-IS link
|
||||
extern int ISPort;
|
||||
|
||||
int CLOSING = 0;
|
||||
|
||||
UINT * WINMORTraceQ = NULL;
|
||||
UINT * SetWindowTextQ = NULL;
|
||||
|
||||
|
|
@ -1716,8 +1632,6 @@ BOOL ReconfigFlag = FALSE;
|
|||
BOOL RigReconfigFlag = FALSE;
|
||||
BOOL APRSReconfigFlag = FALSE;
|
||||
BOOL CloseAllNeeded = FALSE;
|
||||
int CloseAllTimer = 0;
|
||||
|
||||
BOOL NeedWebMailRefresh = FALSE;
|
||||
|
||||
int AttachedPIDList[100] = {0};
|
||||
|
|
@ -1944,8 +1858,8 @@ VOID MonitorThread(int x)
|
|||
{
|
||||
// It is stuck - try to release
|
||||
|
||||
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
|
||||
Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
|
||||
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d",
|
||||
Semaphore.SemProcessID, SemHeldByAPI);
|
||||
|
||||
// Write a minidump
|
||||
|
||||
|
|
@ -2222,8 +2136,6 @@ VOID TimerProcX()
|
|||
|
||||
Start();
|
||||
|
||||
NETROMTCPResolve();
|
||||
|
||||
INITIALISEPORTS(); // Restart Ports
|
||||
|
||||
SetApplPorts();
|
||||
|
|
@ -2368,7 +2280,6 @@ VOID TimerProcX()
|
|||
Poll_AGW();
|
||||
|
||||
DRATSPoll();
|
||||
RHPPoll();
|
||||
|
||||
CheckGuardZone();
|
||||
|
||||
|
|
@ -2401,52 +2312,6 @@ VOID TimerProcX()
|
|||
|
||||
CheckGuardZone();
|
||||
|
||||
if (CloseAllTimer == 50) // First entry
|
||||
{
|
||||
if (CloseAllSessions() == 0)
|
||||
{
|
||||
if (CloseAllLinks() == 0) // No sessions closed so close links now
|
||||
CloseAllTimer = 1; // 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;
|
||||
}
|
||||
|
||||
|
|
@ -2482,7 +2347,7 @@ FirstInit()
|
|||
EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses");
|
||||
}
|
||||
|
||||
srand(time(NULL));
|
||||
timeLoadedMS = GetTickCount();
|
||||
|
||||
INITIALISEPORTS();
|
||||
|
||||
|
|
@ -2638,7 +2503,6 @@ Check_Timer()
|
|||
|
||||
WSAStartup(MAKEWORD(2, 0), &WsaData);
|
||||
|
||||
|
||||
// Load Psapi.dll if possible
|
||||
|
||||
ExtDriver = LoadLibrary("Psapi.dll");
|
||||
|
|
@ -2653,8 +2517,6 @@ Check_Timer()
|
|||
|
||||
Start();
|
||||
|
||||
NETROMTCPResolve();
|
||||
|
||||
INITIALISEPORTS();
|
||||
|
||||
OpenReportingSockets();
|
||||
|
|
@ -2978,8 +2840,6 @@ BOOL APIENTRY DllMain(HANDLE hInst, DWORD ul_reason_being_called, LPVOID lpReser
|
|||
}
|
||||
else
|
||||
{
|
||||
NETROMTCPResolve();
|
||||
|
||||
SetApplPorts();
|
||||
|
||||
GetUIConfig();
|
||||
|
|
@ -3208,7 +3068,7 @@ SkipInit:
|
|||
|
||||
if (AttachedProcesses < 2)
|
||||
{
|
||||
if (AUTOSAVE)
|
||||
if (AUTOSAVE == 1)
|
||||
SaveNodes();
|
||||
if (AUTOSAVEMH)
|
||||
SaveMH();
|
||||
|
|
@ -5976,106 +5836,13 @@ DllExport VOID APIENTRY CreateNewTrayIcon()
|
|||
trayMenu = NULL;
|
||||
}
|
||||
|
||||
void hookNodeClosing(char * Reason);
|
||||
|
||||
BOOL CALLBACK ClosaAllProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
return (INT_PTR)TRUE;
|
||||
|
||||
case WM_CTLCOLORDLG:
|
||||
return (LONG)bgBrush;
|
||||
|
||||
case WM_CTLCOLORSTATIC:
|
||||
{
|
||||
HDC hdcStatic = (HDC)wParam;
|
||||
SetTextColor(hdcStatic, RGB(0, 0, 0));
|
||||
SetBkMode(hdcStatic, TRANSPARENT);
|
||||
|
||||
return (LONG)bgBrush;
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
|
||||
return 0;
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
|
||||
wmId = LOWORD(wParam); // Remember, these are...
|
||||
wmEvent = HIWORD(wParam); // ...different for Win32!
|
||||
|
||||
switch (wmId)
|
||||
{
|
||||
case SC_RESTORE:
|
||||
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
case SC_MINIMIZE:
|
||||
|
||||
if (MinimizetoTray)
|
||||
return ShowWindow(hWnd, SW_HIDE);
|
||||
else
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
case WM_CLOSE:
|
||||
return(DestroyWindow(hWnd));
|
||||
|
||||
default:
|
||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
HWND hwndClosing = NULL; // Window handle of dialog box
|
||||
|
||||
|
||||
DllExport VOID APIENTRY CloseAllPrograms()
|
||||
{
|
||||
WNDCLASS wc;
|
||||
CLOSING = TRUE;
|
||||
// HANDLE hProc;
|
||||
|
||||
// Tell BG to shut when all links are gone or after 5 secs
|
||||
// Close all attached BPQ32 programs
|
||||
|
||||
CloseAllTimer = 50;
|
||||
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = ClosaAllProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(BPQICON) );
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = bgBrush;
|
||||
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = ClosingClassName;
|
||||
|
||||
RegisterClass(&wc);
|
||||
|
||||
hwndClosing = CreateDialog(hInstance, ClosingClassName, NULL, (DLGPROC)ClosaAllProc);
|
||||
ShowWindow(hwndClosing, SW_SHOW);
|
||||
}
|
||||
|
||||
VOID RealCloseAllPrograms()
|
||||
{
|
||||
hookNodeClosing("Shutdown");
|
||||
Sleep(500);
|
||||
|
||||
Closing = 1;
|
||||
Closing = TRUE;
|
||||
|
||||
ShowWindow(FrameWnd, SW_RESTORE);
|
||||
|
||||
|
|
@ -6323,14 +6090,13 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
|
|||
{
|
||||
if (len > 76)
|
||||
{
|
||||
len += sprintf(&RegLine[len], "\\\r\n", RegLine);
|
||||
strcat(RegLine, "\\\r\n");
|
||||
len = sprintf(RegLine, "%s\\\r\n", RegLine);
|
||||
WriteFile(hFile, RegLine, len, &written, NULL);
|
||||
strcpy(RegLine, " ");
|
||||
len = 2;
|
||||
}
|
||||
|
||||
len += sprintf(&RegLine[len], "%02x,", Value[k]);
|
||||
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
|
||||
}
|
||||
RegLine[--len] = 0x0d;
|
||||
RegLine[++len] = 0x0a;
|
||||
|
|
@ -6356,20 +6122,19 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
|
|||
{
|
||||
if (len > 76)
|
||||
{
|
||||
len += sprintf(&RegLine[len], "\\\r\n");
|
||||
len = sprintf(RegLine, "%s\\\r\n", RegLine);
|
||||
WriteFile(hFile, RegLine, len, &written, NULL);
|
||||
strcpy(RegLine, " ");
|
||||
len = 2;
|
||||
}
|
||||
|
||||
len += sprintf(&RegLine[len], "%02x,", Value[k]);
|
||||
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
|
||||
if (len > 76)
|
||||
{
|
||||
len += sprintf(&RegLine[len], "\\\r\n");
|
||||
len = sprintf(RegLine, "%s\\\r\n", RegLine);
|
||||
WriteFile(hFile, RegLine, len, &written, NULL);
|
||||
strcpy(RegLine, " ");
|
||||
}
|
||||
len += sprintf(&RegLine[len], "00,");
|
||||
len = sprintf(RegLine, "%s00,", RegLine);
|
||||
}
|
||||
|
||||
RegLine[--len] = 0x0d;
|
||||
|
|
@ -6856,19 +6621,11 @@ int GetListeningPortsPID(int Port)
|
|||
return 0; // Not found
|
||||
}
|
||||
|
||||
DllExport char * APIENTRY GetLOC()
|
||||
DllExport char * APIENTRY GetLOC()
|
||||
{
|
||||
return LOC;
|
||||
}
|
||||
|
||||
DllExport void APIENTRY GetLatLon(double * lat, double * lon)
|
||||
{
|
||||
*lat = LatFromLOC;
|
||||
*lon = LonFromLOC;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// UZ7HO Dll PTT interface
|
||||
|
||||
// 1 ext_PTT_info
|
||||
|
|
|
|||
|
|
@ -30,9 +30,6 @@ int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BO
|
|||
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
|
||||
int CountBits64(uint64_t in);
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
#define GetBuff() _GetBuff(__FILE__, __LINE__)
|
||||
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
|
||||
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
|
||||
|
|
@ -67,13 +64,13 @@ DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
|
|||
int * port, int * sesstype, int * paclen,
|
||||
int * maxframe, int * l4window);
|
||||
|
||||
#define LIBCONFIG_STATIC
|
||||
#include "libconfig.h"
|
||||
|
||||
int GetIntValue(config_setting_t * group, char * name);
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
|
||||
VOID SaveIntValue(config_setting_t * group, char * name, int value);
|
||||
VOID SaveStringValue(config_setting_t * group, char * name, char * value);
|
||||
struct config_setting_t;
|
||||
|
||||
int GetIntValue(struct config_setting_t * group, char * name);
|
||||
BOOL GetStringValue(struct config_setting_t * group, char * name, char * value);
|
||||
VOID SaveIntValue(struct config_setting_t * group, char * name, int value);
|
||||
VOID SaveStringValue(struct config_setting_t * group, char * name, char * value);
|
||||
|
||||
int EncryptPass(char * Pass, char * Encrypt);
|
||||
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
|
||||
|
|
@ -95,6 +92,7 @@ VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
|
|||
VOID DoTheCommand(TRANSPORTENTRY * Session);
|
||||
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
|
||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
||||
char * FormatUptime(int Uptime);
|
||||
char * strlop(char * buf, char delim);
|
||||
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
|
||||
|
||||
|
|
@ -105,13 +103,13 @@ VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
|
|||
|
||||
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);
|
||||
VOID SENDL4CONNECT(TRANSPORTENTRY * Session, int Service);
|
||||
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
|
||||
|
||||
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
|
||||
int COUNTNODES(struct ROUTE * ROUTE);
|
||||
int COUNTNODES();
|
||||
int DecodeNodeName(char * NodeName, char * ptr);;
|
||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
|
||||
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
|
||||
|
|
@ -158,7 +156,7 @@ Dll int APIENTRY SaveNodes ();
|
|||
|
||||
struct SEM;
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID);
|
||||
void FreeSemaphore(struct SEM * Semaphore);
|
||||
|
||||
void MySetWindowText(HWND hWnd, char * Msg);
|
||||
|
|
@ -202,6 +200,8 @@ int TrytoGuessCode(unsigned char * Char, int Len);
|
|||
#define XID 0xAF
|
||||
#define TEST 0xE3
|
||||
|
||||
#define SUPPORT2point2 1
|
||||
|
||||
// XID Optional Functions
|
||||
|
||||
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
|
||||
|
|
@ -359,7 +359,7 @@ extern char * ConfigBuffer;
|
|||
|
||||
extern char * WL2KReportLine[];
|
||||
|
||||
extern struct CMDX COMMANDS[];
|
||||
extern CMDX COMMANDS[];
|
||||
|
||||
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
|
||||
extern char CMDALIAS[ALIASLEN][NumberofAppls];
|
||||
|
|
@ -398,7 +398,6 @@ extern int REALTIMETICKS;
|
|||
|
||||
extern time_t CurrentSecs;
|
||||
extern time_t lastSlowSecs;
|
||||
extern time_t lastSaveSecs;
|
||||
|
||||
// SNMP Variables
|
||||
|
||||
|
|
@ -436,12 +435,13 @@ extern int MQTT_PORT;
|
|||
extern char MQTT_USER[80];
|
||||
extern char MQTT_PASS[80];
|
||||
|
||||
extern int SUPPORT2point2;
|
||||
|
||||
|
||||
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
|
||||
|
||||
|
||||
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
|
||||
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
|
||||
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
|
||||
|
||||
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
|
||||
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
|
||||
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
|
||||
|
|
@ -33,7 +33,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
char * strlop(char * buf, char delim);
|
||||
|
||||
|
||||
VOID APIENTRY md5 (char *arg, unsigned char * checksum);
|
||||
|
||||
// Implementation of the WinLink password challenge/response protocol
|
||||
|
|
|
|||
|
|
@ -590,7 +590,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
|
|||
{
|
||||
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>"
|
||||
"<td> </td><td> </td><td> </td><td> </td></tr>", i, i);
|
||||
else
|
||||
|
|
@ -600,7 +600,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
|
|||
"", conn->OutputQueueLength - conn->OutputGetPointer);
|
||||
}
|
||||
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>",
|
||||
i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream,
|
||||
|
|
|
|||
|
|
@ -983,30 +983,7 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -39,8 +39,7 @@ VOID __cdecl Logprintf(int LogMode, ChatCIRCUIT * conn, int InOut, const char *
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID)
|
||||
{
|
||||
//
|
||||
// Wait for it to be free
|
||||
|
|
@ -75,9 +74,6 @@ loop1:
|
|||
;
|
||||
}
|
||||
|
||||
Semaphore->Line = Line;
|
||||
strcpy(Semaphore->File, File);
|
||||
|
||||
return;
|
||||
}
|
||||
void FreeSemaphore(struct SEM * Semaphore)
|
||||
|
|
|
|||
247
CommonCode.c
247
CommonCode.c
|
|
@ -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
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
|
@ -31,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
#include "configstructs.h"
|
||||
|
||||
|
|
@ -49,12 +50,6 @@ extern struct CONFIGTABLE xxcfg;
|
|||
|
||||
#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
|
||||
|
||||
extern int ReportTimer;
|
||||
|
|
@ -74,8 +69,7 @@ VOID WriteMiniDump();
|
|||
void printStack(void);
|
||||
char * FormatMH(PMHSTRUC MH, char Format);
|
||||
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
|
||||
void SendDataToPktMap();
|
||||
void NETROMTCPResolve();
|
||||
void SendDataToPktMap(char *Msg);
|
||||
|
||||
extern BOOL LogAllConnects;
|
||||
extern BOOL M0LTEMap;
|
||||
|
|
@ -84,9 +78,6 @@ char * stristr (char *ch1, char *ch2);
|
|||
|
||||
extern VOID * ENDBUFFERPOOL;
|
||||
|
||||
extern int PoolBuilt;
|
||||
|
||||
extern int EnableOARCAPI;
|
||||
|
||||
// Read/Write length field in a buffer header
|
||||
|
||||
|
|
@ -373,7 +364,7 @@ BOK1:
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -386,11 +377,6 @@ BOK1:
|
|||
|
||||
QCOUNT++;
|
||||
|
||||
if (PoolBuilt && QCOUNT > MAXBUFFS)
|
||||
{
|
||||
Debugprintf("Releasebuffer QCOUNT > MAXBUFFS - pointer = %p from %s Line %d", pointer, File, Line);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -488,7 +474,7 @@ int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF)
|
|||
next = Q[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
|
||||
|
||||
|
|
@ -706,7 +692,7 @@ VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer)
|
|||
}
|
||||
|
||||
VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM,
|
||||
VOID TidyCloseProc(struct TNCINFO * TNC, int Stream), VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream), VOID CloseComplete(struct TNCINFO * TNC, int Stream))
|
||||
VOID TidyCloseProc(), VOID ForcedCloseProc(), VOID CloseComplete())
|
||||
{
|
||||
void ** buffptr;
|
||||
|
||||
|
|
@ -736,6 +722,8 @@ VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM
|
|||
|
||||
if (STREAM->Connected || STREAM->Connecting)
|
||||
{
|
||||
char logmsg[120];
|
||||
time_t Duration;
|
||||
|
||||
// Need to do a tidy close
|
||||
|
||||
|
|
@ -928,7 +916,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
|
|||
|
||||
sprintf(Msg, "%d SCANSTOP", TNC->Port);
|
||||
|
||||
Rig_Command((TRANSPORTENTRY *) -1, Msg);
|
||||
Rig_Command( (TRANSPORTENTRY *) -1, Msg);
|
||||
|
||||
UpdateMH(TNC, Call, '+', 'I');
|
||||
}
|
||||
|
|
@ -1032,7 +1020,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
|
|||
char * Config;
|
||||
static char * ptr1, * ptr2;
|
||||
|
||||
BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
|
||||
BOOL ReadConfigFile(int Port, int ProcLine())
|
||||
{
|
||||
char buf[256],errbuf[256];
|
||||
|
||||
|
|
@ -1076,7 +1064,6 @@ BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
|
|||
WritetoConsoleLocal("\n");
|
||||
WritetoConsoleLocal("Bad config record ");
|
||||
WritetoConsoleLocal(errbuf);
|
||||
WritetoConsoleLocal("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1140,11 +1127,6 @@ int CompareNode(struct DEST_LIST ** a, struct DEST_LIST ** b)
|
|||
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)
|
||||
{
|
||||
BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1
|
||||
|
|
@ -1476,21 +1458,7 @@ DllExport int APIENTRY SessionStateNoAck(int stream, int * state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int SendMsgEx(int stream, char * msg, int len, int GetSem);
|
||||
|
||||
int SendMsgNoSem(int stream, char * msg, int len)
|
||||
{
|
||||
return SendMsgEx(stream, msg, len, 0);
|
||||
}
|
||||
|
||||
DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
|
||||
{
|
||||
return SendMsgEx(stream, msg, len, 1);
|
||||
}
|
||||
|
||||
|
||||
int SendMsgEx(int stream, char * msg, int len, int GetSem)
|
||||
{
|
||||
// Send message to stream (BPQHOST Function 2)
|
||||
|
||||
|
|
@ -1513,13 +1481,11 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
|
|||
if (QCOUNT < 50)
|
||||
return 0; // Dont want to run out
|
||||
|
||||
if (GetSem)
|
||||
GetSemaphore(&Semaphore, 10);
|
||||
GetSemaphore(&Semaphore, 10);
|
||||
|
||||
if ((MSG = GetBuff()) == 0)
|
||||
{
|
||||
if (GetSem)
|
||||
FreeSemaphore(&Semaphore);
|
||||
FreeSemaphore(&Semaphore);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1530,8 +1496,7 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
|
|||
|
||||
SENDUIMESSAGE(MSG);
|
||||
ReleaseBuffer(MSG);
|
||||
if (GetSem)
|
||||
FreeSemaphore(&Semaphore);
|
||||
FreeSemaphore(&Semaphore);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1546,15 +1511,13 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
|
|||
if (L4 == 0)
|
||||
return 0;
|
||||
|
||||
if (GetSem)
|
||||
GetSemaphore(&Semaphore, 22);
|
||||
GetSemaphore(&Semaphore, 22);
|
||||
|
||||
SESS->HOSTFLAGS |= 0x80; // SET ALLOCATED BIT
|
||||
|
||||
if (QCOUNT < 40) // PLENTY FREE?
|
||||
{
|
||||
if (GetSem)
|
||||
FreeSemaphore(&Semaphore);
|
||||
FreeSemaphore(&Semaphore);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -1567,16 +1530,14 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
|
|||
if (n > 100)
|
||||
{
|
||||
Debugprintf("Stream %d QCOUNT %d Q Len %d - discarding", stream, QCOUNT, n);
|
||||
if (GetSem)
|
||||
FreeSemaphore(&Semaphore);
|
||||
FreeSemaphore(&Semaphore);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((MSG = GetBuff()) == 0)
|
||||
{
|
||||
if (GetSem)
|
||||
FreeSemaphore(&Semaphore);
|
||||
FreeSemaphore(&Semaphore);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -1603,8 +1564,7 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
|
|||
else
|
||||
C_Q_ADD(&L4->L4RX_Q, MSG);
|
||||
|
||||
if (GetSem)
|
||||
FreeSemaphore(&Semaphore);
|
||||
FreeSemaphore(&Semaphore);
|
||||
return 0;
|
||||
}
|
||||
DllExport int APIENTRY SendRaw(int port, char * msg, int len)
|
||||
|
|
@ -1643,9 +1603,9 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
|
|||
|
||||
MSG->LENGTH = len + MSGHDDRLEN;
|
||||
|
||||
if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF) // PACTOR/WINMOR Style
|
||||
if (PORT->PROTOCOL == 10) // 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 uneless we do APRS over V4 or WINMOR
|
||||
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
|
||||
|
|
@ -2150,16 +2110,7 @@ int CanPortDigi(int Port)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
DllExport int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT)
|
||||
{
|
||||
if (PORT)
|
||||
return PORT->Hardware;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
|
||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
|
||||
{
|
||||
struct PORTCONTROL * PORTVEC = PORTTABLE;
|
||||
|
||||
|
|
@ -2486,7 +2437,7 @@ static struct speed_struct
|
|||
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits)
|
||||
{
|
||||
char Port[256];
|
||||
char buf[512];
|
||||
char buf[100];
|
||||
|
||||
// Linux Version.
|
||||
|
||||
|
|
@ -2716,14 +2667,6 @@ int DoRoutes()
|
|||
{
|
||||
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);
|
||||
Normcall[len]=0;
|
||||
|
||||
|
|
@ -2747,7 +2690,7 @@ int DoRoutes()
|
|||
digis[0] = 0;
|
||||
|
||||
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,
|
||||
Routes->NEIGHBOUR_PORT,
|
||||
Routes->NEIGHBOUR_QUAL, digis,
|
||||
|
|
@ -2755,8 +2698,7 @@ int DoRoutes()
|
|||
Routes->NBOUR_FRACK,
|
||||
Routes->NBOUR_PACLEN,
|
||||
Routes->INP3Node | (Routes->NoKeepAlive << 2),
|
||||
Routes->OtherendsRouteQual,
|
||||
(Routes->NEIGHBOUR_FLAG & LOCKEDBYSYSOP)?'!':' ');
|
||||
Routes->OtherendsRouteQual);
|
||||
|
||||
fputs(line, file);
|
||||
}
|
||||
|
|
@ -3067,7 +3009,19 @@ DllExport int APIENTRY ClearNodes ()
|
|||
|
||||
return (0);
|
||||
}
|
||||
char * FormatUptime(int Uptime)
|
||||
{
|
||||
struct tm * TM;
|
||||
static char UPTime[50];
|
||||
time_t szClock = Uptime * 60;
|
||||
|
||||
TM = gmtime(&szClock);
|
||||
|
||||
sprintf(UPTime, "Uptime (Days Hours Mins) %.2d:%.2d:%.2d\r",
|
||||
TM->tm_yday, TM->tm_hour, TM->tm_min);
|
||||
|
||||
return UPTime;
|
||||
}
|
||||
|
||||
static char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
|
||||
|
|
@ -3321,12 +3275,8 @@ SOCKADDR_IN reportdest = {0};
|
|||
|
||||
SOCKET ReportSocket = 0;
|
||||
|
||||
SOCKET NodeAPISocket = 0 ;
|
||||
|
||||
SOCKADDR_IN Chatreportdest = {0};
|
||||
|
||||
SOCKADDR_IN UDPreportdest = {0};
|
||||
|
||||
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 LOC[7]; // Maidenhead Locator for Reporting
|
||||
|
|
@ -3382,7 +3332,7 @@ VOID SendLocation()
|
|||
SendReportMsg((char *)&AXMSG.DEST, Len + 16);
|
||||
|
||||
if (M0LTEMap)
|
||||
SendDataToPktMap();
|
||||
SendDataToPktMap("");
|
||||
|
||||
return;
|
||||
|
||||
|
|
@ -3390,6 +3340,7 @@ VOID SendLocation()
|
|||
|
||||
|
||||
|
||||
|
||||
VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode)
|
||||
{
|
||||
MESSAGE AXMSG;
|
||||
|
|
@ -3405,8 +3356,7 @@ VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * M
|
|||
// Block includes the Msg Header (7 bytes), Len Does not!
|
||||
|
||||
memcpy(AXPTR->DEST, ReportDest, 7);
|
||||
|
||||
if (TNC && TNC->PortRecord->PORTCONTROL.PORTCALL[0])
|
||||
if (TNC->PortRecord->PORTCONTROL.PORTCALL[0])
|
||||
memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7);
|
||||
else
|
||||
memcpy(AXPTR->ORIGIN, MYCALL, 7);
|
||||
|
|
@ -3566,10 +3516,8 @@ int __sync_lock_test_and_set(int * ptr, int val)
|
|||
#endif // MACBPQ
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID)
|
||||
{
|
||||
//
|
||||
// Wait for it to be free
|
||||
|
|
@ -3613,8 +3561,6 @@ loop1:
|
|||
Semaphore->SemProcessID = GetCurrentProcessId();
|
||||
Semaphore->SemThreadID = GetCurrentThreadId();
|
||||
SemHeldByAPI = ID;
|
||||
Semaphore->Line = Line;
|
||||
strcpy(Semaphore->File, File);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -3682,22 +3628,11 @@ pthread_t ResolveUpdateThreadId = 0;
|
|||
|
||||
char NodeMapServer[80] = "update.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)
|
||||
{
|
||||
struct hostent * HostEnt1;
|
||||
struct hostent * HostEnt2;
|
||||
struct hostent * HostEnt3;
|
||||
|
||||
|
||||
ResolveUpdateThreadId = GetCurrentThreadId();
|
||||
|
||||
|
|
@ -3725,29 +3660,14 @@ VOID ResolveUpdateThread(void * Unused)
|
|||
if (HostEnt2)
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
NETROMTCPResolve();
|
||||
|
||||
if (HostEnt1 && HostEnt2)
|
||||
{
|
||||
Sleep(1000 * 60 * 15);
|
||||
{
|
||||
Sleep(1000 * 60 * 30);
|
||||
continue;
|
||||
}
|
||||
|
||||
Debugprintf("Resolve Failed for update.g8bpq.net or chatmap.g8bpq.net");
|
||||
Sleep(1000 * 60 * 5);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3779,7 +3699,7 @@ VOID OpenReportingSockets()
|
|||
reportdest.sin_port = htons(81);
|
||||
ConvToAX25("DUMMY-1", ReportDest);
|
||||
}
|
||||
|
||||
|
||||
// Set up Chat Report even if no LOCATOR reportdest.sin_family = AF_INET;
|
||||
// Socket must be opened in MailChat Process
|
||||
|
||||
|
|
@ -4265,10 +4185,10 @@ VOID GetUIConfig()
|
|||
|
||||
if (group)
|
||||
{
|
||||
GetStringValue(group, "UIDEST", &UIUIDEST[Port][0], 11);
|
||||
GetStringValue(group, "FileName", &FN[Port][0], 256);
|
||||
GetStringValue(group, "Message", &Message[Port][0], 1000);
|
||||
GetStringValue(group, "Digis", Digis, 100);
|
||||
GetStringValue(group, "UIDEST", &UIUIDEST[Port][0]);
|
||||
GetStringValue(group, "FileName", &FN[Port][0]);
|
||||
GetStringValue(group, "Message", &Message[Port][0]);
|
||||
GetStringValue(group, "Digis", Digis);
|
||||
UIUIDigi[Port] = _strdup(Digis);
|
||||
|
||||
Interval[Port] = GetIntValue(group, "Interval");
|
||||
|
|
@ -4299,21 +4219,15 @@ int GetIntValue(config_setting_t * group, char * name)
|
|||
return 0;
|
||||
}
|
||||
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
|
||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value)
|
||||
{
|
||||
char * str;
|
||||
const char * str;
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_get_member (group, name);
|
||||
if (setting)
|
||||
{
|
||||
str = (char *)config_setting_get_string(setting);
|
||||
|
||||
if (strlen(str) > maxlen)
|
||||
{
|
||||
Debugprintf("Suspect config record %s", str);
|
||||
str[maxlen] = 0;
|
||||
}
|
||||
str = config_setting_get_string (setting);
|
||||
strcpy(value, str);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -4845,14 +4759,13 @@ LRESULT CALLBACK UIWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
|
|||
extern struct DATAMESSAGE * REPLYBUFFER;
|
||||
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
|
||||
|
||||
void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
char FN[250];
|
||||
FILE *hFile;
|
||||
struct stat STAT;
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
char PortList[256] = "";
|
||||
int len = 0;
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
|
|
@ -4894,7 +4807,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
|
|||
*ptr = '\r';
|
||||
|
||||
|
||||
len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER);
|
||||
sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER);
|
||||
}
|
||||
|
||||
PORT = PORT->PORTPOINTER;
|
||||
|
|
@ -4999,7 +4912,7 @@ SOCKET OpenHTTPSock(char * Host)
|
|||
{
|
||||
err = WSAGetLastError();
|
||||
|
||||
Debugprintf("Resolve Failed for %s %d %x", Host, err, err);
|
||||
Debugprintf("Resolve Failed for %s %d %x", "api.winlink.org", err, err);
|
||||
return 0 ; // Resolve failed
|
||||
}
|
||||
|
||||
|
|
@ -5032,7 +4945,7 @@ SOCKET OpenHTTPSock(char * Host)
|
|||
}
|
||||
|
||||
static char HeaderTemplate[] = "POST %s HTTP/1.1\r\n"
|
||||
"Accept: app N B lication/json\r\n"
|
||||
"Accept: application/json\r\n"
|
||||
// "Accept-Encoding: gzip,deflate,gzip, deflate\r\n"
|
||||
"Content-Type: application/json\r\n"
|
||||
"Host: %s:%d\r\n"
|
||||
|
|
@ -5042,24 +4955,14 @@ static char HeaderTemplate[] = "POST %s HTTP/1.1\r\n"
|
|||
"\r\n";
|
||||
|
||||
|
||||
DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params, char * Return)
|
||||
VOID SendWebRequest(SOCKET sock, char * Host, char * Request, char * Params, int Len, char * Return)
|
||||
{
|
||||
SOCKET sock;
|
||||
int InputLen = 0;
|
||||
int inptr = 0;
|
||||
char Buffer[4096];
|
||||
char Header[256];
|
||||
char * ptr, * ptr1;
|
||||
int Sent;
|
||||
int Len = strlen(Params);
|
||||
|
||||
if (M0LTEMap == 0)
|
||||
return;
|
||||
|
||||
sock = OpenHTTPSock(Host);
|
||||
|
||||
if (sock == 0)
|
||||
return;
|
||||
|
||||
#ifdef LINBPQ
|
||||
sprintf(Header, HeaderTemplate, Request, Host, 80, Len, "linbpq/", VersionString, Params);
|
||||
|
|
@ -5073,22 +4976,23 @@ DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params,
|
|||
{
|
||||
int Err = WSAGetLastError();
|
||||
Debugprintf("Error %d from Web Update send()", Err);
|
||||
closesocket(sock);
|
||||
return;
|
||||
}
|
||||
|
||||
while (InputLen != -1)
|
||||
{
|
||||
InputLen = recv(sock, &Buffer[inptr], 4095 - inptr, 0);
|
||||
InputLen = recv(sock, &Buffer[inptr], 4096 - inptr, 0);
|
||||
|
||||
if (InputLen == -1 || InputLen == 0)
|
||||
{
|
||||
int Err = WSAGetLastError();
|
||||
Debugprintf("Error %d from Web Update recv()", Err);
|
||||
closesocket(sock);
|
||||
return;
|
||||
}
|
||||
|
||||
// As we are using a persistant connection, can't look for close. Check
|
||||
// for complete message
|
||||
|
||||
inptr += InputLen;
|
||||
|
||||
Buffer[inptr] = 0;
|
||||
|
|
@ -5127,9 +5031,10 @@ DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params,
|
|||
else
|
||||
{
|
||||
strlop(Buffer, 13);
|
||||
Debugprintf("Map Update Params - %s", Params);
|
||||
|
||||
Debugprintf("Map Update failed - %s", Buffer);
|
||||
}
|
||||
closesocket(sock);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -5140,8 +5045,7 @@ DllExport VOID WINAPI SendWebRequest(char * Host, char * Request, char * Params,
|
|||
if (ptr1)
|
||||
{
|
||||
// Just accept anything until I've sorted things with Lee
|
||||
|
||||
closesocket(sock);
|
||||
Debugprintf("%s", ptr1);
|
||||
Debugprintf("Web Database update ok");
|
||||
return;
|
||||
}
|
||||
|
|
@ -5232,16 +5136,11 @@ skipit:
|
|||
}
|
||||
}
|
||||
|
||||
void SendDataToPktMapThread(void * Param);
|
||||
|
||||
void SendDataToPktMap()
|
||||
void SendDataToPktMap(char *Msg)
|
||||
{
|
||||
_beginthread(SendDataToPktMapThread,2048000,0);
|
||||
}
|
||||
|
||||
void SendDataToPktMapThread(void * Param)
|
||||
{
|
||||
char Return[256] = "";
|
||||
SOCKET sock;
|
||||
char Return[256];
|
||||
char Request[64];
|
||||
char Params[50000];
|
||||
|
||||
|
|
@ -5685,11 +5584,19 @@ void SendDataToPktMapThread(void * Param)
|
|||
}
|
||||
],
|
||||
|
||||
|
||||
|
||||
*/
|
||||
// "contact": "string",
|
||||
// "neighbours": [{"node": "G7TAJ","port": "30"}]
|
||||
|
||||
SendWebRequest("packetnodes.spots.radio", Request, Params, 0);
|
||||
sock = OpenHTTPSock("packetnodes.spots.radio");
|
||||
|
||||
if (sock == 0)
|
||||
return;
|
||||
|
||||
SendWebRequest(sock, "packetnodes.spots.radio", Request, Params, strlen(Params), Return);
|
||||
closesocket(sock);
|
||||
}
|
||||
|
||||
// ="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}";
|
||||
|
|
|
|||
2
DOSAPI.c
2
DOSAPI.c
|
|
@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#include "compatbits.h"
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
extern QCOUNT;
|
||||
extern BPQVECSTRUC BPQHOSTVECTOR[];
|
||||
|
|
|
|||
27
DRATS.c
27
DRATS.c
|
|
@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
#include "telnetserver.h"
|
||||
|
|
@ -168,7 +168,7 @@ int AllocateDRATSStream(struct DRATSSession * Sess)
|
|||
|
||||
if (Stream == 255) return 0;
|
||||
|
||||
if (memcmp(Sess->CallTo, "NODE", 4) == 0)
|
||||
if (memcmp(Sess->CallTo, "NODE", 6) == 0)
|
||||
{
|
||||
// Just connect to command level on switch
|
||||
}
|
||||
|
|
@ -563,24 +563,23 @@ void DRATSConnectionLost(struct ConnectionInfo * sockptr)
|
|||
#define ZEXPORT __stdcall
|
||||
#endif
|
||||
|
||||
#include <zlib.h>
|
||||
#include "zlib.h"
|
||||
|
||||
|
||||
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen)
|
||||
{
|
||||
int ret;
|
||||
z_stream strm;
|
||||
int ret;
|
||||
z_stream strm;
|
||||
|
||||
strm.zalloc = Z_NULL;
|
||||
strm.zfree = Z_NULL;
|
||||
strm.opaque = Z_NULL;
|
||||
strm.avail_in = 0;
|
||||
strm.next_in = Z_NULL;
|
||||
strm.zalloc = Z_NULL;
|
||||
strm.zfree = Z_NULL;
|
||||
strm.opaque = Z_NULL;
|
||||
strm.avail_in = 0;
|
||||
strm.next_in = Z_NULL;
|
||||
|
||||
ret = inflateInit(&strm);
|
||||
|
||||
if (ret != Z_OK)
|
||||
return ret;
|
||||
ret = inflateInit(&strm);
|
||||
if (ret != Z_OK)
|
||||
return ret;
|
||||
|
||||
strm.avail_in = Len;
|
||||
strm.next_in = source;
|
||||
|
|
|
|||
204
FBBRoutines.c
204
FBBRoutines.c
|
|
@ -23,14 +23,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#include "bpqmail.h"
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __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);
|
||||
void MQTTMessageEvent(void* message);
|
||||
|
||||
|
||||
int MaxRXSize = 99999;
|
||||
int MaxTXSize = 99999;
|
||||
|
|
@ -43,130 +37,6 @@ int B2RestartCount = 0;
|
|||
|
||||
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)
|
||||
{
|
||||
// Sends to user and logs
|
||||
|
|
@ -937,11 +807,6 @@ VOID FlagSentMessages(CIRCUIT * conn, struct UserInfo * user)
|
|||
FBBHeader->FwdMsg->datechanged=time(NULL);
|
||||
}
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(FBBHeader->FwdMsg);
|
||||
#endif
|
||||
|
||||
FBBHeader->FwdMsg->Locked = 0; // Unlock
|
||||
conn->UserPointer->ForwardingInfo->MsgCount--;
|
||||
}
|
||||
|
|
@ -1111,12 +976,12 @@ loop:
|
|||
{
|
||||
RestartRec = RestartData[i];
|
||||
|
||||
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
|
||||
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
|
||||
if ((RestartRec->UserPointer == conn->UserPointer)
|
||||
&& (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->MailBufferSize = RestartRec->MailBufferSize;
|
||||
|
||||
|
|
@ -1145,7 +1010,6 @@ loop:
|
|||
RestartData[n] = RestartData[n+1]; // move down all following entries
|
||||
}
|
||||
RestartCount--;
|
||||
SaveRestartData();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1273,7 +1137,6 @@ loop:
|
|||
{
|
||||
#endif
|
||||
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
|
||||
#ifndef LINBPQ
|
||||
}
|
||||
|
|
@ -1973,14 +1836,14 @@ VOID SaveFBBBinary(CIRCUIT * conn)
|
|||
{
|
||||
RestartRec = RestartData[i];
|
||||
|
||||
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
|
||||
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
|
||||
if ((RestartRec->UserPointer == conn->UserPointer)
|
||||
&& (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 (RestartRec->length < conn->TempMsg->length)
|
||||
if (RestartRec->TempMsg->length < conn->TempMsg->length)
|
||||
RestartRec->Count = 0;;
|
||||
|
||||
break;
|
||||
|
|
@ -1997,53 +1860,19 @@ VOID SaveFBBBinary(CIRCUIT * conn)
|
|||
RestartData[RestartCount] = RestartRec;
|
||||
|
||||
FreeSemaphore(&AllocSemaphore);
|
||||
RestartRec->TimeCreated = time(NULL);
|
||||
}
|
||||
|
||||
strcpy(RestartRec->Call, conn->UserPointer->Call);
|
||||
RestartRec->length = conn->TempMsg->length;
|
||||
strcpy(RestartRec->bid, conn->TempMsg->bid);
|
||||
RestartRec->UserPointer = conn->UserPointer;
|
||||
RestartRec->TempMsg = conn->TempMsg;
|
||||
RestartRec->MailBuffer = conn->MailBuffer;
|
||||
RestartRec->MailBufferSize = conn->MailBufferSize;
|
||||
|
||||
len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart",
|
||||
conn->Callsign, conn->TempMsg->length);
|
||||
|
||||
SaveRestartData();
|
||||
|
||||
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)
|
||||
{
|
||||
int i, n;
|
||||
|
|
@ -2057,15 +1886,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
|
|||
{
|
||||
RestartRec = RestartData[i];
|
||||
|
||||
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
|
||||
&& (strcmp(RestartRec->bid, FBBHeader->BID) == 0))
|
||||
if ((RestartRec->UserPointer == conn->UserPointer)
|
||||
&& (strcmp(RestartRec->TempMsg->bid, FBBHeader->BID) == 0))
|
||||
{
|
||||
char Msg[120];
|
||||
int len;
|
||||
|
||||
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",
|
||||
FBBHeader->BID);
|
||||
|
|
@ -2080,16 +1909,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
|
|||
}
|
||||
|
||||
RestartCount--;
|
||||
SaveRestartData();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
return (RestartRec->length);
|
||||
return (RestartRec->TempMsg->length);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
57
FLDigi.c
57
FLDigi.c
|
|
@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
|
||||
extern int (WINAPI FAR *EnumProcessesPtr)();
|
||||
|
|
@ -36,12 +36,6 @@ extern int (WINAPI FAR *EnumProcessesPtr)();
|
|||
|
||||
#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_MINOR 0
|
||||
|
||||
|
|
@ -71,12 +65,12 @@ extern int (WINAPI FAR *GetModuleFileNameExPtr)();
|
|||
;
|
||||
int SemHeldByAPI;
|
||||
|
||||
void ConnecttoFLDigiThread(void * portptr);
|
||||
static void ConnecttoFLDigiThread(void * portptr);
|
||||
|
||||
void CreateMHWindow();
|
||||
int Update_MH_List(struct in_addr ipad, char * call, char proto);
|
||||
|
||||
int ConnecttoFLDigi(int port);
|
||||
static int ConnecttoFLDigi();
|
||||
static int ProcessReceivedData(int bpqport);
|
||||
static int ProcessLine(char * buf, int Port);
|
||||
int KillTNC(struct TNCINFO * TNC);
|
||||
|
|
@ -99,7 +93,6 @@ VOID CheckFLDigiData(struct TNCINFO * TNC);
|
|||
VOID SendPacket(struct TNCINFO * TNC, UCHAR * Msg, int MsgLen);
|
||||
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
|
||||
VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char ParamType);
|
||||
VOID SendXMLCommandInt(struct TNCINFO * TNC, char * Command, int Value, char ParamType);
|
||||
VOID FLSlowTimer(struct TNCINFO * TNC);
|
||||
VOID SendKISSCommand(struct TNCINFO * TNC, char * Msg);
|
||||
|
||||
|
|
@ -108,6 +101,8 @@ VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
|
|||
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
|
||||
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
|
||||
|
||||
char * strlop(char * buf, char delim);
|
||||
|
||||
extern UCHAR BPQDirectory[];
|
||||
|
||||
#define MAXMPSKPORTS 16
|
||||
|
|
@ -544,12 +539,8 @@ pollloop:
|
|||
|
||||
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]))
|
||||
{
|
||||
}
|
||||
|
|
@ -601,7 +592,7 @@ pollloop:
|
|||
}
|
||||
else
|
||||
{
|
||||
SendXMLCommandInt(TNC, "modem.set_carrier", atoi(&buff->L2DATA[5]), 'I');
|
||||
SendXMLCommand(TNC, "modem.set_carrier", (char *)atoi(&buff->L2DATA[5]), 'I');
|
||||
}
|
||||
|
||||
TNC->InternalCmd = TRUE;
|
||||
|
|
@ -825,7 +816,7 @@ pollloop:
|
|||
char outbuff[1000];
|
||||
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);
|
||||
sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr));
|
||||
|
|
@ -1190,6 +1181,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
|
|
@ -1220,7 +1212,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
|
|||
ptr=strchr(TNC->NodeCall, ' ');
|
||||
if (ptr) *(ptr) = 0; // Null Terminate
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI;
|
||||
TNC->Hardware = H_FLDIGI;
|
||||
|
||||
if (TNC->BusyWait == 0)
|
||||
TNC->BusyWait = 10;
|
||||
|
|
@ -1490,14 +1482,14 @@ static int ProcessLine(char * buf, int Port)
|
|||
return (TRUE);
|
||||
}
|
||||
|
||||
int ConnecttoFLDigi(int port)
|
||||
static int ConnecttoFLDigi(int port)
|
||||
{
|
||||
_beginthread(ConnecttoFLDigiThread, 0, (void *)(size_t)port);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VOID ConnecttoFLDigiThread(void * portptr)
|
||||
static VOID ConnecttoFLDigiThread(void * portptr)
|
||||
{
|
||||
int port = (int)(size_t)portptr;
|
||||
char Msg[255];
|
||||
|
|
@ -2588,7 +2580,7 @@ VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, char Channe
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
@ -3205,7 +3197,7 @@ VOID FLReleaseTNC(struct TNCINFO * TNC)
|
|||
else
|
||||
{
|
||||
SendXMLCommand(TNC, "modem.set_by_name", TNC->FLInfo->DefaultMode, 'S');
|
||||
SendXMLCommandInt(TNC, "modem.set_carrier", TNC->FLInfo->DefaultFreq, 'I');
|
||||
SendXMLCommand(TNC, "modem.set_carrier", (char *)TNC->FLInfo->DefaultFreq, 'I');
|
||||
}
|
||||
}
|
||||
// Start Scanner
|
||||
|
|
@ -3903,27 +3895,6 @@ VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char Par
|
|||
return;
|
||||
}
|
||||
|
||||
VOID SendXMLCommandInt(struct TNCINFO * TNC, char * Command, int Value, char ParamType)
|
||||
{
|
||||
int Len;
|
||||
char ReqBuf[512];
|
||||
char SendBuff[512];
|
||||
struct FLINFO * FL = TNC->FLInfo;
|
||||
struct ARQINFO * ARQ = TNC->ARQInfo;
|
||||
char ValueString[256] ="";
|
||||
|
||||
if (!TNC->CONNECTED || TNC->FLInfo->KISSMODE)
|
||||
return;
|
||||
|
||||
sprintf(ValueString, "<params><param><value><i4>%d</i4></value></param></params\r\n>", Value);
|
||||
|
||||
strcpy(FL->LastXML, Command);
|
||||
Len = sprintf(ReqBuf, Req, FL->LastXML, ValueString);
|
||||
Len = sprintf(SendBuff, MsgHddr, Len, ReqBuf);
|
||||
send(TNC->TCPSock, SendBuff, Len, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
VOID SendXMLPoll(struct TNCINFO * TNC)
|
||||
{
|
||||
int Len;
|
||||
|
|
|
|||
72
FreeDATA.c
72
FreeDATA.c
|
|
@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "bpq32.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
|
|
@ -43,11 +43,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
int KillTNC(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 *EnumProcessesPtr)();
|
||||
static int Socket_Data(int sock, int error, int eventcode);
|
||||
|
|
@ -352,6 +347,41 @@ loop:
|
|||
return 1;
|
||||
}
|
||||
|
||||
BOOL FreeDataReadConfigFile(int Port, int ProcLine())
|
||||
{
|
||||
char buf[256],errbuf[256];
|
||||
|
||||
Config = PortConfig[Port];
|
||||
|
||||
if (Config)
|
||||
{
|
||||
// Using config from bpq32.cfg
|
||||
|
||||
if (strlen(Config) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
ptr1 = Config;
|
||||
ptr2 = strchr(ptr1, 13);
|
||||
|
||||
if (!ProcLine(buf, Port))
|
||||
{
|
||||
WritetoConsoleLocal("\n");
|
||||
WritetoConsoleLocal("Bad config record ");
|
||||
WritetoConsoleLocal(errbuf);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf," ** Error - No Configuration info in bpq32.cfg");
|
||||
WritetoConsoleLocal(buf);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
|
||||
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
|
||||
|
|
@ -457,11 +487,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
TNC->lasttime = ltime;
|
||||
ConnecttoFreeData(port);
|
||||
}
|
||||
while (TNC->PortRecord->UI_Q)
|
||||
{
|
||||
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
|
||||
ReleaseBuffer(buffptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -750,10 +775,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
|
||||
{
|
||||
char cmd[56];
|
||||
|
||||
strcpy(cmd, &buff->L2DATA[6]);
|
||||
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
|
||||
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
|
||||
|
||||
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
|
||||
{
|
||||
|
|
@ -845,7 +867,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
char Message[256];
|
||||
int Len, ret;
|
||||
|
||||
Len = sprintf(Message, "%s", TXF);
|
||||
Len = sprintf(Message, TXF);
|
||||
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
|
||||
|
||||
if (buffptr)
|
||||
|
|
@ -1406,14 +1428,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
|
|||
Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FREEDATA;
|
||||
TNC->Hardware = H_FREEDATA;
|
||||
|
||||
TNC->WeStartedTNC = 1;
|
||||
|
||||
TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
|
||||
TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
@ -1859,7 +1881,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
|
|||
if (App < 32)
|
||||
{
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// if SendTandRtoRelay set and Appl is RMS change to RELAY
|
||||
|
|
@ -2220,7 +2242,7 @@ VOID FreeDataProcessNewConnect(struct TNCINFO * TNC, char * fromCall, char * toC
|
|||
if (App < 32)
|
||||
{
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// if SendTandRtoRelay set and Appl is RMS change to RELAY
|
||||
|
|
@ -2454,7 +2476,7 @@ static void SendCQ(struct TNCINFO * TNC)
|
|||
char Message[256];
|
||||
int Len, ret;
|
||||
|
||||
Len = sprintf(Message, "%s", CQ);
|
||||
Len = sprintf(Message, CQ);
|
||||
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
|
||||
}
|
||||
|
||||
|
|
@ -2469,7 +2491,7 @@ static void SendBeacon(struct TNCINFO * TNC, int Interval)
|
|||
if (Interval > 0)
|
||||
Len = sprintf(Message, Template1, Interval);
|
||||
else
|
||||
Len = sprintf(Message, "%s", Template2);
|
||||
Len = sprintf(Message, Template2);
|
||||
|
||||
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
|
||||
}
|
||||
|
|
@ -3660,7 +3682,7 @@ int FreeDataDisconnect(struct TNCINFO * TNC)
|
|||
|
||||
// return FreeDataSendCommand(TNC, "D");
|
||||
|
||||
Len = sprintf(Msg, "%s", Disconnect);
|
||||
Len = sprintf(Msg, Disconnect);
|
||||
|
||||
return send(TNC->TCPDataSock, Msg, Len, 0);
|
||||
}
|
||||
|
|
@ -3672,7 +3694,7 @@ int FreeGetData(struct TNCINFO * TNC)
|
|||
char Msg[128];
|
||||
int Len;
|
||||
|
||||
Len = sprintf(Msg, "%s", GetData);
|
||||
Len = sprintf(Msg, GetData);
|
||||
|
||||
return send(TNC->TCPDataSock, Msg, Len, 0);
|
||||
}
|
||||
|
|
@ -4152,7 +4174,7 @@ void buildParamString(struct TNCINFO * TNC, char * line)
|
|||
FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
|
||||
|
||||
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)
|
||||
strcat(line, " --500hz");
|
||||
|
|
|
|||
10
HALDriver.c
10
HALDriver.c
|
|
@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#include "time.h"
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
|
@ -471,7 +471,7 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
|
|||
int port;
|
||||
char * ptr;
|
||||
int len;
|
||||
char Msg[512];
|
||||
char Msg[80];
|
||||
#ifndef LINBPQ
|
||||
HWND x;
|
||||
#endif
|
||||
|
|
@ -499,15 +499,15 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
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)
|
||||
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
|
||||
|
||||
PortEntry->MAXHOSTMODESESSIONS = 1; // Default
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
{
|
||||
|
|
@ -548,7 +548,7 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
|
|||
TNC->WebWinX = 510;
|
||||
TNC->WebWinY = 280;
|
||||
|
||||
TNC->WEB_COMMSSTATE = zalloc(512);
|
||||
TNC->WEB_COMMSSTATE = zalloc(100);
|
||||
TNC->WEB_TNCSTATE = zalloc(100);
|
||||
strcpy(TNC->WEB_TNCSTATE, "Free");
|
||||
TNC->WEB_MODE = zalloc(100);
|
||||
|
|
|
|||
10
HFCommon.c
10
HFCommon.c
|
|
@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
|
||||
#include "kernelresource.h"
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
#ifndef LINBPQ
|
||||
#include <commctrl.h>
|
||||
|
|
@ -336,8 +336,7 @@ LRESULT CALLBACK PacWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
|
|||
}
|
||||
#endif
|
||||
|
||||
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height,
|
||||
VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream))
|
||||
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc())
|
||||
{
|
||||
#ifdef LINBPQ
|
||||
return FALSE;
|
||||
|
|
@ -1866,6 +1865,9 @@ static char ** SeparateMultiString(char * MultiString)
|
|||
return Value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
extern int nextDummyInterlock;
|
||||
|
||||
int standardParams(struct TNCINFO * TNC, char * buf)
|
||||
|
|
@ -1914,7 +1916,7 @@ int standardParams(struct TNCINFO * TNC, char * buf)
|
|||
TNC->ActiveTXFreq = atof(&buf[13]);
|
||||
else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session
|
||||
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]);
|
||||
else if (_memicmp(buf, "PTTONHEX", 8) == 0)
|
||||
{
|
||||
|
|
|
|||
49
HSMODEM.c
49
HSMODEM.c
|
|
@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#endif
|
||||
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
|
|
@ -309,10 +309,47 @@ loop:
|
|||
return 1;
|
||||
}
|
||||
|
||||
BOOL HSMODEMReadConfigFile(int Port, int ProcLine())
|
||||
{
|
||||
char buf[256],errbuf[256];
|
||||
|
||||
Config = PortConfig[Port];
|
||||
|
||||
if (Config)
|
||||
{
|
||||
// Using config from bpq32.cfg
|
||||
|
||||
if (strlen(Config) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
ptr1 = Config;
|
||||
ptr2 = strchr(ptr1, 13);
|
||||
|
||||
if (!ProcLine(buf, Port))
|
||||
{
|
||||
WritetoConsoleLocal("\n");
|
||||
WritetoConsoleLocal("Bad config record ");
|
||||
WritetoConsoleLocal(errbuf);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(buf," ** Error - No Configuration info in bpq32.cfg");
|
||||
WritetoConsoleLocal(buf);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
|
||||
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
|
||||
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
|
||||
|
||||
|
||||
static time_t ltime;
|
||||
|
||||
|
||||
|
|
@ -648,12 +685,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
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]))
|
||||
{
|
||||
}
|
||||
|
|
@ -1181,9 +1214,9 @@ VOID * HSMODEMExtInit(EXTPORTDATA * PortEntry)
|
|||
Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
|
||||
|
||||
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)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#include "templatedefs.c" // Inline definitions from HTLMPages
|
||||
|
||||
|
|
|
|||
191
HTTPcode.c
191
HTTPcode.c
|
|
@ -24,7 +24,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define DllImport
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "tncinfo.h"
|
||||
|
|
@ -38,7 +38,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#define ZEXPORT __stdcall
|
||||
#endif
|
||||
|
||||
#include <zlib.h>
|
||||
#include "zlib.h"
|
||||
|
||||
#define CKernel
|
||||
#include "httpconnectioninfo.h"
|
||||
|
|
@ -70,9 +70,6 @@ char * GetStandardPage(char * FN, int * Len);
|
|||
BOOL SHA1PasswordHash(char * String, char * Hash);
|
||||
char * byte_base64_encode(char *str, int len);
|
||||
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
|
||||
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
|
||||
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
|
||||
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
|
||||
|
||||
extern struct ROUTE * NEIGHBOURS;
|
||||
extern int ROUTE_LEN;
|
||||
|
|
@ -105,13 +102,10 @@ extern int NumberofPorts;
|
|||
|
||||
extern UCHAR ConfigDirectory[260];
|
||||
|
||||
extern struct AXIPPORTINFO * Portlist[];
|
||||
|
||||
char * strlop(char * buf, char delim);
|
||||
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
|
||||
int CompareNode(const void *a, const void *b);
|
||||
int CompareAlias(const void *a, const void *b);
|
||||
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 ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
|
||||
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>"
|
||||
"<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>"
|
||||
"<table align=center bgcolor=white>"
|
||||
"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
|
||||
|
|
@ -1859,43 +1853,6 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
|
|||
}
|
||||
}
|
||||
|
||||
if (_memicmp(Context, "/rhp/", 5) == 0 || _stricmp(Context, "/rhp") == 0)
|
||||
{
|
||||
{
|
||||
ReplyLen = RHPProcessHTTPMessage(conn, _REPLYBUFFER, Method, Context, MsgPtr, LOCAL, COOKIE);
|
||||
|
||||
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
|
||||
{
|
||||
// Full Message - just send it
|
||||
|
||||
sendandcheck(sock, _REPLYBUFFER, ReplyLen);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (allowDeflate)
|
||||
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
|
||||
else
|
||||
Compressed = _REPLYBUFFER;
|
||||
|
||||
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\n"
|
||||
"Content-Length: %d\r\n"
|
||||
"Content-Type: application/json\r\n"
|
||||
"Connection: close\r\n"
|
||||
"Access-Control-Allow-Origin: *\r\n"
|
||||
"%s\r\n", ReplyLen, Encoding);
|
||||
|
||||
sendandcheck(sock, Header, HeaderLen);
|
||||
sendandcheck(sock, Compressed, ReplyLen);
|
||||
|
||||
if (allowDeflate)
|
||||
free (Compressed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// APRS process internally
|
||||
|
||||
if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0)
|
||||
|
|
@ -2418,10 +2375,7 @@ doHeader:
|
|||
if (Session == 0)
|
||||
Session = &Dummy;
|
||||
|
||||
if (LOCAL)
|
||||
Session->TNC = (struct TNCINFO *)(uintptr_t)1; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
|
||||
else
|
||||
Session->TNC = 0;
|
||||
Session->TNC = LOCAL; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
|
||||
|
||||
WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
|
||||
WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
|
||||
|
|
@ -3798,129 +3752,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)
|
||||
{
|
||||
struct ROUTE * Routes = NEIGHBOURS;
|
||||
int MaxRoutes = MAXNEIGHBOURS;
|
||||
int count, i;
|
||||
int count;
|
||||
char Normcall[10];
|
||||
char locked[4] = " ";
|
||||
char locked;
|
||||
int NodeCount;
|
||||
int Percent = 0;
|
||||
int Iframes, Retries;
|
||||
char Active[10];
|
||||
int Queued;
|
||||
|
||||
int x = 0, n = 0;
|
||||
struct ROUTE * List[1000];
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
Normcall[len]=0;
|
||||
|
||||
if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
|
||||
strcpy(locked, "!");
|
||||
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
|
||||
strcpy(locked, "!!");
|
||||
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
|
||||
strcpy(locked, "!!!");
|
||||
if ((Routes->NEIGHBOUR_FLAG & 1) == 1)
|
||||
locked = '!';
|
||||
else
|
||||
strcpy(locked, " ");
|
||||
locked = ' ';
|
||||
|
||||
NodeCount = COUNTNODES(Routes);
|
||||
|
||||
|
|
@ -4427,7 +4285,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
|
|||
{
|
||||
int ReplyLen = 0;
|
||||
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
|
||||
char * user, * password;
|
||||
char * user, * password, * Key;
|
||||
struct HTTPConnectionInfo * NewSession;
|
||||
int i;
|
||||
struct UserRec * USER;
|
||||
|
|
@ -4476,7 +4334,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
|
|||
|
||||
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 +4697,7 @@ void ProcessWebmailWebSockThread(void * conn)
|
|||
|
||||
Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0);
|
||||
|
||||
if (Sent == -1) // Connecton lost
|
||||
{
|
||||
closesocket(sockptr->socket);
|
||||
free(conn);
|
||||
return;
|
||||
}
|
||||
|
||||
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
|
||||
while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
|
||||
{
|
||||
if (Sent > 0) // something sent
|
||||
{
|
||||
|
|
@ -4892,16 +4743,11 @@ void ProcessWebmailWebSockThread(void * conn)
|
|||
|
||||
CloseHandle(hPipe);
|
||||
|
||||
// ?? do we need a thread to handle write which may block
|
||||
|
||||
Sent = send(sockptr->socket, Reply, ReplyLen, 0);
|
||||
|
||||
if (Sent == -1) // Connecton lost
|
||||
{
|
||||
free(conn);
|
||||
closesocket(sockptr->socket);
|
||||
return;
|
||||
}
|
||||
|
||||
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
|
||||
while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
|
||||
{
|
||||
// Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);
|
||||
|
||||
|
|
@ -5290,3 +5136,6 @@ void SHA1PadMessage(SHA1Context *context)
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
46
HanksRT.c
46
HanksRT.c
|
|
@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
|
||||
#ifdef LINBPQ
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#endif
|
||||
|
||||
#include "bpqchat.h"
|
||||
|
|
@ -426,7 +426,7 @@ VOID ChatExpandAndSendMessage(ChatCIRCUIT * conn, char * Msg, int LOG)
|
|||
|
||||
len = RemoveLF(NewMessage, (int)strlen(NewMessage));
|
||||
|
||||
ChatWriteLogLine(conn, '>', NewMessage, len, LOG_CHAT);
|
||||
ChatWriteLogLine(conn, '>', NewMessage, len, LOG);
|
||||
ChatQueueMsg(conn, NewMessage, len);
|
||||
}
|
||||
|
||||
|
|
@ -1186,7 +1186,7 @@ static BOOL CheckforDups(ChatCIRCUIT * circuit, char * Call, char * Msg)
|
|||
// Duplicate, so discard, but save time
|
||||
|
||||
DupInfo[i].DupTime = Now;
|
||||
Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
|
||||
Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
|
||||
|
||||
return TRUE; // Duplicate
|
||||
}
|
||||
|
|
@ -1229,7 +1229,7 @@ void chkctl(ChatCIRCUIT *ckt_from, char * Buffer, int Len)
|
|||
|
||||
for (i = 1; i < (Len - 1); i++)
|
||||
{
|
||||
if (Buffer[i] < 32 && Buffer[i] != 7) // Accept BELL
|
||||
if (Buffer[i] < 32)
|
||||
{
|
||||
if (Buffer[i] == 9)
|
||||
{
|
||||
|
|
@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
|
|||
__try
|
||||
{
|
||||
#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)
|
||||
{
|
||||
Debugprintf("%s", line);
|
||||
|
|
@ -2821,7 +2821,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
|
|||
CHATNODE *node;
|
||||
LINK *link;
|
||||
char line[1000];
|
||||
int len = 0;
|
||||
int len;
|
||||
CN *cn;
|
||||
|
||||
int i = 0;
|
||||
|
|
@ -2836,16 +2836,16 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
|
|||
nprintf(conn, "%d Node(s)\r", i);
|
||||
|
||||
if (Flag == 'c')
|
||||
len = sprintf(line, "Here %-6.6s <-", OurNode);
|
||||
sprintf(line, "Here %-6.6s <-", OurNode);
|
||||
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)
|
||||
{
|
||||
if (Flag == 'c')
|
||||
len += sprintf(&line[len], " %s", node->call);
|
||||
len = sprintf(line, "%s %s", line, node->call);
|
||||
else
|
||||
len += sprintf(&line[len], " %s", node->alias);
|
||||
len = sprintf(line, "%s %s", line, node->alias);
|
||||
if (len > 80)
|
||||
{
|
||||
nprintf(conn, "%s\r", line);
|
||||
|
|
@ -2873,9 +2873,9 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
|
|||
__try
|
||||
{
|
||||
if (Flag == 'c')
|
||||
len += sprintf(&line[len], " %s", cn->node->call);
|
||||
len = sprintf(line, "%s %s", line, cn->node->call);
|
||||
else
|
||||
len += sprintf(&line[len], " %s", cn->node->alias);
|
||||
len = sprintf(line, "%s %s", line, cn->node->alias);
|
||||
if (len > 80)
|
||||
{
|
||||
nprintf(conn, "%s\r", line);
|
||||
|
|
@ -2883,23 +2883,23 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
|
|||
}
|
||||
}
|
||||
__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
|
||||
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)
|
||||
{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
|
||||
for (cn = circuit->hnode; cn; cn = cn->next)
|
||||
{
|
||||
if (cn->node && cn->node->alias)
|
||||
{
|
||||
if (Flag == 'c')
|
||||
len += sprintf(&line[len], " %s", cn->node->call);
|
||||
len = sprintf(line, "%s %s", line, cn->node->call);
|
||||
else
|
||||
len += sprintf(&line[len], " %s", cn->node->alias);
|
||||
len = sprintf(line, "%s %s", line, cn->node->alias);
|
||||
if (len > 80)
|
||||
{
|
||||
nprintf(conn, "%s\r", line);
|
||||
|
|
@ -2907,7 +2907,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
|
|||
}
|
||||
}
|
||||
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
|
||||
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)
|
||||
break;
|
||||
|
|
@ -4178,10 +4178,10 @@ BOOL GetChatConfig(char * ConfigName)
|
|||
MaxChatStreams = GetIntValue(group, "MaxStreams");
|
||||
reportChatEvents = GetIntValue(group, "reportChatEvents");
|
||||
chatPaclen = GetIntValue(group, "chatPaclen");
|
||||
GetStringValue(group, "OtherChatNodes", OtherNodesList, 1000);
|
||||
GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg, 1000);
|
||||
GetStringValue(group, "MapPosition", Position, 81);
|
||||
GetStringValue(group, "MapPopup", PopupText, 260);
|
||||
GetStringValue(group, "OtherChatNodes", OtherNodesList);
|
||||
GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg);
|
||||
GetStringValue(group, "MapPosition", Position);
|
||||
GetStringValue(group, "MapPopup", PopupText);
|
||||
PopupMode = GetIntValue(group, "PopupMode");
|
||||
|
||||
if (chatPaclen == 0)
|
||||
|
|
|
|||
|
|
@ -21,11 +21,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
//
|
||||
// Housekeeping Module
|
||||
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
|
||||
#include "bpqmail.h"
|
||||
|
||||
char * APIENTRY GetBPQDirectory();
|
||||
|
|
|
|||
30
IPCode.c
30
IPCode.c
|
|
@ -81,7 +81,7 @@ TODo ?Multiple Adapters
|
|||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#include "ipcode.h"
|
||||
|
||||
|
|
@ -95,16 +95,9 @@ TODo ?Multiple Adapters
|
|||
#pragma comment(lib, "IPHLPAPI.lib")
|
||||
#endif
|
||||
|
||||
#include <pcap.h>
|
||||
#include "pcap.h"
|
||||
|
||||
#ifdef WIN32
|
||||
int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
|
||||
#else
|
||||
#ifndef PCAP_API
|
||||
#define PCAP_API extern
|
||||
#endif
|
||||
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
|
||||
#endif
|
||||
|
||||
#ifndef LINBPQ
|
||||
#include "kernelresource.h"
|
||||
|
|
@ -390,7 +383,7 @@ char * FormatIP(uint32_t Addr)
|
|||
return FormatIPWork;
|
||||
}
|
||||
|
||||
int CompareIPRoutes (const VOID * a, const VOID * b)
|
||||
int CompareRoutes (const VOID * a, const VOID * b)
|
||||
{
|
||||
PROUTEENTRY x;
|
||||
PROUTEENTRY y;
|
||||
|
|
@ -4738,7 +4731,7 @@ void OpenTAP()
|
|||
extern struct DATAMESSAGE * REPLYBUFFER;
|
||||
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
|
||||
|
||||
VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// Send ICMP Echo Request
|
||||
|
||||
|
|
@ -4796,7 +4789,7 @@ VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMD
|
|||
return;
|
||||
}
|
||||
|
||||
VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// DISPLAY IP Gateway ARP status or Clear
|
||||
|
||||
|
|
@ -4891,7 +4884,7 @@ VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
|
|||
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
|
||||
}
|
||||
|
||||
VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// DISPLAY IP Gateway ARP status or Clear
|
||||
|
||||
|
|
@ -4950,7 +4943,7 @@ int CountBits(uint32_t in)
|
|||
return n;
|
||||
}
|
||||
|
||||
VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// DISPLAY IP Gateway ARP status or Clear
|
||||
|
||||
|
|
@ -4975,7 +4968,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, str
|
|||
Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
|
||||
|
||||
if (NumberofRoutes)
|
||||
qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareIPRoutes);
|
||||
qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareRoutes);
|
||||
|
||||
for (i=0; i < NumberofRoutes; i++)
|
||||
{
|
||||
|
|
@ -5341,7 +5334,7 @@ int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr)
|
|||
// Should be nothing left
|
||||
}
|
||||
|
||||
if (RequestType == 160)
|
||||
if (RequestType = 160)
|
||||
{
|
||||
int Offset = 255;
|
||||
int PDULen = 0;
|
||||
|
|
@ -5416,8 +5409,11 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
|
|||
int Len;
|
||||
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
|
||||
UCHAR * Msg;
|
||||
int Type;
|
||||
int Length, ComLen;
|
||||
int IntVal;
|
||||
UCHAR Reply[256];
|
||||
int SendLen;
|
||||
int PDULen, SendLen;
|
||||
int Offset = 0;
|
||||
|
||||
Len = ntohs(IPptr->IPLENGTH);
|
||||
|
|
|
|||
217
KAMPactor.c
217
KAMPactor.c
|
|
@ -53,7 +53,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdlib.h>
|
||||
#include "time.h"
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
|
@ -70,8 +70,6 @@ static RECT Rect;
|
|||
|
||||
int DoScanLine(struct TNCINFO * TNC, char * Buff, 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};
|
||||
|
||||
|
|
@ -519,28 +517,6 @@ ok:
|
|||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KAM;
|
||||
TNC->Hardware = H_KAM;
|
||||
|
||||
if (TNC->BusyWait == 0)
|
||||
TNC->BusyWait = 10;
|
||||
|
||||
PortEntry->MAXHOSTMODESESSIONS = 11; // Default
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
@ -619,11 +595,6 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
|
|||
PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort;
|
||||
PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort;
|
||||
|
||||
// TNC->SuspendPortProc = KAMSuspendPort;
|
||||
// TNC->ReleasePortProc = KAMReleasePort;
|
||||
|
||||
|
||||
|
||||
ptr=strchr(TNC->NodeCall, ' ');
|
||||
if (ptr) *(ptr) = 0; // Null Terminate
|
||||
|
||||
|
|
@ -915,39 +886,24 @@ VOID KAMPoll(int Port)
|
|||
calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, TNC->Streams[0].MyCall);
|
||||
TNC->Streams[0].MyCall[calllen] = 0;
|
||||
|
||||
EncodeAndSend(TNC, "X", 1); // ??Return to packet mode??
|
||||
|
||||
if (TNC->VeryOldMode)
|
||||
{
|
||||
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall);
|
||||
EncodeAndSend(TNC, "X", 1); // ??Return to packet mode??
|
||||
if (TNC->VeryOldMode)
|
||||
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall);
|
||||
else
|
||||
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall);
|
||||
EncodeAndSend(TNC, TXMsg, datalen);
|
||||
}
|
||||
else
|
||||
{
|
||||
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall);
|
||||
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);
|
||||
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
|
||||
|
||||
sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
|
||||
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
|
||||
// Stop Scanning
|
||||
|
||||
// Stop Scanning
|
||||
|
||||
sprintf(Msg, "%d SCANSTOP", TNC->Port);
|
||||
sprintf(Msg, "%d SCANSTOP", TNC->Port);
|
||||
|
||||
Rig_Command( (TRANSPORTENTRY *) -1, Msg);
|
||||
Rig_Command( (TRANSPORTENTRY *) -1, Msg);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1080,22 +1036,9 @@ VOID KAMPoll(int Port)
|
|||
UCHAR TXMsg[80] = "D20";
|
||||
|
||||
if (TNC->VeryOldMode)
|
||||
{
|
||||
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall);
|
||||
EncodeAndSend(TNC, TXMsg, datalen);
|
||||
}
|
||||
else
|
||||
{
|
||||
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall);
|
||||
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)
|
||||
|
|
@ -1103,7 +1046,6 @@ VOID KAMPoll(int Port)
|
|||
else
|
||||
EncodeAndSend(TNC, "C20TOR", 6); // Back to Listen
|
||||
|
||||
|
||||
TNC->InternalCmd = 'T';
|
||||
TNC->Timeout = 50;
|
||||
TNC->IntCmdDelay--;
|
||||
|
|
@ -1324,51 +1266,6 @@ VOID KAMPoll(int Port)
|
|||
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 (Stream == 0)
|
||||
|
|
@ -1747,10 +1644,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
WritetoTrace(TNC, Buffer, Len);
|
||||
|
||||
|
||||
// Pass to Appl
|
||||
|
||||
Stream = TNC->CmdStream;
|
||||
|
|
@ -1787,76 +1680,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
|
|||
if (Msg[0] == '?') // Status
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -1967,10 +1790,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
|
|||
if (Msg[1] == '2' && Msg[2] == 'A')
|
||||
TNC->HFPacket = TRUE;
|
||||
|
||||
// Stop other ports in same group
|
||||
|
||||
SuspendOtherPorts(TNC);
|
||||
|
||||
ProcessIncommingConnect(TNC, Call, Stream, TRUE);
|
||||
|
||||
SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
|
||||
|
|
@ -2228,11 +2047,7 @@ VOID ForcedClose(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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
15
KISSHF.c
15
KISSHF.c
|
|
@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
|
||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
|
||||
|
|
@ -350,7 +350,6 @@ ok:
|
|||
|
||||
// See if any frames for this port
|
||||
|
||||
|
||||
STREAM = &TNC->Streams[0];
|
||||
|
||||
if (STREAM->BPQtoPACTOR_Q)
|
||||
|
|
@ -458,12 +457,8 @@ ok:
|
|||
|
||||
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]))
|
||||
{
|
||||
}
|
||||
|
|
@ -730,7 +725,7 @@ VOID KISSHFReleaseTNC(struct TNCINFO * TNC)
|
|||
ReleaseOtherPorts(TNC);
|
||||
}
|
||||
|
||||
VOID KISSHFSuspendPort(struct TNCINFO * TNC, struct TNCINFO * THISTNC)
|
||||
VOID KISSHFSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC)
|
||||
{
|
||||
TNC->PortRecord->PORTCONTROL.PortSuspended = 1;
|
||||
strcpy(TNC->WEB_TNCSTATE, "Interlocked");
|
||||
|
|
@ -813,10 +808,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KISSHF;
|
||||
TNC->Hardware = H_KISSHF;
|
||||
TNC->ARDOPBuffer = malloc(8192);
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
|
|||
|
|
@ -50,19 +50,6 @@ BEGIN
|
|||
LTEXT "Enable IGate",IDC_STATIC,5,2,49,10
|
||||
END
|
||||
|
||||
CLOSING DIALOG DISCARDABLE 300, 300, 200, 50
|
||||
STYLE DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU |
|
||||
WS_THICKFRAME
|
||||
CAPTION "BPQ32 Close All"
|
||||
CLASS "CLOSING"
|
||||
FONT 8, "Fixedsys"
|
||||
BEGIN
|
||||
LTEXT "Closing Links - Please wait....",IDC_BACKGROUND,22,20,337,273
|
||||
|
||||
END
|
||||
|
||||
|
||||
|
||||
CONFIG DIALOGEX 249, 200, 160, 118
|
||||
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION
|
||||
EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE
|
||||
|
|
|
|||
177
L3Code.c
177
L3Code.c
|
|
@ -49,7 +49,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include "stdio.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
VOID UPDATEDESTLIST();
|
||||
|
|
@ -60,12 +60,6 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE);
|
|||
VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall);
|
||||
void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *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 ;;
|
||||
PPORTCONTROL L3CURRENTPORT;
|
||||
|
|
@ -73,8 +67,6 @@ extern dest_list * CURRENTNODE;
|
|||
|
||||
int L3_10SECS = 10;
|
||||
|
||||
extern int PREFERINP3ROUTES;
|
||||
|
||||
|
||||
VOID L3BG()
|
||||
{
|
||||
|
|
@ -100,15 +92,7 @@ VOID L3BG()
|
|||
{
|
||||
ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR;
|
||||
|
||||
// if NetROM over VARA or NetROM over TCP pass direct to the driver
|
||||
|
||||
if (ROUTE && ROUTE->TCPPort)
|
||||
{
|
||||
PL3MESSAGEBUFFER Frame = (PL3MESSAGEBUFFER)Q_REM(&DEST->DEST_Q);
|
||||
TCPNETROMSend(ROUTE, Frame);
|
||||
ReleaseBuffer(Frame);
|
||||
continue;
|
||||
}
|
||||
// if NetROM over VARA pass direct to the driver
|
||||
|
||||
if (ROUTE)
|
||||
{
|
||||
|
|
@ -151,14 +135,12 @@ VOID L3BG()
|
|||
// Drop through to Activate
|
||||
}
|
||||
|
||||
// No Active Route
|
||||
|
||||
if (ACTIVATE_DEST(DEST) == FALSE)
|
||||
{
|
||||
// Node has no routes - get rid of it
|
||||
|
||||
REMOVENODE(DEST);
|
||||
return; // Avoid risk of looking at old entries
|
||||
return; // Avoid riskof looking at lod entries
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -172,32 +154,22 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
|||
{
|
||||
int n = MAXDESTS;
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct ROUTE * ROUTE = NULL;
|
||||
struct ROUTE * ROUTE;
|
||||
struct _LINKTABLE * LINK;
|
||||
struct TNCINFO * TNC;
|
||||
|
||||
int ActiveRoute;
|
||||
|
||||
if (DEST->DEST_ROUTE == 0) // Don't ALREADY HAVE A SELECTED ROUTE?
|
||||
{
|
||||
DEST->DEST_ROUTE = 1;
|
||||
if (DEST->DEST_ROUTE == 0) // ALREADY HAVE A SELECTED ROUTE?
|
||||
DEST->DEST_ROUTE = 1; // TRY TO ACTIVATE FIRST
|
||||
|
||||
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;
|
||||
|
||||
ROUTE = DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR;
|
||||
|
||||
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 (DEST->DEST_ROUTE != 1)
|
||||
|
|
@ -205,17 +177,13 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
|||
|
||||
// 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
|
||||
|
||||
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
|
||||
|
||||
TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
|
||||
|
|
@ -236,7 +204,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
|||
return L2SETUPCROSSLINK(ROUTE);
|
||||
}
|
||||
|
||||
// We must be waiting for link to come up
|
||||
// We mst be waiting for link to come up
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
|
@ -255,13 +223,6 @@ char Call1[10];
|
|||
char Call2[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)
|
||||
{
|
||||
// PROCESS A NET/ROM 'NODES' MESSAGE
|
||||
|
|
@ -298,7 +259,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
|
|||
{
|
||||
APPL=&APPLCALLTABLE[App];
|
||||
|
||||
if (CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
|
||||
if (APPL->APPLHASALIAS == 0 && CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -358,13 +319,13 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
|
|||
|
||||
// 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)
|
||||
return;
|
||||
|
||||
// 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)
|
||||
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 (ROUTE->NEIGHBOUR_FLAG == 0) // Not LOCKED ROUTE
|
||||
if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // Not LOCKED ROUTE
|
||||
ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY;
|
||||
|
||||
// GET TIME FROM BIOS DATA AREA OR RTC
|
||||
|
|
@ -407,7 +368,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
|
|||
NUMBEROFNODES++;
|
||||
}
|
||||
|
||||
// ALWAYS UPDATE ALIAS IN CASE NOT PRESENT IN ORIGINAL TABLE
|
||||
// ALWAYS UPDATE ALIAS IN CASE NOT PRESENT IN ORIGINAL TABLE
|
||||
|
||||
ptr1 = &Msg->L2DATA[1];
|
||||
ptr2 = &DEST->DEST_ALIAS[0];
|
||||
|
|
@ -475,10 +436,10 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
|
|||
if (CheckExcludeList(ptr1) == 0) // Excluded
|
||||
continue;
|
||||
|
||||
for (n = 0; n < NumberofAppls; n++)
|
||||
for (n = 0; n < 32; n++)
|
||||
{
|
||||
if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL))
|
||||
goto IgnoreNode; // Don't update our applications
|
||||
continue;
|
||||
}
|
||||
|
||||
// MAKE SURE ITS NOT CORRUPTED
|
||||
|
|
@ -587,7 +548,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
|
|||
|
||||
ptr1 += 7;
|
||||
|
||||
// UPDATE ALIAS#
|
||||
// UPDATE ALIAS
|
||||
|
||||
memcpy(DEST->DEST_ALIAS, ptr1, 6);
|
||||
|
||||
|
|
@ -627,6 +588,9 @@ VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual)
|
|||
if (Index == 0)
|
||||
{
|
||||
// THIS IS A REFRESH OF BEST - IF THIS ISNT ACTIVE ROUTE, MAKE IT ACTIVE
|
||||
|
||||
if (DEST->DEST_ROUTE > 1) // LEAVE IT IF NOT SELECTED OR ALREADY USING BEST
|
||||
DEST->DEST_ROUTE = 1;
|
||||
}
|
||||
|
||||
goto UpdatateThisEntry;
|
||||
|
|
@ -725,8 +689,6 @@ SORTROUTES:
|
|||
|
||||
goto SORTROUTES; // 1 AND 2 MAY NOW BE WRONG!
|
||||
}
|
||||
|
||||
DEST->DEST_ROUTE = 0; // OForce re-evaluation.
|
||||
}
|
||||
|
||||
int COUNTNODES(struct ROUTE * ROUTE)
|
||||
|
|
@ -745,11 +707,11 @@ int COUNTNODES(struct ROUTE * ROUTE)
|
|||
count++;
|
||||
else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
|
||||
count++;
|
||||
else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
|
||||
else if (DEST->ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
|
||||
count++;
|
||||
else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
|
||||
else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
|
||||
count++;
|
||||
else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
|
||||
else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
|
||||
count++;
|
||||
|
||||
DEST++;
|
||||
|
|
@ -764,26 +726,12 @@ VOID L3BG();
|
|||
|
||||
VOID SENDNEXTNODESFRAGMENT();
|
||||
|
||||
VOID SENDNODESMSG(int Portnum)
|
||||
VOID SENDNODESMSG()
|
||||
{
|
||||
if (NODESINPROGRESS)
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
@ -819,19 +767,16 @@ VOID SENDNEXTNODESFRAGMENT()
|
|||
// No NODES to this port, so go to next
|
||||
|
||||
PORT = PORT->PORTPOINTER;
|
||||
|
||||
if (PORT == NULL || NODESToOnePort)
|
||||
if (PORT == NULL)
|
||||
{
|
||||
// Finished
|
||||
|
||||
NODESToOnePort = 0;
|
||||
NODESINPROGRESS = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (NODESToOnePort == 0) // CurrentPort already set if NODESToOnePort
|
||||
L3CURRENTPORT = PORT;
|
||||
L3CURRENTPORT = PORT;
|
||||
|
||||
DEST = CURRENTNODE = DESTS; // START OF LIST
|
||||
NODESINPROGRESS = 1;
|
||||
|
|
@ -888,30 +833,19 @@ VOID SENDNEXTNODESFRAGMENT()
|
|||
if (DEST >= ENDDESTLIST)
|
||||
{
|
||||
CURRENTNODE = 0; // Finished on this port
|
||||
|
||||
// if sending to only one port then stop
|
||||
|
||||
if (NODESToOnePort)
|
||||
L3CURRENTPORT = PORT->PORTPOINTER;
|
||||
if (L3CURRENTPORT == NULL)
|
||||
{
|
||||
NODESToOnePort = 0;
|
||||
// Finished
|
||||
|
||||
NODESINPROGRESS = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
L3CURRENTPORT = PORT->PORTPOINTER;
|
||||
if (L3CURRENTPORT == NULL)
|
||||
{
|
||||
// Finished
|
||||
|
||||
NODESINPROGRESS = 0;
|
||||
}
|
||||
}
|
||||
goto Sendit;
|
||||
}
|
||||
|
||||
if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
|
||||
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
|
||||
|
||||
|
|
@ -944,9 +878,6 @@ VOID SENDNEXTNODESFRAGMENT()
|
|||
|
||||
*(ptr1++) = (UCHAR)Qual;
|
||||
|
||||
if (Qual == 0)
|
||||
continue;
|
||||
|
||||
Count--;
|
||||
}
|
||||
DEST++;
|
||||
|
|
@ -993,15 +924,13 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, 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
|
||||
|
||||
dest_list * DEST;
|
||||
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);
|
||||
|
||||
DEST = DESTS;
|
||||
|
|
@ -1016,7 +945,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
|
|||
if (DEST->DEST_ROUTE == 0)
|
||||
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
|
||||
|
||||
|
|
@ -1041,8 +970,7 @@ VOID L3TimerProc()
|
|||
LINK = LINKS;
|
||||
i = MAXLINKS;
|
||||
|
||||
|
||||
while (i--)
|
||||
while (i--);
|
||||
{
|
||||
if (LINK->LINKTYPE == 3) // Only if Internode
|
||||
{
|
||||
|
|
@ -1095,7 +1023,7 @@ VOID L3TimerProc()
|
|||
|
||||
L3TIMER = L3INTERVAL;
|
||||
UPDATEDESTLIST();
|
||||
SENDNODESMSG(0);
|
||||
SENDNODESMSG();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1110,7 +1038,7 @@ VOID L3TimerProc()
|
|||
{
|
||||
ROUTE++;
|
||||
|
||||
if (ROUTE->NEIGHBOUR_FLAG) // Locked?
|
||||
if (ROUTE->NEIGHBOUR_FLAG & 1) // Locked?
|
||||
continue;
|
||||
|
||||
if (ROUTE->NEIGHBOUR_LINK) // Has an active Session
|
||||
|
|
@ -1133,11 +1061,6 @@ VOID L3FastTimer()
|
|||
MESSAGE * Msg;
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
|
||||
// Not if Node is closing
|
||||
|
||||
if (CLOSING)
|
||||
return;
|
||||
|
||||
INP3TIMER();
|
||||
|
||||
// Send Node faster if VARA
|
||||
|
|
@ -1197,7 +1120,7 @@ UPDEST000:
|
|||
{
|
||||
// Any INP3 Routes?
|
||||
|
||||
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
|
||||
if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
|
||||
{
|
||||
// NO ROUTES LEFT TO DEST - REMOVE IT
|
||||
|
||||
|
|
@ -1310,9 +1233,6 @@ VOID REMOVENODE(dest_list * DEST)
|
|||
while (DEST->DEST_Q)
|
||||
ReleaseBuffer(Q_REM(&DEST->DEST_Q));
|
||||
|
||||
if (DEST->DEST_STATE & 0x80) // LOCKED DESTINATION
|
||||
return;
|
||||
|
||||
// MAY NEED TO CHECK FOR L4 CIRCUITS USING DEST, BUT PROBABLY NOT,
|
||||
// AS THEY SHOULD HAVE TIMED OUT LONG AGO
|
||||
|
||||
|
|
@ -1372,25 +1292,19 @@ VOID REMOVENODE(dest_list * DEST)
|
|||
NUMBEROFNODES--;
|
||||
}
|
||||
|
||||
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
|
||||
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
|
||||
{
|
||||
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
|
||||
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct ROUTE * ROUTE;
|
||||
|
||||
|
||||
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
|
||||
|
||||
if (ROUTE == NULL)
|
||||
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);
|
||||
|
||||
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
|
||||
|
|
@ -1399,10 +1313,9 @@ VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
|
|||
}
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
int n = MAXDESTS;
|
||||
|
|
@ -1415,7 +1328,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
142
LinBPQ.c
142
LinBPQ.c
|
|
@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "bpqmail.h"
|
||||
#ifdef WIN32
|
||||
#include <Iphlpapi.h>
|
||||
|
|
@ -45,11 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
BOOL APIENTRY Rig_Init();
|
||||
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID);
|
||||
void FreeSemaphore(struct SEM * Semaphore);
|
||||
VOID CopyConfigFile(char * ConfigName);
|
||||
VOID SendMailForThread(VOID * Param);
|
||||
|
|
@ -79,13 +75,9 @@ int upnpClose();
|
|||
void SaveAIS();
|
||||
void initAIS();
|
||||
void DRATSPoll();
|
||||
void RHPPoll();
|
||||
|
||||
VOID GetPGConfig();
|
||||
void SendBBSDataToPktMap();
|
||||
void CloseAllLinks();
|
||||
void hookNodeClosing(char * Reason);
|
||||
void NETROMTCPResolve();
|
||||
|
||||
extern uint64_t timeLoadedMS;
|
||||
|
||||
BOOL IncludesMail = FALSE;
|
||||
BOOL IncludesChat = FALSE;
|
||||
|
|
@ -263,9 +255,9 @@ extern char MailDir[MAX_PATH];
|
|||
extern time_t MaintClock; // Time to run housekeeping
|
||||
|
||||
#ifdef WIN32
|
||||
int KEEPGOING = 30; // 5 secs to shut down
|
||||
BOOL KEEPGOING = 30; // 5 secs to shut down
|
||||
#else
|
||||
int KEEPGOING = 50; // 5 secs to shut down
|
||||
BOOL KEEPGOING = 50; // 5 secs to shut down
|
||||
#endif
|
||||
BOOL Restarting = FALSE;
|
||||
BOOL CLOSING = FALSE;
|
||||
|
|
@ -338,7 +330,6 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
|
|||
// Handle the CTRL-C signal.
|
||||
case CTRL_C_EVENT:
|
||||
printf( "Ctrl-C event\n\n" );
|
||||
CloseAllLinks();
|
||||
CLOSING = TRUE;
|
||||
Beep( 750, 300 );
|
||||
return( TRUE );
|
||||
|
|
@ -346,8 +337,7 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
|
|||
// CTRL-CLOSE: confirm that the user wants to exit.
|
||||
case CTRL_CLOSE_EVENT:
|
||||
|
||||
CloseAllLinks();
|
||||
CLOSING = TRUE;
|
||||
CLOSING = TRUE;
|
||||
printf( "Ctrl-Close event\n\n" );
|
||||
Sleep(20000);
|
||||
Beep( 750, 300 );
|
||||
|
|
@ -357,8 +347,7 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
|
|||
case CTRL_BREAK_EVENT:
|
||||
Beep( 900, 200 );
|
||||
printf( "Ctrl-Break event\n\n" );
|
||||
CloseAllLinks();
|
||||
CLOSING = TRUE;
|
||||
CLOSING = TRUE;
|
||||
Beep( 750, 300 );
|
||||
return FALSE;
|
||||
|
||||
|
|
@ -370,8 +359,7 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
|
|||
case CTRL_SHUTDOWN_EVENT:
|
||||
Beep( 750, 500 );
|
||||
printf( "Ctrl-Shutdown event\n\n" );
|
||||
CloseAllLinks();
|
||||
CLOSING = TRUE;
|
||||
CLOSING = TRUE;
|
||||
Beep( 750, 300 );
|
||||
return FALSE;
|
||||
|
||||
|
|
@ -382,70 +370,18 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
|
|||
|
||||
#else
|
||||
|
||||
#include <execinfo.h>
|
||||
#include <signal.h>
|
||||
|
||||
// Linux Signal Handlers
|
||||
static void segvhandler(int sig)
|
||||
{
|
||||
void *array[10];
|
||||
size_t size;
|
||||
char msg[] = "\nSIGSEGV Received\n";
|
||||
|
||||
write(STDERR_FILENO, msg, strlen(msg));
|
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, 10);
|
||||
|
||||
// print out all the frames to stderr
|
||||
|
||||
backtrace_symbols_fd(array, size, STDERR_FILENO);
|
||||
|
||||
write(STDOUT_FILENO, msg, strlen(msg));
|
||||
backtrace_symbols_fd(array, size, STDOUT_FILENO);
|
||||
|
||||
hookNodeClosing("sigsegv");
|
||||
Sleep(500);
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void abrthandler(int sig)
|
||||
{
|
||||
void *array[10];
|
||||
size_t size;
|
||||
char msg[] = "\nSIGABRT Received\n";
|
||||
|
||||
write(STDERR_FILENO, msg, strlen(msg));
|
||||
write(STDOUT_FILENO, msg, strlen(msg));
|
||||
|
||||
// get void*'s for all entries on the stack
|
||||
|
||||
size = backtrace(array, 10);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
static void sigterm_handler(int sig)
|
||||
{
|
||||
syslog(LOG_INFO, "terminating on SIGTERM\n");
|
||||
CLOSING = TRUE;
|
||||
CloseAllLinks();
|
||||
}
|
||||
|
||||
static void sigint_handler(int sig)
|
||||
{
|
||||
printf("terminating on SIGINT\n");
|
||||
CLOSING = TRUE;
|
||||
CloseAllLinks();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -524,10 +460,9 @@ VOID MonitorThread(void * x)
|
|||
{
|
||||
// It is stuck - try to release
|
||||
|
||||
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
|
||||
Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
|
||||
|
||||
|
||||
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d",
|
||||
Semaphore.SemProcessID, SemHeldByAPI);
|
||||
|
||||
Semaphore.Flag = 0;
|
||||
}
|
||||
|
||||
|
|
@ -618,8 +553,6 @@ extern int POP3Timer;
|
|||
|
||||
#ifndef WIN32
|
||||
|
||||
|
||||
|
||||
#define _getch getchar
|
||||
|
||||
/**
|
||||
|
|
@ -733,7 +666,7 @@ void ConTermPoll()
|
|||
|
||||
// Replace CR with CRLF
|
||||
|
||||
printf("%s", ptr);
|
||||
printf(ptr);
|
||||
|
||||
if (ptr2)
|
||||
printf("\r\n");
|
||||
|
|
@ -783,7 +716,7 @@ void ConTermPoll()
|
|||
|
||||
}
|
||||
|
||||
#include <getopt.h>
|
||||
#include "getopt.h"
|
||||
|
||||
static struct option long_options[] =
|
||||
{
|
||||
|
|
@ -804,12 +737,6 @@ char HelpScreen[] =
|
|||
|
||||
int Redirected = 0;
|
||||
|
||||
static void segvhandler(int sig);
|
||||
static void abrthandler(int sig);
|
||||
|
||||
void GetRestartData();
|
||||
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
int i;
|
||||
|
|
@ -839,10 +766,6 @@ int main(int argc, char * argv[])
|
|||
}
|
||||
|
||||
#else
|
||||
|
||||
signal(SIGSEGV, segvhandler);
|
||||
signal(SIGABRT, abrthandler);
|
||||
|
||||
setlinebuf(stdout);
|
||||
struct sigaction act;
|
||||
openlog("LINBPQ", LOG_PID, LOG_DAEMON);
|
||||
|
|
@ -852,20 +775,21 @@ int main(int argc, char * argv[])
|
|||
#endif
|
||||
#endif
|
||||
|
||||
// Disable Console Terminal if stdout redirected
|
||||
// Disable Console Terminal if stdout redirected
|
||||
|
||||
// printf("STDOUT %d\n",isatty(STDOUT_FILENO));
|
||||
// printf("STDIN %d\n",isatty(STDIN_FILENO));
|
||||
|
||||
if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO))
|
||||
Redirected = 1;
|
||||
|
||||
timeLoadedMS = GetTickCount();
|
||||
|
||||
#endif
|
||||
|
||||
printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
|
||||
printf("%s\n", VerCopyright);
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
|
||||
// look for optarg format parameters
|
||||
|
||||
|
|
@ -891,7 +815,7 @@ int main(int argc, char * argv[])
|
|||
{
|
||||
case 'h':
|
||||
|
||||
printf("%s", HelpScreen);
|
||||
printf(HelpScreen);
|
||||
exit (0);
|
||||
|
||||
case 'l':
|
||||
|
|
@ -923,10 +847,7 @@ int main(int argc, char * argv[])
|
|||
|
||||
Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring);
|
||||
|
||||
#if defined(MACBPQ) || defined(FREEBSD)
|
||||
time_t dummy;
|
||||
_MYTIMEZONE = -localtime(&dummy)->tm_gmtoff;
|
||||
#else
|
||||
#ifndef MACBPQ
|
||||
_MYTIMEZONE = _timezone;
|
||||
#endif
|
||||
|
||||
|
|
@ -1012,8 +933,6 @@ int main(int argc, char * argv[])
|
|||
return (0);
|
||||
}
|
||||
|
||||
NETROMTCPResolve();
|
||||
|
||||
for (i=0;PWTEXT[i] > 0x20;i++); //Scan for cr or null
|
||||
|
||||
PWLen=i;
|
||||
|
|
@ -1200,8 +1119,6 @@ int main(int argc, char * argv[])
|
|||
chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// Make backup copies of Databases
|
||||
|
||||
// CopyConfigFile(ConfigName);
|
||||
|
|
@ -1223,7 +1140,6 @@ int main(int argc, char * argv[])
|
|||
GetBadWordFile();
|
||||
GetHTMLForms();
|
||||
GetPGConfig();
|
||||
GetRestartData();
|
||||
|
||||
// Make sure there is a user record for the BBS, with BBS bit set.
|
||||
|
||||
|
|
@ -1365,10 +1281,6 @@ int main(int argc, char * argv[])
|
|||
printf("Mail Started\n");
|
||||
Logprintf(LOG_BBS, NULL, '!', "Mail Starting");
|
||||
|
||||
APIClock = 0;
|
||||
|
||||
SendBBSDataToPktMap();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1471,7 +1383,6 @@ int main(int argc, char * argv[])
|
|||
SaveMessageDatabase();
|
||||
SaveBIDDatabase();
|
||||
SaveConfig(ConfigName);
|
||||
SaveRestartData();
|
||||
}
|
||||
|
||||
KEEPGOING--; // Give time for links to close
|
||||
|
|
@ -1545,8 +1456,6 @@ int main(int argc, char * argv[])
|
|||
Consoleprintf(VerCopyright);
|
||||
|
||||
Start();
|
||||
|
||||
NETROMTCPResolve();
|
||||
|
||||
INITIALISEPORTS();
|
||||
|
||||
|
|
@ -1619,7 +1528,6 @@ int main(int argc, char * argv[])
|
|||
Poll_AGW();
|
||||
|
||||
DRATSPoll();
|
||||
RHPPoll();
|
||||
|
||||
HTTPTimer();
|
||||
|
||||
|
|
@ -1671,13 +1579,6 @@ int main(int argc, char * argv[])
|
|||
DoHouseKeeping(FALSE);
|
||||
}
|
||||
|
||||
if (APIClock < NOW)
|
||||
{
|
||||
SendBBSDataToPktMap();
|
||||
APIClock = NOW + 7200; // Every 2 hours
|
||||
}
|
||||
|
||||
|
||||
tm = gmtime(&NOW);
|
||||
|
||||
if (tm->tm_wday == 0) // Sunday
|
||||
|
|
@ -1697,9 +1598,6 @@ int main(int argc, char * argv[])
|
|||
Slowtimer = 0;
|
||||
}
|
||||
|
||||
hookNodeClosing("Shutdown");
|
||||
Sleep(500);
|
||||
|
||||
printf("Closing Ports\n");
|
||||
|
||||
CloseTNCEmulator();
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include "bpqmail.h"
|
||||
|
||||
void SendMessageReadEvent(char * call, struct MsgInfo * Msg);
|
||||
void MQTTMessageEvent(void* message);
|
||||
|
||||
|
||||
VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len)
|
||||
|
|
@ -200,12 +199,6 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
|
|||
}
|
||||
|
||||
conn->FwdMsg->Locked = 0; // Unlock
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(conn->FwdMsg);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
@ -289,7 +282,7 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
|
|||
{
|
||||
// Reverse forward request
|
||||
|
||||
// If we have just sent a message, Flag it as sent
|
||||
// If we have just sent a nessage, Flag it as sent
|
||||
|
||||
if (conn->FBBMsgsSent)
|
||||
{
|
||||
|
|
@ -307,11 +300,6 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
|
|||
|
||||
conn->FwdMsg->Locked = 0; // Unlock
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(conn->FwdMsg);
|
||||
#endif
|
||||
|
||||
conn->UserPointer->ForwardingInfo->MsgCount--;
|
||||
}
|
||||
|
||||
|
|
@ -366,11 +354,6 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
|
|||
conn->FwdMsg->datechanged=time(NULL);
|
||||
}
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(conn->FwdMsg);
|
||||
#endif
|
||||
|
||||
conn->UserPointer->ForwardingInfo->MsgCount--;
|
||||
}
|
||||
|
||||
|
|
|
|||
0
MHSave.txt
Normal file
0
MHSave.txt
Normal file
2383
MQTTAsync.h
Normal file
2383
MQTTAsync.h
Normal file
File diff suppressed because it is too large
Load diff
1980
MQTTClient.h
Normal file
1980
MQTTClient.h
Normal file
File diff suppressed because it is too large
Load diff
277
MQTTClientPersistence.h
Normal file
277
MQTTClientPersistence.h
Normal file
|
|
@ -0,0 +1,277 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2009, 2020 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* \brief This structure represents a persistent data store, used to store
|
||||
* outbound and inbound messages, in order to achieve reliable messaging.
|
||||
*
|
||||
* The MQTT Client persists QoS1 and QoS2 messages in order to meet the
|
||||
* assurances of delivery associated with these @ref qos levels. The messages
|
||||
* are saved in persistent storage
|
||||
* The type and context of the persistence implementation are specified when
|
||||
* the MQTT client is created (see MQTTClient_create()). The default
|
||||
* persistence type (::MQTTCLIENT_PERSISTENCE_DEFAULT) uses a file system-based
|
||||
* persistence mechanism. The <i>persistence_context</i> argument passed to
|
||||
* MQTTClient_create() when using the default peristence is a string
|
||||
* representing the location of the persistence directory. If the context
|
||||
* argument is NULL, the working directory will be used.
|
||||
*
|
||||
* To use memory-based persistence, an application passes
|
||||
* ::MQTTCLIENT_PERSISTENCE_NONE as the <i>persistence_type</i> to
|
||||
* MQTTClient_create(). This can lead to message loss in certain situations,
|
||||
* but can be appropriate in some cases (see @ref qos).
|
||||
*
|
||||
* Client applications can provide their own persistence mechanism by passing
|
||||
* ::MQTTCLIENT_PERSISTENCE_USER as the <i>persistence_type</i>. To implement a
|
||||
* custom persistence mechanism, the application must pass an initialized
|
||||
* ::MQTTClient_persistence structure as the <i>persistence_context</i>
|
||||
* argument to MQTTClient_create().
|
||||
*
|
||||
* If the functions defined return an ::MQTTCLIENT_PERSISTENCE_ERROR then the
|
||||
* state of the persisted data should remain as it was prior to the function
|
||||
* being called. For example, if Persistence_put() returns
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR, then it is assumed tha tthe persistent store
|
||||
* does not contain the data that was passed to the function. Similarly, if
|
||||
* Persistence_remove() returns ::MQTTCLIENT_PERSISTENCE_ERROR then it is
|
||||
* assumed that the data to be removed is still held in the persistent store.
|
||||
*
|
||||
* It is up to the persistence implementation to log any error information that
|
||||
* may be required to diagnose a persistence mechanism failure.
|
||||
*/
|
||||
|
||||
/*
|
||||
/// @cond EXCLUDE
|
||||
*/
|
||||
#if !defined(MQTTCLIENTPERSISTENCE_H)
|
||||
#define MQTTCLIENTPERSISTENCE_H
|
||||
/*
|
||||
/// @endcond
|
||||
*/
|
||||
|
||||
/**
|
||||
* This <i>persistence_type</i> value specifies the default file system-based
|
||||
* persistence mechanism (see MQTTClient_create()).
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_DEFAULT 0
|
||||
/**
|
||||
* This <i>persistence_type</i> value specifies a memory-based
|
||||
* persistence mechanism (see MQTTClient_create()).
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_NONE 1
|
||||
/**
|
||||
* This <i>persistence_type</i> value specifies an application-specific
|
||||
* persistence mechanism (see MQTTClient_create()).
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_USER 2
|
||||
|
||||
/**
|
||||
* Application-specific persistence functions must return this error code if
|
||||
* there is a problem executing the function.
|
||||
*/
|
||||
#define MQTTCLIENT_PERSISTENCE_ERROR -2
|
||||
|
||||
/**
|
||||
* @brief Initialize the persistent store.
|
||||
*
|
||||
* Either open the existing persistent store for this client ID or create a new
|
||||
* one if one doesn't exist. If the persistent store is already open, return
|
||||
* without taking any action.
|
||||
*
|
||||
* An application can use the same client identifier to connect to many
|
||||
* different servers. The <i>clientid</i> in conjunction with the
|
||||
* <i>serverURI</i> uniquely identifies the persistence store required.
|
||||
*
|
||||
* @param handle The address of a pointer to a handle for this persistence
|
||||
* implementation. This function must set handle to a valid reference to the
|
||||
* persistence following a successful return.
|
||||
* The handle pointer is passed as an argument to all the other
|
||||
* persistence functions. It may include the context parameter and/or any other
|
||||
* data for use by the persistence functions.
|
||||
* @param clientID The client identifier for which the persistent store should
|
||||
* be opened.
|
||||
* @param serverURI The connection string specified when the MQTT client was
|
||||
* created (see MQTTClient_create()).
|
||||
* @param context A pointer to any data required to initialize the persistent
|
||||
* store (see ::MQTTClient_persistence).
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_open)(void** handle, const char* clientID, const char* serverURI, void* context);
|
||||
|
||||
/**
|
||||
* @brief Close the persistent store referred to by the handle.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_close)(void* handle);
|
||||
|
||||
/**
|
||||
* @brief Put the specified data into the persistent store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key A string used as the key for the data to be put in the store. The
|
||||
* key is later used to retrieve data from the store with Persistence_get().
|
||||
* @param bufcount The number of buffers to write to the persistence store.
|
||||
* @param buffers An array of pointers to the data buffers associated with
|
||||
* this <i>key</i>.
|
||||
* @param buflens An array of lengths of the data buffers. <i>buflen[n]</i>
|
||||
* gives the length of <i>buffer[n]</i>.
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_put)(void* handle, char* key, int bufcount, char* buffers[], int buflens[]);
|
||||
|
||||
/**
|
||||
* @brief Retrieve the specified data from the persistent store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key A string that is the key for the data to be retrieved. This is
|
||||
* the same key used to save the data to the store with Persistence_put().
|
||||
* @param buffer The address of a pointer to a buffer. This function sets the
|
||||
* pointer to point at the retrieved data, if successful.
|
||||
* @param buflen The address of an int that is set to the length of
|
||||
* <i>buffer</i> by this function if successful.
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_get)(void* handle, char* key, char** buffer, int* buflen);
|
||||
|
||||
/**
|
||||
* @brief Remove the data for the specified key from the store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key A string that is the key for the data to be removed from the
|
||||
* store. This is the same key used to save the data to the store with
|
||||
* Persistence_put().
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_remove)(void* handle, char* key);
|
||||
|
||||
/**
|
||||
* @brief Returns the keys in this persistent data store.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param keys The address of a pointer to pointers to strings. Assuming
|
||||
* successful execution, this function allocates memory to hold the returned
|
||||
* keys (strings used to store the data with Persistence_put()). It also
|
||||
* allocates memory to hold an array of pointers to these strings. <i>keys</i>
|
||||
* is set to point to the array of pointers to strings.
|
||||
* @param nkeys A pointer to the number of keys in this persistent data store.
|
||||
* This function sets the number of keys, if successful.
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_keys)(void* handle, char*** keys, int* nkeys);
|
||||
|
||||
/**
|
||||
* @brief Clears the persistence store, so that it no longer contains any
|
||||
* persisted data.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @return Return 0 if the function completes successfully, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_clear)(void* handle);
|
||||
|
||||
/**
|
||||
* @brief Returns whether any data has been persisted using the specified key.
|
||||
*
|
||||
* @param handle The handle pointer from a successful call to
|
||||
* Persistence_open().
|
||||
* @param key The string to be tested for existence in the store.
|
||||
* @return Return 0 if the key was found in the store, otherwise return
|
||||
* ::MQTTCLIENT_PERSISTENCE_ERROR.
|
||||
*/
|
||||
typedef int (*Persistence_containskey)(void* handle, char* key);
|
||||
|
||||
/**
|
||||
* @brief A structure containing the function pointers to a persistence
|
||||
* implementation and the context or state that will be shared across all
|
||||
* the persistence functions.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* A pointer to any data required to initialize the persistent store.
|
||||
*/
|
||||
void* context;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_open().
|
||||
*/
|
||||
Persistence_open popen;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_close().
|
||||
*/
|
||||
Persistence_close pclose;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_put().
|
||||
*/
|
||||
Persistence_put pput;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_get().
|
||||
*/
|
||||
Persistence_get pget;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_remove().
|
||||
*/
|
||||
Persistence_remove premove;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_keys().
|
||||
*/
|
||||
Persistence_keys pkeys;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_clear().
|
||||
*/
|
||||
Persistence_clear pclear;
|
||||
/**
|
||||
* A function pointer to an implementation of Persistence_containskey().
|
||||
*/
|
||||
Persistence_containskey pcontainskey;
|
||||
} MQTTClient_persistence;
|
||||
|
||||
|
||||
/**
|
||||
* A callback which is invoked just before a write to persistence. This can be
|
||||
* used to transform the data, for instance to encrypt it.
|
||||
* @param context The context as set in ::MQTTAsync_setBeforePersistenceWrite
|
||||
* @param bufcount The number of buffers to write to the persistence store.
|
||||
* @param buffers An array of pointers to the data buffers.
|
||||
* @param buflens An array of lengths of the data buffers.
|
||||
* @return Return 0 if the function completes successfully, otherwise non 0.
|
||||
*/
|
||||
typedef int MQTTPersistence_beforeWrite(void* context, int bufcount, char* buffers[], int buflens[]);
|
||||
|
||||
|
||||
/**
|
||||
* A callback which is invoked just after a read from persistence. This can be
|
||||
* used to transform the data, for instance to decrypt it.
|
||||
* @param context The context as set in ::MQTTAsync_setAfterPersistenceRead
|
||||
* @param buffer The address of a pointer to a buffer.
|
||||
* @param buflen The address of an int that is the length of the buffer.
|
||||
* @return Return 0 if the function completes successfully, otherwise non 0.
|
||||
*/
|
||||
typedef int MQTTPersistence_afterRead(void* context, char** buffer, int* buflen);
|
||||
|
||||
#endif
|
||||
36
MQTTExportDeclarations.h
Normal file
36
MQTTExportDeclarations.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2020, 2020 Andreas Walter
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Andreas Walter - initially moved export declarations into separate fle
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(EXPORTDECLARATIONS_H)
|
||||
#define EXPORTDECLARATIONS_H
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
# if defined(PAHO_MQTT_EXPORTS)
|
||||
# define LIBMQTT_API __declspec(dllexport)
|
||||
# elif defined(PAHO_MQTT_IMPORTS)
|
||||
# define LIBMQTT_API __declspec(dllimport)
|
||||
# else
|
||||
# define LIBMQTT_API
|
||||
# endif
|
||||
#else
|
||||
# if defined(PAHO_MQTT_EXPORTS)
|
||||
# define LIBMQTT_API __attribute__ ((visibility ("default")))
|
||||
# else
|
||||
# define LIBMQTT_API extern
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
222
MQTTProperties.h
Normal file
222
MQTTProperties.h
Normal file
|
|
@ -0,0 +1,222 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2017, 2023 IBM Corp. and others
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(MQTTPROPERTIES_H)
|
||||
#define MQTTPROPERTIES_H
|
||||
|
||||
#include "MQTTExportDeclarations.h"
|
||||
|
||||
#define MQTT_INVALID_PROPERTY_ID -2
|
||||
|
||||
/** The one byte MQTT V5 property indicator */
|
||||
enum MQTTPropertyCodes {
|
||||
MQTTPROPERTY_CODE_PAYLOAD_FORMAT_INDICATOR = 1, /**< The value is 1 */
|
||||
MQTTPROPERTY_CODE_MESSAGE_EXPIRY_INTERVAL = 2, /**< The value is 2 */
|
||||
MQTTPROPERTY_CODE_CONTENT_TYPE = 3, /**< The value is 3 */
|
||||
MQTTPROPERTY_CODE_RESPONSE_TOPIC = 8, /**< The value is 8 */
|
||||
MQTTPROPERTY_CODE_CORRELATION_DATA = 9, /**< The value is 9 */
|
||||
MQTTPROPERTY_CODE_SUBSCRIPTION_IDENTIFIER = 11, /**< The value is 11 */
|
||||
MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL = 17, /**< The value is 17 */
|
||||
MQTTPROPERTY_CODE_ASSIGNED_CLIENT_IDENTIFER = 18,/**< The value is 18 */
|
||||
MQTTPROPERTY_CODE_SERVER_KEEP_ALIVE = 19, /**< The value is 19 */
|
||||
MQTTPROPERTY_CODE_AUTHENTICATION_METHOD = 21, /**< The value is 21 */
|
||||
MQTTPROPERTY_CODE_AUTHENTICATION_DATA = 22, /**< The value is 22 */
|
||||
MQTTPROPERTY_CODE_REQUEST_PROBLEM_INFORMATION = 23,/**< The value is 23 */
|
||||
MQTTPROPERTY_CODE_WILL_DELAY_INTERVAL = 24, /**< The value is 24 */
|
||||
MQTTPROPERTY_CODE_REQUEST_RESPONSE_INFORMATION = 25,/**< The value is 25 */
|
||||
MQTTPROPERTY_CODE_RESPONSE_INFORMATION = 26, /**< The value is 26 */
|
||||
MQTTPROPERTY_CODE_SERVER_REFERENCE = 28, /**< The value is 28 */
|
||||
MQTTPROPERTY_CODE_REASON_STRING = 31, /**< The value is 31 */
|
||||
MQTTPROPERTY_CODE_RECEIVE_MAXIMUM = 33, /**< The value is 33*/
|
||||
MQTTPROPERTY_CODE_TOPIC_ALIAS_MAXIMUM = 34, /**< The value is 34 */
|
||||
MQTTPROPERTY_CODE_TOPIC_ALIAS = 35, /**< The value is 35 */
|
||||
MQTTPROPERTY_CODE_MAXIMUM_QOS = 36, /**< The value is 36 */
|
||||
MQTTPROPERTY_CODE_RETAIN_AVAILABLE = 37, /**< The value is 37 */
|
||||
MQTTPROPERTY_CODE_USER_PROPERTY = 38, /**< The value is 38 */
|
||||
MQTTPROPERTY_CODE_MAXIMUM_PACKET_SIZE = 39, /**< The value is 39 */
|
||||
MQTTPROPERTY_CODE_WILDCARD_SUBSCRIPTION_AVAILABLE = 40,/**< The value is 40 */
|
||||
MQTTPROPERTY_CODE_SUBSCRIPTION_IDENTIFIERS_AVAILABLE = 41,/**< The value is 41 */
|
||||
MQTTPROPERTY_CODE_SHARED_SUBSCRIPTION_AVAILABLE = 42/**< The value is 241 */
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns a printable string description of an MQTT V5 property code.
|
||||
* @param value an MQTT V5 property code.
|
||||
* @return the printable string description of the input property code.
|
||||
* NULL if the code was not found.
|
||||
*/
|
||||
LIBMQTT_API const char* MQTTPropertyName(enum MQTTPropertyCodes value);
|
||||
|
||||
/** The one byte MQTT V5 property type */
|
||||
enum MQTTPropertyTypes {
|
||||
MQTTPROPERTY_TYPE_BYTE,
|
||||
MQTTPROPERTY_TYPE_TWO_BYTE_INTEGER,
|
||||
MQTTPROPERTY_TYPE_FOUR_BYTE_INTEGER,
|
||||
MQTTPROPERTY_TYPE_VARIABLE_BYTE_INTEGER,
|
||||
MQTTPROPERTY_TYPE_BINARY_DATA,
|
||||
MQTTPROPERTY_TYPE_UTF_8_ENCODED_STRING,
|
||||
MQTTPROPERTY_TYPE_UTF_8_STRING_PAIR
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the MQTT V5 type code of an MQTT V5 property.
|
||||
* @param value an MQTT V5 property code.
|
||||
* @return the MQTT V5 type code of the input property. -1 if the code was not found.
|
||||
*/
|
||||
LIBMQTT_API int MQTTProperty_getType(enum MQTTPropertyCodes value);
|
||||
|
||||
/**
|
||||
* The data for a length delimited string
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
int len; /**< the length of the string */
|
||||
char* data; /**< pointer to the string data */
|
||||
} MQTTLenString;
|
||||
|
||||
|
||||
/**
|
||||
* Structure to hold an MQTT version 5 property of any type
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
enum MQTTPropertyCodes identifier; /**< The MQTT V5 property id. A multi-byte integer. */
|
||||
/** The value of the property, as a union of the different possible types. */
|
||||
union {
|
||||
unsigned char byte; /**< holds the value of a byte property type */
|
||||
unsigned short integer2; /**< holds the value of a 2 byte integer property type */
|
||||
unsigned int integer4; /**< holds the value of a 4 byte integer property type */
|
||||
struct {
|
||||
MQTTLenString data; /**< The value of a string property, or the name of a user property. */
|
||||
MQTTLenString value; /**< The value of a user property. */
|
||||
};
|
||||
} value;
|
||||
} MQTTProperty;
|
||||
|
||||
/**
|
||||
* MQTT version 5 property list
|
||||
*/
|
||||
typedef struct MQTTProperties
|
||||
{
|
||||
int count; /**< number of property entries in the array */
|
||||
int max_count; /**< max number of properties that the currently allocated array can store */
|
||||
int length; /**< mbi: byte length of all properties */
|
||||
MQTTProperty *array; /**< array of properties */
|
||||
} MQTTProperties;
|
||||
|
||||
#define MQTTProperties_initializer {0, 0, 0, NULL}
|
||||
|
||||
/**
|
||||
* Returns the length of the properties structure when serialized ready for network transmission.
|
||||
* @param props an MQTT V5 property structure.
|
||||
* @return the length in bytes of the properties when serialized.
|
||||
*/
|
||||
int MQTTProperties_len(MQTTProperties* props);
|
||||
|
||||
/**
|
||||
* Add a property pointer to the property array. Memory is allocated in this function,
|
||||
* so MQTTClient_create or MQTTAsync_create must be called first to initialize the
|
||||
* internal heap tracking. Alternatively MQTTAsync_global_init() can be called first
|
||||
* or build with the HIGH_PERFORMANCE option which disables the heap tracking.
|
||||
* @param props The property list to add the property to.
|
||||
* @param prop The property to add to the list.
|
||||
* @return 0 on success, -1 on failure.
|
||||
*/
|
||||
LIBMQTT_API int MQTTProperties_add(MQTTProperties* props, const MQTTProperty* prop);
|
||||
|
||||
/**
|
||||
* Serialize the given property list to a character buffer, e.g. for writing to the network.
|
||||
* @param pptr pointer to the buffer - move the pointer as we add data
|
||||
* @param properties pointer to the property list, can be NULL
|
||||
* @return whether the write succeeded or not: number of bytes written, or < 0 on failure.
|
||||
*/
|
||||
int MQTTProperties_write(char** pptr, const MQTTProperties* properties);
|
||||
|
||||
/**
|
||||
* Reads a property list from a character buffer into an array.
|
||||
* @param properties pointer to the property list to be filled. Should be initalized but empty.
|
||||
* @param pptr pointer to the character buffer.
|
||||
* @param enddata pointer to the end of the character buffer so we don't read beyond.
|
||||
* @return 1 if the properties were read successfully.
|
||||
*/
|
||||
int MQTTProperties_read(MQTTProperties* properties, char** pptr, char* enddata);
|
||||
|
||||
/**
|
||||
* Free all memory allocated to the property list, including any to individual properties.
|
||||
* @param properties pointer to the property list.
|
||||
*/
|
||||
LIBMQTT_API void MQTTProperties_free(MQTTProperties* properties);
|
||||
|
||||
/**
|
||||
* Copy the contents of a property list, allocating additional memory if needed.
|
||||
* @param props pointer to the property list.
|
||||
* @return the duplicated property list.
|
||||
*/
|
||||
LIBMQTT_API MQTTProperties MQTTProperties_copy(const MQTTProperties* props);
|
||||
|
||||
/**
|
||||
* Checks if property list contains a specific property.
|
||||
* @param props pointer to the property list.
|
||||
* @param propid the property id to check for.
|
||||
* @return 1 if found, 0 if not.
|
||||
*/
|
||||
LIBMQTT_API int MQTTProperties_hasProperty(MQTTProperties *props, enum MQTTPropertyCodes propid);
|
||||
|
||||
/**
|
||||
* Returns the number of instances of a property id. Most properties can exist only once.
|
||||
* User properties and subscription ids can exist more than once.
|
||||
* @param props pointer to the property list.
|
||||
* @param propid the property id to check for.
|
||||
* @return the number of times found. Can be 0.
|
||||
*/
|
||||
LIBMQTT_API int MQTTProperties_propertyCount(MQTTProperties *props, enum MQTTPropertyCodes propid);
|
||||
|
||||
/**
|
||||
* Returns the integer value of a specific property. The property given must be a numeric type.
|
||||
* @param props pointer to the property list.
|
||||
* @param propid the property id to check for.
|
||||
* @return the integer value of the property. -9999999 on failure.
|
||||
*/
|
||||
LIBMQTT_API int MQTTProperties_getNumericValue(MQTTProperties *props, enum MQTTPropertyCodes propid);
|
||||
|
||||
/**
|
||||
* Returns the integer value of a specific property when it's not the only instance.
|
||||
* The property given must be a numeric type.
|
||||
* @param props pointer to the property list.
|
||||
* @param propid the property id to check for.
|
||||
* @param index the instance number, starting at 0.
|
||||
* @return the integer value of the property. -9999999 on failure.
|
||||
*/
|
||||
LIBMQTT_API int MQTTProperties_getNumericValueAt(MQTTProperties *props, enum MQTTPropertyCodes propid, int index);
|
||||
|
||||
/**
|
||||
* Returns a pointer to the property structure for a specific property.
|
||||
* @param props pointer to the property list.
|
||||
* @param propid the property id to check for.
|
||||
* @return the pointer to the property structure if found. NULL if not found.
|
||||
*/
|
||||
LIBMQTT_API MQTTProperty* MQTTProperties_getProperty(MQTTProperties *props, enum MQTTPropertyCodes propid);
|
||||
|
||||
/**
|
||||
* Returns a pointer to the property structure for a specific property when it's not the only instance.
|
||||
* @param props pointer to the property list.
|
||||
* @param propid the property id to check for.
|
||||
* @param index the instance number, starting at 0.
|
||||
* @return the pointer to the property structure if found. NULL if not found.
|
||||
*/
|
||||
LIBMQTT_API MQTTProperty* MQTTProperties_getPropertyAt(MQTTProperties *props, enum MQTTPropertyCodes propid, int index);
|
||||
|
||||
#endif /* MQTTPROPERTIES_H */
|
||||
79
MQTTReasonCodes.h
Normal file
79
MQTTReasonCodes.h
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2017, 2020 IBM Corp. and others
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(MQTTREASONCODES_H)
|
||||
#define MQTTREASONCODES_H
|
||||
|
||||
#include "MQTTExportDeclarations.h"
|
||||
|
||||
/** The MQTT V5 one byte reason code */
|
||||
enum MQTTReasonCodes {
|
||||
MQTTREASONCODE_SUCCESS = 0,
|
||||
MQTTREASONCODE_NORMAL_DISCONNECTION = 0,
|
||||
MQTTREASONCODE_GRANTED_QOS_0 = 0,
|
||||
MQTTREASONCODE_GRANTED_QOS_1 = 1,
|
||||
MQTTREASONCODE_GRANTED_QOS_2 = 2,
|
||||
MQTTREASONCODE_DISCONNECT_WITH_WILL_MESSAGE = 4,
|
||||
MQTTREASONCODE_NO_MATCHING_SUBSCRIBERS = 16,
|
||||
MQTTREASONCODE_NO_SUBSCRIPTION_FOUND = 17,
|
||||
MQTTREASONCODE_CONTINUE_AUTHENTICATION = 24,
|
||||
MQTTREASONCODE_RE_AUTHENTICATE = 25,
|
||||
MQTTREASONCODE_UNSPECIFIED_ERROR = 128,
|
||||
MQTTREASONCODE_MALFORMED_PACKET = 129,
|
||||
MQTTREASONCODE_PROTOCOL_ERROR = 130,
|
||||
MQTTREASONCODE_IMPLEMENTATION_SPECIFIC_ERROR = 131,
|
||||
MQTTREASONCODE_UNSUPPORTED_PROTOCOL_VERSION = 132,
|
||||
MQTTREASONCODE_CLIENT_IDENTIFIER_NOT_VALID = 133,
|
||||
MQTTREASONCODE_BAD_USER_NAME_OR_PASSWORD = 134,
|
||||
MQTTREASONCODE_NOT_AUTHORIZED = 135,
|
||||
MQTTREASONCODE_SERVER_UNAVAILABLE = 136,
|
||||
MQTTREASONCODE_SERVER_BUSY = 137,
|
||||
MQTTREASONCODE_BANNED = 138,
|
||||
MQTTREASONCODE_SERVER_SHUTTING_DOWN = 139,
|
||||
MQTTREASONCODE_BAD_AUTHENTICATION_METHOD = 140,
|
||||
MQTTREASONCODE_KEEP_ALIVE_TIMEOUT = 141,
|
||||
MQTTREASONCODE_SESSION_TAKEN_OVER = 142,
|
||||
MQTTREASONCODE_TOPIC_FILTER_INVALID = 143,
|
||||
MQTTREASONCODE_TOPIC_NAME_INVALID = 144,
|
||||
MQTTREASONCODE_PACKET_IDENTIFIER_IN_USE = 145,
|
||||
MQTTREASONCODE_PACKET_IDENTIFIER_NOT_FOUND = 146,
|
||||
MQTTREASONCODE_RECEIVE_MAXIMUM_EXCEEDED = 147,
|
||||
MQTTREASONCODE_TOPIC_ALIAS_INVALID = 148,
|
||||
MQTTREASONCODE_PACKET_TOO_LARGE = 149,
|
||||
MQTTREASONCODE_MESSAGE_RATE_TOO_HIGH = 150,
|
||||
MQTTREASONCODE_QUOTA_EXCEEDED = 151,
|
||||
MQTTREASONCODE_ADMINISTRATIVE_ACTION = 152,
|
||||
MQTTREASONCODE_PAYLOAD_FORMAT_INVALID = 153,
|
||||
MQTTREASONCODE_RETAIN_NOT_SUPPORTED = 154,
|
||||
MQTTREASONCODE_QOS_NOT_SUPPORTED = 155,
|
||||
MQTTREASONCODE_USE_ANOTHER_SERVER = 156,
|
||||
MQTTREASONCODE_SERVER_MOVED = 157,
|
||||
MQTTREASONCODE_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED = 158,
|
||||
MQTTREASONCODE_CONNECTION_RATE_EXCEEDED = 159,
|
||||
MQTTREASONCODE_MAXIMUM_CONNECT_TIME = 160,
|
||||
MQTTREASONCODE_SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED = 161,
|
||||
MQTTREASONCODE_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED = 162
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns a printable string description of an MQTT V5 reason code.
|
||||
* @param value an MQTT V5 reason code.
|
||||
* @return the printable string description of the input reason code.
|
||||
* NULL if the code was not found.
|
||||
*/
|
||||
LIBMQTT_API const char* MQTTReasonCode_toString(enum MQTTReasonCodes value);
|
||||
|
||||
#endif
|
||||
46
MQTTSubscribeOpts.h
Normal file
46
MQTTSubscribeOpts.h
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2018 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v2.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* https://www.eclipse.org/legal/epl-2.0/
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(SUBOPTS_H)
|
||||
#define SUBOPTS_H
|
||||
|
||||
/** The MQTT V5 subscribe options, apart from QoS which existed before V5. */
|
||||
typedef struct MQTTSubscribe_options
|
||||
{
|
||||
/** The eyecatcher for this structure. Must be MQSO. */
|
||||
char struct_id[4];
|
||||
/** The version number of this structure. Must be 0.
|
||||
*/
|
||||
int struct_version;
|
||||
/** To not receive our own publications, set to 1.
|
||||
* 0 is the original MQTT behaviour - all messages matching the subscription are received.
|
||||
*/
|
||||
unsigned char noLocal;
|
||||
/** To keep the retain flag as on the original publish message, set to 1.
|
||||
* If 0, defaults to the original MQTT behaviour where the retain flag is only set on
|
||||
* publications sent by a broker if in response to a subscribe request.
|
||||
*/
|
||||
unsigned char retainAsPublished;
|
||||
/** 0 - send retained messages at the time of the subscribe (original MQTT behaviour)
|
||||
* 1 - send retained messages on subscribe only if the subscription is new
|
||||
* 2 - do not send retained messages at all
|
||||
*/
|
||||
unsigned char retainHandling;
|
||||
} MQTTSubscribe_options;
|
||||
|
||||
#define MQTTSubscribe_options_initializer { {'M', 'Q', 'S', 'O'}, 0, 0, 0, 0 }
|
||||
|
||||
#endif
|
||||
15
MULTIPSK.c
15
MULTIPSK.c
|
|
@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ static void ConnecttoMPSKThread(void * portptr);
|
|||
void CreateMHWindow();
|
||||
int Update_MH_List(struct in_addr ipad, char * call, char proto);
|
||||
|
||||
static int ConnecttoMPSK(int port);
|
||||
static int ConnecttoMPSK();
|
||||
static int ProcessReceivedData(int bpqport);
|
||||
static int ProcessLine(char * buf, int Port);
|
||||
int KillTNC(struct TNCINFO * TNC);
|
||||
|
|
@ -71,6 +71,8 @@ static VOID SendData(struct TNCINFO * TNC, char * Msg, int MsgLen);
|
|||
static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg);
|
||||
VOID SendRPBeacon(struct TNCINFO * TNC);
|
||||
|
||||
char * strlop(char * buf, char delim);
|
||||
|
||||
extern UCHAR BPQDirectory[];
|
||||
|
||||
#define MAXMPSKPORTS 16
|
||||
|
|
@ -407,10 +409,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
|
||||
{
|
||||
char cmd[56];
|
||||
|
||||
strcpy(cmd, &buff->L2DATA[6]);
|
||||
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
|
||||
sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
|
||||
|
||||
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
|
||||
{
|
||||
|
|
@ -713,7 +712,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
|
|||
ptr=strchr(TNC->NodeCall, ' ');
|
||||
if (ptr) *(ptr) = 0; // Null Terminate
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK;
|
||||
TNC->Hardware = H_MPSK;
|
||||
|
||||
MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
|
||||
|
||||
|
|
@ -1542,7 +1541,7 @@ VOID CloseComplete(struct TNCINFO * TNC, int Stream)
|
|||
sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ char HRoute[100];
|
|||
char AMPRDomain[100];
|
||||
BOOL SendAMPRDirect = 0;
|
||||
|
||||
char SignoffMsg[120];
|
||||
char SignoffMsg[100];
|
||||
|
||||
char AbortedMsg[100]="\rOutput aborted\r";
|
||||
|
||||
|
|
@ -205,7 +205,6 @@ int MailForInterval = 0;
|
|||
char zeros[NBMASK]; // For forward bitmask tests
|
||||
|
||||
time_t MaintClock; // Time to run housekeeping
|
||||
time_t APIClock; // Time to sent to MOLTE's Database
|
||||
|
||||
struct MsgInfo * MsgnotoMsg[100000]; // Message Number to Message Slot List.
|
||||
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ struct Country Countries[] =
|
|||
"HKG", "ASIA", "AS", // Hong Kong Special Administrative Region of China
|
||||
"MAC", "ASIA", "AS", // Macao Special Administrative Region of China
|
||||
"COL", "ASIA", "SA", // Colombia
|
||||
// "COM", "SAFR", "AF", // Comoros
|
||||
"COM", "SAFR", "AF", // Comoros
|
||||
"COG", "CAFR", "AF", // Congo
|
||||
"COK", "SPAC", "OC", // Cook Islands
|
||||
"CRI", "CEAM", "NA", // Costa Rica
|
||||
|
|
|
|||
32
MailTCP.c
32
MailTCP.c
|
|
@ -1570,12 +1570,12 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
|
|||
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
|
||||
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
|
||||
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
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1591,7 +1591,7 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
|
|||
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
|
||||
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
|
||||
|
||||
continue;
|
||||
|
|
@ -2092,19 +2092,20 @@ int CreateSMTPMessage(SocketConn * sockptr, int i, char * MsgTitle, time_t Date,
|
|||
struct tm * tm;
|
||||
|
||||
tm = gmtime(&Date);
|
||||
|
||||
|
||||
sprintf(DateString, "%04d/%02d/%02d %02d:%02d",
|
||||
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min);
|
||||
|
||||
|
||||
if (strcmp(Msg->to, "RMS") == 0) // Address is in via
|
||||
strcpy(B2To, Msg->via);
|
||||
strcpy(B2To, Msg->via);
|
||||
else
|
||||
if (Msg->via[0])
|
||||
sprintf(B2To, "%s@%s", Msg->to, Msg->via);
|
||||
else
|
||||
if (Msg->via[0])
|
||||
sprintf(B2To, "%s@%s", Msg->to, Msg->via);
|
||||
else
|
||||
strcpy(B2To, Msg->to);
|
||||
strcpy(B2To, Msg->to);
|
||||
|
||||
|
||||
Msg->B2Flags = B2Msg | Attachments;
|
||||
|
||||
if (Msg->type == 'P')
|
||||
|
|
@ -2896,8 +2897,6 @@ SocketConn * SMTPConnect(char * Host, int Port, BOOL AMPR, struct MsgInfo * Msg,
|
|||
sinx.sin_addr.s_addr = INADDR_ANY;
|
||||
sinx.sin_port = 0;
|
||||
|
||||
sockptr->Timeout = 0;
|
||||
|
||||
if (bind(sockptr->socket, (LPSOCKADDR) &sinx, addrlen) != 0 )
|
||||
{
|
||||
//
|
||||
|
|
@ -3591,6 +3590,7 @@ VOID ProcessPOP3ClientMessage(SocketConn * sockptr, char * Buffer, int Len)
|
|||
if (sockptr->POP3MsgCount > sockptr->POP3MsgNum++)
|
||||
{
|
||||
sockprintf(sockptr, "RETR %d", sockptr->POP3MsgNum);
|
||||
|
||||
sockptr->State = WaitingForRETRResponse;
|
||||
}
|
||||
else
|
||||
|
|
@ -3933,12 +3933,12 @@ int CreatePOP3Message(char * From, char * To, char * MsgTitle, time_t Date, char
|
|||
|
||||
|
||||
if (strcmp(Msg->to, "RMS") == 0) // Address is in via
|
||||
strcpy(B2To, Msg->via);
|
||||
strcpy(B2To, Msg->via);
|
||||
else
|
||||
if (Msg->via[0])
|
||||
sprintf(B2To, "%s@%s", Msg->to, Msg->via);
|
||||
else
|
||||
if (Msg->via[0])
|
||||
sprintf(B2To, "%s@%s", Msg->to, Msg->via);
|
||||
else
|
||||
strcpy(B2To, Msg->to);
|
||||
strcpy(B2To, Msg->to);
|
||||
|
||||
|
||||
Msg->B2Flags = B2Msg | Attachments;
|
||||
|
|
|
|||
139
Moncode.c
139
Moncode.c
|
|
@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
// MSGFLAG contains CMD/RESPONSE BITS
|
||||
|
|
@ -59,7 +59,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define NODES_SIG 0xFF
|
||||
|
||||
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
|
||||
char * strlop(char * buf, char delim);
|
||||
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen);
|
||||
|
||||
char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen);
|
||||
UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
|
||||
|
|
@ -535,16 +536,6 @@ KC6OAR*>ID:
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -561,15 +552,6 @@ KC6OAR*>ID:
|
|||
|
||||
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
|
||||
{
|
||||
char Infofield[257];
|
||||
|
|
@ -655,13 +637,12 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
char Node[10];
|
||||
UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window;
|
||||
UCHAR * ptr = &ADJBUFFER->L2DATA[0];
|
||||
int service = 0;
|
||||
int netromx = 0; // Set if Paula's connect to service
|
||||
|
||||
if (ADJBUFFER->L2DATA[0] == NODES_SIG)
|
||||
{
|
||||
// Display NODES
|
||||
|
||||
|
||||
// If an INP3 RIF (type <> UI) decode as such
|
||||
|
||||
if (ADJBUFFER->CTL != 3) // UI
|
||||
|
|
@ -692,14 +673,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
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
|
||||
|
||||
Output += sprintf((char *)Output, " NET/ROM\r ");
|
||||
|
|
@ -723,12 +696,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
|
||||
switch (OpCode)
|
||||
{
|
||||
|
||||
case L4CREQX: // Paula's connect to service
|
||||
|
||||
netromx = 1;
|
||||
service = (RXNO << 8) | TXNO;
|
||||
|
||||
case L4CREQ:
|
||||
|
||||
Window = *(ptr++);
|
||||
|
|
@ -737,10 +704,7 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
Node[ConvFromAX25(ptr, Node)] = 0;
|
||||
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
|
||||
{
|
||||
|
|
@ -755,7 +719,7 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
if (Flags & L4BUSY) // BUSY RETURNED
|
||||
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:
|
||||
|
||||
|
|
@ -765,10 +729,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
|
||||
return Output + sprintf((char *)Output, " <DISC ACK>");
|
||||
|
||||
case L4RESET:
|
||||
|
||||
return Output + sprintf((char *)Output, " <RESET>");
|
||||
|
||||
case L4INFO:
|
||||
{
|
||||
char Infofield[257];
|
||||
|
|
@ -787,9 +747,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
|
|||
if (Flags & L4MORE)
|
||||
*(Output++) = 'M';
|
||||
|
||||
if (Flags & L4COMP)
|
||||
*(Output++) = 'C';
|
||||
|
||||
MsgLen = MsgLen - (19 + sizeof(void *));
|
||||
|
||||
if (MsgLen < 0 || MsgLen > 257)
|
||||
|
|
@ -1003,87 +960,3 @@ char * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -919,9 +919,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
DoRefresh(Cinfo);
|
||||
|
||||
Cinfo->Console->bytesRxed += Cinfo->kbptr+1;
|
||||
|
||||
|
||||
if (Cinfo->Console->SysopChatStream)
|
||||
SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1);
|
||||
else
|
||||
|
|
@ -944,30 +941,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
16
Multicast.c
16
Multicast.c
|
|
@ -612,16 +612,16 @@ struct MSESSION * FindMSession(unsigned int Key)
|
|||
|
||||
#define LZMA_STR "\1LZMA"
|
||||
|
||||
UCHAR * LZUncompress(UCHAR * Decoded, size_t Len, size_t * NewLen)
|
||||
UCHAR * LZUncompress(UCHAR * Decoded, int Len, int * NewLen)
|
||||
{
|
||||
unsigned char * buf;
|
||||
unsigned char inprops[LZMA_PROPS_SIZE];
|
||||
size_t inlen;
|
||||
int r;
|
||||
|
||||
size_t rlen = 0;
|
||||
size_t outlen;
|
||||
|
||||
UINT rlen;
|
||||
UINT outlen;
|
||||
|
||||
memcpy(&rlen, &Decoded[5], 4);
|
||||
|
||||
outlen = ntohl(rlen);
|
||||
|
|
@ -668,8 +668,8 @@ void SaveMulticastMessage(struct MSESSION * MSession)
|
|||
{
|
||||
UCHAR * Decoded = NULL; // Output from Basexxx decode
|
||||
UCHAR * Uncompressed = NULL;
|
||||
size_t DecodedLen; // Length of decoded message
|
||||
size_t UncompressedLen; // Length of decompressed message
|
||||
int DecodedLen; // Length of decoded message
|
||||
int UncompressedLen; // Length of decompressed message
|
||||
int ExpectedLen; // From front of Base128 or Base256 message
|
||||
int HddrLen; // Length of Expected Len Header
|
||||
|
||||
|
|
@ -1612,7 +1612,7 @@ int MulticastStatusHTML(char * Reply)
|
|||
if (Sess ==NULL)
|
||||
return 0;
|
||||
|
||||
Len = sprintf(Reply, "%s", StatusPage);
|
||||
Len = sprintf(Reply, StatusPage);
|
||||
|
||||
while (Sess)
|
||||
{
|
||||
|
|
@ -1670,7 +1670,7 @@ int MulticastStatusHTML(char * Reply)
|
|||
Sess = Sess->Next;
|
||||
}
|
||||
|
||||
Len += sprintf(&Reply[Len], "%s", StatusTail);
|
||||
Len += sprintf(&Reply[Len], StatusTail);
|
||||
|
||||
return Len;
|
||||
}
|
||||
|
|
|
|||
608
NETROMTCP.c
608
NETROMTCP.c
|
|
@ -1,608 +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);
|
||||
void NetromTCPTrace(struct _MESSAGE * Message, char * Dirn);
|
||||
|
||||
extern SOCKET NodeAPISocket;
|
||||
|
||||
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;
|
||||
char farCall[10];
|
||||
|
||||
farCall[ConvFromAX25(Route->NEIGHBOUR_CALL, farCall)] = 0;
|
||||
|
||||
// Debugprintf("Opening NRTCP Connection to %s", farCall);
|
||||
|
||||
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, farCall, 10);
|
||||
Route->NEIGHBOUR_LINK = Info->LINK;
|
||||
|
||||
Info->Route = Route;
|
||||
Info->LINK->NEIGHBOUR = Route;
|
||||
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
|
||||
}
|
||||
|
||||
return NETROMTCPConnect(Route, sockptr);
|
||||
|
||||
}
|
||||
|
||||
void NETROMTCPResolve()
|
||||
{
|
||||
struct ROUTE * Route = NEIGHBOURS;
|
||||
int n = MAXNEIGHBOURS;
|
||||
struct addrinfo hints, *res = 0;
|
||||
char PortString[20];
|
||||
int err;
|
||||
|
||||
while (n--)
|
||||
{
|
||||
if (Route->TCPAddress)
|
||||
{
|
||||
// try to resolve host
|
||||
|
||||
sprintf(PortString, "%d", Route->TCPPort);
|
||||
|
||||
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);
|
||||
|
||||
err = WSAGetLastError();
|
||||
|
||||
if (res)
|
||||
{
|
||||
Route->TCPAddress->ai_family = res->ai_family;
|
||||
Route->TCPAddress->ai_socktype = res->ai_socktype;
|
||||
Route->TCPAddress->ai_protocol = res->ai_protocol;
|
||||
Route->TCPAddress->ai_addrlen = res->ai_addrlen;
|
||||
memcpy(Route->TCPAddress->ai_addr, res->ai_addr, sizeof(struct sockaddr));
|
||||
freeaddrinfo(res);
|
||||
}
|
||||
}
|
||||
|
||||
Route++;
|
||||
}
|
||||
}
|
||||
|
||||
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 * res = Route->TCPAddress;
|
||||
int Port = Route->TCPPort;
|
||||
|
||||
sprintf(PortString, "%d", Port);
|
||||
|
||||
// get host info, make socket, and connect it
|
||||
|
||||
if (res->ai_family == 0)
|
||||
{
|
||||
// err = WSAGetLastError();
|
||||
// Debugprintf("Resolve HostName %s Failed - Error %d", Route->TCPHost, err);
|
||||
return FALSE; // Resolve failed
|
||||
}
|
||||
|
||||
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, ¶m);
|
||||
|
||||
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;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
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.
|
||||
|
||||
// Debugprintf("New NRTCP Connection from %s", Msg->Call);
|
||||
|
||||
memcpy(Info->Call, Msg->Call, 10);
|
||||
|
||||
ConvToAX25(Msg->Call, axCall);
|
||||
|
||||
if (FindNeighbour(axCall, portNo, &Route))
|
||||
{
|
||||
Info->Route = Route;
|
||||
Route->NEIGHBOUR_LINK = Info->LINK;
|
||||
Route->NEIGHBOUR_PORT = portNo;
|
||||
Info->LINK->NEIGHBOUR = Route;
|
||||
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(portNo);
|
||||
Route->TCPSession = Info;
|
||||
Info->LINK->L2STATE = 5;
|
||||
|
||||
if (Info->Route->INP3Node)
|
||||
SendRTTMsg(Info->Route);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debugprintf("Neighbour %s port %d not found - closing connection", Msg->Call, portNo);
|
||||
closesocket(sockptr->socket);
|
||||
sockptr->SocketActive = FALSE;
|
||||
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
||||
Info->Call[0] = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (memcmp(Info->Call, Msg->Call, 10) != 0)
|
||||
{
|
||||
Debugprintf("NRTCP Mismatch - closing connection");
|
||||
|
||||
closesocket(sockptr->socket);
|
||||
sockptr->SocketActive = FALSE;
|
||||
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
||||
Info->Call[0] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 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 = portNo;
|
||||
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);
|
||||
|
||||
if(NodeAPISocket)
|
||||
NetromTCPTrace(Buffer, "rcvd");
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
if(NodeAPISocket)
|
||||
NetromTCPTrace(Buffer, "sent");
|
||||
|
||||
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
|
||||
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);
|
||||
|
||||
if (Route)
|
||||
Route->TCPSession = 0;
|
||||
|
||||
Info->Call[0] = 0;
|
||||
Info->LINK->L2STATE = 0;
|
||||
}
|
||||
|
||||
sockptr->SocketActive = FALSE;
|
||||
|
||||
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
||||
}
|
||||
|
||||
|
|
@ -25,10 +25,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
VOID ReleaseSock(SOCKET sock);
|
||||
void MQTTMessageEvent(void* message);
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
|
||||
struct NNTPRec * FirstNNTPRec = NULL;
|
||||
|
||||
|
|
@ -356,12 +352,6 @@ int CreateNNTPMessage(char * From, char * To, char * MsgTitle, time_t Date, char
|
|||
|
||||
BuildNNTPList(Msg); // Build NNTP Groups list
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
|
||||
return CreateSMTPMessageFile(MsgBody, Msg);
|
||||
|
||||
}
|
||||
|
|
|
|||
BIN
PG/Loop.obj
Normal file
BIN
PG/Loop.obj
Normal file
Binary file not shown.
BIN
PG/PGTest.obj
Normal file
BIN
PG/PGTest.obj
Normal file
Binary file not shown.
|
|
@ -60,7 +60,7 @@ TODo ?Multiple Adapters
|
|||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#include "ipcode.h"
|
||||
|
||||
|
|
|
|||
799
RHP.c
799
RHP.c
|
|
@ -1,799 +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
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Paula (G8PZT)'s Remote Host Protocol interface.
|
||||
For now only sufficient support for WhatsPac
|
||||
|
||||
|
||||
*/
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "bpq32.h"
|
||||
#include "telnetserver.h"
|
||||
|
||||
int FindFreeStreamNoSem();
|
||||
DllExport int APIENTRY DeallocateStream(int stream);
|
||||
int SendMsgNoSem(int stream, char * msg, int len);
|
||||
|
||||
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len);
|
||||
static int GetJSONInt(char * _REPLYBUFFER, char * Name);
|
||||
|
||||
// Generally Can have multiple RHP connections and each can have multiple RHF Sessions
|
||||
|
||||
struct RHPSessionInfo
|
||||
{
|
||||
struct ConnectionInfo * sockptr;
|
||||
SOCKET Socket; // Websocks Socket
|
||||
int BPQStream;
|
||||
int Handle; // RHP session ID
|
||||
int Seq;
|
||||
char Local[12];
|
||||
char Remote[12];
|
||||
BOOL Connecting; // Set while waiting for connection to complete
|
||||
BOOL Listening;
|
||||
BOOL Connected;
|
||||
int Busy;
|
||||
};
|
||||
|
||||
struct RHPConnectionInfo
|
||||
{
|
||||
SOCKET socket;
|
||||
struct RHPSessionInfo ** RHPSessions;
|
||||
int NumberofRHPSessions;
|
||||
};
|
||||
|
||||
// Struct passed by beginhread
|
||||
|
||||
struct RHPParamBlock
|
||||
{
|
||||
unsigned char * Msg;
|
||||
int Len;
|
||||
SOCKET Socket;
|
||||
struct ConnectionInfo * sockptr;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//struct RHPConnectionInfo ** RHPSockets = NULL;
|
||||
//int NumberofRHPConnections = 0;
|
||||
|
||||
struct RHPSessionInfo ** RHPSessions;
|
||||
int NumberofRHPSessions;
|
||||
|
||||
char ErrCodes[18][24] =
|
||||
{
|
||||
"Ok",
|
||||
"Unspecified",
|
||||
"Bad or missing type",
|
||||
"Invalid handle",
|
||||
"No memory",
|
||||
"Bad or missing mode",
|
||||
"Invalid local address",
|
||||
"Invalid remote address" ,
|
||||
"Bad or missing family" ,
|
||||
"Duplicate socket" ,
|
||||
"No such port" ,
|
||||
"Invalid protocol" ,
|
||||
"Bad parameter" ,
|
||||
"No buffers" ,
|
||||
"Unauthorised" ,
|
||||
"No Route" ,
|
||||
"Operation not supported"};
|
||||
|
||||
|
||||
|
||||
|
||||
extern char pgm[256];
|
||||
|
||||
SOCKET agwsock;
|
||||
|
||||
extern int SemHeldByAPI;
|
||||
|
||||
char szBuff[80];
|
||||
|
||||
int WhatsPacConfigured = 1;
|
||||
|
||||
|
||||
int RHPPaclen = 236;
|
||||
|
||||
|
||||
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer);
|
||||
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
|
||||
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
|
||||
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer);
|
||||
|
||||
|
||||
|
||||
void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
|
||||
{
|
||||
int Loops = 0;
|
||||
int Sent;
|
||||
int TxLen;
|
||||
char * OutBuffer = Msg;
|
||||
|
||||
// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
|
||||
|
||||
if (Len < 126)
|
||||
{
|
||||
// Two Byte Header
|
||||
|
||||
OutBuffer[8] = 0x81; // Fin, Data
|
||||
OutBuffer[9] = Len;
|
||||
|
||||
TxLen = Len + 2;
|
||||
OutBuffer = &Msg[8];
|
||||
}
|
||||
else if (Len < 65536)
|
||||
{
|
||||
OutBuffer[6] = 0x81; // Fin, Data
|
||||
OutBuffer[7] = 126; // Unmasked, Extended Len 16
|
||||
OutBuffer[8] = Len >> 8;
|
||||
OutBuffer[9] = Len & 0xff;
|
||||
TxLen = Len + 4;
|
||||
OutBuffer = &Msg[6];
|
||||
}
|
||||
else
|
||||
{
|
||||
OutBuffer[0] = 0x81; // Fin, Data
|
||||
OutBuffer[1] = 127; // Unmasked, Extended Len 64 bits
|
||||
// Len is 32 bits, so pad with zeros
|
||||
OutBuffer[2] = 0;
|
||||
OutBuffer[3] = 0;
|
||||
OutBuffer[4] = 0;
|
||||
OutBuffer[5] = 0;
|
||||
OutBuffer[6] = (Len >> 24) & 0xff;
|
||||
OutBuffer[7] = (Len >> 16) & 0xff;
|
||||
OutBuffer[8] = (Len >> 8) & 0xff;
|
||||
OutBuffer[9] = Len & 0xff;
|
||||
|
||||
TxLen = Len + + 10;
|
||||
OutBuffer = &Msg[0];
|
||||
}
|
||||
|
||||
// Send may block
|
||||
|
||||
Sent = send(socket, OutBuffer, TxLen, 0);
|
||||
|
||||
while (Sent != TxLen && Loops++ < 3000) // 100 secs max
|
||||
{
|
||||
if (Sent > 0) // something sent
|
||||
{
|
||||
TxLen -= Sent;
|
||||
memmove(OutBuffer, &OutBuffer[Sent], TxLen);
|
||||
}
|
||||
|
||||
Sleep(30);
|
||||
Sent = send(socket, OutBuffer, TxLen, 0);
|
||||
if (Sent == -1)
|
||||
break;
|
||||
}
|
||||
|
||||
free(Msg);
|
||||
return;
|
||||
}
|
||||
|
||||
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen);
|
||||
|
||||
void RHPThread(void * Params)
|
||||
{
|
||||
// Params and data buffer are malloced blocks so free when done with it
|
||||
|
||||
struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
|
||||
|
||||
ProcessRHPWebSock(Block->sockptr, Block->Socket, Block->Msg, Block->Len);
|
||||
|
||||
free(Block->Msg);
|
||||
free(Params);
|
||||
}
|
||||
|
||||
int RHPProcessHTTPMessage(void * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
|
||||
{
|
||||
// RHP messages can be sent over Websocks or normal http but I think WhatsPac only uses WebSocks
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen)
|
||||
{
|
||||
int Loops = 0;
|
||||
int InputLen = 0;
|
||||
int Len;
|
||||
|
||||
char Value[16];
|
||||
char * OutBuffer = malloc(250000);
|
||||
|
||||
// struct RHPConnectionInfo * RHPSocket = NULL;
|
||||
// int n;
|
||||
|
||||
Msg[MsgLen] = 0;
|
||||
|
||||
// Find Connection Record. If none, create one
|
||||
|
||||
// I dont think I need connection records
|
||||
|
||||
/*
|
||||
for (n = 0; n < NumberofRHPConnections; n++)
|
||||
{
|
||||
if (RHPSockets[n]->socket == socket)
|
||||
{
|
||||
RHPSocket = RHPSockets[n];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (RHPSocket == 0)
|
||||
{
|
||||
// See if there is an old one we can reuse
|
||||
|
||||
for (n = 0; n < NumberofRHPConnections; n++)
|
||||
{
|
||||
if (RHPSockets[n]-Socket == -1)
|
||||
{
|
||||
RHPSocket = RHPSockets[n];
|
||||
RHP
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (RHPSocket == 0)
|
||||
|
||||
NumberofRHPConnections;
|
||||
RHPSockets = realloc(RHPSockets, sizeof(void *) * (NumberofRHPConnections + 1));
|
||||
RHPSocket = RHPSockets[NumberofRHPConnections] = zalloc(sizeof (struct RHPConnectionInfo));
|
||||
NumberofRHPConnections++;
|
||||
RHPSocket->socket = socket;
|
||||
}
|
||||
*/
|
||||
|
||||
// {"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
|
||||
// {"type": "openReply", "id": 82, "handle": 1, "errCode": 0, "errText": "Ok"}
|
||||
// {"seqno": 0, "type": "status", "handle": 1, "flags": 0}
|
||||
// ("seqno": 1, "type": "close", "handle": 1}
|
||||
// {"id":40,"type":"close","handle":1}
|
||||
|
||||
// {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
|
||||
// {"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
|
||||
|
||||
// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 12, "errtext": "invalid handle"}. It
|
||||
// {type: 'keepalive'} if there has been no other activity for nearly 3 minutes. Replies with {"type": "keepaliveReply"}
|
||||
|
||||
GetJSONValue(Msg, "\"type\":", Value, 15);
|
||||
|
||||
if (_stricmp(Value, "open") == 0)
|
||||
{
|
||||
Len = processRHCPOpen(sockptr, Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||
if (Len)
|
||||
SendWebSockMessage(Socket, OutBuffer, Len);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_stricmp(Value, "send") == 0)
|
||||
{
|
||||
Len = processRHCPSend(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||
SendWebSockMessage(Socket, OutBuffer, Len);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_stricmp(Value, "close") == 0)
|
||||
{
|
||||
Len = processRHCPClose(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||
SendWebSockMessage(Socket, OutBuffer, Len);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_stricmp(Value, "status") == 0)
|
||||
{
|
||||
Len = processRHCPStatus(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
|
||||
SendWebSockMessage(Socket, OutBuffer, Len);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_stricmp(Value, "keepalive") == 0)
|
||||
{
|
||||
Len = sprintf(&OutBuffer[10], "{\"type\": \"keepaliveReply\"}"); // Space at front for WebSock Header
|
||||
SendWebSockMessage(Socket, OutBuffer, Len);
|
||||
return;
|
||||
}
|
||||
|
||||
Debugprintf("Unrecognised RHP Message - %s", Msg);
|
||||
}
|
||||
|
||||
void ProcessRHPWebSockClosed(SOCKET socket)
|
||||
{
|
||||
// Close any connections on this scoket and delete socket entry
|
||||
|
||||
struct RHPSessionInfo * RHPSession = 0;
|
||||
int n;
|
||||
|
||||
// Find and close any Sessions
|
||||
|
||||
for (n = 0; n < NumberofRHPSessions; n++)
|
||||
{
|
||||
if (RHPSessions[n]->Socket == socket)
|
||||
{
|
||||
RHPSession = RHPSessions[n];
|
||||
|
||||
if (RHPSession->BPQStream)
|
||||
{
|
||||
Disconnect(RHPSession->BPQStream);
|
||||
DeallocateStream(RHPSession->BPQStream);
|
||||
|
||||
RHPSession->BPQStream = 0;
|
||||
|
||||
}
|
||||
|
||||
RHPSession->Connecting = 0;
|
||||
|
||||
// We can't send a close to RHP endpont as socket has gone
|
||||
|
||||
RHPSession->Connected = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer)
|
||||
{
|
||||
//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
|
||||
|
||||
struct RHPSessionInfo * RHPSession = 0;
|
||||
|
||||
char * Value = malloc(strlen(Msg)); // Will always be long enough
|
||||
int ID;
|
||||
|
||||
char pfam[16];
|
||||
char Mode[16];
|
||||
int Port;
|
||||
char Local[16];
|
||||
char Remote[16];
|
||||
int flags;
|
||||
int Handle = 1;
|
||||
int Stream;
|
||||
unsigned char AXCall[10];
|
||||
|
||||
int n;
|
||||
|
||||
// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
|
||||
|
||||
ID = GetJSONInt(Msg, "\"id\":");
|
||||
GetJSONValue(Msg, "\"pfam\":", pfam, 15);
|
||||
GetJSONValue(Msg, "\"mode\":", Mode, 15);
|
||||
Port = GetJSONInt(Msg, "\"port\":");
|
||||
GetJSONValue(Msg, "\"local\":", Local, 15);
|
||||
GetJSONValue(Msg, "\"remote\":", Remote, 15);
|
||||
flags = GetJSONInt(Msg, "\"flags\":");
|
||||
|
||||
if (_stricmp(pfam, "ax25") != 0)
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
|
||||
|
||||
if (_stricmp(Mode, "stream") == 0)
|
||||
{
|
||||
{
|
||||
// Allocate a RHP Session
|
||||
|
||||
// See if there is an old one we can reuse
|
||||
|
||||
for (n = 0; n < NumberofRHPSessions; n++)
|
||||
{
|
||||
if (RHPSessions[n]->BPQStream == 0)
|
||||
{
|
||||
RHPSession = RHPSessions[n];
|
||||
Handle = n + 1;
|
||||
Stream = RHPSessions[n]->BPQStream;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (RHPSession == 0)
|
||||
{
|
||||
RHPSessions = realloc(RHPSessions, sizeof(void *) * (NumberofRHPSessions + 1));
|
||||
RHPSession = RHPSessions[NumberofRHPSessions] = zalloc(sizeof (struct RHPSessionInfo));
|
||||
NumberofRHPSessions++;
|
||||
|
||||
Handle = NumberofRHPSessions;
|
||||
}
|
||||
|
||||
strcpy(pgm, "RHP");
|
||||
Stream = FindFreeStream();
|
||||
strcpy(pgm, "bpq32.exe");
|
||||
|
||||
if (Stream == 255)
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
|
||||
|
||||
RHPSession->BPQStream = Stream;
|
||||
RHPSession->Handle = Handle;
|
||||
RHPSession->Connecting = TRUE;
|
||||
RHPSession->Socket = Socket;
|
||||
RHPSession->sockptr = sockptr;
|
||||
|
||||
strcpy(RHPSession->Local, Local);
|
||||
strcpy(RHPSession->Remote, Remote);
|
||||
|
||||
Connect(Stream);
|
||||
|
||||
ConvToAX25(Local, AXCall);
|
||||
ChangeSessionCallsign(Stream, AXCall);
|
||||
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\"}", ID, Handle);
|
||||
}
|
||||
}
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
|
||||
}
|
||||
|
||||
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
|
||||
{
|
||||
// {"type":"send","handle":1,"data":";;;;;;\r","id":70}
|
||||
|
||||
struct RHPSessionInfo * RHPSession;
|
||||
|
||||
int ID;
|
||||
char * Data;
|
||||
char * ptr;
|
||||
unsigned char * uptr;
|
||||
int c;
|
||||
int Len;
|
||||
unsigned int HexCode1;
|
||||
unsigned int HexCode2;
|
||||
|
||||
int n;
|
||||
|
||||
int Handle = 1;
|
||||
|
||||
Data = malloc(strlen(Msg));
|
||||
|
||||
ID = GetJSONInt(Msg, "\"id\":");
|
||||
Handle = GetJSONInt(Msg, "\"handle\":");
|
||||
GetJSONValue(Msg, "\"data\":", Data, strlen(Msg) - 1);
|
||||
|
||||
if (Handle < 1 || Handle > NumberofRHPSessions)
|
||||
{
|
||||
free(Data);
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle);
|
||||
}
|
||||
|
||||
RHPSession = RHPSessions[Handle - 1];
|
||||
|
||||
// Look for \ escapes, Can now also get \u00c3
|
||||
|
||||
ptr = Data;
|
||||
Len = strlen(Data); // in case no escapes
|
||||
|
||||
while (ptr = strchr(ptr, '\\'))
|
||||
{
|
||||
c = ptr[1];
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'r':
|
||||
|
||||
*ptr = 13;
|
||||
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
|
||||
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 '\\':
|
||||
|
||||
*ptr = '\\';
|
||||
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
|
||||
break;
|
||||
|
||||
case '"':
|
||||
|
||||
*ptr = '"';
|
||||
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
|
||||
break;
|
||||
}
|
||||
ptr++;
|
||||
Len = ptr - Data;
|
||||
}
|
||||
|
||||
ptr = Data;
|
||||
|
||||
while (Len > RHPPaclen)
|
||||
{
|
||||
SendMsg(RHPSession->BPQStream, ptr, RHPPaclen);
|
||||
Len -= RHPPaclen;
|
||||
ptr += RHPPaclen;
|
||||
}
|
||||
|
||||
SendMsg(RHPSession->BPQStream, ptr, Len);
|
||||
|
||||
free(Data);
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
|
||||
}
|
||||
|
||||
|
||||
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
|
||||
{
|
||||
|
||||
// {"id":70,"type":"close","handle":1}
|
||||
|
||||
|
||||
struct RHPSessionInfo * RHPSession;
|
||||
|
||||
int ID;
|
||||
int Handle = 1;
|
||||
|
||||
char * OutBuffer = malloc(256);
|
||||
|
||||
ID = GetJSONInt(Msg, "\"id\":");
|
||||
Handle = GetJSONInt(Msg, "\"handle\":");
|
||||
|
||||
if (Handle < 1 || Handle > NumberofRHPSessions)
|
||||
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle);
|
||||
|
||||
|
||||
RHPSession = RHPSessions[Handle - 1];
|
||||
Disconnect(RHPSession->BPQStream);
|
||||
RHPSession->Connected = 0;
|
||||
RHPSession->Connecting = 0;
|
||||
|
||||
DeallocateStream(RHPSession->BPQStream);
|
||||
RHPSession->BPQStream = 0;
|
||||
|
||||
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
|
||||
}
|
||||
|
||||
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer)
|
||||
{
|
||||
// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 3, "errtext": "invalid handle"}. It
|
||||
|
||||
struct RHPSessionInfo * RHPSession;
|
||||
int Handle = 0;
|
||||
|
||||
Handle = GetJSONInt(Msg, "\"handle\":");
|
||||
|
||||
if (Handle < 1 || Handle > NumberofRHPSessions)
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"statusReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", Handle);
|
||||
|
||||
RHPSession = RHPSessions[Handle - 1];
|
||||
|
||||
return sprintf(ReplyBuffer, "{\"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Handle);
|
||||
|
||||
}
|
||||
|
||||
char toHex[] = "0123456789abcdef";
|
||||
|
||||
void RHPPoll()
|
||||
{
|
||||
int Stream;
|
||||
int n;
|
||||
int state, change;
|
||||
int Len;
|
||||
char * RHPMsg;
|
||||
unsigned char Buffer[2048]; // Space to escape control chars
|
||||
int pktlen, count;
|
||||
|
||||
struct RHPSessionInfo * RHPSession;
|
||||
|
||||
for (n = 0; n < NumberofRHPSessions; n++)
|
||||
{
|
||||
RHPSession = RHPSessions[n];
|
||||
Stream = RHPSession->BPQStream;
|
||||
|
||||
// See if connected state has changed
|
||||
|
||||
SessionState(Stream, &state, &change);
|
||||
|
||||
if (change == 1)
|
||||
{
|
||||
if (state == 1)
|
||||
{
|
||||
// Connected
|
||||
|
||||
RHPSession->Seq = 0;
|
||||
RHPSession->Connecting = FALSE;
|
||||
RHPSession->Connected = TRUE;
|
||||
|
||||
RHPMsg = malloc(256);
|
||||
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Seq++, RHPSession->Handle);
|
||||
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
|
||||
|
||||
// Send RHP CTEXT
|
||||
|
||||
RHPMsg = malloc(256);
|
||||
Sleep(10); // otherwise WhatsPac doesn't display connected
|
||||
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"Connected to RHP Server\\r\"}", RHPSession->Seq++, RHPSession->Handle);
|
||||
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Disconnected. Send Close to client
|
||||
|
||||
RHPMsg = malloc(256);
|
||||
Len = sprintf(&RHPMsg[10], "{\"type\": \"close\", \"seqno\": %d, \"handle\": %d}", RHPSession->Seq++, RHPSession->Handle);
|
||||
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
|
||||
|
||||
RHPSession->Connected = 0;
|
||||
RHPSession->Connecting = 0;
|
||||
|
||||
DeallocateStream(RHPSession->BPQStream);
|
||||
RHPSession->BPQStream = 0;
|
||||
}
|
||||
}
|
||||
do
|
||||
{
|
||||
GetMsg(Stream, Buffer, &pktlen, &count);
|
||||
|
||||
if (pktlen > 0)
|
||||
{
|
||||
char * ptr = Buffer;
|
||||
unsigned char c;
|
||||
|
||||
Buffer[pktlen] = 0;
|
||||
|
||||
RHPSession->sockptr->LastSendTime = time(NULL);
|
||||
|
||||
|
||||
// Message is JSON so Convert CR to \r, \ to \\ " to \"
|
||||
|
||||
// Looks like I need to escape everything not between 0x20 and 0x7f eg \u00c3
|
||||
|
||||
|
||||
while (c = *(ptr))
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 13:
|
||||
|
||||
memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
|
||||
*(ptr++) = '\\';
|
||||
*(ptr++) = 'r';
|
||||
break;
|
||||
|
||||
case '"':
|
||||
|
||||
memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
|
||||
*(ptr++) = '\\';
|
||||
*(ptr++) = '"';
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
|
||||
memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
|
||||
*(ptr++) = '\\';
|
||||
*(ptr++) = '\\';
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
if (c > 127)
|
||||
{
|
||||
memmove(ptr + 6, ptr + 1, strlen(ptr) + 1);
|
||||
*(ptr++) = '\\';
|
||||
*(ptr++) = 'u';
|
||||
*(ptr++) = '0';
|
||||
*(ptr++) = '0';
|
||||
*(ptr++) = toHex[c >> 4];
|
||||
*(ptr++) = toHex[c & 15];
|
||||
break;
|
||||
}
|
||||
else
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
RHPMsg = malloc(2048);
|
||||
|
||||
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"%s\"}", RHPSession->Seq++, RHPSession->Handle, Buffer);
|
||||
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
while (count > 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len)
|
||||
{
|
||||
char * ptr1, * ptr2;
|
||||
|
||||
Value[0] = 0;
|
||||
|
||||
ptr1 = strstr(_REPLYBUFFER, Name);
|
||||
|
||||
if (ptr1 == 0)
|
||||
return;
|
||||
|
||||
ptr1 += (strlen(Name) + 1);
|
||||
|
||||
// "data":"{\"t\":\"c\",\"n\":\"John\",\"c\":\"G8BPQ\",\"lm\":1737912636,\"le\":1737883907,\"led\":1737758451,\"v\":0.33,\"cc\":[{\"cid\":1,\"lp\":1737917257201,\"le\":1737913735726,\"led\":1737905249785},{\"cid\":0,\"lp\":1737324074107,\"le\":1737323831510,\"led\":1737322973662},{\"cid\":5,\"lp\":1737992107419,\"le\":1737931466510,\"led\":1737770056244}]}\r","id":28}
|
||||
|
||||
// There may be escaped " in data stream
|
||||
|
||||
ptr2 = strchr(ptr1, '"');
|
||||
|
||||
while (*(ptr2 - 1) == '\\')
|
||||
{
|
||||
ptr2 = strchr(ptr2 + 2, '"');
|
||||
}
|
||||
|
||||
|
||||
if (ptr2)
|
||||
{
|
||||
size_t ValLen = ptr2 - ptr1;
|
||||
if (ValLen > Len)
|
||||
ValLen = Len;
|
||||
|
||||
memcpy(Value, ptr1, ValLen);
|
||||
Value[ValLen] = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int GetJSONInt(char * _REPLYBUFFER, char * Name)
|
||||
{
|
||||
char * ptr1;
|
||||
|
||||
ptr1 = strstr(_REPLYBUFFER, Name);
|
||||
|
||||
if (ptr1 == 0)
|
||||
return 0;
|
||||
|
||||
ptr1 += (strlen(Name));
|
||||
|
||||
return atoi(ptr1);
|
||||
}
|
||||
|
||||
|
||||
0
RTKnown.txt
Normal file
0
RTKnown.txt
Normal file
104
RigControl.c
104
RigControl.c
|
|
@ -48,7 +48,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdlib.h>
|
||||
#include "time.h"
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
#ifdef WIN32
|
||||
#include <commctrl.h>
|
||||
|
|
@ -110,7 +110,7 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT);
|
|||
int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr);
|
||||
void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length);
|
||||
VOID HAMLIBPoll(struct RIGPORTINFO * PORT);
|
||||
void HAMLIBSlaveThread(VOID * Param);
|
||||
void HAMLIBSlaveThread(struct RIGINFO * RIG);
|
||||
void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT);
|
||||
VOID RTLUDPPoll(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 SetupPortRIGPointers();
|
||||
VOID PTTCATThread(void * Param);
|
||||
|
||||
VOID PTTCATThread(struct RIGINFO *RIG);
|
||||
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT);
|
||||
|
||||
// ----- G7TAJ ----
|
||||
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT);
|
||||
|
|
@ -324,7 +324,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
|
|||
|
||||
// Convert to CAT string
|
||||
|
||||
sprintf(FreqString, "%012lld", txfreq);
|
||||
sprintf(FreqString, "%012d", txfreq);
|
||||
|
||||
switch (PORT->PortType)
|
||||
{
|
||||
|
|
@ -455,7 +455,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
|
|||
|
||||
// Convert to CAT string
|
||||
|
||||
sprintf(FreqString, "%012lld", txfreq);
|
||||
sprintf(FreqString, "%012d", txfreq);
|
||||
|
||||
switch (PORT->PortType)
|
||||
{
|
||||
|
|
@ -896,7 +896,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
|
|||
// if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port
|
||||
|
||||
if (Command[0] == 'R')
|
||||
n = sscanf(Command,"%s %s %s %s %s", &Dummy[0], &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
|
||||
n = sscanf(Command,"%s %s %s %s %s", &Dummy, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
|
||||
else
|
||||
n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
|
||||
|
||||
|
|
@ -1117,7 +1117,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
|
|||
|
||||
if (_stricmp(FreqString, "POWER") == 0)
|
||||
{
|
||||
char PowerString[16] = "";
|
||||
char PowerString[8] = "";
|
||||
int Power = atoi(Mode);
|
||||
int len;
|
||||
char cmd[80];
|
||||
|
|
@ -1291,7 +1291,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
|
|||
|
||||
// use text command
|
||||
|
||||
Len = sprintf(CmdPtr, "%s", ptr1);
|
||||
Len = sprintf(CmdPtr, ptr1);
|
||||
break;
|
||||
|
||||
case YAESU:
|
||||
|
|
@ -2072,7 +2072,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
|
|||
|
||||
case HAMLIB:
|
||||
{
|
||||
char cmd[200];
|
||||
char cmd[80];
|
||||
|
||||
int len = sprintf(cmd, "F %s\n+f\nM %s %d\n+m\n",
|
||||
FreqString, Mode, atoi(Data));
|
||||
|
|
@ -2217,7 +2217,7 @@ int BittoInt(UINT BitMask)
|
|||
return i;
|
||||
}
|
||||
|
||||
extern char * RadioConfigMsg[70];
|
||||
extern char * RadioConfigMsg[36];
|
||||
|
||||
struct TNCINFO RIGTNC; // Dummy TNC Record for Rigcontrol without a corresponding TNC
|
||||
|
||||
|
|
@ -3205,7 +3205,7 @@ VOID ReleasePermission(struct RIGINFO *RIG)
|
|||
while (RIG->PortRecord[i])
|
||||
{
|
||||
PortRecord = RIG->PortRecord[i];
|
||||
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)3); // Release Perrmission
|
||||
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 3); // Release Perrmission
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
|
@ -3235,7 +3235,7 @@ int GetPermissionToChange(struct RIGPORTINFO * PORT, struct RIGINFO *RIG)
|
|||
// TNC has been asked for permission, and we are waiting respoonse
|
||||
// Only SCS pactor returns WaitingForPrmission, so check shouldn't be called on others
|
||||
|
||||
RIG->OKtoChange = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)2); // Get Ok Flag
|
||||
RIG->OKtoChange = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, 2); // Get Ok Flag
|
||||
|
||||
if (RIG->OKtoChange == 1)
|
||||
{
|
||||
|
|
@ -3277,7 +3277,7 @@ int GetPermissionToChange(struct RIGPORTINFO * PORT, struct RIGINFO *RIG)
|
|||
// not waiting for permission, so must be first call of a cycle
|
||||
|
||||
if (RIG->PortRecord[0] && RIG->PortRecord[0]->PORT_EXT_ADDR)
|
||||
RIG->WaitingForPermission = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)1); // Request Perrmission
|
||||
RIG->WaitingForPermission = (int)(intptr_t)RIG->PortRecord[0]->PORT_EXT_ADDR(6, RIG->PortRecord[0]->PORTCONTROL.PORTNUMBER, 1); // Request Perrmission
|
||||
|
||||
// If it returns zero there is no need to wait.
|
||||
// Normally SCS Returns True for first call, but returns 0 if Link not running
|
||||
|
|
@ -3300,7 +3300,7 @@ CheckOtherPorts:
|
|||
{
|
||||
PortRecord = RIG->PortRecord[i];
|
||||
|
||||
if (PortRecord->PORT_EXT_ADDR && PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)1))
|
||||
if (PortRecord->PORT_EXT_ADDR && PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 1))
|
||||
{
|
||||
// 1 means can't change - release all
|
||||
|
||||
|
|
@ -3392,7 +3392,7 @@ VOID DoBandwidthandAntenna(struct RIGINFO *RIG, struct ScanEntry * ptr)
|
|||
|
||||
RIG->CurrentBandWidth = ptr->Bandwidth;
|
||||
|
||||
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, (PDATAMESSAGE)ptr);
|
||||
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, ptr);
|
||||
|
||||
/* if (ptr->Bandwidth == 'R') // Robust Packet
|
||||
PortRecord->PORT_EXT_ADDR(6, PortRecord->PORTCONTROL.PORTNUMBER, 6); // Set Robust Packet
|
||||
|
|
@ -5286,12 +5286,8 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
|
|||
|
||||
ptr = strtok_s(NULL, ",", &Context);
|
||||
|
||||
if (ptr == NULL)
|
||||
if (*MemoryNumber) // If channel, dont need mode
|
||||
return TRUE;
|
||||
|
||||
if (ptr == NULL || strlen(ptr) > 8)
|
||||
return FALSE; // Mode Missing
|
||||
return FALSE;
|
||||
|
||||
// If channel, dont need mode
|
||||
|
||||
|
|
@ -5450,26 +5446,7 @@ void DecodeCM108(int Port, char * ptr)
|
|||
hid_device *handle = NULL;
|
||||
|
||||
if (strlen(ptr) > 16)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
CM108Device = _strdup(ptr);
|
||||
else
|
||||
{
|
||||
VID = strtol(ptr, &next, 0);
|
||||
|
|
@ -7275,7 +7252,7 @@ CheckScan:
|
|||
}
|
||||
else if (PORT->PortType == FT991A || PORT->PortType == FTDX10)
|
||||
{
|
||||
FreqPtr[0]->Cmd1Len = sprintf(CmdPtr, "FA%s;MD0%X;FA;MD0;", &FreqString[0], ModeNo);
|
||||
FreqPtr[0]->Cmd1Len = sprintf(CmdPtr, "FA%s;MD0%X;FA;MD0;", &FreqString, ModeNo);
|
||||
}
|
||||
else if (PORT->PortType == FT100 || PORT->PortType == FT990
|
||||
|| PORT->PortType == FT1000)
|
||||
|
|
@ -7416,8 +7393,6 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
|
|||
int Interlock = RIG->Interlock;
|
||||
char PortString[128] = "";
|
||||
char TxPortString[128] = "";
|
||||
int n = 0;
|
||||
int nn = 0;
|
||||
|
||||
// Find TNC ports in this Rig's scan group
|
||||
|
||||
|
|
@ -7434,7 +7409,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
|
|||
{
|
||||
int p = PortRecord->PORTNUMBER;
|
||||
RIG->BPQPort |= ((uint64_t)1 << p);
|
||||
n += sprintf(&PortString[n], ",%d", p);
|
||||
sprintf(PortString, "%s,%d", PortString, p);
|
||||
TNC->RIG = RIG;
|
||||
|
||||
if (RIG->PTTMode == 0 && TNC->PTTMode)
|
||||
|
|
@ -7444,7 +7419,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
|
|||
{
|
||||
int p = PortRecord->PORTNUMBER;
|
||||
RIG->BPQPort |= ((uint64_t)1 << p);
|
||||
nn += sprintf(&TxPortString[nn], ",%d", p);
|
||||
sprintf(TxPortString, "%s,%d", TxPortString, p);
|
||||
TNC->TXRIG = RIG;
|
||||
|
||||
if (RIG->PTTMode == 0 && TNC->PTTMode)
|
||||
|
|
@ -7484,9 +7459,8 @@ VOID SetupPortRIGPointers()
|
|||
|
||||
#ifdef WIN32
|
||||
|
||||
VOID PTTCATThread(void * Param)
|
||||
VOID PTTCATThread(struct RIGINFO *RIG)
|
||||
{
|
||||
struct RIGINFO * RIG = (struct RIGINFO *)Param;
|
||||
DWORD dwLength = 0;
|
||||
int Length, ret, i;
|
||||
UCHAR * ptr1;
|
||||
|
|
@ -8165,7 +8139,7 @@ void ProcessFLRIGFrame(struct RIGPORTINFO * PORT)
|
|||
|
||||
void HLSetMode(SOCKET Sock, struct RIGINFO * RIG, unsigned char * Msg, char sep)
|
||||
{
|
||||
char Resp[120];
|
||||
char Resp[80];
|
||||
int Len;
|
||||
char mode[80] = "";
|
||||
int filter = 0;
|
||||
|
|
@ -8411,7 +8385,7 @@ int ProcessHAMLIBSlaveMessage(SOCKET Sock, struct RIGINFO * RIG, unsigned char *
|
|||
|
||||
switch (Msg[0])
|
||||
{
|
||||
case 'f': // Get Frequency
|
||||
case 'f': // Get Freqency
|
||||
|
||||
HLGetFreq(Sock, RIG, sep);
|
||||
return 0;
|
||||
|
|
@ -8472,7 +8446,7 @@ int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr)
|
|||
return 1;
|
||||
}
|
||||
|
||||
VOID HAMLIBThread(void * Param);
|
||||
VOID HAMLIBThread(struct RIGPORTINFO * PORT);
|
||||
|
||||
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
|
||||
{
|
||||
|
|
@ -8482,11 +8456,10 @@ VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
|
|||
return ;
|
||||
}
|
||||
|
||||
VOID HAMLIBThread(void * Param)
|
||||
VOID HAMLIBThread(struct RIGPORTINFO * PORT)
|
||||
{
|
||||
// Opens sockets and looks for data
|
||||
|
||||
struct RIGPORTINFO * PORT = (struct RIGPORTINFO * )Param;
|
||||
|
||||
char Msg[255];
|
||||
int err, i, ret;
|
||||
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
|
||||
|
||||
struct RIGINFO * RIG = (struct RIGINFO *)Param;
|
||||
fd_set readfs;
|
||||
fd_set errorfs;
|
||||
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)
|
||||
{
|
||||
|
|
@ -8937,11 +8909,10 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
|
|||
return ;
|
||||
}
|
||||
|
||||
VOID FLRIGThread(VOID * Param)
|
||||
VOID FLRIGThread(struct RIGPORTINFO * PORT)
|
||||
{
|
||||
// Opens sockets and looks for data
|
||||
|
||||
struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
|
||||
char Msg[255];
|
||||
int err, i, ret;
|
||||
u_long param=1;
|
||||
|
|
@ -9967,10 +9938,14 @@ void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT)
|
|||
int Length;
|
||||
|
||||
char * msg;
|
||||
char * rest;
|
||||
|
||||
struct RIGINFO * RIG;
|
||||
char * ptr, * ptr1, * ptr2, * ptr3, * pos;
|
||||
int Len, TotalLen;
|
||||
char cmd[80];
|
||||
char ReqBuf[256];
|
||||
char SendBuff[256];
|
||||
int chunklength;
|
||||
int headerlen;
|
||||
int i, n = 0;
|
||||
|
|
@ -10181,7 +10156,7 @@ void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT)
|
|||
|
||||
|
||||
|
||||
VOID SDRANGELThread(VOID * Param);
|
||||
VOID SDRANGELThread(struct RIGPORTINFO * PORT);
|
||||
|
||||
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
|
||||
{
|
||||
|
|
@ -10190,12 +10165,10 @@ VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
|
|||
return ;
|
||||
}
|
||||
|
||||
VOID SDRANGELThread(VOID * Param)
|
||||
VOID SDRANGELThread(struct RIGPORTINFO * PORT)
|
||||
{
|
||||
// Opens sockets and looks for data
|
||||
|
||||
struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
|
||||
char Msg[512];
|
||||
char Msg[255];
|
||||
int err, i, ret;
|
||||
u_long param=1;
|
||||
BOOL bcopt=TRUE;
|
||||
|
|
@ -10359,6 +10332,7 @@ VOID SDRANGELPoll(struct RIGPORTINFO * PORT)
|
|||
|
||||
struct RIGINFO * RIG = &PORT->Rigs[0];
|
||||
int Len, i;
|
||||
char ReqBuf[256];
|
||||
char SendBuff[256];
|
||||
//char * SDRANGEL_GETheader = "GET /sdrangel/deviceset/%d/device/settings "
|
||||
// "HTTP/1.1\nHost: %s\nConnection: keep-alive\n\r\n";
|
||||
|
|
@ -10405,6 +10379,7 @@ VOID SDRANGELPoll(struct RIGPORTINFO * PORT)
|
|||
if (GetPermissionToChange(PORT, RIG))
|
||||
{
|
||||
char cmd[80];
|
||||
double freq;
|
||||
|
||||
if (RIG->RIG_DEBUG)
|
||||
Debugprintf("BPQ32 Change Freq to %9.4f", PORT->FreqPtr->Freq);
|
||||
|
|
@ -10476,6 +10451,7 @@ VOID SDRANGELPoll(struct RIGPORTINFO * PORT)
|
|||
VOID SDRANGELSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value)
|
||||
{
|
||||
int Len, ret;
|
||||
char ReqBuf[512];
|
||||
char SendBuff[512];
|
||||
char ValueString[256] ="";
|
||||
char * SDRANGEL_PATCHheader = "PATCH /sdrangel/deviceset/%d/device/settings "
|
||||
|
|
|
|||
11
SCSPactor.c
11
SCSPactor.c
|
|
@ -78,7 +78,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define MaxStreams 10 // First is used for Pactor, even though Pactor uses channel 31
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
|
@ -854,8 +854,7 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
|
||||
TNC->Hardware = H_SCS;
|
||||
|
||||
OpenLogFile(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->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
|
||||
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
|
||||
|
||||
|
|
@ -2892,7 +2893,7 @@ VOID ProcessIncomingCall(struct TNCINFO * TNC, struct STREAMINFO * STREAM, int S
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
@ -3033,7 +3034,7 @@ VOID ProcessIncomingCall(struct TNCINFO * TNC, struct STREAMINFO * STREAM, int S
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// if SendTandRtoRelay set and Appl is RMS change to RELAY
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define MaxStreams 10
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
|
@ -48,6 +48,7 @@ extern UCHAR BPQDirectory[];
|
|||
static RECT Rect;
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
char * strlop(char * buf, char delim);
|
||||
BOOL KAMStartPort(struct PORTCONTROL * PORT);
|
||||
BOOL KAMStopPort(struct PORTCONTROL * PORT);
|
||||
|
||||
|
|
@ -376,8 +377,7 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
|
||||
TNC->Hardware = H_TRKM;
|
||||
|
||||
// Set up DED addresses for streams
|
||||
|
||||
|
|
@ -393,6 +393,8 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
|
|||
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
|
||||
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
else
|
||||
|
|
|
|||
10
SCSTracker.c
10
SCSTracker.c
|
|
@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define MaxStreams 1
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
//#include "bpq32.h"
|
||||
|
|
@ -52,6 +52,7 @@ extern char LOC[];
|
|||
static RECT Rect;
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
char * strlop(char * buf, char delim);
|
||||
|
||||
char NodeCall[11]; // Nodecall, Null Terminated
|
||||
|
||||
|
|
@ -666,8 +667,7 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
|
||||
TNC->Hardware = H_TRK;
|
||||
|
||||
// Set up DED addresses for streams
|
||||
|
||||
|
|
@ -683,6 +683,8 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
|
|||
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
|
||||
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
else
|
||||
|
|
@ -2173,7 +2175,7 @@ VOID TrkProcessDEDFrame(struct TNCINFO * TNC)
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
|
|||
51
ScanHID.c
51
ScanHID.c
|
|
@ -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();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
17
SerialPort.c
17
SerialPort.c
|
|
@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#endif
|
||||
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
|
||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
|
||||
|
|
@ -142,7 +142,7 @@ loop:
|
|||
return 1;
|
||||
}
|
||||
|
||||
BOOL SerialReadConfigFile(int Port, int ProcLine(char * buf, int Port))
|
||||
BOOL SerialReadConfigFile(int Port, int ProcLine())
|
||||
{
|
||||
char buf[256],errbuf[256];
|
||||
|
||||
|
|
@ -508,12 +508,9 @@ ok:
|
|||
|
||||
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]))
|
||||
{
|
||||
}
|
||||
else
|
||||
|
|
@ -738,7 +735,7 @@ VOID SerialReleasePort(struct TNCINFO * TNC)
|
|||
VOID * SerialExtInit(EXTPORTDATA * PortEntry)
|
||||
{
|
||||
int port;
|
||||
char Msg[512];
|
||||
char Msg[255];
|
||||
char * ptr;
|
||||
struct TNCINFO * TNC;
|
||||
char * TempScript;
|
||||
|
|
@ -773,9 +770,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
|
||||
TNC->Hardware = H_SERIAL;
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include "stdio.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
int C_Q_COUNT(VOID *PQ);
|
||||
|
|
@ -322,10 +322,7 @@ Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR 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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,17 +25,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
|
||||
typedef struct _TCMDX
|
||||
{
|
||||
char String[12]; // COMMAND STRING
|
||||
UCHAR CMDLEN; // SIGNIFICANT LENGTH
|
||||
VOID (* CMDPROC)(struct TNCDATA * TNC, char * Tail, struct _TCMDX * CMD);// COMMAND PROCESSOR
|
||||
size_t CMDFLAG; // FLAG/VALUE Offset
|
||||
|
||||
} TCMDX;
|
||||
|
||||
#include "CHeaders.h"
|
||||
|
||||
#define LF 10
|
||||
#define CR 13
|
||||
|
|
@ -241,14 +231,8 @@ typedef struct _SERIAL_STATUS {
|
|||
|
||||
#ifndef WIN32
|
||||
|
||||
#if defined(MACBPQ)
|
||||
#ifdef MACBPQ
|
||||
#include <util.h>
|
||||
#elif defined(FREEBSD)
|
||||
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
#include <libutil.h>
|
||||
#else
|
||||
#include <util.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern int posix_openpt (int __oflag);
|
||||
|
|
@ -268,7 +252,7 @@ HANDLE LinuxOpenPTY(char * Name)
|
|||
u_long param=1;
|
||||
struct termios term;
|
||||
|
||||
#if defined(MACBPQ) || defined(FREEBSD)
|
||||
#ifdef MACBPQ
|
||||
|
||||
// Create a pty pair
|
||||
|
||||
|
|
@ -864,7 +848,7 @@ int LocalSessionState(int stream, int * state, int * change, BOOL ACK)
|
|||
|
||||
|
||||
|
||||
VOID ONOFF(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID ONOFF(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
// PROCESS COMMANDS WITH ON/OFF PARAM
|
||||
|
||||
|
|
@ -913,7 +897,7 @@ VOID ONOFF(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
|
||||
|
||||
|
||||
VOID ONOFF_CONOK(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID ONOFF_CONOK(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
|
||||
|
||||
|
|
@ -927,7 +911,7 @@ VOID ONOFF_CONOK(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
SetAppl(TNCStream->BPQPort, TNC->APPLFLAGS, 0);
|
||||
}
|
||||
|
||||
VOID SETMYCALL(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID SETMYCALL(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
char Response[80];
|
||||
int len;
|
||||
|
|
@ -951,7 +935,7 @@ VOID SETMYCALL(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
|
||||
SENDREPLY(TNC, Response, len);
|
||||
}
|
||||
VOID CTEXTCMD(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID CTEXTCMD(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
char Response[256];
|
||||
int len, n;
|
||||
|
|
@ -979,10 +963,10 @@ VOID CTEXTCMD(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
SENDREPLY(TNC, Response, len);
|
||||
}
|
||||
|
||||
VOID BTEXT(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID BTEXT(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
}
|
||||
VOID VALUE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID VALUE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
// PROCESS COMMANDS WITH decimal value
|
||||
|
||||
|
|
@ -1011,7 +995,7 @@ VOID VALUE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
SENDREPLY(TNC, Response, len);
|
||||
}
|
||||
|
||||
VOID VALHEX(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID VALHEX(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
// PROCESS COMMANDS WITH decimal value
|
||||
|
||||
|
|
@ -1048,7 +1032,7 @@ VOID VALHEX(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
SENDREPLY(TNC, Response, len);
|
||||
}
|
||||
|
||||
VOID APPL_VALHEX(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID APPL_VALHEX(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
int ApplNum = 1;
|
||||
UINT APPLMASK;
|
||||
|
|
@ -1077,7 +1061,7 @@ VOID APPL_VALHEX(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
memcpy(TNC->MYCALL, GetApplCall(ApplNum), 10);
|
||||
|
||||
}
|
||||
VOID CSWITCH(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID CSWITCH(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
char Response[80];
|
||||
int len;
|
||||
|
|
@ -1088,12 +1072,12 @@ VOID CSWITCH(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
CONNECTTONODE(TNC);
|
||||
|
||||
}
|
||||
VOID CONMODE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID CONMODE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
SENDREPLY(TNC, CMDMSG, 4);
|
||||
}
|
||||
|
||||
VOID TNCCONV(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID TNCCONV(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
|
||||
|
||||
|
|
@ -1101,7 +1085,7 @@ VOID TNCCONV(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
TNCStream->MODEFLAG &= ~(COMMAND+TRANS);
|
||||
}
|
||||
|
||||
VOID TNCNODE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID TNCNODE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
// CONNECT TO NODE
|
||||
|
||||
|
|
@ -1115,7 +1099,7 @@ VOID TNCNODE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
CONNECTTONODE(TNC);
|
||||
}
|
||||
|
||||
VOID CStatus(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID CStatus(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
|
||||
|
||||
|
|
@ -1152,7 +1136,7 @@ VOID CStatus(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
}
|
||||
|
||||
|
||||
VOID TNCCONNECT(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID TNCCONNECT(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
|
||||
|
||||
|
|
@ -1195,7 +1179,7 @@ VOID TNCCONNECT(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
SENDPACKET(TNC); // Will now go to node
|
||||
|
||||
}
|
||||
VOID TNCDISC(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID TNCDISC(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
|
||||
|
||||
|
|
@ -1210,7 +1194,7 @@ VOID READCHANGE(int Stream)
|
|||
LocalSessionState(Stream, &dummy, &dummy, TRUE);
|
||||
}
|
||||
|
||||
VOID TNCRELEASE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID TNCRELEASE(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
ReturntoNode(TNC->BPQPort);
|
||||
|
||||
|
|
@ -1219,7 +1203,7 @@ VOID TNCRELEASE(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
|
||||
SENDREPLY(TNC, CMDMSG, 4);
|
||||
}
|
||||
VOID TNCTRANS(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
VOID TNCTRANS(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
struct TNC2StreamInfo * TNCStream = TNC->TNC2Stream[TNC->TXStream];
|
||||
|
||||
|
|
@ -1231,7 +1215,7 @@ VOID TNCTRANS(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
TNCStream->MODEFLAG |= TRANS;
|
||||
TNCStream->MODEFLAG &= ~(COMMAND+CONV);
|
||||
}
|
||||
static VOID TNCRESTART(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
static VOID TNCRESTART(struct TNCDATA * TNC)
|
||||
{
|
||||
// REINITIALISE CHANNEL
|
||||
|
||||
|
|
@ -1259,12 +1243,12 @@ static VOID TNCRESTART(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
|||
}
|
||||
|
||||
|
||||
static VOID TNCUNPROTOCMD(struct TNCDATA * TNC, char * Tail, TCMDX * CMD)
|
||||
static VOID TNCUNPROTOCMD(struct TNCDATA * TNC, char * Tail, CMDX * CMD)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TCMDX TNCCOMMANDLIST[] =
|
||||
CMDX TNCCOMMANDLIST[] =
|
||||
{
|
||||
"AUTOLF ",2, ONOFF, offsetof(struct TNCDATA, AUTOLF),
|
||||
"BBSMON ",6, ONOFF, offsetof(struct TNCDATA, BBSMON),
|
||||
|
|
@ -1317,7 +1301,7 @@ TCMDX TNCCOMMANDLIST[] =
|
|||
|
||||
|
||||
|
||||
int NUMBEROFTNCCOMMANDS = sizeof(TNCCOMMANDLIST)/sizeof(TCMDX);
|
||||
int NUMBEROFTNCCOMMANDS = sizeof(TNCCOMMANDLIST)/sizeof(CMDX);
|
||||
|
||||
/*NEWVALUE DW 0
|
||||
HEXFLAG DB 0
|
||||
|
|
@ -2591,7 +2575,7 @@ VOID TNCCOMMAND(struct TNCDATA * TNC)
|
|||
|
||||
char * ptr, * ptr1, * ptr2;
|
||||
int n;
|
||||
TCMDX * CMD;
|
||||
CMDX * CMD;
|
||||
|
||||
*(--TNC->CURSOR) = 0;
|
||||
|
||||
|
|
@ -2669,8 +2653,11 @@ VOID TNCCOMMAND(struct TNCDATA * TNC)
|
|||
}
|
||||
|
||||
CMD++;
|
||||
|
||||
}
|
||||
|
||||
SENDREPLY(TNC, WHATMSG, 8);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -4939,7 +4926,6 @@ int STATUSPOLL(struct TNCDATA * TNC, struct StreamInfo * Channel)
|
|||
|
||||
int State, Change, i;
|
||||
char WorkString[256];
|
||||
char ConMsg[64];
|
||||
|
||||
if (TNC->MSGCHANNEL == 0) // Monitor Chan
|
||||
return 0;
|
||||
|
|
@ -4955,7 +4941,7 @@ int STATUSPOLL(struct TNCDATA * TNC, struct StreamInfo * Channel)
|
|||
{
|
||||
// DISCONNECTED
|
||||
|
||||
i = sprintf(ConMsg, "\x3(%d) DISCONNECTED fm 0:SWITCH\r", TNC->MSGCHANNEL);
|
||||
i = sprintf(CONMSG, "\x3(%d) DISCONNECTED fm 0:SWITCH\r", TNC->MSGCHANNEL);
|
||||
i++;
|
||||
}
|
||||
else
|
||||
|
|
@ -4964,11 +4950,11 @@ int STATUSPOLL(struct TNCDATA * TNC, struct StreamInfo * Channel)
|
|||
|
||||
GetCallsign(Channel->BPQStream, WorkString);
|
||||
strlop(WorkString, ' ');
|
||||
i = sprintf(ConMsg, "\x3(%d) CONNECTED to %s\r", TNC->MSGCHANNEL, WorkString);
|
||||
i = sprintf(CONMSG, "\x3(%d) CONNECTED to %s\r", TNC->MSGCHANNEL, WorkString);
|
||||
i++;
|
||||
}
|
||||
|
||||
SENDCMDREPLY(TNC, ConMsg, i);
|
||||
SENDCMDREPLY(TNC, CONMSG, i);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
435
TelnetV6.c
435
TelnetV6.c
|
|
@ -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
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Telnet Driver for BPQ Switch
|
||||
//
|
||||
|
|
@ -38,7 +37,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#define IDM_DISCONNECT 2000
|
||||
#define IDM_LOGGING 2100
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#ifdef WIN32
|
||||
|
|
@ -86,11 +85,7 @@ void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo *
|
|||
void DRATSConnectionLost(struct ConnectionInfo * sockptr);
|
||||
int BuildRigCtlPage(char * _REPLYBUFFER);
|
||||
void ProcessWebmailWebSockThread(void * conn);
|
||||
void RHPThread(void * Params);
|
||||
void ProcessRHPWebSockClosed(SOCKET socket);
|
||||
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);
|
||||
void checkNRTCPSockets(int portNo);
|
||||
|
||||
#ifndef LINBPQ
|
||||
extern HKEY REGTREE;
|
||||
|
|
@ -114,7 +109,7 @@ extern int REALTIMETICKS;
|
|||
#define MaxSockets 26
|
||||
|
||||
struct UserRec RelayUser;
|
||||
struct UserRec SyncUser = {"","Sync"};
|
||||
struct UserRec SyncUser = {"","Sync"};;
|
||||
struct UserRec CMSUser;
|
||||
struct UserRec HostUser = {"","Host"};
|
||||
struct UserRec TriModeUser;
|
||||
|
|
@ -128,12 +123,11 @@ BOOL LogEnabled = FALSE;
|
|||
BOOL CMSLogEnabled = TRUE;
|
||||
extern BOOL IncludesMail;
|
||||
|
||||
extern int HTTPPort;
|
||||
|
||||
static HMENU hMenu, hPopMenu, hPopMenu2, hPopMenu3; // handle of menu
|
||||
|
||||
static int ProcessLine(char * buf, int Port);
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
char * strlop(char * buf, char delim);
|
||||
|
||||
|
||||
int DisplaySessions(struct TNCINFO * TNC);
|
||||
|
|
@ -172,14 +166,12 @@ VOID Tel_Format_Addr(struct ConnectionInfo * sockptr, char * dst);
|
|||
VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr);
|
||||
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 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;
|
||||
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
int DeleteLogFile(char * Log);
|
||||
|
|
@ -542,10 +534,7 @@ int ProcessLine(char * buf, int Port)
|
|||
TCP->TriModePort = atoi(value);
|
||||
|
||||
else if (_stricmp(param,"HTTPPORT") == 0)
|
||||
HTTPPort = TCP->HTTPPort = atoi(value);
|
||||
|
||||
else if (_stricmp(param,"NETROMPORT") == 0)
|
||||
TCP->NETROMPort = atoi(value);
|
||||
TCP->HTTPPort = atoi(value);
|
||||
|
||||
else if (_stricmp(param,"APIPORT") == 0)
|
||||
TCP->APIPort = atoi(value);
|
||||
|
|
@ -959,27 +948,13 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
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);
|
||||
sockptr->SocketActive = FALSE;
|
||||
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
|
||||
{
|
||||
|
|
@ -1144,7 +1119,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
shutdown(TCP->FBBsock[n++], SD_BOTH);
|
||||
|
||||
shutdown(TCP->Relaysock, SD_BOTH);
|
||||
shutdown(TCP->HTTPSock, SD_BOTH);
|
||||
shutdown(TCP->HTTPsock, SD_BOTH);
|
||||
shutdown(TCP->HTTPsock6, SD_BOTH);
|
||||
|
||||
|
||||
|
|
@ -1168,7 +1143,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
closesocket(TCP->Relaysock);
|
||||
closesocket(TCP->Relaysock6);
|
||||
closesocket(TCP->HTTPSock);
|
||||
closesocket(TCP->HTTPsock);
|
||||
closesocket(TCP->HTTPsock6);
|
||||
|
||||
// Save info from old TNC record
|
||||
|
|
@ -1194,7 +1169,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
TNC = TNCInfo[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
|
||||
|
||||
// Get Menu Handles
|
||||
|
|
@ -1253,7 +1228,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
shutdown(TCP->FBBsock[n++], SD_BOTH);
|
||||
|
||||
shutdown(TCP->Relaysock, SD_BOTH);
|
||||
shutdown(TCP->HTTPSock, SD_BOTH);
|
||||
shutdown(TCP->HTTPsock, SD_BOTH);
|
||||
shutdown(TCP->HTTPsock6, SD_BOTH);
|
||||
|
||||
shutdown(TCP->sock6, SD_BOTH);
|
||||
|
|
@ -1280,7 +1255,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
closesocket(TCP->FBBsock6[n++]);
|
||||
|
||||
closesocket(TCP->Relaysock6);
|
||||
closesocket(TCP->HTTPSock);
|
||||
closesocket(TCP->HTTPsock);
|
||||
closesocket(TCP->HTTPsock6);
|
||||
|
||||
return (0);
|
||||
|
|
@ -1469,12 +1444,13 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
|
|||
TCP = TNC->TCPInfo;
|
||||
|
||||
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
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
|
||||
ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
|
||||
|
||||
|
|
@ -1503,8 +1479,6 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
|
|||
|
||||
PortEntry->PORTCONTROL.TNC = TNC;
|
||||
|
||||
PortEntry->PORTCONTROL.Hardware = TNC->Hardware;
|
||||
|
||||
TNC->WebWindowProc = WebProc;
|
||||
TNC->WebWinX = 260;
|
||||
TNC->WebWinY = 325;
|
||||
|
|
@ -1718,14 +1692,11 @@ BOOL OpenSockets(struct TNCINFO * TNC)
|
|||
}
|
||||
|
||||
if (TCP->HTTPPort)
|
||||
TCP->HTTPSock = OpenSocket4(TNC, TCP->HTTPPort);
|
||||
TCP->HTTPsock = OpenSocket4(TNC, TCP->HTTPPort);
|
||||
|
||||
if (TCP->APIPort)
|
||||
TCP->APIsock = OpenSocket4(TNC, TCP->APIPort);
|
||||
|
||||
if (TCP->NETROMPort)
|
||||
TCP->NETROMSock = OpenSocket4(TNC, TCP->NETROMPort);
|
||||
|
||||
if (TCP->SyncPort)
|
||||
TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort);
|
||||
|
||||
|
|
@ -1844,9 +1815,6 @@ BOOL OpenSockets6(struct TNCINFO * TNC)
|
|||
if (TCP->APIPort)
|
||||
TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort);
|
||||
|
||||
if (TCP->NETROMPort)
|
||||
TCP->NETROMSock6 = OpenSocket6(TNC, TCP->NETROMPort);
|
||||
|
||||
if (TCP->SyncPort)
|
||||
TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort);
|
||||
|
||||
|
|
@ -1899,7 +1867,7 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
|
|||
maxsock = sock;
|
||||
}
|
||||
|
||||
sock = TCP->HTTPSock;
|
||||
sock = TCP->HTTPsock;
|
||||
if (sock)
|
||||
{
|
||||
FD_SET(sock, readfd);
|
||||
|
|
@ -1915,14 +1883,6 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
|
|||
maxsock = sock;
|
||||
}
|
||||
|
||||
sock = TCP->NETROMSock;
|
||||
if (sock)
|
||||
{
|
||||
FD_SET(sock, readfd);
|
||||
if (sock > maxsock)
|
||||
maxsock = sock;
|
||||
}
|
||||
|
||||
sock = TCP->Syncsock;
|
||||
if (sock)
|
||||
{
|
||||
|
|
@ -1998,14 +1958,6 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
|
|||
maxsock = sock;
|
||||
}
|
||||
|
||||
sock = TCP->NETROMSock6;
|
||||
if (sock)
|
||||
{
|
||||
FD_SET(sock, readfd);
|
||||
if (sock > maxsock)
|
||||
maxsock = sock;
|
||||
}
|
||||
|
||||
sock = TCP->DRATSsock6;
|
||||
|
||||
if (sock)
|
||||
|
|
@ -2093,20 +2045,13 @@ VOID TelnetPoll(int Port)
|
|||
Socket_Accept(TNC, sock, TCP->RelayPort);
|
||||
}
|
||||
|
||||
sock = TCP->HTTPSock;
|
||||
sock = TCP->HTTPsock;
|
||||
if (sock)
|
||||
{
|
||||
if (FD_ISSET(sock, &readfd))
|
||||
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;
|
||||
if (sock)
|
||||
{
|
||||
|
|
@ -2154,14 +2099,6 @@ VOID TelnetPoll(int Port)
|
|||
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;
|
||||
if (sock)
|
||||
{
|
||||
|
|
@ -2289,12 +2226,9 @@ VOID TelnetPoll(int Port)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
nosocks:
|
||||
|
||||
// Poll TCPNR
|
||||
|
||||
checkNRTCPSockets(Port);
|
||||
|
||||
// Try SNMP
|
||||
|
||||
if (TCP->SNMPsock)
|
||||
|
|
@ -2534,11 +2468,15 @@ nosocks:
|
|||
|
||||
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
|
||||
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
sockptr->LastSendTime = REALTIMETICKS;
|
||||
BuffertoNode(sockptr, "Keepalive\r", 10);
|
||||
}
|
||||
}
|
||||
|
|
@ -2668,7 +2606,7 @@ nosocks:
|
|||
if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
|
||||
{
|
||||
sockptr->Keepalive = TRUE;
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
sockptr->LastSendTime = REALTIMETICKS;
|
||||
}
|
||||
|
||||
if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
|
||||
|
|
@ -2900,7 +2838,7 @@ nosocks:
|
|||
|
||||
SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
|
||||
sockptr->FromHostBuffGetptr += Msglen;
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
sockptr->LastSendTime = REALTIMETICKS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3107,7 +3045,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
|
|||
shutdown(TCP->FBBsock[n++], SD_BOTH);
|
||||
|
||||
shutdown(TCP->Relaysock, SD_BOTH);
|
||||
shutdown(TCP->HTTPSock, SD_BOTH);
|
||||
shutdown(TCP->HTTPsock, SD_BOTH);
|
||||
shutdown(TCP->HTTPsock6, SD_BOTH);
|
||||
|
||||
|
||||
|
|
@ -3132,7 +3070,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
|
|||
|
||||
closesocket(TCP->Relaysock);
|
||||
closesocket(TCP->Relaysock6);
|
||||
closesocket(TCP->HTTPSock);
|
||||
closesocket(TCP->HTTPsock);
|
||||
closesocket(TCP->HTTPsock6);
|
||||
|
||||
// Save info from old TNC record
|
||||
|
|
@ -3157,10 +3095,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
|
|||
|
||||
TNC = TNCInfo[n];
|
||||
TNC->Port = n;
|
||||
TNC->PortRecord = PortRecord;
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
|
||||
|
||||
TNC->Hardware = H_TELNET;
|
||||
TNC->hDlg = SavehDlg;
|
||||
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
|
||||
|
||||
|
|
@ -3191,6 +3126,8 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
|
|||
ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
|
||||
}
|
||||
|
||||
TNC->PortRecord = PortRecord;
|
||||
|
||||
Sleep(500);
|
||||
OpenSockets(TNC);
|
||||
OpenSockets6(TNC);
|
||||
|
|
@ -3301,35 +3238,6 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
|
|||
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, ¶m);
|
||||
|
||||
sockptr->NETROMMode = TRUE;
|
||||
NETROMConnectionAccepted(sockptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Find a free Session
|
||||
|
||||
for (n = 1; n <= TCP->MaxSessions; n++)
|
||||
|
|
@ -3381,8 +3289,7 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
|
|||
TNC->Streams[n].FramesQueued = 0;
|
||||
|
||||
sockptr->HTTPMode = FALSE;
|
||||
sockptr->APIMode = FALSE;
|
||||
sockptr->NETROMMode = FALSE;
|
||||
sockptr->APIMode = FALSE;
|
||||
sockptr->SyncMode = FALSE;
|
||||
sockptr->DRATSMode = FALSE;
|
||||
sockptr->FBBMode = FALSE;
|
||||
|
|
@ -3397,12 +3304,9 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
|
|||
|
||||
memset(sockptr->ADIF, 0, sizeof(struct ADIF));
|
||||
|
||||
if (SocketId == TCP->HTTPSock || SocketId == TCP->HTTPsock6)
|
||||
if (SocketId == TCP->HTTPsock || SocketId == TCP->HTTPsock6)
|
||||
sockptr->HTTPMode = TRUE;
|
||||
|
||||
if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
|
||||
sockptr->NETROMMode = TRUE;
|
||||
|
||||
if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6)
|
||||
{
|
||||
sockptr->HTTPMode = TRUE; // API is a type of HTTP socket
|
||||
|
|
@ -3436,7 +3340,7 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
|
|||
|
||||
if (sockptr->HTTPMode)
|
||||
return 0;
|
||||
|
||||
|
||||
if (sockptr->DRATSMode)
|
||||
{
|
||||
send(sock, "100 Authentication not required\n", 33, 0);
|
||||
|
|
@ -3846,7 +3750,7 @@ MsgLoop:
|
|||
BuffertoNode(sockptr, NodeLine, len);
|
||||
|
||||
sockptr->InputLen = 0;
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -3874,14 +3778,12 @@ MsgLoop:
|
|||
LFPtr=memchr(MsgPtr, 10, InputLen);
|
||||
|
||||
if (LFPtr == 0)
|
||||
{
|
||||
if (CRPtr)
|
||||
{
|
||||
LFPtr = ++CRPtr;
|
||||
InputLen++;
|
||||
}
|
||||
}
|
||||
if (LFPtr == 0)
|
||||
if (LFPtr == 0)
|
||||
{
|
||||
// Check Paclen
|
||||
|
||||
|
|
@ -3897,7 +3799,7 @@ MsgLoop:
|
|||
}
|
||||
|
||||
// Send to Node
|
||||
|
||||
|
||||
// Line could be up to 500 chars if coming from a program rather than an interative user
|
||||
// Limit send to node to 255
|
||||
|
||||
|
|
@ -3909,16 +3811,16 @@ MsgLoop:
|
|||
|
||||
memmove(MsgPtr,MsgPtr+255,InputLen);
|
||||
}
|
||||
|
||||
|
||||
SendtoNode(TNC, sockptr->Number, MsgPtr, InputLen);
|
||||
|
||||
sockptr->InputLen = 0;
|
||||
|
||||
|
||||
} // PACLEN
|
||||
|
||||
return 0; // No CR
|
||||
}
|
||||
|
||||
|
||||
// Got a LF
|
||||
|
||||
// Process data up to the cr
|
||||
|
|
@ -3931,7 +3833,7 @@ MsgLoop:
|
|||
case 2:
|
||||
|
||||
// Normal Data State
|
||||
|
||||
|
||||
STREAM->bytesRXed += MsgLen;
|
||||
SendIndex = 0;
|
||||
|
||||
|
|
@ -3946,7 +3848,7 @@ MsgLoop:
|
|||
}
|
||||
|
||||
SendtoNode(TNC, sockptr->Number, MsgPtr + SendIndex, MsgLen);
|
||||
|
||||
|
||||
MsgLen += SendIndex;
|
||||
|
||||
// If anything left, copy down buffer, and go back
|
||||
|
|
@ -3965,20 +3867,20 @@ MsgLoop:
|
|||
return 0;
|
||||
|
||||
case 0:
|
||||
|
||||
// Check Username
|
||||
//
|
||||
|
||||
// Check Username
|
||||
//
|
||||
|
||||
*(LFPtr-1)=0; // remove cr
|
||||
|
||||
// send(sock, NLMsg, 2, 0);
|
||||
|
||||
// send(sock, NLMsg, 2, 0);
|
||||
|
||||
if (LogEnabled)
|
||||
if (LogEnabled)
|
||||
{
|
||||
char Addr[256];
|
||||
|
||||
|
||||
Tel_Format_Addr(sockptr, Addr);
|
||||
|
||||
|
||||
if (strlen(MsgPtr) > 64)
|
||||
{
|
||||
MsgPtr[64] = 0;
|
||||
|
|
@ -4022,7 +3924,7 @@ MsgLoop:
|
|||
#ifndef LINBPQ
|
||||
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
|
||||
#endif
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -4278,7 +4180,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
|
|||
#ifndef LINBPQ
|
||||
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
|
||||
#endif
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -4398,7 +4300,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
|
|||
|
||||
SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
|
||||
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -4573,8 +4475,7 @@ MsgLoop:
|
|||
|
||||
if (P8 == 1)
|
||||
SendPortsForMonitor(sock, sockptr->UserPointer->Secure);
|
||||
|
||||
sockptr->InputLen = 0;
|
||||
sockptr->InputLen = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -4898,7 +4799,7 @@ MsgLoop:
|
|||
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
|
||||
#endif
|
||||
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
|
||||
InputLen=InputLen-(MsgLen+1);
|
||||
|
||||
|
|
@ -4974,7 +4875,7 @@ MsgLoop:
|
|||
WriteLog (logmsg);
|
||||
}
|
||||
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
InputLen=InputLen-(MsgLen+1);
|
||||
|
||||
sockptr->InputLen=InputLen;
|
||||
|
|
@ -5067,16 +4968,6 @@ MsgLoop:
|
|||
|
||||
extern char * RigWebPage;
|
||||
|
||||
struct RHPParamBlock
|
||||
{
|
||||
unsigned char * Msg;
|
||||
int Len;
|
||||
SOCKET Socket;
|
||||
struct ConnectionInfo * sockptr;
|
||||
};
|
||||
|
||||
|
||||
|
||||
int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream)
|
||||
{
|
||||
int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret;
|
||||
|
|
@ -5099,17 +4990,6 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
|
|||
{
|
||||
// Failed or closed - clear connection
|
||||
|
||||
// if Websock connection tell app
|
||||
|
||||
if (sockptr->WebSocks)
|
||||
{
|
||||
if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
|
||||
ProcessRHPWebSockClosed(sockptr->socket);
|
||||
|
||||
DataSocket_Disconnect(TNC, sockptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
|
||||
DataSocket_Disconnect(TNC, sockptr);
|
||||
return 0;
|
||||
|
|
@ -5129,7 +5009,6 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
|
|||
int Fin, Opcode, Len, Mask;
|
||||
char MaskingKey[4];
|
||||
char * ptr;
|
||||
char * Payload;
|
||||
|
||||
/*
|
||||
+-+-+-+-+-------+-+-------------+-------------------------------+
|
||||
|
|
@ -5157,20 +5036,8 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
|
|||
Opcode = MsgPtr[0] & 15;
|
||||
Mask = MsgPtr[1] >> 7;
|
||||
Len = MsgPtr[1] & 127;
|
||||
|
||||
if (Len == 126) // Two Byte Len
|
||||
{
|
||||
Len = (MsgPtr[2] << 8) + MsgPtr[3];
|
||||
memcpy(MaskingKey, &MsgPtr[4], 4);
|
||||
ptr = &MsgPtr[8];
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(MaskingKey, &MsgPtr[2], 4);
|
||||
ptr = &MsgPtr[6];
|
||||
}
|
||||
|
||||
Payload = ptr;
|
||||
memcpy(MaskingKey, &MsgPtr[2], 4);
|
||||
ptr = &MsgPtr[6];
|
||||
|
||||
for (i = 0; i < Len; i++)
|
||||
{
|
||||
|
|
@ -5192,47 +5059,23 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
|
|||
|
||||
char RigCMD[64];
|
||||
|
||||
sprintf(RigCMD, "%s PTT", Payload);
|
||||
sprintf(RigCMD, "%s PTT", &MsgPtr[6]);
|
||||
Rig_Command( (TRANSPORTENTRY *) -1, RigCMD);
|
||||
}
|
||||
else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0)
|
||||
{
|
||||
sockcopy = malloc(sizeof(struct ConnectionInfo));
|
||||
sockptr->TNC = TNC;
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
sockptr->LastSendTime = REALTIMETICKS;
|
||||
|
||||
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
|
||||
|
||||
_beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy); // Needs big stack
|
||||
return 0;
|
||||
}
|
||||
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
|
||||
{
|
||||
// Run in thread as it may block;
|
||||
|
||||
struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
|
||||
|
||||
ParamBlock->sockptr = sockptr;
|
||||
ParamBlock->Socket = sockptr->socket;
|
||||
ParamBlock->Len = Len;
|
||||
ParamBlock->Msg = malloc(Len + 10);
|
||||
memcpy(ParamBlock->Msg, Payload, Len);
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
|
||||
_beginthread(RHPThread, 0, (VOID *)ParamBlock);
|
||||
|
||||
sockptr->InputLen = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
|
||||
closesocket(sockptr->socket);
|
||||
sockptr->SocketActive = FALSE;
|
||||
ShowConnections(TNC);
|
||||
}
|
||||
|
||||
|
||||
sockptr->InputLen = 0;
|
||||
return 0;
|
||||
|
|
@ -5259,7 +5102,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
|
|||
|
||||
sockcopy = malloc(sizeof(struct ConnectionInfo));
|
||||
sockptr->TNC = TNC;
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
sockptr->LastSendTime = REALTIMETICKS;
|
||||
|
||||
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
|
||||
|
||||
|
|
@ -5352,7 +5195,6 @@ int DataSocket_ReadDRATS(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
|
|||
}
|
||||
|
||||
|
||||
|
||||
int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr)
|
||||
{
|
||||
int n;
|
||||
|
|
@ -5367,7 +5209,7 @@ int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr
|
|||
ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
|
||||
#endif
|
||||
sockptr->SocketActive = FALSE;
|
||||
ShowConnections(TNC);
|
||||
ShowConnections(TNC);;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -5554,7 +5396,8 @@ int WriteLog(char * msg)
|
|||
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)
|
||||
return FALSE;
|
||||
|
|
@ -5609,7 +5452,8 @@ VOID WriteCMSLog(char * msg)
|
|||
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");
|
||||
|
||||
|
|
@ -5767,9 +5611,7 @@ int Telnet_Connected(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCK
|
|||
}
|
||||
else
|
||||
{
|
||||
struct _TRANSPORTENTRY * CROSSLINK = TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK;
|
||||
|
||||
if (CROSSLINK && CROSSLINK->APPL[0])
|
||||
if (TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL[0])
|
||||
buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r",
|
||||
TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL);
|
||||
else
|
||||
|
|
@ -6389,10 +6231,10 @@ VOID SaveCMSHostInfo(int port, struct TCPINFO * TCP, int CMSNo)
|
|||
char ip[256];
|
||||
int n;
|
||||
|
||||
if (sizeof(time_t) == 4)
|
||||
n = sscanf(buf,"%s %d %s", addr, (int *)&t, ip);
|
||||
else
|
||||
n = sscanf(buf, "%s %lld %s", addr, &t, ip);
|
||||
if (sizeof(time_t) == 4)
|
||||
n = sscanf(buf,"%s %d %s", addr, (int *)&t, ip);
|
||||
else
|
||||
n = sscanf(buf, "%s %lld %s", addr, &t, ip);
|
||||
|
||||
if (n == 3)
|
||||
{
|
||||
|
|
@ -6425,80 +6267,26 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
|
|||
struct ConnectionInfo * sockptr;
|
||||
SOCKET sock;
|
||||
struct sockaddr_in sinx;
|
||||
struct sockaddr_in destaddr;
|
||||
int addrlen=sizeof(sinx);
|
||||
char PortString[20];
|
||||
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);
|
||||
int i;
|
||||
|
||||
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->InputLen = 0;
|
||||
sockptr->LoginState = 2;
|
||||
sockptr->UserPointer = 0;
|
||||
sockptr->DoEcho = FALSE;
|
||||
|
||||
sockptr->FBBMode = FBB; // Raw Data
|
||||
|
||||
if (sockptr->ADIF == NULL)
|
||||
|
|
@ -6507,19 +6295,49 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
|
|||
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");
|
||||
return FALSE;
|
||||
struct hostent * HostEnt;
|
||||
|
||||
// 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, ¶m);
|
||||
ioctl (sockptr->socket, FIONBIO, ¶m);
|
||||
|
||||
setsockopt (sockptr->socket, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
|
||||
|
||||
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
|
||||
sinx.sin_family = AF_INET;
|
||||
sinx.sin_addr.s_addr = INADDR_ANY;
|
||||
sinx.sin_port = 0;
|
||||
|
||||
// memcpy(work, res->ai_addr->sa_data, 4);
|
||||
if (bind(sockptr->socket, (struct sockaddr *) &sinx, addrlen) != 0 )
|
||||
{
|
||||
ReportError(STREAM, "Bind Failed");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (LogEnabled)
|
||||
{
|
||||
char logmsg[512];
|
||||
|
|
@ -6528,21 +6346,21 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
|
|||
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
|
||||
//
|
||||
|
||||
ReportError(STREAM, "*** Connected");
|
||||
freeaddrinfo(saveres);
|
||||
|
||||
// Get Send Buffer Size
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
freeaddrinfo(saveres);
|
||||
|
||||
err=WSAGetLastError();
|
||||
|
||||
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
|
||||
|
|
@ -6568,6 +6386,7 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
|
|||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -6938,7 +6757,7 @@ extern struct DATAMESSAGE * REPLYBUFFER;
|
|||
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
|
||||
|
||||
|
||||
VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
int Port = 0, index =0;
|
||||
char * ptr, *Context;
|
||||
|
|
@ -7123,7 +6942,7 @@ VOID RECONFIGTELNET (TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail,
|
|||
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
|
||||
}
|
||||
|
||||
VOID SHOWTELNET(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
|
||||
VOID SHOWTELNET(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD)
|
||||
{
|
||||
// DISPLAY Telnet Server Status Mheard
|
||||
|
||||
|
|
@ -7279,7 +7098,7 @@ int DoRefreshWebMailIndex()
|
|||
{
|
||||
sockcopy = malloc(sizeof(struct ConnectionInfo));
|
||||
sockptr->TNC = TNC;
|
||||
sockptr->LastSendTime = time(NULL);
|
||||
sockptr->LastSendTime = REALTIMETICKS;
|
||||
|
||||
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
|
||||
|
||||
|
|
|
|||
13
UIARQ.c
13
UIARQ.c
|
|
@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
|
||||
extern int (WINAPI FAR *EnumProcessesPtr)();
|
||||
|
|
@ -80,11 +80,6 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
|
|||
VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer);
|
||||
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 char MYALIASLOPPED[10];
|
||||
|
||||
|
|
@ -469,7 +464,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
|
|||
ptr=strchr(TNC->NodeCall, ' ');
|
||||
if (ptr) *(ptr) = 0; // Null Terminate
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ;
|
||||
TNC->Hardware = H_UIARQ;
|
||||
|
||||
if (TNC->BusyWait == 0)
|
||||
TNC->BusyWait = 10;
|
||||
|
|
@ -481,7 +476,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
|
|||
while (TNC->ARQPorts[i])
|
||||
{
|
||||
PORT = GetPortTableEntryFromPortNum(TNC->ARQPorts[i]);
|
||||
PORT->UIHook = UIHook;
|
||||
PORT->UIHook = (FARPROCY)UIHook;
|
||||
PORT->HookPort = (struct PORTCONTROL *)PortEntry;
|
||||
i++;
|
||||
}
|
||||
|
|
@ -874,7 +869,7 @@ static VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, int
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
// UI Handling Routines
|
||||
|
||||
#include "bpqmail.h"
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
|
||||
|
||||
char UIDEST[10] = "FBB";
|
||||
|
|
|
|||
142
UZ7HODrv.c
142
UZ7HODrv.c
|
|
@ -37,7 +37,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
#include "bpq32.h"
|
||||
|
|
@ -62,7 +62,7 @@ void ConnecttoUZ7HOThread(void * portptr);
|
|||
void CreateMHWindow();
|
||||
int Update_MH_List(struct in_addr ipad, char * call, char proto);
|
||||
|
||||
int ConnecttoUZ7HO(int port);
|
||||
int ConnecttoUZ7HO();
|
||||
static int ProcessReceivedData(int bpqport);
|
||||
static int ProcessLine(char * buf, int Port);
|
||||
int KillTNC(struct TNCINFO * TNC);
|
||||
|
|
@ -78,11 +78,6 @@ VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
|
|||
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
|
||||
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[];
|
||||
|
||||
#define MAXUZ7HOPORTS 16
|
||||
|
|
@ -379,7 +374,7 @@ int UZ7HOSetFreq(int port, struct TNCINFO * TNC, struct AGWINFO * AGW, PDATAMESS
|
|||
{
|
||||
// Read Freq
|
||||
|
||||
buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
|
||||
buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -690,11 +685,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
ConnecttoUZ7HO(port);
|
||||
lasttime[port] = ltime;
|
||||
}
|
||||
while (TNC->PortRecord->UI_Q)
|
||||
{
|
||||
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
|
||||
ReleaseBuffer(buffptr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1033,12 +1023,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
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]))
|
||||
{
|
||||
}
|
||||
|
|
@ -1414,7 +1400,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
|
|||
ptr=strchr(TNC->NodeCall, ' ');
|
||||
if (ptr) *(ptr) = 0; // Null Terminate
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO;
|
||||
TNC->Hardware = H_UZ7HO;
|
||||
|
||||
UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
|
||||
|
||||
|
|
@ -1586,81 +1572,81 @@ static int ProcessLine(char * buf, int Port)
|
|||
if (TNC->TCPPort == 0)
|
||||
TNC->TCPPort = 8000;
|
||||
|
||||
TNC->destaddr.sin_family = AF_INET;
|
||||
TNC->destaddr.sin_port = htons(TNC->TCPPort);
|
||||
TNC->HostName = malloc(strlen(p_ipad)+1);
|
||||
TNC->destaddr.sin_family = AF_INET;
|
||||
TNC->destaddr.sin_port = htons(TNC->TCPPort);
|
||||
TNC->HostName = malloc(strlen(p_ipad)+1);
|
||||
|
||||
if (TNC->HostName == NULL) return TRUE;
|
||||
if (TNC->HostName == NULL) return TRUE;
|
||||
|
||||
strcpy(TNC->HostName,p_ipad);
|
||||
strcpy(TNC->HostName,p_ipad);
|
||||
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
if (_stricmp(ptr, "PTT") == 0)
|
||||
if (ptr)
|
||||
{
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr)
|
||||
if (_stricmp(ptr, "PTT") == 0)
|
||||
{
|
||||
DecodePTTString(TNC, ptr);
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
DecodePTTString(TNC, ptr);
|
||||
ptr = strtok(NULL, " \t\n\r");
|
||||
}
|
||||
}
|
||||
|
||||
if (ptr &&_memicmp(ptr, "PATH", 4) == 0)
|
||||
{
|
||||
p_cmd = strtok(NULL, "\n\r");
|
||||
if (p_cmd) TNC->ProgramPath = _strdup(p_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
if (ptr &&_memicmp(ptr, "PATH", 4) == 0)
|
||||
// Read Initialisation lines
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
p_cmd = strtok(NULL, "\n\r");
|
||||
if (p_cmd) TNC->ProgramPath = _strdup(p_cmd);
|
||||
}
|
||||
}
|
||||
if (GetLine(buf) == 0)
|
||||
return TRUE;
|
||||
|
||||
// Read Initialisation lines
|
||||
strcpy(errbuf, buf);
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
if (GetLine(buf) == 0)
|
||||
return TRUE;
|
||||
if (memcmp(buf, "****", 4) == 0)
|
||||
return TRUE;
|
||||
|
||||
strcpy(errbuf, buf);
|
||||
|
||||
if (memcmp(buf, "****", 4) == 0)
|
||||
return TRUE;
|
||||
|
||||
ptr = strchr(buf, ';');
|
||||
if (ptr)
|
||||
{
|
||||
*ptr++ = 13;
|
||||
*ptr = 0;
|
||||
}
|
||||
|
||||
if (_memicmp(buf, "MAXSESSIONS", 11) == 0)
|
||||
{
|
||||
AGW->MaxSessions = atoi(&buf[12]);
|
||||
if (AGW->MaxSessions > 26 ) AGW->MaxSessions = 26;
|
||||
}
|
||||
if (_memicmp(buf, "CONTIMEOUT", 10) == 0)
|
||||
AGW->ConnTimeOut = atoi(&buf[11]) * 10;
|
||||
else
|
||||
ptr = strchr(buf, ';');
|
||||
if (ptr)
|
||||
{
|
||||
*ptr++ = 13;
|
||||
*ptr = 0;
|
||||
}
|
||||
|
||||
if (_memicmp(buf, "MAXSESSIONS", 11) == 0)
|
||||
{
|
||||
AGW->MaxSessions = atoi(&buf[12]);
|
||||
if (AGW->MaxSessions > 26 ) AGW->MaxSessions = 26;
|
||||
}
|
||||
if (_memicmp(buf, "CONTIMEOUT", 10) == 0)
|
||||
AGW->ConnTimeOut = atoi(&buf[11]) * 10;
|
||||
else
|
||||
if (_memicmp(buf, "UPDATEMAP", 9) == 0)
|
||||
TNC->PktUpdateMap = TRUE;
|
||||
else
|
||||
if (_memicmp(buf, "BEACONAFTERSESSION", 18) == 0) // Send Beacon after each session
|
||||
TNC->RPBEACON = TRUE;
|
||||
else
|
||||
if (_memicmp(buf, "WINDOW", 6) == 0)
|
||||
TNC->Window = atoi(&buf[7]);
|
||||
else
|
||||
if (_memicmp(buf, "DEFAULTMODEM", 12) == 0)
|
||||
TNC->AGWInfo->Modem = atoi(&buf[13]);
|
||||
else
|
||||
if (_memicmp(buf, "MODEMCENTER", 11) == 0 || _memicmp(buf, "MODEMCENTRE", 11) == 0)
|
||||
TNC->AGWInfo->CenterFreq = atoi(&buf[12]);
|
||||
else
|
||||
if (standardParams(TNC, buf) == FALSE)
|
||||
strcat(TNC->InitScript, buf);
|
||||
}
|
||||
if (_memicmp(buf, "BEACONAFTERSESSION", 18) == 0) // Send Beacon after each session
|
||||
TNC->RPBEACON = TRUE;
|
||||
else
|
||||
if (_memicmp(buf, "WINDOW", 6) == 0)
|
||||
TNC->Window = atoi(&buf[7]);
|
||||
else
|
||||
if (_memicmp(buf, "DEFAULTMODEM", 12) == 0)
|
||||
TNC->AGWInfo->Modem = atoi(&buf[13]);
|
||||
else
|
||||
if (_memicmp(buf, "MODEMCENTER", 11) == 0 || _memicmp(buf, "MODEMCENTRE", 11) == 0)
|
||||
TNC->AGWInfo->CenterFreq = atoi(&buf[12]);
|
||||
else
|
||||
if (standardParams(TNC, buf) == FALSE)
|
||||
strcat(TNC->InitScript, buf);
|
||||
}
|
||||
|
||||
|
||||
return (TRUE);
|
||||
|
|
@ -2493,7 +2479,7 @@ GotStream:
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
|
|||
13
V4.c
13
V4.c
|
|
@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#define SD_BOTH 0x02
|
||||
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
#include "bpq32.h"
|
||||
|
||||
|
|
@ -622,10 +622,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
|
||||
{
|
||||
char cmd[56];
|
||||
|
||||
strcpy(cmd, &buff->L2DATA[6]);
|
||||
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
|
||||
sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
|
||||
|
||||
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
|
||||
{
|
||||
|
|
@ -974,13 +971,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (TNC->ProgramPath)
|
||||
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)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
@ -1276,7 +1273,7 @@ static VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
|
|||
54
VARA.c
54
VARA.c
|
|
@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <time.h>
|
||||
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#include <Psapi.h>
|
||||
|
|
@ -73,11 +73,6 @@ int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
|
|||
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT);
|
||||
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
|
||||
BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM lParam);
|
||||
#endif
|
||||
|
|
@ -423,9 +418,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
TNC->Busy--;
|
||||
if (TNC->Busy == 0)
|
||||
{ SetWindowText(TNC->xIDC_CHANSTATE, "Clear");
|
||||
SetWindowText(TNC->xIDC_CHANSTATE, "Clear");
|
||||
strcpy(TNC->WEB_CHANSTATE, "Clear");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1169,7 +1163,6 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
TNC->ARDOPBuffer = malloc(8192);
|
||||
TNC->ARDOPDataBuffer = malloc(8192);
|
||||
|
|
@ -1177,7 +1170,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
|
|||
if (TNC->ProgramPath)
|
||||
TNC->WeStartedTNC = 1;
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_VARA;
|
||||
TNC->Hardware = H_VARA;
|
||||
|
||||
if (TNC->BusyWait == 0)
|
||||
TNC->BusyWait = 10;
|
||||
|
|
@ -1185,6 +1178,8 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
|
|||
if (TNC->BusyHold == 0)
|
||||
TNC->BusyHold = 1;
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
else
|
||||
|
|
@ -1451,6 +1446,9 @@ VOID VARAThread(void * portptr)
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
// printf("Starting VARA Thread\n");
|
||||
|
||||
// if on Windows and Localhost see if TNC is running
|
||||
|
||||
#ifdef WIN32
|
||||
|
|
@ -1566,11 +1564,14 @@ TNCRunning:
|
|||
sinx.sin_addr.s_addr = INADDR_ANY;
|
||||
sinx.sin_port = 0;
|
||||
|
||||
// printf("Trying to connect to VARA TNC\n");
|
||||
|
||||
if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0)
|
||||
{
|
||||
// Connected successful
|
||||
|
||||
goto VConnected;
|
||||
|
||||
}
|
||||
|
||||
if (TNC->Alerted == FALSE)
|
||||
|
|
@ -2114,7 +2115,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
// Only allow VarAC mode for incomming sessions
|
||||
|
||||
ProcessIncommingConnectEx(TNC, Call, 0, (TNC->NetRomMode == 0), TRUE);
|
||||
|
||||
|
||||
SESS = TNC->PortRecord->ATTACHEDSESSIONS[0];
|
||||
|
||||
if (Speed)
|
||||
|
|
@ -2229,9 +2230,8 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
if (App < 32)
|
||||
{
|
||||
char AppName[13];
|
||||
char AppBuffer[64];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// if SendTandRtoRelay set and Appl is RMS change to RELAY
|
||||
|
|
@ -2244,7 +2244,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
|
||||
if (CheckAppl(TNC, AppName))
|
||||
{
|
||||
MsgLen = sprintf(AppBuffer, "%s\r", AppName);
|
||||
MsgLen = sprintf(Buffer, "%s\r", AppName);
|
||||
|
||||
buffptr = GetBuff();
|
||||
|
||||
|
|
@ -2254,9 +2254,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
}
|
||||
|
||||
buffptr->Len = MsgLen;
|
||||
memcpy(buffptr->Data, AppBuffer, MsgLen);
|
||||
|
||||
Debugprintf("Calling Application %s", AppBuffer);
|
||||
memcpy(buffptr->Data, Buffer, MsgLen);
|
||||
|
||||
C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
|
||||
|
||||
|
|
@ -2431,7 +2429,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
// return;
|
||||
}
|
||||
|
||||
if (_memicmp(Buffer, "LINK REGISTERED", 9) == 0)
|
||||
if (_memicmp(Buffer, "REGISTERED", 9) == 0)
|
||||
{
|
||||
strcat(Buffer, "\r");
|
||||
WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
|
||||
|
|
@ -2445,13 +2443,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
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)
|
||||
{
|
||||
strcat(Buffer, "\r");
|
||||
|
|
@ -2677,7 +2668,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
|
|||
{
|
||||
int InputLen, MsgLen;
|
||||
char * ptr, * ptr2;
|
||||
char Buffer[8192];
|
||||
char Buffer[4096];
|
||||
|
||||
// shouldn't get several messages per packet, as each should need an ack
|
||||
// May get message split over packets
|
||||
|
|
@ -2685,7 +2676,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
|
|||
if (TNC->InputLen > 8000) // Shouldnt have packets longer than this
|
||||
TNC->InputLen=0;
|
||||
|
||||
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0);
|
||||
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8192 - TNC->InputLen, 0);
|
||||
|
||||
if (InputLen == 0 || InputLen == SOCKET_ERROR)
|
||||
{
|
||||
|
|
@ -2708,18 +2699,12 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
|
|||
|
||||
TNC->InputLen += InputLen;
|
||||
|
||||
TNC->ARDOPBuffer[TNC->InputLen] = 0;
|
||||
Debugprintf("VARA Processing buffer - %s", TNC->ARDOPBuffer);
|
||||
|
||||
loop:
|
||||
|
||||
ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen);
|
||||
|
||||
if (ptr == 0) // CR in buffer
|
||||
{
|
||||
Debugprintf("VARA Part Packet Received - Waiting for rest");
|
||||
return; // Wait for it
|
||||
}
|
||||
|
||||
ptr2 = &TNC->ARDOPBuffer[TNC->InputLen];
|
||||
|
||||
|
|
@ -2742,10 +2727,9 @@ loop:
|
|||
if (TNC->InputLen < MsgLen)
|
||||
{
|
||||
TNC->InputLen = 0;
|
||||
Debugprintf("VARA Corrupt multi command input");
|
||||
return;
|
||||
}
|
||||
memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen - MsgLen);
|
||||
memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen-MsgLen);
|
||||
|
||||
TNC->InputLen -= MsgLen;
|
||||
goto loop;
|
||||
|
|
|
|||
23
Versions.h
23
Versions.h
|
|
@ -10,17 +10,16 @@
|
|||
|
||||
#endif
|
||||
|
||||
#define KVers 6,0,25,12
|
||||
#define KVerstring "6.0.25.12\0"
|
||||
|
||||
#define KVers 6,0,24,50
|
||||
#define KVerstring "6.0.24.50\0"
|
||||
|
||||
#ifdef CKernel
|
||||
|
||||
#define Vers KVers
|
||||
#define Verstring KVerstring
|
||||
#define Datestring "October 2025"
|
||||
#define Datestring "October 2024"
|
||||
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
|
||||
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
|
||||
#define VerCopyright "Copyright © 2001-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "BPQ32 Switch\0"
|
||||
#define VerProduct "BPQ32"
|
||||
|
||||
|
|
@ -31,7 +30,7 @@
|
|||
#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 VerCopyright "Copyright © 2011-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQTermTCP"
|
||||
|
||||
|
|
@ -42,7 +41,7 @@
|
|||
#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 VerCopyright "Copyright © 1999-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQTerminal"
|
||||
|
||||
|
|
@ -53,7 +52,7 @@
|
|||
#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 VerCopyright "Copyright © 1999-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
|
||||
|
||||
#endif
|
||||
|
|
@ -63,7 +62,7 @@
|
|||
#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 VerCopyright "Copyright © 2009-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
|
||||
#define VerProduct "BPQMail"
|
||||
|
||||
|
|
@ -98,7 +97,7 @@
|
|||
#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 VerCopyright "Copyright © 2011-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
|
||||
|
||||
#endif
|
||||
|
|
@ -108,7 +107,7 @@
|
|||
#define Vers KVers
|
||||
#define Verstring KVerstring
|
||||
#define VerComments "APRS Client for G8BPQ Switch\0"
|
||||
#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
|
||||
#define VerCopyright "Copyright © 2012-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "APRS Client for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQAPRS"
|
||||
|
||||
|
|
@ -119,7 +118,7 @@
|
|||
#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 VerCopyright "Copyright © 2009-2024 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
|
||||
#define VerProduct "BPQChat"
|
||||
|
||||
|
|
|
|||
43
WINMOR.c
43
WINMOR.c
|
|
@ -70,7 +70,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#include <Psapi.h>
|
||||
|
|
@ -105,11 +105,6 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
|
|||
BOOL KillOldTNC(char * Path);
|
||||
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 WindowTitle[] = "WINMOR";
|
||||
static int RigControlRow = 165;
|
||||
|
|
@ -144,10 +139,6 @@ VOID WritetoTraceSupport(struct TNCINFO * TNC, char * Msg, int Len)
|
|||
int LineLen, i;
|
||||
UCHAR Save;
|
||||
int SaveLen = Len;
|
||||
char Time[16];
|
||||
time_t T;
|
||||
struct tm * tm;
|
||||
|
||||
if (Len < 0)
|
||||
return;
|
||||
|
||||
|
|
@ -215,16 +206,10 @@ lineloop:
|
|||
#endif
|
||||
// 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, "\r\n");
|
||||
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:
|
||||
ptr1 = ptr2;
|
||||
|
||||
|
|
@ -263,16 +248,10 @@ lineloop:
|
|||
#else
|
||||
index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
|
||||
#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, "\r\n");
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -529,7 +508,7 @@ static int ProcessLine(char * buf, int Port)
|
|||
|
||||
void WINMORThread(void * portptr);
|
||||
VOID ProcessDataSocketData(int port);
|
||||
int ConnecttoWINMOR(int port);
|
||||
int ConnecttoWINMOR();
|
||||
static int ProcessReceivedData(struct TNCINFO * TNC);
|
||||
int V4ProcessReceivedData(struct TNCINFO * TNC);
|
||||
VOID ReleaseTNC(struct TNCINFO * TNC);
|
||||
|
|
@ -618,10 +597,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
{
|
||||
TNC->Busy--;
|
||||
if (TNC->Busy == 0)
|
||||
{
|
||||
SetWindowText(TNC->xIDC_CHANSTATE, "Clear");
|
||||
strcpy(TNC->WEB_CHANSTATE, "Clear");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1007,12 +984,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
|
|||
|
||||
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]))
|
||||
{
|
||||
}
|
||||
|
|
@ -1489,12 +1462,11 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
|
|||
}
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (TNC->ProgramPath)
|
||||
TNC->WeStartedTNC = RestartTNC(TNC);
|
||||
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR;
|
||||
TNC->Hardware = H_WINMOR;
|
||||
|
||||
if (TNC->BusyWait == 0)
|
||||
TNC->BusyWait = 10;
|
||||
|
|
@ -1502,6 +1474,7 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
|
|||
if (TNC->BusyHold == 0)
|
||||
TNC->BusyHold = 1;
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
|
|
@ -2258,7 +2231,7 @@ VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
|
|||
{
|
||||
char AppName[13];
|
||||
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
|
||||
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12);
|
||||
AppName[12] = 0;
|
||||
|
||||
// Make sure app is available
|
||||
|
|
|
|||
38
WPRoutines.c
38
WPRoutines.c
|
|
@ -23,9 +23,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#include "bpqmail.h"
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
|
||||
int CurrentWPIndex;
|
||||
char CurrentWPCall[10];
|
||||
|
||||
|
|
@ -37,8 +34,6 @@ VOID Do_Save_WPRec(HWND hDlg);
|
|||
VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
|
||||
VOID SaveIntValue(config_setting_t * group, char * name, int 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);
|
||||
|
||||
WPRec * AllocateWPRecord()
|
||||
{
|
||||
|
|
@ -125,7 +120,7 @@ VOID GetWPDatabase()
|
|||
|
||||
sprintf(Key, "R%d", i++);
|
||||
|
||||
GetStringValue(group, Key, Record, 1024);
|
||||
GetStringValue(group, Key, Record);
|
||||
|
||||
if (Record[0] == 0) // End of List
|
||||
return;
|
||||
|
|
@ -273,23 +268,23 @@ WPOK:;
|
|||
|
||||
memset(&WPRec, 0, sizeof(WPRec));
|
||||
|
||||
GetStringValue(wpgroup, "c", WPRec.callsign, 6);
|
||||
GetStringValue(wpgroup, "n", WPRec.name, 12);
|
||||
GetStringValue(wpgroup, "c", WPRec.callsign);
|
||||
GetStringValue(wpgroup, "n", WPRec.name);
|
||||
|
||||
WPRec.Type = GetIntValue(wpgroup, "T");
|
||||
WPRec.changed = GetIntValue(wpgroup, "ch");
|
||||
WPRec.seen = GetIntValue(wpgroup, "s");
|
||||
|
||||
GetStringValue(wpgroup, "h", WPRec.first_homebbs, 40);
|
||||
GetStringValue(wpgroup, "sh", WPRec.secnd_homebbs, 40);
|
||||
GetStringValue(wpgroup, "z", WPRec.first_zip, 8);
|
||||
GetStringValue(wpgroup, "sz", WPRec.secnd_zip, 8);
|
||||
GetStringValue(wpgroup, "h", WPRec.first_homebbs);
|
||||
GetStringValue(wpgroup, "sh", WPRec.secnd_homebbs);
|
||||
GetStringValue(wpgroup, "z", WPRec.first_zip);
|
||||
GetStringValue(wpgroup, "sz", WPRec.secnd_zip);
|
||||
|
||||
GetStringValue(wpgroup, "q", Temp, 30);
|
||||
GetStringValue(wpgroup, "q", Temp);
|
||||
Temp[30] = 0;
|
||||
strcpy(WPRec.first_qth, Temp);
|
||||
|
||||
GetStringValue(wpgroup, "sq", Temp, 30);
|
||||
GetStringValue(wpgroup, "sq", Temp);
|
||||
Temp[30] = 0;
|
||||
strcpy(WPRec.secnd_qth, Temp);
|
||||
|
||||
|
|
@ -950,9 +945,6 @@ VOID ProcessWPMsg(char * MailBuffer, int Size, char * FirstRLine)
|
|||
|
||||
WPLen = ptr2 - ptr1;
|
||||
|
||||
if (WPLen > 128)
|
||||
return;
|
||||
|
||||
if ((memcmp(ptr1, "On ", 3) == 0) && (WPLen < 200))
|
||||
{
|
||||
char * Date;
|
||||
|
|
@ -1037,7 +1029,7 @@ it will not be replaced. This flag will be used in case the WP update messages a
|
|||
WPDate -= (time_t)_MYTIMEZONE;
|
||||
TypeString = strlop(Call, '/');
|
||||
|
||||
if (strlen(Call) < 3 || strlen(Call) > 6)
|
||||
if (strlen(Call) < 3 || strlen(Call) > 9)
|
||||
return;
|
||||
|
||||
if (TypeString)
|
||||
|
|
@ -1424,7 +1416,7 @@ int CreateWPMessage()
|
|||
// if (ptr->last_modif > LASTWPSendTime && ptr->Type == 'U' && ptr->first_homebbs[0])
|
||||
if (ptr->changed && ptr->last_modif > LASTWPSendTime && ptr->first_homebbs[0])
|
||||
{
|
||||
tm = gmtime((time_t *)&ptr->last_modif);
|
||||
tm = gmtime(&ptr->last_modif);
|
||||
MsgLen += sprintf(Buffptr, "On %02d%02d%02d %s/%c @ %s zip %s %s %s\r\n",
|
||||
tm->tm_year-100, tm->tm_mon+1, tm->tm_mday,
|
||||
ptr->callsign, ptr->Type, ptr->first_homebbs,
|
||||
|
|
@ -1503,10 +1495,6 @@ int CreateWPMessage()
|
|||
|
||||
BuildNNTPList(Msg); // Build NNTP Groups list
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
To++;
|
||||
}
|
||||
|
||||
|
|
@ -1545,8 +1533,8 @@ VOID CreateWPReport()
|
|||
len = sprintf(Line, "%-7s,%c,%s,%s,%s,%s,%s,%s,%s,%d,%s,%s\r\n",
|
||||
WP->callsign, WP->Type, WP->first_homebbs, WP->first_qth, WP->first_zip,
|
||||
WP->secnd_homebbs, WP->secnd_qth, WP->secnd_zip, WP->name, WP->changed,
|
||||
FormatWPDate((time_t)WP->last_modif),
|
||||
FormatWPDate((time_t)WP->last_seen));
|
||||
FormatWPDate(WP->last_modif),
|
||||
FormatWPDate(WP->last_seen));
|
||||
|
||||
fwrite(Line, 1, len, hFile);
|
||||
}
|
||||
|
|
|
|||
291
WebMail.c
291
WebMail.c
|
|
@ -19,7 +19,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "bpqmail.h"
|
||||
|
||||
#define MAIL
|
||||
|
|
@ -78,7 +78,6 @@ char * doXMLTransparency(char * string);
|
|||
Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall);
|
||||
void SendMessageReadEvent(char * Call, struct MsgInfo * Msg);
|
||||
void SendNewMessageEvent(char * call, struct MsgInfo * Msg);
|
||||
void MQTTMessageEvent(void* message);
|
||||
|
||||
extern char NodeTail[];
|
||||
extern char BBSName[10];
|
||||
|
|
@ -1446,88 +1445,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
|
||||
// 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)
|
||||
{
|
||||
int FileSize;
|
||||
|
|
@ -1541,8 +1458,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
char * FN = &NodeURL[16];
|
||||
char * fileBit = FN;
|
||||
char * ext;
|
||||
char Type[64] = "Content-Type: text/html\r\n";
|
||||
|
||||
|
||||
UndoTransparency(FN);
|
||||
ext = strchr(FN, '.');
|
||||
|
|
@ -1575,34 +1490,27 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
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"
|
||||
if (_stricmp(ext, ".htm") == 0 || _stricmp(ext, ".html") == 0 || _stricmp(ext, ".css") == 0 || _stricmp(ext, ".js") == 0)
|
||||
{
|
||||
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
|
||||
"Content-Type: text/css\r\n"
|
||||
"Date: %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);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Session = NULL;
|
||||
|
||||
|
|
@ -2112,7 +2020,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
|
||||
" document.getElementById('myform').submit();}</script>"
|
||||
"<input type=button class='btn' onclick='myfunc()' "
|
||||
"value='Include Original Msg'>";
|
||||
"value='Include Orignal Msg'>";
|
||||
|
||||
char Temp[1024];
|
||||
char ReplyAddr[128];
|
||||
|
|
@ -2384,7 +2292,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
|
||||
struct HtmlFormDir * Dir;
|
||||
int i;
|
||||
int len;
|
||||
|
||||
SubDir = strlop(&NodeURL[17], ':');
|
||||
DirNo = atoi(&NodeURL[17]);
|
||||
|
|
@ -2405,9 +2312,9 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
Dir = HtmlFormDirs[DirNo];
|
||||
|
||||
if (SubDir)
|
||||
len = sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
|
||||
sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
|
||||
else
|
||||
len = sprintf(popup, popuphddr, Key, Dir->DirName);
|
||||
sprintf(popup, popuphddr, Key, Dir->DirName);
|
||||
|
||||
if (SubDir)
|
||||
{
|
||||
|
|
@ -2418,7 +2325,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
// We only send if there is a .txt file
|
||||
|
||||
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
|
||||
|
|
@ -2430,10 +2337,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
|||
// We only send if there is a .txt file
|
||||
|
||||
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);
|
||||
return;
|
||||
|
|
@ -2501,7 +2408,6 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
|
|||
int i;
|
||||
int MsgLen = 0;
|
||||
char * Boundary;
|
||||
int len;
|
||||
|
||||
WebMailInfo * WebMail = Session->WebMail;
|
||||
|
||||
|
|
@ -2548,7 +2454,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
|
|||
|
||||
// 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
|
||||
|
||||
|
|
@ -2561,21 +2467,21 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
|
|||
if (strcmp(LastGroup, Dir->FormSet) != 0)
|
||||
{
|
||||
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
|
||||
|
||||
n = 0;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
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);
|
||||
|
||||
|
|
@ -2662,10 +2568,10 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
|
|||
if (strlen(WebMail->BID) > 12)
|
||||
WebMail->BID[12] = 0;
|
||||
|
||||
// UndoTransparency(WebMail->BID);
|
||||
// UndoTransparency(WebMail->To);
|
||||
// UndoTransparency(WebMail->Subject);
|
||||
// UndoTransparency(WebMail->Body);
|
||||
UndoTransparency(WebMail->BID);
|
||||
UndoTransparency(WebMail->To);
|
||||
UndoTransparency(WebMail->Subject);
|
||||
UndoTransparency(WebMail->Body);
|
||||
|
||||
MsgLen = strlen(WebMail->Body);
|
||||
|
||||
|
|
@ -2822,18 +2728,6 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
|
|||
strcpy(Msg->via, ToUser->HomeBBS);
|
||||
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
|
||||
{
|
||||
|
|
@ -2946,11 +2840,6 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
|
|||
|
||||
SendNewMessageEvent(user->Call, Msg);
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
if (user && (user->flags & F_APRSMFOR))
|
||||
{
|
||||
char APRS[128];
|
||||
|
|
@ -2986,7 +2875,7 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
|
|||
|
||||
// RMS Express Forms Support
|
||||
|
||||
char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
|
||||
char * GetHTMLViewerTemplate(char * FN)
|
||||
{
|
||||
int i, j, k, l;
|
||||
|
||||
|
|
@ -3000,7 +2889,6 @@ char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
|
|||
{
|
||||
if (strcmp(FN, Dir->Forms[j]->FileName) == 0)
|
||||
{
|
||||
*FormDir = Dir;
|
||||
return CheckFile(Dir, FN);
|
||||
}
|
||||
}
|
||||
|
|
@ -3021,7 +2909,6 @@ char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
|
|||
{
|
||||
if (_stricmp(FN, SDir->Forms[k]->FileName) == 0)
|
||||
{
|
||||
*FormDir = SDir;
|
||||
return CheckFile(SDir, SDir->Forms[k]->FileName);
|
||||
}
|
||||
}
|
||||
|
|
@ -3085,13 +2972,6 @@ VOID GetPage(struct HTTPConnectionInfo * Session, char * NodeURL)
|
|||
ptr = strchr(&NodeURL[17], ',');
|
||||
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], ':');
|
||||
if (SubDir)
|
||||
{
|
||||
|
|
@ -3311,7 +3191,7 @@ char * xxReadTemplate(char * FormSet, char * DirName, char *FileName)
|
|||
while ((entry = readdir(dir)) != NULL)
|
||||
{
|
||||
if (entry->d_type == DT_DIR)
|
||||
continue;
|
||||
continue;
|
||||
|
||||
if (stristr(entry->d_name, FileName))
|
||||
{
|
||||
|
|
@ -3405,13 +3285,6 @@ BOOL ParseXML(WebMailInfo * WebMail, char * XMLOrig)
|
|||
|
||||
// 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>");
|
||||
|
||||
while (ptr1)
|
||||
|
|
@ -3515,8 +3388,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
|
|||
size_t varlen, xmllen;
|
||||
char var[100] = "<";
|
||||
KeyValues * KeyValue;
|
||||
struct HtmlFormDir * Dir;
|
||||
char FormDir[MAX_PATH];
|
||||
|
||||
if (ParseXML(WebMail, XML))
|
||||
ptr = FindXMLVariable(WebMail, "display_form");
|
||||
|
|
@ -3530,11 +3401,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
|
|||
|
||||
strcpy(FN, ptr);
|
||||
|
||||
Form = GetHTMLViewerTemplate(FN, &Dir);
|
||||
|
||||
sprintf(FormDir, "WMFile/%s/%s/", Dir->FormSet, Dir->DirName);
|
||||
|
||||
|
||||
Form = GetHTMLViewerTemplate(FN);
|
||||
|
||||
if (Form == NULL)
|
||||
{
|
||||
|
|
@ -3550,15 +3417,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
|
|||
|
||||
// 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}");
|
||||
{
|
||||
char * temp, * tempsave;
|
||||
|
|
@ -3698,23 +3556,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
|
|||
|
||||
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)
|
||||
{
|
||||
xmllen = strlen(KeyValue->Value);
|
||||
|
|
@ -3730,8 +3571,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
|
|||
break;
|
||||
}
|
||||
|
||||
KeyValue++;
|
||||
|
||||
if (KeyValue->Key == NULL)
|
||||
{
|
||||
// Not found in XML
|
||||
|
|
@ -3741,7 +3580,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
|
|||
sprintf(Err, VarNotFoundMsg, var, "%s");
|
||||
return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err);
|
||||
}
|
||||
|
||||
KeyValue++;
|
||||
}
|
||||
|
||||
formptr = endptr + 1;
|
||||
|
|
@ -3945,12 +3784,6 @@ VOID WriteOneRecipient(struct MsgInfo * Msg, WebMailInfo * WebMail, int MsgLen,
|
|||
Msg->status = '$'; // Has forwarding
|
||||
|
||||
BuildNNTPList(Msg); // Build NNTP Groups list
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4251,18 +4084,6 @@ VOID SaveTemplateMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
|
|||
strcpy(Msg->via, ToUser->HomeBBS);
|
||||
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
|
||||
{
|
||||
|
|
@ -4483,18 +4304,6 @@ VOID BuildMessageFromHTMLInput(struct HTTPConnectionInfo * Session, char * Reply
|
|||
strcpy(Msg->via, ToUser->HomeBBS);
|
||||
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
|
||||
{
|
||||
|
|
@ -4559,12 +4368,6 @@ VOID BuildMessageFromHTMLInput(struct HTTPConnectionInfo * Session, char * Reply
|
|||
|
||||
BuildNNTPList(Msg); // Build NNTP Groups list
|
||||
|
||||
#ifndef NOMQTT
|
||||
if (MQTT)
|
||||
MQTTMessageEvent(Msg);
|
||||
#endif
|
||||
|
||||
|
||||
SaveMessageDatabase();
|
||||
SaveBIDDatabase();
|
||||
|
||||
|
|
@ -5609,7 +5412,7 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
|
|||
while ((entry = readdir(dir)) != NULL)
|
||||
{
|
||||
if (entry->d_type == DT_DIR)
|
||||
continue;
|
||||
continue;
|
||||
|
||||
if (stricmp(entry->d_name, FN) == 0)
|
||||
{
|
||||
|
|
@ -5625,6 +5428,8 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
|
|||
|
||||
#endif
|
||||
|
||||
printf("%s\n", MsgFile);
|
||||
|
||||
if (stat(MsgFile, &STAT) != -1)
|
||||
{
|
||||
hFile = fopen(MsgFile, "rb");
|
||||
|
|
@ -5641,6 +5446,8 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
|
|||
MsgBytes[FileSize] = 0;
|
||||
fclose(hFile);
|
||||
|
||||
printf("%d %s\n", strlen(MsgBytes), MsgBytes);
|
||||
|
||||
return MsgBytes;
|
||||
}
|
||||
return NULL;
|
||||
|
|
@ -5670,7 +5477,6 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
|
|||
char * ptr, * ptr1;
|
||||
char * prompt;
|
||||
char * var[100];
|
||||
int len;
|
||||
|
||||
WebMailInfo * WebMail = Session->WebMail;
|
||||
|
||||
|
|
@ -5740,7 +5546,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
|
|||
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++)
|
||||
{
|
||||
|
|
@ -5749,9 +5555,9 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
|
|||
if (key == NULL)
|
||||
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);
|
||||
free(SelCopy);
|
||||
|
|
@ -6310,17 +6116,16 @@ VOID getAttachmentList(struct HTTPConnectionInfo * Session, char * Reply, int *
|
|||
char popup[10000];
|
||||
int i;
|
||||
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++)
|
||||
{
|
||||
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);
|
||||
return;
|
||||
|
|
@ -6466,7 +6271,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];
|
||||
|
||||
|
|
|
|||
12
WinRPR.c
12
WinRPR.c
|
|
@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define MaxStreams 1
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
|
||||
|
||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
|
||||
|
|
@ -63,6 +63,8 @@ extern char LOC[];
|
|||
static RECT Rect;
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
char * strlop(char * buf, char delim);
|
||||
|
||||
char NodeCall[11]; // Nodecall, Null Terminated
|
||||
|
||||
static BOOL WriteCommBlock(struct TNCINFO * TNC);
|
||||
|
|
@ -795,8 +797,7 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
|
|||
WritetoConsoleLocal(msg);
|
||||
|
||||
TNC->Port = port;
|
||||
TNC->PortRecord = PortEntry;
|
||||
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
|
||||
TNC->Hardware = H_WINRPR;
|
||||
|
||||
// Set up DED addresses for streams
|
||||
|
||||
|
|
@ -812,6 +813,8 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
|
|||
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
|
||||
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
|
||||
|
||||
TNC->PortRecord = PortEntry;
|
||||
|
||||
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
|
||||
memcpy(TNC->NodeCall, MYNODECALL, 10);
|
||||
else
|
||||
|
|
@ -1580,6 +1583,8 @@ TNCRunning:
|
|||
|
||||
// Send INIT script
|
||||
|
||||
// VARA needs each command in a separate send
|
||||
|
||||
ptr1 = &TNC->InitScript[0];
|
||||
|
||||
GetSemaphore(&Semaphore, 52);
|
||||
|
|
@ -1604,6 +1609,7 @@ TNCRunning:
|
|||
c = *(ptr2 + 1); // Save next char
|
||||
*(ptr2 + 1) = 0; // Terminate string
|
||||
}
|
||||
// VARASendCommand(TNC, ptr1, TRUE);
|
||||
|
||||
if (ptr2)
|
||||
*(1 + ptr2++) = c; // Put char back
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ int main(int argc, char ** argv)
|
|||
|
||||
if (argc < 3)
|
||||
{
|
||||
printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
|
||||
printf ("Missing paramters - 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");
|
||||
|
||||
|
|
|
|||
6
adif.c
6
adif.c
|
|
@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "time.h"
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "tncinfo.h"
|
||||
#include "adif.h"
|
||||
#include "telnetserver.h"
|
||||
|
|
@ -409,7 +409,8 @@ BOOL WriteADIFRecord(ADIF * 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(Value, &STAT);
|
||||
|
|
@ -608,6 +609,7 @@ VOID ADIFWriteFreqList()
|
|||
|
||||
fprintf(Handle, "[Channels]\r\n");
|
||||
|
||||
|
||||
for (i = 0; i < freqCount; i++)
|
||||
fprintf(Handle, "Frequency %d=%lld\r\n" , i + 1, Freqs[i]);
|
||||
|
||||
|
|
|
|||
159
asmstrucs.h
159
asmstrucs.h
|
|
@ -33,7 +33,6 @@ typedef int (FAR *FARPROCY)();
|
|||
#define L4BUSY 0x80 // BNA - DONT SEND ANY MORE
|
||||
#define L4NAK 0x40 // NEGATIVE RESPONSE 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 L4CACK 2 // CONNECT ACK
|
||||
|
|
@ -41,8 +40,7 @@ typedef int (FAR *FARPROCY)();
|
|||
#define L4DACK 4 // DISCONNECT ACK
|
||||
#define L4INFO 5 // INFORMATION
|
||||
#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 MYALIASTEXT[]; // 6 chars, not null terminated
|
||||
|
|
@ -64,6 +62,15 @@ extern int ENDOFDATA;
|
|||
extern int L3LIVES;
|
||||
extern int NUMBEROFNODES;
|
||||
|
||||
typedef struct _CMDX
|
||||
{
|
||||
char String[12]; // COMMAND STRING
|
||||
UCHAR CMDLEN; // SIGNIFICANT LENGTH
|
||||
VOID (* CMDPROC)(); // COMMAND PROCESSOR
|
||||
size_t CMDFLAG; // FLAG/VALUE Offset
|
||||
|
||||
} CMDX;
|
||||
|
||||
|
||||
struct APPLCONFIG
|
||||
{
|
||||
|
|
@ -163,35 +170,6 @@ typedef struct _TRANSPORTENTRY
|
|||
char APPL[16]; // Set if session initiated by an APPL
|
||||
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;
|
||||
|
||||
time_t ConnectTime;
|
||||
char Direction[16]; // In or Out
|
||||
|
||||
int Service; // For Paula's Connnect to Service
|
||||
int apiSeq; // for OARC event reporting
|
||||
time_t lastStatusSentTime;
|
||||
|
||||
|
||||
} TRANSPORTENTRY;
|
||||
|
||||
//
|
||||
|
|
@ -217,9 +195,6 @@ typedef struct ROUTE
|
|||
UCHAR NEIGHBOUR_QUAL;
|
||||
UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE
|
||||
|
||||
#define LOCKEDBYCONFIG 1
|
||||
#define LOCKEDBYSYSOP 2
|
||||
|
||||
struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR
|
||||
|
||||
USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM)
|
||||
|
|
@ -234,15 +209,13 @@ typedef struct ROUTE
|
|||
BOOL INP3Node;
|
||||
BOOL NoKeepAlive; // Suppress Keepalive Processing
|
||||
int LastConnectAttempt; // To stop us trying too often
|
||||
int ConnectionAttempts;
|
||||
|
||||
int Status; //
|
||||
int OldBPQ; // Set if other end is BPQ sending RIF in mS
|
||||
int Status; //
|
||||
int LastRTT; // Last Value Reported
|
||||
int RTT; // Current
|
||||
int SRTT; // Smoothed RTT
|
||||
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 Timeout; // Lost Response Timer
|
||||
int Retries; // Lost Response Count
|
||||
|
|
@ -251,13 +224,6 @@ typedef struct ROUTE
|
|||
int OtherendsRouteQual; // Route quality used by other end.
|
||||
int OtherendLocked; // Route quality locked by ROUTES entry.
|
||||
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;
|
||||
struct addrinfo * TCPAddress; // Resolved Address
|
||||
|
||||
} *PROUTE;
|
||||
|
||||
|
|
@ -267,7 +233,6 @@ typedef struct ROUTE
|
|||
#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
|
||||
// (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
|
||||
// (only sent when we have seen both a request and response)
|
||||
|
||||
|
|
@ -475,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,
|
||||
// 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
|
||||
{
|
||||
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
|
||||
UCHAR ROUT_QUALITY; // QUALITY
|
||||
UCHAR ROUT_OBSCOUNT;
|
||||
UCHAR ROUT_LOCKED;
|
||||
UCHAR Padding[4]; // So Entries are the same length
|
||||
UCHAR Padding[5]; // SO Entries are the same length
|
||||
} *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
|
||||
USHORT LastRTT; // Last Value Reported
|
||||
|
|
@ -505,13 +467,13 @@ typedef struct DEST_LIST
|
|||
UCHAR DEST_ALIAS[6];
|
||||
|
||||
UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC
|
||||
UCHAR DEST_LOCKED;
|
||||
|
||||
UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION
|
||||
UCHAR INP3FLAGS;
|
||||
|
||||
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 NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest
|
||||
|
||||
struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
|
||||
|
||||
void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION
|
||||
|
||||
|
|
@ -585,14 +547,14 @@ typedef struct PORTCONTROL
|
|||
PMESSAGE PORTRX_Q; // FRAMES RECEIVED ON THIS PORT
|
||||
PMESSAGE PORTTX_Q; // FRAMES TO BE SENT ON THIS PORT
|
||||
|
||||
void (FAR * PORTTXROUTINE)(struct _EXTPORTDATA * PORTVEC, MESSAGE * Buffer); // POINTER TO TRANSMIT ROUTINE FOR THIS PORT
|
||||
void (FAR * PORTRXROUTINE)(struct _EXTPORTDATA * PORTVEC); // POINTER TO RECEIVE ROUTINE FOR THIS PORT
|
||||
void (FAR * PORTINITCODE)(struct PORTCONTROL * PortVector); // INITIALISATION ROUTINE
|
||||
void (FAR * PORTTIMERCODE)(struct PORTCONTROL * PortVector); //
|
||||
void (FAR * PORTCLOSECODE)(struct PORTCONTROL * PortVector); // CLOSE ROUTINE
|
||||
int (FAR * PORTTXCHECKCODE)(struct PORTCONTROL * PORTVEC, int Chan); // OK to TX Check
|
||||
BOOL (FAR * PORTSTOPCODE)(struct PORTCONTROL * PORT); // Temporarily Stop Port
|
||||
BOOL (FAR * PORTSTARTCODE)(struct PORTCONTROL * PORT); // Restart Port
|
||||
void (FAR * PORTTXROUTINE)(); // POINTER TO TRANSMIT ROUTINE FOR THIS PORT
|
||||
void (FAR * PORTRXROUTINE)(); // POINTER TO RECEIVE ROUTINE FOR THIS PORT
|
||||
void (FAR * PORTINITCODE)(); // INITIALISATION ROUTINE
|
||||
void (FAR * PORTTIMERCODE)(); //
|
||||
void (FAR * PORTCLOSECODE)(); // CLOSE ROUTINE
|
||||
int (FAR * PORTTXCHECKCODE)(); // OK to TX Check
|
||||
BOOL (FAR * PORTSTOPCODE)(); // Temporarily Stop Port
|
||||
BOOL (FAR * PORTSTARTCODE)(); // Restart Port
|
||||
BOOL PortStopped; // STOPPORT command used
|
||||
BOOL PortSuspended; // Suspended by interlock
|
||||
|
||||
|
|
@ -715,14 +677,11 @@ typedef struct PORTCONTROL
|
|||
BOOL NormalizeQuality; // Normalise Node Qualities
|
||||
BOOL IgnoreUnlocked; // Ignore Unlocked routes
|
||||
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
|
||||
FARPROCY UIHook; // Used for KISSARQ
|
||||
struct PORTCONTROL * HookPort;
|
||||
int PortSlot; // Index in Port Table
|
||||
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
|
||||
unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED)
|
||||
char * CTEXT; // Port Specific CText
|
||||
|
|
@ -742,10 +701,6 @@ typedef struct PORTCONTROL
|
|||
UCHAR * TX; // % Sending
|
||||
UCHAR * BUSY; // % Active (Normally DCD active or TX)
|
||||
|
||||
int Hardware; // TNC H_TYPE. Copied here for access from application context
|
||||
int isRF; // For API reporting. -1 is unspecified
|
||||
|
||||
|
||||
} PORTCONTROLX, *PPORTCONTROL;
|
||||
|
||||
typedef struct FULLPORTDATA
|
||||
|
|
@ -811,7 +766,7 @@ typedef struct _EXTPORTDATA
|
|||
{
|
||||
struct PORTCONTROL PORTCONTROL ; // REMAP HARDWARE INFO
|
||||
|
||||
void * (* PORT_EXT_ADDR) (int fn, int port, PDATAMESSAGE buff); // ADDR OF RESIDENT ROUTINE
|
||||
void * (* PORT_EXT_ADDR) (); // ADDR OF RESIDENT ROUTINE
|
||||
char PORT_DLL_NAME[16];
|
||||
UCHAR EXTRESTART; // FLAG FOR DRIVER REINIT
|
||||
HINSTANCE DLLhandle;
|
||||
|
|
@ -946,9 +901,6 @@ typedef struct _LINKTABLE
|
|||
VOID * FRAMES[8]; // FRAMES WAITING ACK
|
||||
VOID * RXFRAMES[8]; // Frames received out of sequence
|
||||
|
||||
time_t LASTFRAMESENT; // For detecting stuck links
|
||||
int LASTSENTQCOUNT; //
|
||||
|
||||
UCHAR L2STATE; // PROCESSING STATE
|
||||
UCHAR Ver2point2; // Set if running 2.2
|
||||
USHORT L2TIMER; // FRAME RETRY TIMER
|
||||
|
|
@ -982,36 +934,6 @@ typedef struct _LINKTABLE
|
|||
time_t ConnectTime; // For session stats
|
||||
int bytesRXed; // Info bytes only
|
||||
int bytesTXed;
|
||||
int framesRXed;
|
||||
int framesTXed;
|
||||
int framesResent;
|
||||
time_t LastStatusTime;
|
||||
int LastStatusbytesRXed;
|
||||
int LastStatusbytesTXed;
|
||||
int maxQueued;
|
||||
int intervalMaxQueued;
|
||||
|
||||
uint64_t lastPSent; // Time last I frame with P bit sent in mS (for RTT Measurements)
|
||||
int RTT;
|
||||
|
||||
|
||||
// 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;
|
||||
int apiSeq; // for OARC event reporting
|
||||
|
||||
} LINKTABLE;
|
||||
|
||||
|
|
@ -1121,13 +1043,7 @@ struct SEM
|
|||
int Gets;
|
||||
int Rels;
|
||||
DWORD SemProcessID;
|
||||
#ifdef WIN32
|
||||
DWORD SemThreadID;
|
||||
#else
|
||||
pthread_t SemThreadID;
|
||||
#endif
|
||||
int Line; // caller file and line
|
||||
char File[MAX_PATH];
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1412,8 +1328,6 @@ struct arp_table_entry
|
|||
// SOCKET SourceSocket;
|
||||
struct AXIPPORTINFO * PORT;
|
||||
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
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1503,25 +1417,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 Connect(stream) SessionControl(stream,1,0)
|
||||
|
|
|
|||
2
bpq32.h
2
bpq32.h
|
|
@ -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 GetPortTableEntryFromSlot(int portslot);
|
||||
|
||||
int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT);
|
||||
|
||||
|
||||
// Returns number of free buffers
|
||||
// (BPQHOST function 7 (part)).
|
||||
|
|
|
|||
90
bpqaxip.c
90
bpqaxip.c
|
|
@ -141,7 +141,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#ifndef WIN32
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
|
@ -192,9 +192,9 @@ extern UCHAR BPQDirectory[];
|
|||
|
||||
extern int OffsetH, OffsetW;
|
||||
|
||||
static void ResolveNames(VOID * Param);
|
||||
void OpenSockets(VOID * Param);
|
||||
void CloseSockets(struct AXIPPORTINFO * PORT);
|
||||
static void ResolveNames(struct AXIPPORTINFO * PORT);
|
||||
void OpenSockets(struct AXIPPORTINFO * PORT);
|
||||
void CloseSockets();
|
||||
|
||||
|
||||
static int CONVFROMAX25(char * incall, char * outcall);
|
||||
|
|
@ -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 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,
|
||||
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 convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
|
||||
static BOOL ReadConfigFile(int Port);
|
||||
|
|
@ -213,7 +213,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT);
|
|||
BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
|
||||
int DumpFrameInHex(unsigned char * msg, int len);
|
||||
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 GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
|
||||
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_Connect(int SocketId, int Error);
|
||||
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 Consoleprintf(const char * format, ...);
|
||||
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 (CheckSourceisResolvable(PORT, call, 0, &RXaddr, 0))
|
||||
if (CheckSourceisResolvable(PORT, call, 0, &RXaddr))
|
||||
|
||||
return 1;
|
||||
|
||||
|
|
@ -437,14 +437,14 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
|
|||
// Can't reply. If AutoConfig is set, add to table and accept, else reject
|
||||
|
||||
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
|
||||
{
|
||||
char From[11] = "|";
|
||||
From[ConvFromAX25(call, &From[1]) + 1] = 0;
|
||||
if (strstr(CantReplyList, From) == 0)
|
||||
{
|
||||
if (strlen(CantReplyList) < 500)
|
||||
if (strlen(CantReplyList) < 500);
|
||||
strcat(CantReplyList, From);
|
||||
Debugprintf("AXIP Packet from %s dropped - can't reply", &From[1]);
|
||||
}
|
||||
|
|
@ -536,7 +536,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
|
|||
|
||||
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;
|
||||
else
|
||||
{
|
||||
|
|
@ -547,17 +547,17 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
|
|||
{
|
||||
char Addr[80];
|
||||
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
|
||||
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
|
||||
{
|
||||
char From[11] = "|";
|
||||
From[ConvFromAX25(call, &From[1]) + 1] = 0;
|
||||
if (strstr(CantReplyList, From) == 0)
|
||||
{
|
||||
if (strlen(CantReplyList) < 500)
|
||||
if (strlen(CantReplyList) < 500);
|
||||
strcat(CantReplyList, From);
|
||||
Debugprintf("AXIP Packet from %s dropped - can't reply", &From[1]);
|
||||
}
|
||||
|
|
@ -692,7 +692,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
|
|||
else
|
||||
Consoleprintf("Failed to reread config file - leaving config unchanged");
|
||||
|
||||
_beginthread(OpenSockets, 0, PORT);
|
||||
_beginthread(OpenSockets, 0, PORT );
|
||||
|
||||
GetAXIPCache(PORT);
|
||||
|
||||
|
|
@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
|
|||
return;
|
||||
}
|
||||
|
||||
// Select source port by choosing right socket
|
||||
// Seelcte source port by choosing right socket
|
||||
|
||||
// First Set Default for Protocol
|
||||
|
||||
|
|
@ -844,9 +844,8 @@ int InitAXIP(int Port)
|
|||
return (TRUE);
|
||||
}
|
||||
|
||||
void OpenSockets(void * Param)
|
||||
void OpenSockets(struct AXIPPORTINFO * PORT)
|
||||
{
|
||||
struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
|
||||
char Msg[255];
|
||||
int err;
|
||||
u_long param=1;
|
||||
|
|
@ -1344,7 +1343,6 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
|
|||
char axcall[7];
|
||||
BOOL UDPFlag, BCFlag;
|
||||
struct AXIPPORTINFO * PORT;
|
||||
int useSourcePort = 0;
|
||||
|
||||
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))
|
||||
{
|
||||
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;
|
||||
return(DestroyWindow(hWnd));
|
||||
}
|
||||
|
|
@ -1529,9 +1527,8 @@ static void CreateResolverWindow(struct AXIPPORTINFO * PORT)
|
|||
extern HWND hWndPopup;
|
||||
|
||||
|
||||
static void ResolveNames(VOID * Param)
|
||||
static void ResolveNames(struct AXIPPORTINFO * PORT)
|
||||
{
|
||||
struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
|
||||
int count = 0;
|
||||
|
||||
PORT->ResolveNamesThreadId = GetCurrentThreadId(); // Detect if another started
|
||||
|
|
@ -2150,7 +2147,6 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
|
|||
int Interval;
|
||||
int noUpdate=FALSE;
|
||||
int TCPMode;
|
||||
int useSourcePort = 0;
|
||||
|
||||
ptr = strtok(buf, " \t\n\r");
|
||||
|
||||
|
|
@ -2238,7 +2234,6 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
|
|||
bcflag=0;
|
||||
TCPMode=0;
|
||||
SourcePort = 0;
|
||||
useSourcePort = 0;
|
||||
|
||||
//
|
||||
// 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 (_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");
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2339,7 +2327,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
|
|||
if (SourcePort == 0)
|
||||
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);
|
||||
}
|
||||
} // 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,
|
||||
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;
|
||||
|
||||
|
|
@ -2469,8 +2457,7 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
|
|||
|
||||
arp->PORT = PORT;
|
||||
|
||||
if (port == 0 && arp->replytoSourcePort == 0)
|
||||
PORT->needip = 1; // Enable Raw IP Mode
|
||||
if (port == 0) PORT->needip = 1; // Enable Raw IP Mode
|
||||
|
||||
arp->ResolveFlag=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->noUpdate = noUpdate;
|
||||
PORT->arp_table_len++;
|
||||
arp->replytoSourcePort = useSourcePort;
|
||||
|
||||
if (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);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
|
|
@ -2620,17 +2606,10 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPo
|
|||
struct sockaddr_in * SA = rxaddr;
|
||||
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 = FromPort;
|
||||
arp->destaddr.sin_port = htons(arp->port);
|
||||
if (arp->SourcePort == 0)
|
||||
arp->SourcePort = ToPort;
|
||||
}
|
||||
//arp->port = Port;
|
||||
}
|
||||
arp->LastHeard = time(NULL);
|
||||
return 1; // Ok to process
|
||||
}
|
||||
index++;
|
||||
|
|
@ -2998,9 +2977,8 @@ int KissDecode(UCHAR * inbuff, int len)
|
|||
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];
|
||||
int err, i;
|
||||
u_long param=1;
|
||||
|
|
@ -3268,21 +3246,15 @@ VOID SaveAXIPCache(struct AXIPPORTINFO * PORT)
|
|||
|
||||
#ifndef LINBPQ
|
||||
|
||||
static BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
|
||||
static BOOL GetStringValue(config_setting_t * group, char * name, char * value)
|
||||
{
|
||||
char * str;
|
||||
const char * str;
|
||||
config_setting_t *setting;
|
||||
|
||||
setting = config_setting_get_member (group, name);
|
||||
if (setting)
|
||||
{
|
||||
str = (char *)config_setting_get_string (setting);
|
||||
|
||||
if (strlen(str) > maxlen)
|
||||
{
|
||||
Debugprintf("Suspect config record %s", str);
|
||||
str[maxlen] = 0;
|
||||
}
|
||||
str = config_setting_get_string (setting);
|
||||
strcpy(value, str);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -3349,7 +3321,7 @@ VOID GetAXIPCache(struct AXIPPORTINFO * PORT)
|
|||
ptr++;
|
||||
}
|
||||
|
||||
if (GetStringValue(group, Key, hostaddr, 64))
|
||||
if (GetStringValue(group, Key, hostaddr))
|
||||
{
|
||||
arp->destaddr.sin_addr.s_addr = inet_addr(hostaddr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,9 +73,6 @@
|
|||
//.25
|
||||
|
||||
// Increase size of status display buffers (7)
|
||||
// Allow sending BEL (CTRL/G) (79)
|
||||
// Fix sending BEL (CTRL/G) (81)
|
||||
|
||||
|
||||
#include "BPQChat.h"
|
||||
#include "Dbghelp.h"
|
||||
|
|
|
|||
|
|
@ -687,11 +687,7 @@ int RemoveLF(char * Message, int len);
|
|||
struct SEM;
|
||||
|
||||
BOOL isdigits(char * string);
|
||||
|
||||
|
||||
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
|
||||
|
||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
|
||||
void GetSemaphore(struct SEM * Semaphore, int ID);
|
||||
void FreeSemaphore(struct SEM * Semaphore);
|
||||
|
||||
VOID __cdecl Debugprintf(const char * format, ...);
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
|
||||
//#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include <process.h>
|
||||
#include "pcap.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "CHeaders.h"
|
||||
#include "bpq32.h"
|
||||
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue