master
g8bpq 3 months ago
parent 45dc77a4e1
commit 36671e8514

@ -550,16 +550,20 @@ int AGWConnected(struct BPQConnectionInfo * Con, int Stream)
if (ApplCall[i]==32)
ApplCall[i]=0;
// See if incomming connection
// See if incoming connection
if (Con->Listening)
{
// Allocate Session and send "c" Message
//
// Find an AGW session
Debugprintf("Incoming AGW Call for ApplCall %s", ApplCall);
for (sockptr=&Sockets[1]; sockptr <= &Sockets[CurrentSockets]; sockptr++)
{
Debugprintf("Trying Socket %d, Calls %s %s", i, sockptr->CallSign1, sockptr->CallSign2);
if (sockptr->SocketActive &&
(memcmp(sockptr->CallSign1, ApplCall, 10) == 0) || (memcmp(sockptr->CallSign2, ApplCall, 10) == 0))
{
@ -572,6 +576,7 @@ int AGWConnected(struct BPQConnectionInfo * Con, int Stream)
int maxframe;
int l4window;
Debugprintf("Connection Found, Checking for duplicate calls");
keyptr=(byte *)&Con->CallKey;
@ -594,13 +599,13 @@ int AGWConnected(struct BPQConnectionInfo * Con, int Stream)
for (i = 0; i < CurrentConnections; i++)
{
if (Con->BPQStream == Stream)
if (AGWConnections[i].BPQStream == Stream)
continue; // Dont Check ourself!
if (AGWConnections[i].SocketIndex == sockptr &&
memcmp(&Con->CallKey, &AGWConnections[i].CallKey,21) == 0)
{
SendMsg(Stream, "AGWtoBPQ - Callsign is already connected\r", 43);
SendMsg(Stream, "AGWAPI - Callsign is already connected\r", 43);
Sleep (500);
Disconnect(Stream);
Con->CallKey[0]=0;
@ -1393,12 +1398,12 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
if (sockptr->AGWRXHeader.DataKind == 'V') // Unproto with VIA string
{
Digis = sockptr->MsgData[0]; // Number of digis
if (Digis > 7)
{
AGWDataSocket_Disconnect(sockptr);
return 0;
}
if (Digis > 7)
{
AGWDataSocket_Disconnect(sockptr);
return 0;
}
for (j = 1; j<= Digis; j++)
{

@ -103,6 +103,7 @@ void GetSavedAPRSMessages();
static VOID GPSDConnect(void * unused);
int CanPortDigi(int Port);
int FromLOC(char * Locator, double * pLat, double * pLon);
BOOL CheckExcludeList(UCHAR * Call);
extern int SemHeldByAPI;
extern int APRSMONDECODE();
@ -1108,6 +1109,14 @@ Dll VOID APIENTRY Poll_APRS()
monchars = (UCHAR *)monbuff;
AdjBuff = Orig = (MESSAGE *)monchars; // Adjusted for digis
// Check Exclude List
if (CheckExcludeList(Orig->ORIGIN) == 0)
{
ReleaseBuffer(monbuff);
continue;
}
Port = Orig->PORT;
if (Port & 0x80) // TX
@ -3304,6 +3313,19 @@ VOID ProcessAPRSISMsg(char * APRSMsg)
return;
*(Dest++) = 0; // Termainate Source
if (ExcludeList[0])
{
// Check if excluded. Need to convert to ax.25
UCHAR AXCall[7];
ConvToAX25(Source, AXCall);
if (CheckExcludeList == 0)
return;
}
ptr = strchr(Dest, ',');
if (ptr)

@ -452,7 +452,7 @@ void WriteLogLine(CIRCUIT * conn, int Flag, char * Msg, int MsgLen, int Flags)
// Don't close/reopen logs every time
// if ((LT - LastLogTime[Flags]) > 60)
if ((LT - LastLogTime[Flags]) > 30)
{
LastLogTime[Flags] = LT;
fclose(LogHandle[Flags]);
@ -501,6 +501,7 @@ VOID __cdecl Debugprintf(const char * format, ...)
va_start(arglist, format);
Len = vsprintf(Mess, format, arglist);
va_end(arglist);
#ifndef LINBPQ
WriteLogLine(NULL, '!',Mess, Len, LOG_DEBUG_X);
#endif
@ -519,6 +520,7 @@ VOID __cdecl Logprintf(int LogMode, CIRCUIT * conn, int InOut, const char * form
va_start(arglist, format);
Len = vsprintf(Mess, format, arglist);
va_end(arglist);
WriteLogLine(conn, InOut, Mess, Len, LogMode);
return;
@ -2444,6 +2446,7 @@ VOID __cdecl nodeprintf(ConnectionInfo * conn, const char * format, ...)
va_start(arglist, format);
len = vsprintf(Mess, format, arglist);
va_end(arglist);
QueueMsg(conn, Mess, len);
@ -2463,6 +2466,7 @@ VOID __cdecl nodeprintfEx(ConnectionInfo * conn, const char * format, ...)
va_start(arglist, format);
len = vsprintf(Mess, format, arglist);
va_end(arglist);
QueueMsg(conn, Mess, len);
@ -10897,6 +10901,8 @@ int Connected(int Stream)
user->flags |= F_Temp_B2_BBS;
conn->NewUser = TRUE;
user->lastmsg = LatestMsg - 20; // Limit L command for new users
}
user->TimeLastConnected = time(NULL);
@ -12068,6 +12074,8 @@ void run_pg(CIRCUIT * conn, struct UserInfo * user)
iop = NULL;
printf("Len %d %x %x %x\n", conn->InputLen, conn->InputBuffer[0], conn->InputBuffer[1], conn->InputBuffer[2]);
conn->InputBuffer[conn->InputLen] = 0;
strlop(conn->InputBuffer, 13);
@ -12077,7 +12085,7 @@ void run_pg(CIRCUIT * conn, struct UserInfo * user)
{
if (isalnum(conn->InputBuffer[i]) == 0 && conn->InputBuffer[i] != ' ')
{
BBSputs(conn, "PG commnand string invalid\r");
BBSputs(conn, "PG command string invalid\r");
conn->InputMode=0;
SendPrompt(conn, user);
return;
@ -12092,7 +12100,7 @@ void run_pg(CIRCUIT * conn, struct UserInfo * user)
user->Temp->RUNPGPARAMS->user = user;
user->Temp->RUNPGPARAMS->conn = conn;
strncpy(user->Temp->RUNPGPARAMS->InputBuffer, conn->InputBuffer, 80); // needs to be length of actual input!
user->Temp->RUNPGPARAMS->Len = conn->InputLen;
user->Temp->RUNPGPARAMS->Len = strlen(conn->InputBuffer);
if (conn == 0 || user == 0)
{
@ -12345,7 +12353,7 @@ void run_pg( CIRCUIT * conn, struct UserInfo * user )
user->Temp->RUNPGPARAMS->user = user;
user->Temp->RUNPGPARAMS->conn = conn;
strncpy(user->Temp->RUNPGPARAMS->InputBuffer, conn->InputBuffer, 80); // needs to be length of actual input!
user->Temp->RUNPGPARAMS->Len = conn->InputLen;
user->Temp->RUNPGPARAMS->Len = strlen(conn->InputBuffer);
index = user->Temp->PG_INDEX;
conn->InputBuffer[conn->InputLen] = 0;
@ -12357,7 +12365,7 @@ void run_pg( CIRCUIT * conn, struct UserInfo * user )
{
if (isalnum(conn->InputBuffer[i]) == 0 && conn->InputBuffer[i] != ' ')
{
BBSputs(conn, "PG commnand string invalid\r");
BBSputs(conn, "PG command string invalid\r");
conn->InputMode=0;
SendPrompt(conn, user);
return;
@ -13410,6 +13418,7 @@ VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...)
va_start(arglist, format);
vsprintf(buff, format, arglist);
va_end(arglist);
BBSputs(conn, buff);
}

File diff suppressed because it is too large Load Diff

@ -1163,6 +1163,8 @@
// Fix possible crash in SendBBSDataToPktMap
// Remove Uncompressed Blocked forwarding (27)
// Fix mail api returning garbage when deflate isn't requested (27)
// Fix PG command processing on 64 bit Linux (31)
// Limit L command output for new users (32)
#include "bpqmail.h"

@ -116,6 +116,7 @@ VOID __cdecl Debugprintf(const char * format, ...)
va_start(arglist, format);
Len = vsprintf_s(Mess, sizeof(Mess), format, arglist);
va_end(arglist);
strcat(Mess, "\r\n");
OutputDebugString(Mess);
return;

@ -1322,7 +1322,14 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Change INP3 to XR 'standard' (29)
// Swap L4INDEX and L4ID in Packet Trace API (30)
// More INP3 fixes (30)
// Starting NCMP implementation
// Fix AGWAPI inbound connect for APPL Numbers above 1 (31)
// More INP3 changes (enforce RIF refresh at hourly intervals and time out nodes (31)
// Save, forward and display XR extended INP3 Options (31)
// Check packets from APRS-IS against Exclude list (32)
// Fix authorisation of Web Save Config File (32)
// Add missing calls to va_end() (32)
// Apply EXCLUDE to APRS and Digi (32)
#define CKernel
@ -5829,6 +5836,7 @@ VOID __cdecl Debugprintf(const char * format, ...)
va_start(arglist, format);
vsprintf(Mess, format, arglist);
va_end(arglist);
strcat(Mess, "\r\n");
OutputDebugString(Mess);

94
Cmd.c

@ -73,6 +73,7 @@ void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer);
VOID DoNetromConnect(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest, BOOL Spy, int Service);
VOID sendAlltoOneNeigbour(struct ROUTE * Route);
VOID CMDSTREAMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);
char * FormatIP(uint32_t Addr);
extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer);
@ -263,8 +264,8 @@ char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char
Paclen = 255;
va_start(arglist, format);
MsgLen = vsprintf(Mess, format, arglist);
va_end(arglist);
OldLen = (int)(Bufferptr - (char *)REPLYBUFFER->L2DATA);
@ -849,10 +850,10 @@ BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySess
ApplNum = 1;
while (APPLMASK && (APPLMASK & 1) == 0)
while (Mask && (Mask & 1) == 0)
{
ApplNum++;
APPLMASK >>= 1;
Mask >>= 1;
}
HOSTSESS->HOSTAPPLNUM = ApplNum;
@ -3292,6 +3293,17 @@ VOID LINKCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
}
const char SwVers[12][23] = {
"Unknown", "BPQ16 (DOS)", "XRouter16 (DOS)", "XServ16 (DOS)",
"XRouter32 (Win GUI)",
"XR32 (Win TUI)",
"XS32 (Win TUI BBS)", "XRLin (Linux x86)",
"XRouter (Raspberry Pi)",
"BPQ32 (Windows)", "BPQ32 (Linux)"
};
char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest)
{
char Normcall[10];
@ -3300,6 +3312,8 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
struct INP3_DEST_ROUTE_ENTRY * Route;
struct ROUTE * Neighbour;
int i, Active, len;
time_t Now = time(NULL);
struct tm * TM;
Alias[6] = 0;
@ -3308,15 +3322,67 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
Normcall[ConvFromAX25(Dest->DEST_CALL, Normcall)] = 0;
Bufferptr = Cmdprintf(Session, Bufferptr, "Routes to: %s:%s", Alias, Normcall);
if (Dest->XROptions)
{
XROptions * Options = Dest->XROptions;
Bufferptr = Cmdprintf(Session, Bufferptr, "Nodes:\rInfo for: %s:%s [%s] ", Alias, Normcall, SwVers[Options->SWType]);
if (Options->Ver)
Bufferptr = Cmdprintf(Session, Bufferptr, "v%s ", Options->Ver);
if (Dest->DEST_COUNT)
Bufferptr = Cmdprintf(Session, Bufferptr, " RTT=%4.2f FR=%d %c %.1d",
Dest->DEST_RTT /1000.0, Dest->DEST_COUNT, (Dest->DEST_STATE & 0x40)? 'B':' ', (Dest->DEST_STATE & 63));
if (Dest->DEST_COUNT)
Bufferptr = Cmdprintf(Session, Bufferptr, " RTT=%4.2f FR=%d %c %.1d\r",
Dest->DEST_RTT /1000.0, Dest->DEST_COUNT,
(Dest->DEST_STATE & 0x40)? 'B':' ', (Dest->DEST_STATE & 63));
else
Bufferptr = Cmdprintf(Session, Bufferptr, "\r");
if (Options->Lat)
{
if (Options->Lat > 0)
Bufferptr = Cmdprintf(Session, Bufferptr, "Pos=%3.4fN ", Options->Lat);
else
Bufferptr = Cmdprintf(Session, Bufferptr, "Pos=%3.4fS ", -Options->Lat);
if (Options->Lon > 0)
Bufferptr = Cmdprintf(Session, Bufferptr, "%3.4fE ", Options->Lon);
else
Bufferptr = Cmdprintf(Session, Bufferptr, "%3.4fW ", -Options->Lon);
}
if (Options->LOC)
Bufferptr = Cmdprintf(Session, Bufferptr, "Loc=%s ", Options->LOC);
if (Options->QTH)
Bufferptr = Cmdprintf(Session, Bufferptr, "Qth=%s", Options->QTH);
if (Options->IPADDR)
Bufferptr = Cmdprintf(Session, Bufferptr, "\rIP=%s/%d", FormatIP(Options->IPADDR), Options->Mask);
Bufferptr = Cmdprintf(Session, Bufferptr, "\r\rRoutes:\r");
/*
G7TAJ-1:TANK2} Nodes:
Info for: XRLN64:G8PZT-1 (HOST) [XRLin]
Pos=50.1458N 5.1250W Loc=IO70KD Qth=LAMANVA
IP=44.135.49.90/32 v505i OFF
Supports: INP3 L3ROUT NRR NCMP L4X NDP
BBS XRCHAT
Updated: 09/07 06:07
*/
}
else
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Routes to: %s:%s", Alias, Normcall);
if (Dest->DEST_COUNT)
Bufferptr = Cmdprintf(Session, Bufferptr, " RTT=%4.2f FR=%d %c %.1d\r",
Dest->DEST_RTT /1000.0, Dest->DEST_COUNT,
(Dest->DEST_STATE & 0x40)? 'B':' ', (Dest->DEST_STATE & 63));
else
Bufferptr = Cmdprintf(Session, Bufferptr, "\r");
}
NRRoute = &Dest->NRROUTE[0];
Active = Dest->DEST_ROUTE;
@ -3349,12 +3415,18 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
if (Neighbour)
{
double srtt = Route->STT/100.0;
TM = gmtime(&Route->LastRefreshed);
// TM->tm_yday, , TM->tm_sec, MH->MHFreq, LOC);
len = ConvFromAX25(Neighbour->NEIGHBOUR_CALL, Normcall);
Normcall[len] = 0;
Bufferptr = Cmdprintf(Session, Bufferptr, "%c %d %4.2fs %d %s\r",
(Active == i + 3)?'>':' ',Route->Hops, srtt, Neighbour->NEIGHBOUR_PORT, Normcall);
Bufferptr = Cmdprintf(Session, Bufferptr, "%c %d %4.2fs %d %s %02d:%02d\r",
(Active == i + 3)?'>':' ',Route->Hops, srtt, Neighbour->NEIGHBOUR_PORT, Normcall, TM->tm_hour, TM->tm_min);
}
Route++;
}

Binary file not shown.

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

@ -0,0 +1,8 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>

Binary file not shown.

@ -0,0 +1 @@
Manifest resource last updated at 13:39:54.21 on 22/06/2026

Binary file not shown.

Binary file not shown.

@ -752,7 +752,7 @@ void APIL2Trace(struct _MESSAGE * Message, char * Dirn)
int NR;
struct PORTCONTROL * PORT = GetPortTableEntryFromPortNum(Message->PORT);
time_t Now = time(NULL);
#ifdef LINBPQ
#ifndef WIN32
struct timespec ts;
#else
FILETIME SystemTimeAsFileTime;
@ -782,7 +782,7 @@ void APIL2Trace(struct _MESSAGE * Message, char * Dirn)
if ((Message->ORIGIN[6] & 1) == 0) // Digis - ignore for now
return;
#ifdef LINBPQ
#ifndef WIN32
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
NowMs = Now;

@ -480,7 +480,7 @@ VOID PollSession(struct HTTPConnectionInfo * Session)
// Make sure line isn't too long
// but beware of spaces expanded to &nbsp; - count chars in line
if ((realLen) > 100)
if ((realLen) > 250)
{
strcpy(ptr2, "<br>\r\n");
@ -701,7 +701,7 @@ void ProcessTermInput(SOCKET sock, char * MsgPtr, int MsgLen, char * Key)
int State;
struct HTTPConnectionInfo * Session = FindSession(Key);
int Stream;
int maxlen = 1000;
int maxlen = 2000;
if (Session == NULL)
@ -1818,8 +1818,10 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Cache-Control: no-cache\r\n"
"%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
@ -2643,7 +2645,7 @@ doHeader:
{
// Save Config File
if (conn->LOCALAuth)
if (conn->LOCALAuth || COOKIE)
SaveConfigFile(sock, MsgPtr, Key, LOCAL);
else
{

@ -125,6 +125,10 @@ time_t RunningConnectScript = 0;
struct HistoryRec * History = NULL;
int HistoryCount = 0;
static FILE * LogHandle[4] = {NULL, NULL, NULL, NULL};
static time_t LastLogTime[4] = {0, 0, 0, 0};
typedef int (WINAPI FAR *FARPROCX)();
extern FARPROCX pRunEventProgram;
@ -299,6 +303,7 @@ VOID __cdecl nprintf(ChatCIRCUIT * conn, const char * format, ...)
va_start(arglist, format);
vsnprintf(buff, sizeof(buff), format, arglist);
va_end(arglist);
nputs(conn, buff);
}
@ -332,8 +337,9 @@ int ChatQueueMsg(ChatCIRCUIT * conn, char * msg, int len)
conn->u.link->lastMsgReceived = time(NULL);
// UCHAR * OutputQueue; // Messages to user
// int OutputQueueLength; // Total Malloc'ed size. Also Put Pointer for next Message
// int OutputGetPointer; // Next byte to send. When Getpointer = Queue Length all is sent - free the buffer and start again.
// int OutputQueueSize; // Total Malloc'ed size
// int OutputQueueLength; // Bytes queued. Also Put Pointer for next Message
// int OutputGetPointer; // Next byte to send. When Getpointer = QueueLength all is sent - free the buffer and start again.
// Create or extend buffer
@ -819,7 +825,7 @@ VOID ProcessChatLine(ChatCIRCUIT * conn, struct UserInfo * user, char* OrigBuffe
while (ptr)
{
nprintf(conn, ptr->Message);
nputs(conn, ptr->Message);
ptr = ptr->next;
}
@ -3290,6 +3296,7 @@ VOID ChatTimer()
int i = 0;
ChatCIRCUIT *c;
int n;
#ifndef LINBPQ
int len;
@ -3477,6 +3484,22 @@ VOID ChatTimer()
node_keepalive();
}
// Flush logs
for (n = 0; n < 4; n++)
{
if (LogHandle[n])
{
time_t LT = time(NULL);
if ((LT - LastLogTime[n]) > 30)
{
LastLogTime[n] = LT;
fclose(LogHandle[n]);
LogHandle[n] = NULL;
}
}
}
FreeSemaphore(&ChatSemaphore);
if (NeedINFO)
@ -4430,15 +4453,6 @@ VOID SendChatReport(SOCKET ChatReportSocket, char * buff, int txlen)
#endif
#ifndef WIN32
#define INVALID_HANDLE_VALUE (void *)-1
#endif
static FILE * LogHandle[4] = {INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE};
static time_t LastLogTime[4] = {0, 0, 0, 0};
static char FilesNames[4][100] = {"", "", "", ""};
static char * Logs[4] = {"BBS", "CHAT", "TCP", "DEBUG"};
@ -4479,7 +4493,7 @@ void ChatWriteLogLine(ChatCIRCUIT * conn, int Flag, char * Msg, int MsgLen, int
char CRLF[2] = {0x0d,0x0a};
struct tm * tm;
char Stamp[20];
time_t T;
time_t LT;
#ifndef LINBPQ
@ -4516,12 +4530,12 @@ void ChatWriteLogLine(ChatCIRCUIT * conn, int Flag, char * Msg, int MsgLen, int
if (Flags == LOG_CHAT && !LogCHAT)
return;
if (LogHandle[Flags] == INVALID_HANDLE_VALUE) ChatOpenLogfile(Flags);
if (LogHandle[Flags] == NULL) ChatOpenLogfile(Flags);
if (LogHandle[Flags] == INVALID_HANDLE_VALUE) return;
if (LogHandle[Flags] == NULL) return;
T = time(NULL);
tm = gmtime(&T);
LT = time(NULL);
tm = gmtime(&LT);
sprintf(Stamp,"%02d%02d%02d %02d:%02d:%02d %c",
tm->tm_year-100, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, Flag);
@ -4544,8 +4558,14 @@ void ChatWriteLogLine(ChatCIRCUIT * conn, int Flag, char * Msg, int MsgLen, int
else
fwrite(CRLF, 1, 2, LogHandle[Flags]);
fclose(LogHandle[Flags]);
LogHandle[Flags] = INVALID_HANDLE_VALUE;
// Don't close/reopen logs every time
if ((LT - LastLogTime[Flags]) > 30)
{
LastLogTime[Flags] = LT;
fclose(LogHandle[Flags]);
LogHandle[Flags] = NULL;
}
}

@ -283,6 +283,8 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
}
}
BPQTRACE(Buffer, TRUE); // TRACE - RX frames to APRS
if (PORT->PORTMHEARD)
@ -293,6 +295,14 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
InOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN;
// Check Exclude List
if (CheckExcludeList(Buffer->ORIGIN) == 0)
{
ReleaseBuffer(Buffer);
return;
}
// CHECK THAT ALL DIGIS HAVE BEEN ACTIONED,
// AND ADJUST FOR DIGIPEATERS IF PRESENT

@ -1370,6 +1370,27 @@ VOID REMOVENODE(dest_list * DEST)
}
L4++;
}
if (DEST->XROptions)
{
XROptions * Options = DEST->XROptions;
if (Options->LOC)
free(Options->LOC);
if (Options->QTH)
free(Options->QTH);
if (Options->Ver)
free(Options->Ver);
if (Options->Optionslist)
free(Options->Optionslist);
free(DEST->XROptions);
}
memset(DEST, 0, sizeof(struct DEST_LIST));
NUMBEROFNODES--;

@ -74,6 +74,7 @@ void IncomingL4ConnectionEvent(TRANSPORTENTRY * L4);
void L4DisconnectEvent(TRANSPORTENTRY * L4, char * Direction, char * Reason);
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
void L4StatusSeport(TRANSPORTENTRY * L4);
void ProcessNCMPMsg(L3MESSAGEBUFFER * L3MSG);
static UINT APPLMASK;
@ -2172,6 +2173,12 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
return;
}
if (L3MSG->L4ID == 0x00 && L3MSG->L4INDEX == 0x0f) // Paula's NCMP
{
ProcessNCMPMsg(L3MSG);
return;
}
ReleaseBuffer(L3MSG);
return;
@ -2820,3 +2827,46 @@ int CloseAllSessions()
}
return Closed;
}
// NCMP Code
/*
|<--------------- NCMP Header ------------->
| --------------------------------------------------------------
| L3hdr | Fam | Prot | Type | Code | 00 | (options) | (Payload)
|--------------------------------------------------------------
Field Bytes Description-------------------------------------------------------
L3hdr 15 NET/ROM Layer 3 Header
Fam 1 Protocol Family = NET/ROM = 0x0f
Prot 1 Protocol = NCMP = 0x00
Type 1 Type of NCMP packet (see below)
Code 1 Usage depends on "type".
Options var Additional fields present in some types only
Payload var Optional payload present in some types only
The upper 4 bits of the TYPE are reserved for future expansion, and
are set to zero in this version. The lower 4 bits are the packet type
as follows:
Type Purpose
-----------------------------------
0 Probe Request
1 Probe Reply
2 Echo Request
3 Echo Reply
4 Routing Information Unicast
5 Destination Unreachable
*/
void ProcessNCMPMsg(L3MESSAGEBUFFER * L3MSG)
{
switch(L3MSG->L4TXNO & 15)
{
case 0:
break;
}
ReleaseBuffer(L3MSG);
return;
}

@ -161,6 +161,7 @@ VOID __cdecl sockprintf(SocketConn * sockptr, const char * format, ...)
va_start(arglist, format);
vsprintf(buff, format, arglist);
va_end(arglist);
SendSock(sockptr, buff);
}

@ -66,8 +66,8 @@ extern SOCKET NodeAPISocket;
struct NRTCPMsg
{
short Length;
char Call[10];
short Length; // Including header
char Call[10]; // of sending Node
unsigned char PID;
char Packet[1024];
};

@ -122,6 +122,7 @@ VOID __cdecl NNTPsockprintf(SocketConn * sockptr, const char * format, ...)
va_start(arglist, format);
vsprintf(buff, format, arglist);
va_end(arglist);
NNTPSendSock(sockptr, buff);
}

@ -965,7 +965,7 @@ int main(int argc, char * argv[])
restartTime = time(NULL) + 120; // Restart in 2 mins
}
HostEnt2 = gethostbyname ("10.8.0.38");
HostEnt2 = gethostbyname ("192.168.193.142");
if (HostEnt2)
memcpy(&txaddr2.sin_addr.s_addr,HostEnt2->h_addr,4);
@ -1043,6 +1043,8 @@ int main(int argc, char * argv[])
continue;
ret = sendto(sock, RXBUFFER, nLength, 0, (struct sockaddr *)&txaddr, sizeof(txaddr));
// ret = sendto(sock, RXBUFFER, nLength, 0, (struct sockaddr *)&txaddr2, sizeof(txaddr2));
if (ret == -1)
perror("sendto 1");
@ -1718,7 +1720,7 @@ void GenerateOutputFiles(time_t Now)
if (Node->Lat != 0.0 && Node->Lon != 0.0 && Node->LastHeard == 0)
Colour = 'B';
else
Colour ='0';
continue; //Colour ='0';
}
HeardString[0] = 0;

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

@ -0,0 +1,8 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1 @@
Manifest resource last updated at 16:03:43.43 on 18/06/2026

Binary file not shown.

Binary file not shown.

@ -0,0 +1,11 @@
// Keps.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

Binary file not shown.

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Keps", "Keps.vcproj", "{A445DECF-B1C0-48A3-9227-E0A0C66EB0F5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A445DECF-B1C0-48A3-9227-E0A0C66EB0F5}.Debug|Win32.ActiveCfg = Debug|Win32
{A445DECF-B1C0-48A3-9227-E0A0C66EB0F5}.Debug|Win32.Build.0 = Debug|Win32
{A445DECF-B1C0-48A3-9227-E0A0C66EB0F5}.Release|Win32.ActiveCfg = Release|Win32
{A445DECF-B1C0-48A3-9227-E0A0C66EB0F5}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

@ -0,0 +1,212 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="Keps"
ProjectGUID="{A445DECF-B1C0-48A3-9227-E0A0C66EB0F5}"
RootNamespace="Keps"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel32.lib $(NoInherit)"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel32.lib $(NoInherit)"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\keps.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
CompileAs="2"
/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
<File
RelativePath=".\ReadMe.txt"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

@ -0,0 +1,33 @@
========================================================================
CONSOLE APPLICATION : Keps Project Overview
========================================================================
AppWizard has created this Keps application for you.
This file contains a summary of what you will find in each of the files that
make up your Keps application.
Keps.vcproj
This is the main project file for VC++ projects generated using an Application Wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
Application Wizard.
Keps.cpp
This is the main application source file.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named Keps.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" comments to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////

@ -0,0 +1,493 @@
/*
* SATPG.C
*
* Compile:
* gcc satpg.c -o satpg -lm
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <time.h>
#define MAXSATS 256
#define MAXNAME 64
#define KEPFILE "d:\keps.txt"
typedef struct
{
char name[MAXNAME];
char l1[128];
char l2[128];
double inc;
double mm;
} SAT;
SAT sats[MAXSATS];
int satcount = 0;
/* ------------------------------------------------ */
void trim(char *s)
{
int l = strlen(s);
while(l > 0 &&
(s[l-1] == '\n' || s[l-1] == '\r'))
{
s[l-1] = 0;
l--;
}
}
/* ------------------------------------------------ */
void load_tles(void)
{
FILE *fp;
char name[256];
char l1[256];
char l2[256];
int i;
int dup;
fp = fopen(KEPFILE, "r");
if(!fp)
{
printf("Cannot open %s\n", KEPFILE);
exit(127);
return;
}
while(fgets(name, sizeof(name), fp))
{
trim(name);
/*
* Skip blank lines
*/
if(strlen(name) < 1)
continue;
/*
* Ignore lines beginning with:
* 1
* 2
* #
*/
if(name[0] == '1' ||
name[0] == '2' ||
name[0] == '#')
continue;
/*
* Try reading TLE pair
*/
if(!fgets(l1, sizeof(l1), fp))
break;
if(!fgets(l2, sizeof(l2), fp))
break;
trim(l1);
trim(l2);
/*
* Validate TLE lines
*/
if(strncmp(l1, "1 ", 2) != 0)
continue;
if(strncmp(l2, "2 ", 2) != 0)
continue;
/*
* Duplicate filter
*/
dup = 0;
for(i=0;i<satcount;i++)
{
if(stricmp(name,
sats[i].name) == 0)
{
dup = 1;
break;
}
}
if(dup)
continue;
/*
* Store
*/
strncpy(sats[satcount].name,
name,
MAXNAME-1);
strcpy(sats[satcount].l1, l1);
strcpy(sats[satcount].l2, l2);
sscanf(l2,
"2 %*d %lf %*f %*s %*f %*f %lf",
&sats[satcount].inc,
&sats[satcount].mm);
satcount++;
if(satcount >= MAXSATS)
break;
}
fclose(fp);
}
/* ------------------------------------------------ */
char *az_to_text(double az)
{
if(az < 22.5) return "N";
if(az < 67.5) return "NE";
if(az < 112.5) return "E";
if(az < 157.5) return "SE";
if(az < 202.5) return "S";
if(az < 247.5) return "SW";
if(az < 292.5) return "W";
if(az < 337.5) return "NW";
return "N";
}
#include <math.h>
#define DEG2RAD (M_PI / 180.0)
#define RAD2DEG (180.0 / M_PI)
/*
* Observer location
* Mitcham UK example
*/
#define OBS_LAT 51.40
#define OBS_LON -0.16
/*
* Earth / GEO constants
*/
#define EARTH_RADIUS 6378.137
#define GEO_RADIUS 42164.0
/*
* Extract sub-satellite longitude
*
* For GEO satellites:
* longitude ≈ RAAN + Mean Anomaly
*/
double get_geo_longitude(SAT *s)
{
double raan;
double mean_anom;
double lon;
/*
* TLE line 2 fields:
*
* 2 NNNNN INC RAAN ECC ARGP MA MM
*/
sscanf(s->l2,
"2 %*d %*lf %lf %*s %*lf %lf",
&raan,
&mean_anom);
lon = raan + mean_anom;
while(lon > 180.0)
lon -= 360.0;
while(lon < -180.0)
lon += 360.0;
return lon;
}
/*
* Real GEO az/el calculation
*/
void fake_track(SAT *s,
double *az,
double *el,
double *rng)
{
double sat_lon = get_geo_longitude(s);
double obs_lat = OBS_LAT * DEG2RAD;
double obs_lon = OBS_LON * DEG2RAD;
double sat_lon_rad = sat_lon * DEG2RAD;
/*
* GEO satellite position
*/
double xs = GEO_RADIUS * cos(sat_lon_rad);
double ys = GEO_RADIUS * sin(sat_lon_rad);
double zs = 0.0;
/*
* Observer position
*/
double xo = EARTH_RADIUS *
cos(obs_lat) *
cos(obs_lon);
double yo = EARTH_RADIUS *
cos(obs_lat) *
sin(obs_lon);
double zo = EARTH_RADIUS *
sin(obs_lat);
/*
* Vector observer -> satellite
*/
double dx = xs - xo;
double dy = ys - yo;
double dz = zs - zo;
*rng = sqrt(dx*dx + dy*dy + dz*dz);
/*
* ENU conversion
*/
double east =
-sin(obs_lon)*dx +
cos(obs_lon)*dy;
double north =
-sin(obs_lat)*cos(obs_lon)*dx
-sin(obs_lat)*sin(obs_lon)*dy
+cos(obs_lat)*dz;
double up =
cos(obs_lat)*cos(obs_lon)*dx
+cos(obs_lat)*sin(obs_lon)*dy
+sin(obs_lat)*dz;
*az = atan2(east, north) * RAD2DEG;
if(*az < 0)
*az += 360.0;
*el = atan2(up,
sqrt(east*east + north*north))
* RAD2DEG;
}
void draw_plot(double az, double el)
{
char g[9][34];
int r,c;
int x,y;
for(r=0;r<9;r++)
{
for(c=0;c<33;c++)
g[r][c] = ' ';
g[r][33] = 0;
}
strcpy(g[0], " N");
strcpy(g[4], "W --------------+-------------- E");
strcpy(g[8], " S");
double radius = (90.0 - el) / 90.0;
double ang = (az - 90.0) * M_PI / 180.0;
x = 16 + (int)(radius * 12 * cos(ang));
y = 4 + (int)(radius * 4 * sin(ang));
if(x >=0 && x < 33 && y >=0 && y < 9)
g[y][x] = '*';
putchar('\r');
putchar('\n');
for(r=0;r<9;r++)
printf("%s\r\n", g[r]);
putchar('\r');
putchar('\n');
}
/* ------------------------------------------------ */
void show_sat(SAT *s)
{
double az,el,rng;
fake_track(s, &az, &el, &rng);
if(el > 0)
printf("%s GOOD\r\n", s->name);
else
printf("%s NOT VISIBLE\r\n", s->name);
printf("AZ %.0f (%s)\r\n",
az,
az_to_text(az));
if(el > 0)
printf("EL %.0f deg\r\n", el);
else
printf("EL BELOW HORIZON\r\n");
printf("RNG %.0f km\r\n", rng);
putchar('\r');
putchar('\n');
if(el > 0)
{
printf("Aim antenna: %s ",
az_to_text(az));
if(el < 15)
printf("low.\r\n");
else if(el < 45)
printf("mid sky.\r\n");
else
printf("high.\r\n");
}
else
{
printf("Satellite below horizon.\r\n");
}
draw_plot(az, el);
if(s->inc > 95 && s->inc < 100)
printf("Sun-synchronous polar LEO\r\n");
printf("%.2f orbits/day\r\n", s->mm);
}
/* ------------------------------------------------ */
SAT *find_sat(char *s)
{
int i;
for(i=0;i<satcount;i++)
{
if(stricmp(s, sats[i].name) == 0)
return &sats[i];
if(atoi(s) == (i+1))
return &sats[i];
}
return NULL;
}
/* ------------------------------------------------ */
int main(int argc, char **argv)
{
int level;
int i;
load_tles();
if(argc < 3)
{
printf("Bad PG invocation\r\n");
return 0;
}
level = atoi(argv[2]);
/*
* FIRST INVOCATION
*/
if(level == 0)
{
printf("Satellite tracker\r\n");
printf("-----------------\r\n\r\n");
for(i=0;i<satcount;i++)
{
printf("%2d: %s\r\n",
i+1,
sats[i].name);
}
printf("\r\n");
printf("Enter sat number or name (0=Exit):\r\n");
return 1;
}
/*
* SECOND + INVOCATION
*/
if(argc < 6)
{
printf("No satellite specified.\r\n");
return 0;
}
if(atoi(argv[5])==0 && strlen(argv[5])==1 )
{
printf("Bye!\r\n");
return 0;
}
SAT *s = find_sat(argv[5]);
if(!s)
{
printf("Satellite not found.\r\n");
printf("\r\nEnter sat number or name (0=Exit):\r\n");
return 1;
}
putchar('\r');
putchar('\n');
show_sat(s);
printf("\r\nEnter sat number or name (0=Exit):\r\n");
return 1;
}

File diff suppressed because it is too large Load Diff

@ -10,15 +10,15 @@
#endif
#define KVers 6,0,25,30
#define KVerstring "6.0.25.30\0"
#define KVers 6,0,25,32
#define KVerstring "6.0.25.32\0"
#ifdef CKernel
#define Vers KVers
#define Verstring KVerstring
#define Datestring "April 2026"
#define Datestring "July 2026"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2026 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"

@ -237,7 +237,9 @@ typedef struct ROUTE
int ConnectionAttempts;
int Status; //
int OldBPQ; // Set if other end is BPQ sending RIF in mS
int mSRIF; // Set if other end is BPQ sending RIF in mS (Ver < 2)
int senderaddsRTT; // Set if link RTT added before sending (Ver = 1)
int timeoutRoutes; // Set if other end always sends timed RIF updates (Hourly)
int LastRTT; // Last Value Reported
int RTT; // Current
int SRTT; // Smoothed RTT
@ -481,21 +483,45 @@ typedef struct _APPLCALLS
// We treat the Routes as an array of 6. First 3 are NODES routes, next 3 are INP3 Routes. This works, but maybe is not ideal
typedef struct NR_DEST_ROUTE_ENTRY
struct NR_DEST_ROUTE_ENTRY
{
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
UCHAR ROUT_QUALITY; // QUALITY
UCHAR ROUT_OBSCOUNT;
UCHAR ROUT_LOCKED;
} *PNR_DEST_ROUTE_ENTRY;
time_t padding; //
uint8_t ROUT_QUALITY; // QUALITY
uint8_t ROUT_OBSCOUNT;
uint8_t ROUT_LOCKED;
};
typedef struct INP3_DEST_ROUTE_ENTRY
struct INP3_DEST_ROUTE_ENTRY
{
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
USHORT STT; // Current time to dest from here (was called RTT but is one way not round trip.
time_t LastRefreshed;
uint16_t STT; // Current time to dest from here (was called RTT but is one way not round trip.
// Is actually a smoothed value as is calculated from smoothed link times)
UCHAR Hops;
} *PDEST_ROUTE_ENTRY;
uint8_t Hops;
};
// Extended XR options for XROUTER
typedef struct
{
uint32_t IPADDR;
uint8_t Mask;
double Lat;
double Lon;
time_t Time;
uint16_t Port;
int16_t TZOffset;
char * LOC;
char * QTH;
char * Ver;
uint8_t SWType;
uint8_t NetworkFlags;
uint8_t ApplFlags;
uint8_t * Optionslist; // raw options as last received for relay
} XROptions;
typedef struct DEST_LIST
{
@ -520,6 +546,7 @@ typedef struct DEST_LIST
int DEST_RTT; // SMOOTHED ROUND TRIP TIMER
int DEST_COUNT; // FRAMES SENT
USHORT LastTT; // Last INP3 Value sent. This is our value, which we now send
XROptions * XROptions;
} dest_list;

@ -70,12 +70,16 @@
// Allow /History to be shortened to /Hi (45)
// Fix extra r charater in Chat Config Web Page
//.25
//.24
// Increase size of status display buffers (7)
// Allow sending BEL (CTRL/G) (79)
// Fix sending BEL (CTRL/G) (81)
// .25
// Only flush logs every 30 secs (25.31)
#include "BPQChat.h"
#include "Dbghelp.h"

@ -883,7 +883,6 @@ struct MSESSION
int Index; // Line in Display
};
VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...);
char * strlop(char * buf, char delim);
int rt_cmd(CIRCUIT *circuit, char * Buffer);
CIRCUIT *circuit_new(CIRCUIT *circuit, int flags);

@ -900,7 +900,8 @@ BOOL Start()
MONTOFILEFLAG = cfg->C_MONTOFILE;
RIFInterval = cfg->C_RIFInterval;
if (cfg->C_RIFInterval)
RIFInterval = cfg->C_RIFInterval;
if (cfg->C_OnlyVer2point0)
SUPPORT2point2 = 0;

@ -192,6 +192,8 @@ VOID Consoleprintf(const char * format, ...)
va_start(arglist, format);
vsprintf(Mess, format, arglist);
va_end(arglist);
strcat(Mess, "\n");
WritetoConsoleLocal(Mess);

@ -971,6 +971,10 @@ void SendBBSDataToPktMapThread(void * Param)
// Get Routing
MsgBytes = ReadMessageFile(Msg->number);
if (MsgBytes == NULL)
continue;
RLines = malloc(Msg->length * 2); // Very unlikely to need so much but better safe..
strcpy(RLines, "[]");

Loading…
Cancel
Save

Powered by TurnKey Linux.