diff --git a/BPQChat.vcproj.LAPTOP-Q6S4RP5Q.johnw.user b/BPQChat.vcproj.LAPTOP-Q6S4RP5Q.johnw.user new file mode 100644 index 0000000..0cd9a72 --- /dev/null +++ b/BPQChat.vcproj.LAPTOP-Q6S4RP5Q.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/BPQChat.vcproj.SKIGACER.johnw.user b/BPQChat.vcproj.SKIGACER.johnw.user new file mode 100644 index 0000000..b5b0536 --- /dev/null +++ b/BPQChat.vcproj.SKIGACER.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/BPQMail.vcproj.NOTTSDESKTOP.John.user b/BPQMail.vcproj.NOTTSDESKTOP.John.user new file mode 100644 index 0000000..fa82c00 --- /dev/null +++ b/BPQMail.vcproj.NOTTSDESKTOP.John.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/BPQTermMDI.c b/BPQTermMDI.c index d07eb39..447cde3 100644 --- a/BPQTermMDI.c +++ b/BPQTermMDI.c @@ -4817,6 +4817,7 @@ BOOL CreateMonitorWindow(char * MonSize) Cinfo->hConsole = ChildWnd; // return if its not possible to create the child window + if(NULL == ChildWnd) { return 0; @@ -4839,8 +4840,8 @@ BOOL CreateMonitorWindow(char * MonSize) Cinfo = &MonWindow; -// MoveWindow(Cinfo->hConsole, Rect.left - (OffsetW /2), Rect.top - OffsetH, -// Rect.right-Rect.left, Rect.bottom-Rect.top, TRUE); + MoveWindow(ChildWnd, Rect.left - (OffsetW /2), Rect.top - OffsetH, Rect.right - Rect.left, Rect.bottom - Rect.top, TRUE); + MoveWindows(Cinfo); diff --git a/BPQWinAPP.vcproj.LAPTOP-Q6S4RP5Q.johnw.user b/BPQWinAPP.vcproj.LAPTOP-Q6S4RP5Q.johnw.user new file mode 100644 index 0000000..0cd9a72 --- /dev/null +++ b/BPQWinAPP.vcproj.LAPTOP-Q6S4RP5Q.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/Bpq32.c b/Bpq32.c index c7b939c..ea24778 100644 --- a/Bpq32.c +++ b/Bpq32.c @@ -1211,6 +1211,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses // Fix possible crash in SCSPactor PTCPORT code (29) // Add NodeAPI call sendLinks and remove get from other calls (32) // Improve validation of Web Beacon Config (33) +// Support SNMP via host ip stack as well as IPGateway (34) #define CKernel @@ -6477,7 +6478,7 @@ VOID SaveBPQ32Windows() SaveMDIWindowPos(StatusWnd, "", "StatusWindowSize", StatusMinimized); SaveMDIWindowPos(hConsWnd, "", "WindowSize", ConsoleMinimized); - for (i=0;iPORTCONTROL.PORTTYPE == 0x10) // External { diff --git a/CBPQ32.vcproj.LAPTOP-Q6S4RP5Q.johnw.user b/CBPQ32.vcproj.LAPTOP-Q6S4RP5Q.johnw.user new file mode 100644 index 0000000..ddedde2 --- /dev/null +++ b/CBPQ32.vcproj.LAPTOP-Q6S4RP5Q.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/CBPQ32.vcproj.NOTTSDESKTOP.John-notpi4-64.user b/CBPQ32.vcproj.NOTTSDESKTOP.John-notpi4-64.user new file mode 100644 index 0000000..f4ba73a --- /dev/null +++ b/CBPQ32.vcproj.NOTTSDESKTOP.John-notpi4-64.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/CBPQ32.vcproj.NOTTSDESKTOP.John.user b/CBPQ32.vcproj.NOTTSDESKTOP.John.user new file mode 100644 index 0000000..f4ba73a --- /dev/null +++ b/CBPQ32.vcproj.NOTTSDESKTOP.John.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/CBPQ32.vcproj.SKIGACER.johnw-notpi4-64.user b/CBPQ32.vcproj.SKIGACER.johnw-notpi4-64.user new file mode 100644 index 0000000..03fb73a --- /dev/null +++ b/CBPQ32.vcproj.SKIGACER.johnw-notpi4-64.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/CBPQ32.vcproj.SKIGACER.johnw.user b/CBPQ32.vcproj.SKIGACER.johnw.user new file mode 100644 index 0000000..03fb73a --- /dev/null +++ b/CBPQ32.vcproj.SKIGACER.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/CHeaders.h b/CHeaders.h index caf288b..163cab5 100644 --- a/CHeaders.h +++ b/CHeaders.h @@ -426,3 +426,5 @@ extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown extern BOOL SendFromFile[MaxBPQPortNo + 1]; + +DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz); \ No newline at end of file diff --git a/CommonCode.c b/CommonCode.c index da9b2d7..29555b8 100644 --- a/CommonCode.c +++ b/CommonCode.c @@ -4753,6 +4753,7 @@ LRESULT CALLBACK UIWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam extern struct DATAMESSAGE * REPLYBUFFER; char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...); + void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) { char FN[250]; @@ -4816,6 +4817,75 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CM Debugprintf("CTEXT Read for ports %s\r", &PortList[1]); } +// Get the current frequency for a port. This can get a bit complicated, especially if looking for centre freq +// rather than dial freq (as this depends on mode). +// +// Used for various reporting functions - MH, Maps, BBS New User message, + +// I think I'll try PORT "PortFreq" setting first then if that isn't available via rigcontrol. +// +// For now at least will report dial freq if using RIGCONTROL + +DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString) +{ + struct PORTCONTROL * PORT = GetPortTableEntryFromPortNum(PortNo); + double freq = 0.0; + uint64_t freqint = 0; + + char * ptr; + int n = 3; + + FreqString[0] = 0; + + if (PORT == 0) + return 0; + + if (PORT->PortFreq) + { + freqint = PORT->PortFreq; + freq = freqint / 1000000.0; + } + else + { + // Try rigcontrol + + + struct TNCINFO * TNC; + struct RIGINFO * RIG = 0; + int RigPort; + + if (PORT->RIGPort) + TNC = TNCInfo[PORT->RIGPort]; + else + TNC = TNCInfo[PortNo]; + + if (TNC) + RIG = TNC->RIG; + + if (RIG == 0) + return 0; + + // Frequency should be in valchar + + if (RIG->Valchar[0] == 0) + return 0; + + freq = atof(TNC->RIG->Valchar); + freqint = (int64_t)(freq * 1000000.0); + } + + sprintf(FreqString, "%.6f", freq); + + // Return 3 digits after . (KHz) unless more are significant + + ptr = &FreqString[strlen(FreqString) - 1]; + + while (n-- && *(ptr) == '0') + *ptr-- = 0; + + return freqint; +} + SOCKET OpenHTTPSock(char * Host) { SOCKET sock = 0; diff --git a/HTTPcode.c b/HTTPcode.c index 0e62928..367146d 100644 --- a/HTTPcode.c +++ b/HTTPcode.c @@ -2482,7 +2482,7 @@ doHeader: UIUIDigi[Slot] = _strdup(&Param[0]); GetParam(input, "File=", &Param[0]); - strcpy(FN[Slot], &Param[1]); + strcpy(FN[Slot], &Param[0]); GetParam(input, "Text=", &Param[0]); strcpy(Message[Slot], &Param[0]); diff --git a/IPCode.c b/IPCode.c index 7958b73..808840c 100644 --- a/IPCode.c +++ b/IPCode.c @@ -5179,33 +5179,17 @@ int BuildReply(UCHAR * Buffer, int Offset, UCHAR * OID, int OIDLen, UCHAR * Valu // snmpget -v1 -c jnos [ve4klm.ampr.org | www.langelaar.net] 1.3.6.1.2.1.2.2.1.16.5 - -VOID ProcessSNMPMessage(PIPMSG IPptr) +int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr) { - int Len; - PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data; char Community[256]; UCHAR OID[256]; int OIDLen; - UCHAR * Msg; int Type; int Length, ComLen; int IntVal; int ReqID; int RequestType; - Len = ntohs(IPptr->IPLENGTH); - Len-=20; - - Check_Checksum(UDPptr, Len); - - // 4 bytes version - // Null Terminated Community - - Msg = (char *) UDPptr; - - Msg += 8; // Over UDP Header - Len -= 8; // ASN 1 Encoding - Type, Len, Data @@ -5217,7 +5201,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) // First should be a Sequence if (Type != 0x30) - return; + return 0; Len -= 2; @@ -5228,7 +5212,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) // Should be Integer - SNMP Version - We support V1, identified by zero if (Type != 2 || Length != 1 || IntVal != 0) - return; + return 0; Len -= 3; @@ -5238,7 +5222,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) // Should Be String (community) if (Type != 4) - return; + return 0; memcpy(Community, Msg, ComLen); Community[ComLen] = 0; @@ -5264,23 +5248,23 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Length = *(Msg++); if (Type != 2) - return; + return 0; ReqID = ASNGetInt(Msg, Length); - + Len -= (2 + Length); Msg += Length; // Two more Integers - error status, error index - + Type = *(Msg++); Length = *(Msg++); if (Type != 2) - return; + return 0; ASNGetInt(Msg, Length); - + Len -= (2 + Length); Msg += Length; @@ -5288,10 +5272,10 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Length = *(Msg++); if (Type != 2) - return; + return 0; ASNGetInt(Msg, Length); - + Len -= (2 + Length); Msg += Length; @@ -5303,7 +5287,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Len -= 2; if (Type != 0x30) - return; + return 0; Type = *(Msg++); Length = *(Msg++); @@ -5311,7 +5295,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Len -= 2; if (Type != 0x30) - return; + return 0; // Next is OID @@ -5319,7 +5303,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Length = *(Msg++); if (Type != 6) // Object ID - return; + return 0; memcpy(OID, Msg, Length); OID[Length] = 0; @@ -5328,16 +5312,16 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Len -=2; // Header Len -= Length; - + Msg += Length; // Should Just have a null value left - + Type = *(Msg++); Length = *(Msg++); if (Type != 5 || Length != 0) - return; + return 0; Len -=2; // Header @@ -5346,12 +5330,11 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) if (RequestType = 160) { - UCHAR Reply[256]; int Offset = 255; - int PDULen, SendLen; + int PDULen = 0; char Value[256]; int ValLen; - + // Only Support Get if (memcmp(OID, sysName, sysNameLen) == 0) @@ -5360,7 +5343,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Value[0] = 4; // String Value[1] = ValLen; memcpy(&Value[2], MYNODECALL, ValLen); - + PDULen = BuildReply(Reply, Offset, sysName, sysNameLen, Value, ReqID); } else if (memcmp(OID, sysUpTime, sysUpTimeLen) == 0) @@ -5390,7 +5373,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) } else - return; + return 0; Offset -= PDULen; Offset -= ComLen; @@ -5408,25 +5391,59 @@ VOID ProcessSNMPMessage(PIPMSG IPptr) Reply[--Offset] = PDULen + ComLen + 5; Reply[--Offset] = 48; - SendLen = PDULen + ComLen + 7; + *OffPtr = Offset; - memcpy(UDPptr->UDPData, &Reply[Offset], SendLen); - - // Swap Dest to Origin - - IPptr->IPDEST = IPptr->IPSOURCE; - - IPptr->IPSOURCE.addr = OurIPAddr; - - UDPptr->DESTPORT = UDPptr->SOURCEPORT; - UDPptr->SOURCEPORT = htons(161); - SendLen += 8; // UDP Header - UDPptr->LENGTH = htons(SendLen); - IPptr->IPLENGTH = htons(SendLen + 20); - - CheckSumAndSendUDP(IPptr, UDPptr, SendLen); + return PDULen + ComLen + 7; } - - // Ingnore others + return 0; } +VOID ProcessSNMPMessage(PIPMSG IPptr) +{ + int Len; + PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data; + UCHAR * Msg; + int Type; + int Length, ComLen; + int IntVal; + UCHAR Reply[256]; + int PDULen, SendLen; + int Offset = 0; + + Len = ntohs(IPptr->IPLENGTH); + Len-=20; + + Check_Checksum(UDPptr, Len); + + // 4 bytes version + // Null Terminated Community + + Msg = (char *) UDPptr; + + Msg += 8; // Over UDP Header + Len -= 8; + + SendLen = ProcessSNMPPayload(Msg, Len, Reply, &Offset); + + if (SendLen == 0) + return; + + memcpy(UDPptr->UDPData, &Reply[Offset], SendLen); + + // Swap Dest to Origin + + IPptr->IPDEST = IPptr->IPSOURCE; + + IPptr->IPSOURCE.addr = OurIPAddr; + + UDPptr->DESTPORT = UDPptr->SOURCEPORT; + UDPptr->SOURCEPORT = htons(161); + SendLen += 8; // UDP Header + UDPptr->LENGTH = htons(SendLen); + IPptr->IPLENGTH = htons(SendLen + 20); + + CheckSumAndSendUDP(IPptr, UDPptr, SendLen); +} + + + diff --git a/L2Code.c b/L2Code.c index 37a8aff..718f012 100644 --- a/L2Code.c +++ b/L2Code.c @@ -470,61 +470,15 @@ VOID MHPROC(struct PORTCONTROL * PORT, MESSAGE * Buffer) PMHSTRUC MHBASE = MH; int i; int OldCount = 0; - char Freq[16] = ""; + char Freq[64] = ""; char DIGI = '*'; double ReportFreq = 0; - // if port has Rigcontrol associated with it, get frequency + // if port has a freq associated with it use it - struct TNCINFO * TNC = PORT->TNC; + GetPortFrequency(PORT->PORTNUMBER, Freq); - if (TNC && TNC->RIG && TNC->RIG->Valchar[0]) - { - if (TNC->Hardware == H_UZ7HO) - { - // See if we have Center Freq Info - if (TNC->AGWInfo->CenterFreq) - { - ReportFreq = atof(TNC->RIG->Valchar) + ((TNC->AGWInfo->CenterFreq * 1.0) / 1000000.0); - } -#ifdef WIN32 - else if (TNC->AGWInfo->hFreq) - { - char Centre[16]; - double ModemFreq; - - SendMessage(TNC->AGWInfo->hFreq, WM_GETTEXT, 15, (LPARAM)Centre); - - ModemFreq = atof(Centre); - - ReportFreq = atof(TNC->RIG->Valchar) + (ModemFreq / 1000000); - } -#endif - else - ReportFreq = atof(TNC->RIG->Valchar) + 0.0015; // Assume 1500 - } - else - - // Not UZ7HO or Linux - - ReportFreq = atof(TNC->RIG->Valchar) + 0.0015; - - _gcvt(ReportFreq, 9, Freq); - } - else - { - if (PORT->RIGPort) - { - struct TNCINFO * TNC = TNCInfo[PORT->RIGPort]; - - if (TNC && TNC->RIG) - { - strcpy(Freq, TNC->RIG->Valchar); - Freq[11] = 0; - } - } - } -// if (Buffer->ORIGIN[6] & 1) + // if (Buffer->ORIGIN[6] & 1) DIGI = 0; // DOn't think we want to do this // See if in list diff --git a/MailNode.vcproj.NOTTSDESKTOP.John.user b/MailNode.vcproj.NOTTSDESKTOP.John.user new file mode 100644 index 0000000..fa82c00 --- /dev/null +++ b/MailNode.vcproj.NOTTSDESKTOP.John.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/MailTCP.c b/MailTCP.c index 74f2727..a08632d 100644 --- a/MailTCP.c +++ b/MailTCP.c @@ -859,6 +859,11 @@ BOOL CheckforMIME(SocketConn * sockptr, char * Msg, char ** Body, int * MsgLen) int Files = 0; + if (*MsgLen > 5000000) + { + int xxx = 1; + } + ptr = Msg; while(*ptr != 13) diff --git a/TelnetV6.c b/TelnetV6.c index efec041..a80a325 100644 --- a/TelnetV6.c +++ b/TelnetV6.c @@ -85,6 +85,7 @@ void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo * void DRATSConnectionLost(struct ConnectionInfo * sockptr); int BuildRigCtlPage(char * _REPLYBUFFER); void ProcessWebmailWebSockThread(void * conn); +int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr); #ifndef LINBPQ extern HKEY REGTREE; @@ -540,6 +541,9 @@ int ProcessLine(char * buf, int Port) else if (_stricmp(param,"SYNCPORT") == 0) TCP->SyncPort = atoi(value); + else if (_stricmp(param,"SNMPPORT") == 0) + TCP->SNMPPort = atoi(value); + else if ((_stricmp(param,"CMDPORT") == 0) || (_stricmp(param,"LINUXPORT") == 0)) { int n = 0; @@ -1562,6 +1566,46 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry) return ExtProc; } +SOCKET OpenUDPSocket(struct TNCINFO * TNC) +{ + u_long param = 1; + struct sockaddr_in sinx; + int err, ret; + struct TCPINFO * TCP = TNC->TCPInfo; + char Msg[80]; + + TCP->SNMPsock = socket(AF_INET,SOCK_DGRAM,0); + + if (TCP->SNMPsock == INVALID_SOCKET) + { + WritetoConsoleLocal("Failed to create SNMP UDP socket"); + return 0; + } + + ioctl (TCP->SNMPsock, FIONBIO, ¶m); + + sinx.sin_family = AF_INET; + sinx.sin_addr.s_addr = INADDR_ANY; + + sinx.sin_port = htons(TCP->SNMPPort); + + ret = bind(TCP->SNMPsock, (struct sockaddr *) &sinx, sizeof(sinx)); + + if (ret != 0) + { + // Bind Failed + + err = WSAGetLastError(); + sprintf(Msg, "Bind Failed for SNMP UDP socket %d - error code = %d", TCP->SNMPPort, err); + WritetoConsoleLocal(Msg); + return 0; + } + + return TCP->SNMPsock; +} + + + SOCKET OpenSocket4(struct TNCINFO * xTNC, int port) { struct sockaddr_in local_sin; /* Local socket - internet style */ @@ -1658,6 +1702,9 @@ BOOL OpenSockets(struct TNCINFO * TNC) if (TCP->DRATSPort) TCP->DRATSsock = OpenSocket4(TNC, TCP->DRATSPort); + if (TCP->SNMPPort) + TCP->SNMPsock = OpenUDPSocket(TNC); + CMSUser.UserName = _strdup("CMS"); TriModeUser.Secure = TRUE; @@ -2181,6 +2228,31 @@ VOID TelnetPoll(int Port) nosocks: + // Try SNMP + + if (TCP->SNMPsock) + { + struct sockaddr_in rxaddr; + char rxbuff[500]; + int addrlen = sizeof(struct sockaddr_in); + int Offset = 0; + + int len = recvfrom(TCP->SNMPsock, rxbuff, 500, 0,(struct sockaddr *)&rxaddr, &addrlen); + + if (len > 0) + { + UCHAR Reply[256]; + int SendLen; + + SendLen = ProcessSNMPPayload(rxbuff, len, Reply, &Offset); + + if (SendLen == 0) + return; + + sendto(TCP->SNMPsock, &Reply[Offset], SendLen, 0, (struct sockaddr *)&rxaddr, addrlen); + return; + } + } while (TELNETMONVECPTR->HOSTTRACEQ) { int len; diff --git a/Versions.h b/Versions.h index b83cbbe..ebcdca1 100644 --- a/Versions.h +++ b/Versions.h @@ -10,8 +10,8 @@ #endif -#define KVers 6,0,24,33 -#define KVerstring "6.0.24.33\0" +#define KVers 6,0,24,34 +#define KVerstring "6.0.24.34\0" #ifdef CKernel diff --git a/WinmorControl.vcproj.LAPTOP-Q6S4RP5Q.johnw.user b/WinmorControl.vcproj.LAPTOP-Q6S4RP5Q.johnw.user new file mode 100644 index 0000000..0cd9a72 --- /dev/null +++ b/WinmorControl.vcproj.LAPTOP-Q6S4RP5Q.johnw.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/asmstrucs.h b/asmstrucs.h index 60f5853..1b56291 100644 --- a/asmstrucs.h +++ b/asmstrucs.h @@ -690,6 +690,7 @@ typedef struct PORTCONTROL time_t SmartIDNeeded; // Time to send next smart ID time_t SmartIDInterval; // Smart ID Interval (Secs) int SendtoM0LTEMap; + uint64_t PortFreq; // Configured freq } PORTCONTROLX, *PPORTCONTROL; diff --git a/bpq32.h b/bpq32.h index dd06288..bdc5a20 100644 --- a/bpq32.h +++ b/bpq32.h @@ -264,6 +264,8 @@ int APIENTRY CountFramesQueuedOnStream(int Stream); char * APIENTRY GetLOC(); +DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString); + #else struct PORTCONTROL * (FAR WINAPI * GetPortTableEntryFromPortNum) (int portnum); diff --git a/cMain.c b/cMain.c index 7ca9e2e..eb529f6 100644 --- a/cMain.c +++ b/cMain.c @@ -1079,6 +1079,7 @@ BOOL Start() } PORT->SendtoM0LTEMap = PortRec->SendtoM0LTEMap; + PORT->PortFreq = PortRec->PortFreq; if (PortRec->BBSFLAG) // Appl 1 not permitted - BBSFLAG=NOBBS PORT->PERMITTEDAPPLS &= 0xfffffffe; // Clear bottom bit diff --git a/config.c b/config.c index 42d85f4..74473ce 100644 --- a/config.c +++ b/config.c @@ -251,6 +251,8 @@ int tnctypes(int i,char *value,char *rec); int do_kiss(char *value,char *rec); int decode_ded_rec(char *rec); int simple(int i); +int64_t int64_value(int64_t * val, char value[], char rec[]); + int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF); int doSerialPortName(int i, char * value, char * rec); @@ -364,7 +366,7 @@ static char *pkeywords[] = "BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY", "UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE", "IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE", -"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap"}; /* parameter keywords */ +"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq"}; /* parameter keywords */ static void * poffset[] = { @@ -378,7 +380,7 @@ static void * poffset[] = &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.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide, -&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap}; /* offset for corresponding data in config file */ +&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq}; /* offset for corresponding data in config file */ static int proutine[] = { @@ -392,7 +394,7 @@ static int proutine[] = 0, 1, 2, 18, 15, 16, 2, 1, 17, 1, 1, 1, 1, 2, 2, 2, 1, 1, 19, 2, -1, 20, 1}; /* routine to process parameter */ +1, 20, 1, 21}; /* routine to process parameter */ int PPARAMLIM = sizeof(proutine)/sizeof(int); @@ -1326,6 +1328,11 @@ int int_value(short * val, char value[], char rec[]) return(1); } +int64_t int64_value(int64_t * val, char value[], char rec[]) +{ + *val = strtoll(value, NULL, 10); + return(1); +} /************************************************************************/ /* VALIDATE HEX INT VALUES */ @@ -2227,6 +2234,11 @@ int decode_port_rec(char * rec) cn = doKissCommand(i, value, rec); // Permitted Apps break; + case 21: + cn = int64_value(poffset[i], value, rec); /* INTEGER VALUES */ + break; + + case 9: diff --git a/configstructs.h b/configstructs.h index 9dae4fb..231cfd8 100644 --- a/configstructs.h +++ b/configstructs.h @@ -78,6 +78,7 @@ struct PORTCONFIG int SmartID; unsigned char * KissParams; int SendtoM0LTEMap; + uint64_t PortFreq; }; struct ROUTECONFIG diff --git a/debian/changelog b/debian/changelog index 2e597ed..14a195c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +linbpq (6.0.24.34-1) unstable; urgency=medium + + * Upstream bump + + -- Dave Hibberd Sat, 06 Apr 2024 02:15:28 +0100 + linbpq (6.0.24.33-jammy1) jammy; urgency=medium * Upstream bump diff --git a/nodeapi.c b/nodeapi.c index eef71e8..395f9f9 100644 --- a/nodeapi.c +++ b/nodeapi.c @@ -41,8 +41,9 @@ int sendNodeList(char * response, char * token,int Flags); int sendUserList(char * response, char * token,int Flags); int sendInfo(char * response, char * token, int Flags); int sendLinks(char * response, char * token, int Flags); -int sendPortMHList(char * response, char * token, int Flags); +int sendPortMHList(char * response, char * token, int param); +void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT); DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); // Token list @@ -67,17 +68,43 @@ int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * req char * token_begin = strstr(request, auth_header); char token[TOKEN_SIZE + 1]= ""; int Flags = 0; - char * Tok = strlop(URL, '?'); - char * param = strlop(Tok, '&'); - if (param) - Flags = atoi(param); + // Node Flags isn't currently used - if (Tok && strlen(Tok) == TOKEN_SIZE) + char * Tok; + char * param; + + if (token_begin) { - // assume auth token + // Using Auth Header - strcpy(token, Tok); + // Extract the token from the request (assuming it's present in the request headers) + + if (token_begin == NULL) + { + Debugprintf("Invalid request: No authentication token provided.\n"); + return send_http_response(response, "403 (Forbidden)"); + } + + token_begin += strlen(auth_header); // Move to the beginning of the token + strncpy(token, token_begin, TOKEN_SIZE); + token[TOKEN_SIZE] = '\0'; // Null-terminate the token + + param = strlop(URL, '?'); + } + else + { + // Token must be first param of URL + + Tok = strlop(URL, '?'); + param = strlop(Tok, '&'); + + if (Tok && strlen(Tok) == TOKEN_SIZE) + { + // assume auth token + + strcpy(token, Tok); + } } remove_expired_tokens(); // Tidy up @@ -123,7 +150,7 @@ int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * req else if (_stricmp(URL, "/api/links") == 0) return sendLinks(response, token, Flags); else if (strstr(URL, "/api/mheardport") != 0) - return sendPortMHList(response, token, Flags); + return sendPortMHList(response, token, atoi(param)); return send_http_response(response, "401 Invalid API Call"); } @@ -145,6 +172,7 @@ int request_token(char * response) Token * generate_token() { // Generate a random authentication token + int i; Token * token = malloc(sizeof(Token)); @@ -159,6 +187,7 @@ Token * generate_token() } // Function to add the token to the token_list + void add_token_to_list(Token* token) { if (token_list == NULL) @@ -706,9 +735,9 @@ int sendLinks(char * response, char * token, int Flags) return ReplyLen; } -int sendPortMHList(char * response, char * token, int Flags) +int sendPortMHList(char * response, char * token, int param) { - struct PORTCONTROL * PORTVEC = GetPortTableEntryFromPortNum(Flags); + struct PORTCONTROL * PORTVEC = GetPortTableEntryFromPortNum(param); response[0] = 0; diff --git a/tncinfo.h b/tncinfo.h index 9b9cb54..fa8f4c9 100644 --- a/tncinfo.h +++ b/tncinfo.h @@ -113,6 +113,7 @@ struct TCPINFO int APIPort; int TriModePort; int SyncPort; + int SNMPPort; int DRATSPort; int CMDPort[33]; char RELAYHOST[64]; @@ -165,6 +166,7 @@ struct TCPINFO SOCKET TriModeDataSock; SOCKET Syncsock; SOCKET DRATSsock; + SOCKET SNMPsock; struct ConnectionInfo * TriModeControlSession; SOCKET sock6;