Compare commits
	
		
			165 commits
		
	
	
		
			upstream/6
			...
			hibbian/la
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
							
							
								
									
								
								 | 
						e569b24f9a | ||
| 
							
							
								
									
								
								 | 
						272c31f62b | ||
| 
							
							
								
									
								
								 | 
						f99a060918 | ||
| 
							
							
								
									
								
								 | 
						453f162d22 | ||
| 
							
							
								
									
								
								 | 
						13c0b79af7 | ||
| 
							
							
								
									
								
								 | 
						2e55f0a4ca | ||
| 
							
							
								
									
								
								 | 
						acbaf26ac1 | ||
| 
							
							
								
									
								
								 | 
						70d9b41cc1 | ||
| 
							
							
								
									
								
								 | 
						96ac3e4a36 | ||
| 
							
							
								
									
								
								 | 
						c0425ff0e2 | ||
| 
							
							
								
									
								
								 | 
						e4d8eadb91 | ||
| 
							
							
								
									
								
								 | 
						ac03394a07 | ||
| 
							
							
								
									
								
								 | 
						d0f299bc02 | ||
| 
							
							
								
									
								
								 | 
						7c796758d1 | ||
| 
							
							
								
									
								
								 | 
						78f78927ab | ||
| 
							
							
								
									
								
								 | 
						27d95452b1 | ||
| 
							
							
								
									
								
								 | 
						e925e16114 | ||
| 
							
							
								
									
								
								 | 
						d97d9d821b | ||
| 
							
							
								
									
								
								 | 
						a6b3c4bdc9 | ||
| 
							
							
								
									
								
								 | 
						3e1cbdfa4d | ||
| 
							
							
								
									
								
								 | 
						7a5122a60f | ||
| 
							
							
								
									
								
								 | 
						0013c3199a | ||
| 
							
							
								
									
								
								 | 
						fa3201d982 | ||
| 
							
							
								
									
								
								 | 
						5d30fbc104 | ||
| 
							
							
								
									
								
								 | 
						e21707174e | ||
| 
							
							
								
									
								
								 | 
						26324bdc39 | ||
| 
							
							
								
									
								
								 | 
						1cc87cf766 | ||
| 
							
							
								
									
								
								 | 
						1f40ff4a07 | ||
| 
							
							
								
									
								
								 | 
						30b1e26a04 | ||
| 
							
							
								
									
								
								 | 
						31bda6ce76 | ||
| 
							
							
								
									
								
								 | 
						d2c3489aef | ||
| 
							
							
								
									
								
								 | 
						6371d5385a | ||
| 
							
							
								
									
								
								 | 
						b2315840b2 | ||
| 
							
							
								
									
								
								 | 
						8d3874ec4e | ||
| 
							
							
								
									
								
								 | 
						6a4b588a48 | ||
| 
							
							
								
									
								
								 | 
						426f47ccb6 | ||
| 
							
							
								
									
								
								 | 
						3ecb593511 | ||
| 
							
							
								
									
								
								 | 
						0d3ee7fd56 | ||
| 
							
							
								
									
								
								 | 
						96197688e7 | ||
| 
							
							
								
									
								
								 | 
						d3b4158645 | ||
| 
							
							
								
									
								
								 | 
						fec78cece5 | ||
| 
							
							
								
									
								
								 | 
						bdf8a8367e | ||
| 
							
							
								
									
								
								 | 
						f0ac0675f6 | ||
| 
							
							
								
									
								
								 | 
						329e2f441d | ||
| 
							
							
								
									
								
								 | 
						0b4a17004f | ||
| 
							
							
								
									
								
								 | 
						f0b507a096 | ||
| 
							
							
								
									
								
								 | 
						b128f2a43a | ||
| 
							
							
								
									
								
								 | 
						9d0d20064d | ||
| 
							
							
								
									
								
								 | 
						ead72b2575 | ||
| 
							
							
								
									
								
								 | 
						f1d8b647c7 | ||
| 
							
							
								
									
								
								 | 
						c858986248 | ||
| 
							
							
								
									
								
								 | 
						bfcf049c56 | ||
| 
							
							
								
									
								
								 | 
						488e218d34 | ||
| 
							
							
								
									
								
								 | 
						3efea8aa10 | ||
| 
							
							
								
									
								
								 | 
						8e9260b52d | ||
| 
							
							
								
									
								
								 | 
						5105f0adf3 | ||
| 
							
							
								
									
								
								 | 
						b060bf5d39 | ||
| 
							
							
								
									
								
								 | 
						33d8e6f75a | ||
| 
							
							
								
									
								
								 | 
						58d2baad53 | ||
| 
							
							
								
									
								
								 | 
						1f73eb5601 | ||
| 
							
							
								
									
								
								 | 
						a7d635fe2f | ||
| 
							
							
								
									
								
								 | 
						eab73bee95 | ||
| 
							
							
								
									
								
								 | 
						745a9f8e88 | ||
| 
							
							
								
									
								
								 | 
						dd84b546a0 | ||
| 
							
							
								
									
								
								 | 
						3a600bee23 | ||
| 
							
							
								
									
								
								 | 
						d09a168608 | ||
| 
							
							
								
									
								
								 | 
						757c658adc | ||
| 
							
							
								
									
								
								 | 
						37bacc3178 | ||
| 
							
							
								
									
								
								 | 
						7690eb8f59 | ||
| 
							
							
								
									
								
								 | 
						a675c89dc3 | ||
| 
							
							
								
									
								
								 | 
						7433c77604 | ||
| 
							
							
								
									
								
								 | 
						6bd281ab30 | ||
| 
							
							
								
									
								
								 | 
						c0637b3841 | ||
| 
							
							
								
									
								
								 | 
						3a840054a7 | ||
| 
							
							
								
									
								
								 | 
						8a18ca1868 | ||
| 
							
							
								
									
								
								 | 
						49e27728c3 | ||
| 
							
							
								
									
								
								 | 
						8e7a943558 | ||
| 
							
							
								
									
								
								 | 
						e35489a925 | ||
| 
							
							
								
									
								
								 | 
						c77b3e9f47 | ||
| 
							
							
								
									
								
								 | 
						1e83f7e725 | ||
| 
							
							
								
									
								
								 | 
						5d8d8963ef | ||
| 
							
							
								
									
								
								 | 
						96d6e87d12 | ||
| 
							
							
								
									
								
								 | 
						5bd018b10f | ||
| 
							
							
								
									
								
								 | 
						4d14474d92 | ||
| 
							
							
								
									
								
								 | 
						1b40c8c7b5 | ||
| 
							
							
								
									
								
								 | 
						a5ce8b2319 | ||
| 
							
							
								
									
								
								 | 
						6b795ee1f6 | ||
| 
							
							
								
									
								
								 | 
						5767c5f6e8 | ||
| 
							
							
								
									
								
								 | 
						61f49ee46b | ||
| 
							
							
								
									
								
								 | 
						6e6693fde1 | ||
| 
							
							
								
									
								
								 | 
						1a7f29f7d7 | ||
| 
							
							
								
									
								
								 | 
						f527c60884 | ||
| 
							
							
								
									
								
								 | 
						3de6b0150f | ||
| 
							
							
								
									
								
								 | 
						0d48067b82 | ||
| 
							
							
								
									
								
								 | 
						b18a579b0c | ||
| 
							
							
								
									
								
								 | 
						ba9f74d1b8 | ||
| 
							
							
								
									
								
								 | 
						550b4483cb | ||
| 
							
							
								
									
								
								 | 
						383e238d61 | ||
| 
							
							
								
									
								
								 | 
						371dac17ff | ||
| 
							
							
								
									
								
								 | 
						24843bc9cd | ||
| 
							
							
								
									
								
								 | 
						f17801297c | ||
| 
							
							
								
									
								
								 | 
						f62a0288be | ||
| 
							
							
								
									
								
								 | 
						85da9edc16 | ||
| 
							
							
								
									
								
								 | 
						666c2aabb4 | ||
| 
							
							
								
									
								
								 | 
						a47cc11d8a | ||
| 
							
							
								
									
								
								 | 
						b26c87817a | ||
| 
							
							
								
									
								
								 | 
						60585818de | ||
| 
							
							
								
									
								
								 | 
						9dacd97014 | ||
| 
							
							
								
									
								
								 | 
						fc0275b903 | ||
| 
							
							
								
									
								
								 | 
						ca2a16b7fc | ||
| 
							
							
								
									
								
								 | 
						d122a87dd1 | ||
| 
							
							
								
									
								
								 | 
						5b3543c12a | ||
| 
							
							
								 | 
						d37331205e | ||
| 
							
							
								 | 
						026ad61c90 | ||
| 
							
							
								 | 
						5d125856cd | ||
| 
							
							
								
									
								
								 | 
						a7ecf779fc | ||
| 
							
							
								
									
								
								 | 
						c26f6fe9d8 | ||
| 
							
							
								
									
								
								 | 
						91fc60e6f0 | ||
| 
							
							
								
									
								
								 | 
						3b36ba2a06 | ||
| 
							
							
								
									
								
								 | 
						ec1e97d985 | ||
| 
							
							
								
									
								
								 | 
						75eadc6bbe | ||
| 
							
							
								
									
								
								 | 
						eaab24a3c0 | ||
| 
							
							
								
									
								
								 | 
						4b1144ed94 | ||
| 
							
							
								
									
								
								 | 
						37b1c8b074 | ||
| 
							
							
								
									
								
								 | 
						0b5e0e5023 | ||
| 
							
							
								
									
								
								 | 
						66ff00a200 | ||
| 
							
							
								
									
								
								 | 
						566b839fd4 | ||
| 
							
							
								
									
								
								 | 
						5f9fb109ff | ||
| 
							
							
								
									
								
								 | 
						94179f117a | ||
| 
							
							
								
									
								
								 | 
						831f4a75eb | ||
| 
							
							
								
									
								
								 | 
						3f1fd46905 | ||
| 
							
							
								
									
								
								 | 
						5b1c61bd78 | ||
| 
							
							
								
									
								
								 | 
						ee7345ce92 | ||
| 
							
							
								
									
								
								 | 
						733afdfcbc | ||
| 
							
							
								
									
								
								 | 
						2dd6d1f7bf | ||
| 
							
							
								 | 
						6ee8a719cf | ||
| 
							
							
								 | 
						d4d0aaa8ab | ||
| 
							
							
								 | 
						710cc6fde7 | ||
| 
							
							
								 | 
						eec767af84 | ||
| 
							
							
								 | 
						0c8b9a1da7 | ||
| 
							
							
								 | 
						018d733dee | ||
| 
							
							
								 | 
						851dcb6fd8 | ||
| 
							
							
								 | 
						ce4f1b11b0 | ||
| 
							
							
								 | 
						1fbded9d3a | ||
| 
							
							
								 | 
						a4103962fc | ||
| 
							
							
								 | 
						397da35dac | ||
| 
							
							
								 | 
						9c15385cb6 | ||
| 
							
							
								 | 
						fd1249b1e2 | ||
| 
							
							
								 | 
						fda3d6ffac | ||
| 
							
							
								 | 
						37a1ea33be | ||
| 
							
							
								 | 
						78e830ab37 | ||
| 
							
							
								 | 
						9155d3ba64 | ||
| 
							
							
								 | 
						6adcb91ee5 | ||
| 
							
							
								 | 
						77f96f5b63 | ||
| 
							
							
								 | 
						6f53d92599 | ||
| 
							
							
								 | 
						46c6058d94 | ||
| 
							
							
								 | 
						3e029049d7 | ||
| 
							
							
								 | 
						b6a50b9b6c | ||
| 
							
							
								 | 
						fc474c29fe | ||
| 
							
							
								 | 
						6546bac3f5 | ||
| 
							
							
								 | 
						ee2ac63a82 | ||
| 
							
							
								 | 
						95a6ab069f | ||
| 
							
							
								 | 
						055c1c1891 | ||
| 
							
							
								 | 
						964b72495c | ||
| 
							
							
								 | 
						acb26fd980 | 
							
								
								
									
										139
									
								
								.rej
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								.rej
									
									
									
									
									
								
							| 
						 | 
					@ -1,139 +0,0 @@
 | 
				
			||||||
--- APRSCode.c
 | 
					 | 
				
			||||||
+++ APRSCode.c
 | 
					 | 
				
			||||||
@@ -3674,7 +3674,7 @@
 | 
					 | 
				
			||||||
 			if (ptr1)
 | 
					 | 
				
			||||||
 				*ptr1 = 0;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-//			Debugprintf("Duplicate Message supressed %s", Msg);
 | 
					 | 
				
			||||||
+//			Debugprintf("Duplicate Message suppressed %s", Msg);
 | 
					 | 
				
			||||||
 			return TRUE;					// Duplicate
 | 
					 | 
				
			||||||
 		}
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
--- BPQChat.rc
 | 
					 | 
				
			||||||
+++ BPQChat.rc
 | 
					 | 
				
			||||||
@@ -162,7 +162,7 @@
 | 
					 | 
				
			||||||
                     WS_VSCROLL
 | 
					 | 
				
			||||||
     DEFPUSHBUTTON   "Save Welcome Message",SAVEWELCOME,140,296,91,14,
 | 
					 | 
				
			||||||
                     BS_CENTER | BS_VCENTER
 | 
					 | 
				
			||||||
-    LTEXT           " If the node is not directly  connectable (ie is not in your NODES table)  you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
 | 
					 | 
				
			||||||
+    LTEXT           " If the node is not directly  connectable (ie is not in your NODES table)  you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
 | 
					 | 
				
			||||||
                     IDC_STATIC,9,52,355,24
 | 
					 | 
				
			||||||
 END
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- BPQMail.rc
 | 
					 | 
				
			||||||
+++ BPQMail.rc
 | 
					 | 
				
			||||||
@@ -1045,7 +1045,7 @@
 | 
					 | 
				
			||||||
     CONTROL         "Delete Log and Message Files to Recycle Bin",
 | 
					 | 
				
			||||||
                     IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX | 
 | 
					 | 
				
			||||||
                     BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
 | 
					 | 
				
			||||||
-    CONTROL         "Supress Mailing of Housekeeping Results",
 | 
					 | 
				
			||||||
+    CONTROL         "Suppress Mailing of Housekeeping Results",
 | 
					 | 
				
			||||||
                     IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | 
 | 
					 | 
				
			||||||
                     BS_MULTILINE | WS_TABSTOP,5,182,115,20
 | 
					 | 
				
			||||||
     CONTROL         "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
 | 
					 | 
				
			||||||
--- HanksRT.c
 | 
					 | 
				
			||||||
+++ HanksRT.c
 | 
					 | 
				
			||||||
@@ -1186,7 +1186,7 @@
 | 
					 | 
				
			||||||
 			// Duplicate, so discard, but save time
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 			DupInfo[i].DupTime = Now;
 | 
					 | 
				
			||||||
-			Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
 | 
					 | 
				
			||||||
+			Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 			return TRUE;					// Duplicate
 | 
					 | 
				
			||||||
 		}
 | 
					 | 
				
			||||||
--- RigControl.c
 | 
					 | 
				
			||||||
+++ RigControl.c
 | 
					 | 
				
			||||||
@@ -8385,7 +8385,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	switch (Msg[0])
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
-	case 'f':			// Get Freqency
 | 
					 | 
				
			||||||
+	case 'f':			// Get Frequency
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 		HLGetFreq(Sock, RIG, sep);
 | 
					 | 
				
			||||||
 		return 0;
 | 
					 | 
				
			||||||
--- UZ7HODrv.c
 | 
					 | 
				
			||||||
+++ UZ7HODrv.c
 | 
					 | 
				
			||||||
@@ -374,7 +374,7 @@
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
 		// Read Freq
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
 | 
					 | 
				
			||||||
+		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
 | 
					 | 
				
			||||||
 		return 1;
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
@@ -382,7 +382,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	if (AGW->CenterFreq == 0)
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
-		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
 | 
					 | 
				
			||||||
+		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
 | 
					 | 
				
			||||||
 		return 1;
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- WinRPRHelper.c
 | 
					 | 
				
			||||||
+++ WinRPRHelper.c
 | 
					 | 
				
			||||||
@@ -111,7 +111,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	if (argc < 3)
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
-		printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
 | 
					 | 
				
			||||||
+		printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
 | 
					 | 
				
			||||||
 			"  WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
 | 
					 | 
				
			||||||
 			"Press any key to exit\r\n");
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- config.c
 | 
					 | 
				
			||||||
+++ config.c
 | 
					 | 
				
			||||||
@@ -649,7 +649,7 @@
 | 
					 | 
				
			||||||
 	if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
 		Consoleprintf("");
 | 
					 | 
				
			||||||
-		Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
 | 
					 | 
				
			||||||
+		Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
 | 
					 | 
				
			||||||
 		Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
 | 
					 | 
				
			||||||
 		Consoleprintf("");
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- kiss.c
 | 
					 | 
				
			||||||
+++ kiss.c
 | 
					 | 
				
			||||||
@@ -1485,7 +1485,7 @@
 | 
					 | 
				
			||||||
 				}	
 | 
					 | 
				
			||||||
 			}
 | 
					 | 
				
			||||||
 			else
 | 
					 | 
				
			||||||
-				Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",  
 | 
					 | 
				
			||||||
+				Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",  
 | 
					 | 
				
			||||||
 					KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 			goto SeeifMore;				// SEE IF ANYTHING ELSE
 | 
					 | 
				
			||||||
--- templatedefs.c
 | 
					 | 
				
			||||||
+++ templatedefs.c
 | 
					 | 
				
			||||||
@@ -1165,7 +1165,7 @@
 | 
					 | 
				
			||||||
 		"Send Non-delivery Notifications<br>\r\n"
 | 
					 | 
				
			||||||
 		"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
 | 
					 | 
				
			||||||
 		"  <br />\r\n"
 | 
					 | 
				
			||||||
-		"Supress Mailing of<br>\r\n"
 | 
					 | 
				
			||||||
+		"Suppress Mailing of<br>\r\n"
 | 
					 | 
				
			||||||
 		"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
 | 
					 | 
				
			||||||
 		"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
 | 
					 | 
				
			||||||
 		"<div style=\"text-align: center;\"><input class='btn'  name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
 | 
					 | 
				
			||||||
@@ -1454,7 +1454,7 @@
 | 
					 | 
				
			||||||
 		"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
 | 
					 | 
				
			||||||
 		"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
 | 
					 | 
				
			||||||
 		"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
 | 
					 | 
				
			||||||
-		"seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
 | 
					 | 
				
			||||||
+		"separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 		"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
 | 
					 | 
				
			||||||
 		"<br></div>\n"
 | 
					 | 
				
			||||||
--- WebMail.c
 | 
					 | 
				
			||||||
+++ WebMail.c
 | 
					 | 
				
			||||||
@@ -2020,7 +2020,7 @@
 | 
					 | 
				
			||||||
 			"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
 | 
					 | 
				
			||||||
 			" document.getElementById('myform').submit();}</script>"
 | 
					 | 
				
			||||||
 			"<input type=button class='btn' onclick='myfunc()' "
 | 
					 | 
				
			||||||
-			"value='Include Orignal Msg'>";
 | 
					 | 
				
			||||||
+			"value='Include Original Msg'>";
 | 
					 | 
				
			||||||
 		
 | 
					 | 
				
			||||||
 		char Temp[1024];
 | 
					 | 
				
			||||||
 		char ReplyAddr[128];
 | 
					 | 
				
			||||||
							
								
								
									
										5
									
								
								6pack.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								6pack.c
									
									
									
									
									
								
							| 
						 | 
					@ -1412,10 +1412,11 @@ VOID * SIXPACKExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
 | 
						TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_SIXPACK;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SIXPACK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->ARDOPBuffer = malloc(8192);
 | 
						TNC->ARDOPBuffer = malloc(8192);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -382,7 +382,8 @@ VOID * AEAExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_AEA;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->TEXTMODE = FALSE;
 | 
						TNC->TEXTMODE = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -390,8 +391,6 @@ VOID * AEAExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->InitScript = _strupr(TNC->InitScript);
 | 
						TNC->InitScript = _strupr(TNC->InitScript);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										63
									
								
								AGWAPI.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								AGWAPI.c
									
									
									
									
									
								
							| 
						 | 
					@ -36,7 +36,8 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct AGWHeader
 | 
					struct AGWHeader
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    unsigned int Port;
 | 
					    uint8_t Port;
 | 
				
			||||||
 | 
						uint8_t filler1[3];
 | 
				
			||||||
	unsigned char DataKind;
 | 
						unsigned char DataKind;
 | 
				
			||||||
    unsigned char filler2;
 | 
					    unsigned char filler2;
 | 
				
			||||||
	unsigned char PID;
 | 
						unsigned char PID;
 | 
				
			||||||
| 
						 | 
					@ -128,7 +129,7 @@ int DataSocket_Write(struct AGWSocketConnectionInfo * sockptr, SOCKET sock);
 | 
				
			||||||
int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
 | 
					int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
 | 
				
			||||||
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
 | 
					int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
 | 
				
			||||||
int SendDataToAppl(int Stream, byte * Buffer, int Length);
 | 
					int SendDataToAppl(int Stream, byte * Buffer, int Length);
 | 
				
			||||||
int InternalAGWDecodeFrame(char * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes);
 | 
					int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes);
 | 
				
			||||||
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
 | 
					int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
 | 
				
			||||||
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
 | 
					int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
 | 
				
			||||||
int ShowApps();
 | 
					int ShowApps();
 | 
				
			||||||
| 
						 | 
					@ -720,7 +721,7 @@ int AGWDoMonitorData()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		RawLen = monbuff->LENGTH;
 | 
							RawLen = monbuff->LENGTH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (RawLen < 7 || RawLen > 350)
 | 
							if (RawLen < MSGHDDRLEN || RawLen > 350)
 | 
				
			||||||
		{	
 | 
							{	
 | 
				
			||||||
			ReleaseBuffer(monbuff);
 | 
								ReleaseBuffer(monbuff);
 | 
				
			||||||
			FreeSemaphore(&Semaphore);
 | 
								FreeSemaphore(&Semaphore);
 | 
				
			||||||
| 
						 | 
					@ -735,11 +736,15 @@ int AGWDoMonitorData()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		FreeSemaphore(&Semaphore);
 | 
							FreeSemaphore(&Semaphore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Set monbuff to point to the copy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							monbuff = (MESSAGE *)Buffer;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
//'   4 byte chain
 | 
					//'   4 byte chain
 | 
				
			||||||
//'   1 byte port - top bit = transmit
 | 
					//'   1 byte port - top bit = transmit
 | 
				
			||||||
//'   2 byte length (LO-HI)
 | 
					//'   2 byte length (LO-HI)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Port = Buffer[4];
 | 
							Port = monbuff->PORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (Port > 127)
 | 
							if (Port > 127)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -751,6 +756,12 @@ int AGWDoMonitorData()
 | 
				
			||||||
		    RXFlag = TRUE;
 | 
							    RXFlag = TRUE;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Port == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Debugprintf("AGWMON Port number is zero");
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Can now have different mon flags per connection, so need to run decode for each socket
 | 
							// Can now have different mon flags per connection, so need to run decode for each socket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (n = 1; n<= CurrentSockets; n++)
 | 
							for (n = 1; n<= CurrentSockets; n++)
 | 
				
			||||||
| 
						 | 
					@ -759,7 +770,7 @@ int AGWDoMonitorData()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag))
 | 
								if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Length = InternalAGWDecodeFrame(Buffer, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes);
 | 
									Length = InternalAGWDecodeFrame(monbuff, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (Length > 0)
 | 
									if (Length > 0)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -803,7 +814,7 @@ int AGWDoMonitorData()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		RawLen = RawLen - 6;
 | 
							RawLen = RawLen - (MSGHDDRLEN - 1);		// One more for KISS control
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
		if (RXFlag || Loopflag) // Send transmitted frames if requested
 | 
							if (RXFlag || Loopflag) // Send transmitted frames if requested
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -812,7 +823,11 @@ int AGWDoMonitorData()
 | 
				
			||||||
        //  Send raw data to any sockets that have requested Raw frames
 | 
					        //  Send raw data to any sockets that have requested Raw frames
 | 
				
			||||||
        //
 | 
					        //
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Buffer[6]=0;
 | 
							// Format is ax.25 packet prceeded by a KISS command byte 00 for channel 1 0x10 for channel 2 etc
 | 
				
			||||||
 | 
							// As this is an application API I think all should go as Port 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Buffer[MSGHDDRLEN - 1] = 0;			// Just in case big-endian
 | 
				
			||||||
       
 | 
					       
 | 
				
			||||||
			AGWTXHeader.Port = Port - 1;       // AGW Ports start from 0
 | 
								AGWTXHeader.Port = Port - 1;       // AGW Ports start from 0
 | 
				
			||||||
			AGWTXHeader.DataKind = 'K';
 | 
								AGWTXHeader.DataKind = 'K';
 | 
				
			||||||
| 
						 | 
					@ -824,14 +839,12 @@ int AGWDoMonitorData()
 | 
				
			||||||
				sockptr=&Sockets[n];
 | 
									sockptr=&Sockets[n];
 | 
				
			||||||
       
 | 
					       
 | 
				
			||||||
				if (sockptr->SocketActive && sockptr->RawFlag)
 | 
									if (sockptr->SocketActive && sockptr->RawFlag)
 | 
				
			||||||
					SendRawPacket(sockptr, &Buffer[6], RawLen);
 | 
										SendRawPacket(sockptr, &Buffer[MSGHDDRLEN - 1], RawLen);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}		
 | 
							}		
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					   return 0;
 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int DeleteConnection(struct BPQConnectionInfo * Con)
 | 
					int DeleteConnection(struct BPQConnectionInfo * Con)
 | 
				
			||||||
| 
						 | 
					@ -1128,6 +1141,7 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
 | 
				
			||||||
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
					int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int AGWVersion[2]={2003,999};
 | 
						int AGWVersion[2]={2003,999};
 | 
				
			||||||
 | 
						byte AGWPortCaps[12] = { 0, 255, 30, 10, 63, 10, 4, 0, 1, 0, 0, 0 };
 | 
				
			||||||
	char AGWRegReply[1];
 | 
						char AGWRegReply[1];
 | 
				
			||||||
	struct BPQConnectionInfo * Connection;
 | 
						struct BPQConnectionInfo * Connection;
 | 
				
			||||||
	int Stream;
 | 
						int Stream;
 | 
				
			||||||
| 
						 | 
					@ -1142,6 +1156,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
	int con,conport;
 | 
						int con,conport;
 | 
				
			||||||
	int AGWYReply = 0;
 | 
						int AGWYReply = 0;
 | 
				
			||||||
	int state, change;
 | 
						int state, change;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if we have hidden some ports then the port in the AGW packet will be an index into the visible ports,
 | 
						// if we have hidden some ports then the port in the AGW packet will be an index into the visible ports,
 | 
				
			||||||
	// not the real port number
 | 
						// not the real port number
 | 
				
			||||||
| 
						 | 
					@ -1194,9 +1209,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Need to convert port index (used by AGW) to port number
 | 
								// Need to convert port index (used by AGW) to port number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]);
 | 
								conport=GetPortNumber(VisiblePortToRealPort[key[0]-49] + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			sprintf(ConnectMsg,"C %d %s",conport,ToCall);
 | 
								n = sprintf(ConnectMsg,"C %d %s",conport,ToCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// if 'v' command add digis
 | 
								// if 'v' command add digis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1211,7 +1226,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				while(nDigis--)
 | 
									while(nDigis--)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis);
 | 
										n += sprintf(&ConnectMsg[n], " %s", Digis);
 | 
				
			||||||
					Digis += 10;
 | 
										Digis += 10;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1292,9 +1307,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
    //   Version
 | 
					    //   Version
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        memset(&AGWTXHeader,0,36);
 | 
					        memset(&AGWTXHeader,0,36);
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        AGWTXHeader.DataKind = 'R';
 | 
					        AGWTXHeader.DataKind = 'R';
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AGWTXHeader.DataLength = 8;       // Length
 | 
					        AGWTXHeader.DataLength = 8;       // Length
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]);
 | 
					        SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]);
 | 
				
			||||||
| 
						 | 
					@ -1308,9 +1321,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        memset(&AGWTXHeader,0,36);
 | 
					        memset(&AGWTXHeader,0,36);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AGWTXHeader.DataKind = 'G';
 | 
					        AGWTXHeader.DataKind = 'G';
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1;     // Length
 | 
					        AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1;     // Length
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        SendtoSocket(sockptr->socket, AGWPorts);
 | 
					        SendtoSocket(sockptr->socket, AGWPorts);
 | 
				
			||||||
| 
						 | 
					@ -1318,6 +1329,20 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		     
 | 
							     
 | 
				
			||||||
 | 
						case 'g':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //   Port capabilities. Currently hard-coded.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							AGWTXHeader.Port = sockptr->AGWRXHeader.Port;
 | 
				
			||||||
 | 
							AGWTXHeader.DataKind = 'g';
 | 
				
			||||||
 | 
							AGWTXHeader.DataLength = 12;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SendtoSocket(sockptr->socket, (char *)&AGWPortCaps[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
	case 'k':
 | 
						case 'k':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       //   Toggle Raw receive
 | 
					       //   Toggle Raw receive
 | 
				
			||||||
| 
						 | 
					@ -1415,6 +1440,8 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        AGWTXHeader.DataKind = 'X';
 | 
					        AGWTXHeader.DataKind = 'X';
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        memcpy(&AGWTXHeader.callfrom, RegCall, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        AGWTXHeader.DataLength = 1;      // Length
 | 
					        AGWTXHeader.DataLength = 1;      // Length
 | 
				
			||||||
             
 | 
					             
 | 
				
			||||||
        AGWRegReply[0] = 1;
 | 
					        AGWRegReply[0] = 1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										100
									
								
								AGWMoncode.c
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								AGWMoncode.c
									
									
									
									
									
								
							| 
						 | 
					@ -49,9 +49,14 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#define	DM	0x0F
 | 
					#define	DM	0x0F
 | 
				
			||||||
#define	UA	0x63
 | 
					#define	UA	0x63
 | 
				
			||||||
#define	FRMR 0x87
 | 
					#define	FRMR 0x87
 | 
				
			||||||
 | 
					#define XID     0xAF
 | 
				
			||||||
 | 
					#define TEST    0xE3
 | 
				
			||||||
#define	RR	1
 | 
					#define	RR	1
 | 
				
			||||||
#define	RNR	5
 | 
					#define	RNR	5
 | 
				
			||||||
#define	REJ	9
 | 
					#define	REJ	9
 | 
				
			||||||
 | 
					#define	SREJ 0x0D
 | 
				
			||||||
 | 
					#define SABME 0x6F
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	PFBIT 0x10		// POLL/FINAL BIT IN CONTROL BYTE
 | 
					#define	PFBIT 0x10		// POLL/FINAL BIT IN CONTROL BYTE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -261,6 +266,18 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
 | 
				
			||||||
			strcpy(SUP, "FRMR");
 | 
								strcpy(SUP, "FRMR");
 | 
				
			||||||
			FRMRFLAG = 1;
 | 
								FRMRFLAG = 1;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case XID:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(SUP, "XID");
 | 
				
			||||||
 | 
								XIDFLAG = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case TEST:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(SUP, "TEST");
 | 
				
			||||||
 | 
								TESTFLAG = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR);
 | 
							Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR);
 | 
				
			||||||
| 
						 | 
					@ -270,7 +287,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
 | 
				
			||||||
		// Super
 | 
							// Super
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int NR = (CTL >> 5) & 7;
 | 
							int NR = (CTL >> 5) & 7;
 | 
				
			||||||
		char SUP[4] = "??";
 | 
							char SUP[5] = "??";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (CTL & 0x0F)
 | 
							switch (CTL & 0x0F)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -288,6 +305,13 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			strcpy(SUP, "REJ");
 | 
								strcpy(SUP, "REJ");
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case SREJ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(SUP, "SREJ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
 | 
							Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
 | 
				
			||||||
| 
						 | 
					@ -300,6 +324,72 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
 | 
				
			||||||
	if (FRMRFLAG)
 | 
						if (FRMRFLAG)
 | 
				
			||||||
		Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]); 
 | 
							Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (XIDFLAG)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Decode and display XID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UCHAR * ptr = &ADJBUFFER->PID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (*ptr++ == 0x82 && *ptr++ == 0x80)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								int Type;
 | 
				
			||||||
 | 
								int Len;
 | 
				
			||||||
 | 
								unsigned int value;
 | 
				
			||||||
 | 
								int xidlen = *(ptr++) << 8;
 | 
				
			||||||
 | 
								xidlen += *ptr++;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
								// XID is set of Type, Len, Value n-tuples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// G8BPQ-2>G8BPQ:(XID cmd, p=1) Half-Duplex SREJ modulo-128 I-Field-Length-Rx=256 Window-Size-Rx=32 Ack-Timer=3000 Retries=10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								while (xidlen > 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Type = *ptr++;
 | 
				
			||||||
 | 
									Len = *ptr++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									value = 0;
 | 
				
			||||||
 | 
									xidlen -= (Len + 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									while (Len--)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										value <<=8;
 | 
				
			||||||
 | 
										value += *ptr++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									switch(Type)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
									case 2:				//Bin fields
 | 
				
			||||||
 | 
									case 3:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " %d=%x", Type, value);
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 6:				//RX Size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " RX Paclen=%d", value / 8);
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 8:				//RX Window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " RX Window=%d", value);
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 16:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " Can Compress");
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 17:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " Compress ok");
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}	
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Info)
 | 
						if (Info)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// We have an info frame
 | 
							// We have an info frame
 | 
				
			||||||
| 
						 | 
					@ -419,6 +509,14 @@ UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNo
 | 
				
			||||||
		return Output;
 | 
							return Output;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ADJBUFFER->L2DATA[0] == 0xfe)			// Paula's Nodes Poll
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							memcpy(Alias, ++ptr, 6);
 | 
				
			||||||
 | 
							Output += sprintf((char *)Output, " NODES POLL from %s\r", Alias);
 | 
				
			||||||
 | 
							return Output;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	Display normal NET/ROM transmissions 
 | 
						//	Display normal NET/ROM transmissions 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Output += sprintf((char *)Output, " NET/ROM\r  ");
 | 
						Output += sprintf((char *)Output, " NET/ROM\r  ");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								AISCommon.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								AISCommon.c
									
									
									
									
									
								
							| 
						 | 
					@ -760,7 +760,7 @@ void SaveVesselDataBase()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LoadNavAidDataBase()
 | 
					void LoadNavAidDataBase()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i, n, count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	FILE *file;
 | 
						FILE *file;
 | 
				
			||||||
	char buf[256];
 | 
						char buf[256];
 | 
				
			||||||
| 
						 | 
					@ -793,10 +793,12 @@ void LoadNavAidDataBase()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *));
 | 
						NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < NavAidCount; i++)
 | 
						for (i = 0; i < NavAidCount; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD));
 | 
							navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD));
 | 
				
			||||||
		NavRecords[i] = navptr;
 | 
							NavRecords[count] = navptr;
 | 
				
			||||||
		memset(navptr, 0, sizeof(struct NAVAIDRECORD));
 | 
							memset(navptr, 0, sizeof(struct NAVAIDRECORD));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fgets(buf, 255, file);
 | 
							fgets(buf, 255, file);
 | 
				
			||||||
| 
						 | 
					@ -807,6 +809,19 @@ void LoadNavAidDataBase()
 | 
				
			||||||
		token = strtok(NULL,  "|\n" );
 | 
							token = strtok(NULL,  "|\n" );
 | 
				
			||||||
		strcpy(&navptr->name[0],token);
 | 
							strcpy(&navptr->name[0],token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (n = 0; n < 20; n++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								char c = navptr->name[n];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (!isalpha(c) && !isdigit(c) && c != ' ' && c != '_')
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									count--;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		token = strtok(NULL, "|\n" );
 | 
							token = strtok(NULL, "|\n" );
 | 
				
			||||||
		navptr->lat = atof(token);
 | 
							navptr->lat = atof(token);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -820,6 +835,7 @@ void LoadNavAidDataBase()
 | 
				
			||||||
		navptr->TimeLastUpdated = atoi(token);
 | 
							navptr->TimeLastUpdated = atoi(token);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						NavAidCount = count;
 | 
				
			||||||
	fclose(file);
 | 
						fclose(file);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -553,6 +553,8 @@ int APRSWriteLog(char * msg)
 | 
				
			||||||
	UCHAR Value[MAX_PATH];
 | 
						UCHAR Value[MAX_PATH];
 | 
				
			||||||
	time_t T;
 | 
						time_t T;
 | 
				
			||||||
	struct tm * tm;
 | 
						struct tm * tm;
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (LogAPRSIS == 0)
 | 
						if (LogAPRSIS == 0)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -574,8 +576,9 @@ int APRSWriteLog(char * msg)
 | 
				
			||||||
		strcat(Value, "logs/APRS_");
 | 
							strcat(Value, "logs/APRS_");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(Value, "%s%02d%02d%02d.log", Value,
 | 
						n = strlen(Value);
 | 
				
			||||||
				tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
 | 
					
 | 
				
			||||||
 | 
						sprintf(&Value[n], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((file = fopen(Value, "ab")) == NULL)
 | 
						if ((file = fopen(Value, "ab")) == NULL)
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9223
									
								
								APRSCode.c.orig
									
									
									
									
									
								
							
							
						
						
									
										9223
									
								
								APRSCode.c.orig
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										139
									
								
								APRSCode.c.rej
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								APRSCode.c.rej
									
									
									
									
									
								
							| 
						 | 
					@ -1,139 +0,0 @@
 | 
				
			||||||
--- APRSCode.c
 | 
					 | 
				
			||||||
+++ APRSCode.c
 | 
					 | 
				
			||||||
@@ -3674,7 +3674,7 @@
 | 
					 | 
				
			||||||
 			if (ptr1)
 | 
					 | 
				
			||||||
 				*ptr1 = 0;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-//			Debugprintf("Duplicate Message supressed %s", Msg);
 | 
					 | 
				
			||||||
+//			Debugprintf("Duplicate Message suppressed %s", Msg);
 | 
					 | 
				
			||||||
 			return TRUE;					// Duplicate
 | 
					 | 
				
			||||||
 		}
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
--- BPQChat.rc
 | 
					 | 
				
			||||||
+++ BPQChat.rc
 | 
					 | 
				
			||||||
@@ -162,7 +162,7 @@
 | 
					 | 
				
			||||||
                     WS_VSCROLL
 | 
					 | 
				
			||||||
     DEFPUSHBUTTON   "Save Welcome Message",SAVEWELCOME,140,296,91,14,
 | 
					 | 
				
			||||||
                     BS_CENTER | BS_VCENTER
 | 
					 | 
				
			||||||
-    LTEXT           " If the node is not directly  connectable (ie is not in your NODES table)  you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
 | 
					 | 
				
			||||||
+    LTEXT           " If the node is not directly  connectable (ie is not in your NODES table)  you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
 | 
					 | 
				
			||||||
                     IDC_STATIC,9,52,355,24
 | 
					 | 
				
			||||||
 END
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- BPQMail.rc
 | 
					 | 
				
			||||||
+++ BPQMail.rc
 | 
					 | 
				
			||||||
@@ -1045,7 +1045,7 @@
 | 
					 | 
				
			||||||
     CONTROL         "Delete Log and Message Files to Recycle Bin",
 | 
					 | 
				
			||||||
                     IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX | 
 | 
					 | 
				
			||||||
                     BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
 | 
					 | 
				
			||||||
-    CONTROL         "Supress Mailing of Housekeeping Results",
 | 
					 | 
				
			||||||
+    CONTROL         "Suppress Mailing of Housekeeping Results",
 | 
					 | 
				
			||||||
                     IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | 
 | 
					 | 
				
			||||||
                     BS_MULTILINE | WS_TABSTOP,5,182,115,20
 | 
					 | 
				
			||||||
     CONTROL         "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
 | 
					 | 
				
			||||||
--- HanksRT.c
 | 
					 | 
				
			||||||
+++ HanksRT.c
 | 
					 | 
				
			||||||
@@ -1186,7 +1186,7 @@
 | 
					 | 
				
			||||||
 			// Duplicate, so discard, but save time
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 			DupInfo[i].DupTime = Now;
 | 
					 | 
				
			||||||
-			Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
 | 
					 | 
				
			||||||
+			Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 			return TRUE;					// Duplicate
 | 
					 | 
				
			||||||
 		}
 | 
					 | 
				
			||||||
--- RigControl.c
 | 
					 | 
				
			||||||
+++ RigControl.c
 | 
					 | 
				
			||||||
@@ -8385,7 +8385,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	switch (Msg[0])
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
-	case 'f':			// Get Freqency
 | 
					 | 
				
			||||||
+	case 'f':			// Get Frequency
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 		HLGetFreq(Sock, RIG, sep);
 | 
					 | 
				
			||||||
 		return 0;
 | 
					 | 
				
			||||||
--- UZ7HODrv.c
 | 
					 | 
				
			||||||
+++ UZ7HODrv.c
 | 
					 | 
				
			||||||
@@ -374,7 +374,7 @@
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
 		// Read Freq
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
 | 
					 | 
				
			||||||
+		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
 | 
					 | 
				
			||||||
 		return 1;
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
@@ -382,7 +382,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	if (AGW->CenterFreq == 0)
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
-		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
 | 
					 | 
				
			||||||
+		buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
 | 
					 | 
				
			||||||
 		return 1;
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- WinRPRHelper.c
 | 
					 | 
				
			||||||
+++ WinRPRHelper.c
 | 
					 | 
				
			||||||
@@ -111,7 +111,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	if (argc < 3)
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
-		printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
 | 
					 | 
				
			||||||
+		printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
 | 
					 | 
				
			||||||
 			"  WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
 | 
					 | 
				
			||||||
 			"Press any key to exit\r\n");
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- config.c
 | 
					 | 
				
			||||||
+++ config.c
 | 
					 | 
				
			||||||
@@ -649,7 +649,7 @@
 | 
					 | 
				
			||||||
 	if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
 | 
					 | 
				
			||||||
 	{
 | 
					 | 
				
			||||||
 		Consoleprintf("");
 | 
					 | 
				
			||||||
-		Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
 | 
					 | 
				
			||||||
+		Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
 | 
					 | 
				
			||||||
 		Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
 | 
					 | 
				
			||||||
 		Consoleprintf("");
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
--- kiss.c
 | 
					 | 
				
			||||||
+++ kiss.c
 | 
					 | 
				
			||||||
@@ -1485,7 +1485,7 @@
 | 
					 | 
				
			||||||
 				}	
 | 
					 | 
				
			||||||
 			}
 | 
					 | 
				
			||||||
 			else
 | 
					 | 
				
			||||||
-				Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",  
 | 
					 | 
				
			||||||
+				Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",  
 | 
					 | 
				
			||||||
 					KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 			goto SeeifMore;				// SEE IF ANYTHING ELSE
 | 
					 | 
				
			||||||
--- templatedefs.c
 | 
					 | 
				
			||||||
+++ templatedefs.c
 | 
					 | 
				
			||||||
@@ -1165,7 +1165,7 @@
 | 
					 | 
				
			||||||
 		"Send Non-delivery Notifications<br>\r\n"
 | 
					 | 
				
			||||||
 		"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
 | 
					 | 
				
			||||||
 		"  <br />\r\n"
 | 
					 | 
				
			||||||
-		"Supress Mailing of<br>\r\n"
 | 
					 | 
				
			||||||
+		"Suppress Mailing of<br>\r\n"
 | 
					 | 
				
			||||||
 		"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
 | 
					 | 
				
			||||||
 		"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
 | 
					 | 
				
			||||||
 		"<div style=\"text-align: center;\"><input class='btn'  name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
 | 
					 | 
				
			||||||
@@ -1454,7 +1454,7 @@
 | 
					 | 
				
			||||||
 		"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
 | 
					 | 
				
			||||||
 		"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
 | 
					 | 
				
			||||||
 		"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
 | 
					 | 
				
			||||||
-		"seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
 | 
					 | 
				
			||||||
+		"separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 		"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
 | 
					 | 
				
			||||||
 		"<br></div>\n"
 | 
					 | 
				
			||||||
--- WebMail.c
 | 
					 | 
				
			||||||
+++ WebMail.c
 | 
					 | 
				
			||||||
@@ -2020,7 +2020,7 @@
 | 
					 | 
				
			||||||
 			"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
 | 
					 | 
				
			||||||
 			" document.getElementById('myform').submit();}</script>"
 | 
					 | 
				
			||||||
 			"<input type=button class='btn' onclick='myfunc()' "
 | 
					 | 
				
			||||||
-			"value='Include Orignal Msg'>";
 | 
					 | 
				
			||||||
+			"value='Include Original Msg'>";
 | 
					 | 
				
			||||||
 		
 | 
					 | 
				
			||||||
 		char Temp[1024];
 | 
					 | 
				
			||||||
 		char ReplyAddr[128];
 | 
					 | 
				
			||||||
							
								
								
									
										79
									
								
								ARDOP.c
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								ARDOP.c
									
									
									
									
									
								
							| 
						 | 
					@ -62,6 +62,12 @@ int (WINAPI FAR *EnumProcessesPtr)();
 | 
				
			||||||
#include "tncinfo.h"
 | 
					#include "tncinfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WSA_ACCEPT WM_USER + 1
 | 
					#define WSA_ACCEPT WM_USER + 1
 | 
				
			||||||
#define WSA_DATA WM_USER + 2
 | 
					#define WSA_DATA WM_USER + 2
 | 
				
			||||||
#define WSA_CONNECT WM_USER + 3
 | 
					#define WSA_CONNECT WM_USER + 3
 | 
				
			||||||
| 
						 | 
					@ -136,6 +142,7 @@ 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].Connecting = 0;
 | 
				
			||||||
	TNC->Streams[0].Connected = 0;
 | 
						TNC->Streams[0].Connected = 0;
 | 
				
			||||||
	TNC->Streams[0].Attached = 0;
 | 
						TNC->Streams[0].Attached = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -566,7 +573,7 @@ static int ProcessLine(char * buf, int Port)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ARDOPThread(struct TNCINFO * TNC);
 | 
					void ARDOPThread(VOID * Param);
 | 
				
			||||||
VOID ARDOPProcessDataSocketData(int port);
 | 
					VOID ARDOPProcessDataSocketData(int port);
 | 
				
			||||||
int ConnecttoARDOP(struct TNCINFO * TNC);
 | 
					int ConnecttoARDOP(struct TNCINFO * TNC);
 | 
				
			||||||
static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
 | 
					static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
 | 
				
			||||||
| 
						 | 
					@ -887,8 +894,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
 | 
								if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									Debugprintf("ARDOP closing session on SessionTimelimit");
 | 
				
			||||||
				ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
 | 
									ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
 | 
				
			||||||
				STREAM->Disconnecting = TRUE;
 | 
									STREAM->ReportDISC = 1;
 | 
				
			||||||
 | 
									STREAM->AttachTime = 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -898,6 +907,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
 | 
								if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									Debugprintf("ARDOP closing session on AttachTimelimit");
 | 
				
			||||||
				STREAM->ReportDISC = 1;
 | 
									STREAM->ReportDISC = 1;
 | 
				
			||||||
				STREAM->AttachTime = 0;
 | 
									STREAM->AttachTime = 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1492,7 +1502,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
								if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
									char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
									sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -1979,6 +1992,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->LogPath)
 | 
						if (TNC->LogPath)
 | 
				
			||||||
		ARDOPOpenLogFiles(TNC); 
 | 
							ARDOPOpenLogFiles(TNC); 
 | 
				
			||||||
| 
						 | 
					@ -1991,7 +2005,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	if (TNC->ProgramPath)
 | 
						if (TNC->ProgramPath)
 | 
				
			||||||
		TNC->WeStartedTNC = RestartTNC(TNC);
 | 
							TNC->WeStartedTNC = RestartTNC(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_ARDOP;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->BusyWait == 0)
 | 
						if (TNC->BusyWait == 0)
 | 
				
			||||||
		TNC->BusyWait = 10;
 | 
							TNC->BusyWait = 10;
 | 
				
			||||||
| 
						 | 
					@ -1999,7 +2013,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	if (TNC->BusyHold == 0)
 | 
						if (TNC->BusyHold == 0)
 | 
				
			||||||
		TNC->BusyHold = 1;
 | 
							TNC->BusyHold = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					@ -2054,21 +2067,12 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	strcat(TempScript, "ARQTIMEOUT 90\r");
 | 
						strcat(TempScript, "ARQTIMEOUT 90\r");
 | 
				
			||||||
//	strcat(TempScript, "ROBUST False\r");
 | 
					//	strcat(TempScript, "ROBUST False\r");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strcat(TempScript, TNC->InitScript);
 | 
						// Make MYAUX and MYCALL overridable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(TNC->InitScript);
 | 
					 | 
				
			||||||
	TNC->InitScript = TempScript;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Set MYCALL
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//	strcat(TNC->InitScript,"FECRCV True\r");
 | 
					 | 
				
			||||||
//	strcat(TNC->InitScript,"AUTOBREAK True\r");
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	sprintf(Msg, "MYCALL %s\r", TNC->NodeCall);
 | 
						sprintf(Msg, "MYCALL %s\r", TNC->NodeCall);
 | 
				
			||||||
	strcat(TNC->InitScript, Msg);
 | 
						strcat(TempScript, Msg);
 | 
				
			||||||
//	strcat(TNC->InitScript,"PROCESSID\r");
 | 
					
 | 
				
			||||||
//	strcat(TNC->InitScript,"CODEC TRUE\r");
 | 
					 | 
				
			||||||
//	strcat(TNC->InitScript,"LISTEN TRUE\r");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < 32; i++)
 | 
						for (i = 0; i < 32; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -2092,9 +2096,25 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	if (strlen(Aux) > 8)
 | 
						if (strlen(Aux) > 8)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		Aux[strlen(Aux) - 1] = '\r';
 | 
							Aux[strlen(Aux) - 1] = '\r';
 | 
				
			||||||
		strcat(TNC->InitScript, Aux);
 | 
							strcat(TempScript, Aux);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcat(TempScript, TNC->InitScript);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(TNC->InitScript);
 | 
				
			||||||
 | 
						TNC->InitScript = TempScript;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	strcat(TNC->InitScript,"FECRCV True\r");
 | 
				
			||||||
 | 
					//	strcat(TNC->InitScript,"AUTOBREAK True\r");
 | 
				
			||||||
 | 
					//	strcat(TNC->InitScript,"PROCESSID\r");
 | 
				
			||||||
 | 
					//	strcat(TNC->InitScript,"CODEC TRUE\r");
 | 
				
			||||||
 | 
					//	strcat(TNC->InitScript,"LISTEN TRUE\r");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strcpy(TNC->CurrentMYC, TNC->NodeCall);
 | 
						strcpy(TNC->CurrentMYC, TNC->NodeCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->WL2K == NULL)
 | 
						if (TNC->WL2K == NULL)
 | 
				
			||||||
| 
						 | 
					@ -2282,11 +2302,11 @@ VOID TNCLost(struct TNCINFO * TNC)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (STREAM->Attached)
 | 
							if (STREAM->Attached)
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			STREAM->Connected = FALSE;
 | 
					 | 
				
			||||||
			STREAM->Connecting = FALSE;
 | 
					 | 
				
			||||||
			STREAM->ReportDISC = TRUE;
 | 
								STREAM->ReportDISC = TRUE;
 | 
				
			||||||
		}
 | 
					
 | 
				
			||||||
 | 
							STREAM->Connected = FALSE;
 | 
				
			||||||
 | 
							STREAM->Connecting = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2298,12 +2318,13 @@ int ConnecttoARDOP(struct TNCINFO * TNC)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID ARDOPThread(struct TNCINFO * TNC)
 | 
					VOID ARDOPThread(VOID * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Opens sockets and looks for data on control and data sockets.
 | 
						// Opens sockets and looks for data on control and data sockets.
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Socket may be TCP/IP or Serial
 | 
						// Socket may be TCP/IP or Serial
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct TNCINFO * TNC = (struct TNCINFO *) Param;
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[255];
 | 
				
			||||||
	int err, i, ret;
 | 
						int err, i, ret;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
| 
						 | 
					@ -3136,6 +3157,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
			// Incoming Connect
 | 
								// Incoming Connect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit;		// Reset Limit
 | 
								TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit;		// Reset Limit
 | 
				
			||||||
 | 
								STREAM->AttachTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Stop other ports in same group
 | 
								// Stop other ports in same group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3318,9 +3340,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (_memicmp(Buffer, "DISCONNECTED", 12) == 0
 | 
						if (_memicmp(Buffer, "DISCONNECTED", 12) == 0
 | 
				
			||||||
		|| _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0  
 | 
							|| _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0  
 | 
				
			||||||
 | 
							|| _memicmp(Buffer, "STATUS END ARQ CALL", 19) == 0  
 | 
				
			||||||
		|| _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0
 | 
							|| _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0
 | 
				
			||||||
//		|| _memicmp(Buffer, "NEWSTATE DISC", 13) == 0
 | 
					//		|| _memicmp(Buffer, "NEWSTATE DISC", 13) == 0
 | 
				
			||||||
		|| _memicmp(Buffer, "ABORT", 5) == 0)
 | 
							|| _memicmp(Buffer, "ABORT", 5) == 0)
 | 
				
			||||||
| 
						 | 
					@ -5743,8 +5765,7 @@ VOID ARDOPSCSPoll(struct TNCINFO * TNC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Probably only for Teensy with ESP01. Runs SCS Emulator over a TCP Link
 | 
					// Probably only for Teensy with ESP01. Runs SCS Emulator over a TCP Link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID SerialConnecttoTCPThread(VOID *  Param);
 | 
				
			||||||
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SerialConnecttoTCP(struct TNCINFO * TNC)
 | 
					int SerialConnecttoTCP(struct TNCINFO * TNC)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -5752,9 +5773,9 @@ int SerialConnecttoTCP(struct TNCINFO * TNC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					VOID SerialConnecttoTCPThread(VOID *  Param)
 | 
				
			||||||
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct TNCINFO * TNC = (struct TNCINFO *) Param;
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[255];
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	u_long param = 1;
 | 
						u_long param = 1;
 | 
				
			||||||
| 
						 | 
					@ -5953,7 +5974,7 @@ VOID ARAXINIT(struct PORTCONTROL * PORT)
 | 
				
			||||||
	char Msg[80] = "";
 | 
						char Msg[80] = "";
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	memcpy(Msg, PORT->PORTDESCRIPTION, 30);
 | 
						memcpy(Msg, PORT->PORTDESCRIPTION, 30);
 | 
				
			||||||
	sprintf(Msg, "%s\n", Msg);
 | 
						strcat(Msg, "\n);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	WritetoConsoleLocal(Msg);
 | 
						WritetoConsoleLocal(Msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,6 +117,8 @@ struct UserInfo * FindBBS(char * Name);
 | 
				
			||||||
void ReleaseWebMailStruct(WebMailInfo * WebMail);
 | 
					void ReleaseWebMailStruct(WebMailInfo * WebMail);
 | 
				
			||||||
VOID TidyWelcomeMsg(char ** pPrompt);
 | 
					VOID TidyWelcomeMsg(char ** pPrompt);
 | 
				
			||||||
int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token);
 | 
					int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token);
 | 
				
			||||||
 | 
					void UndoTransparency(char * input);
 | 
				
			||||||
 | 
					int GetMessageSlotFromMessageNumber(int msgno);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char UNC[] = "";
 | 
					char UNC[] = "";
 | 
				
			||||||
char CHKD[] = "checked=checked ";
 | 
					char CHKD[] = "checked=checked ";
 | 
				
			||||||
| 
						 | 
					@ -186,7 +188,7 @@ char RefreshMainPage[] = "<html><head>"
 | 
				
			||||||
char StatusPage [] = 
 | 
					char StatusPage [] = 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"<form style=\"font-family: monospace; text-align: center\"  method=post action=/Mail/DisSession?%s>"
 | 
					"<form style=\"font-family: monospace; text-align: center\"  method=post action=/Mail/DisSession?%s>"
 | 
				
			||||||
"<br>User     Callsign   Stream Queue<br>"
 | 
					"<br>User     Callsign   Stream  Queue  Sent  Rxed<br>"
 | 
				
			||||||
"<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>";
 | 
					"<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char StreamEnd[] = 
 | 
					char StreamEnd[] = 
 | 
				
			||||||
| 
						 | 
					@ -1701,6 +1703,8 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
 | 
				
			||||||
		free(Filters);
 | 
							free(Filters);
 | 
				
			||||||
		Filters = NULL;
 | 
							Filters = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UndoTransparency(input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while (input)
 | 
							while (input)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// extract and validate before saving
 | 
								// extract and validate before saving
 | 
				
			||||||
| 
						 | 
					@ -1714,7 +1718,7 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			input = strstr(input, "&Type=");
 | 
								input = strstr(input, "&Type=");
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if (Filter.Action == 'H' || Filter.Action == 'R')
 | 
								if (Filter.Action == 'H' || Filter.Action == 'R' || Filter.Action == 'A')
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Filter.Type = toupper(input[6]);
 | 
									Filter.Type = toupper(input[6]);
 | 
				
			||||||
				input = strstr(input, "&From=");
 | 
									input = strstr(input, "&From=");
 | 
				
			||||||
| 
						 | 
					@ -2439,8 +2443,8 @@ VOID ProcessMsgFwdUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
 | 
				
			||||||
			set_fwd_bit(Msg->fbbs, BBSNumber);
 | 
								set_fwd_bit(Msg->fbbs, BBSNumber);
 | 
				
			||||||
			User->ForwardingInfo->MsgCount++;
 | 
								User->ForwardingInfo->MsgCount++;
 | 
				
			||||||
			clear_fwd_bit(Msg->forw, BBSNumber);
 | 
								clear_fwd_bit(Msg->forw, BBSNumber);
 | 
				
			||||||
			if (FirstMessageIndextoForward > Msg->number)
 | 
								if (FirstMessageIndextoForward > GetMessageSlotFromMessageNumber(Msg->number))
 | 
				
			||||||
				FirstMessageIndextoForward = Msg->number;
 | 
									FirstMessageIndextoForward = GetMessageSlotFromMessageNumber(Msg->number);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		*RLen = SendMessageDetails(Msg, Reply, Session->Key);
 | 
							*RLen = SendMessageDetails(Msg, Reply, Session->Key);
 | 
				
			||||||
| 
						 | 
					@ -2755,6 +2759,19 @@ VOID SendUIPage(char * Reply, int * ReplyLen, char * Key)
 | 
				
			||||||
	*ReplyLen = Len;
 | 
						*ReplyLen = Len;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ConvertSpaceTonbsp(char * msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Replace any space with  
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						char * ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (ptr = strchr(msg, ' '))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							memmove(ptr + 5, ptr, strlen(ptr) + 1);
 | 
				
			||||||
 | 
							memcpy(ptr, " ", 6);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
 | 
					VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int Len;
 | 
						int Len;
 | 
				
			||||||
| 
						 | 
					@ -2776,6 +2793,8 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
 | 
				
			||||||
		if (!conn->Active)
 | 
							if (!conn->Active)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			strcpy(msg,"Idle          "
 | 
								strcpy(msg,"Idle          "
 | 
				
			||||||
 | 
													 "         "
 | 
				
			||||||
 | 
													 "         "
 | 
				
			||||||
								 "         "
 | 
													 "         "
 | 
				
			||||||
								 "         \r\n");
 | 
													 "         \r\n");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -2789,16 +2808,16 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
 | 
				
			||||||
					strcpy(Name, conn->UserPointer->Name);
 | 
										strcpy(Name, conn->UserPointer->Name);
 | 
				
			||||||
					Name[9] = 0;
 | 
										Name[9] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					i=sprintf_s(msg, sizeof(msg), "%s%s%s%s%2d %5d\r\n",
 | 
										i=sprintf_s(msg, sizeof(msg), "%-12s  %-9s  %3d  %6d%6d%6d\r\n",
 | 
				
			||||||
						Name,
 | 
											Name,
 | 
				
			||||||
						&TenSpaces[strlen(Name) * 6],
 | 
					 | 
				
			||||||
						conn->UserPointer->Call,
 | 
											conn->UserPointer->Call,
 | 
				
			||||||
						&TenSpaces[strlen(conn->UserPointer->Call) * 6],
 | 
					 | 
				
			||||||
						conn->BPQStream,
 | 
											conn->BPQStream,
 | 
				
			||||||
						conn->OutputQueueLength - conn->OutputGetPointer);
 | 
											conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ConvertSpaceTonbsp(msg);
 | 
				
			||||||
		Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg);
 | 
							Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										145
									
								
								BBSUtilities.c
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								BBSUtilities.c
									
									
									
									
									
								
							| 
						 | 
					@ -69,6 +69,10 @@ extern BPQVECSTRUC ** BPQHOSTVECPTR;
 | 
				
			||||||
UCHAR * GetLogDirectory();
 | 
					UCHAR * GetLogDirectory();
 | 
				
			||||||
DllExport int APIENTRY SessionStateNoAck(int stream, int * state);
 | 
					DllExport int APIENTRY SessionStateNoAck(int stream, int * state);
 | 
				
			||||||
int RefreshWebMailIndex();
 | 
					int RefreshWebMailIndex();
 | 
				
			||||||
 | 
					struct PORTCONTROL * GetPortTableEntryFromSlot(int portslot);
 | 
				
			||||||
 | 
					int GetPortHardwareType(struct PORTCONTROL *PORT);
 | 
				
			||||||
 | 
					int GetNumberofPorts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
__declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR;
 | 
					__declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR;
 | 
				
			||||||
typedef char * (WINAPI FAR *FARPROCZ)();
 | 
					typedef char * (WINAPI FAR *FARPROCZ)();
 | 
				
			||||||
| 
						 | 
					@ -528,6 +532,19 @@ struct MsgInfo * GetMsgFromNumber(int msgno)
 | 
				
			||||||
	return MsgnotoMsg[msgno];
 | 
						return MsgnotoMsg[msgno];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int GetMessageSlotFromMessageNumber(int msgno)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i=1; i <= NumberofMessages; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (MsgHddrPtr[i]->number == msgno)
 | 
				
			||||||
 | 
								return i;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct UserInfo * AllocateUserRecord(char * Call)
 | 
					struct UserInfo * AllocateUserRecord(char * Call)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct UserInfo * User = zalloc(sizeof (struct UserInfo));
 | 
						struct UserInfo * User = zalloc(sizeof (struct UserInfo));
 | 
				
			||||||
| 
						 | 
					@ -2085,6 +2102,7 @@ hold certain types or sizes of messages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The first letter of each valid line specifies the action :
 | 
					The first letter of each valid line specifies the action :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A = Accept	   : Message is accepted without checking other filters
 | 
				
			||||||
R = Reject     : The message will not be received.
 | 
					R = Reject     : The message will not be received.
 | 
				
			||||||
H = Hold       : The message will be received but held until the sysop reviews.
 | 
					H = Hold       : The message will be received but held until the sysop reviews.
 | 
				
			||||||
L = Local Hold : Only messages created on this BBS will be held.
 | 
					L = Local Hold : Only messages created on this BBS will be held.
 | 
				
			||||||
| 
						 | 
					@ -2179,21 +2197,38 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (p)
 | 
						while (p)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (p->Action != 'R')
 | 
							if (p->Action != 'R' && p->Action != 'A')
 | 
				
			||||||
			goto Continue;
 | 
								goto Continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (p->Type != Type && p->Type != '*')
 | 
							if (p->Type != Type && p->Type != '*')
 | 
				
			||||||
			goto Continue;
 | 
								goto Continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// wildcardcompare returns true on a match
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (wildcardcompare(From, p->From) == 0)
 | 
							if (wildcardcompare(From, p->From) == 0)
 | 
				
			||||||
			goto Continue;
 | 
								goto Continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (wildcardcompare(ToCopy, p->TO) == 0)
 | 
							if (p->TO[0] == '!')
 | 
				
			||||||
			goto Continue;
 | 
							{
 | 
				
			||||||
 | 
								if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
 | 
				
			||||||
 | 
									goto Continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (wildcardcompare(ToCopy, p->TO) == 0)
 | 
				
			||||||
 | 
									goto Continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (ATBBS)
 | 
							if (ATBBS)
 | 
				
			||||||
			if (wildcardcompare(ATBBS, p->AT) == 0)
 | 
							{
 | 
				
			||||||
 | 
								char AtCopy[256];
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								strcpy(AtCopy, ATBBS);
 | 
				
			||||||
 | 
								_strupr(AtCopy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (wildcardcompare(AtCopy, p->AT) == 0)
 | 
				
			||||||
				goto Continue;
 | 
									goto Continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (BID)
 | 
							if (BID)
 | 
				
			||||||
			if (wildcardcompare(BID, p->BID) == 0)
 | 
								if (wildcardcompare(BID, p->BID) == 0)
 | 
				
			||||||
| 
						 | 
					@ -2202,6 +2237,11 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
 | 
				
			||||||
		if (p->MaxLen && Len < p->MaxLen)
 | 
							if (p->MaxLen && Len < p->MaxLen)
 | 
				
			||||||
			goto Continue;
 | 
								goto Continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// if type 'A' matches all rules then accept without checking rest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (p->Action == 'A')
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return TRUE;			// Hold
 | 
							return TRUE;			// Hold
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Continue:
 | 
					Continue:
 | 
				
			||||||
| 
						 | 
					@ -2244,6 +2284,7 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char ** Calls;
 | 
						char ** Calls;
 | 
				
			||||||
	FBBFilter * p = Filters;
 | 
						FBBFilter * p = Filters;
 | 
				
			||||||
 | 
						char ToCopy[256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (HoldFrom && From)
 | 
						if (HoldFrom && From)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -2307,6 +2348,9 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// check fbb reject.sys type filters
 | 
						// check fbb reject.sys type filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(ToCopy, To);
 | 
				
			||||||
 | 
						_strupr(ToCopy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (p)
 | 
						while (p)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (p->Action != 'H')
 | 
							if (p->Action != 'H')
 | 
				
			||||||
| 
						 | 
					@ -2318,9 +2362,16 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
 | 
				
			||||||
		if (wildcardcompare(Msg->from, p->From) == 0)
 | 
							if (wildcardcompare(Msg->from, p->From) == 0)
 | 
				
			||||||
			goto Continue;
 | 
								goto Continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (wildcardcompare(Msg->to, p->TO) == 0)
 | 
							if (p->TO[0] == '!')
 | 
				
			||||||
			goto Continue;
 | 
							{
 | 
				
			||||||
 | 
								if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
 | 
				
			||||||
 | 
									goto Continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (wildcardcompare(ToCopy, p->TO) == 0)
 | 
				
			||||||
 | 
									goto Continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (wildcardcompare(Msg->via, p->AT) == 0)
 | 
							if (wildcardcompare(Msg->via, p->AT) == 0)
 | 
				
			||||||
			goto Continue;
 | 
								goto Continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3388,6 +3439,7 @@ void Flush(CIRCUIT * conn)
 | 
				
			||||||
					
 | 
										
 | 
				
			||||||
					SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
 | 
										SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
 | 
				
			||||||
					conn->OutputGetPointer+=len;
 | 
										conn->OutputGetPointer+=len;
 | 
				
			||||||
 | 
										conn->bytesSent += len;
 | 
				
			||||||
					tosend-=len;
 | 
										tosend-=len;
 | 
				
			||||||
					SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25);
 | 
										SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25);
 | 
				
			||||||
					FreeSemaphore(&OutputSEM);
 | 
										FreeSemaphore(&OutputSEM);
 | 
				
			||||||
| 
						 | 
					@ -3399,6 +3451,7 @@ void Flush(CIRCUIT * conn)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
 | 
							SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
 | 
				
			||||||
 | 
							conn->bytesSent += len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		conn->OutputGetPointer+=len;
 | 
							conn->OutputGetPointer+=len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5216,7 +5269,6 @@ char * CheckToAddress(CIRCUIT * conn, char * Addr)
 | 
				
			||||||
					return NewAddr;
 | 
										return NewAddr;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				WPRecP WP = LookupWP(Addr);
 | 
									WPRecP WP = LookupWP(Addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5437,7 +5489,18 @@ BOOL DecodeSendParams(CIRCUIT * conn, char * Context, char ** From, char *To, ch
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					conn->LocalMsg = TRUE;
 | 
										// See if a WP entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										WP = LookupWP(To);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (WP)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											*ATBBS = WP->first_homebbs;
 | 
				
			||||||
 | 
											nodeprintf(conn, "Address @%s added from WP\r", *ATBBS);
 | 
				
			||||||
 | 
											conn->LocalMsg = FALSE;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else
 | 
				
			||||||
 | 
											conn->LocalMsg = TRUE;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
| 
						 | 
					@ -5810,12 +5873,12 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						else
 | 
											else
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
 | 
												ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
 | 
				
			||||||
							continue;
 | 
												continue;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, Addr, Via);
 | 
										ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", Addr, Via);
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5833,7 +5896,7 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					else
 | 
										else
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
 | 
											ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						// Add to B2 Message for RMS
 | 
											// Add to B2 Message for RMS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9016,6 +9079,10 @@ CheckForSID:
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef LINBPQ
 | 
				
			||||||
 | 
					extern FARPROCX pGetPortHardwareType;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
 | 
					VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME);		// Default Idletime for BBS Sessions
 | 
						ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME);		// Default Idletime for BBS Sessions
 | 
				
			||||||
| 
						 | 
					@ -9072,10 +9139,44 @@ VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// We should really only do this on Telnet Connections, as OpenBCM flag is used to remove relnet transparency
 | 
							// We should really only do this on Telnet Connections, as OpenBCM flag is used to remove relnet transparency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// See if Telnet	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							struct PORTCONTROL * PORT;
 | 
				
			||||||
 | 
							char Call[11] = "";
 | 
				
			||||||
 | 
							int port, dummy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							GetConnectionInfo(conn->BPQStream, Call, &port, &dummy, &dummy, &dummy, &dummy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							PORT = GetPortTableEntryFromSlot(0);		// Get first entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							do
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (PORT->PORTNUMBER == port)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								PORT=PORT->PORTPOINTER;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							} while (PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define H_TELNET 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef LINBPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (pGetPortHardwareType)	
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (PORT && GetPortHardwareType(PORT) == H_TELNET)
 | 
				
			||||||
 | 
									conn->OpenBCM = TRUE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								conn->OpenBCM = TRUE;			// Old Node version so follow old behavoiur and treat all as telnet
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							if (PORT && GetPortHardwareType(PORT) == H_TELNET)
 | 
				
			||||||
 | 
								conn->OpenBCM = TRUE;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		conn->OpenBCM = TRUE;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_memicmp(SID, "PMS-3.2", 7) == 0)
 | 
						if (_memicmp(SID, "PMS-3.2", 7) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// Paccom TNC that doesn't send newline prompt ater receiving subject
 | 
							// Paccom TNC that doesn't send newline prompt ater receiving subject
 | 
				
			||||||
| 
						 | 
					@ -10245,7 +10346,7 @@ BOOL GetConfig(char * ConfigName)
 | 
				
			||||||
	GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
 | 
						GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(SignoffMsg, "73 de %s\r", BBSName);					// Default
 | 
						sprintf(SignoffMsg, "73 de %s\r", BBSName);					// Default
 | 
				
			||||||
	GetStringValue(group, "SignoffMsg", ISPAccountName, 50);
 | 
						GetStringValue(group, "SignoffMsg", SignoffMsg, 50);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
 | 
						DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10550,7 +10651,7 @@ int Connected(int Stream)
 | 
				
			||||||
	char callsign[10];
 | 
						char callsign[10];
 | 
				
			||||||
	int port, paclen, maxframe, l4window;
 | 
						int port, paclen, maxframe, l4window;
 | 
				
			||||||
	char ConnectedMsg[] = "*** CONNECTED    ";
 | 
						char ConnectedMsg[] = "*** CONNECTED    ";
 | 
				
			||||||
	char Msg[100];
 | 
						char Msg[256];
 | 
				
			||||||
	char Title[100];
 | 
						char Title[100];
 | 
				
			||||||
	int64_t Freq = 0;
 | 
						int64_t Freq = 0;
 | 
				
			||||||
	int Mode = 0;
 | 
						int Mode = 0;
 | 
				
			||||||
| 
						 | 
					@ -10634,6 +10735,12 @@ int Connected(int Stream)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Mode < 0 || Mode > 54)
 | 
				
			||||||
 | 
									Mode = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Freq < 0 || Freq > 11000000000)
 | 
				
			||||||
 | 
									Freq = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			memset(conn, 0, sizeof(ConnectionInfo));		// Clear everything
 | 
								memset(conn, 0, sizeof(ConnectionInfo));		// Clear everything
 | 
				
			||||||
			conn->Active = TRUE;
 | 
								conn->Active = TRUE;
 | 
				
			||||||
			conn->BPQStream = Stream;
 | 
								conn->BPQStream = Stream;
 | 
				
			||||||
| 
						 | 
					@ -10698,7 +10805,7 @@ int Connected(int Stream)
 | 
				
			||||||
							LongFreq = GetPortFrequency(port, FreqString);
 | 
												LongFreq = GetPortFrequency(port, FreqString);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %d Mode %ld\r\n", callsign, port, LongFreq, Mode);
 | 
										Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %lld Mode %d\r\n", callsign, port, LongFreq, Mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					sprintf(Title, "New User %s", callsign);
 | 
										sprintf(Title, "New User %s", callsign);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10758,10 +10865,10 @@ int Connected(int Stream)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (port)
 | 
								if (port)
 | 
				
			||||||
				n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %d Mode %s",
 | 
									n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %lld Mode %s",
 | 
				
			||||||
					user->Call,  port, Freq, WL2KModes[Mode]);
 | 
										user->Call,  port, Freq, WL2KModes[Mode]);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call);
 | 
									n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			// Send SID and Prompt (Unless Sync)
 | 
								// Send SID and Prompt (Unless Sync)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11051,7 +11158,6 @@ int DoReceivedData(int Stream)
 | 
				
			||||||
		if (Stream == conn->BPQStream)
 | 
							if (Stream == conn->BPQStream)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			conn->SIDResponseTimer = 0;		// Got a message, so cancel timeout.
 | 
								conn->SIDResponseTimer = 0;		// Got a message, so cancel timeout.
 | 
				
			||||||
 | 
					 | 
				
			||||||
			do
 | 
								do
 | 
				
			||||||
			{ 
 | 
								{ 
 | 
				
			||||||
				// May have several messages per packet, or message split over packets
 | 
									// May have several messages per packet, or message split over packets
 | 
				
			||||||
| 
						 | 
					@ -11068,6 +11174,7 @@ int DoReceivedData(int Stream)
 | 
				
			||||||
				if (InputLen == 0 && conn->InputMode != 'Y')
 | 
									if (InputLen == 0 && conn->InputMode != 'Y')
 | 
				
			||||||
					return 0;
 | 
										return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									conn->bytesRxed += InputLen;
 | 
				
			||||||
				conn->InputLen += InputLen;
 | 
									conn->InputLen += InputLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (conn->InputLen == 0) return 0;
 | 
									if (conn->InputLen == 0) return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								BPQMail.aps
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								BPQMail.aps
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										20
									
								
								BPQMail.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								BPQMail.c
									
									
									
									
									
								
							| 
						 | 
					@ -1147,6 +1147,15 @@
 | 
				
			||||||
//	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)
 | 
					//	Fix treating addresses ending in WW as Internet (57)
 | 
				
			||||||
 | 
					//	Run sending to packetnodes.spots.radio in a separate thread (61)
 | 
				
			||||||
 | 
					//	Fix loading ISP Account Name from config file (67)
 | 
				
			||||||
 | 
					//	Fixes to using {FormFolder} in Webmail Templates (68)
 | 
				
			||||||
 | 
					//	Save FBB transfer restart data over program restarts (69) 
 | 
				
			||||||
 | 
					//	Add Send and Receive byte counts to status displays (69)
 | 
				
			||||||
 | 
					//	Validate Mode and Frequency and fix formatting in Connected Message (71)
 | 
				
			||||||
 | 
					//	Fix using OpenBCM on other than Telnet connections (75)
 | 
				
			||||||
 | 
					//	Fix sending + in Webmail (80)
 | 
				
			||||||
 | 
					//	Fix forwarding problem when using Web interface to change message routing (73)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpqmail.h"
 | 
					#include "bpqmail.h"
 | 
				
			||||||
#include "winstdint.h"
 | 
					#include "winstdint.h"
 | 
				
			||||||
| 
						 | 
					@ -1167,6 +1176,7 @@ FARPROCX pRunEventProgram;
 | 
				
			||||||
FARPROCX pGetPortFrequency;
 | 
					FARPROCX pGetPortFrequency;
 | 
				
			||||||
FARPROCX pSendWebRequest;
 | 
					FARPROCX pSendWebRequest;
 | 
				
			||||||
FARPROCX pGetLatLon;
 | 
					FARPROCX pGetLatLon;
 | 
				
			||||||
 | 
					FARPROCX pGetPortHardwareType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL WINE = FALSE;
 | 
					BOOL WINE = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1723,6 +1733,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
 | 
				
			||||||
//	SaveUserDatabase();
 | 
					//	SaveUserDatabase();
 | 
				
			||||||
	SaveMessageDatabase();
 | 
						SaveMessageDatabase();
 | 
				
			||||||
	SaveBIDDatabase();
 | 
						SaveBIDDatabase();
 | 
				
			||||||
 | 
						SaveRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	configSaved = 1;
 | 
						configSaved = 1;
 | 
				
			||||||
	SaveConfig(ConfigName);
 | 
						SaveConfig(ConfigName);
 | 
				
			||||||
| 
						 | 
					@ -1949,6 +1960,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
 | 
				
			||||||
		pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8");
 | 
							pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8");
 | 
				
			||||||
		pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16");
 | 
							pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16");
 | 
				
			||||||
		pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8");
 | 
							pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8");
 | 
				
			||||||
 | 
							pGetPortHardwareType = GetProcAddress(ExtDriver,"_GetPortHardwareType@4");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (pGetLOC)
 | 
							if (pGetLOC)
 | 
				
			||||||
| 
						 | 
					@ -3019,9 +3032,9 @@ int RefreshMainWindow()
 | 
				
			||||||
					strcpy(msg,"Logging in");
 | 
										strcpy(msg,"Logging in");
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d",
 | 
										i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d    %5d  %5d",
 | 
				
			||||||
						conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream,
 | 
											conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream,
 | 
				
			||||||
						"BBS", conn->OutputQueueLength - conn->OutputGetPointer);
 | 
											"BBS", conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -3082,6 +3095,7 @@ static PSOCKADDR_IN psin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOCKET sock;
 | 
					SOCKET sock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL Initialise()
 | 
					BOOL Initialise()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -3269,6 +3283,8 @@ BOOL Initialise()
 | 
				
			||||||
	GetBadWordFile();
 | 
						GetBadWordFile();
 | 
				
			||||||
	GetHTMLForms();
 | 
						GetHTMLForms();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GetRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UsingingRegConfig = FALSE;
 | 
						UsingingRegConfig = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Make sure SYSOPCALL is set
 | 
						// Make sure SYSOPCALL is set
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1090
									
								
								BPQMail.rc
									
									
									
									
									
								
							
							
						
						
									
										1090
									
								
								BPQMail.rc
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										32
									
								
								BPQNRR.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								BPQNRR.c
									
									
									
									
									
								
							| 
						 | 
					@ -45,6 +45,8 @@ extern VOID Q_ADD();
 | 
				
			||||||
VOID __cdecl Debugprintf(const char * format, ...);
 | 
					VOID __cdecl Debugprintf(const char * format, ...);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TRANSPORTENTRY * NRRSession;
 | 
					TRANSPORTENTRY * NRRSession;
 | 
				
			||||||
 | 
					int NRRID = 1;			// Id to correlate requests and responses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
datagrams (and other things) to be transported in Netrom L3 frames. 
 | 
					datagrams (and other things) to be transported in Netrom L3 frames. 
 | 
				
			||||||
| 
						 | 
					@ -75,7 +77,9 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		UCHAR * BUFFER = GetBuff();
 | 
							UCHAR * BUFFER = GetBuff();
 | 
				
			||||||
		UCHAR * ptr1;
 | 
							UCHAR * ptr1;
 | 
				
			||||||
		struct _MESSAGE * Msg;
 | 
							struct _MESSAGE * Msg1;
 | 
				
			||||||
 | 
							time_t Now = time(NULL);
 | 
				
			||||||
 | 
							int ID = (Msg->L4TXNO << 8) | Msg->L4RXNO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (BUFFER == NULL)
 | 
							if (BUFFER == NULL)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
| 
						 | 
					@ -84,7 +88,18 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		*ptr1++ = 0xf0;			// PID
 | 
							*ptr1++ = 0xf0;			// PID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ptr1 += sprintf(ptr1, "NRR Response:");
 | 
					
 | 
				
			||||||
 | 
							if (BUFFER == NULL)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ptr1 = &BUFFER[MSGHDDRLEN];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							*ptr1++ = 0xf0;			// PID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ID == NRRSession->NRRID)
 | 
				
			||||||
 | 
								ptr1 += sprintf(ptr1, "NRR Response in %d Secs:", (int)(Now - NRRSession->NRRTime));
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								ptr1 += sprintf(ptr1, "NRR Response:", (int)(Now - NRRSession->NRRTime));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Buff += 21 + MSGHDDRLEN;
 | 
							Buff += 21 + MSGHDDRLEN;
 | 
				
			||||||
		Len -= (21 + MSGHDDRLEN);
 | 
							Len -= (21 + MSGHDDRLEN);
 | 
				
			||||||
| 
						 | 
					@ -97,7 +112,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
 | 
				
			||||||
			if ((Buff[7] & 0x80) == 0x80)			// Check turnround bit
 | 
								if ((Buff[7] & 0x80) == 0x80)			// Check turnround bit
 | 
				
			||||||
				*ptr1++ = '*';
 | 
									*ptr1++ = '*';
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
			Buff+=8;
 | 
								Buff += 8;
 | 
				
			||||||
			Len -= 8;
 | 
								Len -= 8;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,11 +126,11 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Len = (int)(ptr1 - BUFFER);
 | 
							Len = (int)(ptr1 - BUFFER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Msg = (struct _MESSAGE *)BUFFER;
 | 
							Msg1 = (struct _MESSAGE *)BUFFER;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		Msg->LENGTH = Len;
 | 
							Msg1->LENGTH = Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Msg->CHAIN = NULL;
 | 
							Msg1->CHAIN = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER);
 | 
							C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,11 +198,16 @@ VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session)
 | 
				
			||||||
	Msg->L4ID = 1;
 | 
						Msg->L4ID = 1;
 | 
				
			||||||
	Msg->L4INDEX = 0;
 | 
						Msg->L4INDEX = 0;
 | 
				
			||||||
	Msg->L4FLAGS = 0;
 | 
						Msg->L4FLAGS = 0;
 | 
				
			||||||
 | 
						Msg->L4TXNO = NRRID << 8;
 | 
				
			||||||
 | 
						Msg->L4RXNO = NRRID & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memcpy(Msg->L4DATA, MYCALL, 7);
 | 
						memcpy(Msg->L4DATA, MYCALL, 7);
 | 
				
			||||||
	Msg->L4DATA[7] = Stream + 28;
 | 
						Msg->L4DATA[7] = Stream + 28;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	Msg->LENGTH = 8 + 21 + MSGHDDRLEN;
 | 
						Msg->LENGTH = 8 + 21 + MSGHDDRLEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Session->NRRTime = time(NULL);
 | 
				
			||||||
 | 
						Session->NRRID = NRRID++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	C_Q_ADD(&DEST->DEST_Q, Msg);
 | 
						C_Q_ADD(&DEST->DEST_Q, Msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +0,0 @@
 | 
				
			||||||
main : 
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  BPQHostIP = "192.168.1.64";
 | 
					 | 
				
			||||||
  COM1 = "COM43";
 | 
					 | 
				
			||||||
  COM2 = "";
 | 
					 | 
				
			||||||
  COM3 = "";
 | 
					 | 
				
			||||||
  COM4 = "";
 | 
					 | 
				
			||||||
  HamLibPort1 = 4534;
 | 
					 | 
				
			||||||
  HamLibPort2 = 0;
 | 
					 | 
				
			||||||
  HamLibPort3 = 0;
 | 
					 | 
				
			||||||
  HamLibPort4 = 0;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								BPQTermMDI.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								BPQTermMDI.c
									
									
									
									
									
								
							| 
						 | 
					@ -2974,6 +2974,30 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
			return 0; 
 | 
								return 0; 
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (wParam == 0x7)  // BEL (Ctrl/G)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Get buffer, append 07 and write back
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1, 
 | 
				
			||||||
 | 
									(LPARAM) (LPCSTR)Cinfo->kbbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->kbbuf[Cinfo->kbptr++] = 7;
 | 
				
			||||||
 | 
								Cinfo->kbbuf[Cinfo->kbptr] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Send cursor right
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (i = 0; i < strlen(Cinfo->kbbuf); i++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
 | 
				
			||||||
 | 
									SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); 
 | 
					    return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6741
									
								
								Bpq32-skigdebian.c
									
									
									
									
									
								
							
							
						
						
									
										6741
									
								
								Bpq32-skigdebian.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										152
									
								
								Bpq32.c
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								Bpq32.c
									
									
									
									
									
								
							| 
						 | 
					@ -1180,7 +1180,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//	Fix processing of the Winlink API /account/exists response (82)
 | 
					//	Fix processing of the Winlink API /account/exists response (82)
 | 
				
			||||||
//	Fix sending CTEXT to L4 connects to Node when FULL_CTEXT is not set
 | 
					//	Fix sending CTEXT to L4 connects to Node when FULL_CTEXT is not set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//  Version 6.0.25.? 
 | 
					//  Version 6.0.25.1 Sept 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	Fix 64 bit compatibility problems in SCSTracker and UZ7HO drivers
 | 
					//	Fix 64 bit compatibility problems in SCSTracker and UZ7HO drivers
 | 
				
			||||||
//	Add Chat PACLEN config (5)
 | 
					//	Add Chat PACLEN config (5)
 | 
				
			||||||
| 
						 | 
					@ -1243,11 +1243,61 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
//	Fix MailAPI msgs endpoint
 | 
					//	Fix MailAPI msgs endpoint
 | 
				
			||||||
//	Attempt to fix NC going to wrong application. (57)
 | 
					//	Attempt to fix NC going to wrong application. (57)
 | 
				
			||||||
//	Improve ARDOP end of session code (58)
 | 
					//	Improve ARDOP end of session code (58)
 | 
				
			||||||
//	Run M0LTE Map repoorting in a separate thread (59)
 | 
					//	Run M0LTE Map reporting in a separate thread (59/60)
 | 
				
			||||||
//	Add support fro WhatsPac (59)
 | 
					//	Add RHP support for WhatsPac (59)
 | 
				
			||||||
// Add timestamps to LIS monitor
 | 
					//  Add timestamps to LIS monitor (60)
 | 
				
			||||||
 | 
					//	Fix problem with L4 frames being delivered out of sequence (60)
 | 
				
			||||||
 | 
					//	Add Compression of Netrom connections (62)
 | 
				
			||||||
 | 
					//	Improve handling of Locked Routes (62)
 | 
				
			||||||
 | 
					//	Add L4 RESET (Paula G8PZT's extension to NETROM)
 | 
				
			||||||
 | 
					//	Fix problem using SENDRAW from BPQMail (63)
 | 
				
			||||||
 | 
					//	Fix compatibility with latest ardopcf (64)
 | 
				
			||||||
 | 
					//	Fix bug in RHP socket timeout code (65)
 | 
				
			||||||
 | 
					//	Fix L4 RTT (66)
 | 
				
			||||||
 | 
					//	Fix RigConrol with Chanxx but no other settings (66)
 | 
				
			||||||
 | 
					//	Add option to compress L2 frames (67)
 | 
				
			||||||
 | 
					//	Sort Routes displays (67)
 | 
				
			||||||
 | 
					//	Fix Ardop session premature close (70)
 | 
				
			||||||
 | 
					//	Add timestamps to log entries in Web Driver windows (70)
 | 
				
			||||||
 | 
					//	Generate stack backtrace if SIGSEGV or SIGABRT occur (Linux) (70)
 | 
				
			||||||
 | 
					//	Remove some debug logging from L2 code (70)
 | 
				
			||||||
 | 
					//	Fix compiling LinBPQ with nomqtt option (70)
 | 
				
			||||||
 | 
					//	Improve handling of binary data in RHP interface (70)
 | 
				
			||||||
 | 
					//	Fix sending KISS commands to multiport or multidropped TNCs (70)
 | 
				
			||||||
 | 
					//	Add MHUV and MHLV commands (Verbose listing with timestamps in clock time) (70)
 | 
				
			||||||
 | 
					//	Improvements to INP3 (71)
 | 
				
			||||||
 | 
					//	Improvements to KAM driver including support for GTOR connects (71)
 | 
				
			||||||
 | 
					//	Support IPv6 for Telnet outward connects (72)
 | 
				
			||||||
 | 
					//	Fix decaying NETROM routes (72)
 | 
				
			||||||
 | 
					//	Add OnlyVer2point0 config command (72)
 | 
				
			||||||
 | 
					//	Add option to allow AX/UDP on a network using NAT (72)
 | 
				
			||||||
 | 
					//	Include AGWAPI fixes from Martin KD6YAM to enable use with Paracon terminal (72)
 | 
				
			||||||
 | 
					//	Fix 64 bit compatiblility issues with AGWAPI (73)
 | 
				
			||||||
 | 
					//	Fix KAM Pactor Interlock (73)
 | 
				
			||||||
 | 
					//	Fix Node map reporting, broken in .73 (74)
 | 
				
			||||||
 | 
					//	Fixes to build on FreeBSD and NetBSD from jg1uaa (77)
 | 
				
			||||||
 | 
					//	Fix to L4Compress from Steve G7TAJ (77)
 | 
				
			||||||
 | 
					//	Fix possible FRMR when RNR is cleared by SREJ (78)
 | 
				
			||||||
 | 
					//	Fix error in .77 L4Compress fix (mine, not Steve's!) (78)
 | 
				
			||||||
 | 
					//	Fix possible stuck L2 session when handling SREJ (79)
 | 
				
			||||||
 | 
					//	Allow sending CTRL/G From console (Windows) (80)
 | 
				
			||||||
 | 
					//	Fix Webmail autorefresh extra threads problem (websock connection lost handling) (82)
 | 
				
			||||||
 | 
					//	Fix overwriting application alias (83)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//  Version 6.0.26.?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	Fix for compiling with gcc15 (2)
 | 
				
			||||||
 | 
					//	Fix possble stuck L2 session caused by window being set to zero (3)
 | 
				
			||||||
 | 
					//	Improvments to INP3 (4, 5)
 | 
				
			||||||
 | 
					//	Add Node API /api/tcpqueues (5)
 | 
				
			||||||
 | 
					//	Add sending link events to OARC API (disabled by default) (6)
 | 
				
			||||||
 | 
					//	Fix possible program error in Telnet_Connected (7)
 | 
				
			||||||
 | 
					//	Close links when program is closed down (7)
 | 
				
			||||||
 | 
					//	Fix possible problem with deleting routes when using both NODES and INP3 routing on same link (7)
 | 
				
			||||||
 | 
					//	Add Paula's Netromx (allows connects to different applications using Node call) (8)
 | 
				
			||||||
 | 
					//	Add Netrom over TCP (8)
 | 
				
			||||||
 | 
					//	Fix FRMR caused by sending SREJ when no frames outstanding (8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CKernel
 | 
					#define CKernel
 | 
				
			||||||
| 
						 | 
					@ -1343,6 +1393,8 @@ void * HSMODEMExtInit(EXTPORTDATA * PortEntry);
 | 
				
			||||||
void * FreeDataExtInit(EXTPORTDATA * PortEntry);
 | 
					void * FreeDataExtInit(EXTPORTDATA * PortEntry);
 | 
				
			||||||
void * SIXPACKExtInit(EXTPORTDATA * PortEntry);
 | 
					void * SIXPACKExtInit(EXTPORTDATA * PortEntry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID RealCloseAllPrograms();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char * ConfigBuffer;	// Config Area
 | 
					extern char * ConfigBuffer;	// Config Area
 | 
				
			||||||
VOID REMOVENODE(dest_list * DEST);
 | 
					VOID REMOVENODE(dest_list * DEST);
 | 
				
			||||||
DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
 | 
					DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
 | 
				
			||||||
| 
						 | 
					@ -1352,6 +1404,8 @@ VOID ADIFWriteFreqList();
 | 
				
			||||||
void SaveAIS();
 | 
					void SaveAIS();
 | 
				
			||||||
void initAIS();
 | 
					void initAIS();
 | 
				
			||||||
void initADSB();
 | 
					void initADSB();
 | 
				
			||||||
 | 
					int CloseAllSessions();
 | 
				
			||||||
 | 
					int CloseAllLinks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BOOL ADIFLogEnabled;
 | 
					extern BOOL ADIFLogEnabled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1410,7 +1464,8 @@ extern char MYCALL[];			// 7 chars, ax.25 format
 | 
				
			||||||
extern HWND hIPResWnd;
 | 
					extern HWND hIPResWnd;
 | 
				
			||||||
extern BOOL IPMinimized;
 | 
					extern BOOL IPMinimized;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int	NODESINPROGRESS;
 | 
					extern int NODESINPROGRESS;
 | 
				
			||||||
 | 
					extern int NODESToOnePort;
 | 
				
			||||||
extern VOID * CURRENTNODE;
 | 
					extern VOID * CURRENTNODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1480,7 +1535,7 @@ extern char ReportDest[7];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UCHAR ConfigDirectory[260];
 | 
					extern UCHAR ConfigDirectory[260];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint64_t timeLoadedMS;
 | 
					extern uint64_t INP3timeLoadedMS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID __cdecl Debugprintf(const char * format, ...);
 | 
					VOID __cdecl Debugprintf(const char * format, ...);
 | 
				
			||||||
VOID __cdecl Consoleprintf(const char * format, ...);
 | 
					VOID __cdecl Consoleprintf(const char * format, ...);
 | 
				
			||||||
| 
						 | 
					@ -1598,6 +1653,8 @@ BOOL IGateEnabled = TRUE;
 | 
				
			||||||
extern int ISDelayTimer;			// Time before trying to reopen APRS-IS link
 | 
					extern int ISDelayTimer;			// Time before trying to reopen APRS-IS link
 | 
				
			||||||
extern int ISPort;
 | 
					extern int ISPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int CLOSING = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT * WINMORTraceQ = NULL;
 | 
					UINT * WINMORTraceQ = NULL;
 | 
				
			||||||
UINT * SetWindowTextQ = NULL;
 | 
					UINT * SetWindowTextQ = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1653,6 +1710,8 @@ BOOL ReconfigFlag = FALSE;
 | 
				
			||||||
BOOL RigReconfigFlag = FALSE;
 | 
					BOOL RigReconfigFlag = FALSE;
 | 
				
			||||||
BOOL APRSReconfigFlag = FALSE;
 | 
					BOOL APRSReconfigFlag = FALSE;
 | 
				
			||||||
BOOL CloseAllNeeded = FALSE;
 | 
					BOOL CloseAllNeeded = FALSE;
 | 
				
			||||||
 | 
					int CloseAllTimer = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL NeedWebMailRefresh = FALSE;
 | 
					BOOL NeedWebMailRefresh = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int AttachedPIDList[100] = {0};
 | 
					int AttachedPIDList[100] = {0};
 | 
				
			||||||
| 
						 | 
					@ -2334,6 +2393,52 @@ VOID TimerProcX()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CheckGuardZone();
 | 
						CheckGuardZone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (CloseAllTimer == 50)			// First entry
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (CloseAllSessions() == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (CloseAllLinks() == 0)			// No sessions closed so close links now
 | 
				
			||||||
 | 
									CloseAllTimer = 0;				// No Links so close now
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									CloseAllTimer = 39;				// ~4 secs for links to close
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (CloseAllTimer == 40)			// First entry
 | 
				
			||||||
 | 
							CloseAllLinks();				// No sessions closed so close links now
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (CloseAllTimer)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// See if any links left
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							struct _LINKTABLE * LINK = LINKS;
 | 
				
			||||||
 | 
							int i = MAXLINKS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (CloseAllTimer == 0)
 | 
				
			||||||
 | 
								RealCloseAllPrograms();	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (i--)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (LINK->LINKCALL[0])
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (i == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									CloseAllTimer = 0;
 | 
				
			||||||
 | 
									RealCloseAllPrograms();
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								LINK++;
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							CloseAllTimer--;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(CloseAllTimer == 0)
 | 
				
			||||||
 | 
								RealCloseAllPrograms();	
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2369,7 +2474,9 @@ FirstInit()
 | 
				
			||||||
		EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses");
 | 
							EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timeLoadedMS = GetTickCount();
 | 
						INP3timeLoadedMS = GetTickCount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						srand(time(NULL));
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	INITIALISEPORTS();
 | 
						INITIALISEPORTS();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5858,13 +5965,24 @@ DllExport VOID APIENTRY CreateNewTrayIcon()
 | 
				
			||||||
	trayMenu = NULL;
 | 
						trayMenu = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookNodeClosing(char * Reason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DllExport VOID APIENTRY CloseAllPrograms()
 | 
					DllExport VOID APIENTRY CloseAllPrograms()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
//	HANDLE hProc;
 | 
						CLOSING = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Close all attached BPQ32 programs
 | 
						// Tell BG to shut when all links are gone or after 5 secs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Closing  = TRUE;
 | 
						CloseAllTimer = 50;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID RealCloseAllPrograms()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						hookNodeClosing("Shutdown");
 | 
				
			||||||
 | 
						Sleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Closing = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ShowWindow(FrameWnd, SW_RESTORE);
 | 
						ShowWindow(FrameWnd, SW_RESTORE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6112,13 +6230,14 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							if (len > 76)
 | 
												if (len > 76)
 | 
				
			||||||
							{
 | 
												{
 | 
				
			||||||
								len = sprintf(RegLine, "%s\\\r\n", RegLine);
 | 
													len += sprintf(&RegLine[len], "\\\r\n", RegLine);
 | 
				
			||||||
 | 
													strcat(RegLine, "\\\r\n");
 | 
				
			||||||
								WriteFile(hFile, RegLine, len, &written, NULL);
 | 
													WriteFile(hFile, RegLine, len, &written, NULL);
 | 
				
			||||||
								strcpy(RegLine, "  ");
 | 
													strcpy(RegLine, "  ");
 | 
				
			||||||
								len = 2;
 | 
													len = 2;
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
 | 
												len += sprintf(&RegLine[len], "%02x,", Value[k]);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						RegLine[--len] = 0x0d;
 | 
											RegLine[--len] = 0x0d;
 | 
				
			||||||
						RegLine[++len] = 0x0a;	
 | 
											RegLine[++len] = 0x0a;	
 | 
				
			||||||
| 
						 | 
					@ -6144,19 +6263,20 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							if (len > 76)
 | 
												if (len > 76)
 | 
				
			||||||
							{
 | 
												{
 | 
				
			||||||
								len = sprintf(RegLine, "%s\\\r\n", RegLine);
 | 
													len += sprintf(&RegLine[len], "\\\r\n");
 | 
				
			||||||
								WriteFile(hFile, RegLine, len, &written, NULL);
 | 
													WriteFile(hFile, RegLine, len, &written, NULL);
 | 
				
			||||||
								strcpy(RegLine, "  ");
 | 
													strcpy(RegLine, "  ");
 | 
				
			||||||
								len = 2;
 | 
													len = 2;
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
							len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
 | 
					
 | 
				
			||||||
 | 
												len += sprintf(&RegLine[len], "%02x,", Value[k]);
 | 
				
			||||||
							if (len > 76)
 | 
												if (len > 76)
 | 
				
			||||||
							{
 | 
												{
 | 
				
			||||||
								len = sprintf(RegLine, "%s\\\r\n", RegLine);
 | 
													len += sprintf(&RegLine[len], "\\\r\n");
 | 
				
			||||||
								WriteFile(hFile, RegLine, len, &written, NULL);
 | 
													WriteFile(hFile, RegLine, len, &written, NULL);
 | 
				
			||||||
								strcpy(RegLine, "  ");
 | 
													strcpy(RegLine, "  ");
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
							len = sprintf(RegLine, "%s00,", RegLine);
 | 
												len += sprintf(&RegLine[len], "00,");
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						RegLine[--len] = 0x0d;
 | 
											RegLine[--len] = 0x0d;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,6 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
#ifdef LINBPQ
 | 
					#ifdef LINBPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "compatbits.h"
 | 
					#include "compatbits.h"
 | 
				
			||||||
char * strlop(char * buf, char delim);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define APIENTRY
 | 
					#define APIENTRY
 | 
				
			||||||
#define VOID void
 | 
					#define VOID void
 | 
				
			||||||
| 
						 | 
					@ -32,6 +31,8 @@ char * strlop(char * buf, char delim);
 | 
				
			||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char * strlop(char * buf, char delim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID APIENTRY md5 (char *arg, unsigned char * checksum);
 | 
					VOID APIENTRY md5 (char *arg, unsigned char * checksum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -590,7 +590,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (conn->Flags & CHATLINK)
 | 
								if (conn->Flags & CHATLINK)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (conn->BPQStream > 64 || conn->u.link == 0)
 | 
									if (conn->BPQStream > 64 || conn->u.link == 0 || conn->u.link->alias == 0)
 | 
				
			||||||
					Len += sprintf(&Streams[Len], "<tr><td onclick= SelectRow(%d) id=cell_%d>** Corrupt ChatLink **</td>"
 | 
										Len += sprintf(&Streams[Len], "<tr><td onclick= SelectRow(%d) id=cell_%d>** Corrupt ChatLink **</td>"
 | 
				
			||||||
					"<td>  </td><td>  </td><td>  </td><td>  </td></tr>", i, i);
 | 
										"<td>  </td><td>  </td><td>  </td><td>  </td></tr>", i, i);
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
| 
						 | 
					@ -600,7 +600,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
 | 
				
			||||||
						"", conn->OutputQueueLength - conn->OutputGetPointer);
 | 
											"", conn->OutputQueueLength - conn->OutputGetPointer);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			if ((conn->Flags & CHATMODE) && conn->topic)
 | 
								if ((conn->Flags & CHATMODE) && conn->topic && conn->u.user && conn->u.user->call)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Len += sprintf(&Streams[Len],  "<tr><td onclick='SelectRow(%d)' id='cell_%d'>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%d</td></tr>",
 | 
									Len += sprintf(&Streams[Len],  "<tr><td onclick='SelectRow(%d)' id='cell_%d'>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%d</td></tr>",
 | 
				
			||||||
					i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream,
 | 
										i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -984,6 +984,29 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
			return 0; 
 | 
								return 0; 
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (wParam == 0x7)  // BEL (Ctrl/G)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Get buffer, append 07 and write back
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1, 
 | 
				
			||||||
 | 
									(LPARAM) (LPCSTR)Cinfo->kbbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->kbbuf[Cinfo->kbptr++] = 7;
 | 
				
			||||||
 | 
								Cinfo->kbbuf[Cinfo->kbptr] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Send cursor right
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (i = 0; i < strlen(Cinfo->kbbuf); i++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
 | 
				
			||||||
 | 
									SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); 
 | 
					    return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										95
									
								
								CommonCode.c
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								CommonCode.c
									
									
									
									
									
								
							| 
						 | 
					@ -18,7 +18,6 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
*/	
 | 
					*/	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
// General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c
 | 
					// General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma data_seg("_BPQDATA")
 | 
					#pragma data_seg("_BPQDATA")
 | 
				
			||||||
| 
						 | 
					@ -50,6 +49,12 @@ extern struct CONFIGTABLE xxcfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct TNCINFO * TNCInfo[71];		// Records are Malloc'd
 | 
					struct TNCINFO * TNCInfo[71];		// Records are Malloc'd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int ReportTimer;
 | 
					extern int ReportTimer;
 | 
				
			||||||
| 
						 | 
					@ -78,6 +83,9 @@ char * stristr (char *ch1, char *ch2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern VOID * ENDBUFFERPOOL;
 | 
					extern VOID * ENDBUFFERPOOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int PoolBuilt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int EnableOARCAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	Read/Write length field in a buffer header
 | 
					//	Read/Write length field in a buffer header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -364,7 +372,7 @@ BOK1:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (n > 1000)
 | 
							if (n > 1000)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Debugprintf("Loop searching free chain - pointer = %p %p", debug, pointer);
 | 
								Debugprintf("Releasebuffer Loop searching free chain - pointer = %p %p from %s Line %d", debug, pointer, File, Line);
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -377,6 +385,11 @@ BOK1:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	QCOUNT++;
 | 
						QCOUNT++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (PoolBuilt && QCOUNT > MAXBUFFS)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Debugprintf("Releasebuffer QCOUNT > MAXBUFFS - pointer = %p from %s Line %d", pointer, File, Line);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -474,7 +487,7 @@ int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF)
 | 
				
			||||||
	next = Q[0];
 | 
						next = Q[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (next[0] != 0)
 | 
						while (next[0] != 0)
 | 
				
			||||||
		next=next[0];				// Chain to end of queue
 | 
							next = next[0];				// Chain to end of queue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	next[0] = BUFF;					// New one on end
 | 
						next[0] = BUFF;					// New one on end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -914,7 +927,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sprintf(Msg, "%d SCANSTOP", TNC->Port);
 | 
							sprintf(Msg, "%d SCANSTOP", TNC->Port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Rig_Command( (TRANSPORTENTRY *) -1, Msg);
 | 
							Rig_Command((TRANSPORTENTRY *) -1, Msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		UpdateMH(TNC, Call, '+', 'I');
 | 
							UpdateMH(TNC, Call, '+', 'I');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1062,6 +1075,7 @@ BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
 | 
				
			||||||
				WritetoConsoleLocal("\n");
 | 
									WritetoConsoleLocal("\n");
 | 
				
			||||||
				WritetoConsoleLocal("Bad config record ");
 | 
									WritetoConsoleLocal("Bad config record ");
 | 
				
			||||||
				WritetoConsoleLocal(errbuf);
 | 
									WritetoConsoleLocal(errbuf);
 | 
				
			||||||
 | 
									WritetoConsoleLocal("\n");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1125,6 +1139,11 @@ int CompareNode(struct DEST_LIST ** a, struct DEST_LIST ** b)
 | 
				
			||||||
	return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7);
 | 
						return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int CompareRoutes(struct ROUTE ** a, struct ROUTE ** b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return memcmp(a[0]->NEIGHBOUR_CALL, b[0]->NEIGHBOUR_CALL, 7);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DllExport int APIENTRY CountFramesQueuedOnStream(int Stream)
 | 
					DllExport int APIENTRY CountFramesQueuedOnStream(int Stream)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1];		// API counts from 1
 | 
						BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1];		// API counts from 1
 | 
				
			||||||
| 
						 | 
					@ -1493,8 +1512,8 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
 | 
				
			||||||
		if (QCOUNT < 50)
 | 
							if (QCOUNT < 50)
 | 
				
			||||||
			return 0;					// Dont want to run out
 | 
								return 0;					// Dont want to run out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (GetSem)
 | 
							if (GetSem)
 | 
				
			||||||
				GetSemaphore(&Semaphore, 10);
 | 
								GetSemaphore(&Semaphore, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((MSG = GetBuff()) == 0)
 | 
							if ((MSG = GetBuff()) == 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -1623,7 +1642,7 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MSG->LENGTH = len + MSGHDDRLEN;
 | 
						MSG->LENGTH = len + MSGHDDRLEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF)		 // PACTOR/WINMOR Style
 | 
						if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF)		 // PACTOR/WINMOR Style
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//	Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
 | 
							//	Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2130,7 +2149,16 @@ int CanPortDigi(int Port)
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
 | 
					DllExport int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (PORT)
 | 
				
			||||||
 | 
							return PORT->Hardware;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct PORTCONTROL * PORTVEC = PORTTABLE;
 | 
						struct PORTCONTROL * PORTVEC = PORTTABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2687,6 +2715,14 @@ int DoRoutes()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (Routes->NEIGHBOUR_CALL[0] != 0)
 | 
							if (Routes->NEIGHBOUR_CALL[0] != 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								// Dont save routes from config file here or they are difficult to get rid of
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Routes->NEIGHBOUR_FLAG & LOCKEDBYCONFIG)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Routes++;
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall);
 | 
								len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall);
 | 
				
			||||||
			Normcall[len]=0;
 | 
								Normcall[len]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2710,7 +2746,7 @@ int DoRoutes()
 | 
				
			||||||
				digis[0] = 0;
 | 
									digis[0] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			len=sprintf(line,
 | 
								len=sprintf(line,
 | 
				
			||||||
					"ROUTE ADD %s %d %d %s %d %d %d %d %d\n",
 | 
										"ROUTE ADD %s %d %d %s %d %d %d %d %d %c\n",
 | 
				
			||||||
					Normcall,
 | 
										Normcall,
 | 
				
			||||||
					Routes->NEIGHBOUR_PORT,
 | 
										Routes->NEIGHBOUR_PORT,
 | 
				
			||||||
					Routes->NEIGHBOUR_QUAL, digis,
 | 
										Routes->NEIGHBOUR_QUAL, digis,
 | 
				
			||||||
| 
						 | 
					@ -2718,7 +2754,8 @@ int DoRoutes()
 | 
				
			||||||
					Routes->NBOUR_FRACK,
 | 
										Routes->NBOUR_FRACK,
 | 
				
			||||||
					Routes->NBOUR_PACLEN,
 | 
										Routes->NBOUR_PACLEN,
 | 
				
			||||||
					Routes->INP3Node | (Routes->NoKeepAlive << 2),
 | 
										Routes->INP3Node | (Routes->NoKeepAlive << 2),
 | 
				
			||||||
					Routes->OtherendsRouteQual);
 | 
										Routes->OtherendsRouteQual,
 | 
				
			||||||
 | 
										(Routes->NEIGHBOUR_FLAG & LOCKEDBYSYSOP)?'!':' ');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					fputs(line, file);
 | 
										fputs(line, file);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -3283,8 +3320,12 @@ SOCKADDR_IN reportdest = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOCKET ReportSocket = 0;
 | 
					SOCKET ReportSocket = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SOCKET NodeAPISocket = 0 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOCKADDR_IN Chatreportdest = {0};
 | 
					SOCKADDR_IN Chatreportdest = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SOCKADDR_IN UDPreportdest = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char LOCATOR[];			// Locator for Reporting - may be Maidenhead or LAT:LON
 | 
					extern char LOCATOR[];			// Locator for Reporting - may be Maidenhead or LAT:LON
 | 
				
			||||||
extern char MAPCOMMENT[];		// Locator for Reporting - may be Maidenhead or LAT:LON
 | 
					extern char MAPCOMMENT[];		// Locator for Reporting - may be Maidenhead or LAT:LON
 | 
				
			||||||
extern char LOC[7];				// Maidenhead Locator for Reporting
 | 
					extern char LOC[7];				// Maidenhead Locator for Reporting
 | 
				
			||||||
| 
						 | 
					@ -3640,11 +3681,22 @@ pthread_t ResolveUpdateThreadId = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char NodeMapServer[80] = "update.g8bpq.net";
 | 
					char NodeMapServer[80] = "update.g8bpq.net";
 | 
				
			||||||
char ChatMapServer[80] = "chatupdate.g8bpq.net";
 | 
					char ChatMapServer[80] = "chatupdate.g8bpq.net";
 | 
				
			||||||
 | 
					char NodeAPIServer[80] = "node-api.packet.oarc.uk";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int NodeAPIPort = 13579;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int nodeStartedSent = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern time_t LastNodeStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookNodeStarted();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID ResolveUpdateThread(void * Unused)
 | 
					VOID ResolveUpdateThread(void * Unused)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct hostent * HostEnt1;
 | 
						struct hostent * HostEnt1;
 | 
				
			||||||
	struct hostent * HostEnt2;
 | 
						struct hostent * HostEnt2;
 | 
				
			||||||
 | 
						struct hostent * HostEnt3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ResolveUpdateThreadId = GetCurrentThreadId();
 | 
						ResolveUpdateThreadId = GetCurrentThreadId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3672,6 +3724,22 @@ VOID ResolveUpdateThread(void * Unused)
 | 
				
			||||||
		if (HostEnt2)
 | 
							if (HostEnt2)
 | 
				
			||||||
			memcpy(&Chatreportdest.sin_addr.s_addr,HostEnt2->h_addr,4);
 | 
								memcpy(&Chatreportdest.sin_addr.s_addr,HostEnt2->h_addr,4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Debugprintf("Resolving %s", NodeAPIServer);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							HostEnt3 = gethostbyname(NodeAPIServer);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if (HostEnt3)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								memcpy(&UDPreportdest.sin_addr.s_addr,HostEnt3->h_addr,4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (nodeStartedSent == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									hookNodeStarted();
 | 
				
			||||||
 | 
									nodeStartedSent = 1;
 | 
				
			||||||
 | 
									LastNodeStatus = time(NULL);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		if (HostEnt1 && HostEnt2)
 | 
							if (HostEnt1 && HostEnt2)
 | 
				
			||||||
		{		
 | 
							{		
 | 
				
			||||||
			Sleep(1000 * 60 * 30);	
 | 
								Sleep(1000 * 60 * 30);	
 | 
				
			||||||
| 
						 | 
					@ -4784,6 +4852,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
 | 
				
			||||||
	struct stat STAT;
 | 
						struct stat STAT;
 | 
				
			||||||
	struct PORTCONTROL * PORT = PORTTABLE;
 | 
						struct PORTCONTROL * PORT = PORTTABLE;
 | 
				
			||||||
	char PortList[256] = "";
 | 
						char PortList[256] = "";
 | 
				
			||||||
 | 
						int len = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (PORT)
 | 
						while (PORT)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -4825,7 +4894,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
 | 
				
			||||||
				*ptr = '\r';
 | 
									*ptr = '\r';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER);
 | 
								len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		PORT = PORT->PORTPOINTER;
 | 
							PORT = PORT->PORTPOINTER;
 | 
				
			||||||
| 
						 | 
					@ -5163,14 +5232,14 @@ skipit:
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SendDataToPktMapThread();
 | 
					void SendDataToPktMapThread(void * Param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SendDataToPktMap()
 | 
					void SendDataToPktMap()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	_beginthread(SendDataToPktMapThread,2048000,0);
 | 
						_beginthread(SendDataToPktMapThread,2048000,0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SendDataToPktMapThread()
 | 
					void SendDataToPktMapThread(void * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char Return[256] = "";
 | 
						char Return[256] = "";
 | 
				
			||||||
	char Request[64];
 | 
						char Request[64];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										193
									
								
								FBBRoutines.c
									
									
									
									
									
								
							
							
						
						
									
										193
									
								
								FBBRoutines.c
									
									
									
									
									
								
							| 
						 | 
					@ -27,6 +27,8 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
					void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DeleteRestartData(CIRCUIT * conn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress);
 | 
					int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress);
 | 
				
			||||||
void MQTTMessageEvent(void* message);
 | 
					void MQTTMessageEvent(void* message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,6 +43,130 @@ int B2RestartCount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char ProperBaseDir[];
 | 
					extern char ProperBaseDir[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char RestartDir[MAX_PATH] = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetRestartData()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						struct FBBRestartData Restart;
 | 
				
			||||||
 | 
						struct FBBRestartData * RestartRec;
 | 
				
			||||||
 | 
						char MsgFile[MAX_PATH];
 | 
				
			||||||
 | 
						FILE * hFile;
 | 
				
			||||||
 | 
						int FileSize;
 | 
				
			||||||
 | 
						struct stat STAT;
 | 
				
			||||||
 | 
						size_t ReadLen = 0;
 | 
				
			||||||
 | 
						time_t Age;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(RestartDir, MailDir);
 | 
				
			||||||
 | 
						strcat(RestartDir, "/Restart");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Make sure RestartDir exists
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
						CreateDirectory(RestartDir, NULL);		// Just in case
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						mkdir(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
 | 
				
			||||||
 | 
						chmod(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// look for restart files. These will be numbered from 1 up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 1; 1; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
							if (stat(MsgFile, &STAT) == -1)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							FileSize = STAT.st_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Age = time(NULL) - STAT.st_ctime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Age > 86400 * 2)		// Max 2 days
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							hFile = fopen(MsgFile, "rb");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (hFile == NULL)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Read Restart Record
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fread(&Restart, 1, sizeof(struct FBBRestartData), hFile); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ((Restart.MailBufferSize + sizeof(struct FBBRestartData)) != FileSize)			// Duff file
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								fclose(hFile);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RestartRec = zalloc(sizeof (struct FBBRestartData));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							GetSemaphore(&AllocSemaphore, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RestartData = realloc(RestartData,(++RestartCount+1) * sizeof(void *));
 | 
				
			||||||
 | 
							RestartData[RestartCount] = RestartRec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							FreeSemaphore(&AllocSemaphore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(RestartRec, &Restart, sizeof(struct FBBRestartData));
 | 
				
			||||||
 | 
							RestartRec->MailBuffer = malloc(RestartRec->MailBufferSize);
 | 
				
			||||||
 | 
							ReadLen = fread(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile); 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							Logprintf(LOG_BBS, 0, '?', "Restart Data for %s %s Len %d Loaded", RestartRec->Call, RestartRec->bid, RestartRec->length);
 | 
				
			||||||
 | 
							fclose(hFile);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SaveRestartData()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Save restart data to file so we can reload on restart
 | 
				
			||||||
 | 
						// Restart data has pointers to buffers so we must save copy of data and reconstitue on restart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Delete and resave all restart data to keep restart directory clean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int i, n = 1;
 | 
				
			||||||
 | 
						char MsgFile[MAX_PATH];
 | 
				
			||||||
 | 
						FILE * hFile;
 | 
				
			||||||
 | 
						size_t WriteLen=0;
 | 
				
			||||||
 | 
						struct FBBRestartData * RestartRec = NULL;
 | 
				
			||||||
 | 
						struct stat STAT;
 | 
				
			||||||
 | 
						time_t NOW = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 1; 1; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
							if (stat(MsgFile, &STAT) == -1)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							DeleteFile(MsgFile);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 1; i <= RestartCount; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							RestartRec = RestartData[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (RestartRec == 0)
 | 
				
			||||||
 | 
								return;				// Shouldn't happen!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ((NOW - RestartRec->TimeCreated) > 86400 * 2)	// Max 2 days
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, n++);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							hFile = fopen(MsgFile, "wb");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (hFile)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								WriteLen = fwrite(RestartRec, 1, sizeof(struct FBBRestartData), hFile);		// Save Header	
 | 
				
			||||||
 | 
								WriteLen = fwrite(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile); // Save Data
 | 
				
			||||||
 | 
								fclose(hFile);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
VOID FBBputs(CIRCUIT * conn, char * buf)
 | 
					VOID FBBputs(CIRCUIT * conn, char * buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Sends to user and logs
 | 
						// Sends to user and logs
 | 
				
			||||||
| 
						 | 
					@ -985,12 +1111,12 @@ loop:
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				RestartRec = RestartData[i];
 | 
									RestartRec = RestartData[i];
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
				if ((RestartRec->UserPointer == conn->UserPointer)
 | 
									if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
 | 
				
			||||||
					&& (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0))
 | 
										&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if (RestartRec->TempMsg->length <= offset)
 | 
										if (RestartRec->length <= offset)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						conn->TempMsg->length = RestartRec->TempMsg->length;
 | 
											conn->TempMsg->length = RestartRec->length;
 | 
				
			||||||
						conn->MailBuffer = RestartRec->MailBuffer;
 | 
											conn->MailBuffer = RestartRec->MailBuffer;
 | 
				
			||||||
						conn->MailBufferSize = RestartRec->MailBufferSize;
 | 
											conn->MailBufferSize = RestartRec->MailBufferSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1019,6 +1145,7 @@ loop:
 | 
				
			||||||
						RestartData[n] = RestartData[n+1];		// move down all following entries
 | 
											RestartData[n] = RestartData[n+1];		// move down all following entries
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					RestartCount--;
 | 
										RestartCount--;
 | 
				
			||||||
 | 
										SaveRestartData();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1146,6 +1273,7 @@ loop:
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
				conn->InputMode = 0;		//  So we won't save Restart data if decode fails
 | 
									conn->InputMode = 0;		//  So we won't save Restart data if decode fails
 | 
				
			||||||
 | 
									DeleteRestartData(conn);
 | 
				
			||||||
				Decode(conn, 0);			// Setup Next Message will reset InputMode if needed
 | 
									Decode(conn, 0);			// Setup Next Message will reset InputMode if needed
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1845,14 +1973,14 @@ VOID SaveFBBBinary(CIRCUIT * conn)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		RestartRec = RestartData[i];
 | 
							RestartRec = RestartData[i];
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if ((RestartRec->UserPointer == conn->UserPointer)
 | 
							if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
 | 
				
			||||||
			&& (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0))
 | 
								&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Fund it, so reuse
 | 
								// Found it, so reuse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//	If we have more data, reset retry count
 | 
								//	If we have more data, reset retry count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (RestartRec->TempMsg->length < conn->TempMsg->length)
 | 
								if (RestartRec->length < conn->TempMsg->length)
 | 
				
			||||||
				RestartRec->Count = 0;;
 | 
									RestartRec->Count = 0;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -1869,19 +1997,53 @@ VOID SaveFBBBinary(CIRCUIT * conn)
 | 
				
			||||||
		RestartData[RestartCount] = RestartRec;
 | 
							RestartData[RestartCount] = RestartRec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		FreeSemaphore(&AllocSemaphore);
 | 
							FreeSemaphore(&AllocSemaphore);
 | 
				
			||||||
 | 
							RestartRec->TimeCreated = time(NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RestartRec->UserPointer = conn->UserPointer;
 | 
						strcpy(RestartRec->Call, conn->UserPointer->Call);
 | 
				
			||||||
	RestartRec->TempMsg = conn->TempMsg;
 | 
						RestartRec->length = conn->TempMsg->length;
 | 
				
			||||||
 | 
						strcpy(RestartRec->bid, conn->TempMsg->bid);
 | 
				
			||||||
	RestartRec->MailBuffer = conn->MailBuffer;
 | 
						RestartRec->MailBuffer = conn->MailBuffer;
 | 
				
			||||||
	RestartRec->MailBufferSize = conn->MailBufferSize;
 | 
						RestartRec->MailBufferSize = conn->MailBufferSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart",
 | 
						len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart",
 | 
				
			||||||
		conn->Callsign, conn->TempMsg->length);
 | 
							conn->Callsign, conn->TempMsg->length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SaveRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WriteLogLine(conn, '|',Msg, len, LOG_BBS);
 | 
						WriteLogLine(conn, '|',Msg, len, LOG_BBS);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DeleteRestartData(CIRCUIT * conn)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct FBBRestartData * RestartRec = NULL;
 | 
				
			||||||
 | 
						int i, n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (conn->TempMsg == NULL)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for (i = 1; i <= RestartCount; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							RestartRec = RestartData[i];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
 | 
				
			||||||
 | 
								&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Remove restrt data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (n = i; n < RestartCount; n++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									RestartData[n] = RestartData[n+1];		// move down all following entries
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								RestartCount--;
 | 
				
			||||||
 | 
								SaveRestartData();
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
 | 
					BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, n;
 | 
						int i, n;
 | 
				
			||||||
| 
						 | 
					@ -1895,15 +2057,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		RestartRec = RestartData[i];
 | 
							RestartRec = RestartData[i];
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if ((RestartRec->UserPointer == conn->UserPointer)
 | 
							if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
 | 
				
			||||||
			&& (strcmp(RestartRec->TempMsg->bid, FBBHeader->BID) == 0))
 | 
								&& (strcmp(RestartRec->bid, FBBHeader->BID) == 0))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			char Msg[120];
 | 
								char Msg[120];
 | 
				
			||||||
			int len;
 | 
								int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			RestartRec->Count++;
 | 
								RestartRec->Count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (RestartRec->Count > 3)
 | 
								if (RestartRec->Count > 10)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning",
 | 
									len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning",
 | 
				
			||||||
					FBBHeader->BID);
 | 
										FBBHeader->BID);
 | 
				
			||||||
| 
						 | 
					@ -1918,15 +2080,16 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				RestartCount--;
 | 
									RestartCount--;
 | 
				
			||||||
 | 
									SaveRestartData();
 | 
				
			||||||
				return FALSE;
 | 
									return FALSE;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d",
 | 
								len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d",
 | 
				
			||||||
				FBBHeader->BID, RestartRec->TempMsg->length);
 | 
									FBBHeader->BID, RestartRec->length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			WriteLogLine(conn, '|',Msg, len, LOG_BBS);
 | 
								WriteLogLine(conn, '|',Msg, len, LOG_BBS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return (RestartRec->TempMsg->length);
 | 
								return (RestartRec->length);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								FLDigi.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								FLDigi.c
									
									
									
									
									
								
							| 
						 | 
					@ -36,6 +36,12 @@ extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VERSION_MAJOR         2
 | 
					#define VERSION_MAJOR         2
 | 
				
			||||||
#define VERSION_MINOR         0
 | 
					#define VERSION_MINOR         0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -538,7 +544,11 @@ pollloop:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
								if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
									char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
									sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
				if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -815,7 +825,7 @@ pollloop:
 | 
				
			||||||
				char outbuff[1000];
 | 
									char outbuff[1000];
 | 
				
			||||||
				int newlen;
 | 
									int newlen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				buff->L2DATA[-1] = 6;				// KISS Control
 | 
									buff->PID = 6;				// KISS Control (PID is just before Data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				newlen = KissEncode(&buff->L2DATA[-1], outbuff, txlen);
 | 
									newlen = KissEncode(&buff->L2DATA[-1], outbuff, txlen);
 | 
				
			||||||
				sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr));
 | 
									sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr));
 | 
				
			||||||
| 
						 | 
					@ -1180,7 +1190,6 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
| 
						 | 
					@ -1211,7 +1220,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	ptr=strchr(TNC->NodeCall, ' ');
 | 
						ptr=strchr(TNC->NodeCall, ' ');
 | 
				
			||||||
	if (ptr) *(ptr) = 0;					// Null Terminate
 | 
						if (ptr) *(ptr) = 0;					// Null Terminate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_FLDIGI;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->BusyWait == 0)
 | 
						if (TNC->BusyWait == 0)
 | 
				
			||||||
		TNC->BusyWait = 10;
 | 
							TNC->BusyWait = 10;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										21
									
								
								FreeDATA.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								FreeDATA.c
									
									
									
									
									
								
							| 
						 | 
					@ -43,6 +43,11 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
int KillTNC(struct TNCINFO * TNC);
 | 
					int KillTNC(struct TNCINFO * TNC);
 | 
				
			||||||
static int RestartTNC(struct TNCINFO * TNC);
 | 
					static int RestartTNC(struct TNCINFO * TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
					extern int (WINAPI FAR *GetModuleFileNameExPtr)();
 | 
				
			||||||
extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
					extern int (WINAPI FAR *EnumProcessesPtr)();
 | 
				
			||||||
static int Socket_Data(int sock, int error, int eventcode);
 | 
					static int Socket_Data(int sock, int error, int eventcode);
 | 
				
			||||||
| 
						 | 
					@ -452,6 +457,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
				TNC->lasttime = ltime;
 | 
									TNC->lasttime = ltime;
 | 
				
			||||||
				ConnecttoFreeData(port);
 | 
									ConnecttoFreeData(port);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								while (TNC->PortRecord->UI_Q)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									buffptr = Q_REM(&TNC->PortRecord->UI_Q);
 | 
				
			||||||
 | 
									ReleaseBuffer(buffptr);	
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -740,7 +750,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
							if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
								char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
								sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
								if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -1393,14 +1406,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
 | 
						Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_FREEDATA;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FREEDATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->WeStartedTNC = 1;
 | 
						TNC->WeStartedTNC = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
 | 
						TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
 | 
				
			||||||
	TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
 | 
						TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					@ -4139,7 +4152,7 @@ void buildParamString(struct TNCINFO * TNC, char * line)
 | 
				
			||||||
		FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
 | 
							FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (FDI->hamlibHost)
 | 
						if (FDI->hamlibHost)
 | 
				
			||||||
		sprintf(line, "%s --rigctld_ip %s --rigctld_port %d", line, FDI->hamlibHost, FDI->hamlibPort);
 | 
							sprintf(&line[strlen(line)], " --rigctld_ip %s --rigctld_port %d", FDI->hamlibHost, FDI->hamlibPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (FDI->LimitBandWidth)
 | 
						if (FDI->LimitBandWidth)
 | 
				
			||||||
		strcat(line, " --500hz");
 | 
							strcat(line, " --500hz");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -499,15 +499,15 @@ VOID * HALExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_HAL;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
 | 
				
			||||||
		TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
 | 
							TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PortEntry->MAXHOSTMODESESSIONS = 1;		// Default
 | 
						PortEntry->MAXHOSTMODESESSIONS = 1;		// Default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -336,7 +336,8 @@ LRESULT CALLBACK PacWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc())
 | 
					BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height,
 | 
				
			||||||
 | 
											VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef LINBPQ
 | 
					#ifdef LINBPQ
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
| 
						 | 
					@ -1865,9 +1866,6 @@ static char ** SeparateMultiString(char * MultiString)
 | 
				
			||||||
	return Value;
 | 
						return Value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern int nextDummyInterlock;
 | 
					extern int nextDummyInterlock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int standardParams(struct TNCINFO * TNC, char * buf)
 | 
					int standardParams(struct TNCINFO * TNC, char * buf)
 | 
				
			||||||
| 
						 | 
					@ -1916,7 +1914,7 @@ int standardParams(struct TNCINFO * TNC, char * buf)
 | 
				
			||||||
		TNC->ActiveTXFreq = atof(&buf[13]);
 | 
							TNC->ActiveTXFreq = atof(&buf[13]);
 | 
				
			||||||
	else if (_memicmp(buf, "ActiveRXFreq", 12) == 0)	// Set at start of session
 | 
						else if (_memicmp(buf, "ActiveRXFreq", 12) == 0)	// Set at start of session
 | 
				
			||||||
		TNC->ActiveRXFreq = atof(&buf[13]);
 | 
							TNC->ActiveRXFreq = atof(&buf[13]);
 | 
				
			||||||
	else if (_memicmp(buf, "DisconnectScript", 16) == 0)	// Set at start of session
 | 
						else if (_memicmp(buf, "DisconnectScript", 16) == 0)	// Set at end of session
 | 
				
			||||||
		TNC->DisconnectScript = SeparateMultiString(&buf[17]);
 | 
							TNC->DisconnectScript = SeparateMultiString(&buf[17]);
 | 
				
			||||||
	else if (_memicmp(buf, "PTTONHEX", 8) == 0)
 | 
						else if (_memicmp(buf, "PTTONHEX", 8) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								HSMODEM.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								HSMODEM.c
									
									
									
									
									
								
							| 
						 | 
					@ -648,7 +648,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
							if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
								char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
								sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
			if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
								if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -1177,10 +1181,10 @@ VOID * HSMODEMExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
 | 
						Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_HSMODEM;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HSMODEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										145
									
								
								HTTPcode.c
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								HTTPcode.c
									
									
									
									
									
								
							| 
						 | 
					@ -71,6 +71,8 @@ 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);
 | 
					int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
 | 
				
			||||||
 | 
					unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
 | 
				
			||||||
 | 
					int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct ROUTE * NEIGHBOURS;
 | 
					extern struct ROUTE * NEIGHBOURS;
 | 
				
			||||||
extern int  ROUTE_LEN;
 | 
					extern int  ROUTE_LEN;
 | 
				
			||||||
| 
						 | 
					@ -103,9 +105,13 @@ extern int NumberofPorts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UCHAR ConfigDirectory[260];
 | 
					extern UCHAR ConfigDirectory[260];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern struct AXIPPORTINFO * Portlist[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
 | 
					VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
 | 
				
			||||||
int CompareNode(const void *a, const void *b);
 | 
					int CompareNode(const void *a, const void *b);
 | 
				
			||||||
int CompareAlias(const void *a, const void *b);
 | 
					int CompareAlias(const void *a, const void *b);
 | 
				
			||||||
 | 
					int CompareRoutes(const void * a, const void * b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
 | 
					void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
 | 
				
			||||||
void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
 | 
					void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
 | 
				
			||||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
					struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
				
			||||||
| 
						 | 
					@ -143,7 +149,7 @@ char Tail[] = "</body></html>";
 | 
				
			||||||
char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>"
 | 
					char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>"
 | 
				
			||||||
"<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>";
 | 
					"<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char RouteLine[] = "<tr><td>%s%d</td><td>%s%c</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>";
 | 
					char RouteLine[] = "<tr><td>%s%d</td><td>%s%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>";
 | 
				
			||||||
char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>"
 | 
					char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>"
 | 
				
			||||||
"<table align=center  bgcolor=white>"
 | 
					"<table align=center  bgcolor=white>"
 | 
				
			||||||
"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
 | 
					"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
 | 
				
			||||||
| 
						 | 
					@ -2412,7 +2418,10 @@ doHeader:
 | 
				
			||||||
				if (Session == 0)
 | 
									if (Session == 0)
 | 
				
			||||||
					Session = &Dummy;
 | 
										Session = &Dummy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				Session->TNC = LOCAL;		// TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
 | 
									if (LOCAL)
 | 
				
			||||||
 | 
										Session->TNC = (struct TNCINFO *)(uintptr_t)1;		// TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										Session->TNC = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
 | 
									WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
 | 
				
			||||||
				WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
 | 
									WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
 | 
				
			||||||
| 
						 | 
					@ -3789,33 +3798,129 @@ doHeader:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			*/
 | 
								*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// AXIP Partners
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (_stricmp(NodeURL, "/Node/AXIP.html") == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									int i;
 | 
				
			||||||
 | 
									char Normcall[10];
 | 
				
			||||||
 | 
									int Width = 5;
 | 
				
			||||||
 | 
									int x = 0, n = 0, nd = 0;
 | 
				
			||||||
 | 
									struct arp_table_entry * List[1000];
 | 
				
			||||||
 | 
									struct arp_table_entry * ListD[1000];
 | 
				
			||||||
 | 
									char AXIPList[10000] = "";
 | 
				
			||||||
 | 
									int ListLen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									struct AXIPPORTINFO * AXPORT = Portlist[0];
 | 
				
			||||||
 | 
									struct PORTCONTROL * PORT = PORTTABLE;
 | 
				
			||||||
 | 
									struct arp_table_entry * arp;
 | 
				
			||||||
 | 
									time_t NOW = time(NULL);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									char AXIPHeader[] =
 | 
				
			||||||
 | 
										"<table align='center' bgcolor='ffffff' border=2 cellpadding=10 cellspacing=2 style=font-family:monospace>"
 | 
				
			||||||
 | 
										"<tr><td align='center'>AXIP Up</td><td align='center'>AXIP Down</td></tr><tr><td valign='top'>%s";
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									while (PORT)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										AXPORT = Portlist[PORT->PORTNUMBER];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (AXPORT)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											// Get ARP entries
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											for (i = 0; i < AXPORT->arp_table_len; i++)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												arp = &AXPORT->arp_table[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												if (arp->LastHeard == 0 || (NOW - arp->LastHeard) > 3600)			// Considered down
 | 
				
			||||||
 | 
													ListD[nd++] = arp;
 | 
				
			||||||
 | 
												else
 | 
				
			||||||
 | 
													List[n++] = arp;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										PORT = PORT->PORTPOINTER;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (n > 1)
 | 
				
			||||||
 | 
										qsort(List, n, sizeof(void *), CompareNode);
 | 
				
			||||||
 | 
									if (nd > 1)
 | 
				
			||||||
 | 
										qsort(ListD, nd, sizeof(void *), CompareNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									for (i = 0; i < n; i++)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										int len = ConvFromAX25(List[i]->callsign, Normcall);
 | 
				
			||||||
 | 
										Normcall[len]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (List[i]->LastHeard)?(NOW - List[i]->LastHeard):0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], AXIPHeader, AXIPList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									ListLen = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
									for (i = 0; i < nd; i++)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										int len = ConvFromAX25(ListD[i]->callsign, Normcall);
 | 
				
			||||||
 | 
										Normcall[len]=0;
 | 
				
			||||||
 | 
										ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (ListD[i]->LastHeard)?(NOW - ListD[i]->LastHeard):0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td><td valign='top'>%s", AXIPList);
 | 
				
			||||||
 | 
									ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td></tr></table></body></html>");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_stricmp(NodeURL, "/Node/Routes.html") == 0)
 | 
								if (_stricmp(NodeURL, "/Node/Routes.html") == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				struct ROUTE * Routes = NEIGHBOURS;
 | 
									struct ROUTE * Routes = NEIGHBOURS;
 | 
				
			||||||
				int MaxRoutes = MAXNEIGHBOURS;
 | 
									int MaxRoutes = MAXNEIGHBOURS;
 | 
				
			||||||
				int count;
 | 
									int count, i;
 | 
				
			||||||
				char Normcall[10];
 | 
									char Normcall[10];
 | 
				
			||||||
				char locked;
 | 
									char locked[4] = " ";
 | 
				
			||||||
				int NodeCount;
 | 
									int NodeCount;
 | 
				
			||||||
				int Percent = 0;
 | 
									int Percent = 0;
 | 
				
			||||||
				int Iframes, Retries;
 | 
									int Iframes, Retries;
 | 
				
			||||||
				char Active[10];
 | 
									char Active[10];
 | 
				
			||||||
				int Queued;
 | 
									int Queued;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
 | 
									int x = 0, n = 0;
 | 
				
			||||||
 | 
									struct ROUTE * List[1000];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								
 | 
				
			||||||
				ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr);
 | 
									ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (count=0; count<MaxRoutes; count++)
 | 
									// Build and sort list of routes
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									for (count = 0; count < MaxRoutes; count++)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if (Routes->NEIGHBOUR_CALL[0] != 0)
 | 
										if (Routes->NEIGHBOUR_CALL[0] != 0)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											List[n++] = Routes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (n > 999)
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Routes++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (n > 1)
 | 
				
			||||||
 | 
										qsort(List, n, sizeof(void *), CompareRoutes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									for (i = 0; i < n; i++)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Routes = List[i];
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
 | 
											int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
 | 
				
			||||||
						Normcall[len]=0;
 | 
											Normcall[len]=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						if ((Routes->NEIGHBOUR_FLAG & 1) == 1)
 | 
											if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
 | 
				
			||||||
							locked = '!';
 | 
												strcpy(locked, "!");
 | 
				
			||||||
 | 
											else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
 | 
				
			||||||
 | 
												strcpy(locked, "!!");
 | 
				
			||||||
 | 
											else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
 | 
				
			||||||
 | 
												strcpy(locked, "!!!");
 | 
				
			||||||
						else
 | 
											else
 | 
				
			||||||
							locked = ' ';
 | 
												strcpy(locked, " ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						NodeCount = COUNTNODES(Routes);
 | 
											NodeCount = COUNTNODES(Routes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4322,7 +4427,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ReplyLen = 0;
 | 
						int ReplyLen = 0;
 | 
				
			||||||
	char * input = strstr(MsgPtr, "\r\n\r\n");	// End of headers
 | 
						char * input = strstr(MsgPtr, "\r\n\r\n");	// End of headers
 | 
				
			||||||
	char * user, * password, * Key;
 | 
						char * user, * password;
 | 
				
			||||||
	struct HTTPConnectionInfo * NewSession;
 | 
						struct HTTPConnectionInfo * NewSession;
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	struct UserRec * USER;
 | 
						struct UserRec * USER;
 | 
				
			||||||
| 
						 | 
					@ -4371,7 +4476,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (user && user[0] && password && password[0])
 | 
							if (user && user[0] && password && password[0])
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password); 
 | 
								sprintf(&MsgPtr[strlen(MsgPtr)], "?%s&%s", user, password); 
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4734,7 +4839,14 @@ void ProcessWebmailWebSockThread(void * conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0);
 | 
						Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (Sent != ReplyLen && Loops++ < 3000)					// 100 secs max
 | 
						if (Sent == -1)		// Connecton lost
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							closesocket(sockptr->socket);
 | 
				
			||||||
 | 
							free(conn);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (Sent != ReplyLen && Loops++ < 3000)					// 90 secs max
 | 
				
			||||||
	{	
 | 
						{	
 | 
				
			||||||
		if (Sent > 0)					// something sent
 | 
							if (Sent > 0)					// something sent
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -4780,11 +4892,16 @@ void ProcessWebmailWebSockThread(void * conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CloseHandle(hPipe);
 | 
						CloseHandle(hPipe);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ?? do we need a thread to handle write which may block
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	Sent = send(sockptr->socket, Reply, ReplyLen, 0);
 | 
						Sent = send(sockptr->socket, Reply, ReplyLen, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (Sent != ReplyLen && Loops++ < 3000)					// 100 secs max
 | 
						if (Sent == -1)		// Connecton lost
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							free(conn);
 | 
				
			||||||
 | 
							closesocket(sockptr->socket);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (Sent != ReplyLen && Loops++ < 3000)					// 90 secs max
 | 
				
			||||||
	{	
 | 
						{	
 | 
				
			||||||
		//			Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);
 | 
							//			Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										34
									
								
								HanksRT.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								HanksRT.c
									
									
									
									
									
								
							| 
						 | 
					@ -426,7 +426,7 @@ VOID ChatExpandAndSendMessage(ChatCIRCUIT * conn, char * Msg, int LOG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = RemoveLF(NewMessage, (int)strlen(NewMessage));
 | 
						len = RemoveLF(NewMessage, (int)strlen(NewMessage));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ChatWriteLogLine(conn, '>', NewMessage,  len, LOG);
 | 
						ChatWriteLogLine(conn, '>', NewMessage,  len, LOG_CHAT);
 | 
				
			||||||
	ChatQueueMsg(conn, NewMessage, len);
 | 
						ChatQueueMsg(conn, NewMessage, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1229,7 +1229,7 @@ void chkctl(ChatCIRCUIT *ckt_from, char * Buffer, int Len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 1; i < (Len - 1); i++)
 | 
						for (i = 1; i < (Len - 1); i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (Buffer[i] < 32)
 | 
							if (Buffer[i] < 32 && Buffer[i] != 7)		// Accept BELL
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (Buffer[i] == 9)
 | 
								if (Buffer[i] == 9)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
 | 
				
			||||||
					__try
 | 
										__try
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
						len = sprintf(line, "%s %p %s", line, cn->node, cn->node->alias);
 | 
											len += sprintf(&line[len], " %p %s", cn->node, cn->node->alias);
 | 
				
			||||||
						if (len > 80)
 | 
											if (len > 80)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Debugprintf("%s", line);
 | 
												Debugprintf("%s", line);
 | 
				
			||||||
| 
						 | 
					@ -2821,7 +2821,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
 | 
				
			||||||
	CHATNODE    *node;
 | 
						CHATNODE    *node;
 | 
				
			||||||
	LINK *link;
 | 
						LINK *link;
 | 
				
			||||||
	char line[1000];
 | 
						char line[1000];
 | 
				
			||||||
	int     len;
 | 
						int len = 0;
 | 
				
			||||||
	CN	*cn;
 | 
						CN	*cn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int i = 0;
 | 
						int i = 0;
 | 
				
			||||||
| 
						 | 
					@ -2836,16 +2836,16 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
 | 
				
			||||||
	nprintf(conn, "%d Node(s)\r", i);
 | 
						nprintf(conn, "%d Node(s)\r", i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Flag == 'c')
 | 
						if (Flag == 'c')
 | 
				
			||||||
		sprintf(line, "Here %-6.6s <-", OurNode);
 | 
							len = sprintf(line, "Here %-6.6s <-", OurNode);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		sprintf(line, "Here %-6.6s <-", OurAlias);
 | 
							len = sprintf(line, "Here %-6.6s <-", OurAlias);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (node = node_hd; node; node = node->next) if (node->refcnt)
 | 
						for (node = node_hd; node; node = node->next) if (node->refcnt)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (Flag == 'c')
 | 
							if (Flag == 'c')
 | 
				
			||||||
			len = sprintf(line, "%s %s", line, node->call);
 | 
								len += sprintf(&line[len], " %s", node->call);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			len = sprintf(line, "%s %s", line, node->alias);
 | 
								len += sprintf(&line[len], " %s", node->alias);
 | 
				
			||||||
		if (len > 80)
 | 
							if (len > 80)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			nprintf(conn, "%s\r", line);
 | 
								nprintf(conn, "%s\r", line);
 | 
				
			||||||
| 
						 | 
					@ -2873,9 +2873,9 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
 | 
				
			||||||
						__try
 | 
											__try
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							if (Flag == 'c')
 | 
												if (Flag == 'c')
 | 
				
			||||||
								len = sprintf(line, "%s %s", line, cn->node->call);
 | 
													len += sprintf(&line[len], " %s", cn->node->call);
 | 
				
			||||||
							else
 | 
												else
 | 
				
			||||||
								len = sprintf(line, "%s %s", line, cn->node->alias);
 | 
													len += sprintf(&line[len], " %s", cn->node->alias);
 | 
				
			||||||
							if (len > 80)
 | 
												if (len > 80)
 | 
				
			||||||
							{
 | 
												{
 | 
				
			||||||
								nprintf(conn, "%s\r", line);
 | 
													nprintf(conn, "%s\r", line);
 | 
				
			||||||
| 
						 | 
					@ -2883,23 +2883,23 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						__except(EXCEPTION_EXECUTE_HANDLER)
 | 
											__except(EXCEPTION_EXECUTE_HANDLER)
 | 
				
			||||||
							{len = sprintf(line, "%s *PE* Corrupt Rec %x %x", line, cn, cn->node);}
 | 
												{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x", cn, cn->node);}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					else
 | 
										else
 | 
				
			||||||
						len = sprintf(line, "%s Corrupt Rec %x %x ", line, cn, cn->node);
 | 
											len = sprintf(&line[len], " Corrupt Rec %x %x ", cn, cn->node);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			__except(EXCEPTION_EXECUTE_HANDLER)
 | 
								__except(EXCEPTION_EXECUTE_HANDLER)
 | 
				
			||||||
			{len = sprintf(line, "%s *PE* Corrupt Rec %x %x ", line, cn, cn->node);}
 | 
								{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x ", cn, cn->node);}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
			for (cn = circuit->hnode; cn; cn = cn->next)
 | 
								for (cn = circuit->hnode; cn; cn = cn->next)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (cn->node && cn->node->alias)
 | 
									if (cn->node && cn->node->alias)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if (Flag == 'c')
 | 
										if (Flag == 'c')
 | 
				
			||||||
						len = sprintf(line, "%s %s", line, cn->node->call);
 | 
											len += sprintf(&line[len], " %s", cn->node->call);
 | 
				
			||||||
					else
 | 
										else
 | 
				
			||||||
						len = sprintf(line, "%s %s", line, cn->node->alias);
 | 
											len += sprintf(&line[len], " %s", cn->node->alias);
 | 
				
			||||||
					if (len > 80)
 | 
										if (len > 80)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						nprintf(conn, "%s\r", line);
 | 
											nprintf(conn, "%s\r", line);
 | 
				
			||||||
| 
						 | 
					@ -2907,7 +2907,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
					len = sprintf(line, "%s Corrupt Rec %p %p ", line, cn, cn->node);
 | 
										len += sprintf(&line[len], " Corrupt Rec %p %p ", cn, cn->node);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
			nprintf(conn, "%s\r", line);
 | 
								nprintf(conn, "%s\r", line);
 | 
				
			||||||
| 
						 | 
					@ -3682,7 +3682,7 @@ VOID SendChatLinkStatus()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		len = sprintf(Msg, "%s%s %c ", Msg, link->call, '0' + link->flags);
 | 
							len += sprintf(&Msg[len], "%s %c ", link->call, '0' + link->flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (len > 240)
 | 
							if (len > 240)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								IPCode.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								IPCode.c
									
									
									
									
									
								
							| 
						 | 
					@ -100,7 +100,10 @@ TODo	?Multiple Adapters
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
 | 
					int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
 | 
					#ifndef PCAP_API
 | 
				
			||||||
 | 
					#define PCAP_API extern
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
| 
						 | 
					@ -387,7 +390,7 @@ char * FormatIP(uint32_t Addr)
 | 
				
			||||||
	return FormatIPWork;
 | 
						return FormatIPWork;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int CompareRoutes (const VOID * a, const VOID * b)
 | 
					int CompareIPRoutes (const VOID * a, const VOID * b)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	PROUTEENTRY x;
 | 
						PROUTEENTRY x;
 | 
				
			||||||
	PROUTEENTRY y;
 | 
						PROUTEENTRY y;
 | 
				
			||||||
| 
						 | 
					@ -4972,7 +4975,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, str
 | 
				
			||||||
	Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
 | 
						Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (NumberofRoutes)
 | 
						if (NumberofRoutes)
 | 
				
			||||||
		qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareRoutes);
 | 
							qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareIPRoutes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i=0; i < NumberofRoutes; i++)
 | 
						for (i=0; i < NumberofRoutes; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -5413,11 +5416,8 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
 | 
				
			||||||
	int Len;
 | 
						int Len;
 | 
				
			||||||
	PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
 | 
						PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
 | 
				
			||||||
	UCHAR * Msg;
 | 
						UCHAR * Msg;
 | 
				
			||||||
	int Type;
 | 
					 | 
				
			||||||
	int Length, ComLen;
 | 
					 | 
				
			||||||
	int  IntVal;
 | 
					 | 
				
			||||||
	UCHAR Reply[256];
 | 
						UCHAR Reply[256];
 | 
				
			||||||
	int PDULen, SendLen;
 | 
						int SendLen;
 | 
				
			||||||
	int Offset = 0;
 | 
						int Offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Len = ntohs(IPptr->IPLENGTH);
 | 
						Len = ntohs(IPptr->IPLENGTH);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										215
									
								
								KAMPactor.c
									
									
									
									
									
								
							
							
						
						
									
										215
									
								
								KAMPactor.c
									
									
									
									
									
								
							| 
						 | 
					@ -70,6 +70,8 @@ static RECT Rect;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
 | 
					int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
 | 
				
			||||||
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
 | 
					VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
 | 
				
			||||||
 | 
					VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
 | 
				
			||||||
 | 
					VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static FILE * LogHandle[32] = {0};
 | 
					static FILE * LogHandle[32] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -517,6 +519,28 @@ ok:
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID KAMSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct STREAMINFO * STREAM = &TNC->Streams[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(TNC->WEB_TNCSTATE, "Interlocked");
 | 
				
			||||||
 | 
						MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	STREAM->CmdSet = STREAM->CmdSave = zalloc(100);
 | 
				
			||||||
 | 
					//	sprintf(STREAM->CmdSet, "I%s\r", "SCSPTC");		// Should prevent connects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID KAMReleasePort(struct TNCINFO * TNC)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct STREAMINFO * STREAM = &TNC->Streams[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(TNC->WEB_TNCSTATE, "Free");
 | 
				
			||||||
 | 
						MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
 | 
					static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>"
 | 
						int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>"
 | 
				
			||||||
| 
						 | 
					@ -567,15 +591,15 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
		return ExtProc;
 | 
							return ExtProc;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_KAM;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->BusyWait == 0)
 | 
						if (TNC->BusyWait == 0)
 | 
				
			||||||
		TNC->BusyWait = 10;
 | 
							TNC->BusyWait = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PortEntry->MAXHOSTMODESESSIONS = 11;		// Default
 | 
						PortEntry->MAXHOSTMODESESSIONS = 11;		// Default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					@ -595,6 +619,11 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort;
 | 
						PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort;
 | 
				
			||||||
	PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort;
 | 
						PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	TNC->SuspendPortProc = KAMSuspendPort;
 | 
				
			||||||
 | 
					//	TNC->ReleasePortProc = KAMReleasePort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr=strchr(TNC->NodeCall, ' ');
 | 
						ptr=strchr(TNC->NodeCall, ' ');
 | 
				
			||||||
	if (ptr) *(ptr) = 0;					// Null Terminate
 | 
						if (ptr) *(ptr) = 0;					// Null Terminate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -886,24 +915,39 @@ VOID KAMPoll(int Port)
 | 
				
			||||||
				calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, TNC->Streams[0].MyCall);
 | 
									calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, TNC->Streams[0].MyCall);
 | 
				
			||||||
				TNC->Streams[0].MyCall[calllen] = 0;
 | 
									TNC->Streams[0].MyCall[calllen] = 0;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
					EncodeAndSend(TNC, "X", 1);			// ??Return to packet mode??
 | 
									EncodeAndSend(TNC, "X", 1);			// ??Return to packet mode??
 | 
				
			||||||
					if (TNC->VeryOldMode)
 | 
									
 | 
				
			||||||
						datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall);
 | 
									if (TNC->VeryOldMode)
 | 
				
			||||||
					else
 | 
									{
 | 
				
			||||||
						datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall);
 | 
										datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall);	
 | 
				
			||||||
 | 
										EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall);
 | 
				
			||||||
					EncodeAndSend(TNC, TXMsg, datalen);
 | 
										EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
					TNC->InternalCmd = 'M';
 | 
					 | 
				
			||||||
						
 | 
											
 | 
				
			||||||
					TNC->NeedPACTOR = 0;		// Cancel enter Pactor
 | 
										if (TNC->OldMode == 0)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
 | 
											datalen = sprintf(TXMsg, "C20MYGTCALL %s", TNC->Streams[0].MyCall);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
 | 
									TNC->InternalCmd = 'M';
 | 
				
			||||||
					SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
					 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
					// Stop Scanning
 | 
									TNC->NeedPACTOR = 0;		// Cancel enter Pactor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					sprintf(Msg, "%d SCANSTOP", TNC->Port);
 | 
									SuspendOtherPorts(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					Rig_Command( (TRANSPORTENTRY *) -1, Msg);
 | 
									sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
 | 
				
			||||||
 | 
									SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Stop Scanning
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									sprintf(Msg, "%d SCANSTOP", TNC->Port);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
									Rig_Command( (TRANSPORTENTRY *) -1, Msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1036,9 +1080,22 @@ VOID KAMPoll(int Port)
 | 
				
			||||||
			UCHAR TXMsg[80] = "D20";
 | 
								UCHAR TXMsg[80] = "D20";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (TNC->VeryOldMode)
 | 
								if (TNC->VeryOldMode)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
				datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall);
 | 
									datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall);
 | 
				
			||||||
 | 
									EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
				datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall);
 | 
									datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall);
 | 
				
			||||||
 | 
									EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (TNC->OldMode == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										datalen = sprintf(TXMsg, "C20MYGTCALL %s", TNC->NodeCall);
 | 
				
			||||||
 | 
										EncodeAndSend(TNC, TXMsg, datalen);	
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			EncodeAndSend(TNC, TXMsg, datalen);
 | 
								EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (TNC->OldMode)
 | 
								if (TNC->OldMode)
 | 
				
			||||||
| 
						 | 
					@ -1046,6 +1103,7 @@ VOID KAMPoll(int Port)
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				EncodeAndSend(TNC, "C20TOR", 6);			// Back to Listen
 | 
									EncodeAndSend(TNC, "C20TOR", 6);			// Back to Listen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			TNC->InternalCmd = 'T';
 | 
								TNC->InternalCmd = 'T';
 | 
				
			||||||
			TNC->Timeout = 50;
 | 
								TNC->Timeout = 50;
 | 
				
			||||||
			TNC->IntCmdDelay--;
 | 
								TNC->IntCmdDelay--;
 | 
				
			||||||
| 
						 | 
					@ -1266,6 +1324,51 @@ VOID KAMPoll(int Port)
 | 
				
			||||||
					return;
 | 
										return;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (memcmp(MsgPtr, "GTOR ", 5) == 0)	// GTOR Connect
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										memcpy(STREAM->RemoteCall, &MsgPtr[5], 9);
 | 
				
			||||||
 | 
										STREAM->Connecting = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										// If Stream 0, Convert C CALL to PACTOR CALL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (Stream == 0)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											datalen = sprintf(TXMsg, "C20GTOR %s", TNC->Streams[0].RemoteCall);
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
											// If Pactor, check busy detecters on any interlocked ports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (TNC->HFPacket == 0 && InterlockedCheckBusy(TNC) && TNC->OverrideBusy == 0)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												// Channel Busy. Wait
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												TNC->ConnectCmd = _strdup(TXMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												sprintf(TNC->WEB_TNCSTATE, "Waiting for clear channel");
 | 
				
			||||||
 | 
												SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												TNC->BusyDelay = TNC->BusyWait * 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												return;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											TNC->OverrideBusy = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s",
 | 
				
			||||||
 | 
												TNC->Streams[0].MyCall, TNC->Streams[0].RemoteCall);
 | 
				
			||||||
 | 
											SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else
 | 
				
			||||||
 | 
											datalen = sprintf(TXMsg, "C1%cC %s", Stream + '@', STREAM->RemoteCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										EncodeAndSend(TNC, TXMsg, datalen);
 | 
				
			||||||
 | 
										TNC->Timeout = 50;
 | 
				
			||||||
 | 
										TNC->InternalCmd = 'C';			// So we dont send the reply to the user.
 | 
				
			||||||
 | 
										ReleaseBuffer(buffptr);
 | 
				
			||||||
 | 
										STREAM->Connecting = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0)	// Disconnect
 | 
									if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0)	// Disconnect
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if (Stream == 0)
 | 
										if (Stream == 0)
 | 
				
			||||||
| 
						 | 
					@ -1644,6 +1747,10 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WritetoTrace(TNC, Buffer, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Pass to Appl
 | 
							// Pass to Appl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Stream = TNC->CmdStream;
 | 
							Stream = TNC->CmdStream;
 | 
				
			||||||
| 
						 | 
					@ -1680,6 +1787,76 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
 | 
				
			||||||
	if (Msg[0] == '?')					// Status
 | 
						if (Msg[0] == '?')					// Status
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		TNC->Timeout = 0;
 | 
							TNC->Timeout = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    The response frame from the TNC will be:    
 | 
				
			||||||
 | 
					           <FEND>?0MSXY<FEND> - where MSXY are coded as follows:    
 | 
				
			||||||
 | 
					           M    One byte indicating the current mode of operation.    
 | 
				
			||||||
 | 
					                A=Packet
 | 
				
			||||||
 | 
					                B=RTTY
 | 
				
			||||||
 | 
					                C=ASCII
 | 
				
			||||||
 | 
					                D=AMTOR
 | 
				
			||||||
 | 
					                E=FEC
 | 
				
			||||||
 | 
					                F=SELFEC
 | 
				
			||||||
 | 
					                G=LAMTOR
 | 
				
			||||||
 | 
					                H=PACTOR
 | 
				
			||||||
 | 
					                I=PTLISTEN
 | 
				
			||||||
 | 
					                J=GTOR
 | 
				
			||||||
 | 
					                K=NAVTEX
 | 
				
			||||||
 | 
					                L=CW
 | 
				
			||||||
 | 
					                M=TOR Standby     
 | 
				
			||||||
 | 
									N=GMON
 | 
				
			||||||
 | 
									O=PSK31
 | 
				
			||||||
 | 
					           S    One byte indicating a sub-mode of operation. The byte
 | 
				
			||||||
 | 
					                contains an ASCII character as follows:    
 | 
				
			||||||
 | 
					                0=Standby
 | 
				
			||||||
 | 
					                1=Phasing
 | 
				
			||||||
 | 
					                2=Connected
 | 
				
			||||||
 | 
					                3=Disconnecting
 | 
				
			||||||
 | 
					                4=FEC
 | 
				
			||||||
 | 
					                5=SELFEC
 | 
				
			||||||
 | 
					                6=PTFEC    
 | 
				
			||||||
 | 
					           X    One byte (called status byte X). This byte is bit-
 | 
				
			||||||
 | 
					                encoded to indicate specific conditions as follows:    
 | 
				
			||||||
 | 
					                Bit 0 =    (IDLE) set to 1 when receiving IDLE
 | 
				
			||||||
 | 
					                          characters in a frame.
 | 
				
			||||||
 | 
					                Bit 1 =   (ERR) set to 1 to indicate the received frame
 | 
				
			||||||
 | 
					                          failed CRC check, or was not a valid CS
 | 
				
			||||||
 | 
					                          response frame.
 | 
				
			||||||
 | 
					                Bit 2 =   (Combined receive) set to 1 to indicate that
 | 
				
			||||||
 | 
					                          the data was constructed through the use of
 | 
				
			||||||
 | 
					                          error correction (i.e. Golay error correction
 | 
				
			||||||
 | 
					                          for G-TOR or Memory ARQ for Pactor).
 | 
				
			||||||
 | 
					                Bit 3 =   (RQ) set to 1 to indicate an RQ frame. If you
 | 
				
			||||||
 | 
					                          are the ISS, it indicates that the receiving
 | 
				
			||||||
 | 
					                          station has asked for a repeat of the last
 | 
				
			||||||
 | 
					                          data due to received errors. When you are the
 | 
				
			||||||
 | 
					                          IRS, it indicates that the transmitting
 | 
				
			||||||
 | 
					                          station has sent the same data that you have
 | 
				
			||||||
 | 
					                          already received. This means that the sending
 | 
				
			||||||
 | 
					                          station did not properly copy your
 | 
				
			||||||
 | 
					                          acknowledgement (CS code).
 | 
				
			||||||
 | 
					                Bit 4 =   (Huffman) set to 1 to indicate that this
 | 
				
			||||||
 | 
					                          frame contains data which uses Huffman
 | 
				
			||||||
 | 
					                          compression.
 | 
				
			||||||
 | 
					                Bit 5 =   (ISS) set to 1 to indicate that your station
 | 
				
			||||||
 | 
					                          is currently the ISS.
 | 
				
			||||||
 | 
					                Bit 6&7 = (Speed) these two bits indicate the current
 | 
				
			||||||
 | 
					                          speed of an ARQ link or the PSK31 mode. The
 | 
				
			||||||
 | 
					                          coding of the bits is:
 | 
				
			||||||
 | 
					                          00 = 100 baud or BPSK31
 | 
				
			||||||
 | 
					                          01 = 200 baud or QPSK31
 | 
				
			||||||
 | 
					                          10 = 300 baud
 | 
				
			||||||
 | 
					           Y    One byte (called status byte Y). This byte is bit-
 | 
				
			||||||
 | 
					                encoded to indicate specific conditions as follows:    
 | 
				
			||||||
 | 
					                Bit 0 =    reserved (set to 0).
 | 
				
			||||||
 | 
					                Bit 1 =   (PTT) PTT is active.
 | 
				
			||||||
 | 
					                Bit 2 =   (Changeover) changeover in progress
 | 
				
			||||||
 | 
					                Bits 3-7 = reserved (set to 0).
 | 
				
			||||||
 | 
					*/          
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1790,6 +1967,10 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
 | 
				
			||||||
				if (Msg[1] == '2' && Msg[2] == 'A')
 | 
									if (Msg[1] == '2' && Msg[2] == 'A')
 | 
				
			||||||
					TNC->HFPacket = TRUE;
 | 
										TNC->HFPacket = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Stop other ports in same group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									SuspendOtherPorts(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				ProcessIncommingConnect(TNC, Call, Stream, TRUE);
 | 
									ProcessIncommingConnect(TNC, Call, Stream, TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
 | 
									SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
 | 
				
			||||||
| 
						 | 
					@ -2047,7 +2228,11 @@ VOID ForcedClose(struct TNCINFO * TNC, int Stream)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID CloseComplete(struct TNCINFO * TNC, int Stream)
 | 
					VOID CloseComplete(struct TNCINFO * TNC, int Stream)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
		TNC->NeedPACTOR = 50;	
 | 
						sprintf(TNC->WEB_TNCSTATE, "Free");
 | 
				
			||||||
 | 
						SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ReleaseOtherPorts(TNC);
 | 
				
			||||||
 | 
						TNC->NeedPACTOR = 50;	
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								KISSHF.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								KISSHF.c
									
									
									
									
									
								
							| 
						 | 
					@ -458,7 +458,11 @@ ok:
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		if (_memicmp(txbuff, "RADIO ", 6) == 0)
 | 
							if (_memicmp(txbuff, "RADIO ", 6) == 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &txbuff[6]);
 | 
								char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
								sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
			if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
								if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -809,10 +813,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_KISSHF;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KISSHF;
 | 
				
			||||||
	TNC->ARDOPBuffer = malloc(8192);
 | 
						TNC->ARDOPBuffer = malloc(8192);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										160
									
								
								L3Code.c
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								L3Code.c
									
									
									
									
									
								
							| 
						 | 
					@ -60,6 +60,12 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE);
 | 
				
			||||||
VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall);
 | 
					VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall);
 | 
				
			||||||
void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer);
 | 
					void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer);
 | 
				
			||||||
void SendVARANetromMsg(struct TNCINFO * TNC,L3MESSAGEBUFFER * Buffer);
 | 
					void SendVARANetromMsg(struct TNCINFO * TNC,L3MESSAGEBUFFER * Buffer);
 | 
				
			||||||
 | 
					VOID SENDNODESMSG(int Portnum);
 | 
				
			||||||
 | 
					VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int NODESINPROGRESS;
 | 
				
			||||||
 | 
					extern int NODESToOnePort;
 | 
				
			||||||
 | 
					extern int CLOSING;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BOOL NODESINPROGRESS ;;
 | 
					extern BOOL NODESINPROGRESS ;;
 | 
				
			||||||
PPORTCONTROL L3CURRENTPORT;
 | 
					PPORTCONTROL L3CURRENTPORT;
 | 
				
			||||||
| 
						 | 
					@ -67,6 +73,8 @@ extern dest_list * CURRENTNODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int L3_10SECS = 10;
 | 
					int L3_10SECS = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int PREFERINP3ROUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID L3BG()
 | 
					VOID L3BG()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -92,7 +100,15 @@ VOID L3BG()
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR;
 | 
										ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// if NetROM over VARA pass direct to the driver
 | 
										// if NetROM over VARA or NetROM over TCP pass direct to the driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (ROUTE && ROUTE->TCPPort)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											PL3MESSAGEBUFFER Frame = (PL3MESSAGEBUFFER)Q_REM(&DEST->DEST_Q);
 | 
				
			||||||
 | 
											TCPNETROMSend(ROUTE, Frame);
 | 
				
			||||||
 | 
											ReleaseBuffer(Frame);
 | 
				
			||||||
 | 
											continue;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (ROUTE)
 | 
										if (ROUTE)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
| 
						 | 
					@ -135,12 +151,14 @@ VOID L3BG()
 | 
				
			||||||
					// Drop through to Activate
 | 
										// Drop through to Activate
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
 | 
									// No Active Route
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (ACTIVATE_DEST(DEST) == FALSE)
 | 
									if (ACTIVATE_DEST(DEST) == FALSE)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					// Node has no routes - get rid of it
 | 
										// Node has no routes - get rid of it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					REMOVENODE(DEST);
 | 
										REMOVENODE(DEST);
 | 
				
			||||||
					return;					// Avoid riskof looking at lod entries
 | 
										return;					// Avoid risk of looking at old entries
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -154,14 +172,24 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int n = MAXDESTS;
 | 
						int n = MAXDESTS;
 | 
				
			||||||
	struct PORTCONTROL * PORT = PORTTABLE;
 | 
						struct PORTCONTROL * PORT = PORTTABLE;
 | 
				
			||||||
	struct ROUTE * ROUTE;
 | 
						struct ROUTE * ROUTE = NULL;
 | 
				
			||||||
	struct _LINKTABLE * LINK;
 | 
						struct _LINKTABLE * LINK;
 | 
				
			||||||
	struct TNCINFO * TNC;
 | 
						struct TNCINFO * TNC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int ActiveRoute;
 | 
						int ActiveRoute;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (DEST->DEST_ROUTE == 0)		// ALREADY HAVE A SELECTED ROUTE?
 | 
						if (DEST->DEST_ROUTE == 0)		// Don't ALREADY HAVE A SELECTED ROUTE?
 | 
				
			||||||
		DEST->DEST_ROUTE = 1;		// TRY TO ACTIVATE FIRST
 | 
						{
 | 
				
			||||||
 | 
							DEST->DEST_ROUTE = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (PREFERINP3ROUTES)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// if we have any INP3 routes use the first. It will always be the fastest. The others are there for fallback if the first fails.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR)
 | 
				
			||||||
 | 
									DEST->DEST_ROUTE = 4;		// TRY TO ACTIVATE FIRST
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	ActiveRoute = DEST->DEST_ROUTE - 1;
 | 
						ActiveRoute = DEST->DEST_ROUTE - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,7 +197,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ROUTE == 0)
 | 
						if (ROUTE == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//	Currnet Route not present
 | 
							//	Current Route not present
 | 
				
			||||||
		//	If  current route is 1, then we must have INP3 routes (or entry is corrupt)
 | 
							//	If  current route is 1, then we must have INP3 routes (or entry is corrupt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (DEST->DEST_ROUTE != 1)
 | 
							if (DEST->DEST_ROUTE != 1)
 | 
				
			||||||
| 
						 | 
					@ -177,13 +205,17 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Current Route is 1
 | 
							// Current Route is 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
 | 
							if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
 | 
				
			||||||
			return FALSE;					// No INP3 so No Routes
 | 
								return FALSE;					// No INP3 so No Routes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DEST->DEST_ROUTE = 4;			// First INP3
 | 
							DEST->DEST_ROUTE = 4;			// First INP3
 | 
				
			||||||
		ROUTE = DEST->ROUTE[0].ROUT_NEIGHBOUR;
 | 
							ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ROUTE == 0)			// Shouldn't happen
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if NetROM over VARA conection is made by the driver
 | 
						// if NetROM over VARA conection is made by the driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
 | 
						TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
 | 
				
			||||||
| 
						 | 
					@ -204,7 +236,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
 | 
				
			||||||
		return L2SETUPCROSSLINK(ROUTE);
 | 
							return L2SETUPCROSSLINK(ROUTE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// We mst be waiting for link to come up
 | 
						// We umst be waiting for link to come up
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -223,6 +255,13 @@ char Call1[10];
 | 
				
			||||||
char Call2[10];
 | 
					char Call2[10];
 | 
				
			||||||
char Call3[10];
 | 
					char Call3[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID PROCESSNODESPOLL(struct PORTCONTROL * PORT)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Pauls G8BPT's request NODES Broadcast
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SENDNODESMSG(PORT->PORTNUMBER);
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
					VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	PROCESS A NET/ROM 'NODES' MESSAGE
 | 
						//	PROCESS A NET/ROM 'NODES' MESSAGE
 | 
				
			||||||
| 
						 | 
					@ -259,7 +298,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		APPL=&APPLCALLTABLE[App];
 | 
							APPL=&APPLCALLTABLE[App];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (APPL->APPLHASALIAS == 0 && CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
 | 
							if (CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -319,13 +358,13 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if locked route with quality zero ignore
 | 
						// if locked route with quality zero ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((ROUTE->NEIGHBOUR_FLAG & 1))	 // LOCKED ROUTE
 | 
						if ((ROUTE->NEIGHBOUR_FLAG))	 // LOCKED ROUTE
 | 
				
			||||||
		if (ROUTE->NEIGHBOUR_QUAL == 0)
 | 
							if (ROUTE->NEIGHBOUR_QUAL == 0)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	If Ignoreunlocked set, ignore it not locked
 | 
						//	If Ignoreunlocked set, ignore it not locked
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0)	 // LOCKED ROUTE
 | 
						if ((ROUTE->NEIGHBOUR_FLAG) == 0)	 // LOCKED ROUTE
 | 
				
			||||||
		if (PORT->IgnoreUnlocked)
 | 
							if (PORT->IgnoreUnlocked)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -333,7 +372,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES
 | 
						// if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0)	 // Not LOCKED ROUTE
 | 
						if (ROUTE->NEIGHBOUR_FLAG == 0)	 // Not LOCKED ROUTE
 | 
				
			||||||
		ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY;
 | 
							ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	GET TIME FROM BIOS DATA AREA OR RTC
 | 
						//	GET TIME FROM BIOS DATA AREA OR RTC
 | 
				
			||||||
| 
						 | 
					@ -436,10 +475,10 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
				
			||||||
		if (CheckExcludeList(ptr1) == 0)			// Excluded
 | 
							if (CheckExcludeList(ptr1) == 0)			// Excluded
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (n = 0; n < 32; n++)
 | 
							for (n = 0; n < NumberofAppls; n++)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL))
 | 
								if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL))
 | 
				
			||||||
				continue;
 | 
									goto IgnoreNode;					// Don't update our applications
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//	MAKE SURE ITS NOT CORRUPTED
 | 
							//	MAKE SURE ITS NOT CORRUPTED
 | 
				
			||||||
| 
						 | 
					@ -548,7 +587,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ptr1 += 7;
 | 
							ptr1 += 7;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		//	UPDATE ALIAS
 | 
							//	UPDATE ALIAS#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		memcpy(DEST->DEST_ALIAS, ptr1, 6);
 | 
							memcpy(DEST->DEST_ALIAS, ptr1, 6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -707,11 +746,11 @@ int COUNTNODES(struct ROUTE * ROUTE)
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
		else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
 | 
							else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
		else if (DEST->ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
 | 
							else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
		else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
 | 
							else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
		else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
 | 
							else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DEST++;
 | 
							DEST++;
 | 
				
			||||||
| 
						 | 
					@ -726,12 +765,26 @@ VOID L3BG();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SENDNEXTNODESFRAGMENT();
 | 
					VOID SENDNEXTNODESFRAGMENT();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SENDNODESMSG()
 | 
					VOID SENDNODESMSG(int Portnum)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (NODESINPROGRESS)
 | 
						if (NODESINPROGRESS)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	L3CURRENTPORT = PORTTABLE;
 | 
						NODESToOnePort = Portnum;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Portnum)			// Nodes to one port only
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							L3CURRENTPORT = GetPortTableEntryFromPortNum(Portnum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (L3CURRENTPORT == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								NODESToOnePort = 0;
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							L3CURRENTPORT = PORTTABLE;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	SENDNEXTNODESFRAGMENT();
 | 
						SENDNEXTNODESFRAGMENT();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -767,16 +820,19 @@ VOID SENDNEXTNODESFRAGMENT()
 | 
				
			||||||
			// No NODES to this port, so go to next
 | 
								// No NODES to this port, so go to next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			PORT = PORT->PORTPOINTER;
 | 
								PORT = PORT->PORTPOINTER;
 | 
				
			||||||
			if (PORT == NULL)
 | 
					
 | 
				
			||||||
 | 
								if (PORT == NULL || NODESToOnePort)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				// Finished
 | 
									// Finished
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									NODESToOnePort = 0;
 | 
				
			||||||
				NODESINPROGRESS = 0;
 | 
									NODESINPROGRESS = 0;
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		L3CURRENTPORT = PORT;
 | 
							if (NODESToOnePort == 0)			// CurrentPort already set if NODESToOnePort
 | 
				
			||||||
 | 
								L3CURRENTPORT = PORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DEST = CURRENTNODE = DESTS;			// START OF LIST
 | 
							DEST = CURRENTNODE = DESTS;			// START OF LIST
 | 
				
			||||||
		NODESINPROGRESS = 1;
 | 
							NODESINPROGRESS = 1;
 | 
				
			||||||
| 
						 | 
					@ -833,19 +889,30 @@ VOID SENDNEXTNODESFRAGMENT()
 | 
				
			||||||
		if (DEST >= ENDDESTLIST)
 | 
							if (DEST >= ENDDESTLIST)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			CURRENTNODE = 0;			// Finished on this port
 | 
								CURRENTNODE = 0;			// Finished on this port
 | 
				
			||||||
			L3CURRENTPORT = PORT->PORTPOINTER;
 | 
					 | 
				
			||||||
			if (L3CURRENTPORT == NULL)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				// Finished
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// if sending to only one port then stop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (NODESToOnePort)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NODESToOnePort = 0;
 | 
				
			||||||
				NODESINPROGRESS = 0;
 | 
									NODESINPROGRESS = 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									L3CURRENTPORT = PORT->PORTPOINTER;
 | 
				
			||||||
 | 
									if (L3CURRENTPORT == NULL)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// Finished
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										NODESINPROGRESS = 0;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			goto Sendit;
 | 
								goto Sendit;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
 | 
							if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
 | 
				
			||||||
			DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
 | 
								DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
 | 
				
			||||||
			(NODE == 1 || DEST->DEST_STATE & 0x80))			// Only send appl nodes if DEST = 0;
 | 
								(NODE == 1 || DEST->DEST_STATE & 0x80))			// Only send appl nodes if NODE = 0;
 | 
				
			||||||
		{		
 | 
							{		
 | 
				
			||||||
			// Send it
 | 
								// Send it
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
| 
						 | 
					@ -878,6 +945,9 @@ VOID SENDNEXTNODESFRAGMENT()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			*(ptr1++) = (UCHAR)Qual;
 | 
								*(ptr1++) = (UCHAR)Qual;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Qual == 0)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Count--;
 | 
								Count--;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		DEST++;
 | 
							DEST++;
 | 
				
			||||||
| 
						 | 
					@ -924,13 +994,15 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
 | 
					VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
 | 
						//	FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
 | 
				
			||||||
	//	SET INACTIVE
 | 
						//	SET INACTIVE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dest_list * DEST;
 | 
						dest_list * DEST;
 | 
				
			||||||
	int n;
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Reason != NORMALCLOSE || ROUTE->INP3Node)
 | 
						// If a link restarts and is no longer inp3 we must still clear any inp3 routes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	if (Reason != NORMALCLOSE || ROUTE->INP3Node)
 | 
				
			||||||
		TellINP3LinkGone(ROUTE);
 | 
							TellINP3LinkGone(ROUTE);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	DEST = DESTS;
 | 
						DEST = DESTS;
 | 
				
			||||||
| 
						 | 
					@ -945,7 +1017,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
 | 
				
			||||||
		if (DEST->DEST_ROUTE == 0)
 | 
							if (DEST->DEST_ROUTE == 0)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (DEST->ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE)   // Is this the active route
 | 
							if (DEST->INP3ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE)   // Is this the active route
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			// Yes, so clear
 | 
								// Yes, so clear
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1023,7 +1095,7 @@ VOID L3TimerProc()
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			L3TIMER = L3INTERVAL;
 | 
								L3TIMER = L3INTERVAL;
 | 
				
			||||||
			UPDATEDESTLIST();
 | 
								UPDATEDESTLIST();
 | 
				
			||||||
			SENDNODESMSG();
 | 
								SENDNODESMSG(0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1038,7 +1110,7 @@ VOID L3TimerProc()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ROUTE++;
 | 
							ROUTE++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (ROUTE->NEIGHBOUR_FLAG & 1)			// Locked?
 | 
							if (ROUTE->NEIGHBOUR_FLAG)				// Locked?
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (ROUTE->NEIGHBOUR_LINK)				// Has an active Session
 | 
							if (ROUTE->NEIGHBOUR_LINK)				// Has an active Session
 | 
				
			||||||
| 
						 | 
					@ -1061,6 +1133,11 @@ VOID L3FastTimer()
 | 
				
			||||||
	MESSAGE * Msg;
 | 
						MESSAGE * Msg;
 | 
				
			||||||
	struct PORTCONTROL * PORT = PORTTABLE;
 | 
						struct PORTCONTROL * PORT = PORTTABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Not if Node is closing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (CLOSING)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	INP3TIMER();
 | 
						INP3TIMER();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Send Node faster if VARA
 | 
						// Send Node faster if VARA
 | 
				
			||||||
| 
						 | 
					@ -1120,7 +1197,7 @@ UPDEST000:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			//	 Any INP3 Routes?
 | 
								//	 Any INP3 Routes?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
 | 
								if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				//	NO ROUTES LEFT TO DEST - REMOVE IT
 | 
									//	NO ROUTES LEFT TO DEST - REMOVE IT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1292,19 +1369,25 @@ VOID REMOVENODE(dest_list * DEST)
 | 
				
			||||||
	NUMBEROFNODES--;
 | 
						NUMBEROFNODES--;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
 | 
					VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
 | 
						//	L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct PORTCONTROL * PORT = PORTTABLE;
 | 
						struct PORTCONTROL * PORT = PORTTABLE;
 | 
				
			||||||
	struct ROUTE * ROUTE;
 | 
						struct ROUTE * ROUTE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	ROUTE = LINK->NEIGHBOUR;		// TO NEIGHBOUR
 | 
						ROUTE = LINK->NEIGHBOUR;		// TO NEIGHBOUR
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if (ROUTE == NULL)
 | 
						if (ROUTE == NULL)
 | 
				
			||||||
		return;						// NOTHING ???
 | 
							return;						// NOTHING ???
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ROUTE->INP3Node)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							char Normcall[10];
 | 
				
			||||||
 | 
							Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
 | 
				
			||||||
 | 
							Debugprintf("INP3 Route to %s connect failed", Normcall);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TellINP3LinkSetupFailed(ROUTE);
 | 
						TellINP3LinkSetupFailed(ROUTE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ROUTE->NEIGHBOUR_LINK = 0;		// CLEAR IT
 | 
						ROUTE->NEIGHBOUR_LINK = 0;		// CLEAR IT
 | 
				
			||||||
| 
						 | 
					@ -1313,9 +1396,10 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
 | 
					VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
 | 
						//	FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
 | 
				
			||||||
	//	SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
 | 
						//	SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int n = MAXDESTS;
 | 
						int n = MAXDESTS;
 | 
				
			||||||
| 
						 | 
					@ -1328,7 +1412,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if (ActiveRoute)
 | 
							if (ActiveRoute)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ActiveRoute --;			// Routes numbered 1 - 6, idex from 0
 | 
								ActiveRoute --;			// Routes numbered 1 - 6, index from 0
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
 | 
								if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2154
									
								
								LinBPQ-skigdebian.c
									
									
									
									
									
								
							
							
						
						
									
										2154
									
								
								LinBPQ-skigdebian.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										90
									
								
								LinBPQ.c
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								LinBPQ.c
									
									
									
									
									
								
							| 
						 | 
					@ -83,8 +83,10 @@ void RHPPoll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID GetPGConfig();
 | 
					VOID GetPGConfig();
 | 
				
			||||||
void SendBBSDataToPktMap();
 | 
					void SendBBSDataToPktMap();
 | 
				
			||||||
 | 
					void CloseAllLinks();
 | 
				
			||||||
 | 
					void hookNodeClosing(char * Reason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint64_t timeLoadedMS;
 | 
					extern uint64_t INP3timeLoadedMS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL IncludesMail = FALSE;
 | 
					BOOL IncludesMail = FALSE;
 | 
				
			||||||
BOOL IncludesChat = FALSE;
 | 
					BOOL IncludesChat = FALSE;
 | 
				
			||||||
| 
						 | 
					@ -262,9 +264,9 @@ extern char MailDir[MAX_PATH];
 | 
				
			||||||
extern time_t MaintClock;						// Time to run housekeeping
 | 
					extern time_t MaintClock;						// Time to run housekeeping
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
BOOL KEEPGOING = 30;					// 5 secs to shut down
 | 
					int KEEPGOING = 30;					// 5 secs to shut down
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
BOOL KEEPGOING = 50;					// 5 secs to shut down
 | 
					int KEEPGOING = 50;					// 5 secs to shut down
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
BOOL Restarting = FALSE;
 | 
					BOOL Restarting = FALSE;
 | 
				
			||||||
BOOL CLOSING = FALSE;
 | 
					BOOL CLOSING = FALSE;
 | 
				
			||||||
| 
						 | 
					@ -337,6 +339,7 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
 | 
				
			||||||
    // Handle the CTRL-C signal.
 | 
					    // Handle the CTRL-C signal.
 | 
				
			||||||
    case CTRL_C_EVENT:
 | 
					    case CTRL_C_EVENT:
 | 
				
			||||||
      printf( "Ctrl-C event\n\n" );
 | 
					      printf( "Ctrl-C event\n\n" );
 | 
				
			||||||
 | 
						  CloseAllLinks();
 | 
				
			||||||
	  CLOSING = TRUE;
 | 
						  CLOSING = TRUE;
 | 
				
			||||||
      Beep( 750, 300 );
 | 
					      Beep( 750, 300 );
 | 
				
			||||||
      return( TRUE );
 | 
					      return( TRUE );
 | 
				
			||||||
| 
						 | 
					@ -344,7 +347,8 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
 | 
				
			||||||
    // CTRL-CLOSE: confirm that the user wants to exit.
 | 
					    // CTRL-CLOSE: confirm that the user wants to exit.
 | 
				
			||||||
    case CTRL_CLOSE_EVENT:
 | 
					    case CTRL_CLOSE_EVENT:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  CLOSING = TRUE;
 | 
						CloseAllLinks();
 | 
				
			||||||
 | 
						CLOSING = TRUE;
 | 
				
			||||||
     printf( "Ctrl-Close event\n\n" );
 | 
					     printf( "Ctrl-Close event\n\n" );
 | 
				
			||||||
	 Sleep(20000);
 | 
						 Sleep(20000);
 | 
				
			||||||
       Beep( 750, 300 );
 | 
					       Beep( 750, 300 );
 | 
				
			||||||
| 
						 | 
					@ -354,7 +358,8 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
 | 
				
			||||||
    case CTRL_BREAK_EVENT:
 | 
					    case CTRL_BREAK_EVENT:
 | 
				
			||||||
      Beep( 900, 200 );
 | 
					      Beep( 900, 200 );
 | 
				
			||||||
      printf( "Ctrl-Break event\n\n" );
 | 
					      printf( "Ctrl-Break event\n\n" );
 | 
				
			||||||
	  CLOSING = TRUE;
 | 
						CloseAllLinks();
 | 
				
			||||||
 | 
						CLOSING = TRUE;
 | 
				
			||||||
      Beep( 750, 300 );
 | 
					      Beep( 750, 300 );
 | 
				
			||||||
     return FALSE;
 | 
					     return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -366,7 +371,8 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
 | 
				
			||||||
    case CTRL_SHUTDOWN_EVENT:
 | 
					    case CTRL_SHUTDOWN_EVENT:
 | 
				
			||||||
      Beep( 750, 500 );
 | 
					      Beep( 750, 500 );
 | 
				
			||||||
      printf( "Ctrl-Shutdown event\n\n" );
 | 
					      printf( "Ctrl-Shutdown event\n\n" );
 | 
				
			||||||
	  CLOSING = TRUE;
 | 
						CloseAllLinks();
 | 
				
			||||||
 | 
						CLOSING = TRUE;
 | 
				
			||||||
      Beep( 750, 300 );
 | 
					      Beep( 750, 300 );
 | 
				
			||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -381,51 +387,66 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
 | 
				
			||||||
#include <signal.h>
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Linux Signal Handlers
 | 
					// Linux Signal Handlers
 | 
				
			||||||
 | 
					 | 
				
			||||||
static void segvhandler(int sig)
 | 
					static void segvhandler(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	void *array[10];
 | 
					    void *array[10];
 | 
				
			||||||
	size_t size;
 | 
					    size_t size;
 | 
				
			||||||
	char msg[] = "SIGSEGV Received\n";
 | 
					    char msg[] = "\nSIGSEGV Received\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	write(STDERR_FILENO, msg, strlen(msg));
 | 
					    write(STDERR_FILENO, msg, strlen(msg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// get void*'s for all entries on the stack
 | 
					    // get void*'s for all entries on the stack
 | 
				
			||||||
	size = backtrace(array, 10);
 | 
					    size = backtrace(array, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// print out all the frames to stderr
 | 
					    // print out all the frames to stderr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
					    backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  exit(1);
 | 
					    write(STDOUT_FILENO, msg, strlen(msg));
 | 
				
			||||||
 | 
					    backtrace_symbols_fd(array, size, STDOUT_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hookNodeClosing("sigsegv");
 | 
				
			||||||
 | 
						Sleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void abrthandler(int sig)
 | 
					static void abrthandler(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	void *array[10];
 | 
					    void *array[10];
 | 
				
			||||||
	size_t size;
 | 
					    size_t size;
 | 
				
			||||||
	char msg[] = "SIGABRT Received\n";
 | 
					    char msg[] = "\nSIGABRT Received\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	write(STDERR_FILENO, msg, strlen(msg));
 | 
					    write(STDERR_FILENO, msg, strlen(msg));
 | 
				
			||||||
 | 
					    write(STDOUT_FILENO, msg, strlen(msg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// get void*'s for all entries on the stack
 | 
					    // get void*'s for all entries on the stack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	size = backtrace(array, 10);
 | 
					    size = backtrace(array, 10);
 | 
				
			||||||
	backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
					    backtrace_symbols_fd(array, size, STDERR_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	exit(1);
 | 
					    write(STDOUT_FILENO, msg, strlen(msg));
 | 
				
			||||||
 | 
					    backtrace_symbols_fd(array, size, STDOUT_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hookNodeClosing("sigabrt");
 | 
				
			||||||
 | 
						Sleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sigterm_handler(int sig)
 | 
					static void sigterm_handler(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	syslog(LOG_INFO, "terminating on SIGTERM\n");
 | 
						syslog(LOG_INFO, "terminating on SIGTERM\n");
 | 
				
			||||||
	CLOSING = TRUE;
 | 
						CLOSING = TRUE;
 | 
				
			||||||
 | 
						CloseAllLinks();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sigint_handler(int sig)
 | 
					static void sigint_handler(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	printf("terminating on SIGINT\n");
 | 
						printf("terminating on SIGINT\n");
 | 
				
			||||||
	CLOSING = TRUE;
 | 
						CLOSING = TRUE;
 | 
				
			||||||
 | 
						CloseAllLinks();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -787,6 +808,8 @@ int Redirected = 0;
 | 
				
			||||||
static void segvhandler(int sig);
 | 
					static void segvhandler(int sig);
 | 
				
			||||||
static void abrthandler(int sig);
 | 
					static void abrthandler(int sig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char * argv[])
 | 
					int main(int argc, char * argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -830,21 +853,22 @@ int main(int argc, char * argv[])
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Disable Console Terminal if stdout redirected
 | 
					// Disable Console Terminal if stdout redirected
 | 
				
			||||||
 | 
					 | 
				
			||||||
//	printf("STDOUT %d\n",isatty(STDOUT_FILENO));
 | 
					//	printf("STDOUT %d\n",isatty(STDOUT_FILENO));
 | 
				
			||||||
//	printf("STDIN %d\n",isatty(STDIN_FILENO));
 | 
					//	printf("STDIN %d\n",isatty(STDIN_FILENO));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO))
 | 
						if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO))
 | 
				
			||||||
		Redirected = 1;
 | 
							Redirected = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	 timeLoadedMS = GetTickCount();
 | 
						 INP3timeLoadedMS = GetTickCount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	 printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
 | 
						 printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
 | 
				
			||||||
	 printf("%s\n", VerCopyright);
 | 
						 printf("%s\n", VerCopyright);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						 srand(time(NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	 // look for optarg format parameters
 | 
						 // look for optarg format parameters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -902,7 +926,10 @@ int main(int argc, char * argv[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring);
 | 
						Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef MACBPQ
 | 
					#if defined(MACBPQ) || defined(FREEBSD)
 | 
				
			||||||
 | 
						time_t dummy;
 | 
				
			||||||
 | 
						_MYTIMEZONE = -localtime(&dummy)->tm_gmtoff;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
	_MYTIMEZONE = _timezone;
 | 
						_MYTIMEZONE = _timezone;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1174,6 +1201,8 @@ int main(int argc, char * argv[])
 | 
				
			||||||
		chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
 | 
							chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Make backup copies of Databases
 | 
							// Make backup copies of Databases
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//	CopyConfigFile(ConfigName);
 | 
							//	CopyConfigFile(ConfigName);
 | 
				
			||||||
| 
						 | 
					@ -1195,6 +1224,7 @@ int main(int argc, char * argv[])
 | 
				
			||||||
		GetBadWordFile();
 | 
							GetBadWordFile();
 | 
				
			||||||
		GetHTMLForms();
 | 
							GetHTMLForms();
 | 
				
			||||||
		GetPGConfig();
 | 
							GetPGConfig();
 | 
				
			||||||
 | 
							GetRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Make sure there is a user record for the BBS, with BBS bit set.
 | 
							// Make sure there is a user record for the BBS, with BBS bit set.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1442,6 +1472,7 @@ int main(int argc, char * argv[])
 | 
				
			||||||
				SaveMessageDatabase();
 | 
									SaveMessageDatabase();
 | 
				
			||||||
				SaveBIDDatabase();
 | 
									SaveBIDDatabase();
 | 
				
			||||||
				SaveConfig(ConfigName);
 | 
									SaveConfig(ConfigName);
 | 
				
			||||||
 | 
									SaveRestartData();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			KEEPGOING--;					// Give time for links to close
 | 
								KEEPGOING--;					// Give time for links to close
 | 
				
			||||||
| 
						 | 
					@ -1665,6 +1696,9 @@ int main(int argc, char * argv[])
 | 
				
			||||||
			Slowtimer = 0;
 | 
								Slowtimer = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hookNodeClosing("Shutdown");
 | 
				
			||||||
 | 
						Sleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf("Closing Ports\n");
 | 
						printf("Closing Ports\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CloseTNCEmulator();
 | 
						CloseTNCEmulator();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -407,7 +407,10 @@ static size_t ExtProc(int fn, int port,  PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
 | 
								if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
									char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
									sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -710,7 +713,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	ptr=strchr(TNC->NodeCall, ' ');
 | 
						ptr=strchr(TNC->NodeCall, ' ');
 | 
				
			||||||
	if (ptr) *(ptr) = 0;					// Null Terminate
 | 
						if (ptr) *(ptr) = 0;					// Null Terminate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_MPSK;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
 | 
						MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -1539,7 +1542,7 @@ VOID CloseComplete(struct TNCINFO * TNC, int Stream)
 | 
				
			||||||
		sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
 | 
							sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->MPSKInfo->Beacon)
 | 
						if (TNC->MPSKInfo->Beacon)
 | 
				
			||||||
		sprintf(Cmd, "%s%cBEACON_ARQ_FAE\x1b", Cmd, '\x1a');
 | 
							sprintf(&Cmd[strlen(Cmd)], "%cBEACON_ARQ_FAE\x1b", '\x1a');
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	Len = strlen(Cmd);
 | 
						Len = strlen(Cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1570,12 +1570,12 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
 | 
				
			||||||
						if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
 | 
											if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
 | 
				
			||||||
							continue;
 | 
												continue;
 | 
				
			||||||
						
 | 
											
 | 
				
			||||||
						ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, &Addr[4]);
 | 
											ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", &Addr[4]);
 | 
				
			||||||
						*sockptr->RecpTo[i] = 0;		// So we dont create individual one later
 | 
											*sockptr->RecpTo[i] = 0;		// So we dont create individual one later
 | 
				
			||||||
						continue;
 | 
											continue;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, &Addr[4], Via);
 | 
										ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", &Addr[4], Via);
 | 
				
			||||||
					*sockptr->RecpTo[i] = 0;			// So we dont create individual one later
 | 
										*sockptr->RecpTo[i] = 0;			// So we dont create individual one later
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -1591,7 +1591,7 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
 | 
				
			||||||
					if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
 | 
										if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
 | 
				
			||||||
						continue;
 | 
											continue;
 | 
				
			||||||
					
 | 
										
 | 
				
			||||||
					ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
 | 
										ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
 | 
				
			||||||
					*sockptr->RecpTo[i] = 0;		// So we dont create individual one later
 | 
										*sockptr->RecpTo[i] = 0;		// So we dont create individual one later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										136
									
								
								Moncode.c
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								Moncode.c
									
									
									
									
									
								
							| 
						 | 
					@ -59,7 +59,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	NODES_SIG	0xFF
 | 
					#define	NODES_SIG	0xFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen);
 | 
					UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen);
 | 
					char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen);
 | 
				
			||||||
UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
 | 
					UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
 | 
				
			||||||
| 
						 | 
					@ -535,6 +535,16 @@ KC6OAR*>ID:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					Output += sprintf((char *)Output, " RX Window=%d", value);
 | 
										Output += sprintf((char *)Output, " RX Window=%d", value);
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 16:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " Can Compress");
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 17:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Output += sprintf((char *)Output, " Compress ok");
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}	
 | 
								}	
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -551,6 +561,15 @@ KC6OAR*>ID:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (ADJBUFFER->PID)
 | 
							switch (ADJBUFFER->PID)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
							case 0xF1:
 | 
				
			||||||
 | 
							case 0xF2:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//	Compressed L2 Data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Output += sprintf((char *)Output, " <%d Bytes of Compressed L2 Data>", MsgLen - (19 + sizeof(void *)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case 0xF0:		// Normal Data
 | 
							case 0xF0:		// Normal Data
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			char Infofield[257];
 | 
								char Infofield[257];
 | 
				
			||||||
| 
						 | 
					@ -636,12 +655,13 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
	char Node[10];
 | 
						char Node[10];
 | 
				
			||||||
	UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window;
 | 
						UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window;
 | 
				
			||||||
	UCHAR * ptr = &ADJBUFFER->L2DATA[0];
 | 
						UCHAR * ptr = &ADJBUFFER->L2DATA[0];
 | 
				
			||||||
 | 
						int service = 0;
 | 
				
			||||||
 | 
						int netromx = 0;		// Set if Paula's connect to service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 	if (ADJBUFFER->L2DATA[0] == NODES_SIG)
 | 
					 	if (ADJBUFFER->L2DATA[0] == NODES_SIG)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// Display NODES
 | 
							// Display NODES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// If an INP3 RIF (type <> UI) decode as such
 | 
							// If an INP3 RIF (type <> UI) decode as such
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		if (ADJBUFFER->CTL != 3)		// UI
 | 
							if (ADJBUFFER->CTL != 3)		// UI
 | 
				
			||||||
| 
						 | 
					@ -672,6 +692,14 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
		return Output;
 | 
							return Output;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ADJBUFFER->L2DATA[0] == 0xfe)			// Paula's Nodes Poll
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							memcpy(Alias, ++ptr, 6);
 | 
				
			||||||
 | 
							Output += sprintf((char *)Output, " NODES POLL from %s\r", Alias);
 | 
				
			||||||
 | 
							return Output;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	Display normal NET/ROM transmissions 
 | 
						//	Display normal NET/ROM transmissions 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Output += sprintf((char *)Output, " NET/ROM\r  ");
 | 
						Output += sprintf((char *)Output, " NET/ROM\r  ");
 | 
				
			||||||
| 
						 | 
					@ -695,6 +723,12 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (OpCode)
 | 
						switch (OpCode)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case L4CREQX:			// Paula's connect to service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							netromx = 1;
 | 
				
			||||||
 | 
							service = (RXNO << 8) | TXNO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case L4CREQ:
 | 
						case L4CREQ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Window = *(ptr++);
 | 
							Window = *(ptr++);
 | 
				
			||||||
| 
						 | 
					@ -703,7 +737,10 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
		Node[ConvFromAX25(ptr, Node)] = 0;
 | 
							Node[ConvFromAX25(ptr, Node)] = 0;
 | 
				
			||||||
		ptr +=7;
 | 
							ptr +=7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node);
 | 
							if (netromx)
 | 
				
			||||||
 | 
								Output += sprintf((char *)Output, "<CON REQX> w=%d %d@%s at %s", Window, service, Dest, Node);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (MsgLen > 38)				// BPQ Extended Params
 | 
							if (MsgLen > 38)				// BPQ Extended Params
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -718,7 +755,7 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
		if (Flags & L4BUSY)				// BUSY RETURNED
 | 
							if (Flags & L4BUSY)				// BUSY RETURNED
 | 
				
			||||||
			return Output + sprintf((char *)Output, " <CON NAK> - BUSY");
 | 
								return Output + sprintf((char *)Output, " <CON NAK> - BUSY");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[1], TXNO, RXNO);
 | 
							return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[0], TXNO, RXNO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case L4DREQ:
 | 
						case L4DREQ:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -728,6 +765,10 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return Output + sprintf((char *)Output, " <DISC ACK>");
 | 
							return Output + sprintf((char *)Output, " <DISC ACK>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case L4RESET:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return Output + sprintf((char *)Output, " <RESET>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case L4INFO:
 | 
						case L4INFO:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			char Infofield[257];
 | 
								char Infofield[257];
 | 
				
			||||||
| 
						 | 
					@ -746,6 +787,9 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
 | 
				
			||||||
			if (Flags & L4MORE)
 | 
								if (Flags & L4MORE)
 | 
				
			||||||
				*(Output++) = 'M';
 | 
									*(Output++) = 'M';
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
								if (Flags & L4COMP)
 | 
				
			||||||
 | 
									*(Output++) = 'C';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			MsgLen = MsgLen - (19 + sizeof(void *));
 | 
								MsgLen = MsgLen - (19 + sizeof(void *));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (MsgLen < 0 || MsgLen > 257)
 | 
								if (MsgLen < 0 || MsgLen > 257)
 | 
				
			||||||
| 
						 | 
					@ -959,3 +1003,87 @@ char * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output)
 | 
				
			||||||
			ptr[15], ptr[16], ptr[17], ptr[18], Dest, ptr[26], ptr[27], ptr[28], ptr[29]);
 | 
								ptr[15], ptr[16], ptr[17], ptr[18], Dest, ptr[26], ptr[27], ptr[28], ptr[29]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char Lastpacketlog[256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int PacketLogDelay = 30000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern BPQVECSTRUC * FILEMONVECTOR;
 | 
				
			||||||
 | 
					extern UCHAR LogDirectory[260];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void WritePacketLogThread(void * param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char FN[256];
 | 
				
			||||||
 | 
						time_t T;
 | 
				
			||||||
 | 
						struct tm * tm;
 | 
				
			||||||
 | 
						FILE * Handle;
 | 
				
			||||||
 | 
						int MsgLen;
 | 
				
			||||||
 | 
						MESSAGE * MSG;
 | 
				
			||||||
 | 
						MESSAGE * Q;
 | 
				
			||||||
 | 
						char buffer[512];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							BOOL SaveMTX = MTX;
 | 
				
			||||||
 | 
							BOOL SaveMCOM = MCOM;
 | 
				
			||||||
 | 
							BOOL SaveMUI = MUIONLY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Sleep(PacketLogDelay);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Get chain of queued packets under semaphore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							GetSemaphore(&Semaphore, 101);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Q = FILEMONVECTOR->HOSTTRACEQ;
 | 
				
			||||||
 | 
							FILEMONVECTOR->HOSTTRACEQ = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							FreeSemaphore(&Semaphore);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (Q == 0)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Open log file and write decoded packets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							T = time(NULL);
 | 
				
			||||||
 | 
							tm = gmtime(&T);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (LogDirectory[0] == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								strcpy(FN, "logs/PacketLog");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								strcpy(FN, LogDirectory);
 | 
				
			||||||
 | 
								strcat(FN, "/");
 | 
				
			||||||
 | 
								strcat(FN, "logs/PacketLog");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sprintf(&FN[strlen(FN)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Handle = fopen(FN, "ab");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Handle == NULL)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (Q)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								MSG = Q;
 | 
				
			||||||
 | 
								Q = MSG->CHAIN;			// get first
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								IntSetTraceOptionsEx(MMASK, 1, 1, 0);
 | 
				
			||||||
 | 
								MsgLen = IntDecodeFrame(MSG, buffer, MSG->Timestamp, 0xffffffffffffffff, FALSE, FALSE);
 | 
				
			||||||
 | 
								IntSetTraceOptionsEx(MMASK, SaveMTX, SaveMCOM, SaveMUI);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								fwrite(buffer , 1, MsgLen, Handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								GetSemaphore(&Semaphore, 101);
 | 
				
			||||||
 | 
								ReleaseBuffer(MSG);
 | 
				
			||||||
 | 
								FreeSemaphore(&Semaphore);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fclose(Handle);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -919,6 +919,9 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			DoRefresh(Cinfo);
 | 
								DoRefresh(Cinfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->Console->bytesRxed += Cinfo->kbptr+1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (Cinfo->Console->SysopChatStream)
 | 
								if (Cinfo->Console->SysopChatStream)
 | 
				
			||||||
				SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1);
 | 
									SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
| 
						 | 
					@ -942,6 +945,30 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
			return 0; 
 | 
								return 0; 
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (wParam == 0x7)  // BEL (Ctrl/G)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// Get buffer, append 07 and write back
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1, 
 | 
				
			||||||
 | 
									(LPARAM) (LPCSTR)Cinfo->kbbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Cinfo->kbbuf[Cinfo->kbptr++] = 7;
 | 
				
			||||||
 | 
								Cinfo->kbbuf[Cinfo->kbptr] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Send cursor right
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (i = 0; i < strlen(Cinfo->kbbuf); i++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
 | 
				
			||||||
 | 
									SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); 
 | 
					    return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										551
									
								
								NETROMTCP.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										551
									
								
								NETROMTCP.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,551 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2001-2022 John Wiseman G8BPQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file is part of LinBPQ/BPQ32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					(at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LinBPQ/BPQ32 is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					*/	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Netrom over TCP Support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is intended for operation over radio links with an IP interface, eg New Packet Radio or possibly microwave links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To simplify interface to the rest of the oode dummy LINK and PORT records are created
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Packet Format is Length (2 byte little endian) Call (10 bytes ASCII) NETROM L3/4 Packet, starting 0xcf (to detect framing errors).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A TCP message can contain multiple packets and/or partial packets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It uses the Telnet Server, with port defined in NETROMPORT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ROUTE definitions have an extra field, the TCP Port Number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#pragma data_seg("_BPQDATA")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _CRT_SECURE_NO_DEPRECATE 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "time.h"
 | 
				
			||||||
 | 
					#include "stdio.h"
 | 
				
			||||||
 | 
					#include <fcntl.h>					 
 | 
				
			||||||
 | 
					//#include "vmm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "cheaders.h"
 | 
				
			||||||
 | 
					#include "asmstrucs.h"
 | 
				
			||||||
 | 
					#include "telnetserver.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	NETROM_PID 0xCF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NETROMConnectionLost(struct ConnectionInfo * sockptr);
 | 
				
			||||||
 | 
					int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo);
 | 
				
			||||||
 | 
					int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr);
 | 
				
			||||||
 | 
					void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info);
 | 
				
			||||||
 | 
					VOID SendRTTMsg(struct ROUTE * Route);
 | 
				
			||||||
 | 
					BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
 | 
				
			||||||
 | 
					VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
 | 
				
			||||||
 | 
					int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
 | 
				
			||||||
 | 
					VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct NRTCPMsg
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						short Length;
 | 
				
			||||||
 | 
						char Call[10];
 | 
				
			||||||
 | 
						unsigned char PID;
 | 
				
			||||||
 | 
						char Packet[1024];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct NRTCPSTRUCT 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
 | 
						struct _LINKTABLE * LINK;				// Dummy Link Record for this ROUTE
 | 
				
			||||||
 | 
						struct ROUTE * Route;					// May need backlink
 | 
				
			||||||
 | 
						char Call[10];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct NRTCPSTRUCT * NRTCPInfo[256] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Do we want to use normal TCP server connections, which are limited, or our own. Let's try our own for now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ConnectionInfo * AllocateNRTCPRec()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr = 0;
 | 
				
			||||||
 | 
						struct NRTCPSTRUCT * Info;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < 255; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (NRTCPInfo[i] == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// only allocate as many as needed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Info = NRTCPInfo[i] = (struct NRTCPSTRUCT *)zalloc(sizeof(struct NRTCPSTRUCT));
 | 
				
			||||||
 | 
								Info->sockptr = (struct ConnectionInfo *)zalloc(sizeof(struct ConnectionInfo));
 | 
				
			||||||
 | 
								Info->LINK = (struct _LINKTABLE *)zalloc(sizeof(struct _LINKTABLE));
 | 
				
			||||||
 | 
								Info->sockptr->Number = i;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else 
 | 
				
			||||||
 | 
								Info = NRTCPInfo[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sockptr = Info->sockptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->SocketActive == FALSE)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								sockptr->SocketActive = TRUE;
 | 
				
			||||||
 | 
								sockptr->ConnectTime = sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Debugprintf("NRTCP Allocated %d", i);
 | 
				
			||||||
 | 
								return sockptr;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void checkNRTCPSockets(int portNo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						SOCKET sock;
 | 
				
			||||||
 | 
						int Active = 0;
 | 
				
			||||||
 | 
						SOCKET maxsock;
 | 
				
			||||||
 | 
						int retval;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct timeval timeout;
 | 
				
			||||||
 | 
						fd_set readfd, writefd, exceptfd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						timeout.tv_sec = 0;
 | 
				
			||||||
 | 
						timeout.tv_usec = 0;				// poll
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						maxsock = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FD_ZERO(&readfd);
 | 
				
			||||||
 | 
						FD_ZERO(&writefd);
 | 
				
			||||||
 | 
						FD_ZERO(&exceptfd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < 255; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (NRTCPInfo[i] == 0)
 | 
				
			||||||
 | 
								break;					// only as many as have been used
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sockptr = NRTCPInfo[i]->sockptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->SocketActive == 0)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->Connecting)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
									// look for complete or failed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								FD_SET(sockptr->socket, &writefd);
 | 
				
			||||||
 | 
								FD_SET(sockptr->socket, &exceptfd);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								FD_SET(sockptr->socket, &readfd);
 | 
				
			||||||
 | 
								FD_SET(sockptr->socket, &exceptfd);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Active++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->socket > maxsock)
 | 
				
			||||||
 | 
								maxsock = sockptr->socket;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Active)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							retval = select((int)maxsock + 1, &readfd, &writefd, &exceptfd, &timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (retval == -1)
 | 
				
			||||||
 | 
							{				
 | 
				
			||||||
 | 
								perror("data select");
 | 
				
			||||||
 | 
								Debugprintf("NRTCP Select Error %d Active %d", WSAGetLastError(), Active);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (retval)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// see who has data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									for (i = 0; i < 255; i++)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										if (NRTCPInfo[i] == 0)
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
										sockptr = NRTCPInfo[i]->sockptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (sockptr->SocketActive == 0)
 | 
				
			||||||
 | 
											continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										sock = sockptr->socket;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (FD_ISSET(sock, &writefd))
 | 
				
			||||||
 | 
											NETROMConnected(sockptr, sock, NRTCPInfo[i]);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
										if (FD_ISSET(sock, &readfd))
 | 
				
			||||||
 | 
											DataSocket_ReadNETROM(sockptr, sock, NRTCPInfo[i], portNo);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
										if (FD_ISSET(sock, &exceptfd))
 | 
				
			||||||
 | 
											NETROMConnectionLost(sockptr);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int NETROMOpenConnection(struct ROUTE * Route)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct NRTCPSTRUCT * Info;
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Debugprintf("Opening NRTCP Connection");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Route->TCPSession)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//	SESSION ALREADY EXISTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sockptr = Route->TCPSession->sockptr;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (sockptr->Connected || sockptr->Connecting)
 | 
				
			||||||
 | 
								return TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// previous connect failed
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sockptr = AllocateNRTCPRec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr == NULL)
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
 | 
				
			||||||
 | 
							memcpy(Info->Call, MYNETROMCALL, 10);
 | 
				
			||||||
 | 
							Route->NEIGHBOUR_LINK = Info->LINK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Info->Route = Route;
 | 
				
			||||||
 | 
							Info->LINK->NEIGHBOUR = Route;
 | 
				
			||||||
 | 
							Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return NETROMTCPConnect(Route, sockptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int err;
 | 
				
			||||||
 | 
						u_long param=1;
 | 
				
			||||||
 | 
						BOOL bcopt=TRUE;
 | 
				
			||||||
 | 
						SOCKET sock;
 | 
				
			||||||
 | 
						struct sockaddr_in sinx; 
 | 
				
			||||||
 | 
						int addrlen=sizeof(sinx);
 | 
				
			||||||
 | 
						char PortString[20];
 | 
				
			||||||
 | 
						struct addrinfo hints, *res = 0, *saveres;
 | 
				
			||||||
 | 
						int Port = Route->TCPPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(PortString, "%d", Port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// get host info, make socket, and connect it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(&hints, 0, sizeof hints);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hints.ai_socktype = SOCK_STREAM;
 | 
				
			||||||
 | 
						getaddrinfo(Route->TCPHost, PortString, &hints, &res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!res)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							err = WSAGetLastError();
 | 
				
			||||||
 | 
							Debugprintf("Resolve HostName %s Failed - Error %d", Route->TCPHost, err);
 | 
				
			||||||
 | 
							return FALSE;			// Resolve failed
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Step thorough the list of hosts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						saveres = res;				// Save for free
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (sock == INVALID_SOCKET)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Debugprintf, ("Netrom over TCP Create Socket Failed");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ioctl(sock, FIONBIO, ¶m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//
 | 
				
			||||||
 | 
							//	Connected successful
 | 
				
			||||||
 | 
							//
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							sockptr->Connected = TRUE;
 | 
				
			||||||
 | 
							freeaddrinfo(saveres);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return TRUE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							freeaddrinfo(saveres);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							err=WSAGetLastError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (err == 10035 || err == 115 || err == 36)		//EWOULDBLOCK
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//	Connect in Progress
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								sockptr->Connecting = TRUE;
 | 
				
			||||||
 | 
								return TRUE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//	Connect failed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								closesocket(sockptr->socket);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NETROMConnectionAccepted(struct ConnectionInfo * sockptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Not sure we can do much here until first message arrives with callsign
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sockptr->Connected = TRUE;
 | 
				
			||||||
 | 
						Debugprintf("NRTCP Connection Accepted");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Connection Complete
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Debugprintf("NRTCP Connected");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sockptr->Connecting = FALSE;
 | 
				
			||||||
 | 
						sockptr->Connected = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Info->LINK->L2STATE = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Info->Route->INP3Node)
 | 
				
			||||||
 | 
							SendRTTMsg(Info->Route);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int len=0, maxlen;
 | 
				
			||||||
 | 
						struct NRTCPMsg * Msg;
 | 
				
			||||||
 | 
						struct _L3MESSAGEBUFFER * L3Msg;
 | 
				
			||||||
 | 
						struct ROUTE * Route;
 | 
				
			||||||
 | 
						UCHAR axCall[7];
 | 
				
			||||||
 | 
						PMESSAGE Buffer;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						ioctl(sock,FIONREAD,&len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						maxlen = InputBufferLen - sockptr->InputLen;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (len > maxlen) len = maxlen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						len = recv(sock, &sockptr->InputBuffer[sockptr->InputLen], len, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (len == SOCKET_ERROR || len == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// Failed or closed - clear connection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							NETROMConnectionLost(sockptr);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sockptr->InputLen += len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Process data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					checkLen:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// See if we have a whole packet
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						Msg = (struct NRTCPMsg *)&sockptr->InputBuffer[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Msg->Length > sockptr->InputLen)		// if not got whole frame wait
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Info->Call[0] == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// first packet - do we need to do anything?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// This must be an incoming connection as Call is set before calling so need to find route record and set things up.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(Info->Call, Msg->Call, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ConvToAX25(Msg->Call, axCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (FindNeighbour(axCall, portNo, &Route))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Info->Route = Route;
 | 
				
			||||||
 | 
								Route->NEIGHBOUR_LINK = Info->LINK;
 | 
				
			||||||
 | 
								Info->LINK->NEIGHBOUR = Route;
 | 
				
			||||||
 | 
								Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
 | 
				
			||||||
 | 
								Route->TCPSession = Info;
 | 
				
			||||||
 | 
								Info->LINK->L2STATE = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (Info->Route->INP3Node)
 | 
				
			||||||
 | 
									SendRTTMsg(Info->Route);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								goto seeifMore;			// Should we kill connection?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (memcmp(Info->Call, Msg->Call, 10) != 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// something wrong - maybe connection reused
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Format as if come from an ax.25 link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						L3Msg = GetBuff();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (L3Msg == 0)
 | 
				
			||||||
 | 
							goto seeifMore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						L3Msg->LENGTH = (Msg->Length - 12) + MSGHDDRLEN;
 | 
				
			||||||
 | 
						L3Msg->Next = 0;
 | 
				
			||||||
 | 
						L3Msg->Port = 0;
 | 
				
			||||||
 | 
						L3Msg->L3PID = NETROM_PID;
 | 
				
			||||||
 | 
						memcpy(&L3Msg->L3SRCE, Msg->Packet, Msg->Length - 13);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create a dummy L2 message so we can trace it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Buffer = GetBuff();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Buffer)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Buffer->CHAIN = 0;
 | 
				
			||||||
 | 
							Buffer->CTL = 0;
 | 
				
			||||||
 | 
							Buffer->PORT = portNo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ConvToAX25(Info->Call, Buffer->ORIGIN);
 | 
				
			||||||
 | 
							ConvToAX25(MYNETROMCALL, Buffer->DEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(Buffer->L2DATA, &L3Msg->L3SRCE[0], Msg->Length - 13);
 | 
				
			||||||
 | 
							Buffer->ORIGIN[6] |= 1;					// Set end of calls
 | 
				
			||||||
 | 
							Buffer->PID = NETROM_PID;
 | 
				
			||||||
 | 
							Buffer->LENGTH = Msg->Length + 10;
 | 
				
			||||||
 | 
							time(&Buffer->Timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							BPQTRACE(Buffer, FALSE);
 | 
				
			||||||
 | 
							ReleaseBuffer(Buffer);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						NETROMMSG(Info->LINK, L3Msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					seeifMore:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						 sockptr->InputLen -= Msg->Length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						 if (sockptr->InputLen > 0)
 | 
				
			||||||
 | 
						 {
 | 
				
			||||||
 | 
							 memmove(sockptr->InputBuffer, &sockptr->InputBuffer[Msg->Length], sockptr->InputLen);
 | 
				
			||||||
 | 
							 goto checkLen;
 | 
				
			||||||
 | 
						 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct NRTCPMsg Msg;
 | 
				
			||||||
 | 
						unsigned char * Data = (unsigned char *)&Frame->L3SRCE[0];
 | 
				
			||||||
 | 
						int DataLen = Frame->LENGTH - (MSGHDDRLEN + 1); // Not including PID
 | 
				
			||||||
 | 
						int Ret;
 | 
				
			||||||
 | 
						PMESSAGE Buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Msg.Length = DataLen + 13;				// include PID
 | 
				
			||||||
 | 
						memcpy(Msg.Call, MYNETROMCALL, 10);
 | 
				
			||||||
 | 
						Msg.PID = NETROM_PID;
 | 
				
			||||||
 | 
						memcpy(Msg.Packet, Data, DataLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Route->TCPSession == 0)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Ret = send(Route->TCPSession->sockptr->socket, (char *)&Msg, DataLen + 13, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create a dummy L2 message so we can trace it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Buffer = GetBuff();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Buffer)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Buffer->CHAIN = 0;
 | 
				
			||||||
 | 
							Buffer->CTL = 0;
 | 
				
			||||||
 | 
							Buffer->PORT = Route->NEIGHBOUR_PORT | 128;		// TX Flag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
 | 
				
			||||||
 | 
							ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(Buffer->L2DATA, &Frame->L3SRCE[0], DataLen);
 | 
				
			||||||
 | 
							Buffer->ORIGIN[6] |= 1;					// Set end of calls
 | 
				
			||||||
 | 
							Buffer->PID = NETROM_PID;
 | 
				
			||||||
 | 
							Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
 | 
				
			||||||
 | 
							time(&Buffer->Timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							BPQTRACE(Buffer, FALSE);
 | 
				
			||||||
 | 
							ReleaseBuffer(Buffer);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NETROMConnectionLost(struct ConnectionInfo * sockptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct NRTCPSTRUCT * Info = NRTCPInfo[sockptr->Number];
 | 
				
			||||||
 | 
						struct ROUTE * Route;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						closesocket(sockptr->socket);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If there is an attached route (there should be) clear all connections	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (Info)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Route = Info->Route;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->Connected)
 | 
				
			||||||
 | 
								L3LINKCLOSED(Info->LINK, LINKLOST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr->Connecting)
 | 
				
			||||||
 | 
								L3LINKCLOSED(Info->LINK, SETUPFAILED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Route->TCPSession = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Info->Call[0] = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sockptr->SocketActive = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(sockptr, 0, sizeof(struct ConnectionInfo)); 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								PG/Loop.obj
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								PG/Loop.obj
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								PG/PGTest.obj
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								PG/PGTest.obj
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										641
									
								
								RHP-skigdebian.c
									
									
									
									
									
								
							
							
						
						
									
										641
									
								
								RHP-skigdebian.c
									
									
									
									
									
								
							| 
						 | 
					@ -1,641 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
Copyright 2001-2022 John Wiseman G8BPQ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This file is part of LinBPQ/BPQ32.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
(at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
					 | 
				
			||||||
*/	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	Paula (G8PZT)'s Remote Host Protocol interface. 
 | 
					 | 
				
			||||||
	For now only sufficient support for WhatsPac
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 	
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
#define _CRT_SECURE_NO_DEPRECATE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "cheaders.h"
 | 
					 | 
				
			||||||
#include "bpq32.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										158
									
								
								RHP.c
									
									
									
									
									
								
							
							
						
						
									
										158
									
								
								RHP.c
									
									
									
									
									
								
							| 
						 | 
					@ -28,6 +28,7 @@ along with LinBPQ/BPQ32.  If not, see http://www.gnu.org/licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "cheaders.h"
 | 
					#include "cheaders.h"
 | 
				
			||||||
#include "bpq32.h"
 | 
					#include "bpq32.h"
 | 
				
			||||||
 | 
					#include "telnetserver.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int FindFreeStreamNoSem();
 | 
					int FindFreeStreamNoSem();
 | 
				
			||||||
DllExport int APIENTRY DeallocateStream(int stream);
 | 
					DllExport int APIENTRY DeallocateStream(int stream);
 | 
				
			||||||
| 
						 | 
					@ -40,6 +41,7 @@ static int GetJSONInt(char * _REPLYBUFFER, char * Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct RHPSessionInfo
 | 
					struct RHPSessionInfo
 | 
				
			||||||
{  
 | 
					{  
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
	SOCKET Socket;				// Websocks Socket
 | 
						SOCKET Socket;				// Websocks Socket
 | 
				
			||||||
    int BPQStream;
 | 
					    int BPQStream;
 | 
				
			||||||
	int Handle;				// RHP session ID
 | 
						int Handle;				// RHP session ID
 | 
				
			||||||
| 
						 | 
					@ -49,6 +51,7 @@ struct RHPSessionInfo
 | 
				
			||||||
    BOOL Connecting;		// Set while waiting for connection to complete
 | 
					    BOOL Connecting;		// Set while waiting for connection to complete
 | 
				
			||||||
    BOOL Listening; 
 | 
					    BOOL Listening; 
 | 
				
			||||||
	BOOL Connected;
 | 
						BOOL Connected;
 | 
				
			||||||
 | 
						int Busy;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct RHPConnectionInfo
 | 
					struct RHPConnectionInfo
 | 
				
			||||||
| 
						 | 
					@ -65,6 +68,7 @@ struct RHPParamBlock
 | 
				
			||||||
	unsigned char * Msg;
 | 
						unsigned char * Msg;
 | 
				
			||||||
	int Len;
 | 
						int Len;
 | 
				
			||||||
	SOCKET Socket;
 | 
						SOCKET Socket;
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,19 +80,24 @@ struct RHPSessionInfo ** RHPSessions;
 | 
				
			||||||
int NumberofRHPSessions;
 | 
					int NumberofRHPSessions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char ErrCodes[18][24] = 
 | 
					char ErrCodes[18][24] = 
 | 
				
			||||||
{"Ok",   "Unspecified",  "Bad or missing type",   "Invalid handle",   "No memory",  "Bad or missing mode",
 | 
					{
 | 
				
			||||||
 | 
						"Ok",
 | 
				
			||||||
 "Invalid local address",
 | 
						"Unspecified",
 | 
				
			||||||
 "Invalid remote address" ,
 | 
						"Bad or missing type",
 | 
				
			||||||
 "Bad or missing family" ,
 | 
						"Invalid handle",
 | 
				
			||||||
 "Duplicate socket"   ,
 | 
						"No memory",
 | 
				
			||||||
 "No such port"    ,
 | 
						"Bad or missing mode",
 | 
				
			||||||
 "Invalid protocol"      , 
 | 
						"Invalid local address",
 | 
				
			||||||
 "Bad parameter" ,
 | 
						"Invalid remote address" ,
 | 
				
			||||||
 "No buffers"  ,
 | 
						"Bad or missing family" ,
 | 
				
			||||||
  "Unauthorised"  ,
 | 
						"Duplicate socket"   ,
 | 
				
			||||||
  "No Route"  ,
 | 
						"No such port"    ,
 | 
				
			||||||
  "Operation not supported"};
 | 
						"Invalid protocol"      , 
 | 
				
			||||||
 | 
						"Bad parameter" ,
 | 
				
			||||||
 | 
						"No buffers"  ,
 | 
				
			||||||
 | 
						"Unauthorised"  ,
 | 
				
			||||||
 | 
						"No Route"  ,
 | 
				
			||||||
 | 
						"Operation not supported"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,9 +116,10 @@ int WhatsPacConfigured = 1;
 | 
				
			||||||
int RHPPaclen = 236;
 | 
					int RHPPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
					int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
					int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
					int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,7 +132,6 @@ void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
 | 
						// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (Len < 126)
 | 
						if (Len < 126)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// Two Byte Header
 | 
							// Two Byte Header
 | 
				
			||||||
| 
						 | 
					@ -182,7 +191,7 @@ void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen);
 | 
					void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void RHPThread(void * Params)
 | 
					void RHPThread(void * Params)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -190,7 +199,7 @@ void RHPThread(void * Params)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
 | 
						struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ProcessRHPWebSock(Block->Socket, Block->Msg, Block->Len);
 | 
						ProcessRHPWebSock(Block->sockptr, Block->Socket, Block->Msg, Block->Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(Block->Msg);
 | 
						free(Block->Msg);
 | 
				
			||||||
	free(Params);
 | 
						free(Params);
 | 
				
			||||||
| 
						 | 
					@ -202,7 +211,7 @@ int RHPProcessHTTPMessage(void * conn, char * response, char * Method, char * UR
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen)
 | 
					void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int Loops = 0;
 | 
						int Loops = 0;
 | 
				
			||||||
	int InputLen = 0;
 | 
						int InputLen = 0;
 | 
				
			||||||
| 
						 | 
					@ -264,11 +273,14 @@ void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen)
 | 
				
			||||||
//	{"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
 | 
					//	{"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"}.
 | 
					//	{"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	{"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 12, "errtext": "invalid handle"}. It
 | 
				
			||||||
 | 
					//	{type: 'keepalive'} if there has been no other activity for nearly 3 minutes. Replies with {"type": "keepaliveReply"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetJSONValue(Msg, "\"type\":", Value, 15);
 | 
						GetJSONValue(Msg, "\"type\":", Value, 15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_stricmp(Value, "open") == 0)
 | 
						if (_stricmp(Value, "open") == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		Len = processRHCPOpen(Socket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
							Len = processRHCPOpen(sockptr, Socket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
		if (Len)
 | 
							if (Len)
 | 
				
			||||||
			SendWebSockMessage(Socket, OutBuffer, Len);
 | 
								SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -287,7 +299,22 @@ void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen)
 | 
				
			||||||
		SendWebSockMessage(Socket, OutBuffer, Len);
 | 
							SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	Debugprintf(Msg);
 | 
					
 | 
				
			||||||
 | 
						if (_stricmp(Value, "status") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = processRHCPStatus(Socket, Msg, &OutBuffer[10]);		// Space at front for WebSock Header
 | 
				
			||||||
 | 
							SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (_stricmp(Value, "keepalive") == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Len = sprintf(&OutBuffer[10], "{\"type\": \"keepaliveReply\"}"); // Space at front for WebSock Header
 | 
				
			||||||
 | 
							SendWebSockMessage(Socket, OutBuffer, Len);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Debugprintf("Unrecognised RHP Message - %s", Msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ProcessRHPWebSockClosed(SOCKET socket)
 | 
					void ProcessRHPWebSockClosed(SOCKET socket)
 | 
				
			||||||
| 
						 | 
					@ -326,7 +353,7 @@ void ProcessRHPWebSockClosed(SOCKET socket)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
					int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
 | 
						//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -344,7 +371,7 @@ int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
	int Handle = 1;
 | 
						int Handle = 1;
 | 
				
			||||||
	int Stream;
 | 
						int Stream;
 | 
				
			||||||
	unsigned char AXCall[10];
 | 
						unsigned char AXCall[10];
 | 
				
			||||||
	int Len;
 | 
					
 | 
				
			||||||
	int n;
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
 | 
						// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
 | 
				
			||||||
| 
						 | 
					@ -389,7 +416,7 @@ int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			strcpy(pgm, "RHP");
 | 
								strcpy(pgm, "RHP");
 | 
				
			||||||
			Stream = FindFreeStreamNoSem();
 | 
								Stream = FindFreeStream();
 | 
				
			||||||
			strcpy(pgm, "bpq32.exe");
 | 
								strcpy(pgm, "bpq32.exe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (Stream == 255)
 | 
								if (Stream == 255)
 | 
				
			||||||
| 
						 | 
					@ -399,6 +426,7 @@ int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
			RHPSession->Handle = Handle;
 | 
								RHPSession->Handle = Handle;
 | 
				
			||||||
			RHPSession->Connecting = TRUE;
 | 
								RHPSession->Connecting = TRUE;
 | 
				
			||||||
			RHPSession->Socket = Socket;
 | 
								RHPSession->Socket = Socket;
 | 
				
			||||||
 | 
								RHPSession->sockptr = sockptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			strcpy(RHPSession->Local, Local);
 | 
								strcpy(RHPSession->Local, Local);
 | 
				
			||||||
			strcpy(RHPSession->Remote, Remote);
 | 
								strcpy(RHPSession->Remote, Remote);
 | 
				
			||||||
| 
						 | 
					@ -423,8 +451,13 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
	int ID;
 | 
						int ID;
 | 
				
			||||||
	char * Data;
 | 
						char * Data;
 | 
				
			||||||
	char * ptr;
 | 
						char * ptr;
 | 
				
			||||||
 | 
						unsigned char * uptr;
 | 
				
			||||||
	int c;
 | 
						int c;
 | 
				
			||||||
	int Len;
 | 
						int Len;
 | 
				
			||||||
 | 
						unsigned int HexCode1;
 | 
				
			||||||
 | 
						unsigned int HexCode2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int Handle = 1;
 | 
						int Handle = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -437,14 +470,15 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
	if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		free(Data);
 | 
							free(Data);
 | 
				
			||||||
		return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
							return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RHPSession = RHPSessions[Handle - 1];
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Look for \ escapes
 | 
						// Look for \ escapes, Can now also get \u00c3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = Data;
 | 
						ptr = Data;
 | 
				
			||||||
 | 
						Len = strlen(Data);				// in case no escapes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (ptr = strchr(ptr, '\\'))
 | 
						while (ptr = strchr(ptr, '\\'))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -455,36 +489,70 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
		case 'r':
 | 
							case 'r':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			*ptr = 13;
 | 
								*ptr = 13;
 | 
				
			||||||
 | 
								memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
 | 
				
			||||||
			break;	
 | 
								break;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'u':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								HexCode1 = HexCode2 = 0;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								n = toupper(ptr[2]) - '0';
 | 
				
			||||||
 | 
								if (n > 9) n = n - 7;
 | 
				
			||||||
 | 
								HexCode1 |= n << 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								n = toupper(ptr[3]) - '0';
 | 
				
			||||||
 | 
								if (n > 9) n = n - 7;
 | 
				
			||||||
 | 
								HexCode1 |= n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								n = toupper(ptr[4]) - '0';
 | 
				
			||||||
 | 
								if (n > 9) n = n - 7;
 | 
				
			||||||
 | 
								HexCode2 |= n << 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								n = toupper(ptr[5]) - '0';
 | 
				
			||||||
 | 
								if (n > 9) n = n - 7;
 | 
				
			||||||
 | 
								HexCode2 |= n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (HexCode1 == 0 || HexCode1 == 0xC2)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									uptr = ptr;
 | 
				
			||||||
 | 
									*uptr = HexCode2;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if (HexCode1 == 0xc2)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									uptr = ptr;
 | 
				
			||||||
 | 
									*uptr = HexCode2 + 0x40;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								memmove(ptr + 1, ptr + 6, strlen(ptr + 5));		
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								
 | 
				
			||||||
		case '\\':
 | 
							case '\\':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			*ptr = '\\';
 | 
								*ptr = '\\';
 | 
				
			||||||
 | 
								memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
 | 
				
			||||||
			break;	
 | 
								break;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case '"':
 | 
							case '"':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			*ptr = '"';
 | 
								*ptr = '"';
 | 
				
			||||||
 | 
								memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
 | 
				
			||||||
			break;	
 | 
								break;	
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
 | 
					 | 
				
			||||||
		ptr++;
 | 
							ptr++;
 | 
				
			||||||
 | 
							Len = ptr - Data;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Debugprintf(Data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	Len = strlen(Data);
 | 
					 | 
				
			||||||
	ptr = Data;
 | 
						ptr = Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	while (Len > RHPPaclen)
 | 
						while (Len > RHPPaclen)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
 | 
							SendMsg(RHPSession->BPQStream, ptr, RHPPaclen);
 | 
				
			||||||
		Len -= RHPPaclen;
 | 
							Len -= RHPPaclen;
 | 
				
			||||||
		ptr += RHPPaclen;
 | 
							ptr += RHPPaclen;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
 | 
						SendMsg(RHPSession->BPQStream, ptr, Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(Data);
 | 
						free(Data);
 | 
				
			||||||
	return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
 | 
						return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
 | 
				
			||||||
| 
						 | 
					@ -508,7 +576,7 @@ int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
	Handle = GetJSONInt(Msg, "\"handle\":");
 | 
						Handle = GetJSONInt(Msg, "\"handle\":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
		return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
							return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RHPSession = RHPSessions[Handle - 1];
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
| 
						 | 
					@ -522,6 +590,24 @@ int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
	return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
 | 
						return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 3, "errtext": "invalid handle"}. It
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RHPSessionInfo * RHPSession;
 | 
				
			||||||
 | 
						int Handle = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Handle = GetJSONInt(Msg, "\"handle\":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Handle < 1 || Handle > NumberofRHPSessions)
 | 
				
			||||||
 | 
							return sprintf(ReplyBuffer, "{\"type\": \"statusReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", Handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RHPSession = RHPSessions[Handle - 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sprintf(ReplyBuffer, "{\"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char toHex[] = "0123456789abcdef";
 | 
					char toHex[] = "0123456789abcdef";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void RHPPoll()
 | 
					void RHPPoll()
 | 
				
			||||||
| 
						 | 
					@ -592,9 +678,12 @@ void RHPPoll()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				Buffer[pktlen] = 0;
 | 
									Buffer[pktlen] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RHPSession->sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Message is JSON so Convert CR to \r, \ to \\ " to \"
 | 
									// Message is JSON so Convert CR to \r, \ to \\ " to \"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Looks like I need to escape everything not between 0x20 and 0x7f eg \U00c3
 | 
									// Looks like I need to escape everything not between 0x20 and 0x7f eg \u00c3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				while (c = *(ptr))
 | 
									while (c = *(ptr))
 | 
				
			||||||
| 
						 | 
					@ -649,7 +738,6 @@ void RHPPoll()
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		while (count > 0);
 | 
							while (count > 0);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										63
									
								
								RigControl.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								RigControl.c
									
									
									
									
									
								
							| 
						 | 
					@ -110,7 +110,7 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT);
 | 
				
			||||||
int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr);
 | 
					int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr);
 | 
				
			||||||
void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length);
 | 
					void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length);
 | 
				
			||||||
VOID HAMLIBPoll(struct RIGPORTINFO * PORT);
 | 
					VOID HAMLIBPoll(struct RIGPORTINFO * PORT);
 | 
				
			||||||
void HAMLIBSlaveThread(struct RIGINFO * RIG);
 | 
					void HAMLIBSlaveThread(VOID * Param);
 | 
				
			||||||
void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT);
 | 
					void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT);
 | 
				
			||||||
VOID RTLUDPPoll(struct RIGPORTINFO * PORT);
 | 
					VOID RTLUDPPoll(struct RIGPORTINFO * PORT);
 | 
				
			||||||
VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT);
 | 
					VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT);
 | 
				
			||||||
| 
						 | 
					@ -122,8 +122,8 @@ VOID ProcessSDRRadioFrame(struct RIGPORTINFO * PORT, int Length);
 | 
				
			||||||
VOID SDRRadioPoll(struct RIGPORTINFO * PORT);
 | 
					VOID SDRRadioPoll(struct RIGPORTINFO * PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SetupPortRIGPointers();
 | 
					VOID SetupPortRIGPointers();
 | 
				
			||||||
VOID PTTCATThread(struct RIGINFO *RIG);
 | 
					VOID PTTCATThread(void * Param);
 | 
				
			||||||
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT);
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ----- G7TAJ ----
 | 
					// ----- G7TAJ ----
 | 
				
			||||||
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT);
 | 
					VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT);
 | 
				
			||||||
| 
						 | 
					@ -2217,7 +2217,7 @@ int BittoInt(UINT BitMask)
 | 
				
			||||||
	return i;
 | 
						return i;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char * RadioConfigMsg[36];
 | 
					extern char * RadioConfigMsg[70];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct TNCINFO RIGTNC;			// Dummy TNC Record for Rigcontrol without a corresponding TNC 
 | 
					struct TNCINFO RIGTNC;			// Dummy TNC Record for Rigcontrol without a corresponding TNC 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5286,8 +5286,12 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = strtok_s(NULL, ",", &Context);
 | 
						ptr = strtok_s(NULL, ",", &Context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ptr == NULL)
 | 
				
			||||||
 | 
							if (*MemoryNumber)		// If channel, dont need mode
 | 
				
			||||||
 | 
								return TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ptr == NULL || strlen(ptr) >  8)
 | 
						if (ptr == NULL || strlen(ptr) >  8)
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;		// Mode Missing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If channel, dont need mode
 | 
						// If channel, dont need mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5446,7 +5450,26 @@ void DecodeCM108(int Port, char * ptr)
 | 
				
			||||||
	hid_device *handle = NULL;
 | 
						hid_device *handle = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strlen(ptr) > 16)
 | 
						if (strlen(ptr) > 16)
 | 
				
			||||||
		CM108Device = _strdup(ptr);
 | 
						{
 | 
				
			||||||
 | 
							path_to_open = _strdup(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							handle = hid_open_path(path_to_open);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if (handle)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								hid_close(handle);
 | 
				
			||||||
 | 
								CM108Device = _strdup(path_to_open);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								char msg[128];
 | 
				
			||||||
 | 
								sprintf(msg,"Port %d Unable to open CM108 device %s", Port, path_to_open);
 | 
				
			||||||
 | 
								WritetoConsole(msg);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		VID = strtol(ptr, &next, 0);
 | 
							VID = strtol(ptr, &next, 0);
 | 
				
			||||||
| 
						 | 
					@ -7393,6 +7416,8 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
 | 
				
			||||||
	int Interlock = RIG->Interlock;
 | 
						int Interlock = RIG->Interlock;
 | 
				
			||||||
	char PortString[128] = "";
 | 
						char PortString[128] = "";
 | 
				
			||||||
	char TxPortString[128] = "";
 | 
						char TxPortString[128] = "";
 | 
				
			||||||
 | 
						int n = 0;
 | 
				
			||||||
 | 
						int nn = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Find TNC ports in this Rig's scan group
 | 
						// Find TNC ports in this Rig's scan group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7409,7 +7434,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			int p = PortRecord->PORTNUMBER;
 | 
								int p = PortRecord->PORTNUMBER;
 | 
				
			||||||
			RIG->BPQPort |= ((uint64_t)1 << p);
 | 
								RIG->BPQPort |= ((uint64_t)1 << p);
 | 
				
			||||||
			sprintf(PortString, "%s,%d", PortString, p);
 | 
								n += sprintf(&PortString[n], ",%d", p);
 | 
				
			||||||
			TNC->RIG = RIG;
 | 
								TNC->RIG = RIG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (RIG->PTTMode == 0 && TNC->PTTMode)
 | 
								if (RIG->PTTMode == 0 && TNC->PTTMode)
 | 
				
			||||||
| 
						 | 
					@ -7419,7 +7444,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			int p = PortRecord->PORTNUMBER;
 | 
								int p = PortRecord->PORTNUMBER;
 | 
				
			||||||
			RIG->BPQPort |= ((uint64_t)1 << p);
 | 
								RIG->BPQPort |= ((uint64_t)1 << p);
 | 
				
			||||||
			sprintf(TxPortString, "%s,%d", TxPortString, p);
 | 
								nn += sprintf(&TxPortString[nn], ",%d", p);
 | 
				
			||||||
			TNC->TXRIG = RIG;
 | 
								TNC->TXRIG = RIG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (RIG->PTTMode == 0 && TNC->PTTMode)
 | 
								if (RIG->PTTMode == 0 && TNC->PTTMode)
 | 
				
			||||||
| 
						 | 
					@ -7459,8 +7484,9 @@ VOID SetupPortRIGPointers()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID PTTCATThread(struct RIGINFO *RIG)
 | 
					VOID PTTCATThread(void * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct RIGINFO * RIG = 	(struct RIGINFO *)Param;
 | 
				
			||||||
	DWORD dwLength = 0;
 | 
						DWORD dwLength = 0;
 | 
				
			||||||
	int Length, ret, i;
 | 
						int Length, ret, i;
 | 
				
			||||||
	UCHAR * ptr1;
 | 
						UCHAR * ptr1;
 | 
				
			||||||
| 
						 | 
					@ -8446,7 +8472,7 @@ int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr)
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID HAMLIBThread(struct RIGPORTINFO * PORT);
 | 
					VOID HAMLIBThread(void * Param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
 | 
					VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -8456,10 +8482,11 @@ VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
 | 
				
			||||||
	return ;
 | 
						return ;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID HAMLIBThread(struct RIGPORTINFO * PORT)
 | 
					VOID HAMLIBThread(void * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Opens sockets and looks for data
 | 
						// Opens sockets and looks for data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RIGPORTINFO * PORT = (struct RIGPORTINFO * )Param;
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[255];
 | 
				
			||||||
	int err, i, ret;
 | 
						int err, i, ret;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
| 
						 | 
					@ -8581,10 +8608,11 @@ Lost:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void HAMLIBSlaveThread(struct RIGINFO * RIG)
 | 
					void HAMLIBSlaveThread(VOID * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Wait for connections and messages from HAMLIB Clients
 | 
						// Wait for connections and messages from HAMLIB Clients
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RIGINFO * RIG = (struct RIGINFO *)Param;
 | 
				
			||||||
	fd_set readfs;
 | 
						fd_set readfs;
 | 
				
			||||||
	fd_set errorfs;
 | 
						fd_set errorfs;
 | 
				
			||||||
	struct timeval timeout;
 | 
						struct timeval timeout;
 | 
				
			||||||
| 
						 | 
					@ -8900,7 +8928,7 @@ VOID FLRIGSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID FLRIGThread(struct RIGPORTINFO * PORT);
 | 
					VOID FLRIGThread(VOID * Param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
 | 
					VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -8909,10 +8937,11 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
 | 
				
			||||||
	return ;
 | 
						return ;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID FLRIGThread(struct RIGPORTINFO * PORT)
 | 
					VOID FLRIGThread(VOID * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Opens sockets and looks for data
 | 
						// Opens sockets and looks for data
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[255];
 | 
				
			||||||
	int err, i, ret;
 | 
						int err, i, ret;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
| 
						 | 
					@ -10152,7 +10181,7 @@ void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SDRANGELThread(struct RIGPORTINFO * PORT);
 | 
					VOID SDRANGELThread(VOID * Param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
 | 
					VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -10161,9 +10190,11 @@ VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
 | 
				
			||||||
	return ;
 | 
						return ;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SDRANGELThread(struct RIGPORTINFO * PORT)
 | 
					VOID SDRANGELThread(VOID * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Opens sockets and looks for data
 | 
						// Opens sockets and looks for data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
 | 
				
			||||||
	char Msg[512];
 | 
						char Msg[512];
 | 
				
			||||||
	int err, i, ret;
 | 
						int err, i, ret;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -854,7 +854,8 @@ void * SCSExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_SCS;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	OpenLogFile(TNC->Port);
 | 
						OpenLogFile(TNC->Port);
 | 
				
			||||||
	CloseLogFile(TNC->Port);
 | 
						CloseLogFile(TNC->Port);
 | 
				
			||||||
| 
						 | 
					@ -885,8 +886,6 @@ void * SCSExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	PortEntry->PERMITGATEWAY = TRUE;					// Can change ax.25 call on each stream
 | 
						PortEntry->PERMITGATEWAY = TRUE;					// Can change ax.25 call on each stream
 | 
				
			||||||
	PortEntry->SCANCAPABILITIES = CONLOCK;				// Scan Control 3 stage/conlock 
 | 
						PortEntry->SCANCAPABILITIES = CONLOCK;				// Scan Control 3 stage/conlock 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
 | 
				
			||||||
		TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
 | 
							TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -376,7 +376,8 @@ void * TrackerMExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_TRKM;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set up DED addresses for streams
 | 
						// Set up DED addresses for streams
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -392,8 +393,6 @@ void * TrackerMExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	PortEntry->PERMITGATEWAY = TRUE;					// Can change ax.25 call on each stream
 | 
						PortEntry->PERMITGATEWAY = TRUE;					// Can change ax.25 call on each stream
 | 
				
			||||||
	PortEntry->SCANCAPABILITIES = NONE;				// Scan Control 3 stage/conlock 
 | 
						PortEntry->SCANCAPABILITIES = NONE;				// Scan Control 3 stage/conlock 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -666,7 +666,8 @@ void * TrackerExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_TRK;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set up DED addresses for streams
 | 
						// Set up DED addresses for streams
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -682,8 +683,6 @@ void * TrackerExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	PortEntry->PERMITGATEWAY = TRUE;				// Can change ax.25 call on each stream
 | 
						PortEntry->PERMITGATEWAY = TRUE;				// Can change ax.25 call on each stream
 | 
				
			||||||
	PortEntry->SCANCAPABILITIES = NONE;				// Scan Control 3 stage/conlock 
 | 
						PortEntry->SCANCAPABILITIES = NONE;				// Scan Control 3 stage/conlock 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										51
									
								
								ScanHID.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								ScanHID.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					// ScanHID.cpp : Defines the entry point for the console application.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
 | 
				
			||||||
 | 
					#define _CRT_SECURE_NO_DEPRECATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <conio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "hidapi.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char* argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char product[256];
 | 
				
			||||||
 | 
						char sernum[256] = "NULL";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct hid_device_info *devs, *cur_dev;
 | 
				
			||||||
 | 
						const char *path_to_open = NULL;
 | 
				
			||||||
 | 
						hid_device *handle = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Look for Device
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						devs = hid_enumerate(0,0); // so we list devices(USHORT)VID, (USHORT)PID);
 | 
				
			||||||
 | 
						cur_dev = devs;
 | 
				
			||||||
 | 
						while (cur_dev)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							wcstombs(product, cur_dev->product_string, 255);
 | 
				
			||||||
 | 
							if (cur_dev->serial_number)
 | 
				
			||||||
 | 
								wcstombs(sernum, cur_dev->serial_number, 255);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (product)
 | 
				
			||||||
 | 
								printf("HID Device %s VID %X PID %X Ser %s\r\n Path %s\r\n\r\n", product, cur_dev->vendor_id, cur_dev->product_id, sernum, cur_dev->path);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								printf("HID Device %s VID %X PID %X Ser %s\r\n Path %s\r\n\r\n", "Missing Product", cur_dev->vendor_id, cur_dev->product_id, sernum, cur_dev->path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							cur_dev = cur_dev->next;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hid_free_enumeration(devs);
 | 
				
			||||||
 | 
						printf("Press any key to Exit");
 | 
				
			||||||
 | 
						_getch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								SerialPort.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								SerialPort.c
									
									
									
									
									
								
							| 
						 | 
					@ -508,9 +508,12 @@ ok:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
							if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
								char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
								strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
								sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cnd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
| 
						 | 
					@ -770,9 +773,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_SERIAL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -322,7 +322,10 @@ Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR Port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
 | 
							EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		C_Q_ADD(&EXTPORT->UI_Q, Copy);
 | 
							if (EXTPORT->UI_Q)
 | 
				
			||||||
 | 
								C_Q_ADD(&EXTPORT->UI_Q, Copy);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								C_Q_ADD(&EXTPORT->UI_Q, Copy);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -241,8 +241,14 @@ typedef struct _SERIAL_STATUS {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef WIN32
 | 
					#ifndef WIN32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef MACBPQ
 | 
					#if defined(MACBPQ)
 | 
				
			||||||
#include <util.h>
 | 
					#include <util.h>
 | 
				
			||||||
 | 
					#elif defined(FREEBSD)
 | 
				
			||||||
 | 
					#if defined(__FreeBSD__) || defined(__DragonFly__)
 | 
				
			||||||
 | 
					#include <libutil.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <util.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int posix_openpt (int __oflag);
 | 
					extern int posix_openpt (int __oflag);
 | 
				
			||||||
| 
						 | 
					@ -262,7 +268,7 @@ HANDLE LinuxOpenPTY(char * Name)
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
	struct termios term;
 | 
						struct termios term;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef MACBPQ
 | 
					#if defined(MACBPQ) || defined(FREEBSD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create a pty pair
 | 
						// Create a pty pair
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										334
									
								
								TelnetV6.c
									
									
									
									
									
								
							
							
						
						
									
										334
									
								
								TelnetV6.c
									
									
									
									
									
								
							| 
						 | 
					@ -17,6 +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
 | 
				
			||||||
*/	
 | 
					*/	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//	Telnet Driver for BPQ Switch 
 | 
					//	Telnet Driver for BPQ Switch 
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					@ -89,7 +90,7 @@ void RHPThread(void * Params);
 | 
				
			||||||
void ProcessRHPWebSockClosed(SOCKET socket);
 | 
					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);
 | 
					int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
 | 
				
			||||||
 | 
					void checkNRTCPSockets(int portNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
extern HKEY REGTREE;
 | 
					extern HKEY REGTREE;
 | 
				
			||||||
| 
						 | 
					@ -113,7 +114,7 @@ extern int REALTIMETICKS;
 | 
				
			||||||
#define MaxSockets 26
 | 
					#define MaxSockets 26
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct UserRec RelayUser;
 | 
					struct UserRec RelayUser;
 | 
				
			||||||
struct UserRec SyncUser = {"","Sync"};;
 | 
					struct UserRec SyncUser = {"","Sync"};
 | 
				
			||||||
struct UserRec CMSUser;
 | 
					struct UserRec CMSUser;
 | 
				
			||||||
struct UserRec HostUser = {"","Host"};
 | 
					struct UserRec HostUser = {"","Host"};
 | 
				
			||||||
struct UserRec TriModeUser;
 | 
					struct UserRec TriModeUser;
 | 
				
			||||||
| 
						 | 
					@ -171,12 +172,14 @@ VOID Tel_Format_Addr(struct ConnectionInfo * sockptr, char * dst);
 | 
				
			||||||
VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr);
 | 
					VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr);
 | 
				
			||||||
VOID ProcessTrimodeResponse(struct TNCINFO * TNC, struct STREAMINFO * STREAM, unsigned char * MsgPtr, int Msglen);
 | 
					VOID ProcessTrimodeResponse(struct TNCINFO * TNC, struct STREAMINFO * STREAM, unsigned char * MsgPtr, int Msglen);
 | 
				
			||||||
VOID ProcessTriModeDataMessage(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, struct STREAMINFO * STREAM);
 | 
					VOID ProcessTriModeDataMessage(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, struct STREAMINFO * STREAM);
 | 
				
			||||||
 | 
					void processNETROMFrame(unsigned char * Message, int Len, struct ConnectionInfo * sockptr);
 | 
				
			||||||
 | 
					void NETROMConnectionLost(struct ConnectionInfo * sockptr);
 | 
				
			||||||
 | 
					void NETROMConnectionAccepted(struct ConnectionInfo * sockptr);
 | 
				
			||||||
 | 
					struct ConnectionInfo * AllocateNRTCPRec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int LogAge = 13;
 | 
					static int LogAge = 13;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int DeleteLogFile(char * Log);
 | 
					int DeleteLogFile(char * Log);
 | 
				
			||||||
| 
						 | 
					@ -541,6 +544,9 @@ int ProcessLine(char * buf, int Port)
 | 
				
			||||||
	else if (_stricmp(param,"HTTPPORT") == 0)
 | 
						else if (_stricmp(param,"HTTPPORT") == 0)
 | 
				
			||||||
		HTTPPort = TCP->HTTPPort = atoi(value);
 | 
							HTTPPort = TCP->HTTPPort = atoi(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						else if (_stricmp(param,"NETROMPORT") == 0)
 | 
				
			||||||
 | 
							TCP->NETROMPort = atoi(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	else if (_stricmp(param,"APIPORT") == 0)
 | 
						else if (_stricmp(param,"APIPORT") == 0)
 | 
				
			||||||
		TCP->APIPort = atoi(value);
 | 
							TCP->APIPort = atoi(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -953,13 +959,27 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if (sockptr->WebSocks == 0)
 | 
										if (sockptr->WebSocks == 0)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						if (sockptr->LastSendTime && (REALTIMETICKS - sockptr->LastSendTime) > 1500)	// ~ 2.5 mins
 | 
											if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 150)	// ~ 2.5 mins
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							closesocket(sockptr->socket);
 | 
												closesocket(sockptr->socket);
 | 
				
			||||||
							sockptr->SocketActive = FALSE;
 | 
												sockptr->SocketActive = FALSE;
 | 
				
			||||||
							ShowConnections(TNC);
 | 
												ShowConnections(TNC);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
										else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											// RHP Sockets (Used for WhatsPack) Need a timeout
 | 
				
			||||||
 | 
											// Normally keepalives are sent each way around every 9 mins
 | 
				
			||||||
 | 
											// Keepalives aren't sent when connecting so may need a bit longer
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
											if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 20 * 60)	// 20mins
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												ProcessRHPWebSockClosed(sockptr->socket);
 | 
				
			||||||
 | 
												closesocket(sockptr->socket);
 | 
				
			||||||
 | 
												sockptr->SocketActive = FALSE;
 | 
				
			||||||
 | 
												ShowConnections(TNC);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -1124,7 +1144,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
			shutdown(TCP->FBBsock[n++], SD_BOTH);
 | 
								shutdown(TCP->FBBsock[n++], SD_BOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		shutdown(TCP->Relaysock, SD_BOTH);
 | 
							shutdown(TCP->Relaysock, SD_BOTH);
 | 
				
			||||||
		shutdown(TCP->HTTPsock, SD_BOTH);
 | 
							shutdown(TCP->HTTPSock, SD_BOTH);
 | 
				
			||||||
		shutdown(TCP->HTTPsock6, SD_BOTH);
 | 
							shutdown(TCP->HTTPsock6, SD_BOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1148,7 +1168,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		closesocket(TCP->Relaysock);
 | 
							closesocket(TCP->Relaysock);
 | 
				
			||||||
		closesocket(TCP->Relaysock6);
 | 
							closesocket(TCP->Relaysock6);
 | 
				
			||||||
		closesocket(TCP->HTTPsock);
 | 
							closesocket(TCP->HTTPSock);
 | 
				
			||||||
		closesocket(TCP->HTTPsock6);
 | 
							closesocket(TCP->HTTPsock6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Save info from old TNC record
 | 
							// Save info from old TNC record
 | 
				
			||||||
| 
						 | 
					@ -1174,7 +1194,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		TNC = TNCInfo[n];
 | 
							TNC = TNCInfo[n];
 | 
				
			||||||
		TNC->Port = n;
 | 
							TNC->Port = n;
 | 
				
			||||||
		TNC->Hardware = H_TELNET;
 | 
							TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
 | 
				
			||||||
		TNC->RIG = &TNC->DummyRig;			// Not using Rig control, so use Dummy
 | 
							TNC->RIG = &TNC->DummyRig;			// Not using Rig control, so use Dummy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Get Menu Handles
 | 
							// Get Menu Handles
 | 
				
			||||||
| 
						 | 
					@ -1233,7 +1253,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
			shutdown(TCP->FBBsock[n++], SD_BOTH);
 | 
								shutdown(TCP->FBBsock[n++], SD_BOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		shutdown(TCP->Relaysock, SD_BOTH);
 | 
							shutdown(TCP->Relaysock, SD_BOTH);
 | 
				
			||||||
		shutdown(TCP->HTTPsock, SD_BOTH);
 | 
							shutdown(TCP->HTTPSock, SD_BOTH);
 | 
				
			||||||
		shutdown(TCP->HTTPsock6, SD_BOTH);
 | 
							shutdown(TCP->HTTPsock6, SD_BOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		shutdown(TCP->sock6, SD_BOTH);
 | 
							shutdown(TCP->sock6, SD_BOTH);
 | 
				
			||||||
| 
						 | 
					@ -1260,7 +1280,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
			closesocket(TCP->FBBsock6[n++]);
 | 
								closesocket(TCP->FBBsock6[n++]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		closesocket(TCP->Relaysock6);
 | 
							closesocket(TCP->Relaysock6);
 | 
				
			||||||
		closesocket(TCP->HTTPsock);
 | 
							closesocket(TCP->HTTPSock);
 | 
				
			||||||
		closesocket(TCP->HTTPsock6);
 | 
							closesocket(TCP->HTTPsock6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
| 
						 | 
					@ -1449,13 +1469,12 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	TCP = TNC->TCPInfo;
 | 
						TCP = TNC->TCPInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_TELNET;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1;		// Default
 | 
						PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1;		// Default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
 | 
				
			||||||
		ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
 | 
							ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1484,6 +1503,8 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PortEntry->PORTCONTROL.TNC = TNC;
 | 
						PortEntry->PORTCONTROL.TNC = TNC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PortEntry->PORTCONTROL.Hardware = TNC->Hardware;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->WebWindowProc = WebProc;
 | 
						TNC->WebWindowProc = WebProc;
 | 
				
			||||||
	TNC->WebWinX = 260;
 | 
						TNC->WebWinX = 260;
 | 
				
			||||||
	TNC->WebWinY = 325;
 | 
						TNC->WebWinY = 325;
 | 
				
			||||||
| 
						 | 
					@ -1697,11 +1718,14 @@ BOOL OpenSockets(struct TNCINFO * TNC)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TCP->HTTPPort)
 | 
						if (TCP->HTTPPort)
 | 
				
			||||||
		TCP->HTTPsock = OpenSocket4(TNC, TCP->HTTPPort);
 | 
							TCP->HTTPSock = OpenSocket4(TNC, TCP->HTTPPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TCP->APIPort)
 | 
						if (TCP->APIPort)
 | 
				
			||||||
		TCP->APIsock = OpenSocket4(TNC, TCP->APIPort);
 | 
							TCP->APIsock = OpenSocket4(TNC, TCP->APIPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (TCP->NETROMPort)
 | 
				
			||||||
 | 
							TCP->NETROMSock = OpenSocket4(TNC, TCP->NETROMPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TCP->SyncPort)
 | 
						if (TCP->SyncPort)
 | 
				
			||||||
		TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort);
 | 
							TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1820,6 +1844,9 @@ BOOL OpenSockets6(struct TNCINFO * TNC)
 | 
				
			||||||
	if (TCP->APIPort)
 | 
						if (TCP->APIPort)
 | 
				
			||||||
		TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort);
 | 
							TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (TCP->NETROMPort)
 | 
				
			||||||
 | 
							TCP->NETROMSock6 = OpenSocket6(TNC, TCP->NETROMPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TCP->SyncPort)
 | 
						if (TCP->SyncPort)
 | 
				
			||||||
		TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort);
 | 
							TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1872,7 +1899,7 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
 | 
				
			||||||
			maxsock = sock;
 | 
								maxsock = sock;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	sock = TCP->HTTPsock;
 | 
						sock = TCP->HTTPSock;
 | 
				
			||||||
	if (sock)
 | 
						if (sock)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		FD_SET(sock, readfd);
 | 
							FD_SET(sock, readfd);
 | 
				
			||||||
| 
						 | 
					@ -1888,6 +1915,14 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
 | 
				
			||||||
			maxsock = sock;
 | 
								maxsock = sock;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
						sock = TCP->NETROMSock;
 | 
				
			||||||
 | 
						if (sock)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							FD_SET(sock, readfd);
 | 
				
			||||||
 | 
							if (sock > maxsock)
 | 
				
			||||||
 | 
								maxsock = sock;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sock = TCP->Syncsock;
 | 
						sock = TCP->Syncsock;
 | 
				
			||||||
	if (sock)
 | 
						if (sock)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -1963,6 +1998,14 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
 | 
				
			||||||
			maxsock = sock;
 | 
								maxsock = sock;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sock = TCP->NETROMSock6;
 | 
				
			||||||
 | 
						if (sock)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							FD_SET(sock, readfd);
 | 
				
			||||||
 | 
							if (sock > maxsock)
 | 
				
			||||||
 | 
								maxsock = sock;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sock = TCP->DRATSsock6;
 | 
						sock = TCP->DRATSsock6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sock)
 | 
						if (sock)
 | 
				
			||||||
| 
						 | 
					@ -2050,13 +2093,20 @@ VOID TelnetPoll(int Port)
 | 
				
			||||||
				Socket_Accept(TNC, sock, TCP->RelayPort);
 | 
									Socket_Accept(TNC, sock, TCP->RelayPort);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sock = TCP->HTTPsock;
 | 
							sock = TCP->HTTPSock;
 | 
				
			||||||
		if (sock)
 | 
							if (sock)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (FD_ISSET(sock, &readfd))
 | 
								if (FD_ISSET(sock, &readfd))
 | 
				
			||||||
				Socket_Accept(TNC, sock, TCP->HTTPPort);
 | 
									Socket_Accept(TNC, sock, TCP->HTTPPort);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sock = TCP->NETROMSock;
 | 
				
			||||||
 | 
							if (sock)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (FD_ISSET(sock, &readfd))
 | 
				
			||||||
 | 
									Socket_Accept(TNC, sock, TCP->NETROMPort);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sock = TCP->DRATSsock;
 | 
							sock = TCP->DRATSsock;
 | 
				
			||||||
		if (sock)
 | 
							if (sock)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -2104,6 +2154,14 @@ VOID TelnetPoll(int Port)
 | 
				
			||||||
				Socket_Accept(TNC, sock, TCP->HTTPPort);
 | 
									Socket_Accept(TNC, sock, TCP->HTTPPort);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sock = TCP->NETROMSock6;
 | 
				
			||||||
 | 
							if (sock)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (FD_ISSET(sock, &readfd))
 | 
				
			||||||
 | 
									Socket_Accept(TNC, sock, TCP->NETROMPort);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sock = TCP->DRATSsock6;
 | 
							sock = TCP->DRATSsock6;
 | 
				
			||||||
		if (sock)
 | 
							if (sock)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -2231,9 +2289,12 @@ VOID TelnetPoll(int Port)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
nosocks:
 | 
					nosocks:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Poll TCPNR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						checkNRTCPSockets(Port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Try SNMP
 | 
						// Try SNMP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TCP->SNMPsock)
 | 
						if (TCP->SNMPsock)
 | 
				
			||||||
| 
						 | 
					@ -2473,15 +2534,11 @@ nosocks:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
 | 
							if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
#ifdef WIN32
 | 
								if ((time(NULL) - sockptr->LastSendTime) > (L4LIMIT - 60))	// PC Ticks are about 10% slow
 | 
				
			||||||
			if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 9)	// PC Ticks are about 10% slow
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
			if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 10)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				// Send Keepalive
 | 
									// Send Keepalive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				sockptr->LastSendTime = REALTIMETICKS;
 | 
									sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
				BuffertoNode(sockptr, "Keepalive\r", 10);
 | 
									BuffertoNode(sockptr, "Keepalive\r", 10);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -2611,7 +2668,7 @@ nosocks:
 | 
				
			||||||
						if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
 | 
											if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							sockptr->Keepalive = TRUE;
 | 
												sockptr->Keepalive = TRUE;
 | 
				
			||||||
							sockptr->LastSendTime = REALTIMETICKS;
 | 
												sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
 | 
											if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
 | 
				
			||||||
| 
						 | 
					@ -2843,7 +2900,7 @@ nosocks:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
 | 
								SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
 | 
				
			||||||
			sockptr->FromHostBuffGetptr += Msglen;
 | 
								sockptr->FromHostBuffGetptr += Msglen;
 | 
				
			||||||
			sockptr->LastSendTime = REALTIMETICKS;
 | 
								sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3050,7 +3107,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
 | 
				
			||||||
				shutdown(TCP->FBBsock[n++], SD_BOTH);
 | 
									shutdown(TCP->FBBsock[n++], SD_BOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			shutdown(TCP->Relaysock, SD_BOTH);
 | 
								shutdown(TCP->Relaysock, SD_BOTH);
 | 
				
			||||||
			shutdown(TCP->HTTPsock, SD_BOTH);
 | 
								shutdown(TCP->HTTPSock, SD_BOTH);
 | 
				
			||||||
			shutdown(TCP->HTTPsock6, SD_BOTH);
 | 
								shutdown(TCP->HTTPsock6, SD_BOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3075,7 +3132,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			closesocket(TCP->Relaysock);
 | 
								closesocket(TCP->Relaysock);
 | 
				
			||||||
			closesocket(TCP->Relaysock6);
 | 
								closesocket(TCP->Relaysock6);
 | 
				
			||||||
			closesocket(TCP->HTTPsock);
 | 
								closesocket(TCP->HTTPSock);
 | 
				
			||||||
			closesocket(TCP->HTTPsock6);
 | 
								closesocket(TCP->HTTPsock6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Save info from old TNC record
 | 
								// Save info from old TNC record
 | 
				
			||||||
| 
						 | 
					@ -3100,7 +3157,10 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			TNC = TNCInfo[n];
 | 
								TNC = TNCInfo[n];
 | 
				
			||||||
			TNC->Port = n;
 | 
								TNC->Port = n;
 | 
				
			||||||
			TNC->Hardware = H_TELNET;
 | 
								TNC->PortRecord = PortRecord;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			TNC->hDlg = SavehDlg;
 | 
								TNC->hDlg = SavehDlg;
 | 
				
			||||||
			TNC->RIG = &TNC->DummyRig;			// Not using Rig control, so use Dummy
 | 
								TNC->RIG = &TNC->DummyRig;			// Not using Rig control, so use Dummy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3131,8 +3191,6 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
 | 
				
			||||||
					ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
 | 
										ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			TNC->PortRecord = PortRecord;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			Sleep(500);
 | 
								Sleep(500);
 | 
				
			||||||
			OpenSockets(TNC);
 | 
								OpenSockets(TNC);
 | 
				
			||||||
			OpenSockets6(TNC);
 | 
								OpenSockets6(TNC);
 | 
				
			||||||
| 
						 | 
					@ -3243,6 +3301,35 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Netrom Over TCP uses its own Connection Entries
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sockptr = AllocateNRTCPRec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (sockptr == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// No entries - accept and close
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								sock = accept(SocketId, (struct sockaddr *)&sin6, &addrlen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								send(sock,"No Free Sessions\r\n", 18,0);
 | 
				
			||||||
 | 
								Debugprintf("No Free Netrom Telnet Sessions");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Sleep (500);
 | 
				
			||||||
 | 
								closesocket(sock);
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sock = accept(SocketId, (struct sockaddr *)&sockptr->sin, &addrlen);
 | 
				
			||||||
 | 
							sockptr->socket = sock;
 | 
				
			||||||
 | 
							ioctl(sock, FIONBIO, ¶m);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							sockptr->NETROMMode = TRUE;
 | 
				
			||||||
 | 
							NETROMConnectionAccepted(sockptr);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//   Find a free Session
 | 
					//   Find a free Session
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (n = 1; n <= TCP->MaxSessions; n++)
 | 
						for (n = 1; n <= TCP->MaxSessions; n++)
 | 
				
			||||||
| 
						 | 
					@ -3295,6 +3382,7 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			sockptr->HTTPMode = FALSE;	
 | 
								sockptr->HTTPMode = FALSE;	
 | 
				
			||||||
			sockptr->APIMode = FALSE;
 | 
								sockptr->APIMode = FALSE;
 | 
				
			||||||
 | 
								sockptr->NETROMMode = FALSE;
 | 
				
			||||||
			sockptr->SyncMode = FALSE;	
 | 
								sockptr->SyncMode = FALSE;	
 | 
				
			||||||
			sockptr->DRATSMode = FALSE;	
 | 
								sockptr->DRATSMode = FALSE;	
 | 
				
			||||||
			sockptr->FBBMode = FALSE;	
 | 
								sockptr->FBBMode = FALSE;	
 | 
				
			||||||
| 
						 | 
					@ -3309,9 +3397,12 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			memset(sockptr->ADIF, 0, sizeof(struct ADIF));
 | 
								memset(sockptr->ADIF, 0, sizeof(struct ADIF));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (SocketId == TCP->HTTPsock || SocketId == TCP->HTTPsock6)
 | 
								if (SocketId == TCP->HTTPSock || SocketId == TCP->HTTPsock6)
 | 
				
			||||||
				sockptr->HTTPMode = TRUE;
 | 
									sockptr->HTTPMode = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
 | 
				
			||||||
 | 
									sockptr->NETROMMode = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6)
 | 
								if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sockptr->HTTPMode = TRUE;		// API is a type of HTTP socket
 | 
									sockptr->HTTPMode = TRUE;		// API is a type of HTTP socket
 | 
				
			||||||
| 
						 | 
					@ -3755,7 +3846,7 @@ MsgLoop:
 | 
				
			||||||
			BuffertoNode(sockptr, NodeLine, len);
 | 
								BuffertoNode(sockptr, NodeLine, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sockptr->InputLen = 0;
 | 
							sockptr->InputLen = 0;
 | 
				
			||||||
		ShowConnections(TNC);;
 | 
							ShowConnections(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -3929,7 +4020,7 @@ MsgLoop:
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
			ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
 | 
								ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
			ShowConnections(TNC);;
 | 
								ShowConnections(TNC);
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
| 
						 | 
					@ -4185,7 +4276,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
		ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
 | 
							ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		ShowConnections(TNC);;
 | 
							ShowConnections(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -4305,7 +4396,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
 | 
							SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ShowConnections(TNC);;
 | 
							ShowConnections(TNC);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -4804,7 +4895,7 @@ MsgLoop:
 | 
				
			||||||
			ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
 | 
								ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ShowConnections(TNC);;
 | 
								ShowConnections(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			InputLen=InputLen-(MsgLen+1);
 | 
								InputLen=InputLen-(MsgLen+1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4880,7 +4971,7 @@ MsgLoop:
 | 
				
			||||||
				WriteLog (logmsg);
 | 
									WriteLog (logmsg);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ShowConnections(TNC);;
 | 
								ShowConnections(TNC);
 | 
				
			||||||
			InputLen=InputLen-(MsgLen+1);
 | 
								InputLen=InputLen-(MsgLen+1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			sockptr->InputLen=InputLen;
 | 
								sockptr->InputLen=InputLen;
 | 
				
			||||||
| 
						 | 
					@ -4978,6 +5069,7 @@ struct RHPParamBlock
 | 
				
			||||||
	unsigned char * Msg;
 | 
						unsigned char * Msg;
 | 
				
			||||||
	int Len;
 | 
						int Len;
 | 
				
			||||||
	SOCKET Socket;
 | 
						SOCKET Socket;
 | 
				
			||||||
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5004,23 +5096,20 @@ 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 Websock connection tell app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (sockptr->WebSocks)
 | 
							if (sockptr->WebSocks)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
 | 
								if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				ProcessRHPWebSockClosed(sockptr->socket);	
 | 
									ProcessRHPWebSockClosed(sockptr->socket);	
 | 
				
			||||||
				DataSocket_Disconnect(TNC, sockptr);
 | 
					
 | 
				
			||||||
				return 0;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			TNC->Streams[sockptr->Number].ReportDISC = TRUE;		//Tell Node
 | 
					 | 
				
			||||||
			DataSocket_Disconnect(TNC, sockptr);
 | 
								DataSocket_Disconnect(TNC, sockptr);
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							TNC->Streams[sockptr->Number].ReportDISC = TRUE;		//Tell Node
 | 
				
			||||||
 | 
							DataSocket_Disconnect(TNC, sockptr);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MsgPtr = &sockptr->InputBuffer[0];
 | 
						MsgPtr = &sockptr->InputBuffer[0];
 | 
				
			||||||
| 
						 | 
					@ -5107,7 +5196,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sockcopy = malloc(sizeof(struct ConnectionInfo));
 | 
									sockcopy = malloc(sizeof(struct ConnectionInfo));
 | 
				
			||||||
				sockptr->TNC = TNC;
 | 
									sockptr->TNC = TNC;
 | 
				
			||||||
				sockptr->LastSendTime = REALTIMETICKS;
 | 
									sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
 | 
									memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5120,10 +5209,13 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
 | 
									struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									ParamBlock->sockptr = sockptr;
 | 
				
			||||||
				ParamBlock->Socket = sockptr->socket;
 | 
									ParamBlock->Socket = sockptr->socket;
 | 
				
			||||||
				ParamBlock->Len = Len;
 | 
									ParamBlock->Len = Len;
 | 
				
			||||||
				ParamBlock->Msg = malloc(Len + 10);
 | 
									ParamBlock->Msg = malloc(Len + 10);
 | 
				
			||||||
				memcpy(ParamBlock->Msg, Payload, Len);
 | 
									memcpy(ParamBlock->Msg, Payload, Len);
 | 
				
			||||||
 | 
									sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				_beginthread(RHPThread, 0, (VOID *)ParamBlock);	
 | 
									_beginthread(RHPThread, 0, (VOID *)ParamBlock);	
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
				sockptr->InputLen = 0;
 | 
									sockptr->InputLen = 0;
 | 
				
			||||||
| 
						 | 
					@ -5131,7 +5223,13 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
			Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
 | 
								Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
 | 
				
			||||||
 | 
								closesocket(sockptr->socket);
 | 
				
			||||||
 | 
								sockptr->SocketActive = FALSE;
 | 
				
			||||||
 | 
								ShowConnections(TNC);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sockptr->InputLen = 0;
 | 
							sockptr->InputLen = 0;
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					@ -5158,7 +5256,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sockcopy = malloc(sizeof(struct ConnectionInfo));
 | 
						sockcopy = malloc(sizeof(struct ConnectionInfo));
 | 
				
			||||||
	sockptr->TNC = TNC;
 | 
						sockptr->TNC = TNC;
 | 
				
			||||||
	sockptr->LastSendTime = REALTIMETICKS;
 | 
						sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
 | 
						memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5251,6 +5349,7 @@ int DataSocket_ReadDRATS(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int DataSocket_Disconnect(struct TNCINFO * TNC,  struct ConnectionInfo * sockptr)
 | 
					int DataSocket_Disconnect(struct TNCINFO * TNC,  struct ConnectionInfo * sockptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int n;
 | 
						int n;
 | 
				
			||||||
| 
						 | 
					@ -5265,7 +5364,7 @@ int DataSocket_Disconnect(struct TNCINFO * TNC,  struct ConnectionInfo * sockptr
 | 
				
			||||||
		ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
 | 
							ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		sockptr->SocketActive = FALSE;
 | 
							sockptr->SocketActive = FALSE;
 | 
				
			||||||
		ShowConnections(TNC);;
 | 
							ShowConnections(TNC);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -5452,8 +5551,7 @@ int WriteLog(char * msg)
 | 
				
			||||||
		strcat(Value, "logs/Telnet_");
 | 
							strcat(Value, "logs/Telnet_");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(Value, "%s%02d%02d%02d.log", Value,
 | 
						sprintf(&Value[strlen(Value)], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
 | 
				
			||||||
				tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((file = fopen(Value, "a")) == NULL)
 | 
						if ((file = fopen(Value, "a")) == NULL)
 | 
				
			||||||
		return FALSE;
 | 
							return FALSE;
 | 
				
			||||||
| 
						 | 
					@ -5508,8 +5606,7 @@ VOID WriteCMSLog(char * msg)
 | 
				
			||||||
		strcat(Value, "logs/CMSAccess");
 | 
							strcat(Value, "logs/CMSAccess");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(Value, "%s_%04d%02d%02d.log", Value,
 | 
						sprintf(&Value[strlen(Value)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
 | 
				
			||||||
				tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Handle = fopen(Value, "ab");
 | 
						Handle = fopen(Value, "ab");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5667,7 +5764,9 @@ int Telnet_Connected(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCK
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL[0])
 | 
									struct _TRANSPORTENTRY * CROSSLINK = TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (CROSSLINK && CROSSLINK->APPL[0])
 | 
				
			||||||
					buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r",
 | 
										buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r",
 | 
				
			||||||
						TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL);
 | 
											TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL);
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
| 
						 | 
					@ -6323,26 +6422,80 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
 | 
				
			||||||
	struct ConnectionInfo * sockptr;
 | 
						struct ConnectionInfo * sockptr;
 | 
				
			||||||
	SOCKET sock;
 | 
						SOCKET sock;
 | 
				
			||||||
	struct sockaddr_in sinx; 
 | 
						struct sockaddr_in sinx; 
 | 
				
			||||||
	struct sockaddr_in destaddr;
 | 
					 | 
				
			||||||
	int addrlen=sizeof(sinx);
 | 
						int addrlen=sizeof(sinx);
 | 
				
			||||||
	int i;
 | 
						char PortString[20];
 | 
				
			||||||
 | 
						struct addrinfo hints, *res = 0, *saveres;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(PortString, "%d", Port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// get host info, make socket, and connect it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(&hints, 0, sizeof hints);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (TCP->IPV6 == 0 && TCP->IPV4)
 | 
				
			||||||
 | 
							hints.ai_family = AF_INET;
 | 
				
			||||||
 | 
						else if (TCP->IPV4 == 0 && TCP->IPV6)
 | 
				
			||||||
 | 
							hints.ai_family = AF_INET6;
 | 
				
			||||||
 | 
						else if (TCP->IPV4 && TCP->IPV6)
 | 
				
			||||||
 | 
							hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							ReportError(STREAM, "Neither IPv4 nor IPv5 are enabled");
 | 
				
			||||||
 | 
							return FALSE;			// Resolve failed
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hints.ai_socktype = SOCK_STREAM;
 | 
				
			||||||
 | 
						getaddrinfo(Host, PortString, &hints, &res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!res)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							char Msg[256];
 | 
				
			||||||
 | 
							err = WSAGetLastError();
 | 
				
			||||||
 | 
							sprintf(Msg, "Resolve HostName Failed - Error %d", err);
 | 
				
			||||||
 | 
							ReportError(STREAM, Msg);
 | 
				
			||||||
 | 
							return FALSE;			// Resolve failed
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Step thorough the list of hosts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						saveres = res;				// Save for free
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*	if (res->ai_next)			// More than one
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							int n = ISHostIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (n && res->ai_next)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								res = res->ai_next;
 | 
				
			||||||
 | 
								n--;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (n)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// We have run off the end of the list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ISHostIndex = 0;	// Back to start
 | 
				
			||||||
 | 
								res = saveres;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								ISHostIndex++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					//	getnameinfo(res->ai_addr, (int)res->ai_addrlen, RealISHost, 256, serv, 256, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sockptr = STREAM->ConnectionInfo;
 | 
						sockptr = STREAM->ConnectionInfo;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	sock = sockptr->socket = socket(AF_INET, SOCK_STREAM, 0);
 | 
						sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (sock == INVALID_SOCKET)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		ReportError(STREAM, "Create Socket Failed");
 | 
					 | 
				
			||||||
		return FALSE;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sockptr->SocketActive = TRUE;
 | 
						sockptr->SocketActive = TRUE;
 | 
				
			||||||
	sockptr->InputLen = 0;
 | 
						sockptr->InputLen = 0;
 | 
				
			||||||
	sockptr->LoginState = 2;
 | 
						sockptr->LoginState = 2;
 | 
				
			||||||
	sockptr->UserPointer = 0;
 | 
						sockptr->UserPointer = 0;
 | 
				
			||||||
	sockptr->DoEcho = FALSE;
 | 
						sockptr->DoEcho = FALSE;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	sockptr->FBBMode = FBB;		// Raw Data
 | 
						sockptr->FBBMode = FBB;		// Raw Data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sockptr->ADIF == NULL)
 | 
						if (sockptr->ADIF == NULL)
 | 
				
			||||||
| 
						 | 
					@ -6351,48 +6504,18 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
 | 
				
			||||||
	memset(sockptr->ADIF, 0, sizeof(struct ADIF));
 | 
						memset(sockptr->ADIF, 0, sizeof(struct ADIF));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Resolve Name if needed
 | 
						if (sock == INVALID_SOCKET)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	sockptr->sin.sin_family = AF_INET; 
 | 
					 | 
				
			||||||
	sockptr->sin.sin_port = htons(Port);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sockptr->sin.sin_addr.s_addr = inet_addr(Host);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (sockptr->sin.sin_addr.s_addr == INADDR_NONE)
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		struct hostent * HostEnt;
 | 
							ReportError(STREAM, "Create Socket Failed");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
		//	Resolve name to address
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		HostEnt = gethostbyname(Host);
 | 
					 | 
				
			||||||
		 
 | 
					 | 
				
			||||||
		if (!HostEnt)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			ReportError(STREAM, "Resolve HostName Failed");
 | 
					 | 
				
			||||||
			return FALSE;			// Resolve failed
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		i = 0;
 | 
					 | 
				
			||||||
		while (HostEnt->h_addr_list[i] != 0)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			    struct in_addr addr;
 | 
					 | 
				
			||||||
				addr.s_addr = *(u_long *) HostEnt->h_addr_list[i++];
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		memcpy(&sockptr->sin.sin_addr.s_addr, HostEnt->h_addr, 4);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ioctl (sockptr->socket, FIONBIO, ¶m);
 | 
						ioctl (sock, FIONBIO, ¶m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setsockopt (sockptr->socket, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
 | 
						setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sinx.sin_family = AF_INET;
 | 
					//	memcpy(work, res->ai_addr->sa_data, 4);
 | 
				
			||||||
	sinx.sin_addr.s_addr = INADDR_ANY;
 | 
					 | 
				
			||||||
	sinx.sin_port = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (bind(sockptr->socket, (struct sockaddr *) &sinx, addrlen) != 0 )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		ReportError(STREAM, "Bind Failed");	
 | 
					 | 
				
			||||||
  	 	return FALSE; 
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if (LogEnabled)
 | 
						if (LogEnabled)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -6402,21 +6525,21 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
 | 
				
			||||||
		WriteLog (logmsg);
 | 
							WriteLog (logmsg);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
 | 
				
			||||||
	if (connect(sockptr->socket,(struct sockaddr *) &sockptr->sin, sizeof(destaddr)) == 0)
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//
 | 
							//
 | 
				
			||||||
		//	Connected successful
 | 
							//	Connected successful
 | 
				
			||||||
		//
 | 
							//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ReportError(STREAM, "*** Connected");
 | 
							ReportError(STREAM, "*** Connected");
 | 
				
			||||||
 | 
							freeaddrinfo(saveres);
 | 
				
			||||||
		// Get Send Buffer Size
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return TRUE;
 | 
							return TRUE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							freeaddrinfo(saveres);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
		err=WSAGetLastError();
 | 
							err=WSAGetLastError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (err == 10035 || err == 115 || err == 36)		//EWOULDBLOCK
 | 
							if (err == 10035 || err == 115 || err == 36)		//EWOULDBLOCK
 | 
				
			||||||
| 
						 | 
					@ -6442,7 +6565,6 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7154,7 +7276,7 @@ int DoRefreshWebMailIndex()
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							sockcopy = malloc(sizeof(struct ConnectionInfo));
 | 
												sockcopy = malloc(sizeof(struct ConnectionInfo));
 | 
				
			||||||
							sockptr->TNC = TNC;
 | 
												sockptr->TNC = TNC;
 | 
				
			||||||
							sockptr->LastSendTime = REALTIMETICKS;
 | 
												sockptr->LastSendTime = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
 | 
												memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								UIARQ.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								UIARQ.c
									
									
									
									
									
								
							| 
						 | 
					@ -80,6 +80,11 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
 | 
				
			||||||
VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer);
 | 
					VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer);
 | 
				
			||||||
char * strlop(char * buf, char delim);
 | 
					char * strlop(char * buf, char delim);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UCHAR BPQDirectory[];
 | 
					extern UCHAR BPQDirectory[];
 | 
				
			||||||
extern char MYALIASLOPPED[10];
 | 
					extern char MYALIASLOPPED[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -464,7 +469,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	ptr=strchr(TNC->NodeCall, ' ');
 | 
						ptr=strchr(TNC->NodeCall, ' ');
 | 
				
			||||||
	if (ptr) *(ptr) = 0;					// Null Terminate
 | 
						if (ptr) *(ptr) = 0;					// Null Terminate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_UIARQ;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->BusyWait == 0)
 | 
						if (TNC->BusyWait == 0)
 | 
				
			||||||
		TNC->BusyWait = 10;
 | 
							TNC->BusyWait = 10;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								UZ7HODrv.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								UZ7HODrv.c
									
									
									
									
									
								
							| 
						 | 
					@ -78,6 +78,11 @@ VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
 | 
				
			||||||
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
 | 
					int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
 | 
				
			||||||
int standardParams(struct TNCINFO * TNC, char * buf);
 | 
					int standardParams(struct TNCINFO * TNC, char * buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UCHAR BPQDirectory[];
 | 
					extern UCHAR BPQDirectory[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAXUZ7HOPORTS 16
 | 
					#define MAXUZ7HOPORTS 16
 | 
				
			||||||
| 
						 | 
					@ -685,6 +690,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
					ConnecttoUZ7HO(port);
 | 
										ConnecttoUZ7HO(port);
 | 
				
			||||||
					lasttime[port] = ltime;
 | 
										lasttime[port] = ltime;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									while (TNC->PortRecord->UI_Q)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										buffptr = Q_REM(&TNC->PortRecord->UI_Q);
 | 
				
			||||||
 | 
										ReleaseBuffer(buffptr);	
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -1023,7 +1033,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
								if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
									char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
									sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
				if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -1400,7 +1414,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	ptr=strchr(TNC->NodeCall, ' ');
 | 
						ptr=strchr(TNC->NodeCall, ' ');
 | 
				
			||||||
	if (ptr) *(ptr) = 0;					// Null Terminate
 | 
						if (ptr) *(ptr) = 0;					// Null Terminate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_UZ7HO;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
 | 
						UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								V4.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								V4.c
									
									
									
									
									
								
							| 
						 | 
					@ -622,7 +622,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
 | 
								if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
									char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
									sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -971,13 +974,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->ProgramPath)
 | 
						if (TNC->ProgramPath)
 | 
				
			||||||
		TNC->WeStartedTNC = RestartTNC(TNC);
 | 
							TNC->WeStartedTNC = RestartTNC(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_V4;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_V4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										45
									
								
								VARA.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								VARA.c
									
									
									
									
									
								
							| 
						 | 
					@ -73,6 +73,11 @@ int	KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
 | 
				
			||||||
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT);
 | 
					VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT);
 | 
				
			||||||
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
 | 
					VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINBPQ
 | 
					#ifndef LINBPQ
 | 
				
			||||||
BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM  lParam);
 | 
					BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM  lParam);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -1163,6 +1168,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->ARDOPBuffer = malloc(8192);
 | 
						TNC->ARDOPBuffer = malloc(8192);
 | 
				
			||||||
	TNC->ARDOPDataBuffer = malloc(8192);
 | 
						TNC->ARDOPDataBuffer = malloc(8192);
 | 
				
			||||||
| 
						 | 
					@ -1170,7 +1176,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	if (TNC->ProgramPath)
 | 
						if (TNC->ProgramPath)
 | 
				
			||||||
		TNC->WeStartedTNC = 1;
 | 
							TNC->WeStartedTNC = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_VARA;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_VARA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->BusyWait == 0)
 | 
						if (TNC->BusyWait == 0)
 | 
				
			||||||
		TNC->BusyWait = 10;
 | 
							TNC->BusyWait = 10;
 | 
				
			||||||
| 
						 | 
					@ -1178,8 +1184,6 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	if (TNC->BusyHold == 0)
 | 
						if (TNC->BusyHold == 0)
 | 
				
			||||||
		TNC->BusyHold = 1;
 | 
							TNC->BusyHold = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					@ -1446,9 +1450,6 @@ VOID VARAThread(void * portptr)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
//	printf("Starting VARA Thread\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// if on Windows and Localhost see if TNC is running
 | 
					// if on Windows and Localhost see if TNC is running
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
| 
						 | 
					@ -1564,14 +1565,11 @@ TNCRunning:
 | 
				
			||||||
	sinx.sin_addr.s_addr = INADDR_ANY;
 | 
						sinx.sin_addr.s_addr = INADDR_ANY;
 | 
				
			||||||
	sinx.sin_port = 0;
 | 
						sinx.sin_port = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	printf("Trying to connect to VARA TNC\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0)
 | 
						if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//	Connected successful
 | 
							//	Connected successful
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		goto VConnected;
 | 
							goto VConnected;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->Alerted == FALSE)
 | 
						if (TNC->Alerted == FALSE)
 | 
				
			||||||
| 
						 | 
					@ -2230,6 +2228,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
			if (App < 32)
 | 
								if (App < 32)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				char AppName[13];
 | 
									char AppName[13];
 | 
				
			||||||
 | 
									char AppBuffer[64];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
 | 
									memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
 | 
				
			||||||
				AppName[12] = 0;
 | 
									AppName[12] = 0;
 | 
				
			||||||
| 
						 | 
					@ -2244,7 +2243,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (CheckAppl(TNC, AppName))
 | 
									if (CheckAppl(TNC, AppName))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					MsgLen = sprintf(Buffer, "%s\r", AppName);
 | 
										MsgLen = sprintf(AppBuffer, "%s\r", AppName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					buffptr = GetBuff();
 | 
										buffptr = GetBuff();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2254,7 +2253,9 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					buffptr->Len = MsgLen;
 | 
										buffptr->Len = MsgLen;
 | 
				
			||||||
					memcpy(buffptr->Data, Buffer, MsgLen);
 | 
										memcpy(buffptr->Data, AppBuffer, MsgLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Debugprintf("Calling Application %s", AppBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
 | 
										C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					@ -2429,7 +2430,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
//		return;
 | 
					//		return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_memicmp(Buffer, "REGISTERED", 9) == 0)
 | 
						if (_memicmp(Buffer, "LINK REGISTERED", 9) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		strcat(Buffer, "\r");
 | 
							strcat(Buffer, "\r");
 | 
				
			||||||
		WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
 | 
							WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
 | 
				
			||||||
| 
						 | 
					@ -2443,6 +2444,13 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_memicmp(Buffer, "UNENCRYPTED LINK ", 11) == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							strcat(Buffer, "\r");
 | 
				
			||||||
 | 
							WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0)
 | 
						if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		strcat(Buffer, "\r");
 | 
							strcat(Buffer, "\r");
 | 
				
			||||||
| 
						 | 
					@ -2668,7 +2676,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int InputLen, MsgLen;
 | 
						int InputLen, MsgLen;
 | 
				
			||||||
	char * ptr, * ptr2;
 | 
						char * ptr, * ptr2;
 | 
				
			||||||
	char Buffer[4096];
 | 
						char Buffer[8192];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// shouldn't get several messages per packet, as each should need an ack
 | 
						// shouldn't get several messages per packet, as each should need an ack
 | 
				
			||||||
	// May get message split over packets
 | 
						// May get message split over packets
 | 
				
			||||||
| 
						 | 
					@ -2676,7 +2684,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
 | 
				
			||||||
	if (TNC->InputLen > 8000)	// Shouldnt have packets longer than this
 | 
						if (TNC->InputLen > 8000)	// Shouldnt have packets longer than this
 | 
				
			||||||
		TNC->InputLen=0;
 | 
							TNC->InputLen=0;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
	InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8192 - TNC->InputLen, 0);
 | 
						InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (InputLen == 0 || InputLen == SOCKET_ERROR)
 | 
						if (InputLen == 0 || InputLen == SOCKET_ERROR)
 | 
				
			||||||
	{		
 | 
						{		
 | 
				
			||||||
| 
						 | 
					@ -2699,12 +2707,18 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->InputLen += InputLen;
 | 
						TNC->InputLen += InputLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TNC->ARDOPBuffer[TNC->InputLen] = 0;
 | 
				
			||||||
 | 
						Debugprintf("VARA Processing buffer - %s", TNC->ARDOPBuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
loop:
 | 
					loop:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen);
 | 
						ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ptr == 0)	//  CR in buffer
 | 
						if (ptr == 0)	//  CR in buffer
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Debugprintf("VARA Part Packet Received - Waiting for rest");
 | 
				
			||||||
		return;		// Wait for it
 | 
							return;		// Wait for it
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr2 = &TNC->ARDOPBuffer[TNC->InputLen];
 | 
						ptr2 = &TNC->ARDOPBuffer[TNC->InputLen];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2727,9 +2741,10 @@ loop:
 | 
				
			||||||
		if (TNC->InputLen < MsgLen)
 | 
							if (TNC->InputLen < MsgLen)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			TNC->InputLen = 0;
 | 
								TNC->InputLen = 0;
 | 
				
			||||||
 | 
								Debugprintf("VARA Corrupt multi command input");
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		memmove(TNC->ARDOPBuffer, ptr + 1,  TNC->InputLen-MsgLen);
 | 
							memmove(TNC->ARDOPBuffer, ptr + 1,  TNC->InputLen - MsgLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		TNC->InputLen -= MsgLen;
 | 
							TNC->InputLen -= MsgLen;
 | 
				
			||||||
		goto loop;
 | 
							goto loop;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,125 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
#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
 | 
					 | 
				
			||||||
| 
						 | 
					@ -10,14 +10,15 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define KVers 6,0,24,59
 | 
					#define KVers 6,0,25,8
 | 
				
			||||||
#define KVerstring "6.0.24.59\0"
 | 
					#define KVerstring "6.0.25.8\0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CKernel
 | 
					#ifdef CKernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define Vers KVers
 | 
					#define Vers KVers
 | 
				
			||||||
#define Verstring KVerstring
 | 
					#define Verstring KVerstring
 | 
				
			||||||
#define Datestring "February 2025"
 | 
					#define Datestring "October 2025"
 | 
				
			||||||
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
 | 
					#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
 | 
				
			||||||
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
 | 
					#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
 | 
				
			||||||
#define VerDesc "BPQ32 Switch\0"
 | 
					#define VerDesc "BPQ32 Switch\0"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										35
									
								
								WINMOR.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								WINMOR.c
									
									
									
									
									
								
							| 
						 | 
					@ -105,6 +105,11 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
 | 
				
			||||||
BOOL KillOldTNC(char * Path);
 | 
					BOOL KillOldTNC(char * Path);
 | 
				
			||||||
int standardParams(struct TNCINFO * TNC, char * buf);
 | 
					int standardParams(struct TNCINFO * TNC, char * buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
 | 
				
			||||||
 | 
					void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char ClassName[]="WINMORSTATUS";
 | 
					static char ClassName[]="WINMORSTATUS";
 | 
				
			||||||
static char WindowTitle[] = "WINMOR";
 | 
					static char WindowTitle[] = "WINMOR";
 | 
				
			||||||
static int RigControlRow = 165;
 | 
					static int RigControlRow = 165;
 | 
				
			||||||
| 
						 | 
					@ -139,6 +144,10 @@ VOID WritetoTraceSupport(struct TNCINFO * TNC, char * Msg, int Len)
 | 
				
			||||||
	int LineLen, i;
 | 
						int LineLen, i;
 | 
				
			||||||
	UCHAR Save;
 | 
						UCHAR Save;
 | 
				
			||||||
	int SaveLen = Len;
 | 
						int SaveLen = Len;
 | 
				
			||||||
 | 
						char Time[16];
 | 
				
			||||||
 | 
						time_t T;
 | 
				
			||||||
 | 
						struct tm * tm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Len < 0)
 | 
						if (Len < 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,10 +215,16 @@ lineloop:
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
			// Write to Web Buffer
 | 
								// Write to Web Buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								T = time(NULL);
 | 
				
			||||||
 | 
								tm = gmtime(&T);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
								sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcat(TNC->WebBuffer, Time);
 | 
				
			||||||
			strcat(TNC->WebBuffer, Line);
 | 
								strcat(TNC->WebBuffer, Line);
 | 
				
			||||||
			strcat(TNC->WebBuffer, "\r\n");
 | 
								strcat(TNC->WebBuffer, "\r\n");
 | 
				
			||||||
			if (strlen(TNC->WebBuffer) > 4500)
 | 
								if (strlen(TNC->WebBuffer) > 4500)
 | 
				
			||||||
				memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490);	// Make sure null is moved
 | 
									memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1);	// Make sure null is moved
 | 
				
			||||||
		Skip:
 | 
							Skip:
 | 
				
			||||||
			ptr1 = ptr2;
 | 
								ptr1 = ptr2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,10 +263,16 @@ lineloop:
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
			index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
 | 
								index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
								T = time(NULL);
 | 
				
			||||||
 | 
								tm = gmtime(&T);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
								sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
 | 
				
			||||||
 | 
								strcat(TNC->WebBuffer, Time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			strcat(TNC->WebBuffer, ptr1);
 | 
								strcat(TNC->WebBuffer, ptr1);
 | 
				
			||||||
			strcat(TNC->WebBuffer, "\r\n");
 | 
								strcat(TNC->WebBuffer, "\r\n");
 | 
				
			||||||
			if (strlen(TNC->WebBuffer) > 4500)
 | 
								if (strlen(TNC->WebBuffer) > 4500)
 | 
				
			||||||
				memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490);	// Make sure null is moved
 | 
									memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1);	// Make sure null is moved
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -984,7 +1005,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
								if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
 | 
									char cmd[56];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(cmd, &buff->L2DATA[6]);
 | 
				
			||||||
 | 
									sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
				if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
									if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -1462,11 +1487,12 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->ProgramPath)
 | 
						if (TNC->ProgramPath)
 | 
				
			||||||
		TNC->WeStartedTNC = RestartTNC(TNC);
 | 
							TNC->WeStartedTNC = RestartTNC(TNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Hardware = H_WINMOR;
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (TNC->BusyWait == 0)
 | 
						if (TNC->BusyWait == 0)
 | 
				
			||||||
		TNC->BusyWait = 10;
 | 
							TNC->BusyWait = 10;
 | 
				
			||||||
| 
						 | 
					@ -1474,7 +1500,6 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
 | 
				
			||||||
	if (TNC->BusyHold == 0)
 | 
						if (TNC->BusyHold == 0)
 | 
				
			||||||
		TNC->BusyHold = 1;
 | 
							TNC->BusyHold = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ VOID Do_Save_WPRec(HWND hDlg);
 | 
				
			||||||
VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
 | 
					VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
 | 
				
			||||||
VOID SaveIntValue(config_setting_t * group, char * name, int value);
 | 
					VOID SaveIntValue(config_setting_t * group, char * name, int value);
 | 
				
			||||||
VOID SaveStringValue(config_setting_t * group, char * name, char * value);
 | 
					VOID SaveStringValue(config_setting_t * group, char * name, char * value);
 | 
				
			||||||
 | 
					BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
 | 
				
			||||||
void MQTTMessageEvent(void* message);
 | 
					void MQTTMessageEvent(void* message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WPRec * AllocateWPRecord()
 | 
					WPRec * AllocateWPRecord()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										269
									
								
								WebMail.c
									
									
									
									
									
								
							
							
						
						
									
										269
									
								
								WebMail.c
									
									
									
									
									
								
							| 
						 | 
					@ -1446,7 +1446,12 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Neither do js or file downloads
 | 
						// Neither do js or file downloads
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0)
 | 
						// This could be a request for a Template file
 | 
				
			||||||
 | 
						// WebMail/Local_Templates/My Forms/inc/logo_ad63.png
 | 
				
			||||||
 | 
						// WebMail/Standard Templates/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_memicmp(NodeURL, "/WebMail/Local", 14) == 0 || (_memicmp(NodeURL, "/WebMail/Standard", 17) == 0))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int FileSize;
 | 
							int FileSize;
 | 
				
			||||||
		char * MsgBytes;
 | 
							char * MsgBytes;
 | 
				
			||||||
| 
						 | 
					@ -1456,9 +1461,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
		char TimeString[64];
 | 
							char TimeString[64];
 | 
				
			||||||
		char FileTimeString[64];
 | 
							char FileTimeString[64];
 | 
				
			||||||
		struct stat STAT;
 | 
							struct stat STAT;
 | 
				
			||||||
		char * FN = &NodeURL[16];
 | 
					 		char * FN = &NodeURL[9];
 | 
				
			||||||
		char * fileBit = FN;
 | 
							char * fileBit = FN;
 | 
				
			||||||
		char * ext;
 | 
							char * ext;
 | 
				
			||||||
 | 
							char Type[64] = "Content-Type: text/html\r\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		UndoTransparency(FN);
 | 
							UndoTransparency(FN);
 | 
				
			||||||
		ext = strchr(FN, '.');
 | 
							ext = strchr(FN, '.');
 | 
				
			||||||
| 
						 | 
					@ -1491,24 +1497,109 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
		FormatTime2(FileTimeString, STAT.st_ctime);
 | 
							FormatTime2(FileTimeString, STAT.st_ctime);
 | 
				
			||||||
		FormatTime2(TimeString, time(NULL));
 | 
							FormatTime2(TimeString, time(NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (_stricmp(ext, ".htm") == 0 || _stricmp(ext, ".html") == 0 || _stricmp(ext, ".css") == 0 ||  _stricmp(ext, ".js") == 0)
 | 
							ext++;
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
 | 
					 | 
				
			||||||
				"Content-Type: text/css\r\n"
 | 
					 | 
				
			||||||
				"Date: %s\r\n"
 | 
					 | 
				
			||||||
				"Last-Modified: %s\r\n" 
 | 
					 | 
				
			||||||
				"\r\n%s", FileSize, TimeString, FileTimeString, MsgBytes);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
 | 
					 | 
				
			||||||
				"Content-Type: application/octet-stream\r\n"
 | 
					 | 
				
			||||||
				"Content-Disposition: attachment; filename=\"%s\"\r\n"
 | 
					 | 
				
			||||||
				"Date: %s\r\n"
 | 
					 | 
				
			||||||
				"Last-Modified: %s\r\n" 
 | 
					 | 
				
			||||||
				"\r\n%s", FileSize, fileBit, TimeString, FileTimeString, MsgBytes);
 | 
					 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
							if (_stricmp(ext, "js") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: text/javascript\r\n");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if (_stricmp(ext, "css") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: text/css\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_stricmp(ext, "pdf") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: application/pdf\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
 | 
				
			||||||
 | 
								_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: image\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// File may be binary so output header then copy in message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
 | 
				
			||||||
 | 
									"%s"
 | 
				
			||||||
 | 
									"Date: %s\r\n"
 | 
				
			||||||
 | 
									"Last-Modified: %s\r\n" 
 | 
				
			||||||
 | 
									"\r\n", FileSize, Type,TimeString, FileTimeString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(&Reply[*RLen], MsgBytes, FileSize);
 | 
				
			||||||
 | 
							*RLen += FileSize;
 | 
				
			||||||
 | 
							free (MsgBytes);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							int FileSize;
 | 
				
			||||||
 | 
							char * MsgBytes;
 | 
				
			||||||
 | 
							char MsgFile[512];
 | 
				
			||||||
 | 
							FILE * hFile;
 | 
				
			||||||
 | 
							size_t ReadLen;
 | 
				
			||||||
 | 
							char TimeString[64];
 | 
				
			||||||
 | 
							char FileTimeString[64];
 | 
				
			||||||
 | 
							struct stat STAT;
 | 
				
			||||||
 | 
							char * FN = &NodeURL[16];
 | 
				
			||||||
 | 
							char * fileBit = FN;
 | 
				
			||||||
 | 
							char * ext;
 | 
				
			||||||
 | 
							char Type[64] = "Content-Type: text/html\r\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UndoTransparency(FN);
 | 
				
			||||||
 | 
							ext = strchr(FN, '.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sprintf(MsgFile, "%s/%s", BPQDirectory, FN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							while (strchr(fileBit, '/'))
 | 
				
			||||||
 | 
								fileBit = strlop(fileBit, '/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (stat(MsgFile, &STAT) == -1)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							hFile = fopen(MsgFile, "rb");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if (hFile == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							FileSize = STAT.st_size;
 | 
				
			||||||
 | 
							MsgBytes = malloc(FileSize + 1);
 | 
				
			||||||
 | 
							ReadLen = fread(MsgBytes, 1, FileSize, hFile); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fclose(hFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							FormatTime2(FileTimeString, STAT.st_ctime);
 | 
				
			||||||
 | 
							FormatTime2(TimeString, time(NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ext++;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (_stricmp(ext, "js") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: text/javascript\r\n");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if (_stricmp(ext, "css") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: text/css\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_stricmp(ext, "pdf") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: application/pdf\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
 | 
				
			||||||
 | 
								_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
 | 
				
			||||||
 | 
								strcpy(Type, "Content-Type: image\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// File may be binary so output header then copy in message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
 | 
				
			||||||
 | 
									"%s"
 | 
				
			||||||
 | 
									"Date: %s\r\n"
 | 
				
			||||||
 | 
									"Last-Modified: %s\r\n" 
 | 
				
			||||||
 | 
									"\r\n", FileSize, Type,TimeString, FileTimeString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(&Reply[*RLen], MsgBytes, FileSize);
 | 
				
			||||||
 | 
							*RLen += FileSize;
 | 
				
			||||||
		free (MsgBytes);
 | 
							free (MsgBytes);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}	
 | 
						}	
 | 
				
			||||||
| 
						 | 
					@ -2293,6 +2384,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		struct HtmlFormDir * Dir;
 | 
							struct HtmlFormDir * Dir;
 | 
				
			||||||
		int i;
 | 
							int i;
 | 
				
			||||||
 | 
							int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SubDir = strlop(&NodeURL[17], ':');
 | 
							SubDir = strlop(&NodeURL[17], ':');
 | 
				
			||||||
		DirNo = atoi(&NodeURL[17]);
 | 
							DirNo = atoi(&NodeURL[17]);
 | 
				
			||||||
| 
						 | 
					@ -2313,9 +2405,9 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
		Dir = HtmlFormDirs[DirNo];
 | 
							Dir = HtmlFormDirs[DirNo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (SubDir)
 | 
							if (SubDir)
 | 
				
			||||||
			sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
 | 
								len = sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			sprintf(popup, popuphddr, Key, Dir->DirName);
 | 
								len = sprintf(popup, popuphddr, Key, Dir->DirName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (SubDir)
 | 
							if (SubDir)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -2326,7 +2418,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
				// We only send if there is a .txt file
 | 
									// We only send if there is a .txt file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
 | 
									if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
 | 
				
			||||||
					sprintf(popup, "%s <option value=%d:%d,%d>%s", popup, DirNo, SubDirNo, i, Name);
 | 
										len += sprintf(&popup[len], " <option value=%d:%d,%d>%s", DirNo, SubDirNo, i, Name);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
| 
						 | 
					@ -2338,10 +2430,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
 | 
				
			||||||
				// We only send if there is a .txt file
 | 
									// We only send if there is a .txt file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
 | 
									if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
 | 
				
			||||||
					sprintf(popup, "%s <option value=%d,%d>%s", popup, DirNo, i, Name);
 | 
										len += sprintf(&popup[len], " <option value=%d,%d>%s", DirNo, i, Name);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		sprintf(popup, "%s</select></p>", popup);
 | 
							len += sprintf(&popup[len], "</select></p>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		*RLen = sprintf(Reply, "%s", popup);
 | 
							*RLen = sprintf(Reply, "%s", popup);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -2409,6 +2501,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	int MsgLen = 0;
 | 
						int MsgLen = 0;
 | 
				
			||||||
	char * Boundary;
 | 
						char * Boundary;
 | 
				
			||||||
 | 
						int len;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
	WebMailInfo * WebMail = Session->WebMail;
 | 
						WebMailInfo * WebMail = Session->WebMail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2455,7 +2548,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Also to active fields in case not changed by form
 | 
						// Also to active fields in case not changed by form
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(popup, popuphddr, Session->Key);
 | 
						len = sprintf(popup, popuphddr, Session->Key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	LastGroup = HtmlFormDirs[0]->FormSet;		// Save so we know when changes
 | 
						LastGroup = HtmlFormDirs[0]->FormSet;		// Save so we know when changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2468,21 +2561,21 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
 | 
				
			||||||
		if (strcmp(LastGroup, Dir->FormSet) != 0)
 | 
							if (strcmp(LastGroup, Dir->FormSet) != 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			LastGroup = Dir->FormSet;
 | 
								LastGroup = Dir->FormSet;
 | 
				
			||||||
			sprintf(popup, "%s%s", popup, NewGroup);
 | 
								len += sprintf(&popup[len], "%s", NewGroup);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sprintf(popup, "%s <option value=%d>%s", popup, i, Dir->DirName);
 | 
							len += sprintf(&popup[len], " <option value=%d>%s", i, Dir->DirName);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		// Recurse any Subdirs
 | 
							// Recurse any Subdirs
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		n = 0;
 | 
							n = 0;
 | 
				
			||||||
		while (n < Dir->DirCount)
 | 
							while (n < Dir->DirCount)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(popup, "%s <option value=%d:%d>%s", popup, i, n, Dir->Dirs[n]->DirName);
 | 
								len += sprintf(&popup[len], " <option value=%d:%d>%s", i, n, Dir->Dirs[n]->DirName);
 | 
				
			||||||
			n++;
 | 
								n++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sprintf(popup, "%s</select></td></tr></table></p>", popup);
 | 
						len += sprintf(&popup[len], "%</select></td></tr></table></p>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
 | 
						*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2569,10 +2662,10 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
 | 
				
			||||||
	if (strlen(WebMail->BID) > 12)
 | 
						if (strlen(WebMail->BID) > 12)
 | 
				
			||||||
		WebMail->BID[12] = 0;
 | 
							WebMail->BID[12] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UndoTransparency(WebMail->BID);
 | 
					//	UndoTransparency(WebMail->BID);
 | 
				
			||||||
	UndoTransparency(WebMail->To);
 | 
					//	UndoTransparency(WebMail->To);
 | 
				
			||||||
	UndoTransparency(WebMail->Subject);
 | 
					//	UndoTransparency(WebMail->Subject);
 | 
				
			||||||
	UndoTransparency(WebMail->Body);
 | 
					//	UndoTransparency(WebMail->Body);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MsgLen = strlen(WebMail->Body);
 | 
						MsgLen = strlen(WebMail->Body);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2729,6 +2822,18 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
 | 
				
			||||||
					strcpy(Msg->via, ToUser->HomeBBS);
 | 
										strcpy(Msg->via, ToUser->HomeBBS);
 | 
				
			||||||
					sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
 | 
										sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// No HomeBBS - check WP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										WPRecP WP = LookupWP(Msg->to);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (WP)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											strcpy(Msg->via, WP->first_homebbs);
 | 
				
			||||||
 | 
											sprintf(Prompt, "%s added from WP", Msg->via);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -2881,7 +2986,7 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RMS Express Forms Support
 | 
					// RMS Express Forms Support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char * GetHTMLViewerTemplate(char * FN)
 | 
					char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, j, k, l;
 | 
						int i, j, k, l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2895,6 +3000,7 @@ char * GetHTMLViewerTemplate(char * FN)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (strcmp(FN, Dir->Forms[j]->FileName) == 0)
 | 
								if (strcmp(FN, Dir->Forms[j]->FileName) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									*FormDir = Dir; 
 | 
				
			||||||
				return CheckFile(Dir, FN);
 | 
									return CheckFile(Dir, FN);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -2915,6 +3021,7 @@ char * GetHTMLViewerTemplate(char * FN)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if (_stricmp(FN, SDir->Forms[k]->FileName) == 0)
 | 
										if (_stricmp(FN, SDir->Forms[k]->FileName) == 0)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
 | 
											*FormDir = SDir; 
 | 
				
			||||||
						return CheckFile(SDir, SDir->Forms[k]->FileName);
 | 
											return CheckFile(SDir, SDir->Forms[k]->FileName);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -2978,6 +3085,13 @@ VOID GetPage(struct HTTPConnectionInfo * Session, char * NodeURL)
 | 
				
			||||||
	ptr = strchr(&NodeURL[17], ',');
 | 
						ptr = strchr(&NodeURL[17], ',');
 | 
				
			||||||
	Dir = HtmlFormDirs[DirNo];
 | 
						Dir = HtmlFormDirs[DirNo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (DirNo == -1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*WebMail->RLen = sprintf(WebMail->Reply, "<html><script>alert(\"No Page Selected. \");window.location.href = '/Webmail/NewMsg?%s';</script></html>", Session->Key);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SubDir = strlop(&NodeURL[17], ':');
 | 
						SubDir = strlop(&NodeURL[17], ':');
 | 
				
			||||||
	if (SubDir)
 | 
						if (SubDir)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -3291,6 +3405,13 @@ BOOL ParseXML(WebMailInfo * WebMail, char * XMLOrig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Extract Fields (stuff between < and >. Ignore Whitespace between fields
 | 
						// Extract Fields (stuff between < and >. Ignore Whitespace between fields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Add FormFolder Key with our folder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	XMLKeys->Key = "FormFolder";
 | 
				
			||||||
 | 
					//	XMLKeys->Value = _strdup(FormDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//	XMLKeys++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr1 = strstr(XML, "<xml_file_version>");
 | 
						ptr1 = strstr(XML, "<xml_file_version>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (ptr1)
 | 
						while (ptr1)
 | 
				
			||||||
| 
						 | 
					@ -3394,6 +3515,8 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
 | 
				
			||||||
	size_t varlen, xmllen;
 | 
						size_t varlen, xmllen;
 | 
				
			||||||
	char var[100] = "<";
 | 
						char var[100] = "<";
 | 
				
			||||||
	KeyValues * KeyValue; 
 | 
						KeyValues * KeyValue; 
 | 
				
			||||||
 | 
						struct HtmlFormDir * Dir;
 | 
				
			||||||
 | 
						char FormDir[MAX_PATH];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ParseXML(WebMail, XML))
 | 
						if (ParseXML(WebMail, XML))
 | 
				
			||||||
		ptr = FindXMLVariable(WebMail, "display_form");
 | 
							ptr = FindXMLVariable(WebMail, "display_form");
 | 
				
			||||||
| 
						 | 
					@ -3407,7 +3530,11 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strcpy(FN, ptr);
 | 
						strcpy(FN, ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Form = GetHTMLViewerTemplate(FN);
 | 
						Form = GetHTMLViewerTemplate(FN, &Dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(FormDir, "WMFile/%s/%s/", Dir->FormSet, Dir->DirName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (Form == NULL)
 | 
						if (Form == NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -3423,6 +3550,15 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody}
 | 
						// Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// So is {FormFolder} instread of {var FormFolder}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// As a fiddle replace {FormFolder} with {var Folder} and look for that
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (varptr = stristr(Form, "{FormFolder}"))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							memcpy(varptr, "{var ", 5);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	varptr = stristr(Form, "{MsgOriginalBody}");
 | 
						varptr = stristr(Form, "{MsgOriginalBody}");
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char * temp, * tempsave;
 | 
							char * temp, * tempsave;
 | 
				
			||||||
| 
						 | 
					@ -3562,6 +3698,23 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while (KeyValue->Key)
 | 
							while (KeyValue->Key)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								if (_stricmp(var, "Folder") == 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// Local form folder, not senders
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									xmllen = strlen(FormDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Ok, we have the position of the variable and the substitution text.
 | 
				
			||||||
 | 
									// Copy message up to variable to Result, then copy value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									memcpy(Reply, formptr, varptr - formptr - 5);	// omit "{var "
 | 
				
			||||||
 | 
									Reply += (varptr - formptr - 5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(Reply, FormDir);
 | 
				
			||||||
 | 
									Reply += xmllen;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (_stricmp(var, KeyValue->Key) == 0)
 | 
								if (_stricmp(var, KeyValue->Key) == 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				xmllen = strlen(KeyValue->Value);
 | 
									xmllen = strlen(KeyValue->Value);
 | 
				
			||||||
| 
						 | 
					@ -3577,6 +3730,8 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								KeyValue++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (KeyValue->Key == NULL)
 | 
								if (KeyValue->Key == NULL)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				// Not found in XML
 | 
									// Not found in XML
 | 
				
			||||||
| 
						 | 
					@ -3586,7 +3741,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
 | 
				
			||||||
				sprintf(Err, VarNotFoundMsg, var, "%s");
 | 
									sprintf(Err, VarNotFoundMsg, var, "%s");
 | 
				
			||||||
				return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err);
 | 
									return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			KeyValue++;
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		formptr = endptr + 1;
 | 
							formptr = endptr + 1;
 | 
				
			||||||
| 
						 | 
					@ -4096,6 +4251,18 @@ VOID SaveTemplateMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
 | 
				
			||||||
					strcpy(Msg->via, ToUser->HomeBBS);
 | 
										strcpy(Msg->via, ToUser->HomeBBS);
 | 
				
			||||||
					sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
 | 
										sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// No HomeBBS - Check WP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										WPRecP WP = LookupWP(Msg->to);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
										if (WP)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											strcpy(Msg->via, WP->first_homebbs);
 | 
				
			||||||
 | 
											sprintf(Prompt, "%s added from WP", Msg->via);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
| 
						 | 
					@ -4316,6 +4483,18 @@ VOID BuildMessageFromHTMLInput(struct HTTPConnectionInfo * Session, char * Reply
 | 
				
			||||||
				strcpy(Msg->via, ToUser->HomeBBS);
 | 
									strcpy(Msg->via, ToUser->HomeBBS);
 | 
				
			||||||
				sprintf(Prompt, "%s added from HomeBBS", Msg->via);
 | 
									sprintf(Prompt, "%s added from HomeBBS", Msg->via);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									// No HomeBBS - Check WP
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
									WPRecP WP = LookupWP(Msg->to);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (WP)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										strcpy(Msg->via, WP->first_homebbs);
 | 
				
			||||||
 | 
										sprintf(Prompt, "%s added from WP", Msg->via);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -5446,8 +5625,6 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf("%s\n", MsgFile);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (stat(MsgFile, &STAT) != -1)
 | 
						if (stat(MsgFile, &STAT) != -1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		hFile = fopen(MsgFile, "rb");
 | 
							hFile = fopen(MsgFile, "rb");
 | 
				
			||||||
| 
						 | 
					@ -5464,8 +5641,6 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
 | 
				
			||||||
		MsgBytes[FileSize] = 0;
 | 
							MsgBytes[FileSize] = 0;
 | 
				
			||||||
		fclose(hFile);
 | 
							fclose(hFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		printf("%d %s\n", strlen(MsgBytes), MsgBytes);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return MsgBytes;
 | 
							return MsgBytes;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
| 
						 | 
					@ -5495,6 +5670,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
 | 
				
			||||||
	char * ptr, * ptr1;
 | 
						char * ptr, * ptr1;
 | 
				
			||||||
	char * prompt;
 | 
						char * prompt;
 | 
				
			||||||
	char * var[100];
 | 
						char * var[100];
 | 
				
			||||||
 | 
						int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WebMailInfo * WebMail = Session->WebMail;
 | 
						WebMailInfo * WebMail = Session->WebMail;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					@ -5564,7 +5740,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
 | 
				
			||||||
		ptr = ptr1;
 | 
							ptr = ptr1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(popup, popuphddr, Session->Key, prompt, vars + 1);
 | 
						len = sprintf(popup, popuphddr, Session->Key, prompt, vars + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < vars; i++)
 | 
						for (i = 0; i < vars; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -5573,9 +5749,9 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
 | 
				
			||||||
		if (key == NULL)
 | 
							if (key == NULL)
 | 
				
			||||||
			key = var[i];
 | 
								key = var[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sprintf(popup, "%s <option value='%s'>%s", popup, key, var[i]);
 | 
							len += sprintf(&popup[len], " <option value='%s'>%s", key, var[i]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup);
 | 
						len += sprintf(&popup[len], "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
 | 
						*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
 | 
				
			||||||
	free(SelCopy);
 | 
						free(SelCopy);
 | 
				
			||||||
| 
						 | 
					@ -6134,16 +6310,17 @@ VOID getAttachmentList(struct HTTPConnectionInfo * Session, char * Reply, int *
 | 
				
			||||||
	char popup[10000];
 | 
						char popup[10000];
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	WebMailInfo * WebMail = Session->WebMail;
 | 
						WebMailInfo * WebMail = Session->WebMail;
 | 
				
			||||||
 | 
						int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(popup, popuphddr, Session->Key, WebMail->Files);
 | 
						len = sprintf(popup, popuphddr, Session->Key, WebMail->Files);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < WebMail->Files; i++)
 | 
						for (i = 0; i < WebMail->Files; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(WebMail->FileLen[i] < 100000)
 | 
							if(WebMail->FileLen[i] < 100000)
 | 
				
			||||||
			sprintf(popup, "%s <option value=%d>%s (Len %d)", popup, i + 1, WebMail->FileName[i], WebMail->FileLen[i]);
 | 
								len += sprintf(&popup[len], " <option value=%d>%s (Len %d)", i + 1, WebMail->FileName[i], WebMail->FileLen[i]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup);
 | 
						len += sprintf(&popup[len], "%</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*RLen = sprintf(Reply, "%s", popup);
 | 
						*RLen = sprintf(Reply, "%s", popup);
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
| 
						 | 
					@ -6289,7 +6466,7 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr += sprintf(ptr, "%s</pre> \r\n", ptr);
 | 
						ptr += sprintf(&ptr[strlen(ptr)], "</pre> \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Len = ptr - &OutBuffer[10];
 | 
						Len = ptr - &OutBuffer[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								WinRPR.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								WinRPR.c
									
									
									
									
									
								
							| 
						 | 
					@ -795,7 +795,8 @@ void * WinRPRExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	WritetoConsoleLocal(msg);
 | 
						WritetoConsoleLocal(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->Port = port;
 | 
						TNC->Port = port;
 | 
				
			||||||
	TNC->Hardware = H_WINRPR;
 | 
						TNC->PortRecord = PortEntry;
 | 
				
			||||||
 | 
						TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set up DED addresses for streams
 | 
						// Set up DED addresses for streams
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -811,8 +812,6 @@ void * WinRPRExtInit(EXTPORTDATA *  PortEntry)
 | 
				
			||||||
	PortEntry->PERMITGATEWAY = TRUE;				// Can change ax.25 call on each stream
 | 
						PortEntry->PERMITGATEWAY = TRUE;				// Can change ax.25 call on each stream
 | 
				
			||||||
	PortEntry->SCANCAPABILITIES = NONE;				// Scan Control 3 stage/conlock 
 | 
						PortEntry->SCANCAPABILITIES = NONE;				// Scan Control 3 stage/conlock 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TNC->PortRecord = PortEntry;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
						if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
 | 
				
			||||||
		memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
							memcpy(TNC->NodeCall, MYNODECALL, 10);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					@ -1581,8 +1580,6 @@ TNCRunning:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Send INIT script
 | 
						// Send INIT script
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// VARA needs each command in a separate send
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ptr1 = &TNC->InitScript[0];
 | 
						ptr1 = &TNC->InitScript[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetSemaphore(&Semaphore, 52);
 | 
						GetSemaphore(&Semaphore, 52);
 | 
				
			||||||
| 
						 | 
					@ -1607,7 +1604,6 @@ TNCRunning:
 | 
				
			||||||
			c = *(ptr2 + 1);		// Save next char
 | 
								c = *(ptr2 + 1);		// Save next char
 | 
				
			||||||
			*(ptr2 + 1) = 0;		// Terminate string
 | 
								*(ptr2 + 1) = 0;		// Terminate string
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
//		VARASendCommand(TNC, ptr1, TRUE);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (ptr2)
 | 
							if (ptr2)
 | 
				
			||||||
			*(1 + ptr2++) = c;		// Put char back 
 | 
								*(1 + ptr2++) = c;		// Put char back 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								adif.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								adif.c
									
									
									
									
									
								
							| 
						 | 
					@ -409,8 +409,7 @@ BOOL WriteADIFRecord(ADIF * ADIF)
 | 
				
			||||||
		strcat(Value, "logs/BPQ_CMS_ADIF");
 | 
							strcat(Value, "logs/BPQ_CMS_ADIF");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(Value, "%s_%04d%02d.adi", Value,
 | 
						sprintf(&Value[strlen(Value)], "_%04d%02d.adi", tm->tm_year +1900, tm->tm_mon+1);
 | 
				
			||||||
				tm->tm_year +1900, tm->tm_mon+1);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT.st_size = 0;
 | 
						STAT.st_size = 0;
 | 
				
			||||||
	stat(Value, &STAT);
 | 
						stat(Value, &STAT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										117
									
								
								asmstrucs.h
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								asmstrucs.h
									
									
									
									
									
								
							| 
						 | 
					@ -33,6 +33,7 @@ typedef int (FAR *FARPROCY)();
 | 
				
			||||||
#define L4BUSY	0x80		// BNA - DONT SEND ANY MORE
 | 
					#define L4BUSY	0x80		// BNA - DONT SEND ANY MORE
 | 
				
			||||||
#define L4NAK	0x40		// NEGATIVE RESPONSE FLAG
 | 
					#define L4NAK	0x40		// NEGATIVE RESPONSE FLAG
 | 
				
			||||||
#define L4MORE	0x20		// MORE DATA FOLLOWS - FRAGMENTATION FLAG
 | 
					#define L4MORE	0x20		// MORE DATA FOLLOWS - FRAGMENTATION FLAG
 | 
				
			||||||
 | 
					#define L4COMP	0x10		// BPQ Specific use of spare it - data is compressed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define L4CREQ	1		// CONNECT REQUEST
 | 
					#define L4CREQ	1		// CONNECT REQUEST
 | 
				
			||||||
#define L4CACK	2		// CONNECT ACK
 | 
					#define L4CACK	2		// CONNECT ACK
 | 
				
			||||||
| 
						 | 
					@ -40,7 +41,8 @@ typedef int (FAR *FARPROCY)();
 | 
				
			||||||
#define L4DACK	4		// DISCONNECT ACK
 | 
					#define L4DACK	4		// DISCONNECT ACK
 | 
				
			||||||
#define L4INFO	5		// INFORMATION
 | 
					#define L4INFO	5		// INFORMATION
 | 
				
			||||||
#define L4IACK	6		// INFORMATION ACK
 | 
					#define L4IACK	6		// INFORMATION ACK
 | 
				
			||||||
 | 
					#define L4RESET 7		// Paula's extension
 | 
				
			||||||
 | 
					#define L4CREQX 8		// Paula's extension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char MYCALL[];	// 7 chars, ax.25 format
 | 
					extern char MYCALL[];	// 7 chars, ax.25 format
 | 
				
			||||||
extern char MYALIASTEXT[];	// 6 chars, not null terminated
 | 
					extern char MYALIASTEXT[];	// 6 chars, not null terminated
 | 
				
			||||||
| 
						 | 
					@ -62,15 +64,6 @@ extern int ENDOFDATA;
 | 
				
			||||||
extern int L3LIVES;
 | 
					extern int L3LIVES;
 | 
				
			||||||
extern int NUMBEROFNODES;
 | 
					extern int NUMBEROFNODES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct CMDX
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char String[12];			// COMMAND STRING
 | 
					 | 
				
			||||||
	UCHAR CMDLEN;				// SIGNIFICANT LENGTH
 | 
					 | 
				
			||||||
//	VOID (*CMDPROC)(struct _TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail,  struct CMDX * CMD);// COMMAND PROCESSOR
 | 
					 | 
				
			||||||
	VOID (*CMDPROC)();// COMMAND PROCESSOR
 | 
					 | 
				
			||||||
	size_t CMDFLAG;				// FLAG/VALUE Offset
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct APPLCONFIG
 | 
					struct APPLCONFIG
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -170,6 +163,29 @@ typedef struct _TRANSPORTENTRY
 | 
				
			||||||
	char APPL[16];				// Set if session initiated by an APPL
 | 
						char APPL[16];				// Set if session initiated by an APPL
 | 
				
			||||||
	int L4LIMIT;				// Idle time for this Session
 | 
						int L4LIMIT;				// Idle time for this Session
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//	Now support compressing NetRom Sessions.
 | 
				
			||||||
 | 
						//	We collect as much data as possible before compressing and re-packetizing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int AllowCompress;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned char * unCompress;	// Data being saved to uncompress
 | 
				
			||||||
 | 
						int unCompressLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Sent;
 | 
				
			||||||
 | 
						int SentAfterCompression;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Received;
 | 
				
			||||||
 | 
						int ReceivedAfterExpansion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int segsSent;
 | 
				
			||||||
 | 
						int segsRcvd;
 | 
				
			||||||
 | 
						int segsResent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int NRRID;
 | 
				
			||||||
 | 
						time_t NRRTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Service;			// For Paula's Connnect to Service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} TRANSPORTENTRY;
 | 
					} TRANSPORTENTRY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					@ -195,6 +211,9 @@ typedef struct ROUTE
 | 
				
			||||||
	UCHAR NEIGHBOUR_QUAL;
 | 
						UCHAR NEIGHBOUR_QUAL;
 | 
				
			||||||
	UCHAR NEIGHBOUR_FLAG;		// SET IF 'LOCKED' ROUTE
 | 
						UCHAR NEIGHBOUR_FLAG;		// SET IF 'LOCKED' ROUTE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LOCKEDBYCONFIG 1
 | 
				
			||||||
 | 
					#define	LOCKEDBYSYSOP 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct _LINKTABLE * NEIGHBOUR_LINK;		// POINTER TO LINK FOR THIS NEIGHBOUR
 | 
						struct _LINKTABLE * NEIGHBOUR_LINK;		// POINTER TO LINK FOR THIS NEIGHBOUR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	USHORT NEIGHBOUR_TIME;		// TIME LAST HEARD (HH MM)
 | 
						USHORT NEIGHBOUR_TIME;		// TIME LAST HEARD (HH MM)
 | 
				
			||||||
| 
						 | 
					@ -209,13 +228,15 @@ typedef struct ROUTE
 | 
				
			||||||
	BOOL INP3Node;
 | 
						BOOL INP3Node;
 | 
				
			||||||
	BOOL NoKeepAlive;			// Suppress Keepalive Processing
 | 
						BOOL NoKeepAlive;			// Suppress Keepalive Processing
 | 
				
			||||||
	int	LastConnectAttempt;		// To stop us trying too often
 | 
						int	LastConnectAttempt;		// To stop us trying too often
 | 
				
			||||||
 | 
						int ConnectionAttempts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int Status;			//
 | 
						int Status;			//
 | 
				
			||||||
 | 
						int OldBPQ;				// Set if other end is BPQ sending RIF in mS
 | 
				
			||||||
	int LastRTT;			// Last Value Reported
 | 
						int LastRTT;			// Last Value Reported
 | 
				
			||||||
	int RTT;				// Current	
 | 
						int RTT;				// Current	
 | 
				
			||||||
	int SRTT;				// Smoothed RTT
 | 
						int SRTT;				// Smoothed RTT
 | 
				
			||||||
	int NeighbourSRTT;		// Other End SRTT
 | 
						int NeighbourSRTT;		// Other End SRTT
 | 
				
			||||||
//	int RTTIncrement;		// Average of Ours and Neighbours SRTT in 10 ms
 | 
						int RTTIncrement;		// Average of Ours and Neighbours SRTT in 10 ms - smoothed neighbor transport time (SNTT) in spec
 | 
				
			||||||
	int BCTimer;			// Time to next L3RTT Broadcast
 | 
						int BCTimer;			// Time to next L3RTT Broadcast
 | 
				
			||||||
	int Timeout;			// Lost Response Timer
 | 
						int Timeout;			// Lost Response Timer
 | 
				
			||||||
	int Retries;			// Lost Response Count
 | 
						int Retries;			// Lost Response Count
 | 
				
			||||||
| 
						 | 
					@ -224,6 +245,12 @@ typedef struct ROUTE
 | 
				
			||||||
	int	OtherendsRouteQual;	//	Route quality used by other end.
 | 
						int	OtherendsRouteQual;	//	Route quality used by other end.
 | 
				
			||||||
	int	OtherendLocked;		//	Route quality locked by ROUTES entry.
 | 
						int	OtherendLocked;		//	Route quality locked by ROUTES entry.
 | 
				
			||||||
	int	FirstTimeFlag;		//	Set once quality has been set by direct receive
 | 
						int	FirstTimeFlag;		//	Set once quality has been set by direct receive
 | 
				
			||||||
 | 
						int RemoteMAXRTT;		//	For INP3
 | 
				
			||||||
 | 
						int RemoteMAXHOPS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char * TCPHost;			// For NETROM over TCP
 | 
				
			||||||
 | 
						int TCPPort;
 | 
				
			||||||
 | 
						struct NRTCPSTRUCT * TCPSession;			
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} *PROUTE;
 | 
					} *PROUTE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,6 +260,7 @@ typedef struct ROUTE
 | 
				
			||||||
#define GotRTTResponse 2	// Other end has sent us a RTT Response
 | 
					#define GotRTTResponse 2	// Other end has sent us a RTT Response
 | 
				
			||||||
#define GotRIF 4			// Other end has sent RIF, so is probably an INP3 Node
 | 
					#define GotRIF 4			// Other end has sent RIF, so is probably an INP3 Node
 | 
				
			||||||
							//	(could just be monitoring RTT for some reason
 | 
												//	(could just be monitoring RTT for some reason
 | 
				
			||||||
 | 
					#define SentRTTRequest 8
 | 
				
			||||||
#define SentOurRIF 16		// Set when we have sent a rif for our Call and any ApplCalls
 | 
					#define SentOurRIF 16		// Set when we have sent a rif for our Call and any ApplCalls
 | 
				
			||||||
							//  (only sent when we have seen both a request and response)
 | 
												//  (only sent when we have seen both a request and response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -440,15 +468,18 @@ typedef struct _APPLCALLS
 | 
				
			||||||
//  This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs,
 | 
					//  This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs,
 | 
				
			||||||
//	But if these are significant (say 25% or 100 ms) they will be retransmitted
 | 
					//	But if these are significant (say 25% or 100 ms) they will be retransmitted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// We treat the Routes as an array of 6. First 3 are NODES routes, next 3 are INP3 Routes. This works, but maybe is not ideal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct NR_DEST_ROUTE_ENTRY
 | 
					typedef struct NR_DEST_ROUTE_ENTRY
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ROUTE * ROUT_NEIGHBOUR;	// POINTER TO NEXT NODE IN PATH
 | 
						struct ROUTE * ROUT_NEIGHBOUR;	// POINTER TO NEXT NODE IN PATH
 | 
				
			||||||
	UCHAR ROUT_QUALITY;		// QUALITY
 | 
						UCHAR ROUT_QUALITY;		// QUALITY
 | 
				
			||||||
	UCHAR ROUT_OBSCOUNT;
 | 
						UCHAR ROUT_OBSCOUNT;
 | 
				
			||||||
	UCHAR Padding[5];		// SO Entries are the same length
 | 
						UCHAR ROUT_LOCKED;
 | 
				
			||||||
 | 
						UCHAR Padding[4];		// So Entries are the same length
 | 
				
			||||||
} *PNR_DEST_ROUTE_ENTRY;
 | 
					} *PNR_DEST_ROUTE_ENTRY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct DEST_ROUTE_ENTRY
 | 
					typedef struct INP3_DEST_ROUTE_ENTRY
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ROUTE * ROUT_NEIGHBOUR;	// POINTER TO NEXT NODE IN PATH
 | 
						struct ROUTE * ROUT_NEIGHBOUR;	// POINTER TO NEXT NODE IN PATH
 | 
				
			||||||
	USHORT LastRTT;					// Last Value Reported
 | 
						USHORT LastRTT;					// Last Value Reported
 | 
				
			||||||
| 
						 | 
					@ -467,13 +498,13 @@ typedef struct DEST_LIST
 | 
				
			||||||
	UCHAR DEST_ALIAS[6];	
 | 
						UCHAR DEST_ALIAS[6];	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UCHAR DEST_STATE;			// CONTROL BITS - SETTING UP, ACTIVE ETC	
 | 
						UCHAR DEST_STATE;			// CONTROL BITS - SETTING UP, ACTIVE ETC	
 | 
				
			||||||
 | 
						UCHAR DEST_LOCKED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UCHAR DEST_ROUTE;			// CURRENTY ACTIVE DESTINATION
 | 
						UCHAR DEST_ROUTE;			// CURRENTY ACTIVE DESTINATION
 | 
				
			||||||
	UCHAR INP3FLAGS;
 | 
						UCHAR INP3FLAGS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest
 | 
						struct NR_DEST_ROUTE_ENTRY NRROUTE[3];	// Best 3 NR neighbours for this dest
 | 
				
			||||||
 | 
						struct INP3_DEST_ROUTE_ENTRY INP3ROUTE[3];	// Best 3 INP neighbours for this dest
 | 
				
			||||||
	struct DEST_ROUTE_ENTRY ROUTE[3];	// Best 3 INP neighbours for this dest
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void * DEST_Q;				// QUEUE OF FRAMES FOR THIS DESTINATION
 | 
						void * DEST_Q;				// QUEUE OF FRAMES FOR THIS DESTINATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -677,11 +708,14 @@ typedef struct PORTCONTROL
 | 
				
			||||||
	BOOL NormalizeQuality;		// Normalise Node Qualities
 | 
						BOOL NormalizeQuality;		// Normalise Node Qualities
 | 
				
			||||||
	BOOL IgnoreUnlocked;		// Ignore Unlocked routes
 | 
						BOOL IgnoreUnlocked;		// Ignore Unlocked routes
 | 
				
			||||||
	BOOL INP3ONLY;				// Default to INP3 and disallow NODES
 | 
						BOOL INP3ONLY;				// Default to INP3 and disallow NODES
 | 
				
			||||||
 | 
						BOOL ALLOWINP3;				// Accept INP3 if offered by other end
 | 
				
			||||||
 | 
						BOOL ENABLEINP3;			// Send INP3 RTT probes to discovered neighbours
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG);			// Used for KISSARQ
 | 
						void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG);			// Used for KISSARQ
 | 
				
			||||||
	struct PORTCONTROL * HookPort;
 | 
						struct PORTCONTROL * HookPort;
 | 
				
			||||||
	int PortSlot;				// Index in Port Table
 | 
						int PortSlot;				// Index in Port Table
 | 
				
			||||||
	struct TNCINFO * TNC;		// Associated TNC record
 | 
						struct TNCINFO * TNC;		// Associated TNC record
 | 
				
			||||||
 | 
						int HWType;					// Hardware type of Driver. In here as external apps don't have access to TNC record
 | 
				
			||||||
	int RIGPort;				// Linked port for freq resporting
 | 
						int RIGPort;				// Linked port for freq resporting
 | 
				
			||||||
	unsigned int PERMITTEDAPPLS;	// Appls allowed on this port (generalisation of BBSBANNED)
 | 
						unsigned int PERMITTEDAPPLS;	// Appls allowed on this port (generalisation of BBSBANNED)
 | 
				
			||||||
	char * CTEXT;				// Port Specific CText
 | 
						char * CTEXT;				// Port Specific CText
 | 
				
			||||||
| 
						 | 
					@ -701,6 +735,9 @@ typedef struct PORTCONTROL
 | 
				
			||||||
	UCHAR * TX;					// % Sending
 | 
						UCHAR * TX;					// % Sending
 | 
				
			||||||
	UCHAR * BUSY;				// % Active (Normally DCD active or TX)
 | 
						UCHAR * BUSY;				// % Active (Normally DCD active or TX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Hardware;				// TNC H_TYPE. Copied here for access from application context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}	PORTCONTROLX, *PPORTCONTROL;
 | 
					}	PORTCONTROLX, *PPORTCONTROL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct FULLPORTDATA
 | 
					typedef struct FULLPORTDATA
 | 
				
			||||||
| 
						 | 
					@ -901,6 +938,9 @@ typedef struct _LINKTABLE
 | 
				
			||||||
	VOID *	FRAMES[8];		// FRAMES WAITING ACK
 | 
						VOID *	FRAMES[8];		// FRAMES WAITING ACK
 | 
				
			||||||
	VOID *	RXFRAMES[8];	// Frames received out of sequence
 | 
						VOID *	RXFRAMES[8];	// Frames received out of sequence
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						time_t	LASTFRAMESENT;	// For detecting stuck links
 | 
				
			||||||
 | 
						int		LASTSENTQCOUNT;	//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UCHAR	L2STATE;		// PROCESSING STATE
 | 
						UCHAR	L2STATE;		// PROCESSING STATE
 | 
				
			||||||
	UCHAR	Ver2point2;		// Set if running 2.2
 | 
						UCHAR	Ver2point2;		// Set if running 2.2
 | 
				
			||||||
	USHORT	L2TIMER;		// FRAME RETRY TIMER
 | 
						USHORT	L2TIMER;		// FRAME RETRY TIMER
 | 
				
			||||||
| 
						 | 
					@ -934,6 +974,26 @@ typedef struct _LINKTABLE
 | 
				
			||||||
	time_t ConnectTime;		// For session stats
 | 
						time_t ConnectTime;		// For session stats
 | 
				
			||||||
	int bytesRXed;			// Info bytes only
 | 
						int bytesRXed;			// Info bytes only
 | 
				
			||||||
	int bytesTXed;
 | 
						int bytesTXed;
 | 
				
			||||||
 | 
						int framesRXed;
 | 
				
			||||||
 | 
						int framesTXed;
 | 
				
			||||||
 | 
						int framesResent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//	Now support compressing L2 Sessions.
 | 
				
			||||||
 | 
						//	We collect as much data as possible before compressing and re-packetizing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int AllowCompress;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned char * unCompress;	// Data being saved to uncompress
 | 
				
			||||||
 | 
						int unCompressLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Sent;
 | 
				
			||||||
 | 
						int SentAfterCompression;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int Received;
 | 
				
			||||||
 | 
						int ReceivedAfterExpansion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char ApplName[16];
 | 
				
			||||||
 | 
						time_t lastStatusSentTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} LINKTABLE;
 | 
					} LINKTABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1043,7 +1103,11 @@ struct SEM
 | 
				
			||||||
	int	Gets;
 | 
						int	Gets;
 | 
				
			||||||
	int Rels;
 | 
						int Rels;
 | 
				
			||||||
	DWORD SemProcessID;
 | 
						DWORD SemProcessID;
 | 
				
			||||||
 | 
					#ifdef WIN32
 | 
				
			||||||
	DWORD SemThreadID;
 | 
						DWORD SemThreadID;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						pthread_t SemThreadID;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	int Line;		// caller file and line
 | 
						int Line;		// caller file and line
 | 
				
			||||||
	char File[MAX_PATH];
 | 
						char File[MAX_PATH];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1330,6 +1394,8 @@ struct arp_table_entry
 | 
				
			||||||
//	SOCKET SourceSocket;
 | 
					//	SOCKET SourceSocket;
 | 
				
			||||||
	struct AXIPPORTINFO * PORT;
 | 
						struct AXIPPORTINFO * PORT;
 | 
				
			||||||
	BOOL noUpdate;				// Don't update dest address from incoming packet
 | 
						BOOL noUpdate;				// Don't update dest address from incoming packet
 | 
				
			||||||
 | 
						BOOL replytoSourcePort;		// Update map entry dest port from source port of each packet.
 | 
				
			||||||
 | 
						time_t LastHeard;			// Last Packet received from this ststiom
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1419,6 +1485,25 @@ struct AXIPPORTINFO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct CMDX
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char String[12];			// COMMAND STRING
 | 
				
			||||||
 | 
						UCHAR CMDLEN;				// SIGNIFICANT LENGTH
 | 
				
			||||||
 | 
						VOID (*CMDPROC)(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail,  struct CMDX * CMD);// COMMAND PROCESSOR
 | 
				
			||||||
 | 
					//	VOID (*CMDPROC)();// COMMAND PROCESSOR
 | 
				
			||||||
 | 
						size_t CMDFLAG;				// FLAG/VALUE Offset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct NETROMX
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						 int ServiceNo;
 | 
				
			||||||
 | 
						 char ServiceName[10];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern struct NETROMX SERVICES[];
 | 
				
			||||||
 | 
					extern int NUMBEROFSSERVICES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define Disconnect(stream) SessionControl(stream,2,0)
 | 
					#define Disconnect(stream) SessionControl(stream,2,0)
 | 
				
			||||||
#define Connect(stream) SessionControl(stream,1,0)
 | 
					#define Connect(stream) SessionControl(stream,1,0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								bpq32.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								bpq32.h
									
									
									
									
									
								
							| 
						 | 
					@ -22,6 +22,8 @@ count on BPQ32.dll gets messed up, and the code will not unload cleanly.
 | 
				
			||||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot);
 | 
					struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot);
 | 
				
			||||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
					struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	Returns number of free buffers
 | 
					//	Returns number of free buffers
 | 
				
			||||||
//	(BPQHOST function 7 (part)).
 | 
					//	(BPQHOST function 7 (part)).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										68
									
								
								bpqaxip.c
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								bpqaxip.c
									
									
									
									
									
								
							| 
						 | 
					@ -192,8 +192,8 @@ extern UCHAR BPQDirectory[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int OffsetH, OffsetW;
 | 
					extern int OffsetH, OffsetW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ResolveNames(struct AXIPPORTINFO * PORT);
 | 
					static void ResolveNames(VOID * Param);
 | 
				
			||||||
void OpenSockets(struct AXIPPORTINFO * PORT);
 | 
					void OpenSockets(VOID * Param);
 | 
				
			||||||
void CloseSockets(struct AXIPPORTINFO * PORT);
 | 
					void CloseSockets(struct AXIPPORTINFO * PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -204,7 +204,7 @@ int Update_MH_KeepAlive(struct AXIPPORTINFO * PORT, struct in_addr ipad, char pr
 | 
				
			||||||
unsigned short int compute_crc(unsigned char *buf,int l);
 | 
					unsigned short int compute_crc(unsigned char *buf,int l);
 | 
				
			||||||
unsigned int find_arp(unsigned char * call);
 | 
					unsigned int find_arp(unsigned char * call);
 | 
				
			||||||
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name,
 | 
					BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name,
 | 
				
			||||||
int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate);
 | 
							int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort);
 | 
				
			||||||
BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len);
 | 
					BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len);
 | 
				
			||||||
BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
 | 
					BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
 | 
				
			||||||
static BOOL ReadConfigFile(int Port);
 | 
					static BOOL ReadConfigFile(int Port);
 | 
				
			||||||
| 
						 | 
					@ -213,7 +213,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT);
 | 
				
			||||||
BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
 | 
					BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
 | 
				
			||||||
int DumpFrameInHex(unsigned char * msg, int len);
 | 
					int DumpFrameInHex(unsigned char * msg, int len);
 | 
				
			||||||
VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen);
 | 
					VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen);
 | 
				
			||||||
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr);
 | 
					BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort);
 | 
				
			||||||
int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock);
 | 
					int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock);
 | 
				
			||||||
int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
 | 
					int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
 | 
				
			||||||
int	KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
 | 
					int	KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
 | 
				
			||||||
| 
						 | 
					@ -221,7 +221,7 @@ int	KissDecode(UCHAR * inbuff, int len);
 | 
				
			||||||
int Socket_Accept(int SocketId);
 | 
					int Socket_Accept(int SocketId);
 | 
				
			||||||
int Socket_Connect(int SocketId, int Error);
 | 
					int Socket_Connect(int SocketId, int Error);
 | 
				
			||||||
int Socket_Data(int sock, int error, int eventcode);
 | 
					int Socket_Data(int sock, int error, int eventcode);
 | 
				
			||||||
VOID TCPConnectThread(struct arp_table_entry * arp);
 | 
					VOID TCPConnectThread(VOID * Param);
 | 
				
			||||||
VOID __cdecl Debugprintf(const char * format, ...);
 | 
					VOID __cdecl Debugprintf(const char * format, ...);
 | 
				
			||||||
VOID __cdecl Consoleprintf(const char * format, ...);
 | 
					VOID __cdecl Consoleprintf(const char * format, ...);
 | 
				
			||||||
BOOL OpenListeningSocket(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp);
 | 
					BOOL OpenListeningSocket(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp);
 | 
				
			||||||
| 
						 | 
					@ -429,7 +429,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						if (PORT->Checkifcanreply)
 | 
											if (PORT->Checkifcanreply)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							if (CheckSourceisResolvable(PORT, call, 0, &RXaddr))
 | 
												if (CheckSourceisResolvable(PORT, call, 0, &RXaddr, 0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
								return 1;
 | 
													return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -437,7 +437,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
 | 
				
			||||||
								// Can't reply. If AutoConfig is set, add to table and accept, else reject
 | 
													// Can't reply. If AutoConfig is set, add to table and accept, else reject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
								if (PORT->AutoAddARP)
 | 
													if (PORT->AutoAddARP)
 | 
				
			||||||
									return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0);
 | 
														return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0, 0);
 | 
				
			||||||
								else
 | 
													else
 | 
				
			||||||
								{
 | 
													{
 | 
				
			||||||
									char From[11] = "|";
 | 
														char From[11] = "|";
 | 
				
			||||||
| 
						 | 
					@ -536,7 +536,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (PORT->Checkifcanreply)
 | 
										if (PORT->Checkifcanreply)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr))
 | 
											if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr, PORT->udpport[i]))
 | 
				
			||||||
							return 1;
 | 
												return 1;
 | 
				
			||||||
						else
 | 
											else
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
| 
						 | 
					@ -547,10 +547,10 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
 | 
				
			||||||
								{
 | 
													{
 | 
				
			||||||
									char Addr[80];
 | 
														char Addr[80];
 | 
				
			||||||
									Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE);
 | 
														Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE);
 | 
				
			||||||
									return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0);		
 | 
														return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0, 0);		
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
								else
 | 
													else
 | 
				
			||||||
									return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0);		
 | 
														return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0, 0);		
 | 
				
			||||||
							else
 | 
												else
 | 
				
			||||||
							{
 | 
												{
 | 
				
			||||||
								char From[11] = "|";
 | 
													char From[11] = "|";
 | 
				
			||||||
| 
						 | 
					@ -692,7 +692,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
 | 
				
			||||||
		else 
 | 
							else 
 | 
				
			||||||
			Consoleprintf("Failed to reread config file - leaving config unchanged");
 | 
								Consoleprintf("Failed to reread config file - leaving config unchanged");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		_beginthread(OpenSockets, 0, PORT );
 | 
							_beginthread(OpenSockets, 0, PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		GetAXIPCache(PORT);
 | 
							GetAXIPCache(PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Seelcte source port by choosing right socket
 | 
						// Select source port by choosing right socket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// First Set Default for Protocol
 | 
						// First Set Default for Protocol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -844,8 +844,9 @@ int InitAXIP(int Port)
 | 
				
			||||||
	return (TRUE);	
 | 
						return (TRUE);	
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void OpenSockets(struct AXIPPORTINFO * PORT)
 | 
					void OpenSockets(void * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[255];
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
| 
						 | 
					@ -1343,6 +1344,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
 | 
				
			||||||
	char axcall[7];
 | 
						char axcall[7];
 | 
				
			||||||
	BOOL UDPFlag, BCFlag;
 | 
						BOOL UDPFlag, BCFlag;
 | 
				
			||||||
	struct AXIPPORTINFO * PORT;
 | 
						struct AXIPPORTINFO * PORT;
 | 
				
			||||||
 | 
						int useSourcePort = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i=1; i <= MAXBPQPORTS; i++)
 | 
						for (i=1; i <= MAXBPQPORTS; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -1391,7 +1393,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (convtoax25(call,axcall,&calllen))
 | 
									if (convtoax25(call,axcall,&calllen))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0);
 | 
										add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0, useSourcePort);
 | 
				
			||||||
					ResolveDelay = 2;
 | 
										ResolveDelay = 2;
 | 
				
			||||||
					return(DestroyWindow(hWnd));
 | 
										return(DestroyWindow(hWnd));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -1527,8 +1529,9 @@ static void CreateResolverWindow(struct AXIPPORTINFO * PORT)
 | 
				
			||||||
extern HWND hWndPopup;
 | 
					extern HWND hWndPopup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ResolveNames(struct AXIPPORTINFO * PORT)
 | 
					static void ResolveNames(VOID * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
 | 
				
			||||||
	int count = 0;
 | 
						int count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PORT->ResolveNamesThreadId = GetCurrentThreadId();		// Detect if another started
 | 
						PORT->ResolveNamesThreadId = GetCurrentThreadId();		// Detect if another started
 | 
				
			||||||
| 
						 | 
					@ -2147,6 +2150,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
 | 
				
			||||||
	int Interval;
 | 
						int Interval;
 | 
				
			||||||
	int noUpdate=FALSE;
 | 
						int noUpdate=FALSE;
 | 
				
			||||||
	int TCPMode;
 | 
						int TCPMode;
 | 
				
			||||||
 | 
						int useSourcePort = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ptr = strtok(buf, " \t\n\r");
 | 
						ptr = strtok(buf, " \t\n\r");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2234,6 +2238,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
 | 
				
			||||||
		bcflag=0;
 | 
							bcflag=0;
 | 
				
			||||||
		TCPMode=0;
 | 
							TCPMode=0;
 | 
				
			||||||
		SourcePort = 0;
 | 
							SourcePort = 0;
 | 
				
			||||||
 | 
							useSourcePort = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//		Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params
 | 
					//		Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params
 | 
				
			||||||
| 
						 | 
					@ -2264,7 +2269,14 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
				if (p_udpport == NULL) return (FALSE);
 | 
									if (p_udpport == NULL) return (FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				port = atoi(p_udpport);
 | 
									if (_stricmp(p_udpport,"FROMPORT") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										useSourcePort = TRUE;
 | 
				
			||||||
 | 
										port = 0;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										port = atoi(p_udpport);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				p_UDP = strtok(NULL, " \t\n\r");
 | 
									p_UDP = strtok(NULL, " \t\n\r");
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -2327,7 +2339,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
 | 
				
			||||||
			if (SourcePort == 0)
 | 
								if (SourcePort == 0)
 | 
				
			||||||
				SourcePort = port;
 | 
									SourcePort = port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate);
 | 
								add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate, useSourcePort);
 | 
				
			||||||
			return (TRUE);
 | 
								return (TRUE);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}		// End of Process MAP
 | 
						}		// End of Process MAP
 | 
				
			||||||
| 
						 | 
					@ -2438,7 +2450,7 @@ BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call,int * calllen
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port,
 | 
					BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port,
 | 
				
			||||||
				   UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate)
 | 
									   UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct arp_table_entry * arp;
 | 
						struct arp_table_entry * arp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2457,7 +2469,8 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	arp->PORT = PORT;
 | 
						arp->PORT = PORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (port == 0) PORT->needip = 1;			// Enable Raw IP Mode
 | 
						if (port == 0 && arp->replytoSourcePort == 0)
 | 
				
			||||||
 | 
							PORT->needip = 1;			// Enable Raw IP Mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	arp->ResolveFlag=TRUE;
 | 
						arp->ResolveFlag=TRUE;
 | 
				
			||||||
	PORT->NeedResolver=TRUE;
 | 
						PORT->NeedResolver=TRUE;
 | 
				
			||||||
| 
						 | 
					@ -2476,6 +2489,7 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
 | 
				
			||||||
	arp->TCPMode = TCPFlag;
 | 
						arp->TCPMode = TCPFlag;
 | 
				
			||||||
	arp->noUpdate = noUpdate;
 | 
						arp->noUpdate = noUpdate;
 | 
				
			||||||
	PORT->arp_table_len++;
 | 
						PORT->arp_table_len++;
 | 
				
			||||||
 | 
						arp->replytoSourcePort = useSourcePort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70)
 | 
						if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70)
 | 
				
			||||||
		PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70;
 | 
							PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70;
 | 
				
			||||||
| 
						 | 
					@ -2576,7 +2590,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT)
 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr)
 | 
					BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Makes sure we can reply to call before accepting message
 | 
						// Makes sure we can reply to call before accepting message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2606,10 +2620,17 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port,
 | 
				
			||||||
					struct sockaddr_in * SA = rxaddr;
 | 
										struct sockaddr_in * SA = rxaddr;
 | 
				
			||||||
					memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4);
 | 
										memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				//	Dont think I should update port
 | 
									//	Dont think I should update port unless using source port for dest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				//arp->port = Port;
 | 
									if (arp->replytoSourcePort)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										arp->port = FromPort;
 | 
				
			||||||
 | 
										arp->destaddr.sin_port = htons(arp->port);
 | 
				
			||||||
 | 
										if (arp->SourcePort == 0)
 | 
				
			||||||
 | 
											arp->SourcePort = ToPort;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								arp->LastHeard = time(NULL);
 | 
				
			||||||
			return 1;		// Ok to process
 | 
								return 1;		// Ok to process
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		index++;
 | 
							index++;
 | 
				
			||||||
| 
						 | 
					@ -2977,8 +2998,9 @@ int	KissDecode(UCHAR * inbuff, int len)
 | 
				
			||||||
	return txptr;
 | 
						return txptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID TCPConnectThread(struct arp_table_entry * arp)
 | 
					VOID TCPConnectThread(void * Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct arp_table_entry * arp = (struct arp_table_entry *)Param;
 | 
				
			||||||
	char Msg[255];
 | 
						char Msg[255];
 | 
				
			||||||
	int err, i;
 | 
						int err, i;
 | 
				
			||||||
	u_long param=1;
 | 
						u_long param=1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,6 +73,9 @@
 | 
				
			||||||
//.25
 | 
					//.25
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//  Increase size of status display buffers (7)
 | 
					//  Increase size of status display buffers (7)
 | 
				
			||||||
 | 
					//	Allow sending BEL (CTRL/G) (79)
 | 
				
			||||||
 | 
					//	Fix sending BEL (CTRL/G) (81)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "BPQChat.h"
 | 
					#include "BPQChat.h"
 | 
				
			||||||
#include "Dbghelp.h"
 | 
					#include "Dbghelp.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								bpqmail.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								bpqmail.h
									
									
									
									
									
								
							| 
						 | 
					@ -290,6 +290,9 @@ typedef struct ConnectionInfo_S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct ConnectionInfo_S * SysopChatStream;			// Stream sysop is chatting to
 | 
						struct ConnectionInfo_S * SysopChatStream;			// Stream sysop is chatting to
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int bytesSent;
 | 
				
			||||||
 | 
						int bytesRxed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} ConnectionInfo, CIRCUIT;
 | 
					} ConnectionInfo, CIRCUIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Flags Equates
 | 
					// Flags Equates
 | 
				
			||||||
| 
						 | 
					@ -336,11 +339,13 @@ typedef struct ConnectionInfo_S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct FBBRestartData
 | 
					struct FBBRestartData
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct MsgInfo * TempMsg;		// Header while message is being received
 | 
						char Call[10];
 | 
				
			||||||
	struct UserInfo * UserPointer;
 | 
						char bid[13];
 | 
				
			||||||
 | 
						int length;
 | 
				
			||||||
	UCHAR * MailBuffer;				// Mail Message being received
 | 
						UCHAR * MailBuffer;				// Mail Message being received
 | 
				
			||||||
	int MailBufferSize;				// Total Malloc'ed size. Actual size in in Msg Struct
 | 
						int MailBufferSize;				// Total Malloc'ed size. Actual size in in Msg Struct
 | 
				
			||||||
	int Count;						// Give up if too many restarts
 | 
						int Count;						// Give up if too many restarts
 | 
				
			||||||
 | 
						time_t TimeCreated;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so
 | 
					//	We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so
 | 
				
			||||||
| 
						 | 
					@ -1387,6 +1392,7 @@ BOOL CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct	BBSFo
 | 
				
			||||||
BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct	BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements);
 | 
					BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct	BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements);
 | 
				
			||||||
int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo);
 | 
					int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo);
 | 
				
			||||||
int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS);
 | 
					int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS);
 | 
				
			||||||
 | 
					void SaveRestartData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID ReRouteMessages();
 | 
					VOID ReRouteMessages();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2788
									
								
								cMain-skigdebian.c
									
									
									
									
									
								
							
							
						
						
									
										2788
									
								
								cMain-skigdebian.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										200
									
								
								cMain.c
									
									
									
									
									
								
							
							
						
						
									
										200
									
								
								cMain.c
									
									
									
									
									
								
							| 
						 | 
					@ -17,6 +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
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//	C replacement for Main.asm
 | 
					//	C replacement for Main.asm
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					@ -51,16 +52,33 @@ int CanPortDigi(int Port);
 | 
				
			||||||
int	KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
 | 
					int	KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
 | 
				
			||||||
void MQTTTimer();
 | 
					void MQTTTimer();
 | 
				
			||||||
void SaveMH();
 | 
					void SaveMH();
 | 
				
			||||||
 | 
					VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
 | 
				
			||||||
 | 
					VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
 | 
				
			||||||
 | 
					void WritePacketLogThread(void * param);
 | 
				
			||||||
 | 
					void hookNodeStarted();
 | 
				
			||||||
 | 
					void hookNodeRunning();
 | 
				
			||||||
 | 
					void APIL2Trace(struct _MESSAGE * Message, char Dirn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "configstructs.h"
 | 
					#include "configstructs.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct CONFIGTABLE xxcfg;
 | 
					extern struct CONFIGTABLE xxcfg;
 | 
				
			||||||
extern BOOL needAIS;
 | 
					extern BOOL needAIS;
 | 
				
			||||||
extern int needADSB;
 | 
					extern int needADSB;
 | 
				
			||||||
 | 
					extern int EnableOARCAPI;
 | 
				
			||||||
 | 
					extern SOCKET NodeAPISocket;
 | 
				
			||||||
 | 
					extern int nodeStartedSent;
 | 
				
			||||||
 | 
					extern SOCKADDR_IN UDPreportdest;
 | 
				
			||||||
 | 
					extern char NodeAPIServer[80];
 | 
				
			||||||
 | 
					extern int NodeAPIPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					time_t LastNodeStatus = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int nodeStatusTimer = 20 * 60;		// 20 mins
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct PORTCONFIG * PortRec;
 | 
					struct PORTCONFIG * PortRec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RNRSET 0x2				// RNR RECEIVED FROM OTHER END
 | 
					#define RNRSET 0x2				// RNR RECEIVED FROM OTHER END
 | 
				
			||||||
 | 
					#define	PFBIT 0x10		// POLL/FINAL BIT IN CONTROL BYTE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	STATION INFORMATION
 | 
					//	STATION INFORMATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,6 +157,16 @@ int NODE = 1;					// INCLUDE SWITCH SUPPORT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int FULL_CTEXT = 1;				// CTEXT ON ALL CONNECTS IF NZ
 | 
					int FULL_CTEXT = 1;				// CTEXT ON ALL CONNECTS IF NZ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int L4Compress = 0;
 | 
				
			||||||
 | 
					int L4CompMaxframe = 3;
 | 
				
			||||||
 | 
					int L4CompPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int L2Compress = 0;
 | 
				
			||||||
 | 
					int L2CompMaxframe = 3;
 | 
				
			||||||
 | 
					int L2CompPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int PREFERINP3ROUTES = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL LogL4Connects = FALSE;
 | 
					BOOL LogL4Connects = FALSE;
 | 
				
			||||||
BOOL LogAllConnects = FALSE;
 | 
					BOOL LogAllConnects = FALSE;
 | 
				
			||||||
BOOL AUTOSAVEMH = TRUE;
 | 
					BOOL AUTOSAVEMH = TRUE;
 | 
				
			||||||
| 
						 | 
					@ -156,6 +184,8 @@ char MQTT_PASS[80] = "";
 | 
				
			||||||
int MQTT_Connecting = 0;
 | 
					int MQTT_Connecting = 0;
 | 
				
			||||||
int MQTT_Connected = 0;
 | 
					int MQTT_Connected = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int PoolBuilt = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//TNCTABLE	DD	0
 | 
					//TNCTABLE	DD	0
 | 
				
			||||||
//NUMBEROFSTREAMS	DD	0
 | 
					//NUMBEROFSTREAMS	DD	0
 | 
				
			||||||
| 
						 | 
					@ -164,6 +194,7 @@ extern VOID * ENDPOOL;
 | 
				
			||||||
extern void * APPL_Q;				// Queue of frames for APRS Appl
 | 
					extern void * APPL_Q;				// Queue of frames for APRS Appl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BOOL APRSActive;
 | 
					extern BOOL APRSActive;
 | 
				
			||||||
 | 
					extern int DEBUGINP3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BPQHOSTSTREAMS	64
 | 
					#define BPQHOSTSTREAMS	64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -177,9 +208,12 @@ BPQVECSTRUC * TELNETMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS];
 | 
				
			||||||
BPQVECSTRUC * AGWMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 1];
 | 
					BPQVECSTRUC * AGWMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 1];
 | 
				
			||||||
BPQVECSTRUC * APRSMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 2];
 | 
					BPQVECSTRUC * APRSMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 2];
 | 
				
			||||||
BPQVECSTRUC * IPHOSTVECTORPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 3];
 | 
					BPQVECSTRUC * IPHOSTVECTORPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 3];
 | 
				
			||||||
 | 
					BPQVECSTRUC * FILEMONVECTOR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int BPQVECLENGTH = sizeof(BPQVECSTRUC);
 | 
					int BPQVECLENGTH = sizeof(BPQVECSTRUC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int MONTOFILEFLAG = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int NODEORDER = 0;
 | 
					int NODEORDER = 0;
 | 
				
			||||||
UCHAR LINKEDFLAG = 0;
 | 
					UCHAR LINKEDFLAG = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,6 +267,8 @@ int CFLAG = 0;						// C =HOST Command
 | 
				
			||||||
VOID * IDMSG_Q = NULL;				// ID/BEACONS WAITING TO BE SENT
 | 
					VOID * IDMSG_Q = NULL;				// ID/BEACONS WAITING TO BE SENT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int	NODESINPROGRESS = 0;
 | 
					int	NODESINPROGRESS = 0;
 | 
				
			||||||
 | 
					int NODESToOnePort = 0;				// Set to port num to send NODES to only one port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID * CURRENTNODE = NULL;			// NEXT _NODE TO SEND
 | 
					VOID * CURRENTNODE = NULL;			// NEXT _NODE TO SEND
 | 
				
			||||||
VOID * DESTHEADER = NULL;			// HEAD OF SORTED NODES CHAIN
 | 
					VOID * DESTHEADER = NULL;			// HEAD OF SORTED NODES CHAIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -288,8 +324,8 @@ VOID LINKINIT(PEXTPORTDATA PORTVEC)
 | 
				
			||||||
VOID LINKTX(PEXTPORTDATA PORTVEC, PMESSAGE Buffer)
 | 
					VOID LINKTX(PEXTPORTDATA PORTVEC, PMESSAGE Buffer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	//	LOOP BACK TO SWITCH
 | 
						//	LOOP BACK TO SWITCH
 | 
				
			||||||
	struct _LINKTABLE * LINK;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct _LINKTABLE * LINK;
 | 
				
			||||||
	LINK = Buffer->Linkptr;
 | 
						LINK = Buffer->Linkptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (LINK)
 | 
						if (LINK)
 | 
				
			||||||
| 
						 | 
					@ -822,6 +858,37 @@ BOOL Start()
 | 
				
			||||||
	MQTT_PORT = cfg->C_MQTT_PORT;
 | 
						MQTT_PORT = cfg->C_MQTT_PORT;
 | 
				
			||||||
	strcpy(MQTT_USER, cfg->C_MQTT_USER);
 | 
						strcpy(MQTT_USER, cfg->C_MQTT_USER);
 | 
				
			||||||
	strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
 | 
						strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
 | 
				
			||||||
 | 
						L4Compress = cfg->C_L4Compress;
 | 
				
			||||||
 | 
						L4CompMaxframe = cfg->C_L4CompMaxframe;
 | 
				
			||||||
 | 
						L4CompPaclen = cfg->C_L4CompPaclen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (L4CompMaxframe < 1 || L4CompMaxframe > 16)
 | 
				
			||||||
 | 
							L4CompMaxframe = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (L4CompPaclen < 64 || L4CompPaclen > 236)
 | 
				
			||||||
 | 
							L4CompPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						L2Compress = cfg->C_L2Compress;
 | 
				
			||||||
 | 
						L2CompMaxframe = cfg->C_L2CompMaxframe;
 | 
				
			||||||
 | 
						L2CompPaclen = cfg->C_L2CompPaclen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (L2CompMaxframe < 1 || L2CompMaxframe > 16)
 | 
				
			||||||
 | 
							L2CompMaxframe = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (L2CompPaclen < 64 || L2CompPaclen > 236)
 | 
				
			||||||
 | 
							L2CompPaclen = 236;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PREFERINP3ROUTES = cfg->C_PREFERINP3ROUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cfg->C_DEBUGINP3)
 | 
				
			||||||
 | 
							DEBUGINP3 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						EnableOARCAPI = cfg->C_OARCAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cfg->C_OnlyVer2point0)
 | 
				
			||||||
 | 
							SUPPORT2point2 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
	// Get pointers to PASSWORD and APPL1 commands
 | 
						// Get pointers to PASSWORD and APPL1 commands
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -948,6 +1015,8 @@ BOOL Start()
 | 
				
			||||||
		PORT->NormalizeQuality = !PortRec->NoNormalize;
 | 
							PORT->NormalizeQuality = !PortRec->NoNormalize;
 | 
				
			||||||
		PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED;
 | 
							PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED;
 | 
				
			||||||
		PORT->INP3ONLY = PortRec->INP3ONLY;
 | 
							PORT->INP3ONLY = PortRec->INP3ONLY;
 | 
				
			||||||
 | 
							PORT->ALLOWINP3 = PortRec->AllowINP3;
 | 
				
			||||||
 | 
							PORT->ENABLEINP3 = PortRec->EnableINP3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
 | 
							PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -972,6 +1041,9 @@ BOOL Start()
 | 
				
			||||||
		PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN;
 | 
							PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN;
 | 
				
			||||||
		PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST;
 | 
							PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
							if (PORT->QUAL_ADJUST < 0 || PORT->QUAL_ADJUST > 100)
 | 
				
			||||||
 | 
								PORT->QUAL_ADJUST = 100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		PORT->DIGIFLAG = PortRec->DIGIFLAG;
 | 
							PORT->DIGIFLAG = PortRec->DIGIFLAG;
 | 
				
			||||||
		if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT))
 | 
							if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT))
 | 
				
			||||||
			PORT->DIGIPORT = PortRec->DIGIPORT;
 | 
								PORT->DIGIPORT = PortRec->DIGIPORT;
 | 
				
			||||||
| 
						 | 
					@ -1319,13 +1391,13 @@ BOOL Start()
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		PORT = GetPortTableEntryFromPortNum(ROUTE->NEIGHBOUR_PORT);
 | 
							PORT = GetPortTableEntryFromPortNum(ROUTE->NEIGHBOUR_PORT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (Rcfg->pwind & 0x40)
 | 
							if (Rcfg->nokeepalives)
 | 
				
			||||||
			ROUTE->NoKeepAlive = 1;
 | 
								ROUTE->NoKeepAlive = 1;
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			if (PORT != NULL)
 | 
								if (PORT != NULL)
 | 
				
			||||||
				ROUTE->NoKeepAlive = PORT->PortNoKeepAlive;
 | 
									ROUTE->NoKeepAlive = PORT->PortNoKeepAlive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (Rcfg->pwind & 0x80 || (PORT && PORT->INP3ONLY))
 | 
							if (Rcfg->inp3 || (PORT && PORT->INP3ONLY))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ROUTE->INP3Node = 1;
 | 
								ROUTE->INP3Node = 1;
 | 
				
			||||||
			ROUTE->NoKeepAlive = 0;			// Cant have INP3 and NOKEEPALIVES
 | 
								ROUTE->NoKeepAlive = 0;			// Cant have INP3 and NOKEEPALIVES
 | 
				
			||||||
| 
						 | 
					@ -1338,7 +1410,13 @@ BOOL Start()
 | 
				
			||||||
		ROUTE->NBOUR_PACLEN = Rcfg->ppacl;
 | 
							ROUTE->NBOUR_PACLEN = Rcfg->ppacl;
 | 
				
			||||||
		ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual;
 | 
							ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ROUTE->NEIGHBOUR_FLAG = 1;			// Locked
 | 
							ROUTE->NEIGHBOUR_FLAG = LOCKEDBYCONFIG;			// Locked
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Rcfg->tcphost)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ROUTE->TCPHost = Rcfg->tcphost;
 | 
				
			||||||
 | 
								ROUTE->TCPPort = Rcfg->tcpport;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		Rcfg++;
 | 
							Rcfg++;
 | 
				
			||||||
		ROUTE++;
 | 
							ROUTE++;
 | 
				
			||||||
| 
						 | 
					@ -1429,6 +1507,8 @@ BOOL Start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ENDBUFFERPOOL = NEXTFREEDATA;
 | 
						ENDBUFFERPOOL = NEXTFREEDATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PoolBuilt = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//	Copy Bridge Map
 | 
						//	Copy Bridge Map
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1515,8 +1595,34 @@ BOOL Start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	upnpInit();
 | 
						upnpInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Start Monitor to file thread
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						_beginthread(WritePacketLogThread, 0, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lastSaveSecs = CurrentSecs = lastSlowSecs = time(NULL);
 | 
						lastSaveSecs = CurrentSecs = lastSlowSecs = time(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if EnableOARCAPI set try to resolve host here so we can send Node up event before anything else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (EnableOARCAPI)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							struct hostent * HostEnt3;
 | 
				
			||||||
 | 
							HostEnt3 = gethostbyname(NodeAPIServer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							NodeAPISocket = socket(AF_INET, SOCK_DGRAM, 0);
 | 
				
			||||||
 | 
							UDPreportdest.sin_family = AF_INET;
 | 
				
			||||||
 | 
							UDPreportdest.sin_port = htons(NodeAPIPort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (HostEnt3)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								memcpy(&UDPreportdest.sin_addr.s_addr,HostEnt3->h_addr,4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								hookNodeStarted();
 | 
				
			||||||
 | 
								nodeStartedSent = 1;
 | 
				
			||||||
 | 
								LastNodeStatus = time(NULL);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1546,6 +1652,7 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
 | 
				
			||||||
	struct ROUTE * ROUTE = NEIGHBOURS;
 | 
						struct ROUTE * ROUTE = NEIGHBOURS;
 | 
				
			||||||
	struct ROUTE * FIRSTSPARE = NULL;
 | 
						struct ROUTE * FIRSTSPARE = NULL;
 | 
				
			||||||
	int n = MAXNEIGHBOURS;
 | 
						int n = MAXNEIGHBOURS;
 | 
				
			||||||
 | 
						char Normcall[10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (n--)
 | 
						while (n--)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -1558,6 +1665,10 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
 | 
				
			||||||
			ROUTE++;
 | 
								ROUTE++;
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
 | 
							if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			*REQROUTE = ROUTE;
 | 
								*REQROUTE = ROUTE;
 | 
				
			||||||
| 
						 | 
					@ -1843,12 +1954,11 @@ VOID ReadNodes()
 | 
				
			||||||
			if (ptr == NULL) continue;
 | 
								if (ptr == NULL) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// I don't thinlk we should load locked flag from save file - only from config
 | 
								// I don't thinlk we should load locked flag from save file - only from config
 | 
				
			||||||
 | 
								// Now (2025) have two locked flags, from config or by sysop. Latter is saved and restored
 | 
				
			||||||
			// But need to parse it until I stop saving it
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (ptr[0] == '!')
 | 
								if (ptr[0] == '!')
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
//				ROUTE->NEIGHBOUR_FLAG = 1;			// LOCKED ROUTE
 | 
									ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP;			// LOCKED ROUTE
 | 
				
			||||||
				ptr = strtok_s(NULL, seps, &Context);
 | 
									ptr = strtok_s(NULL, seps, &Context);
 | 
				
			||||||
				if (ptr == NULL) continue;
 | 
									if (ptr == NULL) continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1865,7 +1975,7 @@ VOID ReadNodes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
 | 
									memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				ROUTE->NEIGHBOUR_FLAG = 1;			// LOCKED ROUTE - Digi'ed routes must be locked
 | 
									ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP;			// LOCKED ROUTE - Digi'ed routes must be locked
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				ptr = strtok_s(NULL, seps, &Context);
 | 
									ptr = strtok_s(NULL, seps, &Context);
 | 
				
			||||||
				if (ptr == NULL) continue;
 | 
									if (ptr == NULL) continue;
 | 
				
			||||||
| 
						 | 
					@ -1921,6 +2031,14 @@ VOID ReadNodes()
 | 
				
			||||||
			if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0);		// Not LOCKED ROUTE
 | 
								if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0);		// Not LOCKED ROUTE
 | 
				
			||||||
				ROUTE->OtherendsRouteQual = atoi(ptr);
 | 
									ROUTE->OtherendsRouteQual = atoi(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ptr = strtok_s(NULL, seps, &Context);	// INP3
 | 
				
			||||||
 | 
								if (ptr == NULL) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (ptr[0] == '!')
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP;			// LOCKED ROUTE
 | 
				
			||||||
 | 
									ptr = strtok_s(NULL, seps, &Context);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2098,6 +2216,12 @@ VOID TIMERINTERRUPT()
 | 
				
			||||||
		if (MQTT)
 | 
							if (MQTT)
 | 
				
			||||||
			MQTTTimer();
 | 
								MQTTTimer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (LastNodeStatus && (time(NULL) - LastNodeStatus) > nodeStatusTimer)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								LastNodeStatus = time(NULL);
 | 
				
			||||||
 | 
								hookNodeRunning();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
		if (QCOUNT < 200)
 | 
							if (QCOUNT < 200)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -2153,6 +2277,10 @@ VOID TIMERINTERRUPT()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Message = (struct _MESSAGE *)Buffer;
 | 
							Message = (struct _MESSAGE *)Buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(NodeAPISocket)
 | 
				
			||||||
 | 
								APIL2Trace(Message, 'T');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Message->PORT |= 0x80;			// Set TX Bit
 | 
							Message->PORT |= 0x80;			// Set TX Bit
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		BPQTRACE(Message, FALSE);		// Dont send TX'ed frames to APRS
 | 
							BPQTRACE(Message, FALSE);		// Dont send TX'ed frames to APRS
 | 
				
			||||||
| 
						 | 
					@ -2265,6 +2393,9 @@ L2Packet:
 | 
				
			||||||
			if (MQTT && PORT->PROTOCOL == 0)
 | 
								if (MQTT && PORT->PROTOCOL == 0)
 | 
				
			||||||
				MQTTKISSRX(Buffer);
 | 
									MQTTKISSRX(Buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(NodeAPISocket &&PORT->PROTOCOL == 0)
 | 
				
			||||||
 | 
									APIL2Trace(Message, 'R');
 | 
				
			||||||
 | 
								
 | 
				
			||||||
			// Bridge if requested
 | 
								// Bridge if requested
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for (toPort = 1; toPort <= MaxBPQPortNo; toPort++)
 | 
								for (toPort = 1; toPort <= MaxBPQPortNo; toPort++)
 | 
				
			||||||
| 
						 | 
					@ -2449,6 +2580,47 @@ ENDOFLIST:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if ((LINK->L2FLAGS & RNRSET) == 0)
 | 
									if ((LINK->L2FLAGS & RNRSET) == 0)
 | 
				
			||||||
					SDETX(LINK);
 | 
										SDETX(LINK);
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										// Stuck link debug check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (LINK->LINKWINDOW == 0 || LINK->LASTFRAMESENT == 0 || (time(NULL) - LINK->LASTFRAMESENT) > 60)			// No send for 60 secs
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											if (COUNT_AT_L2(LINK) > 16 || LINK->LINKWINDOW == 0)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												// Dump Link State
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												char Normcall[11] = "";
 | 
				
			||||||
 | 
												char Normcall2[11] = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												int Count = COUNT_AT_L2(LINK);
 | 
				
			||||||
 | 
												int secs = time(NULL) - LINK->LASTFRAMESENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												ConvFromAX25(LINK->LINKCALL, Normcall);
 | 
				
			||||||
 | 
												ConvFromAX25(LINK->OURCALL, Normcall2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												Debugprintf("*** Stuck L2 Session for %d Secs RNR Set %s %s %d", secs, Normcall, Normcall2, Count);
 | 
				
			||||||
 | 
												Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS);
 | 
				
			||||||
 | 
												Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3],
 | 
				
			||||||
 | 
													LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												// Reset Link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												InformPartner(LINK, NORMALCLOSE);	// TELL OTHER END ITS GONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												LINK->L2RETRIES -= 1;		// Just send one DISC
 | 
				
			||||||
 | 
												LINK->L2STATE = 4;			// CLOSING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												L2SENDCOMMAND(LINK, DISC | PFBIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												return;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		LINK++;
 | 
							LINK++;
 | 
				
			||||||
| 
						 | 
					@ -2573,6 +2745,18 @@ int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS)
 | 
				
			||||||
		L4++;
 | 
							L4++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// And to the Monitor to File system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (MONTOFILEFLAG)		// Trace Enabled?
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Buffer = GetBuff();
 | 
				
			||||||
 | 
							if (Buffer)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								memcpy(&Buffer->PORT, &Msg->PORT, BUFFLEN - sizeof(void *));	// Dont copy chain word
 | 
				
			||||||
 | 
								C_Q_ADD(&FILEMONVECTOR->HOSTTRACEQ, Buffer);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
;
 | 
					;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,5 +18,5 @@ Chat :
 | 
				
			||||||
  MonitorSize = "828,1644,148,770";
 | 
					  MonitorSize = "828,1644,148,770";
 | 
				
			||||||
  DebugSize = "0,0,0,0";
 | 
					  DebugSize = "0,0,0,0";
 | 
				
			||||||
  WindowSize = "231,835,254,602";
 | 
					  WindowSize = "231,835,254,602";
 | 
				
			||||||
  Version = "6,0,24,32";
 | 
					  Version = "6,0,24,81";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								cheaders.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								cheaders.h
									
									
									
									
									
								
							| 
						 | 
					@ -2,7 +2,6 @@
 | 
				
			||||||
// Prototypes for BPQ32 Node Functions
 | 
					// Prototypes for BPQ32 Node Functions
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DllImport
 | 
					#define DllImport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EXCLUDEBITS
 | 
					#define EXCLUDEBITS
 | 
				
			||||||
| 
						 | 
					@ -106,10 +105,10 @@ VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
 | 
					VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
 | 
					DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
 | 
					int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
 | 
				
			||||||
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
 | 
					VOID SENDL4CONNECT(TRANSPORTENTRY * Session, int Service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
 | 
					VOID CloseSessionPartner(TRANSPORTENTRY * Session);
 | 
				
			||||||
int COUNTNODES(struct ROUTE * ROUTE);
 | 
					int COUNTNODES(struct ROUTE * ROUTE);
 | 
				
			||||||
| 
						 | 
					@ -203,8 +202,6 @@ int TrytoGuessCode(unsigned char * Char, int Len);
 | 
				
			||||||
#define XID 0xAF
 | 
					#define XID 0xAF
 | 
				
			||||||
#define TEST 0xE3
 | 
					#define TEST 0xE3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SUPPORT2point2 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// XID Optional Functions
 | 
					// XID Optional Functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPMustHave 0x02A080		// Sync TEST 16 bit FCS Extended Address
 | 
					#define OPMustHave 0x02A080		// Sync TEST 16 bit FCS Extended Address
 | 
				
			||||||
| 
						 | 
					@ -439,13 +436,12 @@ extern int MQTT_PORT;
 | 
				
			||||||
extern char MQTT_USER[80];
 | 
					extern char MQTT_USER[80];
 | 
				
			||||||
extern char MQTT_PASS[80];
 | 
					extern char MQTT_PASS[80];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int SUPPORT2point2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
 | 
					DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
 | 
					void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
 | 
				
			||||||
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
 | 
					void hookL2SessionDeleted(struct _LINKTABLE * LINK);
 | 
				
			||||||
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
 | 
					void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
 | 
				
			||||||
 | 
					 | 
				
			||||||
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
 | 
					 | 
				
			||||||
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
 | 
					 | 
				
			||||||
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										38
									
								
								compatbits.h
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								compatbits.h
									
									
									
									
									
								
							| 
						 | 
					@ -49,7 +49,39 @@ Stuff to make compiling on WINDOWS and LINUX easier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pthread_equal(pthread_t T1, pthread_t T2);
 | 
					int pthread_equal(pthread_t T1, pthread_t T2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uintptr_t _beginthread(void(__cdecl *start_address)(void *), unsigned stack_size, void *arglist);
 | 
					uintptr_t _beginthread(void(__cdecl start_address)(void *), unsigned stack_size, void *arglist);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_MSC_VER) && _MSC_VER < 1900
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define snprintf c99_snprintf
 | 
				
			||||||
 | 
					#define vsnprintf c99_vsnprintf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int count = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (size != 0)
 | 
				
			||||||
 | 
					        count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
 | 
				
			||||||
 | 
					    if (count == -1)
 | 
				
			||||||
 | 
					        count = _vscprintf(format, ap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    va_list ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    va_start(ap, format);
 | 
				
			||||||
 | 
					    count = c99_vsnprintf(outBuf, size, format, ap);
 | 
				
			||||||
 | 
					    va_end(ap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,9 +184,7 @@ int stricmp(const unsigned char * pStr1, const unsigned char *pStr2);
 | 
				
			||||||
char * strupr(char* s);
 | 
					char * strupr(char* s);
 | 
				
			||||||
char * strlwr(char* s);
 | 
					char * strlwr(char* s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pthread_t _beginthread(void(*start_address)(), unsigned stack_size, VOID * arglist);
 | 
					pthread_t _beginthread(void(start_address)(void *), unsigned stack_size, VOID * arglist);
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WSAGetLastError() errno
 | 
					#define WSAGetLastError() errno
 | 
				
			||||||
#define GetLastError() errno 
 | 
					#define GetLastError() errno 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										217
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										217
									
								
								config.c
									
									
									
									
									
								
							| 
						 | 
					@ -305,9 +305,12 @@ static char *keywords[] =
 | 
				
			||||||
"APPL5ALIAS", "APPL6ALIAS", "APPL7ALIAS", "APPL8ALIAS",
 | 
					"APPL5ALIAS", "APPL6ALIAS", "APPL7ALIAS", "APPL8ALIAS",
 | 
				
			||||||
"APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL",
 | 
					"APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL",
 | 
				
			||||||
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
 | 
					"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
 | 
				
			||||||
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS",		// IPGATEWAY= no longer allowed
 | 
					
 | 
				
			||||||
 | 
					"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXTT", "MAXHOPS",		// IPGATEWAY= no longer allowed
 | 
				
			||||||
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", 
 | 
					"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", 
 | 
				
			||||||
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"
 | 
					"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS",
 | 
				
			||||||
 | 
					"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe",
 | 
				
			||||||
 | 
					"L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0", "DEBUGINP3", "ENABLEOARCAPI"
 | 
				
			||||||
};           /* parameter keywords */
 | 
					};           /* parameter keywords */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void * offset[] =
 | 
					static void * offset[] =
 | 
				
			||||||
| 
						 | 
					@ -326,9 +329,12 @@ static void * offset[] =
 | 
				
			||||||
&xxcfg.C_APPL[4].ApplAlias, &xxcfg.C_APPL[5].ApplAlias, &xxcfg.C_APPL[6].ApplAlias, &xxcfg.C_APPL[7].ApplAlias,
 | 
					&xxcfg.C_APPL[4].ApplAlias, &xxcfg.C_APPL[5].ApplAlias, &xxcfg.C_APPL[6].ApplAlias, &xxcfg.C_APPL[7].ApplAlias,
 | 
				
			||||||
&xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual,
 | 
					&xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual,
 | 
				
			||||||
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
 | 
					&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
 | 
				
			||||||
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS,		// IPGATEWAY= no longer allowed
 | 
					
 | 
				
			||||||
 | 
					&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS,		// IPGATEWAY= no longer allowed
 | 
				
			||||||
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
 | 
					&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
 | 
				
			||||||
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS};		/* offset for corresponding data in config file */
 | 
					&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS,
 | 
				
			||||||
 | 
					&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe, 
 | 
				
			||||||
 | 
					&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0,  &xxcfg.C_DEBUGINP3, &xxcfg.C_OARCAPI};		/* offset for corresponding data in config file */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int routine[] = 
 | 
					static int routine[] = 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -346,9 +352,12 @@ static int routine[] =
 | 
				
			||||||
13, 13 ,13, 13,
 | 
					13, 13 ,13, 13,
 | 
				
			||||||
14, 14, 14, 14,
 | 
					14, 14, 14, 14,
 | 
				
			||||||
14, 14 ,14, 14,
 | 
					14, 14 ,14, 14,
 | 
				
			||||||
15, 0, 2, 9, 9,
 | 
					
 | 
				
			||||||
 | 
					15, 0, 2, 9, 9, 9,
 | 
				
			||||||
2, 2, 1, 2, 2, 2,
 | 
					2, 2, 1, 2, 2, 2,
 | 
				
			||||||
2, 2, 0, 1, 20, 20} ;			// Routine to process param
 | 
					2, 2, 0, 1, 20, 20,
 | 
				
			||||||
 | 
					1, 1, 1, 1, 1, 
 | 
				
			||||||
 | 
					1, 1, 1, 1, 1};			// Routine to process param
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PARAMLIM = sizeof(routine)/sizeof(int);
 | 
					int PARAMLIM = sizeof(routine)/sizeof(int);
 | 
				
			||||||
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
 | 
					//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
 | 
				
			||||||
| 
						 | 
					@ -370,8 +379,7 @@ static char *pkeywords[] =
 | 
				
			||||||
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
 | 
					"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
 | 
				
			||||||
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
 | 
					"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
 | 
				
			||||||
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
 | 
					"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
 | 
				
			||||||
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort",
 | 
					"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "ALLOWINP3", "ENABLEINP3"};         /* parameter keywords */
 | 
				
			||||||
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"};           /* parameter keywords */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void * poffset[] =
 | 
					static void * poffset[] =
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -385,7 +393,7 @@ static void * poffset[] =
 | 
				
			||||||
&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
 | 
					&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
 | 
				
			||||||
&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
 | 
					&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
 | 
				
			||||||
&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
 | 
					&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
 | 
				
			||||||
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort};	/* offset for corresponding data in config file */
 | 
					&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, &xxp.AllowINP3, &xxp.EnableINP3};	/* offset for corresponding data in config file */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int proutine[] = 
 | 
					static int proutine[] = 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -399,7 +407,7 @@ static int proutine[] =
 | 
				
			||||||
0, 1, 2, 18, 15, 16, 2,
 | 
					0, 1, 2, 18, 15, 16, 2,
 | 
				
			||||||
1, 17, 1, 1, 1, 1, 2,
 | 
					1, 17, 1, 1, 1, 1, 2,
 | 
				
			||||||
2, 2, 1, 1, 19, 2,
 | 
					2, 2, 1, 1, 19, 2,
 | 
				
			||||||
1, 20, 1, 21, 22, 1};							/* routine to process parameter */
 | 
					1, 20, 1, 21, 22, 1, 1, 1};							/* routine to process parameter */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PPARAMLIM = sizeof(proutine)/sizeof(int);
 | 
					int PPARAMLIM = sizeof(proutine)/sizeof(int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -533,6 +541,8 @@ BOOL ProcessConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//	xxcfg.SaveMH = TRUE;		// Default to save
 | 
					//	xxcfg.SaveMH = TRUE;		// Default to save
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xxcfg.C_PREFERINP3ROUTES = 0;	// Default to false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GetNextLine(rec);
 | 
						GetNextLine(rec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (rec[0])
 | 
						while (rec[0])
 | 
				
			||||||
| 
						 | 
					@ -594,7 +604,6 @@ BOOL ProcessConfig()
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for (i=0;i<24;i++)
 | 
						for (i=0;i<24;i++)
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		paramok[45+i]=1;	/* or APPLCALLS, APPLALIASS APPLQUAL */
 | 
							paramok[45+i]=1;	/* or APPLCALLS, APPLALIASS APPLQUAL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	paramok[69]=1;			// BText optional
 | 
						paramok[69]=1;			// BText optional
 | 
				
			||||||
| 
						 | 
					@ -616,6 +625,16 @@ BOOL ProcessConfig()
 | 
				
			||||||
	paramok[83]=1;			// MQTT Params
 | 
						paramok[83]=1;			// MQTT Params
 | 
				
			||||||
	paramok[84]=1;			// MQTT Params
 | 
						paramok[84]=1;			// MQTT Params
 | 
				
			||||||
	paramok[85]=1;			// MQTT Params
 | 
						paramok[85]=1;			// MQTT Params
 | 
				
			||||||
 | 
						paramok[86]=1;			// L4Compress
 | 
				
			||||||
 | 
						paramok[87]=1;			// L4Compress Maxframe
 | 
				
			||||||
 | 
						paramok[88]=1;			// L4Compress Paclen
 | 
				
			||||||
 | 
						paramok[89]=1;			// L2Compress
 | 
				
			||||||
 | 
						paramok[90]=1;			// L2Compress Maxframe
 | 
				
			||||||
 | 
						paramok[91]=1;			// L2Compress Paclen
 | 
				
			||||||
 | 
						paramok[92]=1;			// PREFERINP3ROUTES
 | 
				
			||||||
 | 
						paramok[93]=1;			// ONLYVer2point0
 | 
				
			||||||
 | 
						paramok[94]=1;			// DEBUGINP3
 | 
				
			||||||
 | 
						paramok[95]=1;			// EnableOARCAPI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i=0; i < PARAMLIM; i++)
 | 
						for (i=0; i < PARAMLIM; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -1568,32 +1587,160 @@ int routes(int i)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// strtok and sscanf can't handle successive commas, so split up usig strchr
 | 
							// strtok and sscanf can't handle successive commas, so split up usig strchr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		memset(Param, 0, 2048);
 | 
							// Now support keyword=value format
 | 
				
			||||||
		strlop(rec, 13);
 | 
					 | 
				
			||||||
		strlop(rec, ';');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ptr1 = rec;
 | 
							if (strchr(rec, '='))
 | 
				
			||||||
 | 
					 | 
				
			||||||
		while (ptr1 && *ptr1 && n < 8)
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ptr2 = strchr(ptr1, ',');
 | 
								// New format
 | 
				
			||||||
			if (ptr2) *ptr2++ = 0;
 | 
								// 		call quality port window frack paclen farquality inp3 nokeepalives tcp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			strcpy(&Param[n++][0], ptr1);
 | 
								char * ptr, *context;
 | 
				
			||||||
			ptr1 = ptr2;
 | 
								char copy[512] = "";
 | 
				
			||||||
			while(ptr1 && *ptr1 && *ptr1 == ' ')
 | 
					
 | 
				
			||||||
				ptr1++;
 | 
								if (strlen(rec) < 512)
 | 
				
			||||||
 | 
									strcpy(copy, rec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								_strupr(rec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ptr = strtok_s(rec, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								while (ptr)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (strcmp(ptr, "CALL") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * Call = strtok_s(NULL, ",=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (strlen(Call) < 80)
 | 
				
			||||||
 | 
											strcpy(Route->call, Call);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "PORT") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->port = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "QUALITY") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->quality = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "FRACK") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->pfrack = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "PACLEN") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->pwind = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "WINDOW") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->pwind = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "FARQUALITY") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->farQual = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "INP3") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->inp3 = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "NOKEEPALIVES") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
											Route->farQual = atoi(val);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									else if (strcmp(ptr, "TCP") == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char * val = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (val)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											char * port = strlop(val, ':');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											Route->tcphost = _strdup(val);
 | 
				
			||||||
 | 
											if (port)
 | 
				
			||||||
 | 
												Route->tcpport = atoi(port);
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												Route->tcpport = 53119;  
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Consoleprintf("Bad Route %s\r\n",rec);
 | 
				
			||||||
 | 
										err_flag = 1;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									ptr = strtok_s(NULL, " ,=", &context);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		strcpy(Route->call, &Param[0][0]);
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Route->quality = atoi(Param[1]);
 | 
								memset(Param, 0, 2048);
 | 
				
			||||||
		Route->port = atoi(Param[2]);
 | 
								strlop(rec, 13);
 | 
				
			||||||
		Route->pwind = atoi(Param[3]);
 | 
								strlop(rec, ';');
 | 
				
			||||||
		Route->pfrack = atoi(Param[4]);
 | 
					
 | 
				
			||||||
		Route->ppacl = atoi(Param[5]);
 | 
								ptr1 = rec;
 | 
				
			||||||
		inp3 = atoi(Param[6]);
 | 
					
 | 
				
			||||||
		Route->farQual = atoi(Param[7]);
 | 
								while (ptr1 && *ptr1 && n < 8)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ptr2 = strchr(ptr1, ',');
 | 
				
			||||||
 | 
									if (ptr2) *ptr2++ = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									strcpy(&Param[n++][0], ptr1);
 | 
				
			||||||
 | 
									ptr1 = ptr2;
 | 
				
			||||||
 | 
									while(ptr1 && *ptr1 && *ptr1 == ' ')
 | 
				
			||||||
 | 
										ptr1++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strcpy(Route->call, &Param[0][0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Route->quality = atoi(Param[1]);
 | 
				
			||||||
 | 
								Route->port = atoi(Param[2]);
 | 
				
			||||||
 | 
								Route->pwind = atoi(Param[3]);
 | 
				
			||||||
 | 
								Route->pfrack = atoi(Param[4]);
 | 
				
			||||||
 | 
								Route->ppacl = atoi(Param[5]);
 | 
				
			||||||
 | 
								inp3 = atoi(Param[6]);
 | 
				
			||||||
 | 
								Route->farQual = atoi(Param[7]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (inp3 & 1)
 | 
				
			||||||
 | 
									Route->inp3 = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (inp3 & 2)
 | 
				
			||||||
 | 
									Route->nokeepalives = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	   if (Route->farQual < 0 || Route->farQual > 255)
 | 
						   if (Route->farQual < 0 || Route->farQual > 255)
 | 
				
			||||||
	   {
 | 
						   {
 | 
				
			||||||
| 
						 | 
					@ -1618,14 +1765,6 @@ int routes(int i)
 | 
				
			||||||
			err_flag = 1;
 | 
								err_flag = 1;
 | 
				
			||||||
	   }
 | 
						   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	   // Use top bit of window as INP3 Flag, next as NoKeepAlive
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	   if (inp3 & 1)
 | 
					 | 
				
			||||||
		   Route->pwind |= 0x80;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	   if (inp3 & 2)
 | 
					 | 
				
			||||||
		   Route->pwind |= 0x40;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	   if (err_flag == 1)
 | 
						   if (err_flag == 1)
 | 
				
			||||||
	   {
 | 
						   {
 | 
				
			||||||
	      Consoleprintf("%s\r\n",rec);
 | 
						      Consoleprintf("%s\r\n",rec);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,6 +81,8 @@ struct PORTCONFIG
 | 
				
			||||||
	uint64_t PortFreq;
 | 
						uint64_t PortFreq;
 | 
				
			||||||
	char * M0LTEMapInfo;
 | 
						char * M0LTEMapInfo;
 | 
				
			||||||
	int QtSMPort;
 | 
						int QtSMPort;
 | 
				
			||||||
 | 
						int AllowINP3;
 | 
				
			||||||
 | 
						int EnableINP3;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ROUTECONFIG
 | 
					struct ROUTECONFIG
 | 
				
			||||||
| 
						 | 
					@ -92,6 +94,10 @@ struct ROUTECONFIG
 | 
				
			||||||
	int pfrack;
 | 
						int pfrack;
 | 
				
			||||||
	int ppacl;
 | 
						int ppacl;
 | 
				
			||||||
	int farQual;
 | 
						int farQual;
 | 
				
			||||||
 | 
						int inp3;
 | 
				
			||||||
 | 
						int nokeepalives;
 | 
				
			||||||
 | 
						char * tcphost;
 | 
				
			||||||
 | 
						int tcpport;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct CONFIGTABLE
 | 
					struct CONFIGTABLE
 | 
				
			||||||
| 
						 | 
					@ -170,6 +176,17 @@ struct CONFIGTABLE
 | 
				
			||||||
	int C_MQTT_PORT;
 | 
						int C_MQTT_PORT;
 | 
				
			||||||
	char C_MQTT_USER[80];
 | 
						char C_MQTT_USER[80];
 | 
				
			||||||
	char C_MQTT_PASS[80];
 | 
						char C_MQTT_PASS[80];
 | 
				
			||||||
 | 
						int C_L4Compress;
 | 
				
			||||||
 | 
						int C_L4CompMaxframe;
 | 
				
			||||||
 | 
						int C_L4CompPaclen;
 | 
				
			||||||
 | 
						int C_L2Compress;
 | 
				
			||||||
 | 
						int C_L2CompMaxframe;
 | 
				
			||||||
 | 
						int C_L2CompPaclen;
 | 
				
			||||||
 | 
						int C_PREFERINP3ROUTES;
 | 
				
			||||||
 | 
						int C_OnlyVer2point0;
 | 
				
			||||||
 | 
						int C_DEBUGINP3;
 | 
				
			||||||
 | 
						int C_OARCAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#define ApplOffset 80000			// Applications offset in config buffer
 | 
					//#define ApplOffset 80000			// Applications offset in config buffer
 | 
				
			||||||
//#define InfoOffset 85000			// Infomsg offset in  buffer
 | 
					//#define InfoOffset 85000			// Infomsg offset in  buffer
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,9 @@ int RFOnly = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int MAXRTT = 9000;			// 90 secs
 | 
					int MAXRTT = 9000;			// 90 secs
 | 
				
			||||||
int MaxHops = 4;
 | 
					int MaxHops = 4;
 | 
				
			||||||
 | 
					int DEBUGINP3 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int EnableOARCAPI = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int RTTInterval = 24;		// 4 Minutes
 | 
					int RTTInterval = 24;		// 4 Minutes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								debian/NEWS
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								debian/NEWS
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					linbpq (6.0.24.22-2) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This is quite a big update, with config moving from /opt/oarc/bpq/bpq32.cfg to
 | 
				
			||||||
 | 
					  /etc/bpq32.cfg. The system shall do this automatically for you, however
 | 
				
			||||||
 | 
					  computers and their programmers are not perfect.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  I strongly recommend at this point backing up your entire
 | 
				
			||||||
 | 
					  /opt/oarc/bpq/ directory (cp -r /opt/oarc/bpq/ ~/bpq-backup/) before
 | 
				
			||||||
 | 
					  proceeding with the upgrade
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Sat, 16 Dec 2023 13:30:06 +0000
 | 
				
			||||||
							
								
								
									
										23
									
								
								debian/README.Debian
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								debian/README.Debian
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					README for linbpq on Debian
 | 
				
			||||||
 | 
					===========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please see https://wiki.oarc.uk/packet:linbpq-apt-installation for this guide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set config
 | 
				
			||||||
 | 
					Copy the config, edit it & set permissions.
 | 
				
			||||||
 | 
					The permissions are so linbpq web interface can edit the config. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sudo mv /usr/share/doc/linbpq/examples/bpq32.cfg /etc/bpq32.cfg
 | 
				
			||||||
 | 
					sudo nano /etc/bpq32.cfg
 | 
				
			||||||
 | 
					sudo chown :linbpq /etc/bpq32.cfg
 | 
				
			||||||
 | 
					sudo chmod 644 /etc/bpq32.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Start linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sudo systemctl start linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Access your node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It shall be available by accessing http://localhost:8008 in the browser or telnet localhost 8010
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Dave Hibberd <hibby@debian.org>  Tue, 26 Mar 2024 00:53:42 +0000
 | 
				
			||||||
							
								
								
									
										50
									
								
								debian/bpq32.cfg
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								debian/bpq32.cfg
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					SIMPLE
 | 
				
			||||||
 | 
					NODECALL=MB7NAA
 | 
				
			||||||
 | 
					NODEALIAS=AANODE
 | 
				
			||||||
 | 
					LOCATOR=AA00aa
 | 
				
			||||||
 | 
					PASSWORD=xxxxxxxx
 | 
				
			||||||
 | 
					AUTOSAVE=1
 | 
				
			||||||
 | 
					NODESINTERVAL=10
 | 
				
			||||||
 | 
					MINQUAL=10
 | 
				
			||||||
 | 
					CTEXT:
 | 
				
			||||||
 | 
					Thanks for connecting.
 | 
				
			||||||
 | 
					Type ? for help.
 | 
				
			||||||
 | 
					***
 | 
				
			||||||
 | 
					PORT
 | 
				
			||||||
 | 
					  PORTNUM=1
 | 
				
			||||||
 | 
					  ID=VHF
 | 
				
			||||||
 | 
					  TYPE=ASYNC
 | 
				
			||||||
 | 
					  PROTOCOL=KISS
 | 
				
			||||||
 | 
					  KISSOPTIONS=ACKMODE
 | 
				
			||||||
 | 
					  COMPORT=/dev/ttyACM0
 | 
				
			||||||
 | 
					  SPEED=57600
 | 
				
			||||||
 | 
					  FRACK=4000
 | 
				
			||||||
 | 
					  PACLEN=150
 | 
				
			||||||
 | 
					  DIGIFLAG=0
 | 
				
			||||||
 | 
					  QUALITY=192
 | 
				
			||||||
 | 
					  MINQUAL=20
 | 
				
			||||||
 | 
					ENDPORT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PORT
 | 
				
			||||||
 | 
					  PORTNUM=9
 | 
				
			||||||
 | 
					  ID=Telnet
 | 
				
			||||||
 | 
					  DRIVER=Telnet
 | 
				
			||||||
 | 
					  CONFIG
 | 
				
			||||||
 | 
					    LOGGING=1
 | 
				
			||||||
 | 
					    CMS=1
 | 
				
			||||||
 | 
					    DisconnectOnClose=1
 | 
				
			||||||
 | 
					    SECURETELNET=1
 | 
				
			||||||
 | 
					    TCPPORT=8010
 | 
				
			||||||
 | 
					    FBBPORT=8011
 | 
				
			||||||
 | 
					    HTTPPORT=8008
 | 
				
			||||||
 | 
					    LOGINPROMPT=user:
 | 
				
			||||||
 | 
					    PASSWORDPROMPT=password:
 | 
				
			||||||
 | 
					    MAXSESSIONS=10
 | 
				
			||||||
 | 
					    CTEXT=Thanks for connecting\n Enter ? for list of commands\n\n
 | 
				
			||||||
 | 
					    USER=username,xxxxxxxx,m0aaa,,SYSOP
 | 
				
			||||||
 | 
					ENDPORT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LINCHAT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APPLICATION 2,CHAT,,MB7NAA-9,AACHAT,255
 | 
				
			||||||
							
								
								
									
										320
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										320
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,320 @@
 | 
				
			||||||
 | 
					linbpq (6.0.25.8+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Build on latest gcc standards
 | 
				
			||||||
 | 
					  * New upstream version 6.0.25.8+repack
 | 
				
			||||||
 | 
					  * Refresh patches with gbp pq!
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 24 Oct 2025 00:45:16 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.25.06+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream version 6.0.25.06+repack
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 10 Oct 2025 23:42:04 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.25.1+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * New upstream version 6.0.25.1+repack
 | 
				
			||||||
 | 
					   * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sat, 20 Sep 2025 15:43:32 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.82+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.82+repack
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sun, 17 Aug 2025 22:36:49 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.78+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					  * New files excluded
 | 
				
			||||||
 | 
					    - No binaries in this release at all maybe!
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Thu, 31 Jul 2025 01:31:38 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.77+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.77+repack
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 22 Jul 2025 21:46:13 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.75+repack-1~hibbian~TRIXIE+2) trixie-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * First trixie release
 | 
				
			||||||
 | 
					  * Drop hard-dep on hibbian-archive-keyring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Wed, 16 Jul 2025 19:10:33 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.75+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream version 6.0.25.75+repack
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 15 Jul 2025 01:10:43 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.71+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.67+repack
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.69+repack
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.69.1+repack
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.71+repack
 | 
				
			||||||
 | 
					  * Okay that's a lot of updates.
 | 
				
			||||||
 | 
					  * Refreshed d/p/makefile to reflect new CFLAG
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Wed, 21 May 2025 21:45:59 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.66+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Update postinst script to be a little quieter
 | 
				
			||||||
 | 
					  * MINI_BUILDD_OPTION:
 | 
				
			||||||
 | 
					    auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 11 Mar 2025 00:51:35 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.66+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream version 6.0.24.66+repack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 04 Mar 2025 22:50:09 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.65+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 25 Feb 2025 09:33:24 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.59a+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					  * Little tweaks to makefile patch to account for new -rdynamic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Mon, 03 Feb 2025 22:32:11 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.56+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Mon, 06 Jan 2025 21:37:44 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.55+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					  * d/rules
 | 
				
			||||||
 | 
					    - Increased hardening
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sun, 05 Jan 2025 23:35:06 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.54+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					  * Drop AGW Patch
 | 
				
			||||||
 | 
					  * Drop Spelling Patch
 | 
				
			||||||
 | 
					  * Drop Dynamic Links patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 17 Dec 2024 16:46:05 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.53+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream
 | 
				
			||||||
 | 
					    - Patches refreshed
 | 
				
			||||||
 | 
					    - dropped some edits in ftbfs-gcc14
 | 
				
			||||||
 | 
					    - dropped d/patches/headers.patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 03 Dec 2024 00:57:57 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.52+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream
 | 
				
			||||||
 | 
					    - Patches happy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sat, 30 Nov 2024 21:47:17 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.51.1+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Iron out an issue with time...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 29 Nov 2024 19:57:28 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.51.1+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream import after bug report
 | 
				
			||||||
 | 
					  * Roll back some ftbfs-gcc14 edits
 | 
				
			||||||
 | 
					  * Remove some more lib headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 29 Nov 2024 19:30:22 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.51+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream import
 | 
				
			||||||
 | 
					    - Patches refreshed
 | 
				
			||||||
 | 
					  * Upstream is now repacked to include less files
 | 
				
			||||||
 | 
					  * Big build system review, now using Debian CFLAGS and LDFLAGS
 | 
				
			||||||
 | 
					    - Hardening enabled, mostly
 | 
				
			||||||
 | 
					    - A debug symbols package is now available
 | 
				
			||||||
 | 
					  * Oh yeah, everything is now dynamic linking
 | 
				
			||||||
 | 
					    - libpng
 | 
				
			||||||
 | 
					    - libpaho-mqtt
 | 
				
			||||||
 | 
					    - libjansson
 | 
				
			||||||
 | 
					    - libminiupnpc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 29 Nov 2024 13:08:38 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.50-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream import
 | 
				
			||||||
 | 
					  * Files excluded at origtargz generation time for cleanliness
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 12 Nov 2024 21:56:38 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.49-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream import
 | 
				
			||||||
 | 
					  * Patches refreshed
 | 
				
			||||||
 | 
					  * Add mqtt requirements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 05 Nov 2024 21:52:29 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.45-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream import
 | 
				
			||||||
 | 
					  * Patches refreshed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 11 Oct 2024 15:48:41 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.42-1~hibbian+3) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * 32bit build error
 | 
				
			||||||
 | 
					    - Patch updated to fix hopefully
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 30 Aug 2024 12:21:57 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.42-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Forgot to fix the ninotnc-smt issue, fixed now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 30 Aug 2024 12:05:54 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.42-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Install config to /etc
 | 
				
			||||||
 | 
					  * New upstream update
 | 
				
			||||||
 | 
					  * Patches refreshed
 | 
				
			||||||
 | 
					  * Debian hardening enabled
 | 
				
			||||||
 | 
					    - 2 new patches created that touch almost every file
 | 
				
			||||||
 | 
					    - Considered experimental.
 | 
				
			||||||
 | 
					    - gcc14 builds for Debian Trixie!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 30 Aug 2024 10:15:11 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.40-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Fresh upstream release
 | 
				
			||||||
 | 
					    - Patches refreshed
 | 
				
			||||||
 | 
					  * Secure by default patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sun, 07 Jul 2024 16:09:28 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.38-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream
 | 
				
			||||||
 | 
					  * Tweak config file per recommendation from 2M0MQN to make first start simple
 | 
				
			||||||
 | 
					  * Bump standards to 4.7.0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sun, 09 Jun 2024 22:38:40 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.34-2) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Fix config permissions bug as reported by Alex 2E1PKY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Mon, 08 Apr 2024 22:27:02 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.34-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Upstream bump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Sat, 06 Apr 2024 02:15:28 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.33-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Upstream bump
 | 
				
			||||||
 | 
					  * Moved config file to examples
 | 
				
			||||||
 | 
					  * Updated service to fail on no config
 | 
				
			||||||
 | 
					  * Added helpful README.Debian
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 26 Mar 2024 20:24:08 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.30-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Upstream bump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Fri, 23 Feb 2024 23:24:46 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.29-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Upstream bump
 | 
				
			||||||
 | 
					  * Added my new details
 | 
				
			||||||
 | 
					  * Tidied up some packaging errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <hibby@debian.org>  Tue, 13 Feb 2024 00:06:33 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.27-2) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Permissions fix for web-config-editor users
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Thu, 18 Jan 2024 10:31:56 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.27-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream Release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Tue, 16 Jan 2024 20:51:43 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.25-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream Release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Thu, 28 Dec 2023 10:44:47 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.22-2) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Moved config file home, caused chaos
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Sat, 16 Dec 2023 14:40:20 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.22-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream Release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Fri, 08 Dec 2023 12:29:40 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.16-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New Upstream release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Tue, 31 Oct 2023 22:50:01 +0000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.15-2) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * debian/conffiles introduced to stop linbpq overwriting config files
 | 
				
			||||||
 | 
					    - Thanks to Mark 2M0IIG for raising concern about this bug!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Sun, 15 Oct 2023 21:45:24 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.15-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * New upstream release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Tue, 10 Oct 2023 22:19:48 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					linbpq (6.0.24.2-1) unstable; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Initial release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Dave Hibberd <d@vehibberd.com>  Mon, 28 Aug 2023 23:20:45 +0100
 | 
				
			||||||
							
								
								
									
										20
									
								
								debian/control
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								debian/control
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					Source: linbpq
 | 
				
			||||||
 | 
					Section: hamradio
 | 
				
			||||||
 | 
					Priority: optional
 | 
				
			||||||
 | 
					Maintainer: Dave Hibberd <hibby@debian.org>
 | 
				
			||||||
 | 
					Standards-Version: 4.7.2
 | 
				
			||||||
 | 
					Vcs-Browser: https://git.hibbian.org/Hibbian/linbpq
 | 
				
			||||||
 | 
					Vcs-Git: https://git.hibbian.org/Hibbian/linbpq.git
 | 
				
			||||||
 | 
					Homepage: https://www.cantab.net/users/john.wiseman/Documents/
 | 
				
			||||||
 | 
					Build-Depends: debhelper-compat (= 13)
 | 
				
			||||||
 | 
					Build-Depends-Arch: libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev, libpng-dev
 | 
				
			||||||
 | 
					Rules-Requires-Root: no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Package: linbpq
 | 
				
			||||||
 | 
					Architecture: linux-any
 | 
				
			||||||
 | 
					Depends: ${shlibs:Depends}, ${misc:Depends}, adduser
 | 
				
			||||||
 | 
					Description: Packet node and ax25 stack
 | 
				
			||||||
 | 
					 LINBPQ is a Linux version of the BPQ32 Node, BBS and Chat Server components.
 | 
				
			||||||
 | 
					 It is actively developed by John G8BPQ and contains a complete, independent
 | 
				
			||||||
 | 
					 implementation of ax.25 and net/rom as well as BBS and Chat applications and
 | 
				
			||||||
 | 
					 can be used either as a packet switch or as a full featured node.
 | 
				
			||||||
							
								
								
									
										37
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 | 
				
			||||||
 | 
					Upstream-Name: linBPQ
 | 
				
			||||||
 | 
					Upstream-Contact: John Wiseman G8BPQ <john.wiseman@cantab.net>
 | 
				
			||||||
 | 
					Source: https://www.cantab.net/users/john.wiseman/Documents/
 | 
				
			||||||
 | 
					Files-Excluded: *.vcproj* *.bak *.lib *.dll *.wav *.asm *.vcxproj* *.pdb *.exe
 | 
				
			||||||
 | 
						.gitignore XAprs zlib.h zconf.h MQTT* pcap.h miniupnpc.h upnpdev.h
 | 
				
			||||||
 | 
						igd_desc_parse.h upnpcommands.h upnperrors.h miniupnpctypes.h
 | 
				
			||||||
 | 
						*.svn-base *.db *.obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Files: *
 | 
				
			||||||
 | 
					Copyright: 1990-2025 John Wiseman G8BPQ <john.wiseman@cantab.net>
 | 
				
			||||||
 | 
					License: GPL-3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Files: debian/*
 | 
				
			||||||
 | 
					Copyright: 2016-2025 Dave Hibberd <d@vehibberd.com>
 | 
				
			||||||
 | 
					License: GPL-3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Files: debian/linbpq.service
 | 
				
			||||||
 | 
					Copyright: 2024-2025 Tom Fanning M0LTE
 | 
				
			||||||
 | 
					License: GPL-3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					License: GPL-3
 | 
				
			||||||
 | 
					 This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					 (at your option) any later version.
 | 
				
			||||||
 | 
					 .
 | 
				
			||||||
 | 
					 This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					 GNU General Public License for more details.
 | 
				
			||||||
 | 
					 . 
 | 
				
			||||||
 | 
					 You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 .
 | 
				
			||||||
 | 
					 The GPL License which applies to this package can be found on your Debian
 | 
				
			||||||
 | 
					 system at /usr/share/common-licenses/GPL-3. 
 | 
				
			||||||
							
								
								
									
										2
									
								
								debian/dirs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								debian/dirs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					usr/sbin
 | 
				
			||||||
 | 
					opt/oarc/bpq
 | 
				
			||||||
							
								
								
									
										3
									
								
								debian/gbp.conf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								debian/gbp.conf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					[DEFAULT]
 | 
				
			||||||
 | 
					debian-branch = hibbian/latest
 | 
				
			||||||
 | 
					upstream-branch = upstream/latest
 | 
				
			||||||
							
								
								
									
										6
									
								
								debian/gitlab-ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								debian/gitlab-ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					include:
 | 
				
			||||||
 | 
					  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
 | 
				
			||||||
 | 
					  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					reprotest:
 | 
				
			||||||
 | 
					  extends: .test-reprotest-diffoscope
 | 
				
			||||||
							
								
								
									
										1
									
								
								debian/install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								debian/install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					debian/bpq32.cfg etc/
 | 
				
			||||||
							
								
								
									
										1
									
								
								debian/linbpq.examples
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								debian/linbpq.examples
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					debian/bpq32.cfg
 | 
				
			||||||
							
								
								
									
										14
									
								
								debian/linbpq.service
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								debian/linbpq.service
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Linbpq systemd service file
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					ConditionPathExists=/etc/bpq32.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					ExecStart=/usr/sbin/linbpq -c /etc -d /opt/oarc/bpq -l /opt/oarc/bpq
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/oarc/bpq
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					User=linbpq
 | 
				
			||||||
 | 
					Group=linbpq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue