New upstream version 6.0.24.59a+repack
This commit is contained in:
		
							parent
							
								
									a5c4d344cc
								
							
						
					
					
						commit
						fe39ac5788
					
				
							
								
								
									
										2
									
								
								6pack.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								6pack.c
									
									
									
									
									
								
							| 
						 | 
					@ -72,7 +72,7 @@ Using code from 6pack Linux Kernel driver with the following licence and credits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "compatbits.h"
 | 
					#include "compatbits.h"
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//#include <process.h>
 | 
					//#include <process.h>
 | 
				
			||||||
//#include <time.h>
 | 
					//#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								AGWAPI.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								AGWAPI.c
									
									
									
									
									
								
							| 
						 | 
					@ -26,7 +26,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma data_seg("_BPQDATA")
 | 
					#pragma data_seg("_BPQDATA")
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	MSGFLAG contains CMD/RESPONSE BITS
 | 
					//	MSGFLAG contains CMD/RESPONSE BITS
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
//#include "tncinfo.h"
 | 
					//#include "tncinfo.h"
 | 
				
			||||||
//#include "adif.h"
 | 
					//#include "adif.h"
 | 
				
			||||||
//#include "telnetserver.h"
 | 
					//#include "telnetserver.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE 
 | 
					#define _CRT_SECURE_NO_DEPRECATE 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
#include "kernelresource.h"
 | 
					#include "kernelresource.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										27
									
								
								ARDOP.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								ARDOP.c
									
									
									
									
									
								
							| 
						 | 
					@ -45,7 +45,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
| 
						 | 
					@ -136,6 +136,9 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
 | 
				
			||||||
	if (TNC->Streams[0].Attached)
 | 
						if (TNC->Streams[0].Attached)
 | 
				
			||||||
		TNC->Streams[0].ReportDISC = TRUE;
 | 
							TNC->Streams[0].ReportDISC = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TNC->Streams[0].Connected = 0;
 | 
				
			||||||
 | 
						TNC->Streams[0].Attached = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->TCPSock)
 | 
						if (TNC->TCPSock)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		shutdown(TNC->TCPSock, SD_BOTH);
 | 
							shutdown(TNC->TCPSock, SD_BOTH);
 | 
				
			||||||
| 
						 | 
					@ -162,6 +165,9 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
 | 
				
			||||||
	sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped");
 | 
						sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped");
 | 
				
			||||||
	MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE);
 | 
						MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(TNC->WEB_TNCSTATE, "Free");
 | 
				
			||||||
 | 
						MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -643,6 +649,12 @@ VOID ARDOPSendCommand(struct TNCINFO * TNC, char * Buff, BOOL Queue)
 | 
				
			||||||
	if (Buff[0] == 0)		// Terminal Keepalive?
 | 
						if (Buff[0] == 0)		// Terminal Keepalive?
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (memcmp(Buff, "LISTEN ", 7) == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							strcpy(TNC->WEB_MODE, &Buff[7]);
 | 
				
			||||||
 | 
							MySetWindowText(TNC->xIDC_MODE, &Buff[7]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	EncLen = sprintf(Encoded, "%s\r", Buff);
 | 
						EncLen = sprintf(Encoded, "%s\r", Buff);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// it is possible for binary data to be dumped into the command
 | 
						// it is possible for binary data to be dumped into the command
 | 
				
			||||||
| 
						 | 
					@ -1918,7 +1930,7 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
 | 
						Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
 | 
				
			||||||
	Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
 | 
						Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
 | 
				
			||||||
	Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE);
 | 
						Len += sprintf(&Buff[Len], "<tr><td>Listen</td><td>%s</td></tr>", TNC->WEB_MODE);
 | 
				
			||||||
	Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s   %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
 | 
						Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s   %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
 | 
				
			||||||
	Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
 | 
						Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
 | 
				
			||||||
	Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
 | 
						Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
 | 
				
			||||||
| 
						 | 
					@ -2134,7 +2146,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
						CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
				
			||||||
	TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
						TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CreateWindowEx(0, "STATIC", "Mode", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
						CreateWindowEx(0, "STATIC", "Listen", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
				
			||||||
	TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
						TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
	CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
						CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL);
 | 
				
			||||||
| 
						 | 
					@ -2600,6 +2612,8 @@ VOID ARDOPThread(struct TNCINFO * TNC)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Alerted = TRUE;
 | 
						TNC->Alerted = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC");		
 | 
						sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC");		
 | 
				
			||||||
	MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
 | 
						MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2679,6 +2693,10 @@ VOID ARDOPThread(struct TNCINFO * TNC)
 | 
				
			||||||
					sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost");
 | 
										sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost");
 | 
				
			||||||
					MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
 | 
										MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										strcpy(TNC->WEB_TNCSTATE, "Free");
 | 
				
			||||||
 | 
										MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					TNC->CONNECTED = FALSE;
 | 
										TNC->CONNECTED = FALSE;
 | 
				
			||||||
					TNC->Alerted = FALSE;
 | 
										TNC->Alerted = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3344,6 +3362,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
				RestartTNC(TNC);
 | 
									RestartTNC(TNC);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
 | 
				
			||||||
 | 
								MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
| 
						 | 
					@ -2219,21 +2219,21 @@ VOID ProcessUserUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// Last Listed
 | 
							ptr1 = GetNextParam(&ptr2);		// Last Listed
 | 
				
			||||||
		USER->lastmsg = atoi(ptr1);
 | 
							USER->lastmsg = atoi(ptr1);
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// Name
 | 
							ptr1 = GetNextParam(&ptr2);		// Name
 | 
				
			||||||
		strcpy(USER->Name, ptr1);
 | 
							memcpy(USER->Name, ptr1, 17);
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// Pass
 | 
							ptr1 = GetNextParam(&ptr2);		// Pass
 | 
				
			||||||
		strcpy(USER->pass, ptr1);		
 | 
							memcpy(USER->pass, ptr1, 12);		
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// CMS Pass
 | 
							ptr1 = GetNextParam(&ptr2);		// CMS Pass
 | 
				
			||||||
		if (memcmp("****************", ptr1, strlen(ptr1) != 0))
 | 
							if (memcmp("****************", ptr1, strlen(ptr1) != 0))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			strcpy(USER->CMSPass, ptr1);
 | 
								memcpy(USER->CMSPass, ptr1, 15);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// QTH
 | 
							ptr1 = GetNextParam(&ptr2);		// QTH
 | 
				
			||||||
		strcpy(USER->Address, ptr1);
 | 
							memcpy(USER->Address, ptr1, 60);
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// ZIP
 | 
							ptr1 = GetNextParam(&ptr2);		// ZIP
 | 
				
			||||||
		strcpy(USER->ZIP, ptr1);
 | 
							memcpy(USER->ZIP, ptr1, 8);
 | 
				
			||||||
		ptr1 = GetNextParam(&ptr2);		// HomeBBS
 | 
							ptr1 = GetNextParam(&ptr2);		// HomeBBS
 | 
				
			||||||
		strcpy(USER->HomeBBS, ptr1);
 | 
							memcpy(USER->HomeBBS, ptr1, 40);
 | 
				
			||||||
		_strupr(USER->HomeBBS);
 | 
							_strupr(USER->HomeBBS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SaveUserDatabase();
 | 
							SaveUserDatabase();
 | 
				
			||||||
| 
						 | 
					@ -3038,13 +3038,10 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		const char * auth_header = "Authorization: Bearer ";
 | 
							const char * auth_header = "Authorization: Bearer ";
 | 
				
			||||||
		char * token_begin = strstr(MsgPtr, auth_header);
 | 
							char * token_begin = strstr(MsgPtr, auth_header);
 | 
				
			||||||
		int Flags = 0, n;
 | 
							int Flags = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Node Flags isn't currently used
 | 
							// Node Flags isn't currently used
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		char * Tok;
 | 
					 | 
				
			||||||
		char * param;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (token_begin)
 | 
							if (token_begin)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Using Auth Header
 | 
								// Using Auth Header
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,10 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <sys/time.h>
 | 
					#include <sys/time.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL Bells;
 | 
					BOOL Bells;
 | 
				
			||||||
BOOL FlashOnBell;		// Flash instead of Beep
 | 
					BOOL FlashOnBell;		// Flash instead of Beep
 | 
				
			||||||
| 
						 | 
					@ -77,7 +81,7 @@ FARPROCX pRefreshWebMailIndex;
 | 
				
			||||||
Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall);
 | 
					Dll BOOL APIENTRY APISendAPRSMessage(char * Text, char * ToCall);
 | 
				
			||||||
VOID APIENTRY md5 (char *arg, unsigned char * checksum);
 | 
					VOID APIENTRY md5 (char *arg, unsigned char * checksum);
 | 
				
			||||||
int APIENTRY GetRaw(int stream, char * msg, int * len, int * count);
 | 
					int APIENTRY GetRaw(int stream, char * msg, int * len, int * count);
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore);
 | 
					void FreeSemaphore(struct SEM * Semaphore);
 | 
				
			||||||
int EncryptPass(char * Pass, char * Encrypt);
 | 
					int EncryptPass(char * Pass, char * Encrypt);
 | 
				
			||||||
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
 | 
					VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
 | 
				
			||||||
| 
						 | 
					@ -6574,8 +6578,6 @@ VOID CreateMessageFile(ConnectionInfo * conn, struct MsgInfo * Msg)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID SendUnbuffered(int stream, char * msg, int len)
 | 
					VOID SendUnbuffered(int stream, char * msg, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
| 
						 | 
					@ -7302,7 +7304,7 @@ VOID SetupForwardingStruct(struct UserInfo * user)
 | 
				
			||||||
			if (ForwardingInfo->ConTimeout == 0)
 | 
								if (ForwardingInfo->ConTimeout == 0)
 | 
				
			||||||
				ForwardingInfo->ConTimeout = 120;
 | 
									ForwardingInfo->ConTimeout = 120;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			GetStringValue(group, "BBSHA", Temp);
 | 
								GetStringValue(group, "BBSHA", Temp, 100);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
			if (Temp[0])
 | 
								if (Temp[0])
 | 
				
			||||||
				ForwardingInfo->BBSHA = _strdup(Temp);
 | 
									ForwardingInfo->BBSHA = _strdup(Temp);
 | 
				
			||||||
| 
						 | 
					@ -10136,15 +10138,20 @@ int GetIntValueWithDefault(config_setting_t * group, char * name, int Default)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value)
 | 
					BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char * str;
 | 
						char * str;
 | 
				
			||||||
	config_setting_t *setting;
 | 
						config_setting_t *setting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setting = config_setting_get_member (group, name);
 | 
						setting = config_setting_get_member (group, name);
 | 
				
			||||||
	if (setting)
 | 
						if (setting)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		str =  config_setting_get_string (setting);
 | 
							str =  (char *)config_setting_get_string (setting);
 | 
				
			||||||
 | 
							if (strlen(str) > maxlen)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Debugprintf("Suspect config record %s", str);
 | 
				
			||||||
 | 
								str[maxlen] = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		strcpy(value, str);
 | 
							strcpy(value, str);
 | 
				
			||||||
		return TRUE;
 | 
							return TRUE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -10221,25 +10228,24 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Localtime =  GetIntValue(group, "Localtime");
 | 
						Localtime =  GetIntValue(group, "Localtime");
 | 
				
			||||||
	AliasText = GetMultiStringValue(group, "FWDAliases");
 | 
						AliasText = GetMultiStringValue(group, "FWDAliases");
 | 
				
			||||||
	GetStringValue(group, "BBSName", BBSName);
 | 
						GetStringValue(group, "BBSName", BBSName, 100);
 | 
				
			||||||
	GetStringValue(group, "MailForText", MailForText);
 | 
						GetStringValue(group, "MailForText", MailForText, 100);
 | 
				
			||||||
	GetStringValue(group, "SYSOPCall", SYSOPCall);
 | 
						GetStringValue(group, "SYSOPCall", SYSOPCall, 100);
 | 
				
			||||||
	GetStringValue(group, "H-Route", HRoute);
 | 
						GetStringValue(group, "H-Route", HRoute, 100);
 | 
				
			||||||
	GetStringValue(group, "AMPRDomain", AMPRDomain);
 | 
						GetStringValue(group, "AMPRDomain", AMPRDomain, 100);
 | 
				
			||||||
	SendAMPRDirect = GetIntValue(group, "SendAMPRDirect");
 | 
						SendAMPRDirect = GetIntValue(group, "SendAMPRDirect");
 | 
				
			||||||
	ISP_Gateway_Enabled =  GetIntValue(group, "SMTPGatewayEnabled");
 | 
						ISP_Gateway_Enabled =  GetIntValue(group, "SMTPGatewayEnabled");
 | 
				
			||||||
	ISPPOP3Interval =  GetIntValue(group, "POP3PollingInterval");
 | 
						ISPPOP3Interval =  GetIntValue(group, "POP3PollingInterval");
 | 
				
			||||||
	GetStringValue(group, "MyDomain", MyDomain);
 | 
						GetStringValue(group, "MyDomain", MyDomain, 50);
 | 
				
			||||||
	GetStringValue(group, "ISPSMTPName", ISPSMTPName);
 | 
						GetStringValue(group, "ISPSMTPName", ISPSMTPName, 50);
 | 
				
			||||||
	GetStringValue(group, "ISPPOP3Name", ISPPOP3Name);
 | 
						GetStringValue(group, "ISPPOP3Name", ISPPOP3Name, 50);
 | 
				
			||||||
	ISPSMTPPort = GetIntValue(group, "ISPSMTPPort");
 | 
						ISPSMTPPort = GetIntValue(group, "ISPSMTPPort");
 | 
				
			||||||
	ISPPOP3Port = GetIntValue(group, "ISPPOP3Port");
 | 
						ISPPOP3Port = GetIntValue(group, "ISPPOP3Port");
 | 
				
			||||||
	GetStringValue(group, "ISPAccountName", ISPAccountName);
 | 
						GetStringValue(group, "ISPAccountName", ISPAccountName, 50);
 | 
				
			||||||
	GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass);
 | 
						GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
 | 
				
			||||||
	GetStringValue(group, "ISPAccountName", ISPAccountName);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(SignoffMsg, "73 de %s\r", BBSName);					// Default
 | 
						sprintf(SignoffMsg, "73 de %s\r", BBSName);					// Default
 | 
				
			||||||
	GetStringValue(group, "SignoffMsg", SignoffMsg);
 | 
						GetStringValue(group, "SignoffMsg", ISPAccountName, 50);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
 | 
						DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10251,10 +10257,10 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetStringValue(group, "MonitorSize", Size);
 | 
						GetStringValue(group, "MonitorSize", Size, sizeof(Size));
 | 
				
			||||||
	sscanf(Size,"%d,%d,%d,%d,%d",&MonitorRect.left,&MonitorRect.right,&MonitorRect.top,&MonitorRect.bottom,&OpenMon);
 | 
						sscanf(Size,"%d,%d,%d,%d,%d",&MonitorRect.left,&MonitorRect.right,&MonitorRect.top,&MonitorRect.bottom,&OpenMon);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	GetStringValue(group, "WindowSize", Size);
 | 
						GetStringValue(group, "WindowSize", Size, sizeof(Size));
 | 
				
			||||||
	sscanf(Size,"%d,%d,%d,%d",&MainRect.left,&MainRect.right,&MainRect.top,&MainRect.bottom);
 | 
						sscanf(Size,"%d,%d,%d,%d",&MainRect.left,&MainRect.right,&MainRect.top,&MainRect.bottom);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Bells = GetIntValue(group, "Bells");
 | 
						Bells = GetIntValue(group, "Bells");
 | 
				
			||||||
| 
						 | 
					@ -10267,7 +10273,7 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
	WrapInput = GetIntValue(group, "WrapInput");			
 | 
						WrapInput = GetIntValue(group, "WrapInput");			
 | 
				
			||||||
	FlashOnConnect = GetIntValue(group, "FlashOnConnect");			
 | 
						FlashOnConnect = GetIntValue(group, "FlashOnConnect");			
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	GetStringValue(group, "ConsoleSize", Size);
 | 
						GetStringValue(group, "ConsoleSize", Size, 80);
 | 
				
			||||||
	sscanf(Size,"%d,%d,%d,%d,%d", &ConsoleRect.left, &ConsoleRect.right,
 | 
						sscanf(Size,"%d,%d,%d,%d,%d", &ConsoleRect.left, &ConsoleRect.right,
 | 
				
			||||||
			&ConsoleRect.top, &ConsoleRect.bottom,&OpenConsole);
 | 
								&ConsoleRect.top, &ConsoleRect.bottom,&OpenConsole);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10346,7 +10352,7 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Get FBB Filters
 | 
							// Get FBB Filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetStringValue(group, "FBBFilters", FBBString);
 | 
						GetStringValue(group, "FBBFilters", FBBString, sizeof(FBBString));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr1 = FBBString;
 | 
						ptr1 = FBBString;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10432,8 +10438,8 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
	SendWP = GetIntValue(group, "SendWP");
 | 
						SendWP = GetIntValue(group, "SendWP");
 | 
				
			||||||
	SendWPType = GetIntValue(group, "SendWPType");
 | 
						SendWPType = GetIntValue(group, "SendWPType");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetStringValue(group, "SendWPTO", SendWPTO);
 | 
						GetStringValue(group, "SendWPTO", SendWPTO, sizeof(SendWPTO));
 | 
				
			||||||
	GetStringValue(group, "SendWPVIA", SendWPVIA);
 | 
						GetStringValue(group, "SendWPVIA", SendWPVIA, sizeof(SendWPVIA));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SendWPAddrs = GetMultiStringValue(group,  "SendWPAddrs"); 
 | 
						SendWPAddrs = GetMultiStringValue(group,  "SendWPAddrs"); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10463,7 +10469,7 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
		SendWPVIA[0] = 0;
 | 
							SendWPVIA[0] = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetStringValue(group, "Version", Size);
 | 
						GetStringValue(group, "Version", Size, sizeof(Size));
 | 
				
			||||||
	sscanf(Size,"%d,%d,%d,%d", &LastVer[0], &LastVer[1], &LastVer[2], &LastVer[3]);
 | 
						sscanf(Size,"%d,%d,%d,%d", &LastVer[0], &LastVer[1], &LastVer[2], &LastVer[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i =1 ; i <= GetNumberofPorts(); i++)
 | 
						for (i =1 ; i <= GetNumberofPorts(); i++)
 | 
				
			||||||
| 
						 | 
					@ -10481,7 +10487,7 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
			UIHDDR[i] = GetIntValueWithDefault(group, "SendHDDR", UIEnabled[i]);
 | 
								UIHDDR[i] = GetIntValueWithDefault(group, "SendHDDR", UIEnabled[i]);
 | 
				
			||||||
			UINull[i] = GetIntValue(group, "SendNull");
 | 
								UINull[i] = GetIntValue(group, "SendNull");
 | 
				
			||||||
			Size[0] = 0;
 | 
								Size[0] = 0;
 | 
				
			||||||
			GetStringValue(group, "Digis", Size);
 | 
								GetStringValue(group, "Digis", Size, sizeof(Size));
 | 
				
			||||||
			if (Size[0])
 | 
								if (Size[0])
 | 
				
			||||||
				UIDigi[i] = _strdup(Size);
 | 
									UIDigi[i] = _strdup(Size);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma data_seg("_BPQDATA")
 | 
					#pragma data_seg("_BPQDATA")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
#include "stdio.h"
 | 
					#include "stdio.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1146,6 +1146,7 @@
 | 
				
			||||||
//	Fix sending ampr.org mail when RMS is not enabled (51)
 | 
					//	Fix sending ampr.org mail when RMS is not enabled (51)
 | 
				
			||||||
//	Send forwarding info to packetnodes.spots.radio database (51)
 | 
					//	Send forwarding info to packetnodes.spots.radio database (51)
 | 
				
			||||||
//	Fix bug in WP Message processing (56)
 | 
					//	Fix bug in WP Message processing (56)
 | 
				
			||||||
 | 
					//	Fix treating addresses ending in WW as Internet (57)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
#include "winstdint.h"
 | 
					#include "winstdint.h"
 | 
				
			||||||
| 
						 | 
					@ -1537,7 +1538,11 @@ VOID WriteMiniDump()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID)
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	//	Wait for it to be free
 | 
						//	Wait for it to be free
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								BPQNRR.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								BPQNRR.c
									
									
									
									
									
								
							| 
						 | 
					@ -36,7 +36,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//#include "vmm.h"
 | 
					//#include "vmm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int SENDNETFRAME();
 | 
					extern int SENDNETFRAME();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,7 +56,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#ifndef WIN32
 | 
					#ifndef WIN32
 | 
				
			||||||
#include <sys/socket.h>
 | 
					#include <sys/socket.h>
 | 
				
			||||||
#include <netinet/in.h>
 | 
					#include <netinet/in.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6741
									
								
								Bpq32-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6741
									
								
								Bpq32-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										19
									
								
								Bpq32.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								Bpq32.c
									
									
									
									
									
								
							| 
						 | 
					@ -3,7 +3,7 @@ Copyright 2001-2022 John Wiseman G8BPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This file is part of LinBPQ/BPQ32.
 | 
					This file is part of LinBPQ/BPQ32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
 | 
					LinBPQ/BPQ32 is free software: you can redistribute it and/or modifyextern int HTTP
 | 
				
			||||||
it under the terms of the GNU General Public License as published by
 | 
					it under the terms of the GNU General Public License as published by
 | 
				
			||||||
the Free Software Foundation, either version 3 of the License, or
 | 
					the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
(at your option) any later version.
 | 
					(at your option) any later version.
 | 
				
			||||||
| 
						 | 
					@ -1241,6 +1241,13 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//	Add MQTT reporting of Mail Events (54)
 | 
					//	Add MQTT reporting of Mail Events (54)
 | 
				
			||||||
//	Fix beaconong on KISSHF ports (55)
 | 
					//	Fix beaconong on KISSHF ports (55)
 | 
				
			||||||
//	Fix MailAPI msgs endpoint
 | 
					//	Fix MailAPI msgs endpoint
 | 
				
			||||||
 | 
					//	Attempt to fix NC going to wrong application. (57)
 | 
				
			||||||
 | 
					//	Improve ARDOP end of session code (58)
 | 
				
			||||||
 | 
					//	Run M0LTE Map repoorting in a separate thread (59)
 | 
				
			||||||
 | 
					//	Add support fro WhatsPac (59)
 | 
				
			||||||
 | 
					// Add timestamps to LIS monitor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CKernel
 | 
					#define CKernel
 | 
				
			||||||
| 
						 | 
					@ -1503,6 +1510,7 @@ VOID APRSClose();
 | 
				
			||||||
VOID CloseTNCEmulator();
 | 
					VOID CloseTNCEmulator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID Poll_AGW();
 | 
					VOID Poll_AGW();
 | 
				
			||||||
 | 
					void RHPPoll();
 | 
				
			||||||
BOOL AGWAPIInit();
 | 
					BOOL AGWAPIInit();
 | 
				
			||||||
int AGWAPITerminate();
 | 
					int AGWAPITerminate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1521,7 +1529,9 @@ UINT Sem_edx = 0;
 | 
				
			||||||
UINT Sem_esi = 0;
 | 
					UINT Sem_esi = 0;
 | 
				
			||||||
UINT Sem_edi = 0;
 | 
					UINT Sem_edi = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore);
 | 
					void FreeSemaphore(struct SEM * Semaphore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI;
 | 
					DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI;
 | 
				
			||||||
| 
						 | 
					@ -1869,8 +1879,8 @@ VOID MonitorThread(int x)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// It is stuck - try to release
 | 
								// It is stuck - try to release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				Debugprintf ("Semaphore locked - Process ID = %d, Held By %d",
 | 
									Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
 | 
				
			||||||
					Semaphore.SemProcessID, SemHeldByAPI);
 | 
										Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			// Write a minidump
 | 
								// Write a minidump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2291,6 +2301,7 @@ VOID TimerProcX()
 | 
				
			||||||
			Poll_AGW();
 | 
								Poll_AGW();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DRATSPoll();
 | 
							DRATSPoll();
 | 
				
			||||||
 | 
							RHPPoll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		CheckGuardZone();
 | 
							CheckGuardZone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +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(const char * buf, char delim);
 | 
					char * strlop(char * buf, char delim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define APIENTRY
 | 
					#define APIENTRY
 | 
				
			||||||
#define VOID void
 | 
					#define VOID void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,8 @@ VOID __cdecl Logprintf(int LogMode, ChatCIRCUIT * conn, int InOut, const char *
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID)
 | 
					
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	//	Wait for it to be free
 | 
						//	Wait for it to be free
 | 
				
			||||||
| 
						 | 
					@ -74,6 +75,9 @@ loop1:
 | 
				
			||||||
;
 | 
					;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Semaphore->Line = Line;
 | 
				
			||||||
 | 
						strcpy(Semaphore->File, File);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore)
 | 
					void FreeSemaphore(struct SEM * Semaphore)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								Cmd.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Cmd.c
									
									
									
									
									
								
							| 
						 | 
					@ -35,7 +35,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//#include "vmm.h"
 | 
					//#include "vmm.h"
 | 
				
			||||||
//#include "SHELLAPI.H"
 | 
					//#include "SHELLAPI.H"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpqaprs.h"
 | 
					#include "bpqaprs.h"
 | 
				
			||||||
#include "kiss.h"
 | 
					#include "kiss.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -988,7 +988,6 @@ VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char * ptr, *Context;
 | 
						char * ptr, *Context;
 | 
				
			||||||
	int Port = 0, cols = NUMBEROFPORTS, i;
 | 
						int Port = 0, cols = NUMBEROFPORTS, i;
 | 
				
			||||||
	char * uptime;
 | 
					 | 
				
			||||||
	struct PORTCONTROL * PORT = PORTTABLE;
 | 
						struct PORTCONTROL * PORT = PORTTABLE;
 | 
				
			||||||
	struct PORTCONTROL * STARTPORT;
 | 
						struct PORTCONTROL * STARTPORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5647
									
								
								CommonCode-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5647
									
								
								CommonCode-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										72
									
								
								CommonCode.c
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								CommonCode.c
									
									
									
									
									
								
							| 
						 | 
					@ -32,7 +32,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma data_seg("_BPQDATA")
 | 
					#pragma data_seg("_BPQDATA")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#include "configstructs.h"
 | 
					#include "configstructs.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,7 +69,7 @@ VOID WriteMiniDump();
 | 
				
			||||||
void printStack(void);
 | 
					void printStack(void);
 | 
				
			||||||
char * FormatMH(PMHSTRUC MH, char Format);
 | 
					char * FormatMH(PMHSTRUC MH, char Format);
 | 
				
			||||||
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
 | 
					void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
 | 
				
			||||||
void SendDataToPktMap(char *Msg);
 | 
					void SendDataToPktMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BOOL LogAllConnects;
 | 
					extern BOOL LogAllConnects;
 | 
				
			||||||
extern BOOL M0LTEMap;
 | 
					extern BOOL M0LTEMap;
 | 
				
			||||||
| 
						 | 
					@ -571,7 +571,7 @@ void * zalloc(int len)
 | 
				
			||||||
	return ptr;
 | 
						return ptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char * strlop(const char * buf, char delim)
 | 
					char * strlop(char * buf, char delim)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Terminate buf at delim, and return rest of string
 | 
						// Terminate buf at delim, and return rest of string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1456,7 +1456,21 @@ DllExport int APIENTRY SessionStateNoAck(int stream, int * state)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SendMsgEx(int stream, char * msg, int len, int GetSem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SendMsgNoSem(int stream, char * msg, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return SendMsgEx(stream, msg, len, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
					DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return SendMsgEx(stream, msg, len, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SendMsgEx(int stream, char * msg, int len, int GetSem)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	Send message to stream (BPQHOST Function 2)
 | 
						//	Send message to stream (BPQHOST Function 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1479,10 +1493,12 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
		if (QCOUNT < 50)
 | 
							if (QCOUNT < 50)
 | 
				
			||||||
			return 0;					// Dont want to run out
 | 
								return 0;					// Dont want to run out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (GetSem)
 | 
				
			||||||
				GetSemaphore(&Semaphore, 10);
 | 
									GetSemaphore(&Semaphore, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((MSG = GetBuff()) == 0)
 | 
							if ((MSG = GetBuff()) == 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								if (GetSem)
 | 
				
			||||||
				FreeSemaphore(&Semaphore);
 | 
									FreeSemaphore(&Semaphore);
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1494,6 +1510,7 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SENDUIMESSAGE(MSG);
 | 
							SENDUIMESSAGE(MSG);
 | 
				
			||||||
		ReleaseBuffer(MSG);
 | 
							ReleaseBuffer(MSG);
 | 
				
			||||||
 | 
							if (GetSem)
 | 
				
			||||||
			FreeSemaphore(&Semaphore);
 | 
								FreeSemaphore(&Semaphore);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1509,12 +1526,14 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
	if (L4 == 0)
 | 
						if (L4 == 0)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (GetSem)
 | 
				
			||||||
		GetSemaphore(&Semaphore, 22);
 | 
							GetSemaphore(&Semaphore, 22);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SESS->HOSTFLAGS |= 0x80;		// SET ALLOCATED BIT
 | 
						SESS->HOSTFLAGS |= 0x80;		// SET ALLOCATED BIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (QCOUNT < 40)				// PLENTY FREE?
 | 
						if (QCOUNT < 40)				// PLENTY FREE?
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							if (GetSem)
 | 
				
			||||||
			FreeSemaphore(&Semaphore);
 | 
								FreeSemaphore(&Semaphore);
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1528,6 +1547,7 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
		if (n > 100)
 | 
							if (n > 100)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Debugprintf("Stream %d QCOUNT %d Q Len %d - discarding", stream, QCOUNT, n);
 | 
								Debugprintf("Stream %d QCOUNT %d Q Len %d - discarding", stream, QCOUNT, n);
 | 
				
			||||||
 | 
								if (GetSem)
 | 
				
			||||||
				FreeSemaphore(&Semaphore);
 | 
									FreeSemaphore(&Semaphore);
 | 
				
			||||||
			return 1;
 | 
								return 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1535,6 +1555,7 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((MSG = GetBuff()) == 0)
 | 
						if ((MSG = GetBuff()) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							if (GetSem)
 | 
				
			||||||
			FreeSemaphore(&Semaphore);
 | 
								FreeSemaphore(&Semaphore);
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1562,6 +1583,7 @@ DllExport int APIENTRY SendMsg(int stream, char * msg, int len)
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		C_Q_ADD(&L4->L4RX_Q, MSG);
 | 
							C_Q_ADD(&L4->L4RX_Q, MSG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (GetSem)
 | 
				
			||||||
		FreeSemaphore(&Semaphore);
 | 
							FreeSemaphore(&Semaphore);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3318,7 +3340,7 @@ VOID SendLocation()
 | 
				
			||||||
	SendReportMsg((char *)&AXMSG.DEST, Len + 16);
 | 
						SendReportMsg((char *)&AXMSG.DEST, Len + 16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (M0LTEMap)
 | 
						if (M0LTEMap)
 | 
				
			||||||
		SendDataToPktMap("");
 | 
							SendDataToPktMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3326,7 +3348,6 @@ VOID SendLocation()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode)
 | 
					VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * Mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	MESSAGE AXMSG;
 | 
						MESSAGE AXMSG;
 | 
				
			||||||
| 
						 | 
					@ -3342,7 +3363,8 @@ VOID SendMH(struct TNCINFO * TNC, char * call, char * freq, char * LOC, char * M
 | 
				
			||||||
	// Block includes the Msg Header (7 bytes), Len Does not!
 | 
						// Block includes the Msg Header (7 bytes), Len Does not!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memcpy(AXPTR->DEST, ReportDest, 7);
 | 
						memcpy(AXPTR->DEST, ReportDest, 7);
 | 
				
			||||||
	if (TNC->PortRecord->PORTCONTROL.PORTCALL[0])
 | 
					
 | 
				
			||||||
 | 
						if (TNC && TNC->PortRecord->PORTCONTROL.PORTCALL[0])
 | 
				
			||||||
		memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7);
 | 
							memcpy(AXPTR->ORIGIN, TNC->PortRecord->PORTCONTROL.PORTCALL, 7);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		memcpy(AXPTR->ORIGIN, MYCALL, 7);
 | 
							memcpy(AXPTR->ORIGIN, MYCALL, 7);
 | 
				
			||||||
| 
						 | 
					@ -3502,8 +3524,10 @@ int __sync_lock_test_and_set(int * ptr, int val)
 | 
				
			||||||
#endif // MACBPQ
 | 
					#endif // MACBPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID)
 | 
					
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	//	Wait for it to be free
 | 
						//	Wait for it to be free
 | 
				
			||||||
| 
						 | 
					@ -3547,6 +3571,8 @@ loop1:
 | 
				
			||||||
	Semaphore->SemProcessID = GetCurrentProcessId();
 | 
						Semaphore->SemProcessID = GetCurrentProcessId();
 | 
				
			||||||
	Semaphore->SemThreadID = GetCurrentThreadId();
 | 
						Semaphore->SemThreadID = GetCurrentThreadId();
 | 
				
			||||||
	SemHeldByAPI = ID;
 | 
						SemHeldByAPI = ID;
 | 
				
			||||||
 | 
						Semaphore->Line = Line;
 | 
				
			||||||
 | 
						strcpy(Semaphore->File, File);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -4171,10 +4197,10 @@ VOID GetUIConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (group)
 | 
								if (group)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				GetStringValue(group, "UIDEST", &UIUIDEST[Port][0]);
 | 
									GetStringValue(group, "UIDEST", &UIUIDEST[Port][0], 11);
 | 
				
			||||||
				GetStringValue(group, "FileName", &FN[Port][0]);
 | 
									GetStringValue(group, "FileName", &FN[Port][0], 256);
 | 
				
			||||||
				GetStringValue(group, "Message", &Message[Port][0]);
 | 
									GetStringValue(group, "Message", &Message[Port][0], 1000);
 | 
				
			||||||
				GetStringValue(group, "Digis", Digis);
 | 
									GetStringValue(group, "Digis", Digis, 100);
 | 
				
			||||||
				UIUIDigi[Port] = _strdup(Digis);
 | 
									UIUIDigi[Port] = _strdup(Digis);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
				Interval[Port] = GetIntValue(group, "Interval");
 | 
									Interval[Port] = GetIntValue(group, "Interval");
 | 
				
			||||||
| 
						 | 
					@ -4205,15 +4231,21 @@ int GetIntValue(config_setting_t * group, char * name)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value)
 | 
					BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char * str;
 | 
						char * str;
 | 
				
			||||||
	config_setting_t *setting;
 | 
						config_setting_t *setting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setting = config_setting_get_member (group, name);
 | 
						setting = config_setting_get_member (group, name);
 | 
				
			||||||
	if (setting)
 | 
						if (setting)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		str =  config_setting_get_string (setting);
 | 
							str = (char *)config_setting_get_string(setting);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (strlen(str) > maxlen)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Debugprintf("Suspect config record %s", str);
 | 
				
			||||||
 | 
								str[maxlen] = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		strcpy(value, str);
 | 
							strcpy(value, str);
 | 
				
			||||||
		return TRUE;
 | 
							return TRUE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -5131,10 +5163,16 @@ skipit:
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SendDataToPktMapThread();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SendDataToPktMap(char *Msg)
 | 
					void SendDataToPktMap()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char Return[256];
 | 
						_beginthread(SendDataToPktMapThread,2048000,0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SendDataToPktMapThread()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char Return[256] = "";
 | 
				
			||||||
	char Request[64];
 | 
						char Request[64];
 | 
				
			||||||
	char Params[50000];
 | 
						char Params[50000];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5582,7 +5620,7 @@ void SendDataToPktMap(char *Msg)
 | 
				
			||||||
	//  "contact": "string",
 | 
						//  "contact": "string",
 | 
				
			||||||
	//  "neighbours": [{"node": "G7TAJ","port": "30"}]
 | 
						//  "neighbours": [{"node": "G7TAJ","port": "30"}]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SendWebRequest("packetnodes.spots.radio", Request, Params, Return);
 | 
						SendWebRequest("packetnodes.spots.radio", Request, Params, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}";
 | 
					//	="{\"neighbours\": [{\"node\": \"G7TAJ\",\"port\": \"30\"}]}";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								DOSAPI.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								DOSAPI.c
									
									
									
									
									
								
							| 
						 | 
					@ -32,7 +32,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "compatbits.h"
 | 
					#include "compatbits.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern QCOUNT; 
 | 
					extern QCOUNT; 
 | 
				
			||||||
extern BPQVECSTRUC BPQHOSTVECTOR[];
 | 
					extern BPQVECSTRUC BPQHOSTVECTOR[];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								DRATS.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								DRATS.c
									
									
									
									
									
								
							| 
						 | 
					@ -21,7 +21,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
#include "telnetserver.h"
 | 
					#include "telnetserver.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								Events.c
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Events.c
									
									
									
									
									
								
							| 
						 | 
					@ -125,7 +125,6 @@ void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _
 | 
				
			||||||
	strcpy(LINK->callingCall, remotecall);
 | 
						strcpy(LINK->callingCall, remotecall);
 | 
				
			||||||
	strcpy(LINK->receivingCall, ourcall);
 | 
						strcpy(LINK->receivingCall, ourcall);
 | 
				
			||||||
	strcpy(LINK->Direction, "In");
 | 
						strcpy(LINK->Direction, "In");
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void hookL2SessionDeleted(struct _LINKTABLE * LINK)
 | 
					void hookL2SessionDeleted(struct _LINKTABLE * LINK)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,10 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								FLDigi.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								FLDigi.c
									
									
									
									
									
								
							| 
						 | 
					@ -23,7 +23,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
					extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "kernelresource.h"
 | 
					#include "kernelresource.h"
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
#include <commctrl.h>
 | 
					#include <commctrl.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(1)
 | 
					#pragma pack(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma data_seg("_BPQDATA")
 | 
					#pragma data_seg("_BPQDATA")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "templatedefs.c"				// Inline definitions from HTLMPages
 | 
					#include "templatedefs.c"				// Inline definitions from HTLMPages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5175
									
								
								HTTPcode-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5175
									
								
								HTTPcode-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										43
									
								
								HTTPcode.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								HTTPcode.c
									
									
									
									
									
								
							| 
						 | 
					@ -24,7 +24,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DllImport
 | 
					#define DllImport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
| 
						 | 
					@ -70,6 +70,7 @@ char * GetStandardPage(char * FN, int * Len);
 | 
				
			||||||
BOOL SHA1PasswordHash(char * String, char * Hash);
 | 
					BOOL SHA1PasswordHash(char * String, char * Hash);
 | 
				
			||||||
char * byte_base64_encode(char *str, int len);
 | 
					char * byte_base64_encode(char *str, int len);
 | 
				
			||||||
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request,	BOOL LOCAL, BOOL COOKIE);
 | 
					int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request,	BOOL LOCAL, BOOL COOKIE);
 | 
				
			||||||
 | 
					int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct ROUTE * NEIGHBOURS;
 | 
					extern struct ROUTE * NEIGHBOURS;
 | 
				
			||||||
extern int  ROUTE_LEN;
 | 
					extern int  ROUTE_LEN;
 | 
				
			||||||
| 
						 | 
					@ -1852,6 +1853,43 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_memicmp(Context, "/rhp/", 5) == 0 || _stricmp(Context, "/rhp") == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ReplyLen = RHPProcessHTTPMessage(conn, _REPLYBUFFER, Method, Context, MsgPtr, LOCAL, COOKIE);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// Full Message - just send it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										sendandcheck(sock, _REPLYBUFFER, ReplyLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										return 0;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (allowDeflate)
 | 
				
			||||||
 | 
										Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										Compressed = _REPLYBUFFER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\n"
 | 
				
			||||||
 | 
										"Content-Length: %d\r\n"
 | 
				
			||||||
 | 
										"Content-Type: application/json\r\n"
 | 
				
			||||||
 | 
										"Connection: close\r\n"
 | 
				
			||||||
 | 
										"Access-Control-Allow-Origin: *\r\n"
 | 
				
			||||||
 | 
										"%s\r\n", ReplyLen, Encoding);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									sendandcheck(sock, Header, HeaderLen);
 | 
				
			||||||
 | 
									sendandcheck(sock, Compressed, ReplyLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (allowDeflate)
 | 
				
			||||||
 | 
										free (Compressed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// APRS process internally
 | 
							// APRS process internally
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0)
 | 
							if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0)
 | 
				
			||||||
| 
						 | 
					@ -5135,6 +5173,3 @@ void SHA1PadMessage(SHA1Context *context)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								HanksRT.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								HanksRT.c
									
									
									
									
									
								
							| 
						 | 
					@ -27,7 +27,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LINBPQ
 | 
					#ifdef LINBPQ
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqchat.h"
 | 
					#include "bpqchat.h"
 | 
				
			||||||
| 
						 | 
					@ -4178,10 +4178,10 @@ BOOL GetChatConfig(char * ConfigName)
 | 
				
			||||||
	MaxChatStreams = GetIntValue(group, "MaxStreams");
 | 
						MaxChatStreams = GetIntValue(group, "MaxStreams");
 | 
				
			||||||
	reportChatEvents = GetIntValue(group, "reportChatEvents");
 | 
						reportChatEvents = GetIntValue(group, "reportChatEvents");
 | 
				
			||||||
	chatPaclen = GetIntValue(group, "chatPaclen");
 | 
						chatPaclen = GetIntValue(group, "chatPaclen");
 | 
				
			||||||
	GetStringValue(group, "OtherChatNodes", OtherNodesList);
 | 
						GetStringValue(group, "OtherChatNodes", OtherNodesList, 1000);
 | 
				
			||||||
	GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg);
 | 
						GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg, 1000);
 | 
				
			||||||
	GetStringValue(group, "MapPosition", Position);
 | 
						GetStringValue(group, "MapPosition", Position, 81);
 | 
				
			||||||
	GetStringValue(group, "MapPopup", PopupText);
 | 
						GetStringValue(group, "MapPopup", PopupText, 260);
 | 
				
			||||||
	PopupMode = GetIntValue(group, "PopupMode");
 | 
						PopupMode = GetIntValue(group, "PopupMode");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (chatPaclen == 0)
 | 
						if (chatPaclen == 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,11 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//	Housekeeping Module
 | 
					//	Housekeeping Module
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char * APIENTRY GetBPQDirectory();
 | 
					char * APIENTRY GetBPQDirectory();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								IPCode.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								IPCode.c
									
									
									
									
									
								
							| 
						 | 
					@ -81,7 +81,7 @@ TODo	?Multiple Adapters
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "ipcode.h"
 | 
					#include "ipcode.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								KISSHF.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								KISSHF.c
									
									
									
									
									
								
							| 
						 | 
					@ -27,7 +27,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								L2Code.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								L2Code.c
									
									
									
									
									
								
							| 
						 | 
					@ -30,7 +30,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
#include "stdio.h"
 | 
					#include "stdio.h"
 | 
				
			||||||
				 
 | 
									 
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	PFBIT 0x10		// POLL/FINAL BIT IN CONTROL BYTE
 | 
					#define	PFBIT 0x10		// POLL/FINAL BIT IN CONTROL BYTE
 | 
				
			||||||
| 
						 | 
					@ -130,7 +130,7 @@ extern int REALTIMETICKS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UCHAR NO_CTEXT = 0;
 | 
					UCHAR NO_CTEXT = 0;
 | 
				
			||||||
UCHAR ALIASMSG = 0;
 | 
					UCHAR ALIASMSG = 0;
 | 
				
			||||||
extern UINT APPLMASK;
 | 
					
 | 
				
			||||||
static UCHAR ISNETROMMSG = 0;
 | 
					static UCHAR ISNETROMMSG = 0;
 | 
				
			||||||
UCHAR MSGFLAG = 0;
 | 
					UCHAR MSGFLAG = 0;
 | 
				
			||||||
extern char * ALIASPTR;
 | 
					extern char * ALIASPTR;
 | 
				
			||||||
| 
						 | 
					@ -142,6 +142,30 @@ extern BOOL LogAllConnects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
APPLCALLS * APPL;
 | 
					APPLCALLS * APPL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SendL2ToMonMap(struct PORTCONTROL * PORT, char * ReportCall, char Mode, char Direction)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// if Port Freq < 30Mhz send to Node Map
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (PORT->PortFreq && PORT->PortFreq < 30000000)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							char ReportMode[16];
 | 
				
			||||||
 | 
							char ReportFreq[350] = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ReportMode[0] = '@';
 | 
				
			||||||
 | 
							ReportMode[1] = Mode;
 | 
				
			||||||
 | 
							ReportMode[2] = '?';
 | 
				
			||||||
 | 
							ReportMode[3] = Direction;
 | 
				
			||||||
 | 
							ReportMode[4] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// If no position see if we have an APRS posn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_gcvt(PORT->PortFreq, 9, ReportFreq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 		SendMH(0, ReportCall, ReportFreq, 0, ReportMode);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
 | 
					VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	LEVEL 2 PROCESSING
 | 
						//	LEVEL 2 PROCESSING
 | 
				
			||||||
| 
						 | 
					@ -153,6 +177,7 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
 | 
				
			||||||
	UCHAR CTL;
 | 
						UCHAR CTL;
 | 
				
			||||||
	uintptr_t Work;
 | 
						uintptr_t Work;
 | 
				
			||||||
	UCHAR c;
 | 
						UCHAR c;
 | 
				
			||||||
 | 
						unsigned int APPLMASK = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	Check for invalid length (< 22 7Header + 7Addr + 7Addr + CTL
 | 
						//	Check for invalid length (< 22 7Header + 7Addr + 7Addr + CTL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -166,7 +191,6 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
 | 
				
			||||||
 	PORT->L2FRAMES++;
 | 
					 	PORT->L2FRAMES++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ALIASMSG = 0;
 | 
						ALIASMSG = 0;
 | 
				
			||||||
	APPLMASK = 0;
 | 
					 | 
				
			||||||
	ISNETROMMSG = 0;
 | 
						ISNETROMMSG = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MSGFLAG = 0;					// CMD/RESP UNDEFINED
 | 
						MSGFLAG = 0;					// CMD/RESP UNDEFINED
 | 
				
			||||||
| 
						 | 
					@ -238,6 +262,7 @@ VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer)
 | 
				
			||||||
	if (PORT->PORTMHEARD)
 | 
						if (PORT->PORTMHEARD)
 | 
				
			||||||
		MHPROC(PORT, Buffer);
 | 
							MHPROC(PORT, Buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// TAJ added 07/12/2020 for 'all RX traffic as IfinOctects
 | 
						/// TAJ added 07/12/2020 for 'all RX traffic as IfinOctects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	InOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN;
 | 
						InOctets[PORT->PORTNUMBER] += Buffer->LENGTH - MSGHDDRLEN;
 | 
				
			||||||
| 
						 | 
					@ -466,6 +491,8 @@ FORUS:
 | 
				
			||||||
	if (PORT->UIHook && CTL == 3)
 | 
						if (PORT->UIHook && CTL == 3)
 | 
				
			||||||
		PORT->UIHook(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG);
 | 
							PORT->UIHook(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LINK->APPLMASK = APPLMASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	L2FORUS(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG);
 | 
						L2FORUS(LINK, PORT, Buffer, ADJBUFFER, CTL, MSGFLAG);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -935,7 +962,7 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// We need to save APPLMASK and ALIASPTR so following SABM connects to application
 | 
							// We need to save APPLMASK and ALIASPTR so following SABM connects to application
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		LINK->APPLMASK = APPLMASK;
 | 
							// LINK->APPLMASK now set in L2FORUS
 | 
				
			||||||
		LINK->ALIASPTR = ALIASPTR;
 | 
							LINK->ALIASPTR = ALIASPTR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		PUT_ON_PORT_Q(PORT, Buffer);
 | 
							PUT_ON_PORT_Q(PORT, Buffer);
 | 
				
			||||||
| 
						 | 
					@ -1062,7 +1089,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (LINK->L2STATE == 1)			// Sent XID?
 | 
							if (LINK->L2STATE == 1)			// Sent XID?
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			APPLMASK = LINK->APPLMASK;
 | 
								LINK->APPLMASK;
 | 
				
			||||||
			ALIASPTR = LINK->ALIASPTR;
 | 
								ALIASPTR = LINK->ALIASPTR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			L2SABM(LINK, PORT, Buffer, ADJBUFFER, MSGFLAG);			// Process the SABM
 | 
								L2SABM(LINK, PORT, Buffer, ADJBUFFER, MSGFLAG);			// Process the SABM
 | 
				
			||||||
| 
						 | 
					@ -1147,7 +1174,7 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	IF CONNECT TO APPL ADDRESS, SET UP APPL SESSION
 | 
						//	IF CONNECT TO APPL ADDRESS, SET UP APPL SESSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (APPLMASK == 0)
 | 
						if (LINK->APPLMASK == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//	Not ATTACH TO APPL
 | 
							//	Not ATTACH TO APPL
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -1164,6 +1191,8 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
 | 
							hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SendL2ToMonMap(PORT, fromCall, '+', 'I');		
 | 
				
			||||||
 | 
						
 | 
				
			||||||
		L2SENDUA(PORT, Buffer, ADJBUFFER);
 | 
							L2SENDUA(PORT, Buffer, ADJBUFFER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
 | 
							if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
 | 
				
			||||||
| 
						 | 
					@ -1280,6 +1309,8 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
 | 
							hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SendL2ToMonMap(PORT, fromCall, '+', 'I');		
 | 
				
			||||||
 | 
						
 | 
				
			||||||
		if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
 | 
							if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			struct DATAMESSAGE * Msg;
 | 
								struct DATAMESSAGE * Msg;
 | 
				
			||||||
| 
						 | 
					@ -1353,7 +1384,7 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cATTACHTOBBS(Session, APPLMASK, PORT->PORTPACLEN, &CONERROR) == 0)
 | 
						if (cATTACHTOBBS(Session, LINK->APPLMASK, PORT->PORTPACLEN, &CONERROR) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//	NO BBS AVAILABLE
 | 
							//	NO BBS AVAILABLE
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -1380,6 +1411,7 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
 | 
						hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SendL2ToMonMap(PORT, fromCall, '+', 'I');		
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
 | 
						if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -1848,8 +1880,14 @@ 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];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								fromCall[ConvFromAX25(Buffer->ORIGIN, fromCall)] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			RESET2X(LINK);			// LEAVE QUEUED STUFF
 | 
								RESET2X(LINK);			// LEAVE QUEUED STUFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SendL2ToMonMap(PORT, fromCall, '+', 'O');		
 | 
				
			||||||
 | 
						
 | 
				
			||||||
			LINK->L2STATE = 5;
 | 
								LINK->L2STATE = 5;
 | 
				
			||||||
			LINK->L2TIMER = 0;		// CANCEL TIMER
 | 
								LINK->L2TIMER = 0;		// CANCEL TIMER
 | 
				
			||||||
			LINK->L2RETRIES = 0;
 | 
								LINK->L2RETRIES = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								L3Code.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								L3Code.c
									
									
									
									
									
								
							| 
						 | 
					@ -49,7 +49,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include "stdio.h"
 | 
					#include "stdio.h"
 | 
				
			||||||
#include <fcntl.h>
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID UPDATEDESTLIST();
 | 
					VOID UPDATEDESTLIST();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								L4Code.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								L4Code.c
									
									
									
									
									
								
							| 
						 | 
					@ -31,7 +31,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include "stdio.h"
 | 
					#include "stdio.h"
 | 
				
			||||||
#include <fcntl.h>					 
 | 
					#include <fcntl.h>					 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BPQVECSTRUC BPQHOSTVECTOR[];
 | 
					extern BPQVECSTRUC BPQHOSTVECTOR[];
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
 | 
				
			||||||
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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UINT APPLMASK;
 | 
					static UINT APPLMASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BOOL LogL4Connects;
 | 
					extern BOOL LogL4Connects;
 | 
				
			||||||
extern BOOL LogAllConnects;
 | 
					extern BOOL LogAllConnects;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2154
									
								
								LinBPQ-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2154
									
								
								LinBPQ-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										44
									
								
								LinBPQ.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								LinBPQ.c
									
									
									
									
									
								
							| 
						 | 
					@ -21,7 +21,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
#include <Iphlpapi.h>
 | 
					#include <Iphlpapi.h>
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,11 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL APIENTRY Rig_Init();
 | 
					BOOL APIENTRY Rig_Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore);
 | 
					void FreeSemaphore(struct SEM * Semaphore);
 | 
				
			||||||
VOID CopyConfigFile(char * ConfigName);
 | 
					VOID CopyConfigFile(char * ConfigName);
 | 
				
			||||||
VOID SendMailForThread(VOID * Param);
 | 
					VOID SendMailForThread(VOID * Param);
 | 
				
			||||||
| 
						 | 
					@ -75,6 +79,8 @@ int upnpClose();
 | 
				
			||||||
void SaveAIS();
 | 
					void SaveAIS();
 | 
				
			||||||
void initAIS();
 | 
					void initAIS();
 | 
				
			||||||
void DRATSPoll();
 | 
					void DRATSPoll();
 | 
				
			||||||
 | 
					void RHPPoll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID GetPGConfig();
 | 
					VOID GetPGConfig();
 | 
				
			||||||
void SendBBSDataToPktMap();
 | 
					void SendBBSDataToPktMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -374,24 +380,41 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
 | 
				
			||||||
#include <execinfo.h>
 | 
					#include <execinfo.h>
 | 
				
			||||||
#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[] = "SIGSEGV Received\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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
 | 
				
			||||||
  fprintf(stderr, "Error: signal %d:\n", sig);
 | 
					
 | 
				
			||||||
	backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
						backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  exit(1);
 | 
					  exit(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void abrthandler(int sig)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						void *array[10];
 | 
				
			||||||
 | 
						size_t size;
 | 
				
			||||||
 | 
						char msg[] = "SIGABRT Received\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						write(STDERR_FILENO, msg, strlen(msg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// get void*'s for all entries on the stack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size = backtrace(array, 10);
 | 
				
			||||||
 | 
						backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sigterm_handler(int sig)
 | 
					static void sigterm_handler(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -481,8 +504,9 @@ VOID MonitorThread(void * x)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// It is stuck - try to release
 | 
								// It is stuck - try to release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Debugprintf ("Semaphore locked - Process ID = %d, Held By %d",
 | 
								Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
 | 
				
			||||||
				Semaphore.SemProcessID, SemHeldByAPI);
 | 
										Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
			Semaphore.Flag = 0;
 | 
								Semaphore.Flag = 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -761,6 +785,8 @@ char HelpScreen[] =
 | 
				
			||||||
int Redirected = 0;
 | 
					int Redirected = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void segvhandler(int sig);
 | 
					static void segvhandler(int sig);
 | 
				
			||||||
 | 
					static void abrthandler(int sig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char * argv[])
 | 
					int main(int argc, char * argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -792,7 +818,8 @@ int main(int argc, char * argv[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	signal(SIGSEGV, segvhandler);
 | 
						signal(SIGSEGV, segvhandler);
 | 
				
			||||||
 | 
						signal(SIGABRT, abrthandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setlinebuf(stdout);
 | 
						setlinebuf(stdout);
 | 
				
			||||||
	struct sigaction act;
 | 
						struct sigaction act;
 | 
				
			||||||
| 
						 | 
					@ -1560,6 +1587,7 @@ int main(int argc, char * argv[])
 | 
				
			||||||
			Poll_AGW();
 | 
								Poll_AGW();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DRATSPoll();
 | 
							DRATSPoll();
 | 
				
			||||||
 | 
							RHPPoll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		HTTPTimer();
 | 
							HTTPTimer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,7 +133,7 @@ char HRoute[100];
 | 
				
			||||||
char AMPRDomain[100];
 | 
					char AMPRDomain[100];
 | 
				
			||||||
BOOL SendAMPRDirect = 0;
 | 
					BOOL SendAMPRDirect = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char SignoffMsg[100];
 | 
					char SignoffMsg[120];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char AbortedMsg[100]="\rOutput aborted\r";
 | 
					char AbortedMsg[100]="\rOutput aborted\r";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma data_seg("_BPQDATA")
 | 
					#pragma data_seg("_BPQDATA")
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	MSGFLAG contains CMD/RESPONSE BITS
 | 
					//	MSGFLAG contains CMD/RESPONSE BITS
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,9 @@ VOID __cdecl Debugprintf(const char * format, ...);
 | 
				
			||||||
VOID ReleaseSock(SOCKET sock);
 | 
					VOID ReleaseSock(SOCKET sock);
 | 
				
			||||||
void MQTTMessageEvent(void* message);
 | 
					void MQTTMessageEvent(void* message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct NNTPRec * FirstNNTPRec = NULL;
 | 
					struct NNTPRec * FirstNNTPRec = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//int NumberofNNTPRecs=0;
 | 
					//int NumberofNNTPRecs=0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ TODo	?Multiple Adapters
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "ipcode.h"
 | 
					#include "ipcode.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										641
									
								
								RHP-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										641
									
								
								RHP-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,641 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2001-2022 John Wiseman G8BPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file is part of LinBPQ/BPQ32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					(at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LinBPQ/BPQ32 is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					*/	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Paula (G8PZT)'s Remote Host Protocol interface. 
 | 
				
			||||||
 | 
						For now only sufficient support for WhatsPac
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					 	
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FindFreeStreamNoSem();
 | 
				
			||||||
 | 
					DllExport int APIENTRY DeallocateStream(int stream);
 | 
				
			||||||
 | 
					int SendMsgNoSem(int stream, char * msg, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len);
 | 
				
			||||||
 | 
					static int GetJSONInt(char * _REPLYBUFFER, char * Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Generally Can have multiple RHP connections and each can have multiple RHF Sessions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPSessionInfo
 | 
				
			||||||
 | 
					{  
 | 
				
			||||||
 | 
						SOCKET Socket;				// Websocks Socket
 | 
				
			||||||
 | 
					    int BPQStream;
 | 
				
			||||||
 | 
						int Handle;				// RHP session ID
 | 
				
			||||||
 | 
						int Seq;
 | 
				
			||||||
 | 
					    char Local[12];
 | 
				
			||||||
 | 
					    char Remote[12];
 | 
				
			||||||
 | 
					    BOOL Connecting;		// Set while waiting for connection to complete
 | 
				
			||||||
 | 
					    BOOL Listening; 
 | 
				
			||||||
 | 
						BOOL Connected;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPConnectionInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SOCKET socket;
 | 
				
			||||||
 | 
						struct RHPSessionInfo ** RHPSessions;
 | 
				
			||||||
 | 
						int NumberofRHPSessions;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPConnectionInfo ** RHPSockets = NULL;
 | 
				
			||||||
 | 
					int NumberofRHPConnections = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPSessionInfo ** RHPSessions;
 | 
				
			||||||
 | 
					int NumberofRHPSessions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char ErrCodes[18][24] = 
 | 
				
			||||||
 | 
					{"Ok",   "Unspecified",  "Bad or missing type",   "Invalid handle",   "No memory",  "Bad or missing mode",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 "Invalid local address",
 | 
				
			||||||
 | 
					 "Invalid remote address" ,
 | 
				
			||||||
 | 
					 "Bad or missing family" ,
 | 
				
			||||||
 | 
					 "Duplicate socket"   ,
 | 
				
			||||||
 | 
					 "No such port"    ,
 | 
				
			||||||
 | 
					 "Invalid protocol"      , 
 | 
				
			||||||
 | 
					 "Bad parameter" ,
 | 
				
			||||||
 | 
					 "No buffers"  ,
 | 
				
			||||||
 | 
					  "Unauthorised"  ,
 | 
				
			||||||
 | 
					  "No Route"  ,
 | 
				
			||||||
 | 
					  "Operation not supported"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern char pgm[256];	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SOCKET agwsock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int SemHeldByAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char szBuff[80];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int WhatsPacConfigured = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int RHPPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					int processRHCPClose(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int Loops = 0;
 | 
				
			||||||
 | 
						int Sent;
 | 
				
			||||||
 | 
						int TxLen;
 | 
				
			||||||
 | 
						char * OutBuffer = Msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Len < 126)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Two Byte Header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							OutBuffer[8] = 0x81;		// Fin, Data
 | 
				
			||||||
 | 
							OutBuffer[9] = Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							TxLen = Len + 2;
 | 
				
			||||||
 | 
							OutBuffer = &Msg[8];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (Len < 65536)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							OutBuffer[6] = 0x81;		// Fin, Data
 | 
				
			||||||
 | 
							OutBuffer[7] = 126;			// Unmasked, Extended Len 16
 | 
				
			||||||
 | 
							OutBuffer[8] = Len >> 8;
 | 
				
			||||||
 | 
							OutBuffer[9] = Len & 0xff;
 | 
				
			||||||
 | 
							TxLen = Len + 4;
 | 
				
			||||||
 | 
							OutBuffer = &Msg[6];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							OutBuffer[0] = 0x81;		// Fin, Data
 | 
				
			||||||
 | 
							OutBuffer[1] = 127;			// Unmasked, Extended Len 64 bits
 | 
				
			||||||
 | 
							// Len is 32 bits, so pad with zeros
 | 
				
			||||||
 | 
							OutBuffer[2] = 0;
 | 
				
			||||||
 | 
							OutBuffer[3] = 0;
 | 
				
			||||||
 | 
							OutBuffer[4] = 0;
 | 
				
			||||||
 | 
							OutBuffer[5] = 0;
 | 
				
			||||||
 | 
							OutBuffer[6] = (Len >> 24) & 0xff;
 | 
				
			||||||
 | 
							OutBuffer[7] = (Len >> 16) & 0xff;
 | 
				
			||||||
 | 
							OutBuffer[8] = (Len >> 8) & 0xff;
 | 
				
			||||||
 | 
							OutBuffer[9] = Len & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							TxLen = Len +  + 10;
 | 
				
			||||||
 | 
							OutBuffer = &Msg[0];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Send may block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Sent = send(socket, OutBuffer, TxLen, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (Sent != TxLen && Loops++ < 3000)					// 100 secs max
 | 
				
			||||||
 | 
						{	
 | 
				
			||||||
 | 
							if (Sent > 0)					// something sent
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								TxLen -= Sent;
 | 
				
			||||||
 | 
								memmove(OutBuffer, &OutBuffer[Sent], TxLen);
 | 
				
			||||||
 | 
							}	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Sleep(30);
 | 
				
			||||||
 | 
							Sent = send(socket, OutBuffer, TxLen, 0);
 | 
				
			||||||
 | 
							if (Sent == -1)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(Msg);
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// RHP messages can be sent over Websocks or normal http but I think WhatsPac only uses WebSocks
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ProcessRHPWebSock(SOCKET socket, char * Msg, int MsgLen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int Loops = 0;
 | 
				
			||||||
 | 
						int InputLen = 0;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char Value[16];
 | 
				
			||||||
 | 
						char * OutBuffer = malloc(250000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPConnectionInfo * RHPSocket = NULL;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Msg[MsgLen] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Find Connection Record. If none, create one
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (n = 0; n < NumberofRHPConnections; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (RHPSockets[n]->socket == socket)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								RHPSocket = RHPSockets[n];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (RHPSocket == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							NumberofRHPConnections;
 | 
				
			||||||
 | 
							RHPSockets = realloc(RHPSockets, sizeof(void *) * (NumberofRHPConnections + 1));
 | 
				
			||||||
 | 
							RHPSocket = RHPSockets[NumberofRHPConnections] = zalloc(sizeof (struct RHPConnectionInfo));
 | 
				
			||||||
 | 
							NumberofRHPConnections++;
 | 
				
			||||||
 | 
							RHPSocket->socket = socket;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
 | 
				
			||||||
 | 
					//	{"type": "openReply", "id": 82, "handle": 1, "errCode": 0, "errText": "Ok"}
 | 
				
			||||||
 | 
					//	{"seqno": 0, "type": "status", "handle": 1, "flags": 0}
 | 
				
			||||||
 | 
					//	("seqno": 1, "type": "close", "handle": 1}
 | 
				
			||||||
 | 
					//	{"id":40,"type":"close","handle":1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	{"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
 | 
				
			||||||
 | 
					//	{"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"type\":", Value, 15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Value, "open") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPOpen(RHPSocket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							if (Len)
 | 
				
			||||||
 | 
								SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Value, "send") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPSend(RHPSocket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (_stricmp(Value, "close") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPClose(RHPSocket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						Debugprintf(Msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ProcessRHPWebSockClosed(SOCKET socket)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Close any connections on this scoket and delete socket entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPConnectionInfo * RHPSocket = NULL;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Find Connection Record. CLear any Sessions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (n = 0; n < NumberofRHPConnections; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (RHPSockets[n]->socket == socket)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								RHPSocket = RHPSockets[n];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char * Value = malloc(strlen(Msg));	// Will always be long enough
 | 
				
			||||||
 | 
						int ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char pfam[16];
 | 
				
			||||||
 | 
						char Mode[16];
 | 
				
			||||||
 | 
						int Port;
 | 
				
			||||||
 | 
						char Local[16];
 | 
				
			||||||
 | 
						char Remote[16];
 | 
				
			||||||
 | 
						int flags;
 | 
				
			||||||
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
						int Stream;
 | 
				
			||||||
 | 
						unsigned char AXCall[10];
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID = GetJSONInt(Msg, "\"id\":");
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"pfam\":", pfam, 15);
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"mode\":", Mode, 15);
 | 
				
			||||||
 | 
						Port = GetJSONInt(Msg, "\"port\":");
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"local\":", Local, 15);
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"remote\":", Remote, 15);
 | 
				
			||||||
 | 
						flags = GetJSONInt(Msg, "\"flags\":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(pfam, "ax25") != 0)
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Mode, "stream") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Allocate a RHP Session
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// See if there is an old one we can reuse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (n = 0; n < NumberofRHPSessions; n++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (RHPSessions[n]->BPQStream == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										RHPSession = RHPSessions[n];
 | 
				
			||||||
 | 
										Handle = n + 1;
 | 
				
			||||||
 | 
										Stream = RHPSessions[n]->BPQStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (RHPSession == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									RHPSessions = realloc(RHPSessions, sizeof(void *) * (NumberofRHPSessions + 1));
 | 
				
			||||||
 | 
									RHPSession = RHPSessions[NumberofRHPSessions] = zalloc(sizeof (struct RHPSessionInfo));
 | 
				
			||||||
 | 
									NumberofRHPSessions++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Handle = NumberofRHPSessions;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(pgm, "RHP");
 | 
				
			||||||
 | 
								Stream = FindFreeStreamNoSem();
 | 
				
			||||||
 | 
								strcpy(pgm, "bpq32.exe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Stream == 255)
 | 
				
			||||||
 | 
									return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								RHPSession->BPQStream = Stream;
 | 
				
			||||||
 | 
								RHPSession->Handle = Handle;
 | 
				
			||||||
 | 
								RHPSession->Connecting = TRUE;
 | 
				
			||||||
 | 
								RHPSession->Socket = RHPSocket->socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(RHPSession->Local, Local);
 | 
				
			||||||
 | 
								strcpy(RHPSession->Remote, Remote);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Connect(Stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ConvToAX25(Local, AXCall);
 | 
				
			||||||
 | 
								ChangeSessionCallsign(Stream, AXCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\"}", ID, Handle);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// {"type":"send","handle":1,"data":";;;;;;\r","id":70}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int ID;
 | 
				
			||||||
 | 
						char * Data;
 | 
				
			||||||
 | 
						char * ptr;
 | 
				
			||||||
 | 
						int c;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Data = malloc(strlen(Msg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID = GetJSONInt(Msg, "\"id\":");
 | 
				
			||||||
 | 
						Handle = GetJSONInt(Msg, "\"handle\":");
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"data\":", Data, strlen(Msg) - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							free(Data);
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Look for \ escapes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr = Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (ptr = strchr(ptr, '\\'))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							c = ptr[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch (c)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case 'r':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								*ptr = 13;
 | 
				
			||||||
 | 
								break;	
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							case '\\':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								*ptr = '\\';
 | 
				
			||||||
 | 
								break;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case '"':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								*ptr = '"';
 | 
				
			||||||
 | 
								break;	
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
 | 
				
			||||||
 | 
							ptr++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Debugprintf(Data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Len = strlen(Data);
 | 
				
			||||||
 | 
						ptr = Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (Len > RHPPaclen)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
 | 
				
			||||||
 | 
							Len -= RHPPaclen;
 | 
				
			||||||
 | 
							ptr += RHPPaclen;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(Data);
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPClose(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// {"id":70,"type":"close","handle":1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int ID;
 | 
				
			||||||
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char * OutBuffer = malloc(256);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID = GetJSONInt(Msg, "\"id\":");
 | 
				
			||||||
 | 
						Handle = GetJSONInt(Msg, "\"handle\":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
 | 
						Disconnect(RHPSession->BPQStream);
 | 
				
			||||||
 | 
						RHPSession->Connected = 0;
 | 
				
			||||||
 | 
						RHPSession->Connecting = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DeallocateStream(RHPSession->BPQStream);
 | 
				
			||||||
 | 
						RHPSession->BPQStream = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void RHPPoll()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int Stream;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
						int state, change;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
						char * RHPMsg;
 | 
				
			||||||
 | 
						unsigned char Buffer[1024];			// Space to escape control chars
 | 
				
			||||||
 | 
						int pktlen, count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (n = 0; n < NumberofRHPSessions; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							RHPSession = RHPSessions[n];
 | 
				
			||||||
 | 
							Stream = RHPSession->BPQStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// See if connected state has changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SessionState(Stream, &state, &change);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (change == 1)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (state == 1)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Connected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPSession->Seq = 0;
 | 
				
			||||||
 | 
									RHPSession->Connecting = FALSE;
 | 
				
			||||||
 | 
									RHPSession->Connected = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(256);
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Seq++, RHPSession->Handle);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Send RHP CTEXT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(256);
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"Connected to RHP Server\\r\"}", RHPSession->Seq++, RHPSession->Handle);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Disconnected. Send Close to client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(256);
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"type\": \"close\", \"seqno\": %d, \"handle\": %d}", RHPSession->Seq++, RHPSession->Handle);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPSession->Connected = 0;
 | 
				
			||||||
 | 
									RHPSession->Connecting = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									DeallocateStream(RHPSession->BPQStream);
 | 
				
			||||||
 | 
									RHPSession->BPQStream = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							do
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								GetMsg(Stream, Buffer, &pktlen, &count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (pktlen > 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									char * ptr = Buffer;
 | 
				
			||||||
 | 
									char c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Buffer[pktlen] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Message is JSON so Convert CR to \r, \ to \\ " to \"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									while (c = *(ptr))
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										switch (c)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
										case 13:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											memmove(ptr + 2, ptr + 1, strlen(ptr));
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											*(ptr++) = 'r';
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
										case '"':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											memmove(ptr + 2, ptr + 1, strlen(ptr));
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											*(ptr++) = '"';
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
										case '\\':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											memmove(ptr + 2, ptr + 1, strlen(ptr));
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										ptr++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(1024);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"%s\"}", RHPSession->Seq++, RHPSession->Handle, Buffer);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							while (count > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char * ptr1, * ptr2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Value[0] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 = strstr(_REPLYBUFFER, Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ptr1 == 0)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 += (strlen(Name) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	"data":"{\"t\":\"c\",\"n\":\"John\",\"c\":\"G8BPQ\",\"lm\":1737912636,\"le\":1737883907,\"led\":1737758451,\"v\":0.33,\"cc\":[{\"cid\":1,\"lp\":1737917257201,\"le\":1737913735726,\"led\":1737905249785},{\"cid\":0,\"lp\":1737324074107,\"le\":1737323831510,\"led\":1737322973662},{\"cid\":5,\"lp\":1737992107419,\"le\":1737931466510,\"led\":1737770056244}]}\r","id":28}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// There may be escaped " in data stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr2 = strchr(ptr1, '"');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (*(ptr2 - 1) == '\\')
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							ptr2 = strchr(ptr2 + 2, '"');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						if (ptr2)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							size_t ValLen = ptr2 - ptr1;
 | 
				
			||||||
 | 
							if (ValLen > Len)
 | 
				
			||||||
 | 
								ValLen = Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(Value, ptr1, ValLen);
 | 
				
			||||||
 | 
							Value[ValLen] = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int GetJSONInt(char * _REPLYBUFFER, char * Name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char * ptr1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 = strstr(_REPLYBUFFER, Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ptr1 == 0)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 += (strlen(Name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return atoi(ptr1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										711
									
								
								RHP.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										711
									
								
								RHP.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,711 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2001-2022 John Wiseman G8BPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file is part of LinBPQ/BPQ32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					(at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LinBPQ/BPQ32 is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					*/	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Paula (G8PZT)'s Remote Host Protocol interface. 
 | 
				
			||||||
 | 
						For now only sufficient support for WhatsPac
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					 	
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FindFreeStreamNoSem();
 | 
				
			||||||
 | 
					DllExport int APIENTRY DeallocateStream(int stream);
 | 
				
			||||||
 | 
					int SendMsgNoSem(int stream, char * msg, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len);
 | 
				
			||||||
 | 
					static int GetJSONInt(char * _REPLYBUFFER, char * Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Generally Can have multiple RHP connections and each can have multiple RHF Sessions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPSessionInfo
 | 
				
			||||||
 | 
					{  
 | 
				
			||||||
 | 
						SOCKET Socket;				// Websocks Socket
 | 
				
			||||||
 | 
					    int BPQStream;
 | 
				
			||||||
 | 
						int Handle;				// RHP session ID
 | 
				
			||||||
 | 
						int Seq;
 | 
				
			||||||
 | 
					    char Local[12];
 | 
				
			||||||
 | 
					    char Remote[12];
 | 
				
			||||||
 | 
					    BOOL Connecting;		// Set while waiting for connection to complete
 | 
				
			||||||
 | 
					    BOOL Listening; 
 | 
				
			||||||
 | 
						BOOL Connected;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPConnectionInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SOCKET socket;
 | 
				
			||||||
 | 
						struct RHPSessionInfo ** RHPSessions;
 | 
				
			||||||
 | 
						int NumberofRHPSessions;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Struct passed by beginhread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPParamBlock
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned char * Msg;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
						SOCKET Socket;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//struct RHPConnectionInfo ** RHPSockets = NULL;
 | 
				
			||||||
 | 
					//int NumberofRHPConnections = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPSessionInfo ** RHPSessions;
 | 
				
			||||||
 | 
					int NumberofRHPSessions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char ErrCodes[18][24] = 
 | 
				
			||||||
 | 
					{"Ok",   "Unspecified",  "Bad or missing type",   "Invalid handle",   "No memory",  "Bad or missing mode",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 "Invalid local address",
 | 
				
			||||||
 | 
					 "Invalid remote address" ,
 | 
				
			||||||
 | 
					 "Bad or missing family" ,
 | 
				
			||||||
 | 
					 "Duplicate socket"   ,
 | 
				
			||||||
 | 
					 "No such port"    ,
 | 
				
			||||||
 | 
					 "Invalid protocol"      , 
 | 
				
			||||||
 | 
					 "Bad parameter" ,
 | 
				
			||||||
 | 
					 "No buffers"  ,
 | 
				
			||||||
 | 
					  "Unauthorised"  ,
 | 
				
			||||||
 | 
					  "No Route"  ,
 | 
				
			||||||
 | 
					  "Operation not supported"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern char pgm[256];	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SOCKET agwsock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int SemHeldByAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char szBuff[80];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int WhatsPacConfigured = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int RHPPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int Loops = 0;
 | 
				
			||||||
 | 
						int Sent;
 | 
				
			||||||
 | 
						int TxLen;
 | 
				
			||||||
 | 
						char * OutBuffer = Msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Len < 126)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Two Byte Header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							OutBuffer[8] = 0x81;		// Fin, Data
 | 
				
			||||||
 | 
							OutBuffer[9] = Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							TxLen = Len + 2;
 | 
				
			||||||
 | 
							OutBuffer = &Msg[8];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (Len < 65536)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							OutBuffer[6] = 0x81;		// Fin, Data
 | 
				
			||||||
 | 
							OutBuffer[7] = 126;			// Unmasked, Extended Len 16
 | 
				
			||||||
 | 
							OutBuffer[8] = Len >> 8;
 | 
				
			||||||
 | 
							OutBuffer[9] = Len & 0xff;
 | 
				
			||||||
 | 
							TxLen = Len + 4;
 | 
				
			||||||
 | 
							OutBuffer = &Msg[6];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							OutBuffer[0] = 0x81;		// Fin, Data
 | 
				
			||||||
 | 
							OutBuffer[1] = 127;			// Unmasked, Extended Len 64 bits
 | 
				
			||||||
 | 
							// Len is 32 bits, so pad with zeros
 | 
				
			||||||
 | 
							OutBuffer[2] = 0;
 | 
				
			||||||
 | 
							OutBuffer[3] = 0;
 | 
				
			||||||
 | 
							OutBuffer[4] = 0;
 | 
				
			||||||
 | 
							OutBuffer[5] = 0;
 | 
				
			||||||
 | 
							OutBuffer[6] = (Len >> 24) & 0xff;
 | 
				
			||||||
 | 
							OutBuffer[7] = (Len >> 16) & 0xff;
 | 
				
			||||||
 | 
							OutBuffer[8] = (Len >> 8) & 0xff;
 | 
				
			||||||
 | 
							OutBuffer[9] = Len & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							TxLen = Len +  + 10;
 | 
				
			||||||
 | 
							OutBuffer = &Msg[0];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Send may block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Sent = send(socket, OutBuffer, TxLen, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (Sent != TxLen && Loops++ < 3000)					// 100 secs max
 | 
				
			||||||
 | 
						{	
 | 
				
			||||||
 | 
							if (Sent > 0)					// something sent
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								TxLen -= Sent;
 | 
				
			||||||
 | 
								memmove(OutBuffer, &OutBuffer[Sent], TxLen);
 | 
				
			||||||
 | 
							}	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Sleep(30);
 | 
				
			||||||
 | 
							Sent = send(socket, OutBuffer, TxLen, 0);
 | 
				
			||||||
 | 
							if (Sent == -1)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(Msg);
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void RHPThread(void * Params)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Params and data buffer are malloced blocks so free when done with it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ProcessRHPWebSock(Block->Socket, Block->Msg, Block->Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(Block->Msg);
 | 
				
			||||||
 | 
						free(Params);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int RHPProcessHTTPMessage(void * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// RHP messages can be sent over Websocks or normal http but I think WhatsPac only uses WebSocks
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int Loops = 0;
 | 
				
			||||||
 | 
						int InputLen = 0;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char Value[16];
 | 
				
			||||||
 | 
						char * OutBuffer = malloc(250000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	struct RHPConnectionInfo * RHPSocket = NULL;
 | 
				
			||||||
 | 
					//	int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Msg[MsgLen] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Find Connection Record. If none, create one
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// I dont think I need connection records
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						for (n = 0; n < NumberofRHPConnections; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (RHPSockets[n]->socket == socket)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								RHPSocket = RHPSockets[n];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (RHPSocket == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// See if there is an old one we can reuse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (n = 0; n < NumberofRHPConnections; n++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (RHPSockets[n]-Socket  == -1)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									RHPSocket = RHPSockets[n];
 | 
				
			||||||
 | 
									RHP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (RHPSocket == 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							NumberofRHPConnections;
 | 
				
			||||||
 | 
							RHPSockets = realloc(RHPSockets, sizeof(void *) * (NumberofRHPConnections + 1));
 | 
				
			||||||
 | 
							RHPSocket = RHPSockets[NumberofRHPConnections] = zalloc(sizeof (struct RHPConnectionInfo));
 | 
				
			||||||
 | 
							NumberofRHPConnections++;
 | 
				
			||||||
 | 
							RHPSocket->socket = socket;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
 | 
				
			||||||
 | 
					//	{"type": "openReply", "id": 82, "handle": 1, "errCode": 0, "errText": "Ok"}
 | 
				
			||||||
 | 
					//	{"seqno": 0, "type": "status", "handle": 1, "flags": 0}
 | 
				
			||||||
 | 
					//	("seqno": 1, "type": "close", "handle": 1}
 | 
				
			||||||
 | 
					//	{"id":40,"type":"close","handle":1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	{"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
 | 
				
			||||||
 | 
					//	{"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"type\":", Value, 15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Value, "open") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPOpen(Socket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							if (Len)
 | 
				
			||||||
 | 
								SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Value, "send") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPSend(Socket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (_stricmp(Value, "close") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPClose(Socket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						Debugprintf(Msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ProcessRHPWebSockClosed(SOCKET socket)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Close any connections on this scoket and delete socket entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession = 0;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Find and close any Sessions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (n = 0; n < NumberofRHPSessions; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (RHPSessions[n]->Socket == socket)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								RHPSession = RHPSessions[n];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (RHPSession->BPQStream)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Disconnect(RHPSession->BPQStream);
 | 
				
			||||||
 | 
									DeallocateStream(RHPSession->BPQStream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPSession->BPQStream = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								RHPSession->Connecting = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// We can't send a close to RHP endpont as socket has gone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								RHPSession->Connected = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char * Value = malloc(strlen(Msg));	// Will always be long enough
 | 
				
			||||||
 | 
						int ID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char pfam[16];
 | 
				
			||||||
 | 
						char Mode[16];
 | 
				
			||||||
 | 
						int Port;
 | 
				
			||||||
 | 
						char Local[16];
 | 
				
			||||||
 | 
						char Remote[16];
 | 
				
			||||||
 | 
						int flags;
 | 
				
			||||||
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
						int Stream;
 | 
				
			||||||
 | 
						unsigned char AXCall[10];
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID = GetJSONInt(Msg, "\"id\":");
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"pfam\":", pfam, 15);
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"mode\":", Mode, 15);
 | 
				
			||||||
 | 
						Port = GetJSONInt(Msg, "\"port\":");
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"local\":", Local, 15);
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"remote\":", Remote, 15);
 | 
				
			||||||
 | 
						flags = GetJSONInt(Msg, "\"flags\":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(pfam, "ax25") != 0)
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Mode, "stream") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Allocate a RHP Session
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// See if there is an old one we can reuse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (n = 0; n < NumberofRHPSessions; n++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (RHPSessions[n]->BPQStream == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										RHPSession = RHPSessions[n];
 | 
				
			||||||
 | 
										Handle = n + 1;
 | 
				
			||||||
 | 
										Stream = RHPSessions[n]->BPQStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (RHPSession == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									RHPSessions = realloc(RHPSessions, sizeof(void *) * (NumberofRHPSessions + 1));
 | 
				
			||||||
 | 
									RHPSession = RHPSessions[NumberofRHPSessions] = zalloc(sizeof (struct RHPSessionInfo));
 | 
				
			||||||
 | 
									NumberofRHPSessions++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Handle = NumberofRHPSessions;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(pgm, "RHP");
 | 
				
			||||||
 | 
								Stream = FindFreeStreamNoSem();
 | 
				
			||||||
 | 
								strcpy(pgm, "bpq32.exe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Stream == 255)
 | 
				
			||||||
 | 
									return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								RHPSession->BPQStream = Stream;
 | 
				
			||||||
 | 
								RHPSession->Handle = Handle;
 | 
				
			||||||
 | 
								RHPSession->Connecting = TRUE;
 | 
				
			||||||
 | 
								RHPSession->Socket = Socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(RHPSession->Local, Local);
 | 
				
			||||||
 | 
								strcpy(RHPSession->Remote, Remote);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Connect(Stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ConvToAX25(Local, AXCall);
 | 
				
			||||||
 | 
								ChangeSessionCallsign(Stream, AXCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\"}", ID, Handle);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// {"type":"send","handle":1,"data":";;;;;;\r","id":70}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int ID;
 | 
				
			||||||
 | 
						char * Data;
 | 
				
			||||||
 | 
						char * ptr;
 | 
				
			||||||
 | 
						int c;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Data = malloc(strlen(Msg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID = GetJSONInt(Msg, "\"id\":");
 | 
				
			||||||
 | 
						Handle = GetJSONInt(Msg, "\"handle\":");
 | 
				
			||||||
 | 
						GetJSONValue(Msg, "\"data\":", Data, strlen(Msg) - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							free(Data);
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Look for \ escapes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr = Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (ptr = strchr(ptr, '\\'))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							c = ptr[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch (c)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case 'r':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								*ptr = 13;
 | 
				
			||||||
 | 
								break;	
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							case '\\':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								*ptr = '\\';
 | 
				
			||||||
 | 
								break;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case '"':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								*ptr = '"';
 | 
				
			||||||
 | 
								break;	
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
 | 
				
			||||||
 | 
							ptr++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Debugprintf(Data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Len = strlen(Data);
 | 
				
			||||||
 | 
						ptr = Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (Len > RHPPaclen)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
 | 
				
			||||||
 | 
							Len -= RHPPaclen;
 | 
				
			||||||
 | 
							ptr += RHPPaclen;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(Data);
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// {"id":70,"type":"close","handle":1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int ID;
 | 
				
			||||||
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char * OutBuffer = malloc(256);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID = GetJSONInt(Msg, "\"id\":");
 | 
				
			||||||
 | 
						Handle = GetJSONInt(Msg, "\"handle\":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
 | 
						Disconnect(RHPSession->BPQStream);
 | 
				
			||||||
 | 
						RHPSession->Connected = 0;
 | 
				
			||||||
 | 
						RHPSession->Connecting = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DeallocateStream(RHPSession->BPQStream);
 | 
				
			||||||
 | 
						RHPSession->BPQStream = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char toHex[] = "0123456789abcdef";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void RHPPoll()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int Stream;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
						int state, change;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
						char * RHPMsg;
 | 
				
			||||||
 | 
						unsigned char Buffer[2048];			// Space to escape control chars
 | 
				
			||||||
 | 
						int pktlen, count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (n = 0; n < NumberofRHPSessions; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							RHPSession = RHPSessions[n];
 | 
				
			||||||
 | 
							Stream = RHPSession->BPQStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// See if connected state has changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SessionState(Stream, &state, &change);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (change == 1)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (state == 1)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Connected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPSession->Seq = 0;
 | 
				
			||||||
 | 
									RHPSession->Connecting = FALSE;
 | 
				
			||||||
 | 
									RHPSession->Connected = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(256);
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Seq++, RHPSession->Handle);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Send RHP CTEXT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(256);
 | 
				
			||||||
 | 
									Sleep(10);			// otherwise WhatsPac doesn't display connected
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"Connected to RHP Server\\r\"}", RHPSession->Seq++, RHPSession->Handle);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Disconnected. Send Close to client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(256);
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"type\": \"close\", \"seqno\": %d, \"handle\": %d}", RHPSession->Seq++, RHPSession->Handle);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPSession->Connected = 0;
 | 
				
			||||||
 | 
									RHPSession->Connecting = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									DeallocateStream(RHPSession->BPQStream);
 | 
				
			||||||
 | 
									RHPSession->BPQStream = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							do
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								GetMsg(Stream, Buffer, &pktlen, &count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (pktlen > 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									char * ptr = Buffer;
 | 
				
			||||||
 | 
									unsigned char c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Buffer[pktlen] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Message is JSON so Convert CR to \r, \ to \\ " to \"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Looks like I need to escape everything not between 0x20 and 0x7f eg \U00c3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									while (c = *(ptr))
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										switch (c)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
										case 13:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											*(ptr++) = 'r';
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
										case '"':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											*(ptr++) = '"';
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
										case '\\':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											memmove(ptr + 2, ptr + 1, strlen(ptr) + 1);
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											*(ptr++) = '\\';
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
										default:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (c > 127)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												memmove(ptr + 6, ptr + 1, strlen(ptr) + 1);
 | 
				
			||||||
 | 
												*(ptr++) = '\\';
 | 
				
			||||||
 | 
												*(ptr++) = 'u';
 | 
				
			||||||
 | 
												*(ptr++) = '0';
 | 
				
			||||||
 | 
												*(ptr++) = '0';
 | 
				
			||||||
 | 
												*(ptr++) = toHex[c >> 4];
 | 
				
			||||||
 | 
												*(ptr++) = toHex[c & 15];
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											else	
 | 
				
			||||||
 | 
												ptr++;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPMsg = malloc(2048);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"%s\"}", RHPSession->Seq++, RHPSession->Handle, Buffer);
 | 
				
			||||||
 | 
									SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							while (count > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char * ptr1, * ptr2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Value[0] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 = strstr(_REPLYBUFFER, Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ptr1 == 0)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 += (strlen(Name) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	"data":"{\"t\":\"c\",\"n\":\"John\",\"c\":\"G8BPQ\",\"lm\":1737912636,\"le\":1737883907,\"led\":1737758451,\"v\":0.33,\"cc\":[{\"cid\":1,\"lp\":1737917257201,\"le\":1737913735726,\"led\":1737905249785},{\"cid\":0,\"lp\":1737324074107,\"le\":1737323831510,\"led\":1737322973662},{\"cid\":5,\"lp\":1737992107419,\"le\":1737931466510,\"led\":1737770056244}]}\r","id":28}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// There may be escaped " in data stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr2 = strchr(ptr1, '"');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (*(ptr2 - 1) == '\\')
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							ptr2 = strchr(ptr2 + 2, '"');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						if (ptr2)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							size_t ValLen = ptr2 - ptr1;
 | 
				
			||||||
 | 
							if (ValLen > Len)
 | 
				
			||||||
 | 
								ValLen = Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(Value, ptr1, ValLen);
 | 
				
			||||||
 | 
							Value[ValLen] = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int GetJSONInt(char * _REPLYBUFFER, char * Name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char * ptr1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 = strstr(_REPLYBUFFER, Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ptr1 == 0)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptr1 += (strlen(Name));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return atoi(ptr1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								RigControl.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								RigControl.c
									
									
									
									
									
								
							| 
						 | 
					@ -48,7 +48,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
#include <commctrl.h>
 | 
					#include <commctrl.h>
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						// Convert to CAT string
 | 
											// Convert to CAT string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						sprintf(FreqString, "%012d", txfreq);
 | 
											sprintf(FreqString, "%012lld", txfreq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						switch (PORT->PortType)
 | 
											switch (PORT->PortType)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
| 
						 | 
					@ -455,7 +455,7 @@ VOID Rig_PTTEx(struct RIGINFO * RIG, BOOL PTTState, struct TNCINFO * TNC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// Convert to CAT string
 | 
										// Convert to CAT string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					sprintf(FreqString, "%012d", txfreq);
 | 
										sprintf(FreqString, "%012lld", txfreq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					switch (PORT->PortType)
 | 
										switch (PORT->PortType)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
| 
						 | 
					@ -896,7 +896,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
 | 
				
			||||||
	// if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port
 | 
						// if Port starts with 'R' then select Radio (was Interlock) number, not BPQ Port
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Command[0] == 'R')
 | 
						if (Command[0] == 'R')
 | 
				
			||||||
		n = sscanf(Command,"%s %s %s %s %s", &Dummy, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
 | 
							n = sscanf(Command,"%s %s %s %s %s", &Dummy[0], &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
 | 
							n = sscanf(Command,"%d %s %s %s %s", &Port, &FreqString[0], &Mode[0], &FilterString[0], &Data[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1117,7 +1117,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_stricmp(FreqString, "POWER") == 0)
 | 
						if (_stricmp(FreqString, "POWER") == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char PowerString[8] = "";
 | 
							char PowerString[16] = "";
 | 
				
			||||||
		int Power = atoi(Mode);
 | 
							int Power = atoi(Mode);
 | 
				
			||||||
		int len;
 | 
							int len;
 | 
				
			||||||
		char cmd[80];
 | 
							char cmd[80];
 | 
				
			||||||
| 
						 | 
					@ -1291,7 +1291,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// use text command
 | 
								// use text command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Len = sprintf(CmdPtr, "%S", ptr1);
 | 
								Len = sprintf(CmdPtr, "%s", ptr1);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case YAESU:
 | 
							case YAESU:
 | 
				
			||||||
| 
						 | 
					@ -2072,7 +2072,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case HAMLIB:
 | 
						case HAMLIB:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char cmd[80];
 | 
							char cmd[200];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int len = sprintf(cmd, "F %s\n+f\nM %s %d\n+m\n",
 | 
							int len = sprintf(cmd, "F %s\n+f\nM %s %d\n+m\n",
 | 
				
			||||||
			FreqString, Mode, atoi(Data));
 | 
								FreqString, Mode, atoi(Data));
 | 
				
			||||||
| 
						 | 
					@ -7252,7 +7252,7 @@ CheckScan:
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if	(PORT->PortType == FT991A || PORT->PortType == FTDX10)
 | 
							else if	(PORT->PortType == FT991A || PORT->PortType == FTDX10)
 | 
				
			||||||
		{	
 | 
							{	
 | 
				
			||||||
			FreqPtr[0]->Cmd1Len = sprintf(CmdPtr, "FA%s;MD0%X;FA;MD0;", &FreqString, ModeNo);
 | 
								FreqPtr[0]->Cmd1Len = sprintf(CmdPtr, "FA%s;MD0%X;FA;MD0;", &FreqString[0], ModeNo);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if	(PORT->PortType == FT100 || PORT->PortType == FT990
 | 
							else if	(PORT->PortType == FT100 || PORT->PortType == FT990
 | 
				
			||||||
			|| PORT->PortType == FT1000)
 | 
								|| PORT->PortType == FT1000)
 | 
				
			||||||
| 
						 | 
					@ -8139,7 +8139,7 @@ void ProcessFLRIGFrame(struct RIGPORTINFO * PORT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void HLSetMode(SOCKET Sock, struct RIGINFO * RIG, unsigned char * Msg, char sep)
 | 
					void HLSetMode(SOCKET Sock, struct RIGINFO * RIG, unsigned char * Msg, char sep)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char Resp[80];
 | 
						char Resp[120];
 | 
				
			||||||
	int Len;
 | 
						int Len;
 | 
				
			||||||
	char mode[80] = "";
 | 
						char mode[80] = "";
 | 
				
			||||||
	int filter = 0;
 | 
						int filter = 0;
 | 
				
			||||||
| 
						 | 
					@ -10164,7 +10164,7 @@ VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
 | 
				
			||||||
VOID SDRANGELThread(struct RIGPORTINFO * PORT)
 | 
					VOID SDRANGELThread(struct RIGPORTINFO * PORT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Opens sockets and looks for data
 | 
						// Opens sockets and looks for data
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[512];
 | 
				
			||||||
	int err, i, ret;
 | 
						int err, i, ret;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
	BOOL bcopt=TRUE;
 | 
						BOOL bcopt=TRUE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,7 +78,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MaxStreams 10			// First is used for Pactor, even though Pactor uses channel 31
 | 
					#define MaxStreams 10			// First is used for Pactor, even though Pactor uses channel 31
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MaxStreams 10	
 | 
					#define MaxStreams 10	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MaxStreams 1	
 | 
					#define MaxStreams 1	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#include "bpq32.h"
 | 
					//#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include "stdio.h"
 | 
					#include "stdio.h"
 | 
				
			||||||
#include <fcntl.h>
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int C_Q_COUNT(VOID *PQ);
 | 
					int C_Q_COUNT(VOID *PQ);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _TCMDX
 | 
					typedef struct _TCMDX
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7157
									
								
								TelnetV6-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7157
									
								
								TelnetV6-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										63
									
								
								TelnetV6.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								TelnetV6.c
									
									
									
									
									
								
							| 
						 | 
					@ -37,7 +37,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#define IDM_DISCONNECT			2000
 | 
					#define IDM_DISCONNECT			2000
 | 
				
			||||||
#define IDM_LOGGING				2100
 | 
					#define IDM_LOGGING				2100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,11 @@ void processDRATSFrame(unsigned char * Message, int Len, struct ConnectionInfo *
 | 
				
			||||||
void DRATSConnectionLost(struct ConnectionInfo * sockptr);
 | 
					void DRATSConnectionLost(struct ConnectionInfo * sockptr);
 | 
				
			||||||
int BuildRigCtlPage(char * _REPLYBUFFER);
 | 
					int BuildRigCtlPage(char * _REPLYBUFFER);
 | 
				
			||||||
void ProcessWebmailWebSockThread(void * conn);
 | 
					void ProcessWebmailWebSockThread(void * conn);
 | 
				
			||||||
 | 
					void RHPThread(void * Params);
 | 
				
			||||||
 | 
					void ProcessRHPWebSockClosed(SOCKET socket);
 | 
				
			||||||
int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr);
 | 
					int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr);
 | 
				
			||||||
 | 
					int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
extern HKEY REGTREE;
 | 
					extern HKEY REGTREE;
 | 
				
			||||||
| 
						 | 
					@ -123,6 +127,8 @@ BOOL LogEnabled = FALSE;
 | 
				
			||||||
BOOL CMSLogEnabled = TRUE;
 | 
					BOOL CMSLogEnabled = TRUE;
 | 
				
			||||||
extern BOOL IncludesMail;
 | 
					extern BOOL IncludesMail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int HTTPPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static	HMENU hMenu, hPopMenu, hPopMenu2, hPopMenu3;		// handle of menu 
 | 
					static	HMENU hMenu, hPopMenu, hPopMenu2, hPopMenu3;		// handle of menu 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ProcessLine(char * buf, int Port);
 | 
					static int ProcessLine(char * buf, int Port);
 | 
				
			||||||
| 
						 | 
					@ -533,7 +539,7 @@ int ProcessLine(char * buf, int Port)
 | 
				
			||||||
		TCP->TriModePort = atoi(value);
 | 
							TCP->TriModePort = atoi(value);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	else if (_stricmp(param,"HTTPPORT") == 0)
 | 
						else if (_stricmp(param,"HTTPPORT") == 0)
 | 
				
			||||||
		TCP->HTTPPort = atoi(value);
 | 
							HTTPPort = TCP->HTTPPort = atoi(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	else if (_stricmp(param,"APIPORT") == 0)
 | 
						else if (_stricmp(param,"APIPORT") == 0)
 | 
				
			||||||
		TCP->APIPort = atoi(value);
 | 
							TCP->APIPort = atoi(value);
 | 
				
			||||||
| 
						 | 
					@ -4967,6 +4973,15 @@ MsgLoop:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char * RigWebPage;
 | 
					extern char * RigWebPage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct RHPParamBlock
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned char * Msg;
 | 
				
			||||||
 | 
						int Len;
 | 
				
			||||||
 | 
						SOCKET Socket;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream)
 | 
					int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, int Stream)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret;
 | 
						int w =1, x= 1, len=0, y = 2, maxlen, InputLen, ret;
 | 
				
			||||||
| 
						 | 
					@ -4989,10 +5004,24 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// Failed or closed - clear connection
 | 
							// Failed or closed - clear connection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// if Websock connection till app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->WebSocks)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ProcessRHPWebSockClosed(sockptr->socket);	
 | 
				
			||||||
 | 
									DataSocket_Disconnect(TNC, sockptr);
 | 
				
			||||||
 | 
									return 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
			TNC->Streams[sockptr->Number].ReportDISC = TRUE;		//Tell Node
 | 
								TNC->Streams[sockptr->Number].ReportDISC = TRUE;		//Tell Node
 | 
				
			||||||
			DataSocket_Disconnect(TNC, sockptr);
 | 
								DataSocket_Disconnect(TNC, sockptr);
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MsgPtr = &sockptr->InputBuffer[0];
 | 
						MsgPtr = &sockptr->InputBuffer[0];
 | 
				
			||||||
	sockptr->InputLen += len;
 | 
						sockptr->InputLen += len;
 | 
				
			||||||
| 
						 | 
					@ -5008,6 +5037,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
		int Fin, Opcode, Len, Mask;
 | 
							int Fin, Opcode, Len, Mask;
 | 
				
			||||||
		char MaskingKey[4];
 | 
							char MaskingKey[4];
 | 
				
			||||||
		char * ptr;
 | 
							char * ptr;
 | 
				
			||||||
 | 
							char * Payload;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 +-+-+-+-+-------+-+-------------+-------------------------------+
 | 
							 +-+-+-+-+-------+-+-------------+-------------------------------+
 | 
				
			||||||
| 
						 | 
					@ -5035,8 +5065,20 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
		Opcode = MsgPtr[0] & 15;
 | 
							Opcode = MsgPtr[0] & 15;
 | 
				
			||||||
		Mask = MsgPtr[1] >> 7;
 | 
							Mask = MsgPtr[1] >> 7;
 | 
				
			||||||
		Len = MsgPtr[1] & 127;
 | 
							Len = MsgPtr[1] & 127;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Len == 126)		// Two Byte Len
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Len = (MsgPtr[2] << 8) + MsgPtr[3];
 | 
				
			||||||
 | 
								memcpy(MaskingKey, &MsgPtr[4], 4);
 | 
				
			||||||
 | 
								ptr = &MsgPtr[8];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
			memcpy(MaskingKey, &MsgPtr[2], 4);
 | 
								memcpy(MaskingKey, &MsgPtr[2], 4);
 | 
				
			||||||
			ptr = &MsgPtr[6];
 | 
								ptr = &MsgPtr[6];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Payload = ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (i = 0; i < Len; i++)
 | 
							for (i = 0; i < Len; i++)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -5058,7 +5100,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				char RigCMD[64];
 | 
									char RigCMD[64];
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				sprintf(RigCMD, "%s PTT", &MsgPtr[6]);
 | 
									sprintf(RigCMD, "%s PTT", Payload);
 | 
				
			||||||
				Rig_Command( (TRANSPORTENTRY *) -1, RigCMD);
 | 
									Rig_Command( (TRANSPORTENTRY *) -1, RigCMD);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0)
 | 
								else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0)
 | 
				
			||||||
| 
						 | 
					@ -5072,6 +5114,21 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
				_beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy);				// Needs big stack
 | 
									_beginthread(ProcessWebmailWebSockThread, 2048000, (VOID *)sockcopy);				// Needs big stack
 | 
				
			||||||
				return 0;
 | 
									return 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Run in thread as it may block;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									ParamBlock->Socket = sockptr->socket;
 | 
				
			||||||
 | 
									ParamBlock->Len = Len;
 | 
				
			||||||
 | 
									ParamBlock->Msg = malloc(Len + 10);
 | 
				
			||||||
 | 
									memcpy(ParamBlock->Msg, Payload, Len);
 | 
				
			||||||
 | 
									_beginthread(RHPThread, 0, (VOID *)ParamBlock);	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
									sockptr->InputLen = 0;
 | 
				
			||||||
 | 
									return 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
 | 
								Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								UIARQ.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								UIARQ.c
									
									
									
									
									
								
							| 
						 | 
					@ -23,7 +23,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
					extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,8 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
// UI Handling Routines
 | 
					// UI Handling Routines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char UIDEST[10] = "FBB";
 | 
					char UIDEST[10] = "FBB";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								V4.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								V4.c
									
									
									
									
									
								
							| 
						 | 
					@ -36,7 +36,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#define SD_BOTH         0x02
 | 
					#define SD_BOTH         0x02
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								VARA.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								VARA.c
									
									
									
									
									
								
							| 
						 | 
					@ -28,7 +28,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
#include <Psapi.h>
 | 
					#include <Psapi.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										125
									
								
								Versions-skigdebian.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								Versions-skigdebian.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,125 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef Kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 5,2,9,2
 | 
				
			||||||
 | 
					#define Verstring "5.2.9.2\0"
 | 
				
			||||||
 | 
					#define Datestring "September 2012"
 | 
				
			||||||
 | 
					#define VerComments "G8BPQ Packet Switch V5.2.9.2\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2001-2012 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "BPQ32 Switch\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define KVers 6,0,24,59
 | 
				
			||||||
 | 
					#define KVerstring "6.0.24.59\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CKernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers KVers
 | 
				
			||||||
 | 
					#define Verstring KVerstring
 | 
				
			||||||
 | 
					#define Datestring "January 2025"
 | 
				
			||||||
 | 
					#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "BPQ32 Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQ32"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef TermTCP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 1,0,16,2
 | 
				
			||||||
 | 
					#define Verstring "1.0.16.2\0"
 | 
				
			||||||
 | 
					#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQTermTCP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BPQTerm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 2,2,5,2
 | 
				
			||||||
 | 
					#define Verstring "2.2.5.2\0"
 | 
				
			||||||
 | 
					#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQTerminal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BPQTermMDI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 2,2,0,3
 | 
				
			||||||
 | 
					#define Verstring "2.2.0.3\0"
 | 
				
			||||||
 | 
					#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef MAIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers KVers
 | 
				
			||||||
 | 
					#define Verstring KVerstring
 | 
				
			||||||
 | 
					#define VerComments "Mail server for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQMail"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HOSTMODES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 1,1,8,1
 | 
				
			||||||
 | 
					#define Verstring "1.1.8.1\0"
 | 
				
			||||||
 | 
					//#define SPECIALVERSION "Test 3"
 | 
				
			||||||
 | 
					#define VerComments "Host Modes Emulator for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2009-2019 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Host Modes Emulator for G8BPQ's 32 Bit Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQHostModes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef UIUTIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 0,1,3,1
 | 
				
			||||||
 | 
					#define Verstring "0.1.3.1\0"
 | 
				
			||||||
 | 
					#define VerComments "Beacon Utility for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2011-2019 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Beacon Utility for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQUIUtil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef AUTH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers 0,1,0,0
 | 
				
			||||||
 | 
					#define Verstring "0.1.0.0\0"
 | 
				
			||||||
 | 
					#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef APRS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define Vers KVers
 | 
				
			||||||
 | 
					#define Verstring KVerstring
 | 
				
			||||||
 | 
					#define VerComments  "APRS Client for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "APRS Client for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQAPRS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CHAT
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					#define Vers KVers
 | 
				
			||||||
 | 
					#define Verstring KVerstring
 | 
				
			||||||
 | 
					#define VerComments "Chat server for G8BPQ Packet Switch\0"
 | 
				
			||||||
 | 
					#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
 | 
					#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
 | 
				
			||||||
 | 
					#define VerProduct "BPQChat"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										22
									
								
								Versions.h
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								Versions.h
									
									
									
									
									
								
							| 
						 | 
					@ -10,16 +10,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define KVers 6,0,24,56
 | 
					#define KVers 6,0,24,59
 | 
				
			||||||
#define KVerstring "6.0.24.56\0"
 | 
					#define KVerstring "6.0.24.59\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CKernel
 | 
					#ifdef CKernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define Vers KVers
 | 
					#define Vers KVers
 | 
				
			||||||
#define Verstring KVerstring
 | 
					#define Verstring KVerstring
 | 
				
			||||||
#define Datestring "December 2024"
 | 
					#define Datestring "February 2025"
 | 
				
			||||||
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
 | 
					#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
 | 
				
			||||||
#define VerCopyright "Copyright © 2001-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "BPQ32 Switch\0"
 | 
					#define VerDesc "BPQ32 Switch\0"
 | 
				
			||||||
#define VerProduct "BPQ32"
 | 
					#define VerProduct "BPQ32"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
#define Vers 1,0,16,2
 | 
					#define Vers 1,0,16,2
 | 
				
			||||||
#define Verstring "1.0.16.2\0"
 | 
					#define Verstring "1.0.16.2\0"
 | 
				
			||||||
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
 | 
					#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 2011-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
 | 
					#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
 | 
				
			||||||
#define VerProduct "BPQTermTCP"
 | 
					#define VerProduct "BPQTermTCP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@
 | 
				
			||||||
#define Vers 2,2,5,2
 | 
					#define Vers 2,2,5,2
 | 
				
			||||||
#define Verstring "2.2.5.2\0"
 | 
					#define Verstring "2.2.5.2\0"
 | 
				
			||||||
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
 | 
					#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 1999-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
 | 
					#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
 | 
				
			||||||
#define VerProduct "BPQTerminal"
 | 
					#define VerProduct "BPQTerminal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,7 +52,7 @@
 | 
				
			||||||
#define Vers 2,2,0,3
 | 
					#define Vers 2,2,0,3
 | 
				
			||||||
#define Verstring "2.2.0.3\0"
 | 
					#define Verstring "2.2.0.3\0"
 | 
				
			||||||
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
 | 
					#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 1999-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
 | 
					#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@
 | 
				
			||||||
#define Vers KVers
 | 
					#define Vers KVers
 | 
				
			||||||
#define Verstring KVerstring
 | 
					#define Verstring KVerstring
 | 
				
			||||||
#define VerComments "Mail server for G8BPQ Packet Switch\0"
 | 
					#define VerComments "Mail server for G8BPQ Packet Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 2009-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
 | 
					#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
 | 
				
			||||||
#define VerProduct "BPQMail"
 | 
					#define VerProduct "BPQMail"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,7 +97,7 @@
 | 
				
			||||||
#define Vers 0,1,0,0
 | 
					#define Vers 0,1,0,0
 | 
				
			||||||
#define Verstring "0.1.0.0\0"
 | 
					#define Verstring "0.1.0.0\0"
 | 
				
			||||||
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
 | 
					#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 2011-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
 | 
					#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,7 @@
 | 
				
			||||||
#define Vers KVers
 | 
					#define Vers KVers
 | 
				
			||||||
#define Verstring KVerstring
 | 
					#define Verstring KVerstring
 | 
				
			||||||
#define VerComments  "APRS Client for G8BPQ Switch\0"
 | 
					#define VerComments  "APRS Client for G8BPQ Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 2012-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "APRS Client for G8BPQ Switch\0"
 | 
					#define VerDesc "APRS Client for G8BPQ Switch\0"
 | 
				
			||||||
#define VerProduct "BPQAPRS"
 | 
					#define VerProduct "BPQAPRS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,7 +118,7 @@
 | 
				
			||||||
#define Vers KVers
 | 
					#define Vers KVers
 | 
				
			||||||
#define Verstring KVerstring
 | 
					#define Verstring KVerstring
 | 
				
			||||||
#define VerComments "Chat server for G8BPQ Packet Switch\0"
 | 
					#define VerComments "Chat server for G8BPQ Packet Switch\0"
 | 
				
			||||||
#define VerCopyright "Copyright © 2009-2024 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
 | 
					#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
 | 
				
			||||||
#define VerProduct "BPQChat"
 | 
					#define VerProduct "BPQChat"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								WINMOR.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								WINMOR.c
									
									
									
									
									
								
							| 
						 | 
					@ -70,7 +70,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
#include <Psapi.h>
 | 
					#include <Psapi.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										21
									
								
								WPRoutines.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								WPRoutines.c
									
									
									
									
									
								
							| 
						 | 
					@ -23,6 +23,9 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int CurrentWPIndex;
 | 
					int CurrentWPIndex;
 | 
				
			||||||
char CurrentWPCall[10];
 | 
					char CurrentWPCall[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,7 +124,7 @@ VOID GetWPDatabase()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			sprintf(Key, "R%d", i++);
 | 
								sprintf(Key, "R%d", i++);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			GetStringValue(group, Key, Record);
 | 
								GetStringValue(group, Key, Record, 1024);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (Record[0] == 0)			// End of List
 | 
								if (Record[0] == 0)			// End of List
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
| 
						 | 
					@ -269,23 +272,23 @@ WPOK:;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		memset(&WPRec, 0, sizeof(WPRec));
 | 
							memset(&WPRec, 0, sizeof(WPRec));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		GetStringValue(wpgroup, "c", WPRec.callsign);
 | 
							GetStringValue(wpgroup, "c", WPRec.callsign, 6);
 | 
				
			||||||
		GetStringValue(wpgroup, "n", WPRec.name);
 | 
							GetStringValue(wpgroup, "n", WPRec.name, 12);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		WPRec.Type = GetIntValue(wpgroup, "T");
 | 
							WPRec.Type = GetIntValue(wpgroup, "T");
 | 
				
			||||||
		WPRec.changed = GetIntValue(wpgroup, "ch");
 | 
							WPRec.changed = GetIntValue(wpgroup, "ch");
 | 
				
			||||||
		WPRec.seen = GetIntValue(wpgroup, "s");
 | 
							WPRec.seen = GetIntValue(wpgroup, "s");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		GetStringValue(wpgroup, "h", WPRec.first_homebbs);
 | 
							GetStringValue(wpgroup, "h", WPRec.first_homebbs, 40);
 | 
				
			||||||
		GetStringValue(wpgroup, "sh", WPRec.secnd_homebbs);
 | 
							GetStringValue(wpgroup, "sh", WPRec.secnd_homebbs, 40);
 | 
				
			||||||
		GetStringValue(wpgroup, "z", WPRec.first_zip);
 | 
							GetStringValue(wpgroup, "z", WPRec.first_zip, 8);
 | 
				
			||||||
		GetStringValue(wpgroup, "sz", WPRec.secnd_zip);
 | 
							GetStringValue(wpgroup, "sz", WPRec.secnd_zip, 8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		GetStringValue(wpgroup, "q", Temp);
 | 
							GetStringValue(wpgroup, "q", Temp, 30);
 | 
				
			||||||
		Temp[30] = 0;
 | 
							Temp[30] = 0;
 | 
				
			||||||
		strcpy(WPRec.first_qth, Temp);
 | 
							strcpy(WPRec.first_qth, Temp);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		GetStringValue(wpgroup, "sq", Temp);
 | 
							GetStringValue(wpgroup, "sq", Temp, 30);
 | 
				
			||||||
		Temp[30] = 0;
 | 
							Temp[30] = 0;
 | 
				
			||||||
		strcpy(WPRec.secnd_qth, Temp);
 | 
							strcpy(WPRec.secnd_qth, Temp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE 
 | 
					#define _CRT_SECURE_NO_DEPRECATE 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAIL
 | 
					#define MAIL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								WinRPR.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								WinRPR.c
									
									
									
									
									
								
							| 
						 | 
					@ -31,7 +31,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MaxStreams 1	
 | 
					#define MaxStreams 1	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								adif.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								adif.c
									
									
									
									
									
								
							| 
						 | 
					@ -26,7 +26,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "time.h"
 | 
					#include "time.h"
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#include "adif.h"
 | 
					#include "adif.h"
 | 
				
			||||||
#include "telnetserver.h"
 | 
					#include "telnetserver.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1044,6 +1044,8 @@ struct SEM
 | 
				
			||||||
	int Rels;
 | 
						int Rels;
 | 
				
			||||||
	DWORD SemProcessID;
 | 
						DWORD SemProcessID;
 | 
				
			||||||
	DWORD SemThreadID;
 | 
						DWORD SemThreadID;
 | 
				
			||||||
 | 
						int Line;		// caller file and line
 | 
				
			||||||
 | 
						char File[MAX_PATH];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										16
									
								
								bpqaxip.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								bpqaxip.c
									
									
									
									
									
								
							| 
						 | 
					@ -141,7 +141,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#ifndef WIN32
 | 
					#ifndef WIN32
 | 
				
			||||||
#include <sys/socket.h>
 | 
					#include <sys/socket.h>
 | 
				
			||||||
#include <netinet/in.h>
 | 
					#include <netinet/in.h>
 | 
				
			||||||
| 
						 | 
					@ -3246,15 +3246,21 @@ VOID SaveAXIPCache(struct AXIPPORTINFO * PORT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static BOOL GetStringValue(config_setting_t * group, char * name, char * value)
 | 
					static BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char * str;
 | 
						char * str;
 | 
				
			||||||
	config_setting_t *setting;
 | 
						config_setting_t *setting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setting = config_setting_get_member (group, name);
 | 
						setting = config_setting_get_member (group, name);
 | 
				
			||||||
	if (setting)
 | 
						if (setting)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		str =  config_setting_get_string (setting);
 | 
							str =  (char *)config_setting_get_string (setting);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (strlen(str) > maxlen)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Debugprintf("Suspect config record %s", str);
 | 
				
			||||||
 | 
								str[maxlen] = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		strcpy(value, str);
 | 
							strcpy(value, str);
 | 
				
			||||||
		return TRUE;
 | 
							return TRUE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -3321,7 +3327,7 @@ VOID GetAXIPCache(struct AXIPPORTINFO * PORT)
 | 
				
			||||||
			ptr++;
 | 
								ptr++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (GetStringValue(group, Key, hostaddr))
 | 
							if (GetStringValue(group, Key, hostaddr, 64))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			arp->destaddr.sin_addr.s_addr = inet_addr(hostaddr);
 | 
								arp->destaddr.sin_addr.s_addr = inet_addr(hostaddr);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -603,7 +603,7 @@ VOID __cdecl nprintf(ChatCIRCUIT * conn, const char * format, ...);
 | 
				
			||||||
VOID nputs(ChatCIRCUIT * conn, char * buf);
 | 
					VOID nputs(ChatCIRCUIT * conn, char * buf);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
BOOL matchi(char * p1, char * p2);
 | 
					BOOL matchi(char * p1, char * p2);
 | 
				
			||||||
char * strlop(const char * buf, char delim);
 | 
					char * strlop(char * buf, char delim);
 | 
				
			||||||
int rt_cmd(ChatCIRCUIT *circuit, char * Buffer);
 | 
					int rt_cmd(ChatCIRCUIT *circuit, char * Buffer);
 | 
				
			||||||
ChatCIRCUIT *circuit_new(ChatCIRCUIT *circuit, int flags);
 | 
					ChatCIRCUIT *circuit_new(ChatCIRCUIT *circuit, int flags);
 | 
				
			||||||
void makelinks(void);
 | 
					void makelinks(void);
 | 
				
			||||||
| 
						 | 
					@ -687,7 +687,11 @@ int RemoveLF(char * Message, int len);
 | 
				
			||||||
struct SEM;
 | 
					struct SEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL isdigits(char * string);
 | 
					BOOL isdigits(char * string);
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore);
 | 
					void FreeSemaphore(struct SEM * Semaphore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID __cdecl Debugprintf(const char * format, ...);
 | 
					VOID __cdecl Debugprintf(const char * format, ...);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,7 +52,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#include <time.h>
 | 
					//#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include <process.h>
 | 
					#include <process.h>
 | 
				
			||||||
#include "pcap.h"
 | 
					#include "pcap.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								bpqmail.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								bpqmail.h
									
									
									
									
									
								
							| 
						 | 
					@ -33,7 +33,7 @@
 | 
				
			||||||
#include "BPQMailrc.h"
 | 
					#include "BPQMailrc.h"
 | 
				
			||||||
#include "dbghelp.h"
 | 
					#include "dbghelp.h"
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "asmstrucs.h"
 | 
					#include "asmstrucs.h"
 | 
				
			||||||
| 
						 | 
					@ -879,7 +879,7 @@ struct MSESSION
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...);
 | 
					VOID __cdecl nprintf(CIRCUIT * conn, const char * format, ...);
 | 
				
			||||||
char * strlop(const char * buf, char delim);
 | 
					char * strlop(char * buf, char delim);
 | 
				
			||||||
int rt_cmd(CIRCUIT *circuit, char * Buffer);
 | 
					int rt_cmd(CIRCUIT *circuit, char * Buffer);
 | 
				
			||||||
CIRCUIT *circuit_new(CIRCUIT *circuit, int flags);
 | 
					CIRCUIT *circuit_new(CIRCUIT *circuit, int flags);
 | 
				
			||||||
VOID BBSputs(CIRCUIT * conn, char * buf);
 | 
					VOID BBSputs(CIRCUIT * conn, char * buf);
 | 
				
			||||||
| 
						 | 
					@ -1173,7 +1173,7 @@ int ProcessConnecting(CIRCUIT * circuit, char * Buffer, int Len);
 | 
				
			||||||
VOID SaveConfig(char * ConfigName);
 | 
					VOID SaveConfig(char * ConfigName);
 | 
				
			||||||
BOOL GetConfig(char * ConfigName);
 | 
					BOOL GetConfig(char * ConfigName);
 | 
				
			||||||
int GetIntValue(config_setting_t * group, char * name);
 | 
					int GetIntValue(config_setting_t * group, char * name);
 | 
				
			||||||
BOOL GetStringValue(config_setting_t * group, char * name, char * value);
 | 
					//BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
 | 
				
			||||||
BOOL GetConfigFromRegistry();
 | 
					BOOL GetConfigFromRegistry();
 | 
				
			||||||
VOID Parse_SID(CIRCUIT * conn, char * SID, int len);
 | 
					VOID Parse_SID(CIRCUIT * conn, char * SID, int len);
 | 
				
			||||||
VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len);
 | 
					VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len);
 | 
				
			||||||
| 
						 | 
					@ -1289,7 +1289,9 @@ int RemoveLF(char * Message, int len);
 | 
				
			||||||
// Utilities
 | 
					// Utilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL isdigits(char * string);
 | 
					BOOL isdigits(char * string);
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore);
 | 
					void FreeSemaphore(struct SEM * Semaphore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID __cdecl Debugprintf(const char * format, ...);
 | 
					VOID __cdecl Debugprintf(const char * format, ...);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef unsigned char byte;
 | 
					typedef unsigned char byte;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpqvkiss.h"
 | 
					#include "bpqvkiss.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2788
									
								
								cMain-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2788
									
								
								cMain-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										11
									
								
								cMain.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								cMain.c
									
									
									
									
									
								
							| 
						 | 
					@ -34,7 +34,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#include <fcntl.h>					 
 | 
					#include <fcntl.h>					 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "kernelresource.h"
 | 
					#include "kernelresource.h"
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#include "mqtt.h"
 | 
					#include "mqtt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2468,7 +2468,7 @@ VOID DoListenMonitor(TRANSPORTENTRY * L4, MESSAGE * Msg)
 | 
				
			||||||
	PDATAMESSAGE Buffer;
 | 
						PDATAMESSAGE Buffer;
 | 
				
			||||||
	char MonBuffer[1024];
 | 
						char MonBuffer[1024];
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
 | 
						struct tm * TM;
 | 
				
			||||||
	UCHAR * monchars = (UCHAR *)Msg;
 | 
						UCHAR * monchars = (UCHAR *)Msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (CountFramesQueuedOnSession(L4) > 10)
 | 
						if (CountFramesQueuedOnSession(L4) > 10)
 | 
				
			||||||
| 
						 | 
					@ -2479,13 +2479,18 @@ VOID DoListenMonitor(TRANSPORTENTRY * L4, MESSAGE * Msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	IntSetTraceOptionsEx(L4->LISTEN, 1, 0, 0);
 | 
						IntSetTraceOptionsEx(L4->LISTEN, 1, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = IntDecodeFrame(Msg, MonBuffer, Msg->Timestamp, L4->LISTEN, FALSE, TRUE);
 | 
						TM = gmtime(&Msg->Timestamp);
 | 
				
			||||||
 | 
						sprintf(MonBuffer, "%02d:%02d:%02d ", TM->tm_hour, TM->tm_min, TM->tm_sec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						len = IntDecodeFrame(Msg, &MonBuffer[9], Msg->Timestamp, L4->LISTEN, FALSE, TRUE);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
 | 
						IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len == 0)
 | 
						if (len == 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						len += 9;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len > 256)
 | 
						if (len > 256)
 | 
				
			||||||
		len = 256;
 | 
							len = 256;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
// Prototypes for BPQ32 Node Functions
 | 
					// Prototypes for BPQ32 Node Functions
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DllImport
 | 
					#define DllImport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EXCLUDEBITS
 | 
					#define EXCLUDEBITS
 | 
				
			||||||
| 
						 | 
					@ -30,6 +31,9 @@ int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BO
 | 
				
			||||||
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
 | 
					int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
 | 
				
			||||||
int CountBits64(uint64_t in);
 | 
					int CountBits64(uint64_t in);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GetBuff() _GetBuff(__FILE__, __LINE__)
 | 
					#define GetBuff() _GetBuff(__FILE__, __LINE__)
 | 
				
			||||||
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
 | 
					#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
 | 
				
			||||||
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
 | 
					#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
 | 
				
			||||||
| 
						 | 
					@ -64,13 +68,13 @@ DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
 | 
				
			||||||
										 int * port, int * sesstype, int * paclen,
 | 
															 int * port, int * sesstype, int * paclen,
 | 
				
			||||||
										 int * maxframe, int * l4window);
 | 
															 int * maxframe, int * l4window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LIBCONFIG_STATIC
 | 
				
			||||||
 | 
					#include "libconfig.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct config_setting_t;
 | 
					int GetIntValue(config_setting_t * group, char * name);
 | 
				
			||||||
 | 
					BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
 | 
				
			||||||
int GetIntValue(struct config_setting_t * group, char * name);
 | 
					VOID SaveIntValue(config_setting_t * group, char * name, int value);
 | 
				
			||||||
BOOL GetStringValue(struct config_setting_t * group, char * name, char * value);
 | 
					VOID SaveStringValue(config_setting_t * group, char * name, char * value);
 | 
				
			||||||
VOID SaveIntValue(struct config_setting_t * group, char * name, int value);
 | 
					 | 
				
			||||||
VOID SaveStringValue(struct config_setting_t * group, char * name, char * value);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int EncryptPass(char * Pass, char * Encrypt);
 | 
					int EncryptPass(char * Pass, char * Encrypt);
 | 
				
			||||||
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
 | 
					VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
 | 
				
			||||||
| 
						 | 
					@ -92,7 +96,7 @@ VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
 | 
				
			||||||
VOID DoTheCommand(TRANSPORTENTRY * Session);
 | 
					VOID DoTheCommand(TRANSPORTENTRY * Session);
 | 
				
			||||||
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
 | 
					char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
 | 
				
			||||||
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
 | 
					VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
 | 
				
			||||||
char * strlop(const char * buf, char delim);
 | 
					char * strlop(char * buf, char delim);
 | 
				
			||||||
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
 | 
					BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID PostDataAvailable(TRANSPORTENTRY * Session);
 | 
					VOID PostDataAvailable(TRANSPORTENTRY * Session);
 | 
				
			||||||
| 
						 | 
					@ -155,7 +159,7 @@ Dll int APIENTRY SaveNodes ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct SEM;
 | 
					struct SEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GetSemaphore(struct SEM * Semaphore, int ID);
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
void FreeSemaphore(struct SEM * Semaphore);
 | 
					void FreeSemaphore(struct SEM * Semaphore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MySetWindowText(HWND hWnd, char * Msg);
 | 
					void MySetWindowText(HWND hWnd, char * Msg);
 | 
				
			||||||
							
								
								
									
										5
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								config.c
									
									
									
									
									
								
							| 
						 | 
					@ -119,7 +119,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
| 
						 | 
					@ -512,7 +512,6 @@ BOOL ProcessConfig()
 | 
				
			||||||
	if ((fp1 = fopen(inputname,"r")) == NULL)
 | 
						if ((fp1 = fopen(inputname,"r")) == NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		Consoleprintf("Could not open file %s Error code %d", inputname, errno);
 | 
							Consoleprintf("Could not open file %s Error code %d", inputname, errno);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1532,7 +1531,7 @@ int dotext(char * val, char * key_word, int max)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len > max)
 | 
						if (len > max)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		Consoleprintf("Text too long: %s\r\n",key_word);
 | 
							Consoleprintf("Text too long: %s (max %d\r\n",key_word, max);
 | 
				
			||||||
		return(0);
 | 
							return(0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								kiss.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								kiss.c
									
									
									
									
									
								
							| 
						 | 
					@ -77,7 +77,7 @@ int i2c_smbus_read_byte()
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "mqtt.h"
 | 
					#include "mqtt.h"
 | 
				
			||||||
#include "kiss.h"
 | 
					#include "kiss.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <sys/socket.h>
 | 
					#include <sys/socket.h>
 | 
				
			||||||
#include <linux/if_packet.h>
 | 
					#include <linux/if_packet.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -764,14 +764,14 @@ BOOL CheckifPacket(char * Via)
 | 
				
			||||||
		return TRUE;			// Packet
 | 
							return TRUE;			// Packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ptr1 is last element. If a valid continent, it is a packet message
 | 
						// ptr1 is last element. If a valid continent, it is a packet message
 | 
				
			||||||
	
 | 
						// should really accept .WW on end as it is valid 
 | 
				
			||||||
	if (FindContinent(ptr1))
 | 
						if (FindContinent(ptr1))
 | 
				
			||||||
		return TRUE;			// Packet
 | 
							return TRUE;			// Packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (FindCountry(ptr1))
 | 
						if (FindCountry(ptr1))
 | 
				
			||||||
		return TRUE;			// Packet
 | 
							return TRUE;			// Packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((_stricmp(ptr1, "MARS") == 0) || (_stricmp(ptr1, "USA") == 0))		// MARS used both
 | 
						if ((_stricmp(ptr1, "MARS") == 0) || (_stricmp(ptr1, "USA") == 0) || (_stricmp(ptr1, "WW") == 0))		// MARS used both MARS and USA
 | 
				
			||||||
		return TRUE;			// Packet
 | 
							return TRUE;			// Packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
 | 
					#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#include <windows.h>
 | 
					//#include <windows.h>
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
#include "httpconnectioninfo.h"
 | 
					#include "httpconnectioninfo.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								makefile
									
									
									
									
									
								
							| 
						 | 
					@ -13,21 +13,21 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
 | 
				
			||||||
 MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
 | 
					 MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
 | 
				
			||||||
 NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
 | 
					 NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
 | 
				
			||||||
 SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o  UIRoutines.o AGWAPI.o AGWMoncode.o \
 | 
					 SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o  UIRoutines.o AGWAPI.o AGWMoncode.o \
 | 
				
			||||||
 DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o
 | 
					 DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o RHP.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configuration:
 | 
					# Configuration:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CC = gcc
 | 
					CC = gcc
 | 
				
			||||||
		                       
 | 
							                       
 | 
				
			||||||
all: CFLAGS = -DLINBPQ -MMD -g -fcommon
 | 
					all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon
 | 
				
			||||||
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
 | 
					all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
 | 
				
			||||||
all: linbpq
 | 
					all: linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -DNOMQTT
 | 
					nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g  -rdynamic -DNOMQTT
 | 
				
			||||||
nomqtt: linbpq
 | 
					nomqtt: linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -fcommon
 | 
					noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g  -rdynamic -fcommon
 | 
				
			||||||
noi2c: linbpq
 | 
					noi2c: linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										43
									
								
								makefile~
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								makefile~
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					#	LinBPQ Makefile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	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\
 | 
				
			||||||
 | 
					 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\
 | 
				
			||||||
 | 
					 AEAPactor.o HALDriver.o MULTIPSK.o BBSHTMLConfig.o ChatHTMLConfig.o BBSUtilities.o bpqaxip.o\
 | 
				
			||||||
 | 
					 BPQINP3.o BPQNRR.o cMain.o Cmd.o CommonCode.o HTMLCommonCode.o compatbits.o config.o datadefs.o \
 | 
				
			||||||
 | 
					 FBBRoutines.o HFCommon.o Housekeeping.o HTTPcode.o kiss.o L2Code.o L3Code.o L4Code.o lzhuf32.o \
 | 
				
			||||||
 | 
					 MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
 | 
				
			||||||
 | 
					 NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
 | 
				
			||||||
 | 
					 SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o  UIRoutines.o AGWAPI.o AGWMoncode.o \
 | 
				
			||||||
 | 
					 DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Configuration:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CC = gcc
 | 
				
			||||||
 | 
							                       
 | 
				
			||||||
 | 
					all: CFLAGS = -DLINBPQ -MMD -g -fcommon
 | 
				
			||||||
 | 
					all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
 | 
				
			||||||
 | 
					all: linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -DNOMQTT
 | 
				
			||||||
 | 
					nomqtt: linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -fcommon
 | 
				
			||||||
 | 
					noi2c: linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq: $(OBJS)
 | 
				
			||||||
 | 
						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		
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-include *.d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean :
 | 
				
			||||||
 | 
						rm *.d
 | 
				
			||||||
 | 
						rm linbpq $(OBJS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								mqtt.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mqtt.c
									
									
									
									
									
								
							| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
#include <jansson.h>
 | 
					#include <jansson.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "asmstrucs.h"
 | 
					#include "asmstrucs.h"
 | 
				
			||||||
#include "mqtt.h"
 | 
					#include "mqtt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										858
									
								
								nodeapi-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										858
									
								
								nodeapi-skigdebian.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,858 @@
 | 
				
			||||||
 | 
					// basic JASON API to BPQ Node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Authentication is via Telnet USER records.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					#include "asmstrucs.h"
 | 
				
			||||||
 | 
					#include "kiss.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Constants
 | 
				
			||||||
 | 
					#define TOKEN_SIZE 32 // Length of the authentication token
 | 
				
			||||||
 | 
					#define TOKEN_EXPIRATION 7200 // Token expiration time in seconds (2 hours)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Token data structure
 | 
				
			||||||
 | 
					typedef struct Token {
 | 
				
			||||||
 | 
						char token[TOKEN_SIZE + 1];
 | 
				
			||||||
 | 
						time_t expiration_time;
 | 
				
			||||||
 | 
						struct Token* next;
 | 
				
			||||||
 | 
					} Token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct API
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *URL;
 | 
				
			||||||
 | 
						int URLLen;
 | 
				
			||||||
 | 
						int (* APIRoutine)(char * response, char * token, char * param);
 | 
				
			||||||
 | 
						int Auth;
 | 
				
			||||||
 | 
					} API;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Auth defines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define AuthNone 0
 | 
				
			||||||
 | 
					#define AuthUser 1
 | 
				
			||||||
 | 
					#define Auth BBSUser 2
 | 
				
			||||||
 | 
					#define AuthSysop 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function prototypes
 | 
				
			||||||
 | 
					void handle_request(SOCKET client_socket, char * request, char * response);
 | 
				
			||||||
 | 
					int verify_token(const char* token);
 | 
				
			||||||
 | 
					void remove_expired_tokens();
 | 
				
			||||||
 | 
					char* fetch_data(const char* endpoint);
 | 
				
			||||||
 | 
					int  request_token(char * response);
 | 
				
			||||||
 | 
					int send_http_response(char * response, const char* msg);
 | 
				
			||||||
 | 
					int create_json_response(char * response, char* access_token, int expires_in, char* scope);
 | 
				
			||||||
 | 
					void add_token_to_list(Token* token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Token* find_token(const char* token);
 | 
				
			||||||
 | 
					Token* generate_token();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendPortList(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendNodeList(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendUserList(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendInfo(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendLinks(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendPortMHList(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendWhatsPacState(char * response, char * token, char * param);
 | 
				
			||||||
 | 
					int sendWhatsPacConfig(char * response, char * token, char * param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
 | 
				
			||||||
 | 
					DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Token list
 | 
				
			||||||
 | 
					Token* token_list = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct API APIList[] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						"/api/ports", 10, sendPortList, 0,
 | 
				
			||||||
 | 
						"/api/nodes", 10, sendNodeList, 0,
 | 
				
			||||||
 | 
						"/api/info", 9, sendInfo, 0,
 | 
				
			||||||
 | 
						"/api/links", 10, sendLinks, 0,
 | 
				
			||||||
 | 
						"/api/users", 10, sendUserList, 0,
 | 
				
			||||||
 | 
						"/api/mheard", 11, sendPortMHList, 0,
 | 
				
			||||||
 | 
						"/api/v1/config", 14, sendWhatsPacConfig, 0,
 | 
				
			||||||
 | 
						"/api/v1/state", 13, sendWhatsPacState, 0
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int APICount = sizeof(APIList) / sizeof(struct API);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int HTTPPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int xx()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						while (1) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Remove expired tokens
 | 
				
			||||||
 | 
							remove_expired_tokens();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Handle the client request
 | 
				
			||||||
 | 
							//      handle_request();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char * auth_header = "Authorization: Bearer ";
 | 
				
			||||||
 | 
						char * token_begin = strstr(request, auth_header);
 | 
				
			||||||
 | 
						char token[TOKEN_SIZE + 1]= "";
 | 
				
			||||||
 | 
						int Flags = 0, n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Node Flags isn't currently used
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char * Tok;
 | 
				
			||||||
 | 
						char * param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (token_begin)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Using Auth Header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 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
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// There may be a token as first param, but if auth not needed may be misisng
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Tok = strlop(URL, '?');
 | 
				
			||||||
 | 
							param = strlop(Tok, '&');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Tok && strlen(Tok) == TOKEN_SIZE)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// assume auth token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(token, Tok);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else param = Tok;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						remove_expired_tokens();			// Tidy up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check if the request is for token generation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (strcmp(Method, "OPTIONS") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// CORS Request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							char Resp[] =
 | 
				
			||||||
 | 
								"HTTP/1.1 200 OK\r\n"
 | 
				
			||||||
 | 
								"Access-Control-Allow-Origin: *\r\n"
 | 
				
			||||||
 | 
								"Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n"
 | 
				
			||||||
 | 
								"Access-Control-Allow-Headers: authorization";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return send_http_response(response, Resp);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (strcmp(Method, "GET") != 0)
 | 
				
			||||||
 | 
							return send_http_response(response, "403 (Bad Method)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(URL, "/api/request_token") == 0)
 | 
				
			||||||
 | 
							return request_token(response);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					if (token[0] == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// 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
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Verify the token
 | 
				
			||||||
 | 
						if (!verify_token(token))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Debugprintf("Invalid authentication token.\n");
 | 
				
			||||||
 | 
							return  send_http_response(response, "401 Unauthorized");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Determine the requested API endpoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (n = 0; n < APICount; n++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							struct API * APIEntry;
 | 
				
			||||||
 | 
							char * rest;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							APIEntry = &APIList[n];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_memicmp(URL, APIEntry->URL, APIEntry->URLLen) == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								rest = &request[4 + APIEntry->URLLen];	// Anything following?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?')
 | 
				
			||||||
 | 
									return APIEntry->APIRoutine(response, token, rest);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return send_http_response(response, "401 Invalid API Call");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int request_token(char * response) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Token * token = generate_token();
 | 
				
			||||||
 | 
						char scope[] = "create";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("Token generated: %s\n", token->token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(response, "{\"access_token\":\"%s\", \"expires_at\":%ld,\"scope\":\"create\"}\r\n",
 | 
				
			||||||
 | 
							token->token, token->expiration_time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Token * generate_token() 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Generate a random authentication token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Token * token = malloc(sizeof(Token));
 | 
				
			||||||
 | 
						for (i = 0; i < TOKEN_SIZE; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							token->token[i] = 'A' + rand() % 26; // Random uppercase alphabet character
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						token->token[TOKEN_SIZE] = '\0'; // Null-terminate the token
 | 
				
			||||||
 | 
						token->expiration_time = time(NULL) + TOKEN_EXPIRATION; // Set token expiration time
 | 
				
			||||||
 | 
						add_token_to_list(token);
 | 
				
			||||||
 | 
						return token;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Function to add the token to the token_list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void add_token_to_list(Token* token)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (token_list == NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							token_list = token;
 | 
				
			||||||
 | 
							token->next = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Token* current = token_list;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							while (current->next != NULL) 
 | 
				
			||||||
 | 
								current = current->next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							current->next = token;
 | 
				
			||||||
 | 
							token->next = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int verify_token(const char* token)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Find the token in the token list
 | 
				
			||||||
 | 
						Token * existing_token = find_token(token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (existing_token != NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Check if the token has expired
 | 
				
			||||||
 | 
							time_t current_time = time(NULL);
 | 
				
			||||||
 | 
							if (current_time > existing_token->expiration_time)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Token has expired, remove it from the token list
 | 
				
			||||||
 | 
								remove_expired_tokens();
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Token is valid
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Token doesn't exist in the token list
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void remove_expired_tokens()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						time_t current_time = time(NULL);
 | 
				
			||||||
 | 
						Token* current_token = token_list;
 | 
				
			||||||
 | 
						Token* prev_token = NULL;
 | 
				
			||||||
 | 
						Token* next_token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (current_token != NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (current_time > current_token->expiration_time) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Token has expired, remove it from the token list
 | 
				
			||||||
 | 
								if (prev_token == NULL)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									token_list = current_token->next;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									prev_token->next = current_token->next;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								next_token = current_token->next;
 | 
				
			||||||
 | 
								free(current_token);
 | 
				
			||||||
 | 
								current_token = next_token;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								prev_token = current_token;
 | 
				
			||||||
 | 
								current_token = current_token->next;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Token * find_token(const char* token) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Token* current_token = token_list;
 | 
				
			||||||
 | 
						while (current_token != NULL) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (strcmp(current_token->token, token) == 0) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return current_token;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							current_token = current_token->next;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int send_http_response(char * response, const char* msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return sprintf(response, "HTTP/1.1 %s\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
 | 
				
			||||||
 | 
					"expires_in":3600,
 | 
				
			||||||
 | 
					"scope":"create"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					{"ports":[
 | 
				
			||||||
 | 
					{"ID":"My Port", "Driver":"KISS", "Number":2, "State":"Active"),
 | 
				
			||||||
 | 
					{ ...},
 | 
				
			||||||
 | 
					{...}
 | 
				
			||||||
 | 
					]}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int MasterPort[MAXBPQPORTS+1];	// Pointer to first BPQ port for a specific MPSK or UZ7HO host
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendPortList(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char * Array = 0;
 | 
				
			||||||
 | 
						int ArrayLen = 0;
 | 
				
			||||||
 | 
						int ArrayPtr = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						struct _EXTPORTDATA * ExtPort;
 | 
				
			||||||
 | 
						struct PORTCONTROL * Port;
 | 
				
			||||||
 | 
						struct PORTCONTROL * SAVEPORT;
 | 
				
			||||||
 | 
						int PortNo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int count;
 | 
				
			||||||
 | 
						char DLL[20];
 | 
				
			||||||
 | 
						char Status[32]="Unknown";
 | 
				
			||||||
 | 
						char ID[33];
 | 
				
			||||||
 | 
						char * ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ArrayPtr += sprintf(&response[ArrayPtr], "{\"ports\":[\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (count = 1; count <= NUMBEROFPORTS; count++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Port = GetPortTableEntryFromSlot(count);
 | 
				
			||||||
 | 
							ExtPort = (struct _EXTPORTDATA *)Port;
 | 
				
			||||||
 | 
							PortNo = Port->PORTNUMBER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Port->PORTTYPE == 0x10)
 | 
				
			||||||
 | 
							{	
 | 
				
			||||||
 | 
								strcpy(DLL, ExtPort->PORT_DLL_NAME);
 | 
				
			||||||
 | 
								strlop(DLL, '.');
 | 
				
			||||||
 | 
								strlop(DLL, ' ');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (Port->PORTTYPE == 0)
 | 
				
			||||||
 | 
								strcpy(DLL, "ASYNC");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							else if (Port->PORTTYPE == 22)
 | 
				
			||||||
 | 
								strcpy(DLL, "I2C");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							else if (Port->PORTTYPE == 14)
 | 
				
			||||||
 | 
								strcpy(DLL, "INTERNAL");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							else if (Port->PORTTYPE > 0 && Port->PORTTYPE < 14)
 | 
				
			||||||
 | 
								strcpy(DLL, "HDLC");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Port->PortStopped)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								strcpy(Status, "Stopped");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (Port->PORTTYPE == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									struct KISSINFO * KISS = (struct KISSINFO *)Port;
 | 
				
			||||||
 | 
									NPASYINFO KPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									SAVEPORT = Port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (KISS->FIRSTPORT && KISS->FIRSTPORT != KISS)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// Not first port on device
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Port = (struct PORTCONTROL *)KISS->FIRSTPORT;
 | 
				
			||||||
 | 
										KPort = KISSInfo[PortNo];
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									KPort = KISSInfo[PortNo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (KPort)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// KISS like - see if connected 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (Port->PORTIPADDR.s_addr || Port->KISSSLAVE)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											// KISS over UDP or TCP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (Port->KISSTCP)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												if (KPort->Connected)
 | 
				
			||||||
 | 
													strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
												else
 | 
				
			||||||
 | 
													if (Port->KISSSLAVE)
 | 
				
			||||||
 | 
														strcpy(Status, "Listen");
 | 
				
			||||||
 | 
													else
 | 
				
			||||||
 | 
														strcpy(Status, "Closed");
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												strcpy(Status, "UDP");
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else
 | 
				
			||||||
 | 
											if (KPort->idComDev)			// Serial port Open
 | 
				
			||||||
 | 
												strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												strcpy(Status, "Closed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Port = SAVEPORT;
 | 
				
			||||||
 | 
									}		
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Port->PORTTYPE == 14)		// Loopback 
 | 
				
			||||||
 | 
									strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								else if (Port->PORTTYPE == 16)		// External
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (Port->PROTOCOL == 10)		// 'HF' Port
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										struct TNCINFO * TNC = TNCInfo[PortNo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (TNC)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											switch (TNC->Hardware)				// Hardware Type
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
											case H_SCS:
 | 
				
			||||||
 | 
											case H_KAM:
 | 
				
			||||||
 | 
											case H_AEA:
 | 
				
			||||||
 | 
											case H_HAL:
 | 
				
			||||||
 | 
											case H_TRK:
 | 
				
			||||||
 | 
											case H_SERIAL:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												// Serial
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												if (TNC->hDevice)
 | 
				
			||||||
 | 
													strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
												else
 | 
				
			||||||
 | 
													strcpy(Status, "Closed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											case H_UZ7HO:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												if (TNCInfo[MasterPort[PortNo]]->CONNECTED)
 | 
				
			||||||
 | 
													strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
												else
 | 
				
			||||||
 | 
													strcpy(Status, "Closed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											case H_WINMOR:
 | 
				
			||||||
 | 
											case H_V4:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											case H_MPSK:
 | 
				
			||||||
 | 
											case H_FLDIGI:
 | 
				
			||||||
 | 
											case H_UIARQ:
 | 
				
			||||||
 | 
											case H_ARDOP:
 | 
				
			||||||
 | 
											case H_VARA:
 | 
				
			||||||
 | 
											case H_KISSHF:
 | 
				
			||||||
 | 
											case H_WINRPR:
 | 
				
			||||||
 | 
											case H_FREEDATA:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												// TCP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												if (TNC->CONNECTED)
 | 
				
			||||||
 | 
												{
 | 
				
			||||||
 | 
													if (TNC->Streams[0].Attached)
 | 
				
			||||||
 | 
														strcpy(Status, "In Use");
 | 
				
			||||||
 | 
													else
 | 
				
			||||||
 | 
														strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
												else
 | 
				
			||||||
 | 
													strcpy(Status, "Closed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											case H_TELNET:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// External but not HF - AXIP, BPQETHER VKISS, ??
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										struct _EXTPORTDATA * EXTPORT = (struct _EXTPORTDATA *)Port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										strcpy(Status, "Open  ");
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							strlop(Status, ' ');
 | 
				
			||||||
 | 
							strcpy(ID, Port->PORTDESCRIPTION);
 | 
				
			||||||
 | 
							ptr = &ID[29];
 | 
				
			||||||
 | 
							while (*(ptr) == ' ')
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*(ptr--) = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ArrayPtr += sprintf(&response[ArrayPtr], " {\"ID\":\"%s\", \"Driver\":\"%s\", \"Number\":%d,\"State\":\"%s\"},\r\n",
 | 
				
			||||||
 | 
								ID, DLL, Port->PORTNUMBER, Status);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ArrayPtr -= 3;		// remove trailing comma
 | 
				
			||||||
 | 
						ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ArrayPtr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					{"Nodes":[
 | 
				
			||||||
 | 
					{"Call":"xx", "Alias":"xx", "Nbour1 ":"xx", "Quality":192),
 | 
				
			||||||
 | 
					{ ...},
 | 
				
			||||||
 | 
					{...}
 | 
				
			||||||
 | 
					]}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int MaxNodes;
 | 
				
			||||||
 | 
					extern struct DEST_LIST * DESTS;		// NODE LIST
 | 
				
			||||||
 | 
					extern int DEST_LIST_LEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendNodeList(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ArrayPtr = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						int count, len, i;
 | 
				
			||||||
 | 
						char Normcall[10], Portcall[10];
 | 
				
			||||||
 | 
						char Alias[7];
 | 
				
			||||||
 | 
						struct DEST_LIST * Dests = DESTS ;
 | 
				
			||||||
 | 
						//	struct ROUTE * Routes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Dests = DESTS;
 | 
				
			||||||
 | 
						MaxNodes = MAXDESTS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ArrayPtr += sprintf(&response[ArrayPtr], "{\"nodes\":[\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Dests-=1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (count = 0; count < MaxNodes; count++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Dests+=1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Dests->DEST_CALL[0] == 0)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							len = ConvFromAX25(Dests->DEST_CALL, Normcall);
 | 
				
			||||||
 | 
							Normcall[len] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(Alias, Dests->DEST_ALIAS, 6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Alias[6]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (i=0;i<6;i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (Alias[i] == ' ')
 | 
				
			||||||
 | 
									Alias[i] = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Alias\":\"%s\", \"Routes\":[", Normcall, Alias);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Add an array  with up to 6 objects (3 NR + 3 INP3 Neighbours
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Dests->NRROUTE[0].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[0].ROUT_NEIGHBOUR->INP3Node == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								len = ConvFromAX25(Dests->NRROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
 | 
				
			||||||
 | 
								Portcall[len] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ArrayPtr += sprintf(&response[ArrayPtr], "{\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
 | 
				
			||||||
 | 
									Portcall, Dests->NRROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[0].ROUT_QUALITY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//				if (Dests->NRROUTE[0].ROUT_OBSCOUNT > 127)
 | 
				
			||||||
 | 
								//				{
 | 
				
			||||||
 | 
								//					len=sprintf(&line[cursor],"! ");
 | 
				
			||||||
 | 
								//					cursor+=len;
 | 
				
			||||||
 | 
								//				}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Dests->NRROUTE[1].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[1].ROUT_NEIGHBOUR->INP3Node == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								len=ConvFromAX25(Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
 | 
				
			||||||
 | 
								Portcall[len]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
 | 
				
			||||||
 | 
									Portcall, Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[1].ROUT_QUALITY);
 | 
				
			||||||
 | 
								//if (Dests->NRROUTE[1].ROUT_OBSCOUNT > 127)
 | 
				
			||||||
 | 
								//{
 | 
				
			||||||
 | 
								//len=sprintf(&line[cursor],"! ");
 | 
				
			||||||
 | 
								//cursor+=len;
 | 
				
			||||||
 | 
								//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Dests->NRROUTE[2].ROUT_NEIGHBOUR != 0 && Dests->NRROUTE[2].ROUT_NEIGHBOUR->INP3Node == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								len=ConvFromAX25(Dests->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL,Portcall);
 | 
				
			||||||
 | 
								Portcall[len]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\":\"%s\", \"Port\":%d, \"Quality\":%d},",
 | 
				
			||||||
 | 
									Portcall, Dests->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dests->NRROUTE[1].ROUT_QUALITY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//if (Dests->NRROUTE[2].ROUT_OBSCOUNT > 127)
 | 
				
			||||||
 | 
								//{
 | 
				
			||||||
 | 
								//len=sprintf(&line[cursor],"! ");
 | 
				
			||||||
 | 
								//cursor+=len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ArrayPtr -= 1;		// remove comma
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ArrayPtr += sprintf(&response[ArrayPtr], "]},\r\n");
 | 
				
			||||||
 | 
						}	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ArrayPtr -= 3;		// remove comma
 | 
				
			||||||
 | 
						ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return ArrayPtr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendUserList(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ArrayPtr = 0;
 | 
				
			||||||
 | 
						int n = MAXCIRCUITS;
 | 
				
			||||||
 | 
						TRANSPORTENTRY * L4 = L4TABLE;
 | 
				
			||||||
 | 
					//	TRANSPORTENTRY * Partner;
 | 
				
			||||||
 | 
						int MaxLinks = MAXLINKS;
 | 
				
			||||||
 | 
						char State[12] = "", Type[12] = "Uplink";
 | 
				
			||||||
 | 
						char LHS[50] = "", MID[10] = "", RHS[50] = "";
 | 
				
			||||||
 | 
					//	char Line[100];
 | 
				
			||||||
 | 
						char Normcall[10];
 | 
				
			||||||
 | 
						int len;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						ArrayPtr += sprintf(&response[ArrayPtr], "{\"users\":[\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (n--)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (L4->L4USER[0])
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								RHS[0] = MID[0] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								len = ConvFromAX25(L4->L4USER, Normcall);
 | 
				
			||||||
 | 
								Normcall[len] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\": \"%s\"},\r\n", Normcall);
 | 
				
			||||||
 | 
								L4++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ArrayPtr == 12)			//empty list
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							ArrayPtr -=2;
 | 
				
			||||||
 | 
							ArrayPtr += sprintf(&response[ArrayPtr], "]}\r\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							ArrayPtr -= 3;		// remove trailing comma
 | 
				
			||||||
 | 
							ArrayPtr += sprintf(&response[ArrayPtr], "\r\n]}\r\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ArrayPtr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern char MYALIASLOPPED[];
 | 
				
			||||||
 | 
					extern char TextVerstring[];
 | 
				
			||||||
 | 
					extern char LOCATOR[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendInfo(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char call[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memcpy(call, MYNODECALL, 10);
 | 
				
			||||||
 | 
						strlop(call, ' ');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(response, "{\"info\":{\"NodeCall\":\"%s\", \"Alias\":\"%s\", \"Locator\":\"%s\", \"Version\":\"%s\"}}\r\n",
 | 
				
			||||||
 | 
							call, MYALIASLOPPED, LOCATOR, TextVerstring);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendLinks(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct _LINKTABLE * Links = LINKS;
 | 
				
			||||||
 | 
						int MaxLinks = MAXLINKS;
 | 
				
			||||||
 | 
						int count;
 | 
				
			||||||
 | 
						char Normcall1[10];
 | 
				
			||||||
 | 
						char Normcall2[10];
 | 
				
			||||||
 | 
						char State[12] = "", Type[12] = "Uplink";
 | 
				
			||||||
 | 
						int axState;
 | 
				
			||||||
 | 
						int cctType;
 | 
				
			||||||
 | 
						int ReplyLen = 0;
 | 
				
			||||||
 | 
						ReplyLen += sprintf(&response[ReplyLen],"{\"links\":[\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (count=0; count<MaxLinks; count++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Links->LINKCALL[0] != 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								int len = ConvFromAX25(Links->LINKCALL, Normcall1);
 | 
				
			||||||
 | 
								Normcall1[len] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								len = ConvFromAX25(Links->OURCALL, Normcall2);
 | 
				
			||||||
 | 
								Normcall2[len] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								axState = Links->L2STATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (axState == 2)
 | 
				
			||||||
 | 
									strcpy(State, "Connecting");
 | 
				
			||||||
 | 
								else if (axState == 3)
 | 
				
			||||||
 | 
									strcpy(State, "FRMR");
 | 
				
			||||||
 | 
								else if (axState == 4)
 | 
				
			||||||
 | 
									strcpy(State, "Closing");
 | 
				
			||||||
 | 
								else if (axState == 5)
 | 
				
			||||||
 | 
									strcpy(State, "Active");
 | 
				
			||||||
 | 
								else if (axState == 6)
 | 
				
			||||||
 | 
									strcpy(State, "REJ Sent");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								cctType = Links->LINKTYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (cctType == 1)
 | 
				
			||||||
 | 
									strcpy(Type, "Uplink");
 | 
				
			||||||
 | 
								else if (cctType == 2)
 | 
				
			||||||
 | 
									strcpy(Type, "Downlink");
 | 
				
			||||||
 | 
								else if (cctType == 3)
 | 
				
			||||||
 | 
									strcpy(Type, "Node-Node");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ReplyLen += sprintf(&response[ReplyLen], "{\"farCall\": \"%s\",\"ourCall\": \"%s\", \"port\": \"%d\", \"state\": \"%s\", \"linkType\": \"%s\", \"ax25Version\": \"%d\"},\r\n",
 | 
				
			||||||
 | 
									Normcall1, Normcall2, Links->LINKPORT->PORTNUMBER,
 | 
				
			||||||
 | 
									State, Type, 2 - Links->VER1FLAG );
 | 
				
			||||||
 | 
								Links+=1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ReplyLen < 13)
 | 
				
			||||||
 | 
							ReplyLen -= 2;          // no links
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							ReplyLen -= 3;         // remove trailing comma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ReplyLen+= sprintf(&response[ReplyLen], "\r\n]}\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ReplyLen;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendPortMHList(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					        struct PORTCONTROL * PORTVEC ;
 | 
				
			||||||
 | 
							int n;
 | 
				
			||||||
 | 
							int port = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (param[0] = '?' || param[0] == '/')
 | 
				
			||||||
 | 
								port = atoi(¶m[1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							PORTVEC = GetPortTableEntryFromPortNum(port);
 | 
				
			||||||
 | 
							response[0] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (PORTVEC == 0)
 | 
				
			||||||
 | 
								return send_http_response(response, "401 Invalid API Call");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							n = sprintf(response,"{\"mheard\":[\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        BuildPortMH(&response[n], PORTVEC );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (response[n] == 0)		// No entries
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								response[strlen(response) - 2] = '\0';          // remove \r\n
 | 
				
			||||||
 | 
								strcat(response, "]}\r\n");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								response[strlen(response)-3 ] = '\0';          // remove ,\r\n
 | 
				
			||||||
 | 
								strcat(response, "\r\n]}\r\n");
 | 
				
			||||||
 | 
					//      printf("MH for port %d:\r\n%s\r\n", PORTVEC->PORTNUMBER, response);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WhatsPac configuration interface
 | 
				
			||||||
 | 
					// WhatsPac also uses Paula's Remote Host Protocol (RHP). This is in a separate module
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int WhatsPacConfigured;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendWhatsPacState(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (WhatsPacConfigured)
 | 
				
			||||||
 | 
							sprintf(response, "{\"configured\": true}\r\n");
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							sprintf(response, "{\"configured\": false}\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendWhatsPacConfig(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char Template[] =
 | 
				
			||||||
 | 
						"{\"MODE\": 0,"
 | 
				
			||||||
 | 
						"\"RHPPORT\": \"%d\","
 | 
				
			||||||
 | 
						"\"AGWPORT\": \"7000\","
 | 
				
			||||||
 | 
						"\"INTERFACES\": [{\"INTERFACE\": 1,\"PROTOCOL\": \"KISS\",\"TYPE\": \"TCP\",\"IOADDR\": \"127.0.0.1\",\"INTNUM\": 8100}],"
 | 
				
			||||||
 | 
						"\"PORTS\": [{\"PORT\": 1,\"ID\": \"RHPPORT\", \"INTERFACENUM\": 1}]}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(response, Template, HTTPPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										40
									
								
								nodeapi.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								nodeapi.c
									
									
									
									
									
								
							| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
#include "asmstrucs.h"
 | 
					#include "asmstrucs.h"
 | 
				
			||||||
| 
						 | 
					@ -56,6 +56,8 @@ int sendUserList(char * response, char * token, char * Rest);
 | 
				
			||||||
int sendInfo(char * response, char * token, char * Rest);
 | 
					int sendInfo(char * response, char * token, char * Rest);
 | 
				
			||||||
int sendLinks(char * response, char * token, char * Rest);
 | 
					int sendLinks(char * response, char * token, char * Rest);
 | 
				
			||||||
int sendPortMHList(char * response, char * token, char * Rest);
 | 
					int sendPortMHList(char * response, char * token, char * Rest);
 | 
				
			||||||
 | 
					int sendWhatsPacState(char * response, char * token, char * param);
 | 
				
			||||||
 | 
					int sendWhatsPacConfig(char * response, char * token, char * param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
 | 
					void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
 | 
				
			||||||
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
					DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
				
			||||||
| 
						 | 
					@ -71,11 +73,14 @@ struct API APIList[] =
 | 
				
			||||||
	"/api/info", 9, sendInfo, 0,
 | 
						"/api/info", 9, sendInfo, 0,
 | 
				
			||||||
	"/api/links", 10, sendLinks, 0,
 | 
						"/api/links", 10, sendLinks, 0,
 | 
				
			||||||
	"/api/users", 10, sendUserList, 0,
 | 
						"/api/users", 10, sendUserList, 0,
 | 
				
			||||||
	"/api/mheard", 11, sendPortMHList, 0
 | 
						"/api/mheard", 11, sendPortMHList, 0,
 | 
				
			||||||
 | 
						"/api/v1/config", 14, sendWhatsPacConfig, 0,
 | 
				
			||||||
 | 
						"/api/v1/state", 13, sendWhatsPacState, 0
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int APICount = sizeof(APIList) / sizeof(struct API);
 | 
					int APICount = sizeof(APIList) / sizeof(struct API);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int HTTPPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int xx()
 | 
					int xx()
 | 
				
			||||||
| 
						 | 
					@ -817,6 +822,37 @@ int sendPortMHList(char * response, char * token, char * param)
 | 
				
			||||||
		return strlen(response);
 | 
							return strlen(response);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WhatsPac configuration interface
 | 
				
			||||||
 | 
					// WhatsPac also uses Paula's Remote Host Protocol (RHP). This is in a separate module
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int WhatsPacConfigured;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendWhatsPacState(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (WhatsPacConfigured)
 | 
				
			||||||
 | 
							sprintf(response, "{\"configured\": true}\r\n");
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							sprintf(response, "{\"configured\": false}\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sendWhatsPacConfig(char * response, char * token, char * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char Template[] =
 | 
				
			||||||
 | 
						"{\"MODE\": 0,"
 | 
				
			||||||
 | 
						"\"RHPPORT\": \"%d\","
 | 
				
			||||||
 | 
						"\"AGWPORT\": \"7000\","
 | 
				
			||||||
 | 
						"\"INTERFACES\": [{\"INTERFACE\": 1,\"PROTOCOL\": \"KISS\",\"TYPE\": \"TCP\",\"IOADDR\": \"127.0.0.1\",\"INTNUM\": 8100}],"
 | 
				
			||||||
 | 
						"\"PORTS\": [{\"PORT\": 1,\"ID\": \"RHPPORT\", \"INTERFACENUM\": 1}]}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(response, Template, HTTPPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strlen(response);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								pibits.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pibits.c
									
									
									
									
									
								
							| 
						 | 
					@ -17,7 +17,7 @@ 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
 | 
				
			||||||
*/	
 | 
					*/	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "CHeaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue