Compare commits

..

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

97 changed files with 1401 additions and 4049 deletions

View File

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

View File

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

View File

@ -760,7 +760,7 @@ void SaveVesselDataBase()
void LoadNavAidDataBase() void LoadNavAidDataBase()
{ {
int i, n, count; int i;
FILE *file; FILE *file;
char buf[256]; char buf[256];
@ -793,12 +793,10 @@ void LoadNavAidDataBase()
NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *)); NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *));
count = 0;
for (i = 0; i < NavAidCount; i++) for (i = 0; i < NavAidCount; i++)
{ {
navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD)); navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD));
NavRecords[count] = navptr; NavRecords[i] = navptr;
memset(navptr, 0, sizeof(struct NAVAIDRECORD)); memset(navptr, 0, sizeof(struct NAVAIDRECORD));
fgets(buf, 255, file); fgets(buf, 255, file);
@ -809,19 +807,6 @@ void LoadNavAidDataBase()
token = strtok(NULL, "|\n" ); token = strtok(NULL, "|\n" );
strcpy(&navptr->name[0],token); strcpy(&navptr->name[0],token);
for (n = 0; n < 20; n++)
{
char c = navptr->name[n];
if (!isalpha(c) && !isdigit(c) && c != ' ' && c != '_')
{
count--;
break;
}
}
count++;
token = strtok(NULL, "|\n" ); token = strtok(NULL, "|\n" );
navptr->lat = atof(token); navptr->lat = atof(token);
@ -835,7 +820,6 @@ void LoadNavAidDataBase()
navptr->TimeLastUpdated = atoi(token); navptr->TimeLastUpdated = atoi(token);
} }
NavAidCount = count;
fclose(file); fclose(file);
} }

View File

@ -553,8 +553,6 @@ int APRSWriteLog(char * msg)
UCHAR Value[MAX_PATH]; UCHAR Value[MAX_PATH];
time_t T; time_t T;
struct tm * tm; struct tm * tm;
int n;
if (LogAPRSIS == 0) if (LogAPRSIS == 0)
return 0; return 0;
@ -576,9 +574,8 @@ int APRSWriteLog(char * msg)
strcat(Value, "logs/APRS_"); strcat(Value, "logs/APRS_");
} }
n = strlen(Value); sprintf(Value, "%s%02d%02d%02d.log", Value,
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
sprintf(&Value[n], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "ab")) == NULL) if ((file = fopen(Value, "ab")) == NULL)
return FALSE; return FALSE;

47
ARDOP.c
View File

@ -888,7 +888,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime)) if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
{ {
Debugprintf("ARDOP closing session on SessionTimelimit");
ARDOPSendCommand(TNC, "DISCONNECT", TRUE); ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
STREAM->ReportDISC = 1; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0; STREAM->AttachTime = 0;
@ -901,7 +900,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime)) if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
{ {
Debugprintf("ARDOP closing session on AttachTimelimit");
STREAM->ReportDISC = 1; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0; STREAM->AttachTime = 0;
} }
@ -1496,10 +1494,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -2061,12 +2056,21 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
strcat(TempScript, "ARQTIMEOUT 90\r"); strcat(TempScript, "ARQTIMEOUT 90\r");
// strcat(TempScript, "ROBUST False\r"); // strcat(TempScript, "ROBUST False\r");
// Make MYAUX and MYCALL overridable strcat(TempScript, TNC->InitScript);
free(TNC->InitScript);
TNC->InitScript = TempScript;
// Set MYCALL
// strcat(TNC->InitScript,"FECRCV True\r");
// strcat(TNC->InitScript,"AUTOBREAK True\r");
sprintf(Msg, "MYCALL %s\r", TNC->NodeCall); sprintf(Msg, "MYCALL %s\r", TNC->NodeCall);
strcat(TempScript, Msg); strcat(TNC->InitScript, Msg);
// strcat(TNC->InitScript,"PROCESSID\r");
// strcat(TNC->InitScript,"CODEC TRUE\r");
// strcat(TNC->InitScript,"LISTEN TRUE\r");
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
@ -2090,25 +2094,9 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (strlen(Aux) > 8) if (strlen(Aux) > 8)
{ {
Aux[strlen(Aux) - 1] = '\r'; Aux[strlen(Aux) - 1] = '\r';
strcat(TempScript, Aux); strcat(TNC->InitScript, Aux);
} }
strcat(TempScript, TNC->InitScript);
free(TNC->InitScript);
TNC->InitScript = TempScript;
// strcat(TNC->InitScript,"FECRCV True\r");
// strcat(TNC->InitScript,"AUTOBREAK True\r");
// strcat(TNC->InitScript,"PROCESSID\r");
// strcat(TNC->InitScript,"CODEC TRUE\r");
// strcat(TNC->InitScript,"LISTEN TRUE\r");
strcpy(TNC->CurrentMYC, TNC->NodeCall); strcpy(TNC->CurrentMYC, TNC->NodeCall);
if (TNC->WL2K == NULL) if (TNC->WL2K == NULL)
@ -3150,7 +3138,6 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Incoming Connect // Incoming Connect
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
STREAM->AttachTime = time(NULL);
// Stop other ports in same group // Stop other ports in same group
@ -5968,8 +5955,8 @@ VOID ARAXINIT(struct PORTCONTROL * PORT)
char Msg[80] = ""; char Msg[80] = "";
memcpy(Msg, PORT->PORTDESCRIPTION, 30); memcpy(Msg, PORT->PORTDESCRIPTION, 30);
strcat(Msg, "\n); sprintf(Msg, "%s\n", Msg);
WritetoConsoleLocal(Msg); WritetoConsoleLocal(Msg);
} }

View File

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

View File

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

572
BPQINP3.c

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

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

1090
BPQMail.rc

File diff suppressed because it is too large Load Diff

12
BPQRemotePTT.cfg Normal file
View File

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

View File

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

47
Bpq32.c
View File

@ -1253,36 +1253,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix problem using SENDRAW from BPQMail (63) // Fix problem using SENDRAW from BPQMail (63)
// Fix compatibility with latest ardopcf (64) // Fix compatibility with latest ardopcf (64)
// Fix bug in RHP socket timeout code (65) // 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)
#define CKernel #define CKernel
@ -2404,8 +2375,6 @@ FirstInit()
} }
timeLoadedMS = GetTickCount(); timeLoadedMS = GetTickCount();
srand(time(NULL));
INITIALISEPORTS(); INITIALISEPORTS();
@ -6148,14 +6117,13 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n", RegLine); len = sprintf(RegLine, "%s\\\r\n", RegLine);
strcat(RegLine, "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len += sprintf(&RegLine[len], "%02x,", Value[k]); len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;
RegLine[++len] = 0x0a; RegLine[++len] = 0x0a;
@ -6181,20 +6149,19 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n"); len = sprintf(RegLine, "%s\\\r\n", RegLine);
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
len += sprintf(&RegLine[len], "%02x,", Value[k]);
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n"); len = sprintf(RegLine, "%s\\\r\n", RegLine);
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
} }
len += sprintf(&RegLine[len], "00,"); len = sprintf(RegLine, "%s00,", RegLine);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;

View File

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

View File

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

View File

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

148
Cmd.c
View File

@ -70,10 +70,6 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
VOID WriteMiniDump(); VOID WriteMiniDump();
int CheckKissInterlock(struct PORTCONTROL * PORT, int Exclusive); int CheckKissInterlock(struct PORTCONTROL * PORT, int Exclusive);
int seeifInterlockneeded(struct PORTCONTROL * PORT); int seeifInterlockneeded(struct PORTCONTROL * PORT);
int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b);
int CompareRoutes(const void * a, const void * b);
extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer); extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer);
@ -1229,81 +1225,38 @@ VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
BOOL FindLink(UCHAR * LinkCall, UCHAR * OurCall, int Port, struct _LINKTABLE ** REQLINK);
VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD) VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS 'LINKS' MESSAGE // PROCESS 'LINKS' MESSAGE
struct _LINKTABLE * LINK = LINKS; struct _LINKTABLE * LINK = LINKS;
int n = MAXLINKS; int n = MAXLINKS;
int len, Count; int len;
char Normcall[11] = ""; char Normcall[11] = "";
UCHAR DEST[7];
UCHAR ORIGIN[7];
int Port = 0;
char * ptr = 0, * Context;
ptr = strtok_s(CmdTail, " ", &Context); Bufferptr = Cmdprintf(Session, Bufferptr, "Links\r");
if (ptr && _stricmp(ptr, "reset") == 0) while (n--)
{ {
ptr = strtok_s(NULL, " ", &Context); if (LINK->LINKCALL[0])
if (ptr)
ConvToAX25(ptr, DEST);
ptr = strtok_s(NULL, " ", &Context);
if (ptr)
ConvToAX25(ptr, ORIGIN);
ptr = strtok_s(NULL, " ", &Context);
if (ptr)
Port = atoi(ptr);
if (FindLink(DEST, ORIGIN, Port, &LINK))
{ {
InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE len = ConvFromAX25(LINK->LINKCALL, Normcall);
LINK->L2RETRIES -= 1; // Just send one DISC Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall);
LINK->L2STATE = 4; // CLOSING
L2SENDCOMMAND(LINK, DISC | PFBIT); len = ConvFromAX25(LINK->OURCALL, Normcall);
Bufferptr = Cmdprintf(Session, Bufferptr, "Link Reset\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall);
if (LINK->Ver2point2)
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=2.2\r",
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE);
else
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=%d\r",
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, 2 - LINK->VER1FLAG);
} }
else LINK++;
Bufferptr = Cmdprintf(Session, Bufferptr, "Link Not Found\r");
} }
else
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Links\r");
while (n--)
{
if (LINK->LINKCALL[0])
{
len = ConvFromAX25(LINK->LINKCALL, Normcall);
Count = COUNT_AT_L2(LINK);
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall);
len = ConvFromAX25(LINK->OURCALL, Normcall);
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall);
if (LINK->Ver2point2)
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=2.2 Q=%d\r",
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, Count);
else
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=%d Q=%d\r",
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, 2 - LINK->VER1FLAG, Count);
}
LINK++;
}
}
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
@ -1651,8 +1604,6 @@ VOID CMDR00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
int Port = 0; int Port = 0;
char AXCALL[7]; char AXCALL[7];
BOOL Found; BOOL Found;
int count, i, n = 0;
struct ROUTE * List[1000];
ptr = strtok_s(CmdTail, " ", &Context); ptr = strtok_s(CmdTail, " ", &Context);
@ -1672,32 +1623,15 @@ VOID CMDR00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
} }
Bufferptr = Cmdprintf(Session, Bufferptr, "Routes\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Routes\r");
// Build and sort list of routes while (MaxRoutes--)
for (count = 0; count < MaxRoutes; count++)
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{ if (Port == 0 || Port == Routes->NEIGHBOUR_PORT)
List[n++] = Routes; Bufferptr = DisplayRoute(Session, Bufferptr, Routes, Verbose);
if (n > 999)
break;
}
Routes++; Routes++;
} }
if (n > 1)
qsort(List, n, sizeof(void *), CompareRoutes);
for (i = 0; i < n; i++)
{
Routes = List[i];
if (Port == 0 || Port == Routes->NEIGHBOUR_PORT)
Bufferptr = DisplayRoute(Session, Bufferptr, Routes, Verbose);
}
goto SendReply; goto SendReply;
ROUTEUPDATE: ROUTEUPDATE:
@ -1799,7 +1733,6 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
char * ptr, *Context; char * ptr, *Context;
struct PORTCONTROL * PORT = NULL; struct PORTCONTROL * PORT = NULL;
char ListenPortList[128] = ""; char ListenPortList[128] = "";
int len = 0;
ptr = strtok_s(CmdTail, " ,", &Context); ptr = strtok_s(CmdTail, " ,", &Context);
@ -1852,7 +1785,7 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
} }
} }
len += sprintf(&ListenPortList[len], " %d", Port); sprintf(ListenPortList, "%s %d", ListenPortList, Port);
ListenMask |= ((uint64_t)1 << (Port - 1)); ListenMask |= ((uint64_t)1 << (Port - 1));
} }
@ -2883,12 +2816,15 @@ VOID LINKCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b);
char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest) char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest)
{ {
char Normcall[10]; char Normcall[10];
char Alias[10]; char Alias[10];
struct NR_DEST_ROUTE_ENTRY * NRRoute; struct NR_DEST_ROUTE_ENTRY * NRRoute;
struct INP3_DEST_ROUTE_ENTRY * Route; struct DEST_ROUTE_ENTRY * Route;
struct ROUTE * Neighbour; struct ROUTE * Neighbour;
int i, Active, len; int i, Active, len;
@ -2929,7 +2865,7 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
// DISPLAY INP3 ROUTES // DISPLAY INP3 ROUTES
Route = &Dest->INP3ROUTE[0]; Route = &Dest->ROUTE[0];
Active = Dest->DEST_ROUTE; Active = Dest->DEST_ROUTE;
@ -2986,17 +2922,17 @@ int DoINP3ViaEntry(struct DEST_LIST * Dest, int n, char * line, int cursor)
int len; int len;
double srtt; double srtt;
if (Dest->INP3ROUTE[n].ROUT_NEIGHBOUR != 0) if (Dest->ROUTE[n].ROUT_NEIGHBOUR != 0)
{ {
srtt = Dest->INP3ROUTE[n].SRTT/1000.0; srtt = Dest->ROUTE[n].SRTT/1000.0;
len=ConvFromAX25(Dest->INP3ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Portcall); len=ConvFromAX25(Dest->ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Portcall);
Portcall[len]=0; Portcall[len]=0;
len=sprintf(&line[cursor],"%s %d %d %4.2fs ", len=sprintf(&line[cursor],"%s %d %d %4.2fs ",
Portcall, Portcall,
Dest->INP3ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dest->ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_PORT,
Dest->INP3ROUTE[n].Hops, srtt); Dest->ROUTE[n].Hops, srtt);
cursor+=len; cursor+=len;
@ -3284,7 +3220,7 @@ NODE_VIA:
{ {
Dest+=1; Dest+=1;
if (Dest->NRROUTE[0].ROUT_NEIGHBOUR == 0 && Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (Dest->NRROUTE[0].ROUT_NEIGHBOUR == 0 && Dest->ROUTE[0].ROUT_NEIGHBOUR == 0)
continue; continue;
@ -3292,9 +3228,9 @@ NODE_VIA:
|| (Dest->NRROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->NRROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->NRROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->NRROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->ROUTE[0].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->ROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))) || (Dest->ROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)))
{ {
len=ConvFromAX25(Dest->DEST_CALL,Normcall); len=ConvFromAX25(Dest->DEST_CALL,Normcall);
@ -3665,7 +3601,7 @@ VOID MHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CM
} }
else else
{ {
if (CMD->String[2] == 'V' || CMD->String[3] == 'V') // MHV if (CMD->String[2] == 'V') // MHV
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "MHeard List %s for Port %d\r", MYNODECALL, Port); Bufferptr = Cmdprintf(Session, Bufferptr, "MHeard List %s for Port %d\r", MYNODECALL, Port);
Bufferptr = Cmdprintf(Session, Bufferptr, "Callsign Last heard Pkts RX via Digi ;) \r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Callsign Last heard Pkts RX via Digi ;) \r");
@ -4369,8 +4305,6 @@ struct CMDX COMMANDS[] =
"MHU ",3,MHCMD,0, // UTC Times "MHU ",3,MHCMD,0, // UTC Times
"MHL ",3,MHCMD,0, // Local Times "MHL ",3,MHCMD,0, // Local Times
"MHV ",3,MHCMD,0, "MHV ",3,MHCMD,0,
"MHUV ",3,MHCMD,0, // UTC Times
"MHLV ",3,MHCMD,0, // Local Times
"MHEARD ",1,MHCMD,0, "MHEARD ",1,MHCMD,0,
"APRS ",2,APRSCMD,0, "APRS ",2,APRSCMD,0,
"ATTACH ",1,ATTACHCMD,0, "ATTACH ",1,ATTACHCMD,0,
@ -5588,14 +5522,22 @@ VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
KISS = (struct KISSINFO *) PORT; KISS = (struct KISSINFO *) PORT;
if (KISS->FIRSTPORT != KISS)
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Not first port of a Multidrop Set\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
// Send Command // Send Command
KissLen = KissEncode(KissString, ENCBUFF, KissLen); KissLen = KissEncode(KissString, ENCBUFF, KissLen);
PORT = (struct PORTCONTROL *)KISS->FIRSTPORT; // ALL FRAMES GO ON SAME Q
PORT->Session = Session; PORT->Session = Session;
PORT->LastKISSCmdTime = time(NULL); PORT->LastKISSCmdTime = time(NULL);
PORT = (struct PORTCONTROL *)KISS->FIRSTPORT; // ALL FRAMES GO ON SAME Q
ASYSEND(PORT, ENCBUFF, KissLen); ASYSEND(PORT, ENCBUFF, KissLen);
Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r");

View File

@ -77,8 +77,6 @@ char * stristr (char *ch1, char *ch2);
extern VOID * ENDBUFFERPOOL; extern VOID * ENDBUFFERPOOL;
extern int PoolBuilt;
// Read/Write length field in a buffer header // Read/Write length field in a buffer header
@ -365,7 +363,7 @@ BOK1:
if (n > 1000) if (n > 1000)
{ {
Debugprintf("Releasebuffer Loop searching free chain - pointer = %p %p from %s Line %d", debug, pointer, File, Line); Debugprintf("Loop searching free chain - pointer = %p %p", debug, pointer);
return 0; return 0;
} }
} }
@ -378,11 +376,6 @@ BOK1:
QCOUNT++; QCOUNT++;
if (PoolBuilt && QCOUNT > MAXBUFFS)
{
Debugprintf("Releasebuffer QCOUNT > MAXBUFFS - pointer = %p from %s Line %d", pointer, File, Line);
return 0;
}
return 0; return 0;
} }
@ -480,7 +473,7 @@ int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF)
next = Q[0]; next = Q[0];
while (next[0] != 0) while (next[0] != 0)
next = next[0]; // Chain to end of queue next=next[0]; // Chain to end of queue
next[0] = BUFF; // New one on end next[0] = BUFF; // New one on end
@ -1068,7 +1061,6 @@ BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
WritetoConsoleLocal("\n"); WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record "); WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf); WritetoConsoleLocal(errbuf);
WritetoConsoleLocal("\n");
} }
} }
} }
@ -1132,11 +1124,6 @@ int CompareNode(struct DEST_LIST ** a, struct DEST_LIST ** b)
return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7); return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7);
} }
int CompareRoutes(struct ROUTE ** a, struct ROUTE ** b)
{
return memcmp(a[0]->NEIGHBOUR_CALL, b[0]->NEIGHBOUR_CALL, 7);
}
DllExport int APIENTRY CountFramesQueuedOnStream(int Stream) DllExport int APIENTRY CountFramesQueuedOnStream(int Stream)
{ {
BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1 BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1
@ -2142,16 +2129,7 @@ int CanPortDigi(int Port)
return TRUE; return TRUE;
} }
DllExport int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT) struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
{
if (PORT)
return PORT->Hardware;
return 0;
}
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
{ {
struct PORTCONTROL * PORTVEC = PORTTABLE; struct PORTCONTROL * PORTVEC = PORTTABLE;
@ -4814,7 +4792,6 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
struct stat STAT; struct stat STAT;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
char PortList[256] = ""; char PortList[256] = "";
int len = 0;
while (PORT) while (PORT)
{ {
@ -4856,7 +4833,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
*ptr = '\r'; *ptr = '\r';
len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER); sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER);
} }
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;

View File

@ -168,12 +168,6 @@ void hookL2SessionDeleted(struct _LINKTABLE * LINK)
LINK->ConnectTime = 0; LINK->ConnectTime = 0;
} }
if (LINK->Sent && LINK->Received && (LINK->SentAfterCompression || LINK->ReceivedAfterExpansion))
Debugprintf("L2 Compression Stats %s %s TX %d %d %d%% RX %d %d %d%%", LINK->callingCall, LINK->receivingCall,
LINK->Sent, LINK->SentAfterCompression, ((LINK->Sent - LINK->SentAfterCompression) * 100) / LINK->Sent,
LINK->Received, LINK->ReceivedAfterExpansion, ((LINK->ReceivedAfterExpansion - LINK->Received) * 100) / LINK->Received);
} }
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK) void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK)

View File

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

View File

@ -538,12 +538,8 @@ pollloop:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }

View File

@ -452,11 +452,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC->lasttime = ltime; TNC->lasttime = ltime;
ConnecttoFreeData(port); ConnecttoFreeData(port);
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
@ -745,10 +740,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -4147,7 +4139,7 @@ void buildParamString(struct TNCINFO * TNC, char * line)
FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel); FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
if (FDI->hamlibHost) if (FDI->hamlibHost)
sprintf(&line[strlen(line)], " --rigctld_ip %s --rigctld_port %d", FDI->hamlibHost, FDI->hamlibPort); sprintf(line, "%s --rigctld_ip %s --rigctld_port %d", line, FDI->hamlibHost, FDI->hamlibPort);
if (FDI->LimitBandWidth) if (FDI->LimitBandWidth)
strcat(line, " --500hz"); strcat(line, " --500hz");

View File

@ -1866,6 +1866,9 @@ static char ** SeparateMultiString(char * MultiString)
return Value; return Value;
} }
extern int nextDummyInterlock; extern int nextDummyInterlock;
int standardParams(struct TNCINFO * TNC, char * buf) int standardParams(struct TNCINFO * TNC, char * buf)
@ -1914,7 +1917,7 @@ int standardParams(struct TNCINFO * TNC, char * buf)
TNC->ActiveTXFreq = atof(&buf[13]); TNC->ActiveTXFreq = atof(&buf[13]);
else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session
TNC->ActiveRXFreq = atof(&buf[13]); TNC->ActiveRXFreq = atof(&buf[13]);
else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at end of session else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at start of session
TNC->DisconnectScript = SeparateMultiString(&buf[17]); TNC->DisconnectScript = SeparateMultiString(&buf[17]);
else if (_memicmp(buf, "PTTONHEX", 8) == 0) else if (_memicmp(buf, "PTTONHEX", 8) == 0)
{ {

View File

@ -648,12 +648,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }

View File

@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers //#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
@ -105,13 +104,9 @@ extern int NumberofPorts;
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
extern struct AXIPPORTINFO * Portlist[];
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len); VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
int CompareNode(const void *a, const void *b); int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b); int CompareAlias(const void *a, const void *b);
int CompareRoutes(const void * a, const void * b);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token); void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen); void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
@ -3798,82 +3793,12 @@ doHeader:
*/ */
// AXIP Partners
if (_stricmp(NodeURL, "/Node/AXIP.html") == 0)
{
int i;
char Normcall[10];
int Width = 5;
int x = 0, n = 0, nd = 0;
struct arp_table_entry * List[1000];
struct arp_table_entry * ListD[1000];
char AXIPList[10000] = "";
int ListLen = 0;
struct AXIPPORTINFO * AXPORT = Portlist[0];
struct PORTCONTROL * PORT = PORTTABLE;
struct arp_table_entry * arp;
time_t NOW = time(NULL);
char AXIPHeader[] =
"<table align='center' bgcolor='ffffff' border=2 cellpadding=10 cellspacing=2 style=font-family:monospace>"
"<tr><td align='center'>AXIP Up</td><td align='center'>AXIP Down</td></tr><tr><td valign='top'>%s";
while (PORT)
{
AXPORT = Portlist[PORT->PORTNUMBER];
if (AXPORT)
{
// Get ARP entries
for (i = 0; i < AXPORT->arp_table_len; i++)
{
arp = &AXPORT->arp_table[i];
if (arp->LastHeard == 0 || (NOW - arp->LastHeard) > 3600) // Considered down
ListD[nd++] = arp;
else
List[n++] = arp;
}
}
PORT = PORT->PORTPOINTER;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareNode);
if (nd > 1)
qsort(ListD, nd, sizeof(void *), CompareNode);
for (i = 0; i < n; i++)
{
int len = ConvFromAX25(List[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (List[i]->LastHeard)?(NOW - List[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], AXIPHeader, AXIPList);
ListLen = 0;
for (i = 0; i < nd; i++)
{
int len = ConvFromAX25(ListD[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (ListD[i]->LastHeard)?(NOW - ListD[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td><td valign='top'>%s", AXIPList);
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td></tr></table></body></html>");
}
if (_stricmp(NodeURL, "/Node/Routes.html") == 0) if (_stricmp(NodeURL, "/Node/Routes.html") == 0)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int count, i; int count;
char Normcall[10]; char Normcall[10];
char locked[4] = " "; char locked[4] = " ";
int NodeCount; int NodeCount;
@ -3881,34 +3806,12 @@ doHeader:
int Iframes, Retries; int Iframes, Retries;
char Active[10]; char Active[10];
int Queued; int Queued;
int x = 0, n = 0;
struct ROUTE * List[1000];
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr); ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr);
// Build and sort list of routes for (count=0; count<MaxRoutes; count++)
for (count = 0; count < MaxRoutes; count++)
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{
List[n++] = Routes;
if (n > 999)
break;
}
Routes++;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareRoutes);
for (i = 0; i < n; i++)
{
Routes = List[i];
{ {
int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall); int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
Normcall[len]=0; Normcall[len]=0;
@ -4476,7 +4379,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
if (user && user[0] && password && password[0]) if (user && user[0] && password && password[0])
{ {
sprintf(&MsgPtr[strlen(MsgPtr)], "?%s&%s", user, password); sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password);
} }
} }
@ -4839,14 +4742,7 @@ void ProcessWebmailWebSockThread(void * conn)
Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0); Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0);
if (Sent == -1) // Connecton lost while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
{
closesocket(sockptr->socket);
free(conn);
return;
}
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
{ {
if (Sent > 0) // something sent if (Sent > 0) // something sent
{ {
@ -4892,16 +4788,11 @@ void ProcessWebmailWebSockThread(void * conn)
CloseHandle(hPipe); CloseHandle(hPipe);
// ?? do we need a thread to handle write which may block
Sent = send(sockptr->socket, Reply, ReplyLen, 0); Sent = send(sockptr->socket, Reply, ReplyLen, 0);
if (Sent == -1) // Connecton lost while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
{
free(conn);
closesocket(sockptr->socket);
return;
}
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
{ {
// Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops); // Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);

View File

@ -1229,7 +1229,7 @@ void chkctl(ChatCIRCUIT *ckt_from, char * Buffer, int Len)
for (i = 1; i < (Len - 1); i++) for (i = 1; i < (Len - 1); i++)
{ {
if (Buffer[i] < 32 && Buffer[i] != 7) // Accept BELL if (Buffer[i] < 32)
{ {
if (Buffer[i] == 9) if (Buffer[i] == 9)
{ {
@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
__try __try
{ {
#endif #endif
len += sprintf(&line[len], " %p %s", cn->node, cn->node->alias); len = sprintf(line, "%s %p %s", line, cn->node, cn->node->alias);
if (len > 80) if (len > 80)
{ {
Debugprintf("%s", line); Debugprintf("%s", line);
@ -2821,7 +2821,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
CHATNODE *node; CHATNODE *node;
LINK *link; LINK *link;
char line[1000]; char line[1000];
int len = 0; int len;
CN *cn; CN *cn;
int i = 0; int i = 0;
@ -2836,16 +2836,16 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
nprintf(conn, "%d Node(s)\r", i); nprintf(conn, "%d Node(s)\r", i);
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "Here %-6.6s <-", OurNode); sprintf(line, "Here %-6.6s <-", OurNode);
else else
len = sprintf(line, "Here %-6.6s <-", OurAlias); sprintf(line, "Here %-6.6s <-", OurAlias);
for (node = node_hd; node; node = node->next) if (node->refcnt) for (node = node_hd; node; node = node->next) if (node->refcnt)
{ {
if (Flag == 'c') if (Flag == 'c')
len += sprintf(&line[len], " %s", node->call); len = sprintf(line, "%s %s", line, node->call);
else else
len += sprintf(&line[len], " %s", node->alias); len = sprintf(line, "%s %s", line, node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2873,9 +2873,9 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
__try __try
{ {
if (Flag == 'c') if (Flag == 'c')
len += sprintf(&line[len], " %s", cn->node->call); len = sprintf(line, "%s %s", line, cn->node->call);
else else
len += sprintf(&line[len], " %s", cn->node->alias); len = sprintf(line, "%s %s", line, cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2883,23 +2883,23 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x", cn, cn->node);} {len = sprintf(line, "%s *PE* Corrupt Rec %x %x", line, cn, cn->node);}
} }
else else
len = sprintf(&line[len], " Corrupt Rec %x %x ", cn, cn->node); len = sprintf(line, "%s Corrupt Rec %x %x ", line, cn, cn->node);
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x ", cn, cn->node);} {len = sprintf(line, "%s *PE* Corrupt Rec %x %x ", line, cn, cn->node);}
#else #else
for (cn = circuit->hnode; cn; cn = cn->next) for (cn = circuit->hnode; cn; cn = cn->next)
{ {
if (cn->node && cn->node->alias) if (cn->node && cn->node->alias)
{ {
if (Flag == 'c') if (Flag == 'c')
len += sprintf(&line[len], " %s", cn->node->call); len = sprintf(line, "%s %s", line, cn->node->call);
else else
len += sprintf(&line[len], " %s", cn->node->alias); len = sprintf(line, "%s %s", line, cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2907,7 +2907,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
else else
len += sprintf(&line[len], " Corrupt Rec %p %p ", cn, cn->node); len = sprintf(line, "%s Corrupt Rec %p %p ", line, cn, cn->node);
} }
#endif #endif
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -3682,7 +3682,7 @@ VOID SendChatLinkStatus()
} }
} }
len += sprintf(&Msg[len], "%s %c ", link->call, '0' + link->flags); len = sprintf(Msg, "%s%s %c ", Msg, link->call, '0' + link->flags);
if (len > 240) if (len > 240)
break; break;

View File

@ -100,10 +100,7 @@ TODo ?Multiple Adapters
#ifdef WIN32 #ifdef WIN32
int pcap_sendpacket(pcap_t *p, u_char *buf, int size); int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
#else #else
#ifndef PCAP_API PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#define PCAP_API extern
#endif
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#endif #endif
#ifndef LINBPQ #ifndef LINBPQ
@ -390,7 +387,7 @@ char * FormatIP(uint32_t Addr)
return FormatIPWork; return FormatIPWork;
} }
int CompareIPRoutes (const VOID * a, const VOID * b) int CompareRoutes (const VOID * a, const VOID * b)
{ {
PROUTEENTRY x; PROUTEENTRY x;
PROUTEENTRY y; PROUTEENTRY y;
@ -4975,7 +4972,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, str
Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes); Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
if (NumberofRoutes) if (NumberofRoutes)
qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareIPRoutes); qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareRoutes);
for (i=0; i < NumberofRoutes; i++) for (i=0; i < NumberofRoutes; i++)
{ {

View File

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

View File

@ -458,12 +458,8 @@ ok:
if (_memicmp(txbuff, "RADIO ", 6) == 0) if (_memicmp(txbuff, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &txbuff[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }

512
L2Code.c
View File

@ -33,15 +33,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "cheaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
// This is needed to link with a lib built from source
#ifdef WIN32
#define ZEXPORT __stdcall
#endif
#include <zlib.h>
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
#define REJSENT 1 // SET WHEN FIRST REJ IS SENT IN REPLY #define REJSENT 1 // SET WHEN FIRST REJ IS SENT IN REPLY
@ -120,8 +111,7 @@ int CheckKissInterlock(struct PORTCONTROL * MYPORT, int Exclusive);
void hookL2SessionAccepted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK); void hookL2SessionAccepted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK); void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK); void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len);
VOID DeleteINP3Routes(struct ROUTE * Route);
extern int REALTIMETICKS; extern int REALTIMETICKS;
@ -136,9 +126,7 @@ extern int REALTIMETICKS;
#define SDINVC 1 // INVALID COMMAND #define SDINVC 1 // INVALID COMMAND
#define SDNRER 8 // INVALID N(R) #define SDNRER 8 // INVALID N(R)
extern int L2Compress;
extern int L2CompMaxframe;
extern int L2CompPaclen;
UCHAR NO_CTEXT = 0; UCHAR NO_CTEXT = 0;
UCHAR ALIASMSG = 0; UCHAR ALIASMSG = 0;
@ -154,8 +142,6 @@ extern BOOL LogAllConnects;
APPLCALLS * APPL; APPLCALLS * APPL;
int SUPPORT2point2 = 1;
void SendL2ToMonMap(struct PORTCONTROL * PORT, char * ReportCall, char Mode, char Direction) void SendL2ToMonMap(struct PORTCONTROL * PORT, char * ReportCall, char Mode, char Direction)
{ {
@ -856,7 +842,6 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
while (xidlen > 0) while (xidlen > 0)
{ {
unsigned char * typeptr = ptr;
Type = *ptr++; Type = *ptr++;
Len = *ptr++; Len = *ptr++;
@ -904,23 +889,6 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
case 8: //RX Window case 8: //RX Window
break; break;
case 16:
// Compression
if (L2Compress)
{
LINK->AllowCompress = 1;
// return as 17
*typeptr = 17;
}
else
{
ptr = &ADJBUFFER->PID;
ptr[3] -= 2; // Length field - remove compress option
Buffer->LENGTH -=2;
}
} }
} }
@ -932,8 +900,6 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
LINK->LINKPORT = PORT; LINK->LINKPORT = PORT;
LINK->KILLTIMER = L2KILLTIME - 60*3; // Time out after 60 secs if SABM not received
// save calls so we can match up SABM when it comes // save calls so we can match up SABM when it comes
memcpy(LINK->LINKCALL, Buffer->ORIGIN, 7); memcpy(LINK->LINKCALL, Buffer->ORIGIN, 7);
@ -1033,7 +999,6 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
// MESSAGE ON AN ACTIVE LINK // MESSAGE ON AN ACTIVE LINK
int CTLlessPF = CTL & ~PFBIT; int CTLlessPF = CTL & ~PFBIT;
unsigned char * ptr;
PORT->L2FRAMESFORUS++; PORT->L2FRAMESFORUS++;
@ -1089,7 +1054,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
LINK->L2STATE = 2; LINK->L2STATE = 2;
LINK->Ver2point2 = FALSE; LINK->Ver2point2 = FALSE;
LINK->L2TIMER = 1; // Use retry to send SABM LINK->L2TIMER = 1; // USe retry to send SABM
} }
else if (CTLlessPF == XID) else if (CTLlessPF == XID)
{ {
@ -1097,49 +1062,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
LINK->L2STATE = 2; LINK->L2STATE = 2;
LINK->Ver2point2 = TRUE;// Must support 2.2 if responded to XID LINK->Ver2point2 = TRUE;// Must support 2.2 if responded to XID
LINK->L2TIMER = 1; // USe retry to send SABM
// if Compress enabled set it
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
while (xidlen > 0)
{
Type = *ptr++;
Len = *ptr++;
value = 0;
xidlen -= (Len + 2);
while (Len--)
{
value <<=8;
value += *ptr++;
}
switch(Type)
{
case 17:
// Compression
if (L2Compress)
LINK->AllowCompress = 1;
}
}
}
LINK->L2TIMER = 1; // Use retry to send SABM
} }
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
@ -1187,9 +1110,8 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
// 2. OTHER END THINKS LINK HAS DIED // 2. OTHER END THINKS LINK HAS DIED
// 3. RECOVERY FROM FRMR CONDITION // 3. RECOVERY FROM FRMR CONDITION
// 4. REPEAT OF ORIGINAL SABM COS OTHER END MISSED UA // 4. REPEAT OF ORIGINAL SABM COS OTHER END MISSED UA
// 5. Other end has reloaded
// FOR 1-3 and 5 IT IS REASONABLE TO FULLY RESET THE CIRCUIT, BUT IN 4 // FOR 1-3 IT IS REASONABLE TO FULLY RESET THE CIRCUIT, BUT IN 4
// SUCH ACTION WILL LOSE THE INITIAL SIGNON MSG IF CONNECTING TO A // SUCH ACTION WILL LOSE THE INITIAL SIGNON MSG IF CONNECTING TO A
// BBS. THE PROBLEM IS TELLING THE DIFFERENCE. I'M GOING TO SET A FLAG // BBS. THE PROBLEM IS TELLING THE DIFFERENCE. I'M GOING TO SET A FLAG
// WHEN FIRST INFO RECEIVED - IF SABM REPEATED BEFORE THIS, I'LL ASSUME // WHEN FIRST INFO RECEIVED - IF SABM REPEATED BEFORE THIS, I'LL ASSUME
@ -1202,7 +1124,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
return; return;
} }
InformPartner(LINK, NORMALCLOSE); // SEND DISC TO OTHER END InformPartner(LINK, NORMALCLOSE); // SEND DISC TO OTHER END
LINK->CIRCUITPOINTER = 0; LINK->CIRCUITPOINTER = 0;
L2SABM(LINK, PORT, Buffer, ADJBUFFER, MSGFLAG); // Process the SABM L2SABM(LINK, PORT, Buffer, ADJBUFFER, MSGFLAG); // Process the SABM
@ -1219,8 +1141,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
TRANSPORTENTRY * Session; TRANSPORTENTRY * Session;
int CONERROR; int CONERROR;
struct ROUTE * ROUTE = NULL;
char toCall[12], fromCall[12]; char toCall[12], fromCall[12];
@ -1278,18 +1198,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF) if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
AttachKISSHF(PORT, Buffer); AttachKISSHF(PORT, Buffer);
// if it is an INP3 connection tell INP3 it is up
if (FindNeighbour(LINK->LINKCALL, PORT->PORTNUMBER, &ROUTE))
{
if (ROUTE->INP3Node)
{
Debugprintf("INP3 Incoming connect from %s", fromCall);
DeleteINP3Routes(ROUTE);
}
}
if (NO_CTEXT == 1) if (NO_CTEXT == 1)
return; return;
@ -1813,9 +1721,9 @@ BOOL InternalL2SETUPCROSSLINK(PROUTE ROUTE, int Retries)
else else
LINK->LINKWINDOW = PORT->PORTWINDOW; LINK->LINKWINDOW = PORT->PORTWINDOW;
if (SUPPORT2point2) // if (SUPPORT2point2)
LINK->L2STATE = 1; // Send XID // LINK->L2STATE = 1; // Send XID
else // else
LINK->L2STATE = 2; LINK->L2STATE = 2;
memcpy(LINK->LINKCALL, ROUTE->NEIGHBOUR_CALL, 7); memcpy(LINK->LINKCALL, ROUTE->NEIGHBOUR_CALL, 7);
@ -1973,23 +1881,11 @@ VOID L2_PROCESS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * B
// RESPONSE TO SABM - SET LINK UP // RESPONSE TO SABM - SET LINK UP
char fromCall[12]; char fromCall[12];
struct ROUTE * ROUTE;
fromCall[ConvFromAX25(Buffer->ORIGIN, fromCall)] = 0; fromCall[ConvFromAX25(Buffer->ORIGIN, fromCall)] = 0;
RESET2X(LINK); // LEAVE QUEUED STUFF RESET2X(LINK); // LEAVE QUEUED STUFF
// See if INP3 route setup
if (FindNeighbour(Buffer->ORIGIN, PORT->PORTNUMBER, &ROUTE))
{
if (ROUTE->INP3Node)
{
Debugprintf("INP3 Route to %s connected", fromCall);
}
}
SendL2ToMonMap(PORT, fromCall, '+', 'O'); SendL2ToMonMap(PORT, fromCall, '+', 'O');
LINK->L2STATE = 5; LINK->L2STATE = 5;
@ -2122,6 +2018,7 @@ VOID SDUFRM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
SDFRMR(LINK, PORT); // PROCESS FRAME REJECT CONDITION SDFRMR(LINK, PORT); // PROCESS FRAME REJECT CONDITION
} }
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
} }
@ -2176,9 +2073,7 @@ VOID SFRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, UCHAR CTL, UCHA
int count; int count;
MESSAGE * Msg; MESSAGE * Msg;
MESSAGE * Buffer; MESSAGE * Buffer;
LINK->L2FLAGS &= ~POLLSENT; // CLEAR I(P) or RR(P) SET
Msg = LINK->FRAMES[NS]; // is frame available? Msg = LINK->FRAMES[NS]; // is frame available?
if (Msg == NULL) if (Msg == NULL)
@ -2463,11 +2358,12 @@ CheckNSLoop:
{ {
// Already have a copy, so discard old and keep this // Already have a copy, so discard old and keep this
Debugprintf ("Frame %d out of seq but already have copy - release it", NS);
ReleaseBuffer(Q_REM(&LINK->RXFRAMES[NS])); ReleaseBuffer(Q_REM(&LINK->RXFRAMES[NS]));
} }
else else
{ {
// Debugprintf ("Frame %d out of seq - save", NS); Debugprintf ("Frame %d out of seq - save", NS);
} }
Buffer->CHAIN = 0; Buffer->CHAIN = 0;
@ -2554,8 +2450,6 @@ CheckPF:
} }
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer) VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer)
{ {
@ -2585,7 +2479,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
Info = &Buffer->PID; Info = &Buffer->PID;
LINK->bytesRXed += Length; LINK->bytesRXed += Length;
LINK->Received += Length - 1; // Exclude PID
// Adjust for DIGIS // Adjust for DIGIS
@ -2602,111 +2495,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
switch(PID) switch(PID)
{ {
case 0xf2:
// Intermediate fragment of compressed. Save
// Length and Info include pid
Length--;
Info++;
if (LINK->unCompress == 0)
LINK->unCompress = malloc(8192);
// Save data
memcpy(&LINK->unCompress[LINK->unCompressLen], Info, Length);
LINK->unCompressLen += Length;
ReleaseBuffer(Buffer);
LINK->L2ACKREQ = PORT->PORTT2; // SET RR NEEDED
LINK->KILLTIMER = 0; // RESET IDLE LINK TIMER
return;
case 0xf1:
// Compressed last or only
{
char exBuffer[8192];
int Len;
int outLen;
int sendLen;
char * sendptr = exBuffer;
Length--;
Info++;
// we may have previous fragments
if (LINK->unCompressLen)
{
memcpy(&LINK->unCompress[LINK->unCompressLen], Info, Length);
LINK->unCompressLen += Length;
Len = doinflate(LINK->unCompress, exBuffer, LINK->unCompressLen, 8192, &outLen);
LINK->ReceivedAfterExpansion += outLen - 1;
LINK->unCompressLen = 0;
}
else
{
Len = doinflate(Info, exBuffer, Length, 8192, &outLen);
LINK->ReceivedAfterExpansion += outLen - 1;
}
sendLen = outLen;
// Send first bit in input buffer. If still some left get new buffers for it
if (sendLen > 257)
sendLen = 257;
// First byte is original PID
memcpy(&Msg->PID, exBuffer, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN;
C_Q_ADD(&LINK->RX_Q, Msg);
outLen -= sendLen;
sendptr += sendLen;
while (outLen > 0)
{
sendLen = outLen;
if (sendLen > 236)
sendLen = 236;
Msg = GetBuff();
if (Msg)
{
// Just ignore if no buffers - shouldn't happen
Msg->PID = exBuffer[0];
Msg->PORT = LINK->LINKPORT->PORTNUMBER;
memcpy(Msg->L2DATA, sendptr, sendLen);
Length = sendLen + 1;
Msg->LENGTH = Length + MSGHDDRLEN;
C_Q_ADD(&LINK->RX_Q, Msg);
}
outLen -= sendLen;
sendptr += sendLen;
}
LINK->L2ACKREQ = PORT->PORTT2; // SET RR NEEDED
LINK->KILLTIMER = 0; // RESET IDLE LINK TIMER
return;
}
case 0xcc: case 0xcc:
case 0xcd: case 0xcd:
@ -2756,7 +2544,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
// Copy Data back over // Copy Data back over
memmove(&Msg->PID, Info, Length); memmove(&Msg->PID, Info, Length);
LINK->ReceivedAfterExpansion += Length - 1;
Buffer->LENGTH = Length + MSGHDDRLEN; Buffer->LENGTH = Length + MSGHDDRLEN;
@ -2824,7 +2611,7 @@ VOID RESETNS(struct _LINKTABLE * LINK, UCHAR NS)
int COUNT_AT_L2(struct _LINKTABLE * LINK) int COUNT_AT_L2(struct _LINKTABLE * LINK)
{ {
// COUNTS FRAMES QUEUED ON AN L2 SESSION (IN LINK) // COUNTS FRAMES QUEUED ON AN L2 SESSION (IN BX)
int count = 0, abovelink = 0; int count = 0, abovelink = 0;
int n = 0; int n = 0;
@ -2971,7 +2758,7 @@ VOID SDETX(struct _LINKTABLE * LINK)
UCHAR * ptr1, * ptr2; UCHAR * ptr1, * ptr2;
UCHAR CTL; UCHAR CTL;
int count; int count;
struct DATAMESSAGE * Msg; MESSAGE * Msg;
MESSAGE * Buffer; MESSAGE * Buffer;
// DONT SEND IF RESEQUENCING RECEIVED FRAMES - CAN CAUSE FRMR PROBLEMS // DONT SEND IF RESEQUENCING RECEIVED FRAMES - CAN CAUSE FRMR PROBLEMS
@ -2979,43 +2766,11 @@ VOID SDETX(struct _LINKTABLE * LINK)
// if (LINK->L2RESEQ_Q) // if (LINK->L2RESEQ_Q)
// return; // return;
// **** Debug code **** look for stuck links if (LINK->LINKPORT->PORTNUMBER == 19)
if (LINK->LASTFRAMESENT && (time(NULL) - LINK->LASTFRAMESENT) > 60) // No send for 60 secs
{ {
if (COUNT_AT_L2(LINK) > 16) int i = 0;
{
// Dump Link State
char Normcall[11] = "";
char Normcall2[11] = "";
int Count = COUNT_AT_L2(LINK);
int secs = time(NULL) - LINK->LASTFRAMESENT;
ConvFromAX25(LINK->LINKCALL, Normcall);
ConvFromAX25(LINK->OURCALL, Normcall2);
Debugprintf("*** Stuck L2 Session for %d Secs %s %s %d", secs, Normcall, Normcall2, Count);
Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS);
Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3],
LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]);
// Reset Link
InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE
LINK->L2RETRIES -= 1; // Just send one DISC
LINK->L2STATE = 4; // CLOSING
L2SENDCOMMAND(LINK, DISC | PFBIT);
return;
}
} }
Outstanding = LINK->LINKNS - LINK->LINKOWS; // Was WS not NS Outstanding = LINK->LINKNS - LINK->LINKOWS; // Was WS not NS
if (Outstanding < 0) if (Outstanding < 0)
@ -3028,155 +2783,13 @@ VOID SDETX(struct _LINKTABLE * LINK)
while (LINK->TX_Q && LINK->FRAMES[LINK->SDTSLOT] == NULL) while (LINK->TX_Q && LINK->FRAMES[LINK->SDTSLOT] == NULL)
{ {
// Try compressing here. Only Compress PID 0xF0 frames - NETROM doesn't treat L2 session as a byte stream
Msg = Q_REM(&LINK->TX_Q); Msg = Q_REM(&LINK->TX_Q);
Msg->CHAIN = NULL; Msg->CHAIN = NULL;
LINK->FRAMES[LINK->SDTSLOT] = Msg;
LINK->LASTFRAMESENT = time(NULL); LINK->SDTSLOT ++;
LINK->LASTSENTQCOUNT = COUNT_AT_L2(LINK); LINK->SDTSLOT &= 7;
if (LINK->AllowCompress && Msg->LENGTH > 20 && LINK->TX_Q && Msg->PID == 240) // if short and no more not worth trying compression
{
int complen = 0;
int dataLen;
int savePort = Msg->PORT;
int savePID = Msg->PID;
unsigned char Compressed[8192];
unsigned char toCompress[8192];
int toCompressLen = 0;
int slots = 0;
int n = LINK->SDTSLOT;
int maxcompsize;
int PACLEN = LINK->LINKPORT->PORTPACLEN;
unsigned char * compdata;
int sendLen = complen;
int uncompressed = 0;
if (PACLEN == 0)
PACLEN = 256;
// I think I need to know how many slots are available, so I don't compress too much
// Then collect data, compressing after each frame to make sure will fit in available space
while (LINK->FRAMES[n] == NULL && slots < 8)
{
slots++;
n++;
n &= 7;
}
maxcompsize = slots * PACLEN;
// Save first packet, then see if more on TX_Q
toCompressLen = 0;
dataLen = Msg->LENGTH - MSGHDDRLEN;
LINK->Sent += dataLen;
memcpy(&toCompress[toCompressLen], &Msg->PID, dataLen);
toCompressLen += dataLen;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
ReleaseBuffer(Msg);
while (LINK->TX_Q)
{
Msg = LINK->TX_Q; // Leave on queue until sure it will fit
dataLen = Msg->LENGTH - MSGHDDRLEN -1; // PID only on 1st fragment
memcpy(&toCompress[toCompressLen], &Msg->L2DATA, dataLen);
toCompressLen += dataLen;
// Need to make sure we don't go over maxcompsize
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
if (complen > maxcompsize)
{
// Remove last fragment and compress again
toCompressLen -= dataLen;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
break;
}
else
{
LINK->Sent += dataLen;
Msg = Q_REM(&LINK->TX_Q);
Msg->CHAIN = NULL;
ReleaseBuffer(Msg);
}
}
if (complen >= toCompressLen)
{
// Won't compress, so just send original data
// May still need to fragment
memcpy(Compressed, toCompress, toCompressLen);
complen = toCompressLen - 1; // Remove leading PID
uncompressed = 1;
compdata = &Compressed[1];
}
else
compdata = Compressed;
// We now need to packetize and add to FRAMES
LINK->SentAfterCompression += complen;
sendLen = PACLEN;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
else
sendLen = complen;
if (uncompressed)
PID = Compressed[0];
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = savePort;
Msg->PID = PID;
memcpy(&Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1;
LINK->FRAMES[LINK->SDTSLOT] = Msg;
LINK->SDTSLOT ++;
LINK->SDTSLOT &= 7;
compdata += sendLen;
complen -= sendLen;
}
toCompressLen = 0;
}
else
{
LINK->FRAMES[LINK->SDTSLOT] = Msg;
LINK->SDTSLOT ++;
LINK->SDTSLOT &= 7;
}
} }
// dont send while poll outstanding // dont send while poll outstanding
while ((LINK->L2FLAGS & POLLSENT) == 0) while ((LINK->L2FLAGS & POLLSENT) == 0)
@ -3288,7 +2901,7 @@ VOID L2TimerProc()
if (PORT == NULL) if (PORT == NULL)
{ {
LINK++; LINK++;
continue; // just in case!! continue; // just ion case!!
} }
if (LINK->L2TIMER) if (LINK->L2TIMER)
@ -3325,7 +2938,7 @@ VOID L2TimerProc()
LINK->L2ACKREQ = 0; // CLEAR ANY DELAYED ACK TIMER LINK->L2ACKREQ = 0; // CLEAR ANY DELAYED ACK TIMER
if (LINK->L2RETRIES == 0) // IF RR(P) OUTSTANDING WILL REPORT ANYWAY if (LINK->L2RETRIES == 0) // IF RR(P) OUTSTANDING WILl REPORT ANYWAY
{ {
SendSupervisCmd(LINK); SendSupervisCmd(LINK);
LINK++; LINK++;
@ -3387,25 +3000,13 @@ VOID L2TimerProc()
{ {
// CIRCUIT HAS BEEN IDLE TOO LONG - SHUT IT DOWN // CIRCUIT HAS BEEN IDLE TOO LONG - SHUT IT DOWN
// if in XID received state session was never established so don't send DISC LINK->KILLTIMER = 0;
LINK->L2TIMER = 1; // TO FORCE DISC
LINK->L2STATE = 4; // DISCONNECTING
if (LINK->L2STATE == 1) // TELL OTHER LEVELS
{
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
DetachKISSHF(PORT);
CLEAROUTLINK(LINK); InformPartner(LINK, NORMALCLOSE);
}
else
{
LINK->KILLTIMER = 0;
LINK->L2TIMER = 1; // TO FORCE DISC
LINK->L2STATE = 4; // DISCONNECTING
// TELL OTHER LEVELS
InformPartner(LINK, NORMALCLOSE);
}
} }
LINK++; LINK++;
} }
@ -3710,9 +3311,6 @@ VOID CLEAROUTLINK(struct _LINKTABLE * LINK)
CLEARL2QUEUES(LINK); // TO RELEASE ANY BUFFERS CLEARL2QUEUES(LINK); // TO RELEASE ANY BUFFERS
if (LINK->unCompress)
free(LINK->unCompress);
memset(LINK, 0, sizeof(struct _LINKTABLE)); memset(LINK, 0, sizeof(struct _LINKTABLE));
} }
@ -3747,11 +3345,7 @@ VOID L2SENDXID(struct _LINKTABLE * LINK)
*ptr++ = 0x82; // FI *ptr++ = 0x82; // FI
*ptr++ = 0x80; // GI *ptr++ = 0x80; // GI
*ptr++ = 0x0; *ptr++ = 0x0;
*ptr++ = 0x10; // Length 16
if (L2Compress)
*ptr++ = 0x12; // Length 18
else
*ptr++ = 0x10; // Length 16
*ptr++ = 0x02; // Classes of Procedures *ptr++ = 0x02; // Classes of Procedures
*ptr++ = 0x02; // Length *ptr++ = 0x02; // Length
@ -3781,14 +3375,6 @@ VOID L2SENDXID(struct _LINKTABLE * LINK)
*ptr++ = 0x01; // Len *ptr++ = 0x01; // Len
*ptr++ = 0x07; // 7 *ptr++ = 0x07; // 7
// if L2Compress Enabled request it
if (L2Compress)
{
*ptr++ = 0x10; // Compress
*ptr++ = 0x00; // Len
}
Buffer->LENGTH = (int)(ptr - (UCHAR *)Buffer); // SET LENGTH Buffer->LENGTH = (int)(ptr - (UCHAR *)Buffer); // SET LENGTH
LINK->L2TIMER = ONEMINUTE; // (RE)SET TIMER LINK->L2TIMER = ONEMINUTE; // (RE)SET TIMER
@ -3948,7 +3534,6 @@ UINT RR_OR_RNR(struct _LINKTABLE * LINK)
{ {
UCHAR Temp; UCHAR Temp;
TRANSPORTENTRY * Session; TRANSPORTENTRY * Session;
int SaveRNRSent = LINK->L2FLAGS & RNRSENT;
LINK->L2FLAGS &= ~RNRSENT; LINK->L2FLAGS &= ~RNRSENT;
@ -3993,6 +3578,7 @@ CheckNSLoop2:
struct PORTCONTROL * PORT = LINK->LINKPORT; struct PORTCONTROL * PORT = LINK->LINKPORT;
MESSAGE * OldBuffer = Q_REM(&LINK->RXFRAMES[LINK->LINKNR]); MESSAGE * OldBuffer = Q_REM(&LINK->RXFRAMES[LINK->LINKNR]);
Debugprintf("L2 about to send REJ - process saved Frame %d", LINK->LINKNR);
PROC_I_FRAME(LINK, PORT, OldBuffer); // Passes on or releases Buffer PROC_I_FRAME(LINK, PORT, OldBuffer); // Passes on or releases Buffer
// NR has been updated. // NR has been updated.
@ -4024,11 +3610,6 @@ stayinREJ2:
// if we support SREJ send that instesd or REJ // if we support SREJ send that instesd or REJ
// Dont send SREJ if clearing RNR - causes FRMR
if (SaveRNRSent)
return REJ;
if (LINK->Ver2point2) // We only allow 2.2 with SREJ Multi if (LINK->Ver2point2) // We only allow 2.2 with SREJ Multi
return SREJ; return SREJ;
else else
@ -4055,9 +3636,7 @@ VOID CONNECTREFUSED(struct _LINKTABLE * LINK)
ConnectFailedOrRefused(LINK, "Busy from"); ConnectFailedOrRefused(LINK, "Busy from");
} }
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK);
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK);
VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg) VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg)
{ {
@ -4072,7 +3651,7 @@ VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg)
if (LINK->LINKTYPE == 3) if (LINK->LINKTYPE == 3)
{ {
L3LINKSETUPFAILED(LINK); // REPORT TO LEVEL 3 L3CONNECTFAILED(LINK); // REPORT TO LEVEL 3
return; return;
} }
@ -4599,33 +4178,6 @@ int seeifUnlockneeded(struct _LINKTABLE * LINK)
return 0; return 0;
} }
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len)
{
z_stream defstream;
int maxSize;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;
defstream.avail_in = Len; // size of input
defstream.next_in = (Bytef *)In; // input char array
deflateInit(&defstream, Z_BEST_COMPRESSION);
maxSize = deflateBound(&defstream, Len);
if (maxSize > OutSize)
return 0;
defstream.avail_out = maxSize; // size of output
defstream.next_out = (Bytef *)Out; // output char array
deflate(&defstream, Z_FINISH);
deflateEnd(&defstream);
return defstream.total_out;
}

View File

@ -67,8 +67,6 @@ extern dest_list * CURRENTNODE;
int L3_10SECS = 10; int L3_10SECS = 10;
extern int PREFERINP3ROUTES;
VOID L3BG() VOID L3BG()
{ {
@ -137,14 +135,12 @@ VOID L3BG()
// Drop through to Activate // Drop through to Activate
} }
// No Active Route
if (ACTIVATE_DEST(DEST) == FALSE) if (ACTIVATE_DEST(DEST) == FALSE)
{ {
// Node has no routes - get rid of it // Node has no routes - get rid of it
REMOVENODE(DEST); REMOVENODE(DEST);
return; // Avoid risk of looking at old entries return; // Avoid riskof looking at lod entries
} }
} }
} }
@ -158,32 +154,22 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
{ {
int n = MAXDESTS; int n = MAXDESTS;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE = NULL; struct ROUTE * ROUTE;
struct _LINKTABLE * LINK; struct _LINKTABLE * LINK;
struct TNCINFO * TNC; struct TNCINFO * TNC;
int ActiveRoute; int ActiveRoute;
if (DEST->DEST_ROUTE == 0) // Don't ALREADY HAVE A SELECTED ROUTE? if (DEST->DEST_ROUTE == 0) // ALREADY HAVE A SELECTED ROUTE?
{ DEST->DEST_ROUTE = 1; // TRY TO ACTIVATE FIRST
DEST->DEST_ROUTE = 1;
if (PREFERINP3ROUTES)
{
// if we have any INP3 routes use the first. It will always be the fastest. The others are there for fallback if the first fails.
if (ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR)
DEST->DEST_ROUTE = 4; // TRY TO ACTIVATE FIRST
}
}
ActiveRoute = DEST->DEST_ROUTE - 1; ActiveRoute = DEST->DEST_ROUTE - 1;
ROUTE = DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR; ROUTE = DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR;
if (ROUTE == 0) if (ROUTE == 0)
{ {
// Current Route not present // Currnet Route not present
// If current route is 1, then we must have INP3 routes (or entry is corrupt) // If current route is 1, then we must have INP3 routes (or entry is corrupt)
if (DEST->DEST_ROUTE != 1) if (DEST->DEST_ROUTE != 1)
@ -191,17 +177,13 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
// Current Route is 1 // Current Route is 1
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
return FALSE; // No INP3 so No Routes return FALSE; // No INP3 so No Routes
DEST->DEST_ROUTE = 4; // First INP3 DEST->DEST_ROUTE = 4; // First INP3
ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR; ROUTE = DEST->ROUTE[0].ROUT_NEIGHBOUR;
} }
if (ROUTE == 0) // Shouldn't happen
return FALSE;
// if NetROM over VARA conection is made by the driver // if NetROM over VARA conection is made by the driver
TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT]; TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
@ -222,7 +204,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
return L2SETUPCROSSLINK(ROUTE); return L2SETUPCROSSLINK(ROUTE);
} }
// We umst be waiting for link to come up // We mst be waiting for link to come up
return TRUE; return TRUE;
@ -277,7 +259,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
{ {
APPL=&APPLCALLTABLE[App]; APPL=&APPLCALLTABLE[App];
if (CompareCalls(Msg->ORIGIN, APPL->APPLCALL)) if (APPL->APPLHASALIAS == 0 && CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
return; return;
} }
@ -386,7 +368,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
NUMBEROFNODES++; 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]; ptr1 = &Msg->L2DATA[1];
ptr2 = &DEST->DEST_ALIAS[0]; ptr2 = &DEST->DEST_ALIAS[0];
@ -454,10 +436,10 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
if (CheckExcludeList(ptr1) == 0) // Excluded if (CheckExcludeList(ptr1) == 0) // Excluded
continue; continue;
for (n = 0; n < NumberofAppls; n++) for (n = 0; n < 32; n++)
{ {
if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL)) if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL))
goto IgnoreNode; // Don't update our applications continue;
} }
// MAKE SURE ITS NOT CORRUPTED // MAKE SURE ITS NOT CORRUPTED
@ -566,7 +548,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
ptr1 += 7; ptr1 += 7;
// UPDATE ALIAS# // UPDATE ALIAS
memcpy(DEST->DEST_ALIAS, ptr1, 6); memcpy(DEST->DEST_ALIAS, ptr1, 6);
@ -725,11 +707,11 @@ int COUNTNODES(struct ROUTE * ROUTE)
count++; count++;
else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
DEST++; DEST++;
@ -863,7 +845,7 @@ VOID SENDNEXTNODESFRAGMENT()
if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL && if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN && DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
(NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if NODE = 0; (NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if DEST = 0;
{ {
// Send it // Send it
@ -896,9 +878,6 @@ VOID SENDNEXTNODESFRAGMENT()
*(ptr1++) = (UCHAR)Qual; *(ptr1++) = (UCHAR)Qual;
if (Qual == 0)
continue;
Count--; Count--;
} }
DEST++; DEST++;
@ -945,7 +924,7 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason)
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason) VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
{ {
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
// SET INACTIVE // SET INACTIVE
dest_list * DEST; dest_list * DEST;
@ -966,7 +945,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
if (DEST->DEST_ROUTE == 0) if (DEST->DEST_ROUTE == 0)
continue; continue;
if (DEST->INP3ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route if (DEST->ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route
{ {
// Yes, so clear // Yes, so clear
@ -1141,7 +1120,7 @@ UPDEST000:
{ {
// Any INP3 Routes? // Any INP3 Routes?
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
{ {
// NO ROUTES LEFT TO DEST - REMOVE IT // NO ROUTES LEFT TO DEST - REMOVE IT
@ -1313,25 +1292,19 @@ VOID REMOVENODE(dest_list * DEST)
NUMBEROFNODES--; NUMBEROFNODES--;
} }
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK) VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
{ {
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED // L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE; struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL) if (ROUTE == NULL)
return; // NOTHING ??? return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
TellINP3LinkSetupFailed(ROUTE); TellINP3LinkSetupFailed(ROUTE);
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
@ -1340,10 +1313,9 @@ VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
} }
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE) VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
{ {
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
// SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE // SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
int n = MAXDESTS; int n = MAXDESTS;
@ -1356,7 +1328,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
if (ActiveRoute) if (ActiveRoute)
{ {
ActiveRoute --; // Routes numbered 1 - 6, index from 0 ActiveRoute --; // Routes numbered 1 - 6, idex from 0
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE) if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
{ {

152
L4Code.c
View File

@ -38,22 +38,22 @@ extern BPQVECSTRUC BPQHOSTVECTOR[];
#define BPQHOSTSTREAMS 64 #define BPQHOSTSTREAMS 64
#define IPHOSTVECTOR BPQHOSTVECTOR[BPQHOSTSTREAMS + 3] #define IPHOSTVECTOR BPQHOSTVECTOR[BPQHOSTSTREAMS + 3]
void CLOSECURRENTSESSION(TRANSPORTENTRY * Session); VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
void SENDL4DISC(TRANSPORTENTRY * Session); VOID SENDL4DISC(TRANSPORTENTRY * Session);
int C_Q_COUNT(void * Q); int C_Q_COUNT(VOID * Q);
TRANSPORTENTRY * SetupSessionForL2(struct _LINKTABLE * LINK); TRANSPORTENTRY * SetupSessionForL2(struct _LINKTABLE * LINK);
void InformPartner(struct _LINKTABLE * LINK, int Reason); VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
void IFRM150(TRANSPORTENTRY * Session, PDATAMESSAGE Buffer); VOID IFRM150(TRANSPORTENTRY * Session, PDATAMESSAGE Buffer);
void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG); VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
BOOL FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex); BOOL FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex);
int GETBUSYBIT(TRANSPORTENTRY * L4); int GETBUSYBIT(TRANSPORTENTRY * L4);
BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySessions); BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySessions);
VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE); TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE);
extern char * ALIASPTR; extern char * ALIASPTR;
void SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER * L3MSG, BOOL BPQNODE, UINT Applmask, UCHAR * ApplCall); VOID SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER * L3MSG, BOOL BPQNODE, UINT Applmask, UCHAR * ApplCall);
void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG); VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG);
void L4TIMEOUT(TRANSPORTENTRY * L4); VOID L4TIMEOUT(TRANSPORTENTRY * L4);
struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg); struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg);
int CHECKIFBUSYL4(TRANSPORTENTRY * L4); int CHECKIFBUSYL4(TRANSPORTENTRY * L4);
VOID AUTOTIMER(TRANSPORTENTRY * L4); VOID AUTOTIMER(TRANSPORTENTRY * L4);
@ -67,23 +67,18 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall); VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall);
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode); void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG); void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen); int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len);
static UINT APPLMASK; static UINT APPLMASK;
extern BOOL LogL4Connects; extern BOOL LogL4Connects;
extern BOOL LogAllConnects; extern BOOL LogAllConnects;
extern int L4Compress; extern int L4Compress;
extern int L4CompMaxframe; extern int L4CompMaxframe;
extern int L4CompPaclen; extern int L4CompPaclen;
extern int L2Compress;
extern int L2CompMaxframe;
extern int L2CompPaclen;
// L4 Flags Values // L4 Flags Values
#define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED #define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED
@ -304,7 +299,6 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
return; return;
} }
L3MSG = GetBuff(); L3MSG = GetBuff();
if (L3MSG == 0) if (L3MSG == 0)
@ -573,55 +567,6 @@ void sendChunk(TRANSPORTENTRY * L4, unsigned char * Compressed, int complen, int
} }
} }
void sendL2Chunk(struct _LINKTABLE * LINK, unsigned char * Compressed, int complen, int sendPacLen)
{
unsigned char * compdata;
struct DATAMESSAGE * Msg;
int sendLen = complen;
int fragments;
LINK->SentAfterCompression += complen;
if (complen > L2CompPaclen)
{
fragments = (complen / sendPacLen); // Split to roughly equal sized fraagments
if (fragments * sendPacLen != complen)
fragments++;
sendLen = (complen / fragments) + 1;
}
Debugprintf("L2 Chunk %d Bytes %d PACLEN %d Fragments %d FragSize", complen, sendPacLen, fragments, sendLen);
compdata = Compressed;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = LINK->LINKPORT->PORTNUMBER;
memcpy(Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1; // 1 for pid field
Msg->PID = PID; // Not sent so use as a flag for compressed msg
compdata += sendLen;
complen -= sendLen;
C_Q_ADD(&LINK->TX_Q, Msg);
}
}
VOID L4BG() VOID L4BG()
{ {
// PROCESS DATA QUEUED ON SESSIONS // PROCESS DATA QUEUED ON SESSIONS
@ -683,7 +628,7 @@ VOID L4BG()
LINK = L4->L4TARGET.LINK; LINK = L4->L4TARGET.LINK;
if (COUNT_AT_L2(LINK) > 64) if (COUNT_AT_L2(LINK) > 8)
break; break;
} }
@ -721,32 +666,36 @@ VOID L4BG()
if (L4->AllowCompress) if (L4->AllowCompress)
{ {
int complen = 0; int complen = 0;
unsigned char Compressed[8192]; unsigned char * Compressed;
unsigned char toCompress[8192];
int toCompressLen = 0;
int dataLen; int dataLen;
int savePort = Msg->PORT; int savePort = Msg->PORT;
int maxCompSendLen; int maxCompSendLen;
// Save first packet, then see if more on TX_Q // Save first packet, then see if more on TX_Q
L4->toCompress = malloc(8192);
L4->toCompressLen = 0;
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen; L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen); memcpy(&L4->toCompress[L4->toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen; L4->toCompressLen += dataLen;
// See if first will compress. If not assume too short or already compressed data and just send // See if first will compress. If not assume too short or already compressed data and just send
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen); Compressed = Compressit(L4->toCompress, L4->toCompressLen, &complen);
if (complen >= dataLen) if (complen >= dataLen)
{ {
free(Compressed);
L4->SentAfterCompression += dataLen; L4->SentAfterCompression += dataLen;
SENDL4MESSAGE(L4, Msg); SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
toCompressLen = 0; free(L4->toCompress);
L4->toCompress = 0;
L4->toCompressLen = 0;
continue; continue;
} }
@ -756,7 +705,7 @@ VOID L4BG()
{ {
// no more, so just send the stuff we've just compressed. Compressed data will fit in input packet // no more, so just send the stuff we've just compressed. Compressed data will fit in input packet
// Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen); // Debugprintf("%d %d %d%%", L4->toCompressLen, complen, ((L4->toCompressLen - complen) * 100) / L4->toCompressLen);
memcpy(Msg->L2DATA, Compressed, complen); memcpy(Msg->L2DATA, Compressed, complen);
@ -767,13 +716,17 @@ VOID L4BG()
SENDL4MESSAGE(L4, Msg); SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
toCompressLen = 0; free(L4->toCompress);
L4->toCompressLen = 0;
L4->toCompress = 0;
free(Compressed);
continue; continue;
} }
free(Compressed);
ReleaseBuffer(Msg); // Not going to use it ReleaseBuffer(Msg); // Not going to use it
while (L4->L4TX_Q && toCompressLen < (8192 - 256)) // Make sure can't overrin buffer while (L4->L4TX_Q && L4->toCompressLen < (8192 - 256)) // Make sure can't overrin buffer
{ {
// Collect the data from L4TX_Q // Collect the data from L4TX_Q
@ -781,22 +734,23 @@ VOID L4BG()
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen; L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen); memcpy(&L4->toCompress[L4->toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen; L4->toCompressLen += dataLen;
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
} }
toCompress[toCompressLen] = 0; L4->toCompress[L4->toCompressLen] = 0;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen); Compressed = Compressit(L4->toCompress, L4->toCompressLen, &complen);
// Debugprintf("%d %d %d%%", L4->toCompressLen, complen, ((L4->toCompressLen - complen) * 100) / L4->toCompressLen);
Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen);
// Send compressed // Send compressed
// Fragment if more than L4CompPaclen // Fragment if more than L4CompPaclen
// Entered with original first fragment in saveMsg;
// Check for too big a compressed frame size. Bigger compresses better but adds latency to link // Check for too big a compressed frame size. Bigger compresses better but adds latency to link
maxCompSendLen = L4CompPaclen * L4CompMaxframe; maxCompSendLen = L4CompPaclen * L4CompMaxframe;
@ -808,8 +762,8 @@ VOID L4BG()
int Fragments; int Fragments;
int ChunkSize; int ChunkSize;
unsigned char * CompressPtr = toCompress; unsigned char * CompressPtr = L4->toCompress;
int bytesleft = toCompressLen; int bytesleft = L4->toCompressLen;
// Assume 10% worse compression on smaller input // Assume 10% worse compression on smaller input
@ -817,16 +771,17 @@ VOID L4BG()
Fragments = j / maxCompSendLen; Fragments = j / maxCompSendLen;
Fragments++; Fragments++;
ChunkSize = (toCompressLen / Fragments) + 1; // 1 for rounding ChunkSize = (L4->toCompressLen / Fragments) + 1; // 1 for rounding
while (bytesleft > 0) while (bytesleft > 0)
{ {
int Len = bytesleft; int Len = bytesleft;
if (Len > ChunkSize) if (Len > ChunkSize)
Len = ChunkSize; Len = ChunkSize;
complen = L2Compressit(Compressed, 8192, CompressPtr, Len); free (Compressed);
Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len); Compressed = Compressit(CompressPtr, Len, &complen);
// Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len);
sendChunk(L4, Compressed, complen, savePort); sendChunk(L4, Compressed, complen, savePort);
@ -838,7 +793,10 @@ VOID L4BG()
else else
sendChunk(L4, Compressed, complen,savePort); sendChunk(L4, Compressed, complen,savePort);
toCompressLen = 0; free(L4->toCompress);
L4->toCompressLen = 0;
L4->toCompress = 0;
free(Compressed);
} }
else else
{ {
@ -850,8 +808,6 @@ VOID L4BG()
continue; continue;
} }
// L2 Link
LINK = L4->L4TARGET.LINK; LINK = L4->L4TARGET.LINK;
// If we want to enforce PACLEN this may be a good place to do it // If we want to enforce PACLEN this may be a good place to do it
@ -980,6 +936,9 @@ VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session)
if (Session->PARTCMDBUFFER) if (Session->PARTCMDBUFFER)
ReleaseBuffer(Session->PARTCMDBUFFER); ReleaseBuffer(Session->PARTCMDBUFFER);
if (Session->toCompress)
free(Session->toCompress);
if (Session->unCompress) if (Session->unCompress)
free(Session->unCompress); free(Session->unCompress);
@ -1817,7 +1776,7 @@ int FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex
return FALSE; return FALSE;
} }
void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG) VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG)
{ {
// EXCHANGE ORIGIN AND DEST // EXCHANGE ORIGIN AND DEST
@ -1832,7 +1791,7 @@ void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG)
L3MSG->L3SRCE[6] |= 1; // Set Last Call L3MSG->L3SRCE[6] |= 1; // Set Last Call
} }
void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG) VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{ {
L3MSG->L4FLAGS = L4CACK | L4BUSY; // REJECT L3MSG->L4FLAGS = L4CACK | L4BUSY; // REJECT
L3MSG->L4DATA[0] = 0; // WINDOW L3MSG->L4DATA[0] = 0; // WINDOW
@ -2006,7 +1965,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
{ {
// INTERNODE LINK // INTERNODE LINK
TRANSPORTENTRY * L4; TRANSPORTENTRY * L4 = 0;
struct DEST_LIST * DEST; struct DEST_LIST * DEST;
int Opcode; int Opcode;
char Nodename[20]; char Nodename[20];
@ -2530,14 +2489,13 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
RTT = GetTickCount() - L4->RTT_TIMER; RTT = GetTickCount() - L4->RTT_TIMER;
if (RTT < 180000) // Sanity Check if (RTT < 180) // Sanity Check
{ {
if (DEST->DEST_RTT == 0) if (DEST->DEST_RTT == 0)
DEST->DEST_RTT = RTT; DEST->DEST_RTT = RTT;
else else
DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New
} }
L4->RTT_TIMER = 0;
} }
} }

View File

@ -381,48 +381,41 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#include <signal.h> #include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig) static void segvhandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "\nSIGSEGV Received\n"; char msg[] = "SIGSEGV Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
// print out all the frames to stderr // print out all the frames to stderr
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg)); exit(1);
backtrace_symbols_fd(array, size, STDOUT_FILENO);
exit(1);
} }
static void abrthandler(int sig) static void abrthandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "\nSIGABRT Received\n"; char msg[] = "SIGABRT Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
write(STDOUT_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg)); exit(1);
backtrace_symbols_fd(array, size, STDOUT_FILENO);
exit(1);
} }
static void sigterm_handler(int sig) static void sigterm_handler(int sig)
{ {
syslog(LOG_INFO, "terminating on SIGTERM\n"); syslog(LOG_INFO, "terminating on SIGTERM\n");
@ -794,8 +787,6 @@ int Redirected = 0;
static void segvhandler(int sig); static void segvhandler(int sig);
static void abrthandler(int sig); static void abrthandler(int sig);
void GetRestartData();
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -854,8 +845,6 @@ int main(int argc, char * argv[])
printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring); printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
printf("%s\n", VerCopyright); printf("%s\n", VerCopyright);
srand(time(NULL));
// look for optarg format parameters // look for optarg format parameters
@ -913,10 +902,7 @@ int main(int argc, char * argv[])
Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring); Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring);
#if defined(MACBPQ) || defined(FREEBSD) #ifndef MACBPQ
time_t dummy;
_MYTIMEZONE = -localtime(&dummy)->tm_gmtoff;
#else
_MYTIMEZONE = _timezone; _MYTIMEZONE = _timezone;
#endif #endif
@ -1188,8 +1174,6 @@ int main(int argc, char * argv[])
chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO); chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif #endif
// Make backup copies of Databases // Make backup copies of Databases
// CopyConfigFile(ConfigName); // CopyConfigFile(ConfigName);
@ -1211,7 +1195,6 @@ int main(int argc, char * argv[])
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetPGConfig(); GetPGConfig();
GetRestartData();
// Make sure there is a user record for the BBS, with BBS bit set. // Make sure there is a user record for the BBS, with BBS bit set.
@ -1459,7 +1442,6 @@ int main(int argc, char * argv[])
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveConfig(ConfigName); SaveConfig(ConfigName);
SaveRestartData();
} }
KEEPGOING--; // Give time for links to close KEEPGOING--; // Give time for links to close

View File

@ -407,10 +407,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -1542,7 +1539,7 @@ VOID CloseComplete(struct TNCINFO * TNC, int Stream)
sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode); sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
if (TNC->MPSKInfo->Beacon) if (TNC->MPSKInfo->Beacon)
sprintf(&Cmd[strlen(Cmd)], "%cBEACON_ARQ_FAE\x1b", '\x1a'); sprintf(Cmd, "%s%cBEACON_ARQ_FAE\x1b", Cmd, '\x1a');
Len = strlen(Cmd); Len = strlen(Cmd);

View File

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

View File

@ -535,16 +535,6 @@ KC6OAR*>ID:
Output += sprintf((char *)Output, " RX Window=%d", value); Output += sprintf((char *)Output, " RX Window=%d", value);
break; break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
} }
} }
} }
@ -561,15 +551,6 @@ KC6OAR*>ID:
switch (ADJBUFFER->PID) switch (ADJBUFFER->PID)
{ {
case 0xF1:
case 0xF2:
// Compressed L2 Data
Output += sprintf((char *)Output, " <%d Bytes of Compressed L2 Data>", MsgLen - (19 + sizeof(void *)));
break;
case 0xF0: // Normal Data case 0xF0: // Normal Data
{ {
char Infofield[257]; char Infofield[257];

View File

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

BIN
PG/Loop.obj Normal file

Binary file not shown.

BIN
PG/PGTest.obj Normal file

Binary file not shown.

51
RHP.c
View File

@ -451,13 +451,8 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
int ID; int ID;
char * Data; char * Data;
char * ptr; char * ptr;
unsigned char * uptr;
int c; int c;
int Len; int Len;
unsigned int HexCode1;
unsigned int HexCode2;
int n;
int Handle = 1; int Handle = 1;
@ -475,10 +470,9 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
RHPSession = RHPSessions[Handle - 1]; RHPSession = RHPSessions[Handle - 1];
// Look for \ escapes, Can now also get \u00c3 // Look for \ escapes
ptr = Data; ptr = Data;
Len = strlen(Data); // in case no escapes
while (ptr = strchr(ptr, '\\')) while (ptr = strchr(ptr, '\\'))
{ {
@ -489,60 +483,23 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
case 'r': case 'r':
*ptr = 13; *ptr = 13;
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
case 'u':
HexCode1 = HexCode2 = 0;
n = toupper(ptr[2]) - '0';
if (n > 9) n = n - 7;
HexCode1 |= n << 4;
n = toupper(ptr[3]) - '0';
if (n > 9) n = n - 7;
HexCode1 |= n;
n = toupper(ptr[4]) - '0';
if (n > 9) n = n - 7;
HexCode2 |= n << 4;
n = toupper(ptr[5]) - '0';
if (n > 9) n = n - 7;
HexCode2 |= n;
if (HexCode1 == 0 || HexCode1 == 0xC2)
{
uptr = ptr;
*uptr = HexCode2;
}
else if (HexCode1 == 0xc2)
{
uptr = ptr;
*uptr = HexCode2 + 0x40;
}
memmove(ptr + 1, ptr + 6, strlen(ptr + 5));
break;
case '\\': case '\\':
*ptr = '\\'; *ptr = '\\';
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
case '"': case '"':
*ptr = '"'; *ptr = '"';
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
} }
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
ptr++; ptr++;
Len = ptr - Data;
} }
Len = strlen(Data);
ptr = Data; ptr = Data;
while (Len > RHPPaclen) while (Len > RHPPaclen)
@ -683,7 +640,7 @@ void RHPPoll()
// Message is JSON so Convert CR to \r, \ to \\ " to \" // Message is JSON so Convert CR to \r, \ to \\ " to \"
// Looks like I need to escape everything not between 0x20 and 0x7f eg \u00c3 // Looks like I need to escape everything not between 0x20 and 0x7f eg \U00c3
while (c = *(ptr)) while (c = *(ptr))

View File

@ -5286,12 +5286,8 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
ptr = strtok_s(NULL, ",", &Context); ptr = strtok_s(NULL, ",", &Context);
if (ptr == NULL)
if (*MemoryNumber) // If channel, dont need mode
return TRUE;
if (ptr == NULL || strlen(ptr) > 8) if (ptr == NULL || strlen(ptr) > 8)
return FALSE; // Mode Missing return FALSE;
// If channel, dont need mode // If channel, dont need mode
@ -5450,26 +5446,7 @@ void DecodeCM108(int Port, char * ptr)
hid_device *handle = NULL; hid_device *handle = NULL;
if (strlen(ptr) > 16) if (strlen(ptr) > 16)
{ CM108Device = _strdup(ptr);
path_to_open = _strdup(ptr);
handle = hid_open_path(path_to_open);
if (handle)
{
hid_close(handle);
CM108Device = _strdup(path_to_open);
}
else
{
char msg[128];
sprintf(msg,"Port %d Unable to open CM108 device %s", Port, path_to_open);
WritetoConsole(msg);
}
}
else else
{ {
VID = strtol(ptr, &next, 0); VID = strtol(ptr, &next, 0);
@ -7416,8 +7393,6 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
int Interlock = RIG->Interlock; int Interlock = RIG->Interlock;
char PortString[128] = ""; char PortString[128] = "";
char TxPortString[128] = ""; char TxPortString[128] = "";
int n = 0;
int nn = 0;
// Find TNC ports in this Rig's scan group // Find TNC ports in this Rig's scan group
@ -7434,7 +7409,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
n += sprintf(&PortString[n], ",%d", p); sprintf(PortString, "%s,%d", PortString, p);
TNC->RIG = RIG; TNC->RIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7444,7 +7419,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
nn += sprintf(&TxPortString[nn], ",%d", p); sprintf(TxPortString, "%s,%d", TxPortString, p);
TNC->TXRIG = RIG; TNC->TXRIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)

View File

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

View File

@ -508,12 +508,9 @@ ok:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]); if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cnd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }
else else

View File

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

View File

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

View File

@ -1498,8 +1498,6 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
PortEntry->PORTCONTROL.TNC = TNC; PortEntry->PORTCONTROL.TNC = TNC;
PortEntry->PORTCONTROL.Hardware = TNC->Hardware;
TNC->WebWindowProc = WebProc; TNC->WebWindowProc = WebProc;
TNC->WebWinX = 260; TNC->WebWinX = 260;
TNC->WebWinY = 325; TNC->WebWinY = 325;
@ -4503,7 +4501,7 @@ MsgLoop:
WritetoTrace(Stream, MsgPtr, InputLen, sockptr->ADIF, 'R'); WritetoTrace(Stream, MsgPtr, InputLen, sockptr->ADIF, 'R');
} }
if (InputLen == 8 && memcmp(MsgPtr, ";;;;;;\r\n", 8) == 0) if (InputLen == 8 && memcmp(MsgPtr, ";;;\r\n", 8) == 0)
{ {
// CMS Keepalive // CMS Keepalive
@ -5018,20 +5016,23 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
// Failed or closed - clear connection // Failed or closed - clear connection
// if Websock connection tell app // if Websock connection till app
if (sockptr->WebSocks) if (sockptr->WebSocks)
{ {
if (memcmp(sockptr->WebURL, "rhp", 3) == 0) if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
ProcessRHPWebSockClosed(sockptr->socket); ProcessRHPWebSockClosed(sockptr->socket);
DataSocket_Disconnect(TNC, sockptr);
return 0;
}
}
else
{
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
DataSocket_Disconnect(TNC, sockptr); DataSocket_Disconnect(TNC, sockptr);
return 0; return 0;
} }
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
DataSocket_Disconnect(TNC, sockptr);
return 0;
} }
MsgPtr = &sockptr->InputBuffer[0]; MsgPtr = &sockptr->InputBuffer[0];
@ -5145,13 +5146,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
} }
} }
else else
{
Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]); Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
sockptr->InputLen = 0; sockptr->InputLen = 0;
return 0; return 0;
@ -5472,7 +5467,8 @@ int WriteLog(char * msg)
strcat(Value, "logs/Telnet_"); strcat(Value, "logs/Telnet_");
} }
sprintf(&Value[strlen(Value)], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday); sprintf(Value, "%s%02d%02d%02d.log", Value,
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "a")) == NULL) if ((file = fopen(Value, "a")) == NULL)
return FALSE; return FALSE;
@ -5527,7 +5523,8 @@ VOID WriteCMSLog(char * msg)
strcat(Value, "logs/CMSAccess"); strcat(Value, "logs/CMSAccess");
} }
sprintf(&Value[strlen(Value)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday); sprintf(Value, "%s_%04d%02d%02d.log", Value,
tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(Value, "ab"); Handle = fopen(Value, "ab");
@ -6341,80 +6338,26 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
struct ConnectionInfo * sockptr; struct ConnectionInfo * sockptr;
SOCKET sock; SOCKET sock;
struct sockaddr_in sinx; struct sockaddr_in sinx;
struct sockaddr_in destaddr;
int addrlen=sizeof(sinx); int addrlen=sizeof(sinx);
char PortString[20]; int i;
struct addrinfo hints, *res = 0, *saveres;
sprintf(PortString, "%d", Port);
// get host info, make socket, and connect it
memset(&hints, 0, sizeof hints);
if (TCP->IPV6 == 0 && TCP->IPV4)
hints.ai_family = AF_INET;
else if (TCP->IPV4 == 0 && TCP->IPV6)
hints.ai_family = AF_INET6;
else if (TCP->IPV4 && TCP->IPV6)
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
else
{
ReportError(STREAM, "Neither IPv4 nor IPv5 are enabled");
return FALSE; // Resolve failed
}
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(Host, PortString, &hints, &res);
if (!res)
{
char Msg[256];
err = WSAGetLastError();
sprintf(Msg, "Resolve HostName Failed - Error %d", err);
ReportError(STREAM, Msg);
return FALSE; // Resolve failed
}
// Step thorough the list of hosts
saveres = res; // Save for free
/* if (res->ai_next) // More than one
{
int n = ISHostIndex;
while (n && res->ai_next)
{
res = res->ai_next;
n--;
}
if (n)
{
// We have run off the end of the list
ISHostIndex = 0; // Back to start
res = saveres;
}
else
ISHostIndex++;
}
*/
// getnameinfo(res->ai_addr, (int)res->ai_addrlen, RealISHost, 256, serv, 256, 0);
sockptr = STREAM->ConnectionInfo; sockptr = STREAM->ConnectionInfo;
sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); sock = sockptr->socket = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
ReportError(STREAM, "Create Socket Failed");
return FALSE;
}
sockptr->SocketActive = TRUE; sockptr->SocketActive = TRUE;
sockptr->InputLen = 0; sockptr->InputLen = 0;
sockptr->LoginState = 2; sockptr->LoginState = 2;
sockptr->UserPointer = 0; sockptr->UserPointer = 0;
sockptr->DoEcho = FALSE; sockptr->DoEcho = FALSE;
sockptr->FBBMode = FBB; // Raw Data sockptr->FBBMode = FBB; // Raw Data
if (sockptr->ADIF == NULL) if (sockptr->ADIF == NULL)
@ -6423,19 +6366,49 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
memset(sockptr->ADIF, 0, sizeof(struct ADIF)); memset(sockptr->ADIF, 0, sizeof(struct ADIF));
if (sock == INVALID_SOCKET) // Resolve Name if needed
sockptr->sin.sin_family = AF_INET;
sockptr->sin.sin_port = htons(Port);
sockptr->sin.sin_addr.s_addr = inet_addr(Host);
if (sockptr->sin.sin_addr.s_addr == INADDR_NONE)
{ {
ReportError(STREAM, "Create Socket Failed"); struct hostent * HostEnt;
return FALSE;
// Resolve name to address
HostEnt = gethostbyname(Host);
if (!HostEnt)
{
ReportError(STREAM, "Resolve HostName Failed");
return FALSE; // Resolve failed
}
i = 0;
while (HostEnt->h_addr_list[i] != 0)
{
struct in_addr addr;
addr.s_addr = *(u_long *) HostEnt->h_addr_list[i++];
}
memcpy(&sockptr->sin.sin_addr.s_addr, HostEnt->h_addr, 4);
} }
ioctl (sock, FIONBIO, &param); ioctl (sockptr->socket, FIONBIO, &param);
setsockopt (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) if (LogEnabled)
{ {
char logmsg[512]; char logmsg[512];
@ -6444,21 +6417,21 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
WriteLog (logmsg); WriteLog (logmsg);
} }
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
if (connect(sockptr->socket,(struct sockaddr *) &sockptr->sin, sizeof(destaddr)) == 0)
{ {
// //
// Connected successful // Connected successful
// //
ReportError(STREAM, "*** Connected"); ReportError(STREAM, "*** Connected");
freeaddrinfo(saveres);
// Get Send Buffer Size
return TRUE; return TRUE;
} }
else else
{ {
freeaddrinfo(saveres);
err=WSAGetLastError(); err=WSAGetLastError();
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
@ -6484,6 +6457,7 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
} }
return FALSE; return FALSE;
} }

View File

@ -685,11 +685,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ConnecttoUZ7HO(port); ConnecttoUZ7HO(port);
lasttime[port] = ltime; lasttime[port] = ltime;
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
else else
{ {
@ -1028,12 +1023,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }

5
V4.c
View File

@ -622,10 +622,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {

1
VARA.c
View File

@ -1720,6 +1720,7 @@ VConnected:
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
VARAProcessReceivedControl(TNC); VARAProcessReceivedControl(TNC);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
Debugprintf("VARA Returned from processing control packet");
} }
if (FD_ISSET(TNC->TCPDataSock, &readfs)) if (FD_ISSET(TNC->TCPDataSock, &readfs))

View File

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

View File

@ -139,10 +139,6 @@ VOID WritetoTraceSupport(struct TNCINFO * TNC, char * Msg, int Len)
int LineLen, i; int LineLen, i;
UCHAR Save; UCHAR Save;
int SaveLen = Len; int SaveLen = Len;
char Time[16];
time_t T;
struct tm * tm;
if (Len < 0) if (Len < 0)
return; return;
@ -210,16 +206,10 @@ lineloop:
#endif #endif
// Write to Web Buffer // Write to Web Buffer
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, Line); strcat(TNC->WebBuffer, Line);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved
Skip: Skip:
ptr1 = ptr2; ptr1 = ptr2;
@ -258,16 +248,10 @@ lineloop:
#else #else
index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 ); index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
#endif #endif
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, ptr1); strcat(TNC->WebBuffer, ptr1);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved
} }
} }
@ -1000,12 +984,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }

View File

@ -37,7 +37,6 @@ VOID Do_Save_WPRec(HWND hDlg);
VOID SaveInt64Value(config_setting_t * group, char * name, long long value); VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
VOID SaveIntValue(config_setting_t * group, char * name, int value); VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveStringValue(config_setting_t * group, char * name, char * value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
WPRec * AllocateWPRecord() WPRec * AllocateWPRecord()

265
WebMail.c
View File

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

View File

@ -1580,6 +1580,8 @@ TNCRunning:
// Send INIT script // Send INIT script
// VARA needs each command in a separate send
ptr1 = &TNC->InitScript[0]; ptr1 = &TNC->InitScript[0];
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
@ -1604,6 +1606,7 @@ TNCRunning:
c = *(ptr2 + 1); // Save next char c = *(ptr2 + 1); // Save next char
*(ptr2 + 1) = 0; // Terminate string *(ptr2 + 1) = 0; // Terminate string
} }
// VARASendCommand(TNC, ptr1, TRUE);
if (ptr2) if (ptr2)
*(1 + ptr2++) = c; // Put char back *(1 + ptr2++) = c; // Put char back

3
adif.c
View File

@ -409,7 +409,8 @@ BOOL WriteADIFRecord(ADIF * ADIF)
strcat(Value, "logs/BPQ_CMS_ADIF"); strcat(Value, "logs/BPQ_CMS_ADIF");
} }
sprintf(&Value[strlen(Value)], "_%04d%02d.adi", tm->tm_year +1900, tm->tm_mon+1); sprintf(Value, "%s_%04d%02d.adi", Value,
tm->tm_year +1900, tm->tm_mon+1);
STAT.st_size = 0; STAT.st_size = 0;
stat(Value, &STAT); stat(Value, &STAT);

View File

@ -176,6 +176,8 @@ typedef struct _TRANSPORTENTRY
// We collect as much data as possible before compressing and re-packetizing // We collect as much data as possible before compressing and re-packetizing
int AllowCompress; int AllowCompress;
unsigned char * toCompress; // Data being saved to compress
int toCompressLen;
unsigned char * unCompress; // Data being saved to uncompress unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen; int unCompressLen;
@ -253,7 +255,6 @@ typedef struct ROUTE
#define GotRTTResponse 2 // Other end has sent us a RTT Response #define GotRTTResponse 2 // Other end has sent us a RTT Response
#define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node #define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node
// (could just be monitoring RTT for some reason // (could just be monitoring RTT for some reason
#define SentRTTRequest 8
#define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls #define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls
// (only sent when we have seen both a request and response) // (only sent when we have seen both a request and response)
@ -461,18 +462,16 @@ typedef struct _APPLCALLS
// This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs, // This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs,
// But if these are significant (say 25% or 100 ms) they will be retransmitted // But if these are significant (say 25% or 100 ms) they will be retransmitted
// We treat the Routes as an array of 6. First 3 are NODES routes, next 3 are INP3 Routes. This works, but maybe is not ideal
typedef struct NR_DEST_ROUTE_ENTRY typedef struct NR_DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
UCHAR ROUT_QUALITY; // QUALITY UCHAR ROUT_QUALITY; // QUALITY
UCHAR ROUT_OBSCOUNT; UCHAR ROUT_OBSCOUNT;
UCHAR ROUT_LOCKED; UCHAR ROUT_LOCKED;
UCHAR Padding[4]; // So Entries are the same length UCHAR Padding[4]; // SO Entries are the same length
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct INP3_DEST_ROUTE_ENTRY typedef struct DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
USHORT LastRTT; // Last Value Reported USHORT LastRTT; // Last Value Reported
@ -496,8 +495,8 @@ typedef struct DEST_LIST
UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION
UCHAR INP3FLAGS; UCHAR INP3FLAGS;
struct NR_DEST_ROUTE_ENTRY NRROUTE[3]; // Best 3 NR neighbours for this dest struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest
struct INP3_DEST_ROUTE_ENTRY INP3ROUTE[3]; // Best 3 INP neighbours for this dest struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION
@ -701,7 +700,6 @@ typedef struct PORTCONTROL
BOOL NormalizeQuality; // Normalise Node Qualities BOOL NormalizeQuality; // Normalise Node Qualities
BOOL IgnoreUnlocked; // Ignore Unlocked routes BOOL IgnoreUnlocked; // Ignore Unlocked routes
BOOL INP3ONLY; // Default to INP3 and disallow NODES BOOL INP3ONLY; // Default to INP3 and disallow NODES
BOOL ALLOWINP3;
void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ
struct PORTCONTROL * HookPort; struct PORTCONTROL * HookPort;
@ -727,9 +725,6 @@ typedef struct PORTCONTROL
UCHAR * TX; // % Sending UCHAR * TX; // % Sending
UCHAR * BUSY; // % Active (Normally DCD active or TX) UCHAR * BUSY; // % Active (Normally DCD active or TX)
int Hardware; // TNC H_TYPE. Copied here for access from application context
} PORTCONTROLX, *PPORTCONTROL; } PORTCONTROLX, *PPORTCONTROL;
typedef struct FULLPORTDATA typedef struct FULLPORTDATA
@ -930,9 +925,6 @@ typedef struct _LINKTABLE
VOID * FRAMES[8]; // FRAMES WAITING ACK VOID * FRAMES[8]; // FRAMES WAITING ACK
VOID * RXFRAMES[8]; // Frames received out of sequence VOID * RXFRAMES[8]; // Frames received out of sequence
time_t LASTFRAMESENT; // For detecting stuck links
int LASTSENTQCOUNT; //
UCHAR L2STATE; // PROCESSING STATE UCHAR L2STATE; // PROCESSING STATE
UCHAR Ver2point2; // Set if running 2.2 UCHAR Ver2point2; // Set if running 2.2
USHORT L2TIMER; // FRAME RETRY TIMER USHORT L2TIMER; // FRAME RETRY TIMER
@ -967,21 +959,6 @@ typedef struct _LINKTABLE
int bytesRXed; // Info bytes only int bytesRXed; // Info bytes only
int bytesTXed; int bytesTXed;
// 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;
} LINKTABLE; } LINKTABLE;
#pragma pack(1) #pragma pack(1)
@ -1090,11 +1067,7 @@ struct SEM
int Gets; int Gets;
int Rels; int Rels;
DWORD SemProcessID; DWORD SemProcessID;
#ifdef WIN32
DWORD SemThreadID; DWORD SemThreadID;
#else
pthread_t SemThreadID;
#endif
int Line; // caller file and line int Line; // caller file and line
char File[MAX_PATH]; char File[MAX_PATH];
}; };
@ -1381,8 +1354,6 @@ struct arp_table_entry
// SOCKET SourceSocket; // SOCKET SourceSocket;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
BOOL noUpdate; // Don't update dest address from incoming packet BOOL noUpdate; // Don't update dest address from incoming packet
BOOL replytoSourcePort; // Update map entry dest port from source port of each packet.
time_t LastHeard; // Last Packet received from this ststiom
}; };

View File

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

View File

@ -204,7 +204,7 @@ int Update_MH_KeepAlive(struct AXIPPORTINFO * PORT, struct in_addr ipad, char pr
unsigned short int compute_crc(unsigned char *buf,int l); unsigned short int compute_crc(unsigned char *buf,int l);
unsigned int find_arp(unsigned char * call); unsigned int find_arp(unsigned char * call);
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name, BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name,
int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort); int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate);
BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len); BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len);
BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen); BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
static BOOL ReadConfigFile(int Port); static BOOL ReadConfigFile(int Port);
@ -213,7 +213,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT);
BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT); BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
int DumpFrameInHex(unsigned char * msg, int len); int DumpFrameInHex(unsigned char * msg, int len);
VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen); VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen);
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort); BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr);
int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock); int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock);
int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer); int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
@ -429,7 +429,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply) if (PORT->Checkifcanreply)
{ {
if (CheckSourceisResolvable(PORT, call, 0, &RXaddr, 0)) if (CheckSourceisResolvable(PORT, call, 0, &RXaddr))
return 1; return 1;
@ -437,7 +437,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
// Can't reply. If AutoConfig is set, add to table and accept, else reject // Can't reply. If AutoConfig is set, add to table and accept, else reject
if (PORT->AutoAddARP) if (PORT->AutoAddARP)
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0);
else else
{ {
char From[11] = "|"; char From[11] = "|";
@ -536,7 +536,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply) if (PORT->Checkifcanreply)
{ {
if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr, PORT->udpport[i])) if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr))
return 1; return 1;
else else
{ {
@ -547,10 +547,10 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
{ {
char Addr[80]; char Addr[80];
Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE); Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0);
} }
else else
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0);
else else
{ {
char From[11] = "|"; char From[11] = "|";
@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
return; return;
} }
// Select source port by choosing right socket // Seelcte source port by choosing right socket
// First Set Default for Protocol // First Set Default for Protocol
@ -1343,7 +1343,6 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
char axcall[7]; char axcall[7];
BOOL UDPFlag, BCFlag; BOOL UDPFlag, BCFlag;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
int useSourcePort = 0;
for (i=1; i <= MAXBPQPORTS; i++) for (i=1; i <= MAXBPQPORTS; i++)
{ {
@ -1392,7 +1391,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
{ {
if (convtoax25(call,axcall,&calllen)) if (convtoax25(call,axcall,&calllen))
{ {
add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0, useSourcePort); add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0);
ResolveDelay = 2; ResolveDelay = 2;
return(DestroyWindow(hWnd)); return(DestroyWindow(hWnd));
} }
@ -2148,7 +2147,6 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
int Interval; int Interval;
int noUpdate=FALSE; int noUpdate=FALSE;
int TCPMode; int TCPMode;
int useSourcePort = 0;
ptr = strtok(buf, " \t\n\r"); ptr = strtok(buf, " \t\n\r");
@ -2236,7 +2234,6 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
bcflag=0; bcflag=0;
TCPMode=0; TCPMode=0;
SourcePort = 0; SourcePort = 0;
useSourcePort = 0;
// //
// Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params // Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params
@ -2267,14 +2264,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (p_udpport == NULL) return (FALSE); if (p_udpport == NULL) return (FALSE);
if (_stricmp(p_udpport,"FROMPORT") == 0) port = atoi(p_udpport);
{
useSourcePort = TRUE;
port = 0;
}
else
port = atoi(p_udpport);
p_UDP = strtok(NULL, " \t\n\r"); p_UDP = strtok(NULL, " \t\n\r");
continue; continue;
} }
@ -2337,7 +2327,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (SourcePort == 0) if (SourcePort == 0)
SourcePort = port; SourcePort = port;
add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate, useSourcePort); add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate);
return (TRUE); return (TRUE);
} }
} // End of Process MAP } // End of Process MAP
@ -2448,7 +2438,7 @@ BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call,int * calllen
} }
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port, BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port,
UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort) UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate)
{ {
struct arp_table_entry * arp; struct arp_table_entry * arp;
@ -2467,8 +2457,7 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->PORT = PORT; arp->PORT = PORT;
if (port == 0 && arp->replytoSourcePort == 0) if (port == 0) PORT->needip = 1; // Enable Raw IP Mode
PORT->needip = 1; // Enable Raw IP Mode
arp->ResolveFlag=TRUE; arp->ResolveFlag=TRUE;
PORT->NeedResolver=TRUE; PORT->NeedResolver=TRUE;
@ -2487,7 +2476,6 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->TCPMode = TCPFlag; arp->TCPMode = TCPFlag;
arp->noUpdate = noUpdate; arp->noUpdate = noUpdate;
PORT->arp_table_len++; PORT->arp_table_len++;
arp->replytoSourcePort = useSourcePort;
if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70) if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70)
PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70; PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70;
@ -2588,7 +2576,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT)
return (0); return (0);
} }
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort) BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr)
{ {
// Makes sure we can reply to call before accepting message // Makes sure we can reply to call before accepting message
@ -2618,17 +2606,10 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPo
struct sockaddr_in * SA = rxaddr; struct sockaddr_in * SA = rxaddr;
memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4); memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4);
} }
// Dont think I should update port unless using source port for dest // Dont think I should update port
if (arp->replytoSourcePort) //arp->port = Port;
{
arp->port = FromPort;
arp->destaddr.sin_port = htons(arp->port);
if (arp->SourcePort == 0)
arp->SourcePort = ToPort;
}
} }
arp->LastHeard = time(NULL);
return 1; // Ok to process return 1; // Ok to process
} }
index++; index++;

View File

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

View File

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

81
cMain.c
View File

@ -52,9 +52,6 @@ int CanPortDigi(int Port);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
void MQTTTimer(); void MQTTTimer();
void SaveMH(); void SaveMH();
VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
#include "configstructs.h" #include "configstructs.h"
@ -65,7 +62,6 @@ extern int needADSB;
struct PORTCONFIG * PortRec; struct PORTCONFIG * PortRec;
#define RNRSET 0x2 // RNR RECEIVED FROM OTHER END #define RNRSET 0x2 // RNR RECEIVED FROM OTHER END
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
// STATION INFORMATION // STATION INFORMATION
@ -148,12 +144,6 @@ int L4Compress = 0;
int L4CompMaxframe = 3; int L4CompMaxframe = 3;
int L4CompPaclen = 236; int L4CompPaclen = 236;
int L2Compress = 0;
int L2CompMaxframe = 3;
int L2CompPaclen = 236;
int PREFERINP3ROUTES = 0;
BOOL LogL4Connects = FALSE; BOOL LogL4Connects = FALSE;
BOOL LogAllConnects = FALSE; BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE; BOOL AUTOSAVEMH = TRUE;
@ -171,8 +161,6 @@ char MQTT_PASS[80] = "";
int MQTT_Connecting = 0; int MQTT_Connecting = 0;
int MQTT_Connected = 0; int MQTT_Connected = 0;
int PoolBuilt = 0;
//TNCTABLE DD 0 //TNCTABLE DD 0
//NUMBEROFSTREAMS DD 0 //NUMBEROFSTREAMS DD 0
@ -848,23 +836,6 @@ BOOL Start()
if (L4CompPaclen < 64 || L4CompPaclen > 236) if (L4CompPaclen < 64 || L4CompPaclen > 236)
L4CompPaclen = 236; L4CompPaclen = 236;
L2Compress = cfg->C_L2Compress;
L2CompMaxframe = cfg->C_L2CompMaxframe;
L2CompPaclen = cfg->C_L2CompPaclen;
if (L2CompMaxframe < 1 || L2CompMaxframe > 16)
L2CompMaxframe = 3;
if (L2CompPaclen < 64 || L2CompPaclen > 236)
L2CompPaclen = 236;
PREFERINP3ROUTES = cfg->C_PREFERINP3ROUTES;
if (cfg->C_OnlyVer2point0)
SUPPORT2point2 = 0;
// Get pointers to PASSWORD and APPL1 commands // Get pointers to PASSWORD and APPL1 commands
@ -991,7 +962,6 @@ BOOL Start()
PORT->NormalizeQuality = !PortRec->NoNormalize; PORT->NormalizeQuality = !PortRec->NoNormalize;
PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED; PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED;
PORT->INP3ONLY = PortRec->INP3ONLY; PORT->INP3ONLY = PortRec->INP3ONLY;
PORT->ALLOWINP3 = PortRec->AllowINP3;
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME; PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
@ -1016,9 +986,6 @@ BOOL Start()
PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN; PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN;
PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST; PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST;
if (PORT->QUAL_ADJUST < 0 || PORT->QUAL_ADJUST > 100)
PORT->QUAL_ADJUST = 100;
PORT->DIGIFLAG = PortRec->DIGIFLAG; PORT->DIGIFLAG = PortRec->DIGIFLAG;
if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT)) if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT))
PORT->DIGIPORT = PortRec->DIGIPORT; PORT->DIGIPORT = PortRec->DIGIPORT;
@ -1476,8 +1443,6 @@ BOOL Start()
ENDBUFFERPOOL = NEXTFREEDATA; ENDBUFFERPOOL = NEXTFREEDATA;
PoolBuilt = 1;
// Copy Bridge Map // Copy Bridge Map
@ -1595,7 +1560,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
struct ROUTE * ROUTE = NEIGHBOURS; struct ROUTE * ROUTE = NEIGHBOURS;
struct ROUTE * FIRSTSPARE = NULL; struct ROUTE * FIRSTSPARE = NULL;
int n = MAXNEIGHBOURS; int n = MAXNEIGHBOURS;
char Normcall[10];
while (n--) while (n--)
{ {
@ -1608,10 +1572,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
ROUTE++; ROUTE++;
continue; continue;
} }
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call)) if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
{ {
*REQROUTE = ROUTE; *REQROUTE = ROUTE;
@ -2510,47 +2470,6 @@ ENDOFLIST:
if ((LINK->L2FLAGS & RNRSET) == 0) if ((LINK->L2FLAGS & RNRSET) == 0)
SDETX(LINK); SDETX(LINK);
else
{
// Stuck link debug check
if (LINK->LASTFRAMESENT && (time(NULL) - LINK->LASTFRAMESENT) > 60) // No send for 60 secs
{
if (COUNT_AT_L2(LINK) > 16)
{
// Dump Link State
char Normcall[11] = "";
char Normcall2[11] = "";
int Count = COUNT_AT_L2(LINK);
int secs = time(NULL) - LINK->LASTFRAMESENT;
ConvFromAX25(LINK->LINKCALL, Normcall);
ConvFromAX25(LINK->OURCALL, Normcall2);
Debugprintf("*** Stuck L2 Session for %d Secs RNR Set %s %s %d", secs, Normcall, Normcall2, Count);
Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS);
Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3],
LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]);
// Reset Link
InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE
LINK->L2RETRIES -= 1; // Just send one DISC
LINK->L2STATE = 4; // CLOSING
L2SENDCOMMAND(LINK, DISC | PFBIT);
return;
}
}
}
} }
} }
LINK++; LINK++;

View File

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

View File

@ -105,7 +105,7 @@ VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len); VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum); struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK); int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
VOID SENDL4CONNECT(TRANSPORTENTRY * Session); VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
@ -202,6 +202,8 @@ int TrytoGuessCode(unsigned char * Char, int Len);
#define XID 0xAF #define XID 0xAF
#define TEST 0xE3 #define TEST 0xE3
#define SUPPORT2point2 1
// XID Optional Functions // XID Optional Functions
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address #define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
@ -436,9 +438,6 @@ extern int MQTT_PORT;
extern char MQTT_USER[80]; extern char MQTT_USER[80];
extern char MQTT_PASS[80]; extern char MQTT_PASS[80];
extern int SUPPORT2point2;
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz); DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);

View File

@ -308,8 +308,7 @@ static char *keywords[] =
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed "BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", "LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS", "EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS",
"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe", "L4Compress", "L4CompMaxframe", "L4CompPaclen"
"L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -331,8 +330,7 @@ static void * offset[] =
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed &xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs, &xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS, &xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS,
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe, &xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen}; /* offset for corresponding data in config file */
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -353,7 +351,6 @@ static int routine[] =
15, 0, 2, 9, 9, 15, 0, 2, 9, 9,
2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20, 2, 2, 0, 1, 20, 20,
1, 1, 1, 1, 1,
1, 1, 1} ; // Routine to process param 1, 1, 1} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int); int PARAMLIM = sizeof(routine)/sizeof(int);
@ -376,7 +373,7 @@ static char *pkeywords[] =
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY", "BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE", "UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE", "IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "ALLOWINP3"}; /* parameter keywords */ "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -390,7 +387,7 @@ static void * poffset[] =
&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY, &xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize, &xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide, &xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, &xxp.AllowINP3}; /* offset for corresponding data in config file */ &xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort}; /* offset for corresponding data in config file */
static int proutine[] = static int proutine[] =
{ {
@ -404,7 +401,7 @@ static int proutine[] =
0, 1, 2, 18, 15, 16, 2, 0, 1, 2, 18, 15, 16, 2,
1, 17, 1, 1, 1, 1, 2, 1, 17, 1, 1, 1, 1, 2,
2, 2, 1, 1, 19, 2, 2, 2, 1, 1, 19, 2,
1, 20, 1, 21, 22, 1, 1}; /* routine to process parameter */ 1, 20, 1, 21, 22, 1}; /* routine to process parameter */
int PPARAMLIM = sizeof(proutine)/sizeof(int); int PPARAMLIM = sizeof(proutine)/sizeof(int);
@ -538,8 +535,6 @@ BOOL ProcessConfig()
// xxcfg.SaveMH = TRUE; // Default to save // xxcfg.SaveMH = TRUE; // Default to save
xxcfg.C_PREFERINP3ROUTES = 0; // Default to false
GetNextLine(rec); GetNextLine(rec);
while (rec[0]) while (rec[0])
@ -626,11 +621,7 @@ BOOL ProcessConfig()
paramok[86]=1; // L4Compress paramok[86]=1; // L4Compress
paramok[87]=1; // L4Compress Maxframe paramok[87]=1; // L4Compress Maxframe
paramok[88]=1; // L4Compress Paclen paramok[88]=1; // L4Compress Paclen
paramok[89]=1; // L2Compress
paramok[90]=1; // L2Compress Maxframe
paramok[91]=1; // L2Compress Paclen
paramok[92]=1; // PREFERINP3ROUTES
paramok[93]=1; // C_ONLYVer2point0
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
{ {

View File

@ -81,7 +81,6 @@ struct PORTCONFIG
uint64_t PortFreq; uint64_t PortFreq;
char * M0LTEMapInfo; char * M0LTEMapInfo;
int QtSMPort; int QtSMPort;
int AllowINP3;
}; };
struct ROUTECONFIG struct ROUTECONFIG
@ -174,11 +173,6 @@ struct CONFIGTABLE
int C_L4Compress; int C_L4Compress;
int C_L4CompMaxframe; int C_L4CompMaxframe;
int C_L4CompPaclen; int C_L4CompPaclen;
int C_L2Compress;
int C_L2CompMaxframe;
int C_L2CompPaclen;
int C_PREFERINP3ROUTES;
int C_OnlyVer2point0;
//#define ApplOffset 80000 // Applications offset in config buffer //#define ApplOffset 80000 // Applications offset in config buffer

11
debian/NEWS vendored
View File

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

23
debian/README.Debian vendored
View File

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

50
debian/bpq32.cfg vendored
View File

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

303
debian/changelog vendored
View File

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

20
debian/control vendored
View File

@ -1,20 +0,0 @@
Source: linbpq
Section: hamradio
Priority: optional
Maintainer: Dave Hibberd <hibby@debian.org>
Standards-Version: 4.7.2
Vcs-Browser: https://git.hibbian.org/Hibbian/linbpq
Vcs-Git: https://git.hibbian.org/Hibbian/linbpq.git
Homepage: https://www.cantab.net/users/john.wiseman/Documents/
Build-Depends: debhelper-compat (= 13)
Build-Depends-Arch: libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev, libpng-dev
Rules-Requires-Root: no
Package: linbpq
Architecture: linux-any
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser
Description: Packet node and ax25 stack
LINBPQ is a Linux version of the BPQ32 Node, BBS and Chat Server components.
It is actively developed by John G8BPQ and contains a complete, independent
implementation of ax.25 and net/rom as well as BBS and Chat applications and
can be used either as a packet switch or as a full featured node.

37
debian/copyright vendored
View File

@ -1,37 +0,0 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: linBPQ
Upstream-Contact: John Wiseman G8BPQ <john.wiseman@cantab.net>
Source: https://www.cantab.net/users/john.wiseman/Documents/
Files-Excluded: *.vcproj* *.bak *.lib *.dll *.wav *.asm *.vcxproj* *.pdb *.exe
.gitignore XAprs zlib.h zconf.h MQTT* pcap.h miniupnpc.h upnpdev.h
igd_desc_parse.h upnpcommands.h upnperrors.h miniupnpctypes.h
*.svn-base *.db *.obj
Files: *
Copyright: 1990-2025 John Wiseman G8BPQ <john.wiseman@cantab.net>
License: GPL-3
Files: debian/*
Copyright: 2016-2025 Dave Hibberd <d@vehibberd.com>
License: GPL-3
Files: debian/linbpq.service
Copyright: 2024-2025 Tom Fanning M0LTE
License: GPL-3
License: GPL-3
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
The GPL License which applies to this package can be found on your Debian
system at /usr/share/common-licenses/GPL-3.

2
debian/dirs vendored
View File

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

3
debian/gbp.conf vendored
View File

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

View File

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

1
debian/install vendored
View File

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

View File

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

14
debian/linbpq.service vendored
View File

@ -1,14 +0,0 @@
[Unit]
Description=Linbpq systemd service file
After=network.target
ConditionPathExists=/etc/bpq32.cfg
[Service]
ExecStart=/usr/sbin/linbpq -c /etc -d /opt/oarc/bpq -l /opt/oarc/bpq
WorkingDirectory=/opt/oarc/bpq
Restart=always
User=linbpq
Group=linbpq
[Install]
WantedBy=multi-user.target

View File

@ -1,11 +0,0 @@
# weirdness from oarc packaging
linbpq: dir-or-file-in-opt [opt/oarc/]
linbpq: dir-or-file-in-opt [opt/oarc/bpq/]
# i know!
linbpq: no-manual-page [usr/sbin/linbpq]
# Directory is populated on first run
linbpq: package-contains-empty-directory [opt/oarc/bpq/]
# Code convenience
linbpq: spelling-error-in-binary Dont Don't [usr/sbin/linbpq]
linbpq: spelling-error-in-binary Paramters Parameters [usr/sbin/linbpq]
linbpq: spelling-error-in-binary lon long [usr/sbin/linbpq]

View File

@ -1,47 +0,0 @@
--- a/makefile
+++ b/makefile
@@ -2,8 +2,7 @@
# To exclude i2c support run make noi2c
-OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pngwutil.o\
- pngread.o pngwrite.o png.o pngerror.o pngget.o pngmem.o APRSIconData.o AISCommon.o\
+OBJS = APRSIconData.o AISCommon.o\
upnp.o APRSStdPages.o HSMODEM.o WinRPR.o KISSHF.o TNCEmulators.o bpqhdlc.o SerialPort.o\
adif.o WebMail.o utf8Routines.o VARA.o LzFind.o Alloc.o LzmaDec.o LzmaEnc.o LzmaLib.o \
Multicast.o ARDOP.o IPCode.o FLDigi.o linether.o CMSAuth.o APRSCode.o BPQtoAGW.o KAMPactor.o\
@@ -17,12 +16,12 @@
# Configuration:
-#Default to Linux
- CC = gcc
- LDFLAGS = -Xlinker -Map=output.map -lrt
+CFLAGS:=$(shell dpkg-buildflags --get CFLAGS)
+CFLAGS+=$(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS)
-all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
-all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
+all: CFLAGS += -DLINBPQ -MMD -g -rdynamic -fcommon -fasynchronous-unwind-tables
+all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lrt -lm -lz -lpthread -lconfig -lpcap -lpng
all: linbpq
#other OS
@@ -74,12 +73,11 @@
linbpq: $(OBJS)
- cc $(OBJS) $(CFLAGS) $(LDFLAGS) $(LIBS) -o linbpq
- sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
+ $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) $(LIBS) -o linbpq
-include *.d
-clean :
- rm *.d
- rm linbpq $(OBJS)
+install:
+ install -b -m 755 -D -d debian/linbpq/usr/sbin
+ install -b -m 755 -p linbpq debian/linbpq/usr/sbin

View File

@ -1,2 +0,0 @@
spelling-fixes.patch
makefile

View File

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

47
debian/postinst vendored
View File

@ -1,47 +0,0 @@
#!/bin/sh
set -e
if [ "$1" = configure ]; then
# if ! getent group linbpq >/dev/null; then
# addgroup --system --force-badname linbpq || true
# fi
echo "Creating/updating linbpq user account..."
adduser --system --group --home /opt/oarc/bpq \
--gecos "linbpq system user" --shell /bin/false \
--quiet --disabled-password linbpq || {
# adduser failed. Why?
if getent passwd linbpq >/dev/null ; then
echo "Non-system user linbpq found. I will not overwrite a non-system" >&2
echo "user. Remove the user and reinstall linbpq." >&2
exit 1
fi
# unknown adduser error, simply exit
exit 1
}
if ! id -nGz linbpq | grep -qzxF 'dialout' ; then
adduser linbpq dialout
fi
if ! id -nGz linbpq | grep -qzxF 'plugdev' ; then
adduser linbpq plugdev
fi
chown :linbpq /opt/oarc/bpq
chmod 775 /opt/oarc/bpq
# If we have setcap is installed, set the requirements
# which allows us to install our binaries without the setuid
# bit.
if command -v setcap > /dev/null; then
setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" /usr/sbin/linbpq
else
echo "Setcap failed on /usr/sbin/linbpq, Features may be limited" >&2
fi
else
echo "Setcap is not installed, Features may be limited" >&2
fi
#DEBHELPER#

14
debian/preinst vendored
View File

@ -1,14 +0,0 @@
#!/bin/sh
set -e
confile="/etc/bpq32.cfg"
node="/opt/oarc/bpq/bpq32.cfg"
if [ -L $confile ]; then
rm $confile
cp $node $confile
mv $node $node.bak
fi
#DEBHELPER#

6
debian/rules vendored
View File

@ -1,6 +0,0 @@
#!/usr/bin/make -f
export DEB_BUILD_MAINT_OPTIONS=hardening=+all
%:
dh $@

View File

@ -1 +0,0 @@
3.0 (quilt)

3
debian/watch vendored
View File

@ -1,3 +0,0 @@
version=4
opts="pgpmode=none,dversionmangle=s/\+repack//,repacksuffix=+repack,repack,compression=xz" \
http://127.0.0.1:8000/linbpq-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))

2
kiss.c
View File

@ -2294,7 +2294,7 @@ VOID QtSMThread(struct PORTCONTROL * PORT)
char Msg[64]; char Msg[64];
int Len; int Len;
// We need to send a QtSMPort message for each Channel sharing this connection // We need tp send a QtSMPort message for each Channel sharing thia connection
// Note struct KISSINFO and struct PORTCONTROL are different mappings of the same data // Note struct KISSINFO and struct PORTCONTROL are different mappings of the same data
struct KISSINFO * KISS = (struct KISSINFO *)PORT; struct KISSINFO * KISS = (struct KISSINFO *)PORT;

View File

@ -22,29 +22,17 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Normally uses a Raw socket, but that can't send to other apps on same machine. // Normally uses a Raw socket, but that can't send to other apps on same machine.
// so can use a TAP device instead (or maybe as well??) // so can use a TAP device instead (or maybe as well??)
// Not suported on BSD based systems
#ifndef FREEBSD
#ifndef MACBPQ #ifndef MACBPQ
#if !(defined(MACBPQ) || defined(FREEBSD))
#include <stdio.h> #include <stdio.h>
#include "cheaders.h" #include "cheaders.h"
#include <sys/socket.h> #include <sys/socket.h>
#if !(defined(FREEBSD))
#include <linux/if_packet.h> #include <linux/if_packet.h>
#include <linux/if_ether.h> #include <linux/if_ether.h>
#include <linux/if_arp.h> #include <linux/if_arp.h>
#endif
#endif
extern int tap_fd; extern int tap_fd;
typedef struct PCAPStruct typedef struct PCAPStruct
@ -501,11 +489,5 @@ static int ProcessLine(char * buf, int Port, BOOL CheckPort)
return (FALSE); return (FALSE);
} }
//
#endif // MACBPQ
#endif // FREEBSD
#endif

View File

@ -1406,7 +1406,7 @@ File: 5566 NEWBOAT.HOMEPORT.JPG
if (SendBBStoSYSOPCall) if (SendBBStoSYSOPCall)
if (_stricmp(FullTo, BBSName) == 0) if (_stricmp(FullTo, BBSName) == 0)
strcpy(FullTo, SYSOPCall); strcpy(Msg->to, SYSOPCall);
if ((Msg->via[0] == 0 || strcmp(Msg->via, "BPQ") == 0 || strcmp(Msg->via, "BBS") == 0) if ((Msg->via[0] == 0 || strcmp(Msg->via, "BPQ") == 0 || strcmp(Msg->via, "BBS") == 0)
&& (conn->Paclink || conn->RMSExpress)) && (conn->Paclink || conn->RMSExpress))

View File

@ -17,64 +17,22 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
# Configuration: # Configuration:
#Default to Linux CC = gcc
CC = gcc
LDFLAGS = -Xlinker -Map=output.map -lrt all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
all: linbpq
#other OS
OS_NAME = $(shell uname -s)
ifeq ($(OS_NAME),NetBSD)
CC = cc
EXTRA_CFLAGS = -DFREEBSD -DNOMQTT -I/usr/pkg/include
LDFLAGS = -Xlinker -Map=output.map -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lrt -lutil -lexecinfo
all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
all: LIBS = -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
all: linbpq all: linbpq
endif nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT
ifeq ($(OS_NAME),FreeBSD)
CC = cc
EXTRA_CFLAGS = -DFREEBSD -DNOMQTT -I/usr/local/include
LDFLAGS = -Xlinker -Map=output.map -L/usr/local/lib -lrt -liconv -lutil -lexecinfo
all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
all: LIBS = -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
all: linbpq
endif
ifeq ($(OS_NAME),Darwin)
CC = gcc
EXTRA_CFLAGS = -DMACBPQ -DNOMQTT
LDFLAGS = -liconv
all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
all: LIBS = -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
all: linbpq
endif
$(info OS_NAME is $(OS_NAME))
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT -fasynchronous-unwind-tables
nomqtt: LIBS = -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
nomqtt: linbpq nomqtt: linbpq
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon -fasynchronous-unwind-tables noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon
noi2c: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
noi2c: linbpq noi2c: linbpq
linbpq: $(OBJS) linbpq: $(OBJS)
cc $(OBJS) $(CFLAGS) $(LDFLAGS) $(LIBS) -o linbpq gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
-include *.d -include *.d

2
mqtt.c
View File

@ -429,6 +429,6 @@ void MQTTKISSRX(void *message) {};
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT) {}; void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT) {};
void MQTTTimer() {}; void MQTTTimer() {};
void MQTTReportSession(char * Msg) {}; void MQTTReportSession(char * Msg) {};
void MQTTMessageEvent(void* message) {};
#endif #endif

View File

@ -2,7 +2,6 @@
// Authentication is via Telnet USER records. // Authentication is via Telnet USER records.
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "cheaders.h" #include "cheaders.h"
@ -336,7 +335,7 @@ Token * find_token(const char* token)
int send_http_response(char * response, const char* msg) int send_http_response(char * response, const char* msg)
{ {
return sprintf(response, "HTTP/1.1 %s\r\nAccess-Control-Allow-Origin: *\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg); return sprintf(response, "HTTP/1.1 %s\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg);
} }
/* /*

View File

@ -520,8 +520,7 @@ char * MainConfigtxt()
"<textarea cols=\"8\" rows=\"5\" name=\"Hat\">%s</textarea>\r\n" "<textarea cols=\"8\" rows=\"5\" name=\"Hat\">%s</textarea>\r\n"
"<textarea cols=\"8\" rows=\"5\" name=\"HBID\">%s</textarea>\r\n" "<textarea cols=\"8\" rows=\"5\" name=\"HBID\">%s</textarea>\r\n"
"<p></p>" "<p></p>"
"&nbsp;FBB reject.sys type filters (all fields must match, wildcards allowed)<br>" "&nbsp;FBB reject.sys type filters (all fields must match, wildcards allowed)\r\n"
"&nbsp;'A' action accepts message if all fields match without checking following lines\r\n"
"<p></p>" "<p></p>"
"<div style='position: absolute; left: 20px;height: 120px; overflow:auto;'>%s</div>" "<div style='position: absolute; left: 20px;height: 120px; overflow:auto;'>%s</div>"
"<div style='position: absolute; top: 1120px;left: 300px; overflow:auto;'>" "<div style='position: absolute; top: 1120px;left: 300px; overflow:auto;'>"

28
upnp.c
View File

@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <winsock2.h> #include <winsock2.h>
#endif #endif
#ifdef LINBPQ #ifdef LINBPQ
#ifndef MACBPQ
#ifndef WIN32 #ifndef WIN32
#include <miniupnpc/upnpcommands.h> #include <miniupnpc/upnpcommands.h>
#include <miniupnpc/miniupnpc.h> #include <miniupnpc/miniupnpc.h>
@ -48,8 +49,13 @@ POSSIBILITY OF SUCH DAMAGE.
#include <stdio.h> #include <stdio.h>
#endif #endif
#endif #endif
#endif
#ifdef MACBPQ
#include </usr/local/Cellar/miniupnpc/2.2.5/include/miniupnpc/upnpcommands.h>
#include </usr/local/Cellar/miniupnpc/2.2.5/include/miniupnpc/miniupnpc.h>
#include </usr/local/Cellar/miniupnpc/2.2.5/include/miniupnpc/upnperrors.h>
#include <stdio.h>
#endif
int AddMap(char * controlURL, char * eport, char * iport, char * proto); int AddMap(char * controlURL, char * eport, char * iport, char * proto);
int DeleteMap(char * controlURL, char * eport, char * iport, char * proto); int DeleteMap(char * controlURL, char * eport, char * iport, char * proto);
@ -87,11 +93,7 @@ int i;
const char * rootdescurl = 0; const char * rootdescurl = 0;
const char * multicastif = 0; const char * multicastif = 0;
const char * minissdpdpath = 0; const char * minissdpdpath = 0;
#ifdef UPNP_LOCAL_PORT_ANY
int localport = UPNP_LOCAL_PORT_ANY; int localport = UPNP_LOCAL_PORT_ANY;
#else
int localport = 0;
#endif
int retcode = 0; int retcode = 0;
int error = 0; int error = 0;
int ipv6 = 0; int ipv6 = 0;
@ -117,18 +119,15 @@ int upnpInit()
{ {
if (devlist == NULL) if (devlist == NULL)
{ {
#if MINIUPNPC_API_VERSION == 10
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, &error);
#else
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error); devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error);
#endif
if (devlist == NULL) if (devlist == NULL)
{ {
Consoleprintf("Failed to find a UPNP device"); Consoleprintf("Failed to find a UPNP device");
return 0; return 0;
} }
#if MINIUPNPC_API_VERSION >= 18 #if MINIUPNPC_API_VERSION == 18
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr)); i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr));
#else #else
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
@ -151,18 +150,15 @@ int upnpClose()
{ {
if (devlist == NULL) if (devlist == NULL)
{ {
#if MINIUPNPC_API_VERSION == 10
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, &error);
#else
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error); devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error);
#endif
if (devlist == NULL) if (devlist == NULL)
{ {
Consoleprintf("Failed to find a UPNP device"); Consoleprintf("Failed to find a UPNP device");
return 0; return 0;
} }
#if MINIUPNPC_API_VERSION >= 18 #if MINIUPNPC_API_VERSION == 18
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr)); i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr));
#else #else
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));