Compare commits

..

158 Commits

Author SHA1 Message Date
Hibby 6a4b588a48
Release and autoport magic 2025-05-21 22:12:07 +01:00
Hibby 426f47ccb6
It builds successfully! 2025-05-21 21:45:54 +01:00
Hibby 3ecb593511 Update upstream source from tag 'upstream/6.0.24.71+repack'
Update to upstream version '6.0.24.71+repack'
with Debian dir d79186aef0
2025-05-21 21:33:54 +01:00
Hibby 0d3ee7fd56 New upstream version 6.0.24.71+repack 2025-05-21 21:33:52 +01:00
Hibby 96197688e7
New upstream version 6.0.24.69.1+repack 2025-05-21 21:32:18 +01:00
Hibby d3b4158645
New upstream version 6.0.24.69+repack 2025-05-21 21:32:18 +01:00
Hibby fec78cece5
Update changelog 2025-05-21 21:32:17 +01:00
Hibby bdf8a8367e
New upstream version 6.0.24.67+repack 2025-05-21 21:32:17 +01:00
Hibby f0ac0675f6
Release, try out some MINI_BUILDD_OPTIONS 2025-03-11 00:51:56 +00:00
Hibby 329e2f441d
Who knows at this point 2025-03-11 00:28:11 +00:00
Hibby 0b4a17004f
New upstream 2025-03-04 22:50:37 +00:00
Hibby f0b507a096 Update upstream source from tag 'upstream/6.0.24.66+repack'
Update to upstream version '6.0.24.66+repack'
with Debian dir 0a1e01b2c4
2025-03-04 22:46:54 +00:00
Hibby b128f2a43a New upstream version 6.0.24.66+repack 2025-03-04 22:46:52 +00:00
Hibby 9d0d20064d
Release! 2025-02-25 09:39:10 +00:00
Hibby ead72b2575
New import packaging 2025-02-25 09:35:39 +00:00
Hibby f1d8b647c7 Update upstream source from tag 'upstream/6.0.24.65+repack'
Update to upstream version '6.0.24.65+repack'
with Debian dir 324f0a8474
2025-02-25 09:32:59 +00:00
Hibby c858986248 New upstream version 6.0.24.65+repack 2025-02-25 09:32:57 +00:00
Hibby bfcf049c56
New packaging tweaks 2025-02-03 22:35:11 +00:00
Hibby 488e218d34 Update upstream source from tag 'upstream/6.0.24.59a+repack'
Update to upstream version '6.0.24.59a+repack'
with Debian dir 618298da94
2025-02-03 22:19:01 +00:00
Hibby 64d58d0c5a New upstream version 6.0.24.59a+repack 2025-02-03 22:18:58 +00:00
Hibby 3efea8aa10
Release 2025-01-06 21:41:04 +00:00
Hibby 8e9260b52d
Updates for .56 2025-01-06 21:37:03 +00:00
Hibby 5105f0adf3 Update upstream source from tag 'upstream/6.0.24.56+repack'
Update to upstream version '6.0.24.56+repack'
with Debian dir 5e2bea687a
2025-01-06 21:26:32 +00:00
Hibby a5c4d344cc New upstream version 6.0.24.56+repack 2025-01-06 21:26:30 +00:00
Hibby b060bf5d39
Update upstream source from tag 'upstream/6.0.24.55+repack'
Update to upstream version '6.0.24.55+repack'
with Debian dir ba150ac059
2025-01-05 23:35:13 +00:00
Hibby d7e92752bb New upstream version 6.0.24.55+repack 2025-01-05 23:25:03 +00:00
Hibby 87cd041888
New upstream version 6.0.24.54+repack 2024-12-17 17:45:09 +00:00
Hibby 33d8e6f75a
Release to unstable 2024-12-17 16:51:59 +00:00
Hibby 58d2baad53
New upstream and packaging tweaks 2024-12-17 16:45:51 +00:00
Hibby 1f73eb5601 Update upstream source from tag 'upstream/6.0.24.54+repack'
Update to upstream version '6.0.24.54+repack'
with Debian dir f571d496d3
2024-12-16 17:54:18 +00:00
Hibby a7d635fe2f New upstream version 6.0.24.54+repack 2024-12-16 17:54:16 +00:00
Hibby eab73bee95
.53 build 2024-12-09 10:06:20 +00:00
Hibby 745a9f8e88 Update upstream source from tag 'upstream/6.0.24.53+repack'
Update to upstream version '6.0.24.53+repack'
with Debian dir 64961bc210
2024-12-03 00:27:59 +00:00
Hibby 96c573931d New upstream version 6.0.24.53+repack 2024-12-03 00:27:57 +00:00
Hibby 697fde3123
Merge branch 'upstream/latest' of git.hibbian.org:Hibbian/linbpq into upstream/latest 2024-11-30 22:18:40 +00:00
Hibby dd84b546a0
Release 2024-11-30 22:14:12 +00:00
Hibby 3a600bee23 Update upstream source from tag 'upstream/6.0.24.52+repack'
Update to upstream version '6.0.24.52+repack'
with Debian dir 0b34b91ce1
2024-11-30 21:42:45 +00:00
Hibby d1c36fce6e New upstream version 6.0.24.52+repack 2024-11-30 21:42:43 +00:00
Hibby d09a168608 Update upstream source from tag 'upstream/6.0.24.51.3+repack+really50'
Update to upstream version '6.0.24.51.3+repack+really50'
with Debian dir 0b34b91ce1
2024-11-30 11:27:30 +00:00
Hibby 93a10a982d New upstream version 6.0.24.51.3+repack+really50 2024-11-30 11:27:28 +00:00
Hibby 757c658adc Update upstream source from tag 'upstream/6.0.24.51.2+repack+really.50'
Update to upstream version '6.0.24.51.2+repack+really.50'
with Debian dir 0b34b91ce1
2024-11-30 11:21:00 +00:00
Hibby f62edf7675 New upstream version 6.0.24.51.2+repack+really.50 2024-11-30 11:20:57 +00:00
Hibby 37bacc3178
Update required for build on trixie - I knew there was weirdness
somewhere!
2024-11-29 19:57:43 +00:00
Hibby 7690eb8f59
Release! 2024-11-29 19:33:20 +00:00
Hibby a675c89dc3 Update upstream source from tag 'upstream/6.0.24.51.1+repack'
Update to upstream version '6.0.24.51.1+repack'
with Debian dir 345d0bf3b0
2024-11-29 19:19:21 +00:00
Hibby 57c66b1c61 New upstream version 6.0.24.51.1+repack 2024-11-29 19:19:19 +00:00
Hibby 7433c77604
little tweaks before import 2024-11-29 19:18:48 +00:00
Hibby 6bd281ab30
Tweaks to get functionality 2024-11-29 16:13:51 +00:00
Hibby c0637b3841
Last batch of changes, ready for release! 2024-11-29 13:23:18 +00:00
Hibby 3a840054a7 Update upstream source from tag 'upstream/6.0.24.51+repack'
Update to upstream version '6.0.24.51+repack'
with Debian dir cbfe17e0e2
2024-11-29 12:56:28 +00:00
Hibby c7958a2d87 New upstream version 6.0.24.51+repack 2024-11-29 12:56:25 +00:00
Hibby 8a18ca1868
pull more files out, update watch for repack 2024-11-29 12:55:39 +00:00
Hibby ae8dbe4097
Upstream removals 2024-11-29 12:19:50 +00:00
Hibby 49e27728c3
Removal of files I don't think we need to ship 2024-11-29 12:09:05 +00:00
Hibby 8e7a943558
This builds and links to system libs! 2024-11-29 12:04:09 +00:00
Hibby e35489a925
Latest revisions 2024-11-29 11:37:37 +00:00
Hibby c77b3e9f47
More updates, large makefile rewrite for dynamic linking and cleaner
build, WIP.
2024-11-29 02:24:20 +00:00
Hibby 1e83f7e725
First pass of fixes for new build 2024-11-28 22:50:13 +00:00
Hibby 5d8d8963ef Update upstream source from tag 'upstream/6.0.24.51'
Update to upstream version '6.0.24.51'
with Debian dir b28e5722f6
2024-11-28 22:34:01 +00:00
Hibby e2a62732f5 New upstream version 6.0.24.51 2024-11-28 22:33:53 +00:00
Hibby 96d6e87d12
Release! 2024-11-12 21:58:14 +00:00
Hibby 5bd018b10f
Little packaging tidies 2024-11-12 21:53:24 +00:00
Hibby 4d14474d92 Update upstream source from tag 'upstream/6.0.24.50'
Update to upstream version '6.0.24.50'
with Debian dir 3f4098912b
2024-11-12 21:20:03 +00:00
Hibby 7d1deaae38 New upstream version 6.0.24.50 2024-11-12 21:20:01 +00:00
Hibby 1b40c8c7b5
Try files-excluded, Tidy up copyright! 2024-11-12 21:18:17 +00:00
Hibby a5ce8b2319
Release! 2024-11-05 22:09:13 +00:00
Hibby 6b795ee1f6
Patch Refresh and mqtt details 2024-11-05 21:46:27 +00:00
Hibby 5767c5f6e8 Update upstream source from tag 'upstream/6.0.24.49'
Update to upstream version '6.0.24.49'
with Debian dir 985e9a7aed
2024-11-05 21:03:23 +00:00
Hibby 424c0bd3e1 New upstream version 6.0.24.49 2024-11-05 21:03:15 +00:00
Hibby 61f49ee46b
Release for hibbian 2024-10-11 15:49:55 +01:00
Hibby 6e6693fde1
Refresh Patches 2024-10-11 15:46:34 +01:00
Hibby 1a7f29f7d7
Look at me, I am the master now 2024-10-11 15:42:39 +01:00
Hibby f527c60884
Merge branch 'debian/latest' into hibbian/latest 2024-10-11 15:42:00 +01:00
Hibby 3de6b0150f Update upstream source from tag 'upstream/6.0.24.45'
Update to upstream version '6.0.24.45'
with Debian dir 9a5822f2bb
2024-10-11 15:37:17 +01:00
Hibby eb0d36d3f6 New upstream version 6.0.24.45 2024-10-11 15:37:11 +01:00
Hibby 0d48067b82
Sneak in the 32bit fixes 2024-09-26 23:13:41 +01:00
Hibby b18a579b0c
Updates to .42 2024-09-25 01:37:12 +01:00
Hibby ba9f74d1b8
more tweaks to get to build 2024-08-30 12:38:57 +01:00
Hibby 550b4483cb
we can't build without this backup! 2024-08-30 12:25:12 +01:00
Hibby 383e238d61
32bit fix release 2024-08-30 12:23:59 +01:00
Hibby 371dac17ff
32bits isn't building 2024-08-30 12:21:15 +01:00
Hibby 24843bc9cd
Add additional group membership for ninotnc SMT users
Fixes: #1
2024-08-30 12:06:42 +01:00
Hibby f17801297c
Release 2024-08-30 11:54:54 +01:00
Hibby f62a0288be
Try hardening on for size 2024-08-30 11:54:32 +01:00
Hibby 85da9edc16
Try hardening on for size 2024-08-30 11:46:56 +01:00
Hibby 666c2aabb4
Start tidying up headers 2024-08-30 11:46:04 +01:00
Hibby a47cc11d8a
First build needs 2024-08-30 10:23:16 +01:00
Hibby b26c87817a Update upstream source from tag 'upstream/6.0.24.42'
Update to upstream version '6.0.24.42'
with Debian dir 41e80b6ddf
2024-08-30 10:15:03 +01:00
Hibby 6dfe32758e New upstream version 6.0.24.42 2024-08-30 10:14:56 +01:00
Hibby 60585818de
Move config back to /etc on install 2024-08-18 01:44:28 +01:00
Hibby 9dacd97014
Release 2024-07-07 16:09:46 +01:00
Hibby fc0275b903
Upstream revision 2024-07-07 16:08:01 +01:00
Hibby ca2a16b7fc Update upstream source from tag 'upstream/6.0.24.40'
Update to upstream version '6.0.24.40'
with Debian dir 5582820246
2024-07-07 16:06:15 +01:00
Hibby 766bbe358d New upstream version 6.0.24.40 2024-07-07 16:06:08 +01:00
Hibby d122a87dd1
New patch to run secure-by-default until upstream patch 2024-07-05 08:35:03 +01:00
Hibby 5b3543c12a
Merge pull request #4 from Online-Amateur-Radio-Club-M0OUK/secure-by-default
Change default value for SECURETELNET from 0 to 1
2024-07-05 08:30:10 +01:00
Tom Fanning d37331205e Create secure-by-default.patch 2024-07-03 10:02:44 +01:00
Tom M0LTE 026ad61c90
Merge pull request #1 from mquin/patch-1
bpq32.cfg: Set SECURETELNET on Telnet port
2024-07-03 09:33:30 +01:00
Mike Quin 5d125856cd
bpq32.cfg: Set SECURETELNET on Telnet port
The SECURETELNET option restricts outbound telnet connections from the node to users who have authenticated.
2024-07-02 19:48:28 +01:00
Hibby a7ecf779fc
Let's fly 2024-06-09 22:38:58 +01:00
Hibby c26f6fe9d8
Packaging updates round 2 2024-06-09 22:34:46 +01:00
Hibby 91fc60e6f0
Packaging updates 2024-06-09 21:52:56 +01:00
Hibby 3b36ba2a06 Update upstream source from tag 'upstream/6.0.24.38'
Update to upstream version '6.0.24.38'
with Debian dir 05f0c663f1
2024-06-09 21:48:46 +01:00
Hibby 951f1d912a New upstream version 6.0.24.38 2024-06-09 21:48:39 +01:00
Hibby ec1e97d985
Update bpq32.cfg
Based on feedback, chat app is now ID 2
2024-06-09 11:15:36 +01:00
Hibby 75eadc6bbe
Release -2 update 2024-04-08 22:27:43 +01:00
Hibby eaab24a3c0
Update postinst 2024-04-08 23:21:31 +02:00
Hibby 4b1144ed94
New upstream 2024-04-06 02:15:37 +01:00
Hibby 37b1c8b074 Update upstream source from tag 'upstream/6.0.24.34'
Update to upstream version '6.0.24.34'
with Debian dir e7ec7ee355
2024-04-06 02:10:15 +01:00
Hibby 933e6c5b86 New upstream version 6.0.24.34 2024-04-06 02:10:08 +01:00
Hibby 0b5e0e5023
Merge branch 'debian/latest' of github.com:Online-Amateur-Radio-Club-M0OUK/oarc-bpqnode into debian/latest 2024-03-26 20:58:02 +00:00
Hibby 66ff00a200
Release 2024-03-26 20:57:34 +00:00
Hibby 566b839fd4
Release 2024-03-26 20:24:27 +00:00
Hibby 5f9fb109ff
New upstream & Packaging tidy 2024-03-26 01:28:08 +00:00
Hibby 94179f117a Update upstream source from tag 'upstream/6.0.24.33'
Update to upstream version '6.0.24.33'
with Debian dir 1cb47d2883
2024-03-26 00:53:01 +00:00
Hibby 5332f8b012 New upstream version 6.0.24.33 2024-03-26 00:52:55 +00:00
Hibby 831f4a75eb
Release 2024-02-23 23:25:02 +00:00
Hibby 3f1fd46905
Upstream revision 2024-02-23 21:38:02 +00:00
Hibby 5b1c61bd78 Update upstream source from tag 'upstream/6.0.24.30'
Update to upstream version '6.0.24.30'
with Debian dir 4f7e13431e
2024-02-23 21:36:42 +00:00
Hibby e8c2a57f79 New upstream version 6.0.24.30 2024-02-23 21:36:36 +00:00
Hibby ee7345ce92
Release 2024-02-13 00:07:16 +00:00
Hibby 733afdfcbc
New upstream 2024-02-13 00:03:15 +00:00
Hibby 2dd6d1f7bf Update upstream source from tag 'upstream/6.0.24.29'
Update to upstream version '6.0.24.29'
with Debian dir ba277a512a
2024-02-12 23:26:50 +00:00
Hibby b8e40a44c9 New upstream version 6.0.24.29 2024-02-12 23:26:44 +00:00
Dave Hibberd 6ee8a719cf
Release 2024-01-18 10:32:10 +00:00
Dave Hibberd d4d0aaa8ab
Update permissions post install on config to allow for web ui edits 2024-01-18 10:31:35 +00:00
Dave Hibberd 710cc6fde7
Release 2024-01-16 20:52:57 +00:00
Dave Hibberd eec767af84
First build of new revision 2024-01-16 20:44:01 +00:00
Dave Hibberd 0c8b9a1da7 Update upstream source from tag 'upstream/6.0.24.27'
Update to upstream version '6.0.24.27'
with Debian dir be0d74d7ed
2024-01-16 20:42:35 +00:00
Dave Hibberd 2634d16f41 New upstream version 6.0.24.27 2024-01-16 20:42:28 +00:00
Dave Hibberd 018d733dee
release 2023-12-28 10:45:07 +00:00
Dave Hibberd 851dcb6fd8
first build of new upstream 2023-12-28 10:44:40 +00:00
Dave Hibberd ce4f1b11b0 Update upstream source from tag 'upstream/6.0.24.25'
Update to upstream version '6.0.24.25'
with Debian dir c5f88a7af8
2023-12-28 10:31:16 +00:00
Dave Hibberd 7a61c594e1 New upstream version 6.0.24.25 2023-12-28 10:31:09 +00:00
Dave Hibberd 1fbded9d3a
Tested final release for new layout 2023-12-16 14:40:33 +00:00
Dave Hibberd a4103962fc
bpq config move 2023-12-16 13:35:16 +00:00
Dave Hibberd 397da35dac
Release 2023-12-08 12:29:51 +00:00
Dave Hibberd 9c15385cb6
Upstream import 2023-12-08 12:27:53 +00:00
Dave Hibberd fd1249b1e2 Update upstream source from tag 'upstream/6.0.24.22'
Update to upstream version '6.0.24.22'
with Debian dir 0520fb299a
2023-12-08 12:26:59 +00:00
Dave Hibberd 2ccd083256 New upstream version 6.0.24.22 2023-12-08 12:26:52 +00:00
Dave Hibberd fda3d6ffac
Release! 2023-10-31 22:50:30 +00:00
Dave Hibberd 37a1ea33be
Update changelog 2023-10-31 22:47:35 +00:00
Dave Hibberd 78e830ab37 Update upstream source from tag 'upstream/6.0.24.16'
Update to upstream version '6.0.24.16'
with Debian dir 638c20d26e
2023-10-31 22:42:30 +00:00
Dave Hibberd 120df97dc7 New upstream version 6.0.24.16 2023-10-31 22:42:23 +00:00
Dave Hibberd 9155d3ba64
New control file 2023-10-31 22:42:17 +00:00
Dave Hibberd 6adcb91ee5
release 2023-10-15 21:45:42 +01:00
Dave Hibberd 77f96f5b63
Update and add conffiles 2023-10-15 21:40:20 +01:00
Dave Hibberd 6f53d92599
release after successful build 2023-10-10 22:20:19 +01:00
Dave Hibberd 46c6058d94
upstream revision 2023-10-10 22:17:39 +01:00
Dave Hibberd 3e029049d7 Update upstream source from tag 'upstream/6.0.24.15'
Update to upstream version '6.0.24.15'
with Debian dir 55d9f12f07
2023-10-10 22:07:21 +01:00
Dave Hibberd b6a50b9b6c
Release the first version into the wild 2023-08-28 23:21:21 +01:00
Dave Hibberd fc474c29fe
Adding run-as-user and a user with the folder as ~ 2023-08-28 23:18:58 +01:00
Dave Hibberd 6546bac3f5
Updates based on feedback from M0LTE 2023-08-28 21:00:50 +01:00
Dave Hibberd ee2ac63a82
Start with the new 6.0.24.2 from upstream 2023-08-28 20:40:52 +01:00
Dave Hibberd 95a6ab069f
Merge branch 'upstream/latest' into debian/latest 2023-08-28 20:39:34 +01:00
Dave Hibberd 055c1c1891 Tweaks to copyright so it's correct 2023-07-18 01:31:08 +01:00
Dave Hibberd 964b72495c Adding gbp.conf so it builds under gbp 2023-07-18 01:29:10 +01:00
Dave Hibberd acb26fd980 Added Debian packaging so far 2023-07-18 01:26:17 +01:00
219 changed files with 16254 additions and 28215 deletions

Binary file not shown.

Binary file not shown.

2130
6pack.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include <process.h> //#include <process.h>
//#include <time.h> //#include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -292,8 +292,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
// Send Error Response // Send Error Response
buffptr->Len = 36; buffptr->Len = sprintf(buffptr->Data, "No Connection to PACTOR TNC\r");
memcpy(buffptr->Data, "No Connection to PACTOR TNC\r", 36);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
@ -383,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;
@ -391,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);
@ -812,7 +810,7 @@ VOID AEAPoll(int Port)
{ {
// Limit amount in TX // Limit amount in TX
if (TNC->Streams[0].BytesTXed - TNC->Streams[0].BytesAcked > 200) if (TNC->Streams[0].bytesTXed - TNC->Streams[0].BytesAcked > 200)
continue; continue;
// If in IRS state for too long, force turnround // If in IRS state for too long, force turnround
@ -877,8 +875,8 @@ VOID AEAPoll(int Port)
EncodeAndSend(TNC, TXMsg, datalen + 1); EncodeAndSend(TNC, TXMsg, datalen + 1);
ReleaseBuffer(buffptr); ReleaseBuffer(buffptr);
TNC->Streams[Stream].BytesTXed += datalen; TNC->Streams[Stream].bytesTXed += datalen;
Debugprintf("Stream %d Sending %d, BytesTXED now %d", Stream, datalen, TNC->Streams[Stream].BytesTXed); Debugprintf("Stream %d Sending %d, BytesTXED now %d", Stream, datalen, TNC->Streams[Stream].bytesTXed);
TNC->Timeout = 0; TNC->Timeout = 0;
TNC->DataBusy = TRUE; TNC->DataBusy = TRUE;
@ -1212,7 +1210,7 @@ static VOID ProcessAEAPacket(struct TNCINFO * TNC, UCHAR * Msg, size_t Len)
// If nothing more to send, turn round link // If nothing more to send, turn round link
if ((TNC->Streams[0].BPQtoPACTOR_Q == 0) && TNC->NeedTurnRound && if ((TNC->Streams[0].BPQtoPACTOR_Q == 0) && TNC->NeedTurnRound &&
(TNC->Streams[0].BytesAcked >= TNC->Streams[0].BytesTXed)) // Nothing following and all acked (TNC->Streams[0].BytesAcked >= TNC->Streams[0].bytesTXed)) // Nothing following and all acked
{ {
Debugprintf("AEA Sent = Acked - sending Turnround"); Debugprintf("AEA Sent = Acked - sending Turnround");
@ -1247,7 +1245,7 @@ static VOID ProcessAEAPacket(struct TNCINFO * TNC, UCHAR * Msg, size_t Len)
Len--; // Remove Header Len--; // Remove Header
buffptr->Len = Len; // Length buffptr->Len = Len; // Length
TNC->Streams[Stream].BytesRXed += (int)Len; TNC->Streams[Stream].bytesRXed += (int)Len;
memcpy(&buffptr->Data[0], Buffer, Len); memcpy(&buffptr->Data[0], Buffer, Len);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
@ -1418,7 +1416,7 @@ static VOID ProcessAEAPacket(struct TNCINFO * TNC, UCHAR * Msg, size_t Len)
Buffer[Len-2] = 0; Buffer[Len-2] = 0;
} }
TNC->Streams[Stream].BytesRXed = TNC->Streams[Stream].BytesTXed = TNC->Streams[Stream].BytesAcked = 0; TNC->Streams[Stream].bytesRXed = TNC->Streams[Stream].bytesTXed = TNC->Streams[Stream].BytesAcked = 0;
TNC->Streams[Stream].ConnectTime = time(NULL); TNC->Streams[Stream].ConnectTime = time(NULL);
if (Stream == 0) if (Stream == 0)

222
AGWAPI.c
View File

@ -26,7 +26,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
@ -36,14 +36,14 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
struct AGWHeader struct AGWHeader
{ {
int Port; unsigned int Port;
unsigned char DataKind; unsigned char DataKind;
unsigned char filler2; unsigned char filler2;
unsigned char PID; unsigned char PID;
unsigned char filler3; unsigned char filler3;
unsigned char callfrom[10]; unsigned char callfrom[10];
unsigned char callto[10]; unsigned char callto[10];
int DataLength; unsigned int DataLength;
int reserved; int reserved;
}; };
@ -55,11 +55,14 @@ struct AGWSocketConnectionInfo
BOOL SocketActive; BOOL SocketActive;
BOOL RawFlag; BOOL RawFlag;
BOOL MonFlag; BOOL MonFlag;
BOOL useLocalTime;
BOOL doNodes;
unsigned char CallSign1[10]; unsigned char CallSign1[10];
unsigned char CallSign2[10]; unsigned char CallSign2[10];
BOOL GotHeader; BOOL GotHeader;
int MsgDataLength; int MsgDataLength;
struct AGWHeader AGWRXHeader; struct AGWHeader AGWRXHeader;
unsigned char * MsgData;
}; };
struct BPQConnectionInfo struct BPQConnectionInfo
@ -75,8 +78,6 @@ struct BPQConnectionInfo
char AGWPorts[1000]; char AGWPorts[1000];
byte AGWMessage[1000];
struct AGWHeader AGWTXHeader; struct AGWHeader AGWTXHeader;
char SessionList[100]; char SessionList[100];
@ -127,7 +128,7 @@ int DataSocket_Write(struct AGWSocketConnectionInfo * sockptr, SOCKET sock);
int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr); int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr); int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
int SendDataToAppl(int Stream, byte * Buffer, int Length); int SendDataToAppl(int Stream, byte * Buffer, int Length);
int InternalAGWDecodeFrame(char * msg, char * buffer, int Stamp, int * FrameType); int InternalAGWDecodeFrame(char * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes);
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr); int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length); int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
int ShowApps(); int ShowApps();
@ -401,7 +402,7 @@ int SetUpHostSessions()
extern struct DATAMESSAGE * REPLYBUFFER; extern struct DATAMESSAGE * REPLYBUFFER;
extern BOOL AGWActive; extern BOOL AGWActive;
VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWAGW(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY AGW Session Status // DISPLAY AGW Session Status
@ -562,10 +563,28 @@ int AGWConnected(struct BPQConnectionInfo * Con, int Stream)
(memcmp(sockptr->CallSign1, ApplCall, 10) == 0) || (memcmp(sockptr->CallSign2, ApplCall, 10) == 0)) (memcmp(sockptr->CallSign1, ApplCall, 10) == 0) || (memcmp(sockptr->CallSign2, ApplCall, 10) == 0))
{ {
// Create Key // Create Key
char callsign[10];
int port;
int sesstype;
int paclen;
int maxframe;
int l4window;
keyptr=(byte *)&Con->CallKey; keyptr=(byte *)&Con->CallKey;
*(keyptr++)='1'; // Try using the BPQ Port Number if a L2 connect, first free port number if not
GetConnectionInfo(Stream, callsign,
&port, &sesstype, &paclen,
&maxframe, &l4window);
if (port == 0)
port = 64;
*(keyptr++)='0' + port;
memcpy(keyptr, ApplCall, 10); memcpy(keyptr, ApplCall, 10);
keyptr+=10; keyptr+=10;
memcpy(keyptr,ConnectingCall, 10); memcpy(keyptr,ConnectingCall, 10);
@ -685,8 +704,9 @@ int AGWDoMonitorData()
struct AGWSocketConnectionInfo * sockptr; struct AGWSocketConnectionInfo * sockptr;
byte AGWBuffer[1000]; byte AGWBuffer[1000];
int n; int n;
int Stamp, Frametype; int Frametype;
BOOL RXFlag, NeedAGW; BOOL RXFlag;
time_t Stamp;
// Look for Monitor Data // Look for Monitor Data
@ -707,7 +727,7 @@ int AGWDoMonitorData()
return 0; return 0;
} }
Stamp = (UINT)monbuff->Timestamp; Stamp = monbuff->Timestamp;
memcpy(Buffer, monbuff, RawLen); memcpy(Buffer, monbuff, RawLen);
@ -731,24 +751,16 @@ int AGWDoMonitorData()
RXFlag = TRUE; RXFlag = TRUE;
} }
NeedAGW = FALSE; // 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++)
{ {
sockptr=&Sockets[n]; sockptr = &Sockets[n];
if (sockptr->SocketActive && sockptr->MonFlag) NeedAGW = TRUE; if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag))
}
if (NeedAGW)
{
if (RXFlag || LoopMonFlag) // only send txed frames if requested
{ {
Length = InternalAGWDecodeFrame(Buffer, AGWBuffer,Stamp, &Frametype); Length = InternalAGWDecodeFrame(Buffer, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes);
//
// Decode frame and send to applications which have requested monitoring
//
if (Length > 0) if (Length > 0)
{ {
AGWTXHeader.Port = Port - 1; // AGW Ports start from 0 AGWTXHeader.Port = Port - 1; // AGW Ports start from 0
@ -786,13 +798,7 @@ int AGWDoMonitorData()
memset(AGWTXHeader.callfrom, 0,10); memset(AGWTXHeader.callfrom, 0,10);
ConvFromAX25(monbuff->ORIGIN, AGWTXHeader.callfrom); ConvFromAX25(monbuff->ORIGIN, AGWTXHeader.callfrom);
for (n = 1; n<= CurrentSockets; n++) SendRawPacket(sockptr, AGWBuffer, Length);
{
sockptr=&Sockets[n];
if (sockptr->SocketActive && sockptr->MonFlag)
SendRawPacket(sockptr, AGWBuffer, Length);
}
} }
} }
} }
@ -1011,6 +1017,7 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
{ {
int i; int i;
int DataLength; int DataLength;
struct AGWHeader * AGW = &sockptr->AGWRXHeader;
ioctlsocket(sock,FIONREAD,&DataLength); ioctlsocket(sock,FIONREAD,&DataLength);
@ -1022,69 +1029,98 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
return 0; return 0;
} }
if (DataLength < 36) // A header
{
// If we don't get a header within a few ms assume a rogue connection and close it
int n = 50;
while (n--)
{
Sleep(10);
ioctlsocket(sock,FIONREAD,&DataLength);
if (DataLength >= 36)
break;
}
if (n < 1)
{
Debugprintf("Corrupt AGW Packet Received");
AGWDataSocket_Disconnect(sockptr);
return 0;
}
}
// Have a header
i=recv(sock,(char *)&sockptr->AGWRXHeader, 36, 0);
if (i == SOCKET_ERROR)
{
i=WSAGetLastError();
AGWDataSocket_Disconnect(sockptr);
}
sockptr->MsgDataLength = sockptr->AGWRXHeader.DataLength;
// Validate packet to protect against accidental (or malicious!) connects from a non-agw application
if (AGW->Port > 64 || AGW->filler2 != 0 || AGW->filler3 != 0 || AGW->DataLength > 400)
{
Debugprintf("Corrupt AGW Packet Received");
AGWDataSocket_Disconnect(sockptr);
return 0;
}
if (sockptr->MsgDataLength == 0)
ProcessAGWCommand (sockptr);
else
sockptr->GotHeader = TRUE; // Wait for data
ioctlsocket(sock,FIONREAD,&DataLength); // See if more data
if (sockptr->GotHeader) if (sockptr->GotHeader)
{ {
// Received a header, without sufficient data bytes // Received a header, without sufficient data bytes
if (DataLength < sockptr->MsgDataLength) if (DataLength < sockptr->MsgDataLength)
{ {
// Fiddle - seem to be problems somtimes with un-Neagled hosts // Fiddle - seem to be problems somtimes with un-Neagled hosts so wait a few ms
// if we don't get a full packet assume a rogue connection and close it
Sleep(500);
ioctlsocket(sock,FIONREAD,&DataLength); int n = 50;
while (n--)
{
Sleep(10);
ioctlsocket(sock,FIONREAD,&DataLength);
if (DataLength >= sockptr->MsgDataLength)
break;
}
if (n < 1)
{
Debugprintf("Corrupt AGW Packet Received");
AGWDataSocket_Disconnect(sockptr);
return 0;
}
} }
if (DataLength >= sockptr->MsgDataLength) if (DataLength >= sockptr->MsgDataLength)
{ {
// Read Data and Process Command // Read Data and Process Command
sockptr->MsgData = malloc(sockptr->MsgDataLength);
i=recv(sock, AGWMessage, sockptr->MsgDataLength, 0); i = recv(sock, sockptr->MsgData, sockptr->MsgDataLength, 0);
ProcessAGWCommand (sockptr); ProcessAGWCommand (sockptr);
free(sockptr->MsgData);
sockptr->GotHeader = FALSE; sockptr->GotHeader = FALSE;
} }
// Not Enough Data - wait
} }
else // Not got header
{
if (DataLength > 35)// A header
{
i=recv(sock,(char *)&sockptr->AGWRXHeader, 36, 0);
if (i == SOCKET_ERROR)
{
i=WSAGetLastError();
AGWDataSocket_Disconnect(sockptr);
}
sockptr->MsgDataLength = sockptr->AGWRXHeader.DataLength;
if (sockptr->MsgDataLength > 500)
OutputDebugString("Corrupt AGW message");
if (sockptr->MsgDataLength == 0)
{
ProcessAGWCommand (sockptr);
}
else
{
sockptr->GotHeader = TRUE; // Wait for data
}
}
// not got 36 bytes
}
return 0; return 0;
} }
@ -1106,6 +1142,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
@ -1160,7 +1197,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]); conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]);
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
@ -1168,14 +1205,14 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
{ {
// Have digis // Have digis
char * Digis = AGWMessage; char * Digis = sockptr->MsgData;
int nDigis = Digis[0]; int nDigis = Digis[0];
Digis ++; Digis ++;
while(nDigis--) while(nDigis--)
{ {
sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis); n += sprintf(&ConnectMsg[n], " %s", Digis);
Digis += 10; Digis += 10;
} }
} }
@ -1205,7 +1242,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
{ {
if (memcmp(AGWConnections[con].CallKey,key,21) == 0) if (memcmp(AGWConnections[con].CallKey,key,21) == 0)
{ {
SendMsg(AGWConnections[con].BPQStream, AGWMessage, sockptr->MsgDataLength); SendMsg(AGWConnections[con].BPQStream, sockptr->MsgData, sockptr->MsgDataLength);
return 0; return 0;
} }
} }
@ -1294,15 +1331,28 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
// Send Raw Frame // Send Raw Frame
SendRaw(sockptr->AGWRXHeader.Port+1,&AGWMessage[1], sockptr->MsgDataLength - 1); SendRaw(sockptr->AGWRXHeader.Port+1,&sockptr->MsgData[1], sockptr->MsgDataLength - 1);
return 0; return 0;
case 'm': case 'm':
// Toggle Monitor receive // Toggle Monitor receive
sockptr->MonFlag = !sockptr->MonFlag; if (sockptr->AGWRXHeader.DataLength == 12) // QtTermTCP monitor info
{
// Msg[AGWHDDRRLEN] = AGWUsers->MonSess->mlocaltime;
// Msg[AGWHDDRRLEN + 1] = AGWUsers->MonSess->MonitorNODES;
//Msg[AGWHDDRRLEN + 2] = AGWUsers->MonSess->MonitorColour;
// Msg[AGWHDDRRLEN + 3] = AGWUsers->MonSess->mtxparam;
// memcpy(&Msg[AGWHDDRRLEN + 4], (void *)&AGWUsers->MonSess->portmask, 8);
sockptr->useLocalTime = sockptr->MsgData[0];
sockptr->doNodes = sockptr->MsgData[1];
sockptr->MonFlag = 1;
}
else
sockptr->MonFlag = !sockptr->MonFlag;
return 0; return 0;
@ -1318,11 +1368,11 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
if (sockptr->AGWRXHeader.DataKind == 'V') // Unproto with VIA string if (sockptr->AGWRXHeader.DataKind == 'V') // Unproto with VIA string
{ {
Digis = AGWMessage[0]; // Number of digis Digis = sockptr->MsgData[0]; // Number of digis
for (j = 1; j<= Digis; j++) for (j = 1; j<= Digis; j++)
{ {
ConvToAX25(&AGWMessage[(j - 1) * 10 + 1],&TXMessage[7+(j*7)]); // No "last" bit ConvToAX25(&sockptr->MsgData[(j - 1) * 10 + 1],&TXMessage[7+(j*7)]); // No "last" bit
} }
// set end of call // set end of call
@ -1342,7 +1392,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
else else
*(TXMessageptr++) = sockptr->AGWRXHeader.PID; *(TXMessageptr++) = sockptr->AGWRXHeader.PID;
memcpy(TXMessageptr,&AGWMessage[MsgStart], sockptr->MsgDataLength - MsgStart); memcpy(TXMessageptr,&sockptr->MsgData[MsgStart], sockptr->MsgDataLength - MsgStart);
TXMessageptr += (sockptr->MsgDataLength - MsgStart); TXMessageptr += (sockptr->MsgDataLength - MsgStart);

1646
AGWMon.asm

File diff suppressed because it is too large Load Diff

View File

@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
// MSGFLAG contains CMD/RESPONSE BITS // MSGFLAG contains CMD/RESPONSE BITS
@ -61,15 +61,14 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define NODES_SIG 0xFF #define NODES_SIG 0xFF
char * strlop(char * buf, char delim);
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen); UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen); static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes);
static UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen); static UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
static UCHAR * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output); static UCHAR * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output);
int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameType) int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int DoNodes)
{ {
UCHAR * ptr; UCHAR * ptr;
int n; int n;
@ -81,7 +80,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
char PFCHAR[3] = " "; char PFCHAR[3] = " ";
int MSGFLAG = 0; //CR and V1 flags int MSGFLAG = 0; //CR and V1 flags
char * Output = buffer; char * Output = buffer;
int HH, MM, SS;
char From[10], To[10]; char From[10], To[10];
BOOL Info = 0; BOOL Info = 0;
BOOL FRMRFLAG = 0; BOOL FRMRFLAG = 0;
@ -89,6 +87,13 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
BOOL TESTFLAG = 0; BOOL TESTFLAG = 0;
size_t MsgLen = msg->LENGTH; size_t MsgLen = msg->LENGTH;
struct tm * TM;
if (useLocalTime)
TM = localtime(&Stamp);
else
TM = gmtime(&Stamp);
// GET THE CONTROL BYTE, TO SEE IF THIS FRAME IS TO BE DISPLAYED // GET THE CONTROL BYTE, TO SEE IF THIS FRAME IS TO BE DISPLAYED
n = 8; // MAX DIGIS n = 8; // MAX DIGIS
@ -124,14 +129,6 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
*FrameType = CTL; *FrameType = CTL;
Stamp = Stamp % 86400; // Secs
HH = Stamp / 3600;
Stamp -= HH * 3600;
MM = Stamp / 60;
SS = Stamp - MM * 60;
Output += sprintf((char *)Output, " %d:Fm ", msg->PORT & 0x7f); // Mask TX bit Output += sprintf((char *)Output, " %d:Fm ", msg->PORT & 0x7f); // Mask TX bit
From[ConvFromAX25(msg->ORIGIN, From)] = 0; From[ConvFromAX25(msg->ORIGIN, From)] = 0;
@ -297,7 +294,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
} }
Output += sprintf((char *)Output, "[%02d:%02d:%02d]", HH, MM, SS); Output += sprintf((char *)Output, "[%02d:%02d:%02d]", TM->tm_hour, TM->tm_min, TM->tm_sec);
if (FRMRFLAG) if (FRMRFLAG)
@ -345,7 +342,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
} }
case NETROM_PID: case NETROM_PID:
Output = DISPLAY_NETROM(ADJBUFFER, Output,(int) MsgLen); Output = DISPLAY_NETROM(ADJBUFFER, Output,(int) MsgLen, DoNodes);
break; break;
case IP_PID: case IP_PID:
@ -366,6 +363,9 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
} }
} }
if (Output == NULL)
return 0;
if (Output[-1] != 13) if (Output[-1] != 13)
Output += sprintf((char *)Output, "\r"); Output += sprintf((char *)Output, "\r");
@ -374,7 +374,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameT
} }
// Display NET/ROM data // Display NET/ROM data
UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen) UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes)
{ {
char Alias[7]= ""; char Alias[7]= "";
char Dest[10]; char Dest[10];
@ -386,6 +386,8 @@ UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
{ {
// Display NODES // Display NODES
if (DoNodes == 0)
return NULL;
// If an INP3 RIF (type <> UI) decode as such // If an INP3 RIF (type <> UI) decode as such

View File

@ -7,7 +7,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
//#include "tncinfo.h" //#include "tncinfo.h"
//#include "adif.h" //#include "adif.h"
//#include "telnetserver.h" //#include "telnetserver.h"
@ -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);
} }
@ -832,6 +848,7 @@ void SaveNavAidDataBase()
char FN[256]; char FN[256];
struct NAVAIDRECORD * navptr; struct NAVAIDRECORD * navptr;
if (BPQDirectory[0] == 0) if (BPQDirectory[0] == 0)
{ {
strcpy(FN, "AIS_NavAids.txt"); strcpy(FN, "AIS_NavAids.txt");
@ -2372,6 +2389,8 @@ void ProcessAISNavAidMessage()
NavAidCount++; NavAidCount++;
ProcessAISNavAidMessage(); ProcessAISNavAidMessage();
NavAidDBChanged = 1;
return; return;

View File

@ -22,11 +22,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// First Version, November 2011 // First Version, November 2011
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h> #include <stdio.h>
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include <time.h> #include <time.h>
#include "kernelresource.h" #include "kernelresource.h"
@ -63,7 +62,6 @@ VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Consoleprintf(const char * format, ...); VOID __cdecl Consoleprintf(const char * format, ...);
BOOL APIENTRY Send_AX(PMESSAGE Block, DWORD Len, UCHAR Port); BOOL APIENTRY Send_AX(PMESSAGE Block, DWORD Len, UCHAR Port);
VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port); VOID Send_AX_Datagram(PDIGIMESSAGE Block, DWORD Len, UCHAR Port);
char * strlop(char * buf, char delim);
int APRSDecodeFrame(char * msg, char * buffer, time_t Stamp, uint64_t Mask); // Unsemaphored DecodeFrame int APRSDecodeFrame(char * msg, char * buffer, time_t Stamp, uint64_t Mask); // Unsemaphored DecodeFrame
APRSHEARDRECORD * UpdateHeard(UCHAR * Call, int Port); APRSHEARDRECORD * UpdateHeard(UCHAR * Call, int Port);
BOOL CheckforDups(char * Call, char * Msg, int Len); BOOL CheckforDups(char * Call, char * Msg, int Len);
@ -88,7 +86,7 @@ double myDistance(double laa, double loa, BOOL KM);
struct STATIONRECORD * FindStation(char * Call, BOOL AddIfNotFound); struct STATIONRECORD * FindStation(char * Call, BOOL AddIfNotFound);
int DecodeAPRSPayload(char * Payload, struct STATIONRECORD * Station); int DecodeAPRSPayload(char * Payload, struct STATIONRECORD * Station);
BOOL KillOldTNC(char * Path); BOOL KillOldTNC(char * Path);
int FromLOC(char * Locator, double * pLat, double * pLon);
BOOL ToLOC(double Lat, double Lon , char * Locator); BOOL ToLOC(double Lat, double Lon , char * Locator);
BOOL InternalSendAPRSMessage(char * Text, char * Call); BOOL InternalSendAPRSMessage(char * Text, char * Call);
void UndoTransparency(char * input); void UndoTransparency(char * input);
@ -104,6 +102,7 @@ void ClearSavedMessages();
void GetSavedAPRSMessages(); void GetSavedAPRSMessages();
static VOID GPSDConnect(void * unused); static VOID GPSDConnect(void * unused);
int CanPortDigi(int Port); int CanPortDigi(int Port);
int FromLOC(char * Locator, double * pLat, double * pLon);
extern int SemHeldByAPI; extern int SemHeldByAPI;
extern int APRSMONDECODE(); extern int APRSMONDECODE();
@ -348,7 +347,7 @@ APRSHEARDRECORD MHTABLE[MAXHEARD] = {0};
APRSHEARDRECORD * MHDATA = &MHTABLE[0]; APRSHEARDRECORD * MHDATA = &MHTABLE[0];
static SOCKET sock = (SOCKET) NULL; static SOCKET sock = 0;
//Duplicate suppression Code //Duplicate suppression Code
@ -554,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;
@ -575,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;
@ -1581,9 +1583,9 @@ OK:
// Copy frame to a DIGIMessage Struct // Copy frame to a DIGIMessage Struct
memcpy(&Msg, monbuff, 21 + (7 * Digis)); // Header, Dest, Source, Addresses and Digis memcpy(&Msg, monbuff, MSGHDDRLEN + 14 + (7 * Digis)); // Header, Dest, Source, Addresses and Digis
len = Msg.LENGTH - 21 - (7 * Digis); // Payload Length (including CTL and PID len = Msg.LENGTH - (MSGHDDRLEN + 14) - (7 * Digis); // Payload Length (including CTL and PID
memcpy(&Msg.CTL, &AdjBuff->CTL, len); memcpy(&Msg.CTL, &AdjBuff->CTL, len);
@ -2187,7 +2189,7 @@ static int APRSProcessLine(char * buf)
CrossPortMap[Port][0] = FALSE; // Cancel Default APRSIS CrossPortMap[Port][0] = FALSE; // Cancel Default APRSIS
if (Context == NULL || Context[0] == 0) if (Context == NULL || Context[0] == 0)
return FALSE; return TRUE;
ptr = strtok_s(NULL, ",\t\n\r", &Context); ptr = strtok_s(NULL, ",\t\n\r", &Context);
@ -2552,6 +2554,8 @@ VOID SendAPRSMessageEx(char * Message, int toPort, char * FromCall, int Gated)
else else
continue; continue;
Msg.DEST[6] |= 0x80; // set Command Bit
ConvToAX25(FromCall, Msg.ORIGIN); ConvToAX25(FromCall, Msg.ORIGIN);
Msg.PID = 0xf0; Msg.PID = 0xf0;
Msg.CTL = 3; Msg.CTL = 3;
@ -2580,6 +2584,8 @@ VOID SendAPRSMessageEx(char * Message, int toPort, char * FromCall, int Gated)
else else
return; return;
Msg.DEST[6] |= 0x80; // set Command Bit
ConvToAX25(FromCall, Msg.ORIGIN); ConvToAX25(FromCall, Msg.ORIGIN);
Msg.PID = 0xf0; Msg.PID = 0xf0;
Msg.CTL = 3; Msg.CTL = 3;
@ -2756,7 +2762,8 @@ void SendBeaconThread(void * Param)
Debugprintf("Sending APRS Beacon to port %d", toPort); Debugprintf("Sending APRS Beacon to port %d", toPort);
memcpy(Msg.DEST, &BeaconHeader[toPort][0][0], 10 * 7); // Clear unused digis memcpy(Msg.DEST, &BeaconHeader[toPort][0][0], 10 * 7); // Clear unused digis
Msg.DEST[6] |= 0x80; // set Command Bit
GetSemaphore(&Semaphore, 12); GetSemaphore(&Semaphore, 12);
Send_AX_Datagram(&Msg, Len + 2, toPort); Send_AX_Datagram(&Msg, Len + 2, toPort);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
@ -2780,6 +2787,8 @@ void SendBeaconThread(void * Param)
Msg.CTL = 3; Msg.CTL = 3;
memcpy(Msg.DEST, &BeaconHeader[Port][0][0], 10 * 7); memcpy(Msg.DEST, &BeaconHeader[Port][0][0], 10 * 7);
Msg.DEST[6] |= 0x80; // set Command Bit
GetSemaphore(&Semaphore, 12); GetSemaphore(&Semaphore, 12);
Send_AX_Datagram(&Msg, Len + 2, Port); Send_AX_Datagram(&Msg, Len + 2, Port);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
@ -2815,6 +2824,8 @@ VOID SendObject(struct OBJECT * Object)
Msg.CTL = 3; Msg.CTL = 3;
Len = sprintf(Msg.L2DATA, "%s", Object->Message); Len = sprintf(Msg.L2DATA, "%s", Object->Message);
memcpy(Msg.DEST, &Object->Path[0][0], Object->PathLen + 1); memcpy(Msg.DEST, &Object->Path[0][0], Object->PathLen + 1);
Msg.DEST[6] |= 0x80; // set Command Bit
Send_AX_Datagram(&Msg, Len + 2, Port); Send_AX_Datagram(&Msg, Len + 2, Port);
} }
} }
@ -2881,6 +2892,8 @@ VOID SendIStatus()
if (BeaconHddrLen[Port]) // Only send to ports with a DEST defined if (BeaconHddrLen[Port]) // Only send to ports with a DEST defined
{ {
memcpy(Msg.DEST, &BeaconHeader[Port][0][0], 10 * 7); memcpy(Msg.DEST, &BeaconHeader[Port][0][0], 10 * 7);
Msg.DEST[6] |= 0x80; // set Command Bit
Send_AX_Datagram(&Msg, Len + 2, Port); Send_AX_Datagram(&Msg, Len + 2, Port);
} }
} }
@ -3102,7 +3115,7 @@ VOID APRSISThread(void * Report)
BOOL bcopt=TRUE; BOOL bcopt=TRUE;
char Buffer[1000]; char Buffer[1000];
int InputLen = 1; // Non-zero int InputLen = 1; // Non-zero
char errmsg[100]; char errmsg[300];
char * ptr; char * ptr;
size_t inptr = 0; size_t inptr = 0;
char APRSinMsg[1000]; char APRSinMsg[1000];
@ -3663,7 +3676,7 @@ BOOL CheckforDups(char * Call, char * Msg, int Len)
if (ptr1) if (ptr1)
*ptr1 = 0; *ptr1 = 0;
// Debugprintf("Duplicate Message supressed %s", Msg); // Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate return TRUE; // Duplicate
} }
} }
@ -7655,7 +7668,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
} }
OutputLen += sprintf(&OutBuffer[OutputLen], WebTrailer); OutputLen += sprintf(&OutBuffer[OutputLen], "%s", WebTrailer);
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen); HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
sendandcheck(sock, Header, HeaderLen); sendandcheck(sock, Header, HeaderLen);
@ -7700,7 +7713,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
} }
OutputLen += sprintf(&OutBuffer[OutputLen], WebTrailer); OutputLen += sprintf(&OutBuffer[OutputLen], "%s", WebTrailer);
HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen); HeaderLen = sprintf(Header, "HTTP/1.0 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", OutputLen);
sendandcheck(sock, Header, HeaderLen); sendandcheck(sock, Header, HeaderLen);
@ -8102,7 +8115,7 @@ extern char OrigCmdBuffer[81];
BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr); BOOL isSYSOP(TRANSPORTENTRY * Session, char * Bufferptr);
VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID APRSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// APRS Subcommands. Default for compatibility is APRSMH // APRS Subcommands. Default for compatibility is APRSMH
@ -9143,7 +9156,7 @@ void GetSavedAPRSMessages()
FILE *file; FILE *file;
struct APRSMESSAGE * Message; struct APRSMESSAGE * Message;
struct APRSMESSAGE * ptr; struct APRSMESSAGE * ptr;
char Line[256]; char Line[512];
char * Stamp = 0; char * Stamp = 0;
char * From = 0; char * From = 0;
char * To = 0; char * To = 0;
@ -9167,7 +9180,7 @@ void GetSavedAPRSMessages()
if ((file = fopen(FN, "r")) == NULL) if ((file = fopen(FN, "r")) == NULL)
return ; return ;
while (fgets(Line, 512, file)) while (fgets(Line, sizeof(Line), file))
{ {
Stamp = Line; Stamp = Line;
From = strlop(Stamp, ' '); From = strlop(Stamp, ' ');

View File

@ -3225,6 +3225,170 @@ char * get_plane(int * Len)
return ptr; return ptr;
} }
char * get_portstats()
{
char Msg[] =
"<!DOCTYPE html>\n"
"<html>\n"
"\n"
"<head>\n"
"<script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"> </script>\n"
"</head>\n"
"\n"
"\n"
"<body>\n"
"<H2 id=\"h1\"> Last hour's stats for Port </h2>\n"
"<p>\n"
"<canvas id=\"myCanvas\" width=\"600\" height=\"250\" style=\"border:1px solid #d3d3d3;\">\n"
"Your browser does not support the HTML canvas tag.</canvas>\n"
"<br>\n"
"<canvas id=\"myCanvas2\" width=\"600\" height=\"250\" style=\"border:1px solid #d3d3d3;\">\n"
"Your browser does not support the HTML canvas tag.</canvas>\n"
"\n"
"<script>\n"
"var c = document.getElementById(\"myCanvas\");\n"
"var ctx = c.getContext(\"2d\");\n"
"\n"
"var port = window.location.search.slice(1);\n"
"\n"
"document.getElementById(\"h1\").innerHTML = \"Last hour's stats for Port \" + port;;\n"
"\n"
"var oReq = new XMLHttpRequest();\n"
"oReq.open(\"GET\", \"/portstats.txt?\" + port, true);\n"
"oReq.responseType = \"arraybuffer\";\n"
"\n"
"oReq.onload = function(oEvent)\n"
" {\n"
" var arrayBuffer = oReq.response;\n"
"\n"
" var byteArray = new Uint8Array(arrayBuffer);\n"
" \n"
" \n"
" // Draw it. Do last hour for testing. Plot each value for 10 pixels\n"
" \n"
"\tctx.strokeStyle = \"green\";\n"
"\tctx.beginPath();\n"
"\t\n"
"\tctx.moveTo(0,200);\n"
"\tvar y = 2880 - 60;\n"
"\tvar val;\n"
"\t\n"
"\tfor (i = 0; i < 600; i+=10)\n"
"\t{\n"
"\t\tval = byteArray[y] * 2;\n"
"\t\t\n"
"\t\tctx.lineTo(i, 200 - val);\n"
"\t\tctx.lineTo(i+10, 200 - val);\n"
"\t\ty++;\n"
"\t}\n"
"\t\n"
"\tctx.stroke();\n"
"\t\n"
"\tctx.strokeStyle = \"gray\";\n"
"\tctx.setLineDash([5, 3]);\n"
"\t\n"
"\tctx.beginPath();\n"
" \tctx.moveTo(0,100);\n"
"\tctx.lineTo(600,100);\n"
" \tctx.moveTo(0,50);\n"
"\tctx.lineTo(600,50);\n"
" \tctx.moveTo(0,150);\n"
"\tctx.lineTo(600,150);\n"
"\tctx.stroke();\n"
"\n"
"\n"
"\t\n"
"\tctx.fillText(\"100%\",0,10);\n"
"\tctx.fillText(\"50%\",0,100);\n"
"\tctx.fillText(\"0%\",0,200);\t\n"
"\tctx.fillText(\"-60 mins\",0,220);\t\n"
"\tctx.fillText(\"-30 mins\",300,220);\t\n"
"\tctx.fillText(\"Now\",580,220);\t\n"
"\n"
"\t\n"
"\t// Do TX\n"
"\t\n"
"\t\n"
"\tc = document.getElementById(\"myCanvas2\");\n"
"\tctx = c.getContext(\"2d\");\n"
"\n"
"\tctx.fillText(\"100%\",0,10);\n"
"\tctx.fillText(\"50%\",0,100);\n"
"\tctx.fillText(\"0%\",0,200);\t\n"
"\tctx.fillText(\"-60 mins\",0,220);\t\n"
"\tctx.fillText(\"-30 mins\",300,220);\t\n"
"\tctx.fillText(\"Now\",580,220);\t\n"
"\n"
"\n"
"\tctx.strokeStyle = \"red\";\n"
"\tctx.beginPath();\n"
"\t\n"
"\tctx.moveTo(0,200);\n"
"\tvar y = 1440 - 60;\n"
"\tvar val;\n"
"\t\n"
"\tfor (i = 0; i < 600; i+=10)\n"
"\t\n"
"\t{\n"
"\t\tval = byteArray[y] * 2;\n"
"\t\t\n"
"\t\tctx.lineTo(i, 200 - val);\n"
"\t\tctx.lineTo(i+10, 200 - val);\n"
"\t\ty++;\n"
"\t}\n"
"\t\n"
"\tctx.stroke();\n"
"\n"
"\tctx.strokeStyle = \"gray\";\n"
"\tctx.setLineDash([5, 3]);\n"
"\t\n"
"\tctx.beginPath();\n"
" \tctx.moveTo(0,100);\n"
"\tctx.lineTo(600,100);\n"
" \tctx.moveTo(0,50);\n"
"\tctx.lineTo(600,50);\n"
" \tctx.moveTo(0,150);\n"
"\tctx.lineTo(600,150);\n"
"\tctx.stroke();\n"
"\n"
"\n"
"};\n"
"\n"
"oReq.send();\n"
"\n"
"\n"
"function draw(Data)\n"
"{\n"
"\n"
"\t// Data has 4 bytes of index to current position the 1440 bytes of load info\n"
"\t\n"
"\n"
"\tview = new Int8Array(Data);\n"
"\t\n"
"alert(view[3]);\n"
"\n"
"ctx.moveTo(0,200);\n"
"var y = 0;\n"
"for (i = 0; i < 720; i+=30)\n"
"{\n"
"\tctx.lineTo(i, 200 - y);\n"
"\tctx.lineTo(i+30, 200 - y);\n"
"\ty += 10;\n"
"}\n"
"\n"
"\n"
"ctx.stroke();\n"
"}\n"
"\n"
"</script>\n"
"\n"
"</body>\n"
"</html>\n"
"\n"
"";
return _strdup(Msg);;
}
char * get_aprs() char * get_aprs()
{ {
@ -3279,31 +3443,40 @@ char * get_aprs()
"\n" "\n"
"var myTimeout;\n" "var myTimeout;\n"
"\n" "\n"
"var server1 = \"http://server1.g8bpq.net:7383\"\n"
"var server2 = \"http://server2.g8bpq.net:7383\"\n" //https://tile.openstreetmap.org/{zoom}/{x}/{y}.png
// "var server1 = \"http://server1.g8bpq.net:7383\"\n"
// "var server2 = \"http://server2.g8bpq.net:7383\"\n"
"var server1 = \"tile.openstreetmap.org\"\n"
"var server2 = \"tile.openstreetmap.org\"\n"
"\n" "\n"
"function getMap(p)\n" "function getMap(p)\n"
"{\n" "{\n"
" var gl = L.maplibreGL({style: server1 + '/styles/G8BPQ/style.json'});\n"
" gl.addTo(p);\n" " L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'}).addTo(p);\r\n"
" var maplibreMap = gl.getMaplibreMap();\n"
"\n" // " var gl = L.maplibreGL({style: server1 + '/styles/G8BPQ/style.json'});\n"
" // if load from first server fails, switch to backup\n" // " gl.addTo(p);\n"
"\n" // " var maplibreMap = gl.getMaplibreMap();\n"
" maplibreMap.on('error', e =>\n" // "\n"
" {\n" // " // if load from first server fails, switch to backup\n"
" console.log(e.error);\n" // "\n"
"\n" // " maplibreMap.on('error', e =>\n"
" if (e && e.error == 'Error: Failed to fetch')\n" // " {\n"
" {\n" // " console.log(e.error);\n"
" console.log('failed to load from ' + server1 + ', trying ' + server2);\n" // "\n"
" var gl2 = L.maplibreGL({style: server2 + '/styles/G8BPQ/style.json'});\n" // " if (e && e.error == 'Error: Failed to fetch')\n"
" p.removeLayer(gl)\n" // " {\n"
" gl2.addTo(p);\n" // " console.log('failed to load from ' + server1 + ', trying ' + server2);\n"
" }\n" // " var gl2 = L.maplibreGL({style: server2 + '/styles/G8BPQ/style.json'});\n"
" });\n" // " p.removeLayer(gl)\n"
"\n" // " gl2.addTo(p);\n"
" p.attributionControl.addAttribution('Map data from <a href=https://www.openstreetmap.org/copyright>OpenStreetMap</a><a href=https://github.com/maplibre/maplibre-gl-leaflet> using maplibre-gl</a> <a href=https://github.com/mapbox/mapbox-gl-styles>Styles based on Mapbox gl');\n" // " }\n"
// " });\n"
// "\n"
// " p.attributionControl.addAttribution('Map data from <a href=https://www.openstreetmap.org/copyright>OpenStreetMap</a><a href=https://github.com/maplibre/maplibre-gl-leaflet> using maplibre-gl</a> <a href=https://github.com/mapbox/mapbox-gl-styles>Styles based on Mapbox gl');\n"
" L.control.scale().addTo(p);\n" " L.control.scale().addTo(p);\n"
"}\n" "}\n"
"\n" "\n"
@ -3629,6 +3802,10 @@ char * GetStandardPage(char * FN, int * Len)
if (_stricmp(FN, "leaflet.rotatedMarker.js") == 0) if (_stricmp(FN, "leaflet.rotatedMarker.js") == 0)
return get_rotatedMarker(); return get_rotatedMarker();
if (_stricmp(FN, "PortStats.html") == 0)
return get_portstats();
if (_stricmp(FN, "info_call.html") == 0) if (_stricmp(FN, "info_call.html") == 0)
return get_info_call(); return get_info_call();

166
ARDOP.c
View File

@ -45,7 +45,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
int (WINAPI FAR *GetModuleFileNameExPtr)(); int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -136,6 +136,10 @@ 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].Attached = 0;
if (TNC->TCPSock) if (TNC->TCPSock)
{ {
shutdown(TNC->TCPSock, SD_BOTH); shutdown(TNC->TCPSock, SD_BOTH);
@ -162,6 +166,9 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped"); sprintf(PORT->TNC->WEB_COMMSSTATE, "%s", "Port Stopped");
MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE); MySetWindowText(PORT->TNC->xIDC_COMMSSTATE, PORT->TNC->WEB_COMMSSTATE);
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
return TRUE; return TRUE;
} }
@ -314,7 +321,7 @@ void SendARDOPorPacketData(struct TNCINFO * TNC, int Stream, UCHAR * Buff, int t
if (Stream == 0) if (Stream == 0)
{ {
ARDOPSendData(TNC, Buff, txlen); ARDOPSendData(TNC, Buff, txlen);
STREAM->BytesTXed += txlen; STREAM->bytesTXed += txlen;
WritetoTrace(TNC, Buff, txlen); WritetoTrace(TNC, Buff, txlen);
} }
else else
@ -562,7 +569,7 @@ static int ProcessLine(char * buf, int Port)
void ARDOPThread(struct TNCINFO * TNC); void ARDOPThread(struct TNCINFO * TNC);
VOID ARDOPProcessDataSocketData(int port); VOID ARDOPProcessDataSocketData(int port);
int ConnecttoARDOP(); int ConnecttoARDOP(struct TNCINFO * TNC);
static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC); static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
static VOID ARDOPProcessReceivedControl(struct TNCINFO * TNC); static VOID ARDOPProcessReceivedControl(struct TNCINFO * TNC);
int V4ProcessReceivedData(struct TNCINFO * TNC); int V4ProcessReceivedData(struct TNCINFO * TNC);
@ -643,6 +650,12 @@ VOID ARDOPSendCommand(struct TNCINFO * TNC, char * Buff, BOOL Queue)
if (Buff[0] == 0) // Terminal Keepalive? if (Buff[0] == 0) // Terminal Keepalive?
return; return;
if (memcmp(Buff, "LISTEN ", 7) == 0)
{
strcpy(TNC->WEB_MODE, &Buff[7]);
MySetWindowText(TNC->xIDC_MODE, &Buff[7]);
}
EncLen = sprintf(Encoded, "%s\r", Buff); EncLen = sprintf(Encoded, "%s\r", Buff);
// it is possible for binary data to be dumped into the command // it is possible for binary data to be dumped into the command
@ -875,8 +888,22 @@ 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;
}
}
// Check ATTACH time limit
if (STREAM->Attached)
{
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
{
Debugprintf("ARDOP closing session on AttachTimelimit");
STREAM->ReportDISC = 1;
STREAM->AttachTime = 0;
} }
} }
@ -947,7 +974,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC->Streams[0].Connecting || TNC->Streams[0].Connecting ||
TNC->Streams[0].Connected) TNC->Streams[0].Connected)
{ {
// discard if TNC not connected or sesison active // discard if TNC not connected or session active
ReleaseBuffer(buffptr); ReleaseBuffer(buffptr);
continue; continue;
@ -1190,6 +1217,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
Debugprintf("ARDOP New Attach Stream %d DEDStream %d", Stream, STREAM->DEDStream); Debugprintf("ARDOP New Attach Stream %d DEDStream %d", Stream, STREAM->DEDStream);
STREAM->Attached = TRUE; STREAM->Attached = TRUE;
STREAM->AttachTime = time(NULL);
calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4USER, TNC->Streams[Stream].MyCall); calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4USER, TNC->Streams[Stream].MyCall);
TNC->Streams[Stream].MyCall[calllen] = 0; TNC->Streams[Stream].MyCall[calllen] = 0;
@ -1262,7 +1290,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
UCHAR * data = &buffptr->Data[0]; UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--; STREAM->FramesQueued--;
txlen = (int)buffptr->Len; txlen = (int)buffptr->Len;
STREAM->BytesTXed += txlen; STREAM->bytesTXed += txlen;
if (Stream == 0) if (Stream == 0)
{ {
@ -1369,7 +1397,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
bytes=ARDOPSendData(TNC, &buff->L2DATA[0], txlen); bytes=ARDOPSendData(TNC, &buff->L2DATA[0], txlen);
TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response
STREAM->BytesTXed += bytes; STREAM->bytesTXed += bytes;
WritetoTrace(TNC, &buff->L2DATA[0], txlen); WritetoTrace(TNC, &buff->L2DATA[0], txlen);
} }
else else
@ -1468,7 +1496,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]))
{ {
@ -1615,6 +1646,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ARDOPChangeMYC(TNC, TNC->Streams[0].MyCall); ARDOPChangeMYC(TNC, TNC->Streams[0].MyCall);
hookL4SessionAttempt(STREAM, &buff->L2DATA[2], TNC->Streams[0].MyCall);
// See if Busy // See if Busy
if (InterlockedCheckBusy(TNC)) if (InterlockedCheckBusy(TNC))
@ -1705,7 +1738,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
return TNC->CONNECTED << 8 | 1; return TNC->CONNECTED << 8 | 1;
return (TNC->CONNECTED << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK return (TNC->CONNECTED << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK
case 4: // reinit7 case 4: // reinit7
@ -1853,13 +1886,11 @@ VOID ARDOPReleaseTNC(struct TNCINFO * TNC)
ARDOPChangeMYC(TNC, TNC->NodeCall); ARDOPChangeMYC(TNC, TNC->NodeCall);
ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
strcpy(TNC->WEB_TNCSTATE, "Free"); strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE); MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
// Start Scanner ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
// Start Scanner // Start Scanner
if (TNC->DefaultRadioCmd) if (TNC->DefaultRadioCmd)
@ -1877,12 +1908,19 @@ VOID ARDOPReleaseTNC(struct TNCINFO * TNC)
VOID ARDOPSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC) VOID ARDOPSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC)
{ {
TNC->PortRecord->PORTCONTROL.PortSuspended = TRUE;
ARDOPSendCommand(TNC, "LISTEN FALSE", TRUE); ARDOPSendCommand(TNC, "LISTEN FALSE", TRUE);
strcpy(TNC->WEB_TNCSTATE, "Interlocked");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
} }
VOID ARDOPReleasePort(struct TNCINFO * TNC) VOID ARDOPReleasePort(struct TNCINFO * TNC)
{ {
TNC->PortRecord->PORTCONTROL.PortSuspended = FALSE;
ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE); ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
} }
extern char WebProcTemplate[]; extern char WebProcTemplate[];
@ -1899,7 +1937,7 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE); Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE); Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE); Len += sprintf(&Buff[Len], "<tr><td>Listen</td><td>%s</td></tr>", TNC->WEB_MODE);
Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s &nbsp; %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS); Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s &nbsp; %s</td></tr>", TNC->WEB_CHANSTATE, TNC->WEB_LEVELS);
Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE); Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC); Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
@ -1948,6 +1986,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->LogPath) if (TNC->LogPath)
ARDOPOpenLogFiles(TNC); ARDOPOpenLogFiles(TNC);
@ -1960,7 +1999,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;
@ -1968,7 +2007,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);
@ -2115,7 +2153,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "TNC State", WS_CHILD | WS_VISIBLE, 10,28,106,20, TNC->hDlg, NULL, hInstance, NULL);
TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL); TNC->xIDC_TNCSTATE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,28,520,20, TNC->hDlg, NULL, hInstance, NULL);
CreateWindowEx(0, "STATIC", "Mode", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "Listen", WS_CHILD | WS_VISIBLE, 10,50,80,20, TNC->hDlg, NULL, hInstance, NULL);
TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL); TNC->xIDC_MODE = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE, 120,50,200,20, TNC->hDlg, NULL, hInstance, NULL);
CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL); CreateWindowEx(0, "STATIC", "Channel State", WS_CHILD | WS_VISIBLE, 10,72,110,20, TNC->hDlg, NULL, hInstance, NULL);
@ -2246,16 +2284,16 @@ VOID TNCLost(struct TNCINFO * TNC)
if (Stream == 0) if (Stream == 0)
{ {
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - STREAM->BytesOutstanding, STREAM->BytesRXed, STREAM->BytesOutstanding); STREAM->bytesTXed - STREAM->BytesOutstanding, STREAM->bytesRXed, STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
if (STREAM->Attached) if (STREAM->Attached)
{
STREAM->Connected = FALSE;
STREAM->Connecting = FALSE;
STREAM->ReportDISC = TRUE; STREAM->ReportDISC = TRUE;
}
STREAM->Connected = FALSE;
STREAM->Connecting = FALSE;
} }
} }
@ -2581,6 +2619,8 @@ VOID ARDOPThread(struct TNCINFO * TNC)
TNC->Alerted = TRUE; TNC->Alerted = TRUE;
ARDOPSendCommand(TNC, "LISTEN TRUE", TRUE);
sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC"); sprintf(TNC->WEB_COMMSSTATE, "Connected to ARDOP TNC");
MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE); MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
@ -2660,6 +2700,10 @@ VOID ARDOPThread(struct TNCINFO * TNC)
sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost"); sprintf(TNC->WEB_COMMSSTATE, "Connection to TNC lost");
MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE); MySetWindowText(TNC->xIDC_COMMSSTATE, TNC->WEB_COMMSSTATE);
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
TNC->CONNECTED = FALSE; TNC->CONNECTED = FALSE;
TNC->Alerted = FALSE; TNC->Alerted = FALSE;
@ -2941,6 +2985,15 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (TNC->PTTMode) if (TNC->PTTMode)
Rig_PTT(TNC, TRUE); Rig_PTT(TNC, TRUE);
TNC->PTTonTime = GetTickCount();
// Cancel Busy timer (stats include ptt on time in port active
if (TNC->BusyonTime)
{
TNC->BusyActivemS += (GetTickCount() - TNC->BusyonTime);
TNC->BusyonTime = 0;
}
return; return;
} }
if (_memicmp(Buffer, "PTT F", 5) == 0) if (_memicmp(Buffer, "PTT F", 5) == 0)
@ -2949,6 +3002,12 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (TNC->PTTMode) if (TNC->PTTMode)
Rig_PTT(TNC, FALSE); Rig_PTT(TNC, FALSE);
if (TNC->PTTonTime)
{
TNC->PTTActivemS += (GetTickCount() - TNC->PTTonTime);
TNC->PTTonTime = 0;
}
return; return;
} }
@ -2957,6 +3016,8 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
TNC->BusyFlags |= CDBusy; TNC->BusyFlags |= CDBusy;
TNC->Busy = TNC->BusyHold * 10; // BusyHold delay TNC->Busy = TNC->BusyHold * 10; // BusyHold delay
TNC->BusyonTime = GetTickCount();
MySetWindowText(TNC->xIDC_CHANSTATE, "Busy"); MySetWindowText(TNC->xIDC_CHANSTATE, "Busy");
strcpy(TNC->WEB_CHANSTATE, "Busy"); strcpy(TNC->WEB_CHANSTATE, "Busy");
@ -2973,6 +3034,12 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
else else
strcpy(TNC->WEB_CHANSTATE, "Clear"); strcpy(TNC->WEB_CHANSTATE, "Clear");
if (TNC->BusyonTime)
{
TNC->BusyActivemS += (GetTickCount() - TNC->BusyonTime);
TNC->BusyonTime = 0;
}
MySetWindowText(TNC->xIDC_CHANSTATE, TNC->WEB_CHANSTATE); MySetWindowText(TNC->xIDC_CHANSTATE, TNC->WEB_CHANSTATE);
TNC->WinmorRestartCodecTimer = time(NULL); TNC->WinmorRestartCodecTimer = time(NULL);
return; return;
@ -3023,7 +3090,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - STREAM->BytesOutstanding, STREAM->BytesRXed, STREAM->BytesOutstanding); STREAM->bytesTXed - STREAM->BytesOutstanding, STREAM->bytesRXed, STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return; return;
} }
@ -3043,7 +3110,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
WritetoTrace(TNC, Buffer, MsgLen - 1); WritetoTrace(TNC, Buffer, MsgLen - 1);
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
memcpy(Call, &Buffer[10], 10); memcpy(Call, &Buffer[10], 10);
@ -3076,6 +3143,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
@ -3170,7 +3238,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
if (TNC->SendTandRtoRelay && memcmp(AppName, "RMS ", 4) == 0 if (TNC->SendTandRtoRelay && memcmp(AppName, "RMS ", 4) == 0
@ -3220,7 +3288,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
STREAM->NeedDisc = 100; // 10 secs STREAM->NeedDisc = 100; // 10 secs
} }
} }
strcpy(STREAM->MyCall, TNC->TargetCall);
return; return;
} }
else else
@ -3258,9 +3326,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)
@ -3302,34 +3370,21 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
RestartTNC(TNC); RestartTNC(TNC);
} }
sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
return; return;
} }
WritetoTrace(TNC, Buffer, MsgLen - 1); WritetoTrace(TNC, Buffer, MsgLen - 1);
// Release Session3 // Release Session
if (TNC->Streams[0].Connected) if (TNC->Streams[0].Connected)
{ {
// Create a traffic record // Create a traffic record
char logmsg[120]; hookL4SessionDeleted(TNC, STREAM);
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->ConnectTime = 0; // Prevent retrigger
} }
@ -3810,13 +3865,12 @@ VOID ARDOPProcessDataPacket(struct TNCINFO * TNC, UCHAR * Type, UCHAR * Data, in
return; return;
} }
STREAM->BytesRXed += Length; STREAM->bytesRXed += Length;
Data[Length] = 0; Data[Length] = 0;
Debugprintf("ARDOP: RXD %d bytes", Length);
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - STREAM->BytesOutstanding, STREAM->BytesRXed, STREAM->BytesOutstanding); STREAM->bytesTXed - STREAM->BytesOutstanding, STREAM->bytesRXed, STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
@ -3840,6 +3894,7 @@ VOID ARDOPProcessDataPacket(struct TNCINFO * TNC, UCHAR * Type, UCHAR * Data, in
char * ptr2; char * ptr2;
char c; char c;
int Len = Length; int Len = Length;
char Call[10] = "";
Debugprintf(Data); Debugprintf(Data);
@ -3912,7 +3967,14 @@ VOID ARDOPProcessDataPacket(struct TNCINFO * TNC, UCHAR * Type, UCHAR * Data, in
buffptr->LENGTH = 16 + MSGHDDRLEN + APLen; buffptr->LENGTH = 16 + MSGHDDRLEN + APLen;
time(&buffptr->Timestamp); time(&buffptr->Timestamp);
memcpy(Call,ptr1, 9);
strlop(Call, '>');
UpdateMH(TNC, Call, '!', 'I');
BPQTRACE((MESSAGE *)buffptr, TRUE); BPQTRACE((MESSAGE *)buffptr, TRUE);
ReleaseBuffer(buffptr);
} }
else else
{ {
@ -4957,7 +5019,7 @@ tcpHostFrame:
WritetoTrace(TNC, Buffer, len); WritetoTrace(TNC, Buffer, len);
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
memcpy(Call, &Buffer[19], 10); memcpy(Call, &Buffer[19], 10);
ptr = strchr(Call, ' '); ptr = strchr(Call, ' ');
@ -5030,7 +5092,7 @@ tcpHostFrame:
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available
@ -5899,8 +5961,8 @@ 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);
} }

View File

@ -19,7 +19,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#ifdef WIN32 #ifdef WIN32
@ -38,6 +38,7 @@ extern char LTATString[2048];
//static UCHAR BPQDirectory[260]; //static UCHAR BPQDirectory[260];
extern ConnectionInfo Connections[]; extern ConnectionInfo Connections[];
extern int NumberofStreams; extern int NumberofStreams;
extern time_t MaintClock; // Time to run housekeeping extern time_t MaintClock; // Time to run housekeeping
@ -49,6 +50,7 @@ extern int MaxChatStreams;
extern char Position[81]; extern char Position[81];
extern char PopupText[251]; extern char PopupText[251];
extern int PopupMode; extern int PopupMode;
extern int reportMailEvents;
#define MaxCMS 10 // Numbr of addresses we can keep - currently 4 are used. #define MaxCMS 10 // Numbr of addresses we can keep - currently 4 are used.
@ -114,6 +116,8 @@ int SendWebMailHeader(char * Reply, char * Key, struct HTTPConnectionInfo * Sess
struct UserInfo * FindBBS(char * Name); 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);
void UndoTransparency(char * input);
char UNC[] = ""; char UNC[] = "";
char CHKD[] = "checked=checked "; char CHKD[] = "checked=checked ";
@ -155,6 +159,7 @@ char MailPage[] = "<html><head><title>%s's BBS Web Server</title>"
"<td><a href=/Mail/Wel?%s>Welcome Msgs & Prompts</a></td>" "<td><a href=/Mail/Wel?%s>Welcome Msgs & Prompts</a></td>"
"<td><a href=/Mail/HK?%s>Housekeeping</a></td>" "<td><a href=/Mail/HK?%s>Housekeeping</a></td>"
"<td><a href=/Mail/WP?%s>WP Update</a></td>" "<td><a href=/Mail/WP?%s>WP Update</a></td>"
"<td><a href=/Webmail>WebMail</a></td>"
"<td><a href=/>Node Menu</a></td>" "<td><a href=/>Node Menu</a></td>"
"</tr></table>"; "</tr></table>";
@ -175,13 +180,14 @@ char RefreshMainPage[] = "<html><head>"
"<td><a href=/Mail/Wel?%s>Welcome Msgs & Prompts</a></td>" "<td><a href=/Mail/Wel?%s>Welcome Msgs & Prompts</a></td>"
"<td><a href=/Mail/HK?%s>Housekeeping</a></td>" "<td><a href=/Mail/HK?%s>Housekeeping</a></td>"
"<td><a href=/Mail/WP?%s>WP Update</a></td>" "<td><a href=/Mail/WP?%s>WP Update</a></td>"
"<td><a href=/Webmail>WebMail</a></td>"
"<td><a href=/>Node Menu</a></td>" "<td><a href=/>Node Menu</a></td>"
"</tr></table>"; "</tr></table>";
char StatusPage [] = char StatusPage [] =
"<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>" "<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>"
"<br>User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callsign&nbsp;&nbsp; Stream Queue<br>" "<br>User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callsign&nbsp;&nbsp; Stream &nbsp;Queue &nbsp;Sent &nbsp;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[] =
@ -400,41 +406,20 @@ int SendHeader(char * Reply, char * Key)
void ConvertTitletoUTF8(WebMailInfo * WebMail, char * Title, char * UTF8Title, int Len) void ConvertTitletoUTF8(WebMailInfo * WebMail, char * Title, char * UTF8Title, int Len)
{ {
if (WebIsUTF8(Title, (int)strlen(Title)) == FALSE) Len = strlen(Title);
if (WebIsUTF8(Title, Len) == FALSE)
{ {
// With Windows it is simple - convert using current codepage int code = TrytoGuessCode(Title, Len);
// I think the only reliable way is to convert to unicode and back
int origlen = (int)strlen(Title) + 1; if (code == 437)
#ifdef WIN32 Len = Convert437toUTF8(Title, Len, UTF8Title);
WCHAR BufferW[128]; else if (code == 1251)
int wlen; Len = Convert1251toUTF8(Title, Len, UTF8Title);
int len = origlen; else
Len = Convert1252toUTF8(Title, Len, UTF8Title);
wlen = MultiByteToWideChar(CP_ACP, 0, Title, len, BufferW, origlen * 2); UTF8Title[Len] = 0;
len = WideCharToMultiByte(CP_UTF8, 0, BufferW, wlen, UTF8Title, origlen * 2, NULL, NULL);
#else
size_t left = Len - 1;
size_t len = origlen;
iconv_t * icu = WebMail->iconv_toUTF8;
if (WebMail->iconv_toUTF8 == NULL)
icu = WebMail->iconv_toUTF8 = iconv_open("UTF-8//IGNORE", "CP1252");
if (icu == (iconv_t)-1)
{
strcpy(UTF8Title, Title);
WebMail->iconv_toUTF8 = NULL;
return;
}
char * orig = UTF8Title;
iconv(icu, NULL, NULL, NULL, NULL); // Reset State Machine
iconv(icu, &Title, &len, (char ** __restrict__)&UTF8Title, &left);
#endif
} }
else else
strcpy(UTF8Title, Title); strcpy(UTF8Title, Title);
@ -442,7 +427,7 @@ void ConvertTitletoUTF8(WebMailInfo * WebMail, char * Title, char * UTF8Title, i
BOOL GotFirstMessage = 0; BOOL GotFirstMessage = 0;
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen) void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token)
{ {
char * Context = 0, * NodeURL; char * Context = 0, * NodeURL;
int ReplyLen; int ReplyLen;
@ -472,6 +457,13 @@ void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method,
} }
if (_memicmp(URL, "/Mail/API/v1/", 13) == 0)
{
*RLen = MailAPIProcessHTTPMessage(Session, Reply, Method, URL, input, LOCAL, Context, Token);
return;
}
// There is a problem if Mail is reloaded without reloading the node // There is a problem if Mail is reloaded without reloading the node
if (GotFirstMessage == 0) if (GotFirstMessage == 0)
@ -488,6 +480,7 @@ void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method,
GotFirstMessage = 1; GotFirstMessage = 1;
return; return;
} }
if (strcmp(Method, "POST") == 0) if (strcmp(Method, "POST") == 0)
{ {
@ -1633,6 +1626,7 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
UserCantKillT = !UserCantKillT; // Reverse Logic UserCantKillT = !UserCantKillT; // Reverse Logic
GetCheckBox(input, "FWDtoMe=", &ForwardToMe); GetCheckBox(input, "FWDtoMe=", &ForwardToMe);
GetCheckBox(input, "OnlyKnown=", &OnlyKnown); GetCheckBox(input, "OnlyKnown=", &OnlyKnown);
GetCheckBox(input, "Events=", &reportMailEvents);
GetParam(input, "POP3Port=", Temp); GetParam(input, "POP3Port=", Temp);
POP3InPort = atoi(Temp); POP3InPort = atoi(Temp);
@ -1708,6 +1702,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
@ -1721,7 +1717,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=");
@ -1876,6 +1872,7 @@ VOID SaveFwdCommon(struct HTTPConnectionInfo * Session, char * MsgPtr, char * Re
GetCheckBox(input, "WarnNoRoute=", &WarnNoRoute); GetCheckBox(input, "WarnNoRoute=", &WarnNoRoute);
GetCheckBox(input, "LocalTime=", &Localtime); GetCheckBox(input, "LocalTime=", &Localtime);
GetCheckBox(input, "SendPtoMultiple=", &SendPtoMultiple); GetCheckBox(input, "SendPtoMultiple=", &SendPtoMultiple);
GetCheckBox(input, "FourCharCont=", &FOURCHARCONT);
// Reinitialise Aliases // Reinitialise Aliases
@ -2225,21 +2222,21 @@ VOID ProcessUserUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
ptr1 = GetNextParam(&ptr2); // Last Listed ptr1 = GetNextParam(&ptr2); // Last Listed
USER->lastmsg = atoi(ptr1); USER->lastmsg = atoi(ptr1);
ptr1 = GetNextParam(&ptr2); // Name ptr1 = GetNextParam(&ptr2); // Name
strcpy(USER->Name, ptr1); memcpy(USER->Name, ptr1, 17);
ptr1 = GetNextParam(&ptr2); // Pass ptr1 = GetNextParam(&ptr2); // Pass
strcpy(USER->pass, ptr1); memcpy(USER->pass, ptr1, 12);
ptr1 = GetNextParam(&ptr2); // CMS Pass ptr1 = GetNextParam(&ptr2); // CMS Pass
if (memcmp("****************", ptr1, strlen(ptr1) != 0)) if (memcmp("****************", ptr1, strlen(ptr1) != 0))
{ {
strcpy(USER->CMSPass, ptr1); memcpy(USER->CMSPass, ptr1, 15);
} }
ptr1 = GetNextParam(&ptr2); // QTH ptr1 = GetNextParam(&ptr2); // QTH
strcpy(USER->Address, ptr1); memcpy(USER->Address, ptr1, 60);
ptr1 = GetNextParam(&ptr2); // ZIP ptr1 = GetNextParam(&ptr2); // ZIP
strcpy(USER->ZIP, ptr1); memcpy(USER->ZIP, ptr1, 8);
ptr1 = GetNextParam(&ptr2); // HomeBBS ptr1 = GetNextParam(&ptr2); // HomeBBS
strcpy(USER->HomeBBS, ptr1); memcpy(USER->HomeBBS, ptr1, 40);
_strupr(USER->HomeBBS); _strupr(USER->HomeBBS);
SaveUserDatabase(); SaveUserDatabase();
@ -2610,6 +2607,7 @@ VOID SendConfigPage(char * Reply, int * ReplyLen, char * Key)
(UserCantKillT) ? UNC : CHKD, // Reverse logic (UserCantKillT) ? UNC : CHKD, // Reverse logic
(ForwardToMe) ? CHKD : UNC, (ForwardToMe) ? CHKD : UNC,
(OnlyKnown) ? CHKD : UNC, (OnlyKnown) ? CHKD : UNC,
(reportMailEvents) ? CHKD : UNC,
POP3InPort, SMTPInPort, NNTPInPort, POP3InPort, SMTPInPort, NNTPInPort,
(RemoteEmail) ? CHKD : UNC, (RemoteEmail) ? CHKD : UNC,
AMPRDomain, AMPRDomain,
@ -2704,6 +2702,7 @@ VOID SendFwdMainPage(char * Reply, int * RLen, char * Key)
(WarnNoRoute) ? CHKD : UNC, (WarnNoRoute) ? CHKD : UNC,
(Localtime) ? CHKD : UNC, (Localtime) ? CHKD : UNC,
(SendPtoMultiple) ? CHKD : UNC, (SendPtoMultiple) ? CHKD : UNC,
(FOURCHARCONT) ? CHKD : UNC,
ALIASES); ALIASES);
} }
@ -2759,6 +2758,19 @@ VOID SendUIPage(char * Reply, int * ReplyLen, char * Key)
*ReplyLen = Len; *ReplyLen = Len;
} }
void ConvertSpaceTonbsp(char * msg)
{
// Replace any space with &nbsp;
char * ptr;
while (ptr = strchr(msg, ' '))
{
memmove(ptr + 5, ptr, strlen(ptr) + 1);
memcpy(ptr, "&nbsp;", 6);
}
}
VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key) VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
{ {
int Len; int Len;
@ -2780,6 +2792,8 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
if (!conn->Active) if (!conn->Active)
{ {
strcpy(msg,"Idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" strcpy(msg,"Idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n"); "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n");
} }
@ -2793,16 +2807,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&nbsp;%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);
} }
@ -2980,6 +2994,8 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer);
static char PipeFileName[] = "\\\\.\\pipe\\BPQMailWebPipe"; static char PipeFileName[] = "\\\\.\\pipe\\BPQMailWebPipe";
// Constants
static DWORD WINAPI InstanceThread(LPVOID lpvParam) static DWORD WINAPI InstanceThread(LPVOID lpvParam)
// This routine is a thread processing function to read from and reply to a client // This routine is a thread processing function to read from and reply to a client
@ -3000,6 +3016,7 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
char URL[100001]; char URL[100001];
char * Context, * Method; char * Context, * Method;
int n; int n;
char token[16]= "";
char * ptr; char * ptr;
@ -3035,18 +3052,40 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
} }
else else
{ {
strcpy(URL, MsgPtr); // look for auth header
const char * auth_header = "Authorization: Bearer ";
char * token_begin = strstr(MsgPtr, auth_header);
int Flags = 0;
ptr = strstr(URL, " HTTP"); // Node Flags isn't currently used
if (ptr) if (token_begin)
*ptr = 0; {
// Using Auth Header
Method = strtok_s(URL, " ", &Context); // Extract the token from the request (assuming it's present in the request headers)
ProcessMailHTTPMessage(&Session, Method, Context, MsgPtr, OutBuffer, &OutputLen, InputLen); token_begin += strlen(auth_header); // Move to the beginning of the token
strncpy(token, token_begin, 13);
token[13] = '\0'; // Null-terminate the token
}
} }
strcpy(URL, MsgPtr);
ptr = strstr(URL, " HTTP");
if (ptr)
*ptr = 0;
Method = strtok_s(URL, " ", &Context);
ProcessMailHTTPMessage(&Session, Method, Context, MsgPtr, OutBuffer, &OutputLen, InputLen, token);
WriteFile(hPipe, &Session, sizeof (struct HTTPConnectionInfo), &n, NULL); WriteFile(hPipe, &Session, sizeof (struct HTTPConnectionInfo), &n, NULL);
WriteFile(hPipe, OutBuffer, OutputLen, &cbWritten, NULL); WriteFile(hPipe, OutBuffer, OutputLen, &cbWritten, NULL);

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -162,7 +162,7 @@ BEGIN
WS_VSCROLL WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14, DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER 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 separared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24 IDC_STATIC,9,52,355,24
END END

View File

@ -1,374 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="BPQChat"
ProjectGUID="{2BDD2C8A-2B4A-496C-A2EA-6B49AA0670B1}"
RootNamespace="BPQChat"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
CommandLine=""
Outputs=""
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CInclude;..\CommonSource;..\BPQChat"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USE_32BIT_TIME_T"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\lib\bpq32.lib wsock32.lib comctl32.lib winmm.lib ..\lib\libconfig.lib DbgHelp.lib"
OutputFile="c:\DevProgs\bpq32\BPQChat.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(IntDir)$(TargetName).pdb"
GenerateMapFile="true"
MapFileName="$(IntDir)\BBSListings\BPQChat.map"
MapExports="true"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
CommandLine=""
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="..\CInclude;..\CommonSource;..\BPQChat"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USE_32BIT_TIME_T"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
AssemblerOutput="2"
AssemblerListingLocation="$(IntDir)\BBSListings\"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="0"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\lib\bpq32.lib wsock32.lib comctl32.lib winmm.lib ..\lib\libconfig.lib DbgHelp.lib"
OutputFile="c:\DevProgs\bpq32\BPQChat.exe"
LinkIncremental="1"
GenerateDebugInformation="false"
ProgramDatabaseFile="$(IntDir)$(TargetName).pdb"
GenerateMapFile="true"
MapFileName="$(IntDir)\BBSListings\BPQChat.map"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
LinkTimeCodeGeneration="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\bpqchat.c"
>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\ChatDebug.c"
>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\ChatHTMLConfig.c"
>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\ChatMonitor.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\ChatMultiConsole.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\ChatUtilities.c"
>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\ChatUtils.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\HanksRT.c"
>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\HTMLCommonCode.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\"
/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\BPQChat.rc"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

590
BPQINP3.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1120,7 +1120,39 @@
// 6.0.25.1 ?? // 6.0.25.1 ??
// Aff FBB reject.sys style filters (3) // Add FBB reject.sys style filters (3)
// Improve Webmail on 64 bit builds
// Fix setting status '$' on Bulls sent via WebMail (22)
// Implement New Message and Message Read Events (23)
// Start adding json api (25)
// Fix reading nested directories when loading Standard Templates and other template bugs (25)
// Add TO and AT to "Message has nowhere to go" message (28)
// Add My Sent and My Received filter options to Webmail (30)
// Add Send P to multiple BBS's when routing on HR (30)
// Fix Traffic stats for T messages received via B2 forwarding (31)
// Fix possible failure to update last listed count when user disconnects without using B command
// Add short random delay (<30 secs) when forward new Messages immediately is enabled (35)
// Fix Connect Script IDLETIME (38)
// Add "Mail Mgmt" to Webmail menu bar and "WebMail" to Mail Mgmt Menu (39)
// Improve "New User" frequency determination (39)
// Allow selection of 2 or 4 character country codes for forward processing (39)
// Fix Send P to multiple BBS's when routing on HR (40)
// Rewrite PG server code on Lunux (41)
// Fix SendPToMultiple not stopping at Implied AT match (45)
// Log Our HA when checking for flood bulls (45)
// Semaphore calls to SaveConfig
// Include SERVIC as valid from call (for Winlink Service messages) (49)
// Attempt to detect line draw characters in Webmail (50)
// Fix sending ampr.org mail when RMS is not enabled (51)
// Send forwarding info to packetnodes.spots.radio database (51)
// Fix bug in WP Message processing (56)
// 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)
#include "bpqmail.h" #include "bpqmail.h"
#include "winstdint.h" #include "winstdint.h"
@ -1138,6 +1170,9 @@ FARPROCX pDllBPQTRACE;
FARPROCZ pGetLOC; FARPROCZ pGetLOC;
FARPROCX pRefreshWebMailIndex; FARPROCX pRefreshWebMailIndex;
FARPROCX pRunEventProgram; FARPROCX pRunEventProgram;
FARPROCX pGetPortFrequency;
FARPROCX pSendWebRequest;
FARPROCX pGetLatLon;
BOOL WINE = FALSE; BOOL WINE = FALSE;
@ -1362,6 +1397,7 @@ char * CheckToAddress(CIRCUIT * conn, char * Addr);
BOOL CheckifPacket(char * Via); BOOL CheckifPacket(char * Via);
int GetHTMLForms(); int GetHTMLForms();
VOID GetPGConfig(); VOID GetPGConfig();
void SendBBSDataToPktMap();
struct _EXCEPTION_POINTERS exinfox; struct _EXCEPTION_POINTERS exinfox;
@ -1372,7 +1408,7 @@ DWORD Stack[16];
BOOL Restarting = FALSE; BOOL Restarting = FALSE;
Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg) void Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg)
{ {
unsigned int SPPtr; unsigned int SPPtr;
unsigned int SPVal; unsigned int SPVal;
@ -1508,7 +1544,11 @@ VOID WriteMiniDump()
} }
void GetSemaphore(struct SEM * Semaphore, int ID)
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free
@ -1689,6 +1729,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
// SaveUserDatabase(); // SaveUserDatabase();
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveRestartData();
configSaved = 1; configSaved = 1;
SaveConfig(ConfigName); SaveConfig(ConfigName);
@ -1912,6 +1953,10 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
pGetLOC = GetProcAddress(ExtDriver,"_GetLOC@0"); pGetLOC = GetProcAddress(ExtDriver,"_GetLOC@0");
pRefreshWebMailIndex = GetProcAddress(ExtDriver,"_RefreshWebMailIndex@0"); pRefreshWebMailIndex = GetProcAddress(ExtDriver,"_RefreshWebMailIndex@0");
pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8"); pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8");
pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8");
pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16");
pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8");
if (pGetLOC) if (pGetLOC)
{ {
@ -2150,7 +2195,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
CheckTimer(); CheckTimer();
TCPTimer(); TCPTimer();
BBSSlowTimer(); BBSSlowTimer();
FWDTimerProc();
if (MaintClock < NOW) if (MaintClock < NOW)
{ {
while (MaintClock < NOW) // in case large time step while (MaintClock < NOW) // in case large time step
@ -2159,6 +2203,13 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Debugprintf("|Enter HouseKeeping"); Debugprintf("|Enter HouseKeeping");
DoHouseKeeping(FALSE); DoHouseKeeping(FALSE);
} }
if (APIClock < NOW)
{
SendBBSDataToPktMap();
APIClock = NOW + 7200; // Every 2 hours
}
tm = gmtime(&NOW); tm = gmtime(&NOW);
if (tm->tm_wday == 0) // Sunday if (tm->tm_wday == 0) // Sunday
@ -2172,6 +2223,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
} }
My__except_Routine("Slow Timer"); My__except_Routine("Slow Timer");
} }
if (wParam == 3) // Forward (2 Secs)
{
__try
{
FWDTimerProc();
}
My__except_Routine("Fwd Timer");
}
else else
__try __try
{ {
@ -2784,6 +2843,12 @@ gotAddr:
EndDialog(hDlg, LOWORD(wParam)); EndDialog(hDlg, LOWORD(wParam));
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(Msg);
#endif
return TRUE; return TRUE;
} }
@ -2961,9 +3026,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);
} }
} }
} }
@ -3024,7 +3089,7 @@ static PSOCKADDR_IN psin;
SOCKET sock; SOCKET sock;
void GetRestartData();
BOOL Initialise() BOOL Initialise()
{ {
@ -3040,6 +3105,8 @@ BOOL Initialise()
GetTimeZoneInformation(&TimeZoneInformation); GetTimeZoneInformation(&TimeZoneInformation);
Debugprintf("%d", sizeof(struct MsgInfo));
_tzset(); _tzset();
_MYTIMEZONE = timezone; _MYTIMEZONE = timezone;
_MYTIMEZONE = TimeZoneInformation.Bias * 60; _MYTIMEZONE = TimeZoneInformation.Bias * 60;
@ -3210,6 +3277,8 @@ BOOL Initialise()
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetRestartData();
UsingingRegConfig = FALSE; UsingingRegConfig = FALSE;
// Make sure SYSOPCALL is set // Make sure SYSOPCALL is set
@ -3300,6 +3369,7 @@ BOOL Initialise()
SetTimer(hWnd,1,10000,NULL); // Slow Timer (10 Secs) SetTimer(hWnd,1,10000,NULL); // Slow Timer (10 Secs)
SetTimer(hWnd,2,100,NULL); // Send to Node and TCP Poll (100 ms) SetTimer(hWnd,2,100,NULL); // Send to Node and TCP Poll (100 ms)
SetTimer(hWnd,3,2000,NULL); // Forward Check (2 secs)
// Calulate time to run Housekeeping // Calulate time to run Housekeeping
{ {
@ -3350,6 +3420,8 @@ BOOL Initialise()
CreatePipeThread(); CreatePipeThread();
GetPGConfig(); GetPGConfig();
APIClock = 0;
return TRUE; return TRUE;
} }

1091
BPQMail.rc

File diff suppressed because it is too large Load Diff

View File

@ -1,489 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="BPQMail"
ProjectGUID="{3766AA10-C777-4ED8-A83D-F1452DE9B665}"
RootNamespace="TelnetServer"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="0"
CharacterSet="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
CommandLine=""
Outputs=""
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CKernel;..\CInclude;..\CommonSource;..\BPQMail"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USE_32BIT_TIME_T"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
AdditionalIncludeDirectories="..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\lib\bpq32.lib wsock32.lib comctl32.lib winmm.lib ..\lib\libconfig.lib DbgHelp.lib"
OutputFile="d:\DevProgs\bpq32\BPQMail.exe"
LinkIncremental="2"
IgnoreAllDefaultLibraries="false"
IgnoreDefaultLibraryNames="LIBCMT"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(IntDir)$(TargetName).pdb"
GenerateMapFile="true"
MapFileName="$(IntDir)\BBSListings\bpqmail.map"
MapExports="true"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
CommandLine=""
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="..\CKernel;..\CInclude;..\CommonSource;..\BPQMail"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USE_32BIT_TIME_T"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
AdditionalIncludeDirectories="..\Include"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\lib\bpq32.lib wsock32.lib comctl32.lib winmm.lib ..\lib\libconfig.lib DbgHelp.lib"
OutputFile="c:\DevProgs\bpq32\BPQMail.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
ProgramDatabaseFile="c:\DevProgs\bpq32\BPQMail.pdb"
GenerateMapFile="true"
MapFileName="c:\DevProgs\bpq32\BPQMail.map"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
LinkTimeCodeGeneration="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\CommonSource\Alloc.c"
>
</File>
<File
RelativePath="..\CommonSource\BBSHTMLConfig.c"
>
</File>
<File
RelativePath="..\CommonSource\BBSUtilities.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="2"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath=".\BPQMail.c"
>
</File>
<File
RelativePath=".\BPQMailConfig.c"
>
</File>
<File
RelativePath="..\CommonSource\CMSAuth.c"
>
</File>
<File
RelativePath="..\CommonSource\FBBRoutines.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\Housekeeping.c"
>
</File>
<File
RelativePath="..\CommonSource\HTMLCommonCode.c"
>
</File>
<File
RelativePath="..\CommonSource\LzFind.c"
>
</File>
<File
RelativePath="..\CommonSource\lzhuf32.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="2"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\LzmaDec.c"
>
</File>
<File
RelativePath="..\CommonSource\LzmaEnc.c"
>
</File>
<File
RelativePath="..\CommonSource\LzmaLib.c"
>
</File>
<File
RelativePath="..\CommonSource\MailCommands.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\MailDataDefs.c"
>
</File>
<File
RelativePath="..\CommonSource\MailRouting.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\MailTCP.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\MBLRoutines.c"
>
</File>
<File
RelativePath=".\Monitor.c"
>
</File>
<File
RelativePath="..\CommonSource\Multicast.c"
>
</File>
<File
RelativePath=".\MultiConsole.c"
>
</File>
<File
RelativePath="..\CommonSource\NNTPRoutines.c"
>
</File>
<File
RelativePath="..\CommonSource\UIRoutines.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\utf8Routines.c"
>
</File>
<File
RelativePath="..\CommonSource\WebMail.c"
>
</File>
<File
RelativePath="..\CommonSource\WPRoutines.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\$(InputName)1.obj"
XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\bpqmailrc.h"
>
</File>
<File
RelativePath="..\CommonSource\Versions.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\BPQMail.rc"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-MHE5LO8"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-MHE5LO8"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="HPLAPTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="HPLAPTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,207 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{3766AA10-C777-4ED8-A83D-F1452DE9B665}</ProjectGuid>
<RootNamespace>TelnetServer</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>15.0.28307.799</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(Configuration)\</IntDir>
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildStep>
<Command />
</CustomBuildStep>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\CKernel;..\CInclude;..\CommonSource;..\BPQMail;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<CompileAs>CompileAsC</CompileAs>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>..\lib\bpq32.lib;wsock32.lib;comctl32.lib;winmm.lib;..\lib\libconfig.lib;DbgHelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\DevProgs\bpq32\BPQMail.exe</OutputFile>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<IgnoreSpecificDefaultLibraries>LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>$(IntDir)BBSListings\bpqmail.map</MapFileName>
<MapExports>true</MapExports>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<PreBuildEvent>
<Command />
</PreBuildEvent>
<CustomBuildStep>
<Command />
</CustomBuildStep>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<WholeProgramOptimization>false</WholeProgramOptimization>
<AdditionalIncludeDirectories>..\CKernel;..\CInclude;..\CommonSource;..\BPQMail;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>CompileAsC</CompileAs>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>..\lib\bpq32.lib;wsock32.lib;comctl32.lib;winmm.lib;..\lib\libconfig.lib;DbgHelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\DevProgs\bpq32\BPQMail.exe</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>c:\DevProgs\bpq32\BPQMail.pdb</ProgramDatabaseFile>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>c:\DevProgs\bpq32\BPQMail.map</MapFileName>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration />
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="Alloc.c" />
<ClCompile Include="BBSHTMLConfig.c" />
<ClCompile Include="BBSUtilities.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">All</AssemblerOutput>
<AssemblerListingLocation Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)</AssemblerListingLocation>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="BPQMail.c" />
<ClCompile Include="BPQMailConfig.c" />
<ClCompile Include="CMSAuth.c" />
<ClCompile Include="FBBRoutines.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="Housekeeping.c" />
<ClCompile Include="HTMLCommonCode.c" />
<ClCompile Include="LzFind.c" />
<ClCompile Include="lzhuf32.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">All</AssemblerOutput>
<AssemblerListingLocation Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)</AssemblerListingLocation>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="LzmaDec.c" />
<ClCompile Include="LzmaEnc.c" />
<ClCompile Include="LzmaLib.c" />
<ClCompile Include="MailCommands.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="MailDataDefs.c" />
<ClCompile Include="MailRouting.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="MailTCP.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="MBLRoutines.c" />
<ClCompile Include="Monitor.c" />
<ClCompile Include="Multicast.c" />
<ClCompile Include="MultiConsole.c" />
<ClCompile Include="NNTPRoutines.c" />
<ClCompile Include="UIRoutines.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
<ClCompile Include="utf8Routines.c" />
<ClCompile Include="WebMail.c" />
<ClCompile Include="WPRoutines.c">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="bpqmailrc.h" />
<ClInclude Include="Versions.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="BPQMail.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,113 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Alloc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BBSHTMLConfig.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BBSUtilities.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQMail.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQMailConfig.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CMSAuth.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FBBRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Housekeeping.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HTMLCommonCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzFind.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="lzhuf32.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzmaDec.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzmaEnc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzmaLib.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailCommands.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailDataDefs.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailRouting.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailTCP.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MBLRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Monitor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Multicast.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MultiConsole.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="NNTPRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="UIRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="utf8Routines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WebMail.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WPRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="bpqmailrc.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Versions.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="BPQMail.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

View File

@ -1867,6 +1867,7 @@ VOID SaveFWDConfig(HWND hDlg)
MaxRXSize = GetDlgItemInt(hDlg, IDC_MAXRECV, &OK, FALSE); MaxRXSize = GetDlgItemInt(hDlg, IDC_MAXRECV, &OK, FALSE);
MaxAge = GetDlgItemInt(hDlg, IDC_MAXAGE, &OK, FALSE); MaxAge = GetDlgItemInt(hDlg, IDC_MAXAGE, &OK, FALSE);
SendPtoMultiple = IsDlgButtonChecked(hDlg, IDC_MULTIP); SendPtoMultiple = IsDlgButtonChecked(hDlg, IDC_MULTIP);
FOURCHARCONT = IsDlgButtonChecked(hDlg, IDC_FOURCHARCONTINENT);
// Reinitialise Aliases // Reinitialise Aliases
@ -3249,6 +3250,7 @@ INT_PTR CALLBACK FwdEditDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARA
CheckDlgButton(hDlg, IDC_WARNNOROUTE, WarnNoRoute); CheckDlgButton(hDlg, IDC_WARNNOROUTE, WarnNoRoute);
CheckDlgButton(hDlg, IDC_USELOCALTIME, Localtime); CheckDlgButton(hDlg, IDC_USELOCALTIME, Localtime);
CheckDlgButton(hDlg, IDC_MULTIP, SendPtoMultiple); CheckDlgButton(hDlg, IDC_MULTIP, SendPtoMultiple);
CheckDlgButton(hDlg, IDC_FOURCHARCONTINENT, FOURCHARCONT);
CurrentBBS = NULL; CurrentBBS = NULL;

View File

@ -319,6 +319,7 @@
#define ID_MULTICAST 40024 #define ID_MULTICAST 40024
#define IDC_DEFAULTNOWINLINK 41001 #define IDC_DEFAULTNOWINLINK 41001
#define IDC_MULTIP 41002 #define IDC_MULTIP 41002
#define IDC_FOURCHARCONTINENT 41003
// Next default values for new objects // Next default values for new objects
// //

View File

@ -36,7 +36,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
//#include "vmm.h" //#include "vmm.h"
#include "CHeaders.h" #include "cheaders.h"
extern int SENDNETFRAME(); extern int SENDNETFRAME();

View File

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

View File

@ -1,228 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="BPQRemotePTT"
ProjectGUID="{E9A342AF-65CF-4E38-9079-216264179675}"
RootNamespace="BPQRemotePTT"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\xxx"
IntermediateDirectory="c:\dev\msdev2005\intermed\$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Debug/BPQRemotePTT.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="true"
RuntimeLibrary="1"
PrecompiledHeaderFile=".\Debug/BPQRemotePTT.pch"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
ProgramDataBaseFileName="$(IntDir)\"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="2057"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="WS2_32.Lib Psapi.lib ..\lib\libconfigd.lib"
OutputFile="c:\DevProgs\bpq32\BPQRemotePTT.exe"
LinkIncremental="2"
SuppressStartupBanner="true"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\Debug/bpq32.pdb"
GenerateMapFile="true"
MapFileName="c:\devprogs\bpq32\bpqpp.map"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Debug/BPQRemotePTT.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory=".\xxx"
IntermediateDirectory="c:\msdev2005\intermed\$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Release/BPQRemotePTT.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\cinclude"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
PrecompiledHeaderFile="C:\msdev2005\Intermed\Release/BPQRemotePTT.pch"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
ProgramDataBaseFileName="$(IntDir)\"
WarningLevel="3"
SuppressStartupBanner="true"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="2057"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="WS2_32.Lib Psapi.lib ..\lib\libconfig.lib"
OutputFile="c:\DevProgs\bpq32\BPQRemotePTT.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
ProgramDatabaseFile=".\Release/BPQRemotePTT.pdb"
GenerateMapFile="true"
MapFileName="c:\devprogs\bpq32\BPQRemotePTT.map"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Release/BPQRemotePTT.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
>
<File
RelativePath=".\BPQRemotePTT.c"
>
</File>
<File
RelativePath=".\BPQRemotePTT.rc"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -214,7 +214,7 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ; LRESULT APIENTRY MonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
extern CMDX COMMANDS[]; extern struct CMDX COMMANDS[];
extern int APPL1; extern int APPL1;
static HMENU trayMenu; static HMENU trayMenu;
@ -613,6 +613,11 @@ VOID CALLBACK SetupTermSessions(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dw
else else
AppendMenu(hMonCfgMenu,MF_STRING | MF_UNCHECKED,BPQBASE + i,msg); AppendMenu(hMonCfgMenu,MF_STRING | MF_UNCHECKED,BPQBASE + i,msg);
} }
if (mtxparam & 0x80)
CheckMenuItem(hMonCfgMenu,MONLOCALTIME,MF_CHECKED);
else
CheckMenuItem(hMonCfgMenu,MONLOCALTIME,MF_UNCHECKED);
if (mtxparam & 1) if (mtxparam & 1)
CheckMenuItem(hMonCfgMenu,BPQMTX,MF_CHECKED); CheckMenuItem(hMonCfgMenu,BPQMTX,MF_CHECKED);
@ -1733,6 +1738,10 @@ LRESULT CALLBACK MonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
break; break;
} }
case MONLOCALTIME:
ToggleLocalTime();
break;
case BPQMTX: case BPQMTX:
@ -4266,6 +4275,24 @@ int ToggleMTX(HWND hWnd)
return (0); return (0);
}
int ToggleLocalTime(HWND hWnd)
{
mtxparam = mtxparam ^ 0x80;
if (mtxparam & 0x80)
CheckMenuItem(hMonCfgMenu,MONLOCALTIME,MF_CHECKED);
else
CheckMenuItem(hMonCfgMenu,MONLOCALTIME,MF_UNCHECKED);
IntSetTraceOptionsEx(portmask,mtxparam,mcomparam, monUI);
return (0);
} }
int ToggleMCOM(HWND hWnd) int ToggleMCOM(HWND hWnd)
{ {
@ -4790,6 +4817,7 @@ BOOL CreateMonitorWindow(char * MonSize)
Cinfo->hConsole = ChildWnd; Cinfo->hConsole = ChildWnd;
// return if its not possible to create the child window // return if its not possible to create the child window
if(NULL == ChildWnd) if(NULL == ChildWnd)
{ {
return 0; return 0;
@ -4812,8 +4840,8 @@ BOOL CreateMonitorWindow(char * MonSize)
Cinfo = &MonWindow; Cinfo = &MonWindow;
// MoveWindow(Cinfo->hConsole, Rect.left - (OffsetW /2), Rect.top - OffsetH, MoveWindow(ChildWnd, Rect.left - (OffsetW /2), Rect.top - OffsetH, Rect.right - Rect.left, Rect.bottom - Rect.top, TRUE);
// Rect.right-Rect.left, Rect.bottom-Rect.top, TRUE);
MoveWindows(Cinfo); MoveWindows(Cinfo);

View File

@ -1,230 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="BPQWinAPP"
ProjectGUID="{005A91EA-3A00-4FB4-ADD9-EB78DBFA2B81}"
RootNamespace="BPQWinAPP"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="C:\Dev\Msdev200\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Debug/BPQWinAPP.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="C:\Users\johnw\OneDrive\Dev\Source\bpq32\Commonsource;C:\Users\johnw\OneDrive\Dev\Source\bpq32\CInclude"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="true"
RuntimeLibrary="1"
PrecompiledHeaderFile=".\Debug/BPQWinAPP.pch"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
ProgramDataBaseFileName="$(IntDir)\"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="2057"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\lib\bpq32.lib DbgHelp.lib"
OutputFile="c:\DevProgs\bpq32\bpq32.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\Debug/bpq32.pdb"
GenerateMapFile="true"
SubSystem="2"
StackReserveSize="0"
StackCommitSize="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Debug/BPQWinAPP.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Release/BPQWinAPP.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="C:\Users\johnw\OneDrive\Dev\Source\bpq32\Commonsource"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
PrecompiledHeaderFile="C:\msdev2005\Intermed\Release/BPQWinAPP.pch"
AssemblerListingLocation="$(IntDir)\"
ObjectFile="$(IntDir)\"
ProgramDataBaseFileName="$(IntDir)\"
WarningLevel="3"
SuppressStartupBanner="true"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="2057"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\lib\bpq32.lib DbgHelp.lib"
OutputFile="c:\DevProgs\bpq32\bpq32.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
ProgramDatabaseFile=".\Release/bpq32.pdb"
GenerateMapFile="true"
MapFileName="c:\DevProgs\bpq32\bpq32app.map"
SubSystem="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Release/BPQWinAPP.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
>
<File
RelativePath=".\BPQWinAPP.c"
>
</File>
<File
RelativePath=".\BPQWinAPP.rc"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -56,7 +56,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#ifndef WIN32 #ifndef WIN32
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
@ -87,7 +87,7 @@ void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
static BOOL ReadConfigFile(int Port); static BOOL ReadConfigFile(int Port);
int ConnecttoAGW(); int ConnecttoAGW(int port);
int ProcessReceivedData(int bpqport); int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port, BOOL CheckPort); static int ProcessLine(char * buf, int Port, BOOL CheckPort);

133
Bpq32.c
View File

@ -3,7 +3,7 @@ Copyright 2001-2022 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32. This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify LinBPQ/BPQ32 is free software: you can redistribute it and/or modifyextern int HTTP
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
@ -1193,7 +1193,80 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add SDRAngel rig control (11) // Add SDRAngel rig control (11)
// Add option to specify config and data directories on linbpq (12) // Add option to specify config and data directories on linbpq (12)
// Allow zero resptime (send RR immediately) (13) // Allow zero resptime (send RR immediately) (13)
// Fix corruptions in Webmail on 64 bit builds, eg in displaying 7+ files (15) // Make sure CMD bit is set on UI frames
// Add setting Modem Flags in QtSM AGW mode
// If FT847 om PTC Port send a "Cat On" command (17)
// Fix some 63 port bugs in RigCOntrol (17)
// Fix 63 port bug in Bridging (18)
// Add FTDX10 Rigcontrol (19)
// Fix 64 bit bug in displaying INP3 Messages (20)
// Improve restart of WinRPR TNC on remote host (21)
// Fix some Rigcontrol issues with empty timebands (22)
// Fix 64 bit bug in processing INP3 Messages (22)
// First pass at api (24)
// Send OK in response to Rigcontrol CMD (24)
// Disable CTS check in WriteComBlock (26)
// Improvments to reporting to M0LTE Map (26)
// IPGateway fix from github user isavitsky (27)
// Fix possible crash in SCSPactor PTCPORT code (29)
// Add NodeAPI call sendLinks and remove get from other calls (32)
// Improve validation of Web Beacon Config (33)
// Support SNMP via host ip stack as well as IPGateway (34)
// Switch APRS Map to OSM tile servers (36)
// Fix potential buffer overflow in Telnet login (36)
// Allow longer serial device names (37)
// Fix ICF8101 Mode setting (37)
// Kill link if we are getting repeated RR(F) after timeout
// (Indicating other station is seeing our RR(P) but not the resent I frame) (40)
// Change default of SECURETELNET to 1 (41)
// Add optional ATTACH time limit for ARDOP (42)
// Fix buffer overflow risk in HTTP Terminal(42)
// Fix KISSHF Interlock (43)
// Support other than channel A on HFKISS (43)
// Support additional port info reporting for M0LTE Map (44)
// Allow interlocking of KISS and Session mode ports (eg ARDOP and VARA) (45)
// Add ARDOP UI Packets to MH (45)
// Add support for Qtsm Mgmt Interface (45)
// NodeAPI improvements (46)
// Add MQTT Interface (46)
// Fix buffer leak in ARDOP code(46)
// Fix possible crash if MQTT not in use (47)
// Add optional ATTACH time limit for VARA (48)
// API format fixes (48)
// AGWAPI Add protection against accidental connects from a non-agw application (50)
// Save MH and NODES every hour (51)
// Fix handling long unix device names (now max 250 bytes) (52)
// Fix error reporting in api update (53)
// Coding changes to remove some compiler warnings (53, 54)
// Add MQTT reporting of Mail Events (54)
// Fix beaconong on KISSHF ports (55)
// Fix MailAPI msgs endpoint
// Attempt to fix NC going to wrong application. (57)
// Improve ARDOP end of session code (58)
// Run M0LTE Map reporting in a separate thread (59/60)
// Add RHP support for WhatsPac (59)
// 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)
#define CKernel #define CKernel
@ -1286,6 +1359,7 @@ void * KISSHFExtInit(EXTPORTDATA * PortEntry);
void * WinRPRExtInit(EXTPORTDATA * PortEntry); void * WinRPRExtInit(EXTPORTDATA * PortEntry);
void * HSMODEMExtInit(EXTPORTDATA * PortEntry); void * HSMODEMExtInit(EXTPORTDATA * PortEntry);
void * FreeDataExtInit(EXTPORTDATA * PortEntry); void * FreeDataExtInit(EXTPORTDATA * PortEntry);
void * SIXPACKExtInit(EXTPORTDATA * PortEntry);
extern char * ConfigBuffer; // Config Area extern char * ConfigBuffer; // Config Area
VOID REMOVENODE(dest_list * DEST); VOID REMOVENODE(dest_list * DEST);
@ -1333,6 +1407,9 @@ extern struct _LINKTABLE * LINKS;
extern int LINK_TABLE_LEN; extern int LINK_TABLE_LEN;
extern int MAXLINKS; extern int MAXLINKS;
extern double LatFromLOC;
extern double LonFromLOC;
extern int BPQHOSTAPI(); extern int BPQHOSTAPI();
extern int INITIALISEPORTS(); extern int INITIALISEPORTS();
@ -1451,6 +1528,7 @@ VOID APRSClose();
VOID CloseTNCEmulator(); VOID CloseTNCEmulator();
VOID Poll_AGW(); VOID Poll_AGW();
void RHPPoll();
BOOL AGWAPIInit(); BOOL AGWAPIInit();
int AGWAPITerminate(); int AGWAPITerminate();
@ -1469,7 +1547,9 @@ UINT Sem_edx = 0;
UINT Sem_esi = 0; UINT Sem_esi = 0;
UINT Sem_edi = 0; UINT Sem_edi = 0;
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI; DllExport void * BPQHOSTAPIPTR = &BPQHOSTAPI;
@ -1602,7 +1682,7 @@ char PopupText[30][100] = {""};
// Next 3 should be uninitialised so they are local to each process // Next 3 should be uninitialised so they are local to each process
UCHAR MCOM; UCHAR MCOM;
UCHAR MTX; UCHAR MTX; // Top bit indicates use local time
uint64_t MMASK; uint64_t MMASK;
UCHAR MUIONLY; UCHAR MUIONLY;
@ -1817,8 +1897,8 @@ VOID MonitorThread(int x)
{ {
// It is stuck - try to release // It is stuck - try to release
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d", Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
Semaphore.SemProcessID, SemHeldByAPI); Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
// Write a minidump // Write a minidump
@ -2056,7 +2136,7 @@ VOID TimerProcX()
GetWindowRect(FrameWnd, &FRect); GetWindowRect(FrameWnd, &FRect);
SaveWindowPos(64); // Rigcontrol SaveWindowPos(70); // Rigcontrol
for (i=0;i<NUMBEROFPORTS;i++) for (i=0;i<NUMBEROFPORTS;i++)
{ {
@ -2172,7 +2252,7 @@ VOID TimerProcX()
if(TimerInst == GetCurrentProcessId()) if(TimerInst == GetCurrentProcessId())
{ {
RigReconfigFlag = FALSE; RigReconfigFlag = FALSE;
CloseDriverWindow(40); CloseDriverWindow(70);
Rig_Close(); Rig_Close();
Sleep(6000); // Allow any CATPTT, HAMLIB and FLRIG threads to close Sleep(6000); // Allow any CATPTT, HAMLIB and FLRIG threads to close
RigActive = Rig_Init(); RigActive = Rig_Init();
@ -2239,6 +2319,7 @@ VOID TimerProcX()
Poll_AGW(); Poll_AGW();
DRATSPoll(); DRATSPoll();
RHPPoll();
CheckGuardZone(); CheckGuardZone();
@ -2307,6 +2388,8 @@ FirstInit()
} }
timeLoadedMS = GetTickCount(); timeLoadedMS = GetTickCount();
srand(time(NULL));
INITIALISEPORTS(); INITIALISEPORTS();
@ -3027,7 +3110,7 @@ SkipInit:
if (AttachedProcesses < 2) if (AttachedProcesses < 2)
{ {
if (AUTOSAVE == 1) if (AUTOSAVE)
SaveNodes(); SaveNodes();
if (AUTOSAVEMH) if (AUTOSAVEMH)
SaveMH(); SaveMH();
@ -3923,6 +4006,9 @@ VOID * InitializeExtDriver(PEXTPORTDATA PORTVEC)
if (strstr(Value, "FREEDATA")) if (strstr(Value, "FREEDATA"))
return FreeDataExtInit; return FreeDataExtInit;
if (strstr(Value, "6PACK"))
return SIXPACKExtInit;
ExtDriver = LoadLibrary(Value); ExtDriver = LoadLibrary(Value);
if (ExtDriver == NULL) if (ExtDriver == NULL)
@ -6046,13 +6132,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;
@ -6078,19 +6165,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;
@ -6460,7 +6548,7 @@ VOID SaveBPQ32Windows()
SaveMDIWindowPos(StatusWnd, "", "StatusWindowSize", StatusMinimized); SaveMDIWindowPos(StatusWnd, "", "StatusWindowSize", StatusMinimized);
SaveMDIWindowPos(hConsWnd, "", "WindowSize", ConsoleMinimized); SaveMDIWindowPos(hConsWnd, "", "WindowSize", ConsoleMinimized);
for (i=0;i<NUMBEROFPORTS;i++) for (i=0; i<NUMBEROFPORTS; i++)
{ {
if (PORTVEC->PORTCONTROL.PORTTYPE == 0x10) // External if (PORTVEC->PORTCONTROL.PORTTYPE == 0x10) // External
{ {
@ -6473,7 +6561,7 @@ VOID SaveBPQ32Windows()
PORTVEC=(PEXTPORTDATA)PORTVEC->PORTCONTROL.PORTPOINTER; PORTVEC=(PEXTPORTDATA)PORTVEC->PORTCONTROL.PORTPOINTER;
} }
SaveWindowPos(40); // Rigcontrol SaveWindowPos(70); // Rigcontrol
if (hIPResWnd) if (hIPResWnd)
@ -6503,6 +6591,7 @@ VOID GetParam(char * input, char * key, char * value)
char * ptr1, * ptr2; char * ptr1, * ptr2;
char c; char c;
if (ptr) if (ptr)
{ {
ptr2 = strchr(ptr, '&'); ptr2 = strchr(ptr, '&');
@ -6576,11 +6665,19 @@ int GetListeningPortsPID(int Port)
return 0; // Not found return 0; // Not found
} }
DllExport char * APIENTRY GetLOC() DllExport char * APIENTRY GetLOC()
{ {
return LOC; return LOC;
} }
DllExport void APIENTRY GetLatLon(double * lat, double * lon)
{
*lat = LatFromLOC;
*lon = LonFromLOC;
return;
}
// UZ7HO Dll PTT interface // UZ7HO Dll PTT interface
// 1 ext_PTT_info // 1 ext_PTT_info

View File

@ -40,6 +40,7 @@
#define CHATTERM 1179 #define CHATTERM 1179
#define IDM_CLOSEWINDOW 1180 #define IDM_CLOSEWINDOW 1180
#define MONITORAPRS 1181 #define MONITORAPRS 1181
#define MONLOCALTIME 1182
#define MON_UI_ONLY 40006 #define MON_UI_ONLY 40006
#define StopALLMon 40007 #define StopALLMon 40007

View File

@ -1,617 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="CBPQ32"
ProjectGUID="{8EFA1E59-8654-4A23-8102-AA77A074D57C}"
RootNamespace="CBPQ32"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
<DefaultToolFile
FileName="masm.rules"
/>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="d:\devprogs\bpq32"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="MASM"
PreserveIdentifierCase="3"
IncludePaths="..\CInclude"
EnableMASM51Compatibility="true"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CInclude;..\CommonSource;..\CKernel"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T;BPQ32"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
AssemblerOutput="2"
AssemblerListingLocation="c:\devprogs\bpq32\listings\debug\"
BrowseInformation="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalOptions=" /section:_BPQDATA,srw"
AdditionalDependencies="WS2_32.Lib winmm.lib DbgHelp.lib comctl32.lib Iphlpapi.lib setupapi.lib ..\lib\libconfigd.lib miniupnpc.lib zlibstat.lib"
OutputFile="c:\DevProgs\BPQ32\bpq32.dll"
LinkIncremental="2"
IgnoreAllDefaultLibraries="false"
IgnoreDefaultLibraryNames="LIBCMTD.lib"
ModuleDefinitionFile="..\CommonSource\bpq32.def"
GenerateDebugInformation="true"
GenerateMapFile="true"
MapFileName="c:\DevProgs\BPQ32\bpqdev.map"
MapExports="true"
SubSystem="2"
HeapCommitSize="8000000"
StackCommitSize="4000000"
EnableCOMDATFolding="1"
EntryPointSymbol=""
BaseAddress="0x42000000"
ImportLibrary="..\lib\bpq32.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
OutputFile="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ConfigurationName)\$(ProjectName).bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
CommandLine="&quot;C:\Program Files\7-Zip\7z.exe&quot; a C:\DevProgs\BPQ32\bpq32.zip C:\DevProgs\BPQ32\bpq32.dll &amp;&amp; myxcopy /y c:\DevProgs\BPQ32\bpq32.dll c:\windows\SysWOW64\bpq32.dll &amp;&amp; del C:\DevProgs\BPQ32\bpq32.dll"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="0"
WholeProgramOptimization="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="MASM"
PreserveIdentifierCase="3"
AssembledCodeListingFile="$(IntDir)\$(InputName)"
IncludePaths="..\CInclude"
ListAllAvailableInformation="true"
EnableAssemblyGeneratedCodeListing="true"
EnableFalseConditionalsInListing="true"
EnableMASM51Compatibility="true"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/D &quot;MDIKERNEL&quot;"
Optimization="0"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="..\CInclude;..\CommonSource;..\CKernel"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
AssemblerOutput="2"
AssemblerListingLocation="c:\devprogs\bpq32\listings\"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalOptions=" /section:_BPQDATA,srw"
AdditionalDependencies="WS2_32.Lib winmm.lib comctl32.lib setupapi.lib ..\lib\libconfig.lib miniupnpc.lib zlibstat.lib DbgHelp.lib"
OutputFile="C:\DevProgs\BPQ32\bpq32.dll"
LinkIncremental="1"
IgnoreDefaultLibraryNames=""
ModuleDefinitionFile="..\CommonSource\bpq32.def"
GenerateDebugInformation="true"
ProgramDatabaseFile="c:\DevProgs\BPQ32\bpq32.pdb"
GenerateMapFile="true"
MapFileName="c:\DevProgs\BPQ32\bpqpdn.map"
MapExports="true"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
LinkTimeCodeGeneration="0"
BaseAddress="0x42000000"
ImportLibrary="C:\Dev\Msdev2005\Projects\BPQ32\lib\bpq32.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
OutputFile="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ConfigurationName)\$(ProjectName).bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
CommandLine="&quot;C:\Program Files\7-Zip\7z.exe&quot; a C:\DevProgs\BPQ32\bpq32.zip C:\DevProgs\BPQ32\bpq32.dll &amp;&amp; myxcopy /y c:\DevProgs\BPQ32\bpq32.dll c:\windows\SysWOW64\bpq32.dll &amp;&amp; del C:\DevProgs\BPQ32\bpq32.dll"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\CommonSource\adif.c"
>
</File>
<File
RelativePath="..\CommonSource\AEAPactor.c"
>
</File>
<File
RelativePath="..\CommonSource\AGWAPI.c"
>
</File>
<File
RelativePath="..\CommonSource\AGWMoncode.c"
>
</File>
<File
RelativePath=".\AISCommon.c"
>
</File>
<File
RelativePath="..\CommonSource\APRSCode.c"
>
</File>
<File
RelativePath=".\APRSIconData.c"
>
</File>
<File
RelativePath=".\APRSStdPages.c"
>
</File>
<File
RelativePath="..\CommonSource\ARDOP.c"
>
</File>
<File
RelativePath="..\CommonSource\asmDOSAPI.asm"
>
</File>
<File
RelativePath=".\base64.c"
>
</File>
<File
RelativePath="..\CommonSource\Bpq32.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqaxip.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqether.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqhdlc.c"
>
</File>
<File
RelativePath="..\CommonSource\BPQINP3.c"
>
</File>
<File
RelativePath="..\CommonSource\BPQNRR.c"
>
</File>
<File
RelativePath=".\BPQTermMDI.c"
>
</File>
<File
RelativePath="..\CommonSource\BPQtoAGW.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqvkiss.c"
>
</File>
<File
RelativePath="..\CommonSource\cMain.c"
>
</File>
<File
RelativePath="..\CommonSource\Cmd.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="0"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\CMSAuth.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="0"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\CommonCode.c"
>
</File>
<File
RelativePath="..\CommonSource\compatbits.c"
>
</File>
<File
RelativePath="..\CommonSource\config.c"
>
</File>
<File
RelativePath="..\CommonSource\datadefs.c"
>
</File>
<File
RelativePath="..\CommonSource\DOSAPI.c"
>
</File>
<File
RelativePath=".\DRATS.c"
>
</File>
<File
RelativePath=".\Events.c"
>
</File>
<File
RelativePath="..\CommonSource\FLDigi.c"
>
</File>
<File
RelativePath=".\FreeDATA.c"
>
</File>
<File
RelativePath="..\CommonSource\HALDriver.c"
>
</File>
<File
RelativePath="..\CommonSource\HFCommon.c"
>
</File>
<File
RelativePath="..\CommonSource\hid.c"
>
</File>
<File
RelativePath=".\HSMODEM.c"
>
</File>
<File
RelativePath="..\CommonSource\HTTPcode.c"
>
</File>
<File
RelativePath="..\CommonSource\IPCode.c"
>
</File>
<File
RelativePath="..\CommonSource\KAMPactor.c"
>
</File>
<File
RelativePath="..\CommonSource\kiss.c"
>
</File>
<File
RelativePath="..\CommonSource\KISSHF.c"
>
</File>
<File
RelativePath="..\CommonSource\L2Code.c"
>
</File>
<File
RelativePath="..\CommonSource\L3Code.c"
>
</File>
<File
RelativePath="..\CommonSource\L4Code.c"
>
</File>
<File
RelativePath="..\CommonSource\md5.c"
>
</File>
<File
RelativePath="..\CommonSource\Moncode.c"
>
</File>
<File
RelativePath="..\CommonSource\MULTIPSK.c"
>
</File>
<File
RelativePath=".\png.c"
>
</File>
<File
RelativePath=".\pngerror.c"
>
</File>
<File
RelativePath=".\pngget.c"
>
</File>
<File
RelativePath=".\pngmem.c"
>
</File>
<File
RelativePath=".\pngread.c"
>
</File>
<File
RelativePath=".\pngrio.c"
>
</File>
<File
RelativePath=".\pngrtran.c"
>
</File>
<File
RelativePath=".\pngrutil.c"
>
</File>
<File
RelativePath=".\pngset.c"
>
</File>
<File
RelativePath=".\pngtrans.c"
>
</File>
<File
RelativePath=".\pngvcrd.c"
>
</File>
<File
RelativePath=".\pngwio.c"
>
</File>
<File
RelativePath=".\pngwrite.c"
>
</File>
<File
RelativePath=".\pngwtran.c"
>
</File>
<File
RelativePath=".\pngwutil.c"
>
</File>
<File
RelativePath="..\CommonSource\PortMapper.c"
>
</File>
<File
RelativePath="..\CommonSource\RigControl.c"
>
</File>
<File
RelativePath="..\CommonSource\SCSPactor.c"
>
</File>
<File
RelativePath="..\CommonSource\SCSTrackeMulti.c"
>
</File>
<File
RelativePath="..\CommonSource\SCSTracker.c"
>
</File>
<File
RelativePath="..\CommonSource\SerialPort.c"
>
</File>
<File
RelativePath="..\CommonSource\TelnetV6.c"
>
</File>
<File
RelativePath="..\CommonSource\TNCCode.c"
>
</File>
<File
RelativePath="..\CommonSource\TNCEmulators.c"
>
</File>
<File
RelativePath="..\CommonSource\UIARQ.c"
>
</File>
<File
RelativePath=".\upnp.c"
>
</File>
<File
RelativePath="..\CommonSource\utf8Routines.c"
>
</File>
<File
RelativePath="..\CommonSource\UZ7HODrv.c"
>
</File>
<File
RelativePath="..\CommonSource\V4.c"
>
</File>
<File
RelativePath="..\CommonSource\VARA.c"
>
</File>
<File
RelativePath="..\CommonSource\WINMOR.c"
>
</File>
<File
RelativePath="..\CommonSource\WinRPR.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\CommonSource\asmstrucs.h"
>
</File>
<File
RelativePath="..\CommonSource\bpq32.def"
>
</File>
<File
RelativePath="..\CommonSource\CHeaders.h"
>
</File>
<File
RelativePath="..\CommonSource\compatbits.h"
>
</File>
<File
RelativePath="..\CKernel\kernelresource.h"
>
</File>
<File
RelativePath="..\CInclude\Strucs.inc"
>
</File>
<File
RelativePath="..\CommonSource\Versions.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath="..\CommonSource\KernelScript1.rc"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="c:\devprogs\bpq32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-MHE5LO8"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command=""
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-MHE5LO8"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="C:\Devprogs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="C:\Devprogs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="C:\Devprogs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="HPLAPTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command=""
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="HPLAPTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="C:\DevProgs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="C:\DevProgs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,232 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{8EFA1E59-8654-4A23-8102-AA77A074D57C}</ProjectGuid>
<RootNamespace>CBPQ32</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
<WholeProgramOptimization>false</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>15.0.28127.55</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(Configuration)\</IntDir>
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
<IntDir>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<MASM>
<PreserveIdentifierCase>3</PreserveIdentifierCase>
<IncludePaths>..\CInclude</IncludePaths>
<EnableMASM51Compatibility>true</EnableMASM51Compatibility>
</MASM>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\CInclude;..\CommonSource;..\CKernel;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader />
<AssemblerOutput>All</AssemblerOutput>
<AssemblerListingLocation>c:\devprogs\bpq32\listings\debug\</AssemblerListingLocation>
<BrowseInformation>true</BrowseInformation>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalOptions> /section:_BPQDATA,srw %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>WS2_32.Lib;winmm.lib;DbgHelp.lib;comctl32.lib;Iphlpapi.lib;setupapi.lib;..\lib\libconfig.lib;miniupnpc.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\DevProgs\BPQ32\bpq32.dll</OutputFile>
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
<IgnoreSpecificDefaultLibraries>LIBCMTD.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<ModuleDefinitionFile>..\CommonSource\bpq32.def</ModuleDefinitionFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>c:\DevProgs\BPQ32\bpqdev.map</MapFileName>
<MapExports>true</MapExports>
<SubSystem>Windows</SubSystem>
<HeapCommitSize>8000000</HeapCommitSize>
<StackCommitSize>4000000</StackCommitSize>
<EnableCOMDATFolding>false</EnableCOMDATFolding>
<EntryPointSymbol />
<BaseAddress>0x42000000</BaseAddress>
<ImportLibrary>..\lib\bpq32.lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
</Link>
<Bscmake>
<OutputFile>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(Configuration)\$(ProjectName).bsc</OutputFile>
</Bscmake>
<PostBuildEvent>
<Command>"C:\Program Files\7-Zip\7z.exe" a C:\DevProgs\BPQ32\bpq32.zip C:\DevProgs\BPQ32\bpq32.dll &amp;&amp; myxcopy /y c:\DevProgs\BPQ32\bpq32.dll c:\windows\SysWOW64\bpq32.dll &amp;&amp; del C:\DevProgs\BPQ32\bpq32.dll</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<MASM>
<PreserveIdentifierCase>3</PreserveIdentifierCase>
<AssembledCodeListingFile>$(IntDir)$(ProjectName)</AssembledCodeListingFile>
<IncludePaths>..\CInclude</IncludePaths>
<ListAllAvailableInformation>true</ListAllAvailableInformation>
<EnableAssemblyGeneratedCodeListing>true</EnableAssemblyGeneratedCodeListing>
<EnableFalseConditionalsInListing>true</EnableFalseConditionalsInListing>
<EnableMASM51Compatibility>true</EnableMASM51Compatibility>
</MASM>
<ClCompile>
<AdditionalOptions>/D "MDIKERNEL" %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
<WholeProgramOptimization>false</WholeProgramOptimization>
<AdditionalIncludeDirectories>..\CInclude;..\CommonSource;..\CKernel;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader />
<AssemblerOutput>All</AssemblerOutput>
<AssemblerListingLocation>c:\devprogs\bpq32\listings\</AssemblerListingLocation>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalOptions> /section:_BPQDATA,srw %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>WS2_32.Lib;winmm.lib;DbgHelp.lib;comctl32.lib;setupapi.lib;..\lib\libconfig.lib;miniupnpc.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>C:\DevProgs\BPQ32\bpq32.dll</OutputFile>
<ModuleDefinitionFile>..\CommonSource\bpq32.def</ModuleDefinitionFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>c:\DevProgs\BPQ32\bpq32.pdb</ProgramDatabaseFile>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>c:\DevProgs\BPQ32\bpqpdn.map</MapFileName>
<MapExports>true</MapExports>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<LinkTimeCodeGeneration />
<BaseAddress>0x42000000</BaseAddress>
<ImportLibrary>C:\Dev\Msdev2005\Projects\BPQ32\lib\bpq32.lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<Bscmake>
<OutputFile>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(Configuration)\$(ProjectName).bsc</OutputFile>
</Bscmake>
<PostBuildEvent>
<Command>"C:\Program Files\7-Zip\7z.exe" a C:\DevProgs\BPQ32\bpq32.zip C:\DevProgs\BPQ32\bpq32.dll &amp;&amp; myxcopy /y c:\DevProgs\BPQ32\bpq32.dll c:\windows\SysWOW64\bpq32.dll &amp;&amp; del C:\DevProgs\BPQ32\bpq32.dll</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="adif.c" />
<ClCompile Include="AEAPactor.c" />
<ClCompile Include="AGWAPI.c" />
<ClCompile Include="AGWMoncode.c" />
<ClCompile Include="AISCommon.c" />
<ClCompile Include="APRSCode.c" />
<ClCompile Include="APRSStdPages.c" />
<ClCompile Include="ARDOP.c" />
<ClCompile Include="Bpq32.c" />
<ClCompile Include="bpqaxip.c" />
<ClCompile Include="bpqether.c" />
<ClCompile Include="bpqhdlc.c" />
<ClCompile Include="BPQINP3.c" />
<ClCompile Include="BPQNRR.c" />
<ClCompile Include="BPQTermMDI.c" />
<ClCompile Include="BPQtoAGW.c" />
<ClCompile Include="bpqvkiss.c" />
<ClCompile Include="cMain.c" />
<ClCompile Include="Cmd.c" />
<ClCompile Include="CMSAuth.c" />
<ClCompile Include="CommonCode.c" />
<ClCompile Include="compatbits.c" />
<ClCompile Include="config.c" />
<ClCompile Include="datadefs.c" />
<ClCompile Include="DOSAPI.c" />
<ClCompile Include="FLDigi.c" />
<ClCompile Include="HALDriver.c" />
<ClCompile Include="HFCommon.c" />
<ClCompile Include="hid.c" />
<ClCompile Include="HSMODEM.c" />
<ClCompile Include="HTTPcode.c" />
<ClCompile Include="IPCode.c" />
<ClCompile Include="KAMPactor.c" />
<ClCompile Include="kiss.c" />
<ClCompile Include="KISSHF.c" />
<ClCompile Include="L2Code.c" />
<ClCompile Include="L3Code.c" />
<ClCompile Include="L4Code.c" />
<ClCompile Include="md5.c" />
<ClCompile Include="Moncode.c" />
<ClCompile Include="MULTIPSK.c" />
<ClCompile Include="PortMapper.c" />
<ClCompile Include="RigControl.c" />
<ClCompile Include="SCSPactor.c" />
<ClCompile Include="SCSTrackeMulti.c" />
<ClCompile Include="SCSTracker.c" />
<ClCompile Include="SerialPort.c" />
<ClCompile Include="TelnetV6.c" />
<ClCompile Include="TNCCode.c" />
<ClCompile Include="TNCEmulators.c" />
<ClCompile Include="UIARQ.c" />
<ClCompile Include="upnp.c" />
<ClCompile Include="utf8Routines.c" />
<ClCompile Include="UZ7HODrv.c" />
<ClCompile Include="V4.c" />
<ClCompile Include="VARA.c" />
<ClCompile Include="WINMOR.c" />
<ClCompile Include="WinRPR.c" />
</ItemGroup>
<ItemGroup>
<MASM Include="asmDOSAPI.asm" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\CKernel\kernelresource.h" />
<ClInclude Include="asmstrucs.h" />
<ClInclude Include="CHeaders.h" />
<ClInclude Include="compatbits.h" />
<ClInclude Include="Versions.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\CInclude\Strucs.inc" />
<None Include="bpq32.def" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="KernelScript1.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
</ImportGroup>
</Project>

View File

@ -1,228 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="adif.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AEAPactor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AGWAPI.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AGWMoncode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AISCommon.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="APRSCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="APRSStdPages.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ARDOP.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Bpq32.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqaxip.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqether.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqhdlc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQINP3.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQNRR.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQTermMDI.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQtoAGW.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqvkiss.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="cMain.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Cmd.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CMSAuth.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CommonCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="compatbits.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="config.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="datadefs.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DOSAPI.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FLDigi.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HALDriver.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HFCommon.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="hid.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HSMODEM.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HTTPcode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="IPCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="KAMPactor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="kiss.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="KISSHF.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="L2Code.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="L3Code.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="L4Code.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="md5.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Moncode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MULTIPSK.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="PortMapper.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RigControl.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SCSPactor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SCSTrackeMulti.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SCSTracker.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SerialPort.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TelnetV6.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TNCCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TNCEmulators.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="UIARQ.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="upnp.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="utf8Routines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="UZ7HODrv.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="V4.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="VARA.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WINMOR.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WinRPR.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<MASM Include="asmDOSAPI.asm">
<Filter>Source Files</Filter>
</MASM>
</ItemGroup>
<ItemGroup>
<ClInclude Include="asmstrucs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="CHeaders.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="compatbits.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CKernel\kernelresource.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Versions.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="bpq32.def">
<Filter>Header Files</Filter>
</None>
<None Include="..\CInclude\Strucs.inc">
<Filter>Header Files</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="KernelScript1.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>

View File

@ -33,6 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
char * strlop(char * buf, char delim); char * strlop(char * buf, char delim);
VOID APIENTRY md5 (char *arg, unsigned char * checksum); VOID APIENTRY md5 (char *arg, unsigned char * checksum);
// Implementation of the WinLink password challenge/response protocol // Implementation of the WinLink password challenge/response protocol

View File

@ -67,6 +67,7 @@ extern int MaxChatStreams;
extern char Position[81]; extern char Position[81];
extern char PopupText[251]; extern char PopupText[251];
extern int PopupMode; extern int PopupMode;
extern int reportChatEvents;
#include "httpconnectioninfo.h" #include "httpconnectioninfo.h"
@ -323,6 +324,8 @@ VOID SaveChatInfo(struct HTTPConnectionInfo * Session, char * MsgPtr, char * Rep
if (chatPaclen < 60) if (chatPaclen < 60)
chatPaclen = 60; chatPaclen = 60;
GetCheckBox(input, "Events=", &reportChatEvents);
GetParam(input, "nodes=", Nodes); GetParam(input, "nodes=", Nodes);
ptr1 = Nodes; ptr1 = Nodes;
@ -508,7 +511,9 @@ scan:
Len = sprintf(Reply, ChatConfigTemplate, Len = sprintf(Reply, ChatConfigTemplate,
OurNode, Key, Key, Key, OurNode, Key, Key, Key,
ChatApplNum, MaxChatStreams, Nodes, chatPaclen, Position, ChatApplNum, MaxChatStreams,
(reportChatEvents) ? CHKD : UNC,
Nodes, chatPaclen, Position,
(PopupMode) ? UNC : CHKD, (PopupMode) ? UNC : CHKD,
(PopupMode) ? CHKD : UNC, Text, ptr2); (PopupMode) ? CHKD : UNC, Text, ptr2);

View File

@ -1,16 +0,0 @@
IZ4FVW 0 Giulio Cesena ITA JN64ce, 1k2 bps radio link¬55¬0
N5UXT 0 Angelo th New Orleans, La¬99¬0
N0NJY 0 Rick Oak Island, NC¬76¬0
KB8UVN 0 Matt Johnstown, Ohio¬95¬0
WA3WLH 0 Rich East Greenville, PA¬55¬0
EI2GYB 0 Steve_353 Donegal, Ireland (IO65JG)¬55¬0
PE1RRR 0 Red Network Hub Monitor¬91¬0
PE1NNZ 0 Guido nr Eindhoven¬91¬0
G7TAJ 0 Steve_44 E.Sussex UK,JO00FU¬91¬0
N3HYM 0 Ray Frederick, Md¬97¬0
VE3CGH 0 Ted ?_qth¬71¬0
WE1H 0 Matt Merrimack, NH¬26¬0
W9IKU 0 Greg Portage, Wisconsin USA¬55¬0
KA3VSP 0 Brian New Castle, DE¬91¬0
G8BPQ 0 John Nottingham¬26¬0
GM8BPQ 40 John ?_qth¬14¬0

View File

@ -39,7 +39,8 @@ VOID __cdecl Logprintf(int LogMode, ChatCIRCUIT * conn, int InOut, const char *
return; return;
} }
void GetSemaphore(struct SEM * Semaphore, int ID)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line)
{ {
// //
// Wait for it to be free // Wait for it to be free
@ -74,6 +75,9 @@ loop1:
; ;
} }
Semaphore->Line = Line;
strcpy(Semaphore->File, File);
return; return;
} }
void FreeSemaphore(struct SEM * Semaphore) void FreeSemaphore(struct SEM * Semaphore)

680
Cmd.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,164 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{271FDA0A-4F41-4F35-8227-9F2F29AA5A25}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>ConsoleApplication2</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
<ProjectName>ConfigDirewolf</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>c:\devprogs\bpq32\ConfigDirewolf.exe</OutputFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="ConfigDirewolf.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,164 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{2AD91A25-DF1B-462E-8CCB-CD1ABC627AA5}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>ConsoleApplication2</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
<ProjectName>ConfigWinRPR</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>c:\devprogs\bpq32\ConfigWinRPR.exe</OutputFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="ConfigWinRPR.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

View File

@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "compatbits.h" #include "compatbits.h"
#include "CHeaders.h" #include "cheaders.h"
extern QCOUNT; extern QCOUNT;
extern BPQVECSTRUC BPQHOSTVECTOR[]; extern BPQVECSTRUC BPQHOSTVECTOR[];

View File

@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "telnetserver.h" #include "telnetserver.h"
@ -168,7 +168,7 @@ int AllocateDRATSStream(struct DRATSSession * Sess)
if (Stream == 255) return 0; if (Stream == 255) return 0;
if (memcmp(Sess->CallTo, "NODE", 6) == 0) if (memcmp(Sess->CallTo, "NODE", 4) == 0)
{ {
// Just connect to command level on switch // Just connect to command level on switch
} }
@ -563,7 +563,7 @@ void DRATSConnectionLost(struct ConnectionInfo * sockptr)
#define ZEXPORT __stdcall #define ZEXPORT __stdcall
#endif #endif
#include "zlib.h" #include <zlib.h>
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen) int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen)

134
Events.c
View File

@ -23,6 +23,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "compatbits.h" #include "compatbits.h"
#include <string.h> #include <string.h>
#include "asmstrucs.h"
#include "tncinfo.h"
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
@ -37,6 +39,11 @@ VOID __cdecl Debugprintf(const char * format, ...);
#endif #endif
extern BOOL EventsEnabled; extern BOOL EventsEnabled;
void MQTTReportSession(char * Msg);
extern int MQTT;
extern char Modenames[19][10];
// Runs use specified routine on certain event // Runs use specified routine on certain event
#ifndef WIN32 #ifndef WIN32
@ -107,3 +114,130 @@ DllExport void APIENTRY RunEventProgram(char * Program, char * Param)
return; return;
} }
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK)
{
// Incoming SABM
LINK->ConnectTime = time(NULL);
LINK->bytesTXed = LINK->bytesRXed = 0;
strcpy(LINK->callingCall, remotecall);
strcpy(LINK->receivingCall, ourcall);
strcpy(LINK->Direction, "In");
}
void hookL2SessionDeleted(struct _LINKTABLE * LINK)
{
// calculate session time and av bytes/min in and out
if (LINK->ConnectTime)
{
if (LINK->bytesTXed == 0 && LINK->bytesRXed == 0)
{
// assume failed connect and ignore for now - maybe log later
}
else
{
char Msg[256];
char timestamp[16];
time_t sessionTime = time(NULL) - LINK->ConnectTime;
double avBytesSent = LINK->bytesTXed / (sessionTime / 60.0);
double avBytesRXed = LINK->bytesRXed / (sessionTime / 60.0);
time_t Now = time(NULL);
struct tm * TM = localtime(&Now);
sprintf(timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
if (sessionTime == 0)
sessionTime = 1; // Or will get divide by zero error
Debugprintf("KISS Session Stats Port %d %s %s %d secs Bytes Sent %d BPM %4.2f Bytes Received %d %4.2f BPM ",
LINK->LINKPORT->PORTNUMBER, LINK->callingCall, LINK->receivingCall, sessionTime, LINK->bytesTXed, avBytesSent, LINK->bytesRXed, avBytesRXed, timestamp);
sprintf(Msg, "{\"mode\": \"%s\", \"direction\": \"%s\", \"port\": %d, \"callfrom\": \"%s\", \"callto\": \"%s\", \"time\": %d, \"bytesSent\": %d,"
"\"BPMSent\": %4.2f, \"BytesReceived\": %d, \"BPMReceived\": %4.2f, \"timestamp\": \"%s\"}",
"KISS", LINK->Direction, LINK->LINKPORT->PORTNUMBER, LINK->callingCall, LINK->receivingCall, sessionTime,
LINK->bytesTXed, avBytesSent, LINK->bytesRXed, avBytesRXed, timestamp);
if (MQTT)
MQTTReportSession(Msg);
}
LINK->ConnectTime = 0;
}
if (LINK->Sent && LINK->Received && (LINK->SentAfterCompression || LINK->ReceivedAfterExpansion))
Debugprintf("L2 Compression Stats %s %s TX %d %d %d%% RX %d %d %d%%", LINK->callingCall, LINK->receivingCall,
LINK->Sent, LINK->SentAfterCompression, ((LINK->Sent - LINK->SentAfterCompression) * 100) / LINK->Sent,
LINK->Received, LINK->ReceivedAfterExpansion, ((LINK->ReceivedAfterExpansion - LINK->Received) * 100) / LINK->Received);
}
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK)
{
LINK->ConnectTime = time(NULL);
LINK->bytesTXed = LINK->bytesRXed = 0;
strcpy(LINK->callingCall, ourcall);
strcpy(LINK->receivingCall, remotecall);
strcpy(LINK->Direction, "Out");
}
void hookL4SessionAttempt(struct STREAMINFO * STREAM, char * remotecall, char * ourcall)
{
// Outgoing Connect
STREAM->ConnectTime = time(NULL);
STREAM->bytesTXed = STREAM->bytesRXed = 0;
strcpy(STREAM->callingCall, ourcall);
strcpy(STREAM->receivingCall, remotecall);
strcpy(STREAM->Direction, "Out");
}
void hookL4SessionAccepted(struct STREAMINFO * STREAM, char * remotecall, char * ourcall)
{
// Incoming Connect
STREAM->ConnectTime = time(NULL);
STREAM->bytesTXed = STREAM->bytesRXed = 0;
strcpy(STREAM->callingCall, remotecall);
strcpy(STREAM->receivingCall, ourcall);
strcpy(STREAM->Direction, "In");
}
void hookL4SessionDeleted(struct TNCINFO * TNC, struct STREAMINFO * STREAM)
{
char Msg[256];
char timestamp[16];
if (STREAM->ConnectTime)
{
time_t sessionTime = time(NULL) - STREAM->ConnectTime;
double avBytesRXed = STREAM->bytesRXed / (sessionTime / 60.0);
double avBytesSent = STREAM->bytesTXed / (sessionTime / 60.0);
time_t Now = time(NULL);
struct tm * TM = localtime(&Now);
sprintf(timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
if (sessionTime == 0)
sessionTime = 1; // Or will get divide by zero error
sprintf(Msg, "{\"mode\": \"%s\", \"direction\": \"%s\", \"port\": %d, \"callfrom\": \"%s\", \"callto\": \"%s\", \"time\": %d, \"bytesSent\": %d,"
"\"BPMSent\": %4.2f, \"BytesReceived\": %d, \"BPMReceived\": %4.2f, \"timestamp\": \"%s\"}",
Modenames[TNC->Hardware - 1], STREAM->Direction, TNC->Port, STREAM->callingCall, STREAM->receivingCall, sessionTime,
STREAM->bytesTXed, avBytesSent, STREAM->bytesRXed, avBytesRXed, timestamp);
if (MQTT)
MQTTReportSession(Msg);
STREAM->ConnectTime = 0;
}
}

View File

@ -23,9 +23,15 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress); #define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __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);
void MQTTMessageEvent(void* message);
int MaxRXSize = 99999; int MaxRXSize = 99999;
int MaxTXSize = 99999; int MaxTXSize = 99999;
@ -37,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
@ -807,6 +937,11 @@ VOID FlagSentMessages(CIRCUIT * conn, struct UserInfo * user)
FBBHeader->FwdMsg->datechanged=time(NULL); FBBHeader->FwdMsg->datechanged=time(NULL);
} }
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(FBBHeader->FwdMsg);
#endif
FBBHeader->FwdMsg->Locked = 0; // Unlock FBBHeader->FwdMsg->Locked = 0; // Unlock
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
} }
@ -976,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;
@ -1010,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();
} }
} }
@ -1137,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
} }
@ -1836,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;
@ -1860,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;
@ -1886,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);
@ -1909,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);
} }
} }

View File

@ -23,7 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
@ -65,12 +65,12 @@ extern int (WINAPI FAR *GetModuleFileNameExPtr)();
; ;
int SemHeldByAPI; int SemHeldByAPI;
static void ConnecttoFLDigiThread(void * portptr); void ConnecttoFLDigiThread(void * portptr);
void CreateMHWindow(); void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
static int ConnecttoFLDigi(); int ConnecttoFLDigi(int port);
static int ProcessReceivedData(int bpqport); static int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port); static int ProcessLine(char * buf, int Port);
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
@ -93,6 +93,7 @@ VOID CheckFLDigiData(struct TNCINFO * TNC);
VOID SendPacket(struct TNCINFO * TNC, UCHAR * Msg, int MsgLen); VOID SendPacket(struct TNCINFO * TNC, UCHAR * Msg, int MsgLen);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char ParamType); VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char ParamType);
VOID SendXMLCommandInt(struct TNCINFO * TNC, char * Command, int Value, char ParamType);
VOID FLSlowTimer(struct TNCINFO * TNC); VOID FLSlowTimer(struct TNCINFO * TNC);
VOID SendKISSCommand(struct TNCINFO * TNC, char * Msg); VOID SendKISSCommand(struct TNCINFO * TNC, char * Msg);
@ -101,8 +102,6 @@ VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC); VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
char * strlop(char * buf, char delim);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
#define MAXMPSKPORTS 16 #define MAXMPSKPORTS 16
@ -539,8 +538,12 @@ 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]))
{ {
} }
@ -592,7 +595,7 @@ pollloop:
} }
else else
{ {
SendXMLCommand(TNC, "modem.set_carrier", (char *)atoi(&buff->L2DATA[5]), 'I'); SendXMLCommandInt(TNC, "modem.set_carrier", atoi(&buff->L2DATA[5]), 'I');
} }
TNC->InternalCmd = TRUE; TNC->InternalCmd = TRUE;
@ -1181,7 +1184,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)
@ -1212,7 +1214,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;
@ -1482,14 +1484,14 @@ static int ProcessLine(char * buf, int Port)
return (TRUE); return (TRUE);
} }
static int ConnecttoFLDigi(int port) int ConnecttoFLDigi(int port)
{ {
_beginthread(ConnecttoFLDigiThread, 0, (void *)(size_t)port); _beginthread(ConnecttoFLDigiThread, 0, (void *)(size_t)port);
return 0; return 0;
} }
static VOID ConnecttoFLDigiThread(void * portptr) VOID ConnecttoFLDigiThread(void * portptr)
{ {
int port = (int)(size_t)portptr; int port = (int)(size_t)portptr;
char Msg[255]; char Msg[255];
@ -1637,7 +1639,7 @@ static VOID ConnecttoFLDigiThread(void * portptr)
VOID UpdateStatsLine(struct TNCINFO * TNC, struct STREAMINFO * STREAM) VOID UpdateStatsLine(struct TNCINFO * TNC, struct STREAMINFO * STREAM)
{ {
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d Resent %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d Resent %d Queued %d",
STREAM->BytesRXed, STREAM->BytesTXed, STREAM->BytesAcked, STREAM->BytesResent, STREAM->BytesOutstanding); STREAM->bytesRXed, STREAM->bytesTXed, STREAM->BytesAcked, STREAM->BytesResent, STREAM->BytesOutstanding);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
@ -2531,7 +2533,7 @@ VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, char Channe
strcpy(STREAM->MyCall, call2); strcpy(STREAM->MyCall, call2);
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
if (TNC->RIG && TNC->RIG != &TNC->DummyRig && strcmp(TNC->RIG->RigName, "PTT")) if (TNC->RIG && TNC->RIG != &TNC->DummyRig && strcmp(TNC->RIG->RigName, "PTT"))
{ {
@ -2580,7 +2582,7 @@ VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, char Channe
{ {
char AppName[13]; char AppName[13];
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// Make sure app is available // Make sure app is available
@ -2690,7 +2692,7 @@ AckConnectRequest:
goto SendKReply; // Repeated ACK goto SendKReply; // Repeated ACK
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->Connected = TRUE; STREAM->Connected = TRUE;
ARQ->ARQTimerState = 0; ARQ->ARQTimerState = 0;
@ -2951,22 +2953,7 @@ SendKReply:
if (STREAM->Connected) if (STREAM->Connected)
{ {
// Create a traffic record hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
} }
STREAM->Connecting = FALSE; STREAM->Connecting = FALSE;
@ -3029,7 +3016,7 @@ SendKReply:
buffptr->Len = Len; buffptr->Len = Len;
memcpy(buffptr->Data, &Input[1], Len); memcpy(buffptr->Data, &Input[1], Len);
STREAM->BytesRXed += Len; STREAM->bytesRXed += Len;
UpdateStatsLine(TNC, STREAM); UpdateStatsLine(TNC, STREAM);
@ -3146,7 +3133,7 @@ VOID SendARQData(struct TNCINFO * TNC, PMSGWITHLEN Buffer)
ARQ->TXHOLDQ[ARQ->TXSeq] = Buffer; ARQ->TXHOLDQ[ARQ->TXSeq] = Buffer;
STREAM->BytesTXed += Origlen; STREAM->bytesTXed += Origlen;
UpdateStatsLine(TNC, STREAM); UpdateStatsLine(TNC, STREAM);
@ -3212,7 +3199,7 @@ VOID FLReleaseTNC(struct TNCINFO * TNC)
else else
{ {
SendXMLCommand(TNC, "modem.set_by_name", TNC->FLInfo->DefaultMode, 'S'); SendXMLCommand(TNC, "modem.set_by_name", TNC->FLInfo->DefaultMode, 'S');
SendXMLCommand(TNC, "modem.set_carrier", (char *)TNC->FLInfo->DefaultFreq, 'I'); SendXMLCommandInt(TNC, "modem.set_carrier", TNC->FLInfo->DefaultFreq, 'I');
} }
} }
// Start Scanner // Start Scanner
@ -3910,6 +3897,27 @@ VOID SendXMLCommand(struct TNCINFO * TNC, char * Command, char * Value, char Par
return; return;
} }
VOID SendXMLCommandInt(struct TNCINFO * TNC, char * Command, int Value, char ParamType)
{
int Len;
char ReqBuf[512];
char SendBuff[512];
struct FLINFO * FL = TNC->FLInfo;
struct ARQINFO * ARQ = TNC->ARQInfo;
char ValueString[256] ="";
if (!TNC->CONNECTED || TNC->FLInfo->KISSMODE)
return;
sprintf(ValueString, "<params><param><value><i4>%d</i4></value></param></params\r\n>", Value);
strcpy(FL->LastXML, Command);
Len = sprintf(ReqBuf, Req, FL->LastXML, ValueString);
Len = sprintf(SendBuff, MsgHddr, Len, ReqBuf);
send(TNC->TCPSock, SendBuff, Len, 0);
return;
}
VOID SendXMLPoll(struct TNCINFO * TNC) VOID SendXMLPoll(struct TNCINFO * TNC)
{ {
int Len; int Len;

60
FormatHTML.cpp Normal file
View File

@ -0,0 +1,60 @@
// FormatHTML.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
int main () {
FILE *fp, *fp2;
char str[256];
char newstr[256];
char * ptr, * inptr;
/* opening file for reading */
fp = fopen("D:/AtomProject/test.html" , "r");
fp2 = fopen("D:/AtomProject/test.html.c" , "w");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
while(fgets (str, 256, fp) != NULL)
{
// Replace any " with \" and add " on front and \r\n" on end
char c;
ptr = newstr;
inptr = str;
c = *(inptr++);
*(ptr++) = '"';
while (c && c != 10)
{
if (c == '"')
*(ptr++) = '\\';
*(ptr++) = c;
c = *(inptr++);
}
*(ptr++) = '\\';
*(ptr++) = 'r';
*(ptr++) = '\\';
*(ptr++) = 'n';
*(ptr++) = '"';
*(ptr++) = 10;
*(ptr++) = 0;
puts(newstr);
fputs(newstr, fp2);
}
fclose(fp);
fclose(fp2);
return(0);
}

View File

@ -32,7 +32,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "tncinfo.h" #include "tncinfo.h"
@ -347,41 +347,6 @@ loop:
return 1; return 1;
} }
BOOL FreeDataReadConfigFile(int Port, int ProcLine())
{
char buf[256],errbuf[256];
Config = PortConfig[Port];
if (Config)
{
// Using config from bpq32.cfg
if (strlen(Config) == 0)
{
return TRUE;
}
ptr1 = Config;
ptr2 = strchr(ptr1, 13);
if (!ProcLine(buf, Port))
{
WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf);
}
}
else
{
sprintf(buf," ** Error - No Configuration info in bpq32.cfg");
WritetoConsoleLocal(buf);
}
return (TRUE);
}
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC); VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC); VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
@ -487,6 +452,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);
}
} }
@ -686,8 +656,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (buffptr == 0) return (0); // No buffers, so ignore if (buffptr == 0) return (0); // No buffers, so ignore
buffptr->Len = 36; buffptr->Len = sprintf(&buffptr->Data[0], "No Connection to TNC\r");
memcpy(&buffptr->Data[0], "No Connection to TNC\r", 36);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
@ -776,7 +745,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]))
{ {
@ -868,7 +840,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
char Message[256]; char Message[256];
int Len, ret; int Len, ret;
Len = sprintf(Message, TXF); Len = sprintf(Message, "%s", TXF);
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0); ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
if (buffptr) if (buffptr)
@ -972,7 +944,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
memset(STREAM->RemoteCall, 0, 10); memset(STREAM->RemoteCall, 0, 10);
strcpy(STREAM->RemoteCall, &buff->L2DATA[2]); strcpy(STREAM->RemoteCall, &buff->L2DATA[2]);
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s", STREAM->MyCall, STREAM->RemoteCall); sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s", STREAM->MyCall, STREAM->RemoteCall);
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE); MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
@ -1429,14 +1401,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);
@ -1882,7 +1854,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
if (App < 32) if (App < 32)
{ {
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// if SendTandRtoRelay set and Appl is RMS change to RELAY // if SendTandRtoRelay set and Appl is RMS change to RELAY
@ -1951,7 +1923,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE); MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->Connected = TRUE; STREAM->Connected = TRUE;
// Send Connect ACK // Send Connect ACK
@ -2020,20 +1992,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
{ {
// Create a traffic record // Create a traffic record
char logmsg[120]; hookL4SessionDeleted(TNC, STREAM);
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
} }
STREAM->Connected = FALSE; // Back to Command Mode STREAM->Connected = FALSE; // Back to Command Mode
@ -2063,7 +2022,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
WritetoTrace(TNC, Msg, 256); WritetoTrace(TNC, Msg, 256);
Len -= 256; Len -= 256;
Msg += 256; Msg += 256;
STREAM->BytesRXed += 256; STREAM->bytesRXed += 256;
} }
@ -2072,9 +2031,9 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
memcpy(buffptr->Data, Msg, Len); memcpy(buffptr->Data, Msg, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr); C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
WritetoTrace(TNC, Msg, Len); WritetoTrace(TNC, Msg, Len);
STREAM->BytesRXed += Len; STREAM->bytesRXed += Len;
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount); STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return; return;
@ -2256,7 +2215,7 @@ VOID FreeDataProcessNewConnect(struct TNCINFO * TNC, char * fromCall, char * toC
if (App < 32) if (App < 32)
{ {
memcpy(AppName, &ApplPtr[App * sizeof(CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
// if SendTandRtoRelay set and Appl is RMS change to RELAY // if SendTandRtoRelay set and Appl is RMS change to RELAY
@ -2327,7 +2286,7 @@ VOID FreeDataProcessNewConnect(struct TNCINFO * TNC, char * fromCall, char * toC
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE); MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->Connected = TRUE; STREAM->Connected = TRUE;
return; return;
@ -2427,7 +2386,7 @@ void FlushData(struct TNCINFO * TNC)
Info->toSendTimeout = 0; Info->toSendTimeout = 0;
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount); STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
@ -2450,10 +2409,10 @@ static int SendAsFile(struct TNCINFO * TNC, char * Call, char * Msg, int Len)
Info->toSendCount += Len; Info->toSendCount += Len;
Info->toSendTimeout = 10; // About a second Info->toSendTimeout = 10; // About a second
STREAM->BytesTXed += Len; STREAM->bytesTXed += Len;
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount); STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return Len; return Len;
@ -2490,7 +2449,7 @@ static void SendCQ(struct TNCINFO * TNC)
char Message[256]; char Message[256];
int Len, ret; int Len, ret;
Len = sprintf(Message, CQ); Len = sprintf(Message, "%s", CQ);
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0); ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
} }
@ -2505,7 +2464,7 @@ static void SendBeacon(struct TNCINFO * TNC, int Interval)
if (Interval > 0) if (Interval > 0)
Len = sprintf(Message, Template1, Interval); Len = sprintf(Message, Template1, Interval);
else else
Len = sprintf(Message, Template2); Len = sprintf(Message, "%s", Template2);
ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0); ret = send(TNC->TCPDataSock, (char *)&Message, Len, 0);
} }
@ -2720,7 +2679,7 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
WritetoTrace(TNC, Line, 256); WritetoTrace(TNC, Line, 256);
Len -= 256; Len -= 256;
Line += 256; Line += 256;
STREAM->BytesRXed += 256; STREAM->bytesRXed += 256;
} }
buffptr = GetBuff(); buffptr = GetBuff();
@ -2728,12 +2687,12 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
memcpy(buffptr->Data, Line, Len); memcpy(buffptr->Data, Line, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr); C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
WritetoTrace(TNC, Line, Len); WritetoTrace(TNC, Line, Len);
STREAM->BytesRXed += Len; STREAM->bytesRXed += Len;
} }
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount); STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
return; return;
@ -2812,7 +2771,7 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
WritetoTrace(TNC, Line, 256); WritetoTrace(TNC, Line, 256);
Len -= 256; Len -= 256;
TEXT += 256; TEXT += 256;
STREAM->BytesRXed += 256; STREAM->bytesRXed += 256;
} }
buffptr = GetBuff(); buffptr = GetBuff();
@ -2820,14 +2779,14 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
memcpy(buffptr->Data, Line, Len); memcpy(buffptr->Data, Line, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr); C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
WritetoTrace(TNC, Line, Len); WritetoTrace(TNC, Line, Len);
STREAM->BytesRXed += Len; STREAM->bytesRXed += Len;
TEXT = rest; TEXT = rest;
rest = strlop(TEXT, 10); // FreeData chat ues LF rest = strlop(TEXT, 10); // FreeData chat ues LF
} }
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d", sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount); STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
} }
@ -3159,22 +3118,8 @@ void ProcessTNCJSON(struct TNCINFO * TNC, char * Msg, int Len)
if (STREAM->Connected) if (STREAM->Connected)
{ {
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->Connected = FALSE; // Back to Command Mode STREAM->Connected = FALSE; // Back to Command Mode
STREAM->ReportDISC = TRUE; // Tell Node STREAM->ReportDISC = TRUE; // Tell Node
@ -3215,7 +3160,7 @@ void ProcessTNCJSON(struct TNCINFO * TNC, char * Msg, int Len)
} }
} }
else if (memcmp(ptr, "close", 12) == 0) else if (memcmp(ptr, "close", 5) == 0)
{ {
if (TNC->FreeDataInfo->arqstate != 4) if (TNC->FreeDataInfo->arqstate != 4)
{ {
@ -3352,20 +3297,7 @@ void ProcessTNCJSON(struct TNCINFO * TNC, char * Msg, int Len)
{ {
// Create a traffic record // Create a traffic record
char logmsg[120]; hookL4SessionDeleted(TNC, STREAM);
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->Connected = FALSE; // Back to Command Mode STREAM->Connected = FALSE; // Back to Command Mode
STREAM->ReportDISC = TRUE; // Tell Node STREAM->ReportDISC = TRUE; // Tell Node
@ -3723,7 +3655,7 @@ int FreeDataDisconnect(struct TNCINFO * TNC)
// return FreeDataSendCommand(TNC, "D"); // return FreeDataSendCommand(TNC, "D");
Len = sprintf(Msg, Disconnect); Len = sprintf(Msg, "%s", Disconnect);
return send(TNC->TCPDataSock, Msg, Len, 0); return send(TNC->TCPDataSock, Msg, Len, 0);
} }
@ -3735,7 +3667,7 @@ int FreeGetData(struct TNCINFO * TNC)
char Msg[128]; char Msg[128];
int Len; int Len;
Len = sprintf(Msg, GetData); Len = sprintf(Msg, "%s", GetData);
return send(TNC->TCPDataSock, Msg, Len, 0); return send(TNC->TCPDataSock, Msg, Len, 0);
} }
@ -4215,7 +4147,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");

View File

@ -11,13 +11,14 @@ void GetVersionInfo(char * File)
char isDebug[40]=""; char isDebug[40]="";
#ifdef SPECIALVERSION #ifdef SPECIALVERSION
strcat(isDebug, " ");
strcat(isDebug, SPECIALVERSION); strcat(isDebug, SPECIALVERSION);
#endif #endif
#ifdef _DEBUG #ifdef _DEBUG
strcat(isDebug, "Debug Build "); strcat(isDebug, " Debug Build");
#endif #endif
sprintf(VersionString,"%d.%d.%d.%d %s", Ver[0], Ver[1], Ver[2], Ver[3], isDebug); sprintf(VersionString,"%d.%d.%d.%d%s", Ver[0], Ver[1], Ver[2], Ver[3], isDebug);
sprintf(TextVerstring,"V%d.%d.%d.%d", Ver[0], Ver[1], Ver[2], Ver[3]); sprintf(TextVerstring,"V%d.%d.%d.%d", Ver[0], Ver[1], Ver[2], Ver[3]);

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -471,7 +471,7 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
int port; int port;
char * ptr; char * ptr;
int len; int len;
char Msg[80]; char Msg[512];
#ifndef LINBPQ #ifndef LINBPQ
HWND x; HWND x;
#endif #endif
@ -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)
{ {
@ -548,7 +548,7 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
TNC->WebWinX = 510; TNC->WebWinX = 510;
TNC->WebWinY = 280; TNC->WebWinY = 280;
TNC->WEB_COMMSSTATE = zalloc(100); TNC->WEB_COMMSSTATE = zalloc(512);
TNC->WEB_TNCSTATE = zalloc(100); TNC->WEB_TNCSTATE = zalloc(100);
strcpy(TNC->WEB_TNCSTATE, "Free"); strcpy(TNC->WEB_TNCSTATE, "Free");
TNC->WEB_MODE = zalloc(100); TNC->WEB_MODE = zalloc(100);
@ -749,7 +749,7 @@ VOID HALPoll(int Port)
STREAM->Attached = TRUE; STREAM->Attached = TRUE;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = 0;
calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, STREAM->MyCall); calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, STREAM->MyCall);
STREAM->MyCall[calllen] = 0; STREAM->MyCall[calllen] = 0;
@ -829,7 +829,7 @@ VOID HALPoll(int Port)
//for (Stream = 0; Stream <= MaxStreams; Stream++) //for (Stream = 0; Stream <= MaxStreams; Stream++)
{ {
if (TNC->TNCOK && STREAM->BPQtoPACTOR_Q && (STREAM->BytesTXed - STREAM->BytesAcked < 600)) if (TNC->TNCOK && STREAM->BPQtoPACTOR_Q && (STREAM->bytesTXed - STREAM->BytesAcked < 600))
{ {
int datalen; int datalen;
PMSGWITHLEN buffptr; PMSGWITHLEN buffptr;
@ -872,7 +872,7 @@ VOID HALPoll(int Port)
ReleaseBuffer(buffptr); ReleaseBuffer(buffptr);
WriteLogLine(2, MsgPtr, datalen); WriteLogLine(2, MsgPtr, datalen);
STREAM->BytesTXed += datalen; STREAM->bytesTXed += datalen;
STREAM->FramesQueued--; STREAM->FramesQueued--;
ShowTraffic(TNC); ShowTraffic(TNC);
@ -1090,10 +1090,10 @@ VOID ProcessHALData(struct TNCINFO * TNC)
STREAM->BytesAcked += Len; STREAM->BytesAcked += Len;
// Debugprintf("Acked %d", Len); // Debugprintf("Acked %d", Len);
if (STREAM->BytesAcked > STREAM->BytesTXed) if (STREAM->BytesAcked > STREAM->bytesTXed)
Debugprintf("Too Much Acked"); Debugprintf("Too Much Acked");
if ((STREAM->BPQtoPACTOR_Q == 0) && STREAM->BytesAcked >= STREAM->BytesTXed) if ((STREAM->BPQtoPACTOR_Q == 0) && STREAM->BytesAcked >= STREAM->bytesTXed)
{ {
// All sent // All sent
@ -1121,7 +1121,7 @@ VOID ProcessHALData(struct TNCINFO * TNC)
WriteLogLine(1, TNC->DataBuffer, Len); WriteLogLine(1, TNC->DataBuffer, Len);
STREAM->BytesRXed += Len; STREAM->bytesRXed += Len;
memcpy(buffptr->Data, TNC->DataBuffer, Len); memcpy(buffptr->Data, TNC->DataBuffer, Len);
@ -1756,7 +1756,7 @@ BOOL HALConnected(struct TNCINFO * TNC, char * Call)
strcpy(CallCopy, Call); strcpy(CallCopy, Call);
strcat(CallCopy, " "); // Some routines expect 10 char calls strcat(CallCopy, " "); // Some routines expect 10 char calls
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = 0;
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
// Stop Scanner // Stop Scanner
@ -1804,7 +1804,7 @@ BOOL HALConnected(struct TNCINFO * TNC, char * Call)
EncodeAndSend(TNC, CTEXTMSG, CTEXTLEN); EncodeAndSend(TNC, CTEXTMSG, CTEXTLEN);
WriteLogLine(2, CTEXTMSG, CTEXTLEN); WriteLogLine(2, CTEXTMSG, CTEXTLEN);
STREAM->BytesTXed += CTEXTLEN; STREAM->bytesTXed += CTEXTLEN;
} }
return TRUE; return TRUE;
} }

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "kernelresource.h" #include "kernelresource.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#ifndef LINBPQ #ifndef LINBPQ
#include <commctrl.h> #include <commctrl.h>
@ -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;
@ -1602,7 +1603,7 @@ VOID ShowTraffic(struct TNCINFO * TNC)
char Status[80]; char Status[80];
sprintf(Status, "RX %d TX %d ACKED %d ", sprintf(Status, "RX %d TX %d ACKED %d ",
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked); TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
#ifndef LINBPQ #ifndef LINBPQ
SetDlgItemText(TNC->hDlg, IDC_TRAFFIC, Status); SetDlgItemText(TNC->hDlg, IDC_TRAFFIC, Status);
#endif #endif
@ -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)
@ -1876,6 +1874,8 @@ int standardParams(struct TNCINFO * TNC, char * buf)
TNC->WL2K = DecodeWL2KReportLine(buf); TNC->WL2K = DecodeWL2KReportLine(buf);
else if (_memicmp(buf, "SESSIONTIMELIMIT", 16) == 0) else if (_memicmp(buf, "SESSIONTIMELIMIT", 16) == 0)
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit = atoi(&buf[17]) * 60; TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit = atoi(&buf[17]) * 60;
else if (_memicmp(buf, "ATTACHTIMELIMIT", 15) == 0)
TNC->AttachTimeLimit = atoi(&buf[16]) * 60;
else if (_memicmp(buf, "BUSYHOLD", 8) == 0) // Hold Time for Busy Detect else if (_memicmp(buf, "BUSYHOLD", 8) == 0) // Hold Time for Busy Detect
TNC->BusyHold = atoi(&buf[8]); TNC->BusyHold = atoi(&buf[8]);
else if (_memicmp(buf, "BUSYWAIT", 8) == 0) // Wait time before failing connect if busy else if (_memicmp(buf, "BUSYWAIT", 8) == 0) // Wait time before failing connect if busy
@ -1914,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)
{ {

View File

@ -33,7 +33,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#endif #endif
#include "CHeaders.h" #include "cheaders.h"
#pragma pack(1) #pragma pack(1)
@ -309,47 +309,10 @@ loop:
return 1; return 1;
} }
BOOL HSMODEMReadConfigFile(int Port, int ProcLine())
{
char buf[256],errbuf[256];
Config = PortConfig[Port];
if (Config)
{
// Using config from bpq32.cfg
if (strlen(Config) == 0)
{
return TRUE;
}
ptr1 = Config;
ptr2 = strchr(ptr1, 13);
if (!ProcLine(buf, Port))
{
WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf);
}
}
else
{
sprintf(buf," ** Error - No Configuration info in bpq32.cfg");
WritetoConsoleLocal(buf);
}
return (TRUE);
}
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC); VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC); VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
static time_t ltime; static time_t ltime;
@ -589,7 +552,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
UCHAR * data = &buffptr->Data[0]; UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--; STREAM->FramesQueued--;
txlen = (int)buffptr->Len; txlen = (int)buffptr->Len;
STREAM->BytesTXed += txlen; STREAM->bytesTXed += txlen;
bytes=HSMODEMSendData(TNC, data, txlen); bytes=HSMODEMSendData(TNC, data, txlen);
WritetoTrace(TNC, data, txlen); WritetoTrace(TNC, data, txlen);
@ -639,8 +602,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (buffptr == 0) return (0); // No buffers, so ignore if (buffptr == 0) return (0); // No buffers, so ignore
buffptr->Len = 36; buffptr->Len = 21;
memcpy(&buffptr->Data[0], "No Connection to TNC\r", 36); memcpy(&buffptr->Data[0], "No Connection to TNC\r", 21);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
@ -668,7 +631,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
bytes=HSMODEMSendData(TNC, TXMsg, txlen); bytes=HSMODEMSendData(TNC, TXMsg, txlen);
TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response
STREAM->BytesTXed += bytes; STREAM->bytesTXed += bytes;
// WritetoTrace(TNC, &buff->L2DATA[0], txlen); // WritetoTrace(TNC, &buff->L2DATA[0], txlen);
return 1; return 1;
@ -685,8 +648,12 @@ 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]))
{ {
} }
@ -1214,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

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
#include "CHeaders.h" #include "cheaders.h"
#include "templatedefs.c" // Inline definitions from HTLMPages #include "templatedefs.c" // Inline definitions from HTLMPages

View File

@ -24,7 +24,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define DllImport #define DllImport
#include "CHeaders.h" #include "cheaders.h"
#include <stdlib.h> #include <stdlib.h>
#include "tncinfo.h" #include "tncinfo.h"
@ -38,7 +38,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define ZEXPORT __stdcall #define ZEXPORT __stdcall
#endif #endif
#include "zlib.h" #include <zlib.h>
#define CKernel #define CKernel
#include "httpconnectioninfo.h" #include "httpconnectioninfo.h"
@ -69,6 +69,10 @@ int GetAPRSIcon(unsigned char * _REPLYBUFFER, char * NodeURL);
char * GetStandardPage(char * FN, int * Len); char * GetStandardPage(char * FN, int * Len);
BOOL SHA1PasswordHash(char * String, char * Hash); BOOL SHA1PasswordHash(char * String, char * Hash);
char * byte_base64_encode(char *str, int len); char * byte_base64_encode(char *str, int len);
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
int 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;
@ -101,16 +105,20 @@ extern int NumberofPorts;
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
char * strlop(char * buf, char delim); 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);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen); 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 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);
int SetupNodeMenu(char * Buff, int SYSOP); int SetupNodeMenu(char * Buff, int SYSOP);
int StatusProc(char * Buff); int StatusProc(char * Buff);
int ProcessMailSignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL); int ProcessMailSignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL);
int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL);
int ProcessChatSignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, int LOCAL); int ProcessChatSignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, int LOCAL);
VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE); VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE);
@ -141,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>"
@ -599,7 +607,8 @@ VOID HTTPTimer()
for (n = Last;;) for (n = Last;;)
{ {
strcat(_REPLYBUFFER, Session->ScreenLines[n]); if ((strlen(Session->ScreenLines[n]) + strlen(_REPLYBUFFER)) < 99999)
strcat(_REPLYBUFFER, Session->ScreenLines[n]);
if (n == 99) if (n == 99)
n = -1; n = -1;
@ -679,13 +688,15 @@ struct HTTPConnectionInfo * FindSession(char * Key)
void ProcessTermInput(SOCKET sock, char * MsgPtr, int MsgLen, char * Key) void ProcessTermInput(SOCKET sock, char * MsgPtr, int MsgLen, char * Key)
{ {
char _REPLYBUFFER[1024]; char _REPLYBUFFER[2048];
int ReplyLen; int ReplyLen;
char Header[256]; char Header[256];
int HeaderLen; int HeaderLen;
int State; int State;
struct HTTPConnectionInfo * Session = FindSession(Key); struct HTTPConnectionInfo * Session = FindSession(Key);
int Stream; int Stream;
int maxlen = 1000;
if (Session == NULL) if (Session == NULL)
{ {
@ -700,12 +711,24 @@ void ProcessTermInput(SOCKET sock, char * MsgPtr, int MsgLen, char * Key)
char c; char c;
UCHAR hex; UCHAR hex;
int msglen = end - input;
struct TNCINFO * TNC = Session->TNC; struct TNCINFO * TNC = Session->TNC;
struct TCPINFO * TCP = 0; struct TCPINFO * TCP = 0;
if (TNC) if (TNC)
TCP = TNC->TCPInfo; TCP = TNC->TCPInfo;
if (TCP && TCP->WebTermCSS)
maxlen -= strlen(TCP->WebTermCSS);
if (MsgLen > maxlen)
{
Session->KillTimer = 99999; // close session
return;
}
if (TCP && TCP->WebTermCSS) if (TCP && TCP->WebTermCSS)
ReplyLen = sprintf(_REPLYBUFFER, InputLine, Key, TCP->WebTermCSS); ReplyLen = sprintf(_REPLYBUFFER, InputLine, Key, TCP->WebTermCSS);
else else
@ -1150,6 +1173,9 @@ int SendMessageFile(SOCKET sock, char * FN, BOOL OnlyifExists, int allowDeflate)
if (_stricmp(ptr, "js") == 0) if (_stricmp(ptr, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n"); strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ptr, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ptr, "pdf") == 0) if (_stricmp(ptr, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n"); strcpy(Type, "Content-Type: application/pdf\r\n");
@ -1164,7 +1190,8 @@ int SendMessageFile(SOCKET sock, char * FN, BOOL OnlyifExists, int allowDeflate)
Compressed = MsgBytes; Compressed = MsgBytes;
} }
if (_stricmp(ptr, "jpg") == 0 || _stricmp(ptr, "jpeg") == 0 || _stricmp(ptr, "png") == 0 || _stricmp(ptr, "gif") == 0 || _stricmp(ptr, "ico") == 0) if (_stricmp(ptr, "jpg") == 0 || _stricmp(ptr, "jpeg") == 0 || _stricmp(ptr, "png") == 0 ||
_stricmp(ptr, "gif") == 0 || _stricmp(ptr, "bmp") == 0 || _stricmp(ptr, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n"); strcpy(Type, "Content-Type: image\r\n");
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n" HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
@ -1593,7 +1620,7 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
char * Compressed = 0; char * Compressed = 0;
char * HostPtr = 0; char * HostPtr = 0;
char * Context, * Method, * NodeURL, * Key; char * Context, * Method, * NodeURL = 0, * Key;
char _REPLYBUFFER[250000]; char _REPLYBUFFER[250000];
char Reply[250000]; char Reply[250000];
@ -1607,23 +1634,23 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
char * WebSock = 0; char * WebSock = 0;
char PortsHddr[] = "<h2 align=center>Ports</h2><table align=center border=2 bgcolor=white>" char PortsHddr[] = "<h2 align=center>Ports</h2><table align=center border=2 bgcolor=white>"
"<tr><th>Port</th><th>Driver</th><th>ID</th><th>Beacons</th><th>Driver Window</th></tr>"; "<tr><th>Port</th><th>Driver</th><th>ID</th><th>Beacons</th><th>Driver Window</th><th>Stats Graph</th></tr>";
char PortLine[] = "<tr><td>%d</td><td><a href=PortStats?%d&%s>&nbsp;%s</a></td><td>%s</td></tr>"; // char PortLine[] = "<tr><td>%d</td><td><a href=PortStats?%d&%s>&nbsp;%s</a></td><td>%s</td></tr>";
char PortLineWithBeacon[] = "<tr><td>%d</td><td><a href=PortStats?%d&%s>&nbsp;%s</a></td><td>%s</td>" char PortLineWithBeacon[] = "<tr><td>%d</td><td><a href=PortStats?%d&%s>&nbsp;%s</a></td><td>%s</td>"
"<td><a href=PortBeacons?%d>&nbsp;Beacons</a><td> </td></td></tr>\r\n"; "<td><a href=PortBeacons?%d>&nbsp;Beacons</a><td> </td></td><td>%s</td></tr>\r\n";
char SessionPortLine[] = "<tr><td>%d</td><td>%s</td><td>%s</td><td> </td>" char SessionPortLine[] = "<tr><td>%d</td><td>%s</td><td>%s</td><td> </td>"
"<td> </td></tr>\r\n"; "<td> </td><td>%s</td></tr>\r\n";
char PortLineWithDriver[] = "<tr><td>%d</td><td>%s</td><td>%s</td><td> </td>" char PortLineWithDriver[] = "<tr><td>%d</td><td>%s</td><td>%s</td><td> </td>"
"<td><a href=\"javascript:dev_win('/Node/Port?%d',%d,%d,%d,%d);\">Driver Window</a></td></tr>\r\n"; "<td><a href=\"javascript:dev_win('/Node/Port?%d',%d,%d,%d,%d);\">Driver Window</a></td><td>%s</td></tr>\r\n";
char PortLineWithBeaconAndDriver[] = "<tr><td>%d</td><td>%s</td><td>%s</td>" char PortLineWithBeaconAndDriver[] = "<tr><td>%d</td><td>%s</td><td>%s</td>"
"<td><a href=PortBeacons?%d>&nbsp;Beacons</a></td>" "<td><a href=PortBeacons?%d>&nbsp;Beacons</a></td>"
"<td><a href=\"javascript:dev_win('/Node/Port?%d',%d,%d,%d,%d);\">Driver Window</a></td></tr>\r\n"; "<td><a href=\"javascript:dev_win('/Node/Port?%d',%d,%d,%d,%d);\">Driver Window</a></td><td>%s</td></tr>\r\n";
char RigControlLine[] = "<tr><td>%d</td><td>%s</td><td>%s</td><td> </td>" char RigControlLine[] = "<tr><td>%d</td><td>%s</td><td>%s</td><td> </td>"
"<td><a href=\"javascript:dev_win('/Node/RigControl.html',%d,%d,%d,%d);\">Rig Control</a></td></tr>\r\n"; "<td><a href=\"javascript:dev_win('/Node/RigControl.html',%d,%d,%d,%d);\">Rig Control</a></td></tr>\r\n";
@ -1631,7 +1658,7 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
char Encoding[] = "Content-Encoding: deflate\r\n"; char Encoding[] = "Content-Encoding: deflate\r\n";
#ifdef WIN32 #ifdef WIN32xx
struct _EXCEPTION_POINTERS exinfo; struct _EXCEPTION_POINTERS exinfo;
strcpy(EXCEPTMSG, "ProcessHTTPMessage"); strcpy(EXCEPTMSG, "ProcessHTTPMessage");
@ -1772,6 +1799,103 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
strlop(Mycall, ' '); strlop(Mycall, ' ');
// Look for API messages
if (_memicmp(Context, "/api/", 5) == 0 || _stricmp(Context, "/api") == 0)
{
char * Compressed;
// if for mail api process signon here and rearrange url from
// api/v1/mail to mail/api/v1 so it goes to mail handler later
if (_memicmp(Context, "/api/v1/mail/", 13) == 0)
{
memcpy(MsgPtr, "GET /mail/api/v1/", 17);
if (memcmp(&Context[13], "login", 5) == 0)
{
ReplyLen = ProcessMailAPISignon(TCP, MsgPtr, "M", Reply, &Session, FALSE, LOCAL);
memcpy(MsgPtr, "GET /mail/api/v1/", 17);
if (ReplyLen) // Error message
goto Returnit;
}
memcpy(Context, "/mail/api/v1/", 13);
goto doHeader;
}
else
{
ReplyLen = APIProcessHTTPMessage(_REPLYBUFFER, Method, Context, MsgPtr, LOCAL, COOKIE);
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{
// Full Message - just send it
sendandcheck(sock, _REPLYBUFFER, ReplyLen);
return 0;
}
if (allowDeflate)
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
else
Compressed = _REPLYBUFFER;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\n"
"Content-Length: %d\r\n"
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"Access-Control-Allow-Origin: *\r\n"
"%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
if (allowDeflate)
free (Compressed);
return 0;
}
}
if (_memicmp(Context, "/rhp/", 5) == 0 || _stricmp(Context, "/rhp") == 0)
{
{
ReplyLen = RHPProcessHTTPMessage(conn, _REPLYBUFFER, Method, Context, MsgPtr, LOCAL, COOKIE);
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{
// Full Message - just send it
sendandcheck(sock, _REPLYBUFFER, ReplyLen);
return 0;
}
if (allowDeflate)
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
else
Compressed = _REPLYBUFFER;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\n"
"Content-Length: %d\r\n"
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"Access-Control-Allow-Origin: *\r\n"
"%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
if (allowDeflate)
free (Compressed);
return 0;
}
}
// APRS process internally // APRS process internally
if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0) if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0)
@ -1874,7 +1998,8 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
Session = FindSession(Key); Session = FindSession(Key);
if (Session == NULL)
if (Session == NULL && _memicmp(Context, "/Mail/API/", 10) != 0)
{ {
ReplyLen = sprintf(Reply, MailLostSession, Key); ReplyLen = sprintf(Reply, MailLostSession, Key);
RLen = ReplyLen; RLen = ReplyLen;
@ -2025,10 +2150,13 @@ Returnit:
return 0; return 0;
} }
// Add tail if (NodeURL && _memicmp(NodeURL, "/mail/api/", 10) != 0)
{
// Add tail
strcpy(&Reply[ReplyLen], Tail); strcpy(&Reply[ReplyLen], Tail);
ReplyLen += strlen(Tail); ReplyLen += strlen(Tail);
}
// compress if allowed // compress if allowed
@ -2037,7 +2165,11 @@ Returnit:
else else
Compressed = Reply; Compressed = Reply;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n%s\r\n", ReplyLen, Encoding); if (NodeURL && _memicmp(NodeURL, "/mail/api/", 10) == 0)
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: application/json\r\nConnection: close\r\n%s\r\n", ReplyLen, Encoding);
else
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen); sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen); sendandcheck(sock, Compressed, ReplyLen);
@ -2057,15 +2189,82 @@ doHeader:
char _REPLYBUFFER[250000]; char _REPLYBUFFER[250000];
struct HTTPConnectionInfo Dummy = {0}; struct HTTPConnectionInfo Dummy = {0};
int Sent, Loops = 0; int Sent, Loops = 0;
char token[16] = "";
// look for auth header
const char * auth_header = "Authorization: Bearer ";
char * token_begin = strstr(MsgPtr, auth_header);
int Flags = 0, n;
char * Tok;
char * param;
if (token_begin)
{
// Using Auth Header
// Extract the token from the request (assuming it's present in the request headers)
token_begin += strlen(auth_header); // Move to the beginning of the token
strncpy(token, token_begin, 13);
token[13] = '\0'; // Null-terminate the token
}
ReplyLen = 0; ReplyLen = 0;
if (Session == 0) if (Session == 0)
Session = &Dummy; Session = &Dummy;
Session->TNC = (void *)LOCAL; // TNC only used for Web Terminal Sessions if (LOCAL)
Session->TNC = (void *)1; // TNC only used for Web Terminal Sessions
else
Session->TNC = (void *)0;
ProcessMailHTTPMessage(Session, Method, Context, MsgPtr, _REPLYBUFFER, &ReplyLen, MsgLen); ProcessMailHTTPMessage(Session, Method, Context, MsgPtr, _REPLYBUFFER, &ReplyLen, MsgLen, token);
if (Context && _memicmp(Context, "/mail/api/", 10) == 0)
{
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{
// Full Header provided by appl - just send it
// Send may block
Sent = send(sock, _REPLYBUFFER, ReplyLen, 0);
while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
{
// Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);
if (Sent > 0) // something sent
{
InputLen -= Sent;
memmove(_REPLYBUFFER, &_REPLYBUFFER[Sent], ReplyLen);
}
Sleep(30);
Sent = send(sock, _REPLYBUFFER, ReplyLen, 0);
}
return 0;
}
// compress if allowed
if (allowDeflate)
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
else
Compressed = _REPLYBUFFER;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: application/json\r\nConnection: close\r\n%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
if (allowDeflate)
free (Compressed);
return 0;
}
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0) if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{ {
@ -2091,11 +2290,16 @@ doHeader:
return 0; return 0;
} }
if (Context && _memicmp(Context, "/mail/api/", 10) != 0)
{
// Add tail // Add tail
strcpy(&_REPLYBUFFER[ReplyLen], Tail); strcpy(&_REPLYBUFFER[ReplyLen], Tail);
ReplyLen += strlen(Tail); ReplyLen += strlen(Tail);
}
// compress if allowed // compress if allowed
if (allowDeflate) if (allowDeflate)
@ -2185,6 +2389,8 @@ doHeader:
// Pass to MailChat if active // Pass to MailChat if active
NodeURL = Context;
if ((_memicmp(Context, "/MAIL/", 6) == 0) || (_memicmp(Context, "/WebMail", 8) == 0)) if ((_memicmp(Context, "/MAIL/", 6) == 0) || (_memicmp(Context, "/WebMail", 8) == 0))
{ {
// If for Mail, Pass to Mail Server via Named Pipe // If for Mail, Pass to Mail Server via Named Pipe
@ -2212,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);
@ -2412,29 +2621,29 @@ doHeader:
return 1; return 1;
} }
GetParam(input, "Port", &Param[0]); GetParam(input, "Port=", &Param[0]);
Port = atoi(&Param[1]); Port = atoi(&Param[0]);
PORT = GetPortTableEntryFromPortNum(Port); // Need slot not number PORT = GetPortTableEntryFromPortNum(Port); // Need slot not number
if (PORT) if (PORT)
Slot = PORT->PortSlot; Slot = PORT->PortSlot;
GetParam(input, "Every", &Param[0]); GetParam(input, "Every=", &Param[0]);
Interval[Slot] = atoi(&Param[1]); Interval[Slot] = atoi(&Param[0]);
GetParam(input, "Dest", &Param[0]); GetParam(input, "Dest=", &Param[0]);
_strupr(Param); _strupr(Param);
strcpy(UIUIDEST[Slot], &Param[1]); strcpy(UIUIDEST[Slot], &Param[0]);
GetParam(input, "Path", &Param[0]); GetParam(input, "Path=", &Param[0]);
_strupr(Param); _strupr(Param);
if (UIUIDigi[Slot]) if (UIUIDigi[Slot])
free(UIUIDigi[Slot]); free(UIUIDigi[Slot]);
UIUIDigi[Slot] = _strdup(&Param[1]); UIUIDigi[Slot] = _strdup(&Param[0]);
GetParam(input, "File", &Param[0]); GetParam(input, "File=", &Param[0]);
strcpy(FN[Slot], &Param[1]); strcpy(FN[Slot], &Param[0]);
GetParam(input, "Text", &Param[0]); GetParam(input, "Text=", &Param[0]);
strcpy(Message[Slot], &Param[1]); strcpy(Message[Slot], &Param[0]);
MinCounter[Slot] = Interval[Slot]; MinCounter[Slot] = Interval[Slot];
@ -2642,6 +2851,53 @@ doHeader:
return 0; return 0;
} }
else if (_memicmp(NodeURL, "/portstats.txt", 15) == 0)
{
char * Compressed;
char * ptr;
int port;
struct PORTCONTROL * PORT;
ptr = &NodeURL[15];
port = atoi(ptr);
PORT = GetPortTableEntryFromPortNum(port);
ReplyLen = 0;
if (PORT && PORT->TX)
{
// We send the last 24 hours worth of data. Buffer is cyclic so oldest byte is at StatsPointer
int first = PORT->StatsPointer;
int firstlen = 1440 - first;
memcpy(&_REPLYBUFFER[0], &PORT->TX[first], firstlen);
memcpy(&_REPLYBUFFER[firstlen], PORT->TX, first);
memcpy(&_REPLYBUFFER[1440], &PORT->BUSY[first], firstlen);
memcpy(&_REPLYBUFFER[1440 + firstlen], PORT->BUSY, first);
ReplyLen = 2880;
}
if (allowDeflate)
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
else
Compressed = _REPLYBUFFER;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nAccess-Control-Allow-Origin: *\r\nContent-Length: %d\r\nContent-Type: Text\r\n%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
if (allowDeflate)
free (Compressed);
return 0;
}
else if (_memicmp(NodeURL, "/Icon", 5) == 0 && _memicmp(&NodeURL[10], ".png", 4) == 0) else if (_memicmp(NodeURL, "/Icon", 5) == 0 && _memicmp(&NodeURL[10], ".png", 4) == 0)
{ {
// APRS internal Icon // APRS internal Icon
@ -2815,7 +3071,7 @@ doHeader:
" {" " {"
" // The browser doesn't support WebSocket\r\n" " // The browser doesn't support WebSocket\r\n"
" const div = document.getElementById('div');\r\n" " const div = document.getElementById('div');\r\n"
" div.innerHTML = 'WebSocket not supported by your Browser - RigControl Page not availble'\r\n" " div.innerHTML = 'WebSocket not supported by your Browser - RigControl Page not availible'\r\n"
" }" " }"
"}" "}"
"function PTT(p)" "function PTT(p)"
@ -3170,6 +3426,7 @@ doHeader:
int count; int count;
char DLL[20]; char DLL[20];
char StatsURL[64];
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", PortsHddr); ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", PortsHddr);
@ -3178,6 +3435,13 @@ doHeader:
Port = GetPortTableEntryFromSlot(count); Port = GetPortTableEntryFromSlot(count);
ExtPort = (struct _EXTPORTDATA *)Port; ExtPort = (struct _EXTPORTDATA *)Port;
// see if has a stats page
if (Port->AVACTIVE)
sprintf(StatsURL, "<a href=/PortStats.html?%d>&nbsp;Stats Graph</a>", Port->PORTNUMBER);
else
StatsURL[0] = 0;
if (Port->PORTTYPE == 0x10) if (Port->PORTTYPE == 0x10)
{ {
strcpy(DLL, ExtPort->PORT_DLL_NAME); strcpy(DLL, ExtPort->PORT_DLL_NAME);
@ -3200,20 +3464,20 @@ doHeader:
{ {
if (Port->UICAPABLE) if (Port->UICAPABLE)
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], PortLineWithBeaconAndDriver, Port->PORTNUMBER, DLL, ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], PortLineWithBeaconAndDriver, Port->PORTNUMBER, DLL,
Port->PORTDESCRIPTION, Port->PORTNUMBER, Port->PORTNUMBER, Port->TNC->WebWinX, Port->TNC->WebWinY, 200, 200); Port->PORTDESCRIPTION, Port->PORTNUMBER, Port->PORTNUMBER, Port->TNC->WebWinX, Port->TNC->WebWinY, 200, 200, StatsURL);
else else
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], PortLineWithDriver, Port->PORTNUMBER, DLL, ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], PortLineWithDriver, Port->PORTNUMBER, DLL,
Port->PORTDESCRIPTION, Port->PORTNUMBER, Port->TNC->WebWinX, Port->TNC->WebWinY, 200, 200); Port->PORTDESCRIPTION, Port->PORTNUMBER, Port->TNC->WebWinX, Port->TNC->WebWinY, 200, 200, StatsURL);
continue; continue;
} }
if (Port->PORTTYPE == 16 && Port->PROTOCOL == 10 && Port->UICAPABLE == 0) // EXTERNAL, Pactor/WINMO if (Port->PORTTYPE == 16 && Port->PROTOCOL == 10 && Port->UICAPABLE == 0) // EXTERNAL, Pactor/WINMO
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], SessionPortLine, Port->PORTNUMBER, DLL, ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], SessionPortLine, Port->PORTNUMBER, DLL,
Port->PORTDESCRIPTION, Port->PORTNUMBER); Port->PORTDESCRIPTION, Port->PORTNUMBER, StatsURL);
else else
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], PortLineWithBeacon, Port->PORTNUMBER, Port->PORTNUMBER, ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], PortLineWithBeacon, Port->PORTNUMBER, Port->PORTNUMBER,
DLL, DLL, Port->PORTDESCRIPTION, Port->PORTNUMBER); DLL, DLL, Port->PORTDESCRIPTION, Port->PORTNUMBER, StatsURL);
} }
if (RigActive) if (RigActive)
@ -3534,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);
@ -3889,7 +4249,7 @@ SendResp:
} }
return 0; return 0;
#ifdef WIN32 #ifdef WIN32xx
} }
#include "StdExcept.c" #include "StdExcept.c"
} }
@ -4063,6 +4423,78 @@ int ProcessNodeSignon(SOCKET sock, struct TCPINFO * TCP, char * MsgPtr, char * A
return ReplyLen; return ReplyLen;
} }
int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL)
{
int ReplyLen = 0;
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
char * user, * password;
struct HTTPConnectionInfo * NewSession;
int i;
struct UserRec * USER;
if (strchr(MsgPtr, '?'))
{
// Check Password
user = strlop(MsgPtr, '?');
password = strlop(user, '&');
strlop(password, ' ');
for (i = 0; i < TCP->NumberofUsers; i++)
{
USER = TCP->UserRecPtr[i];
if (user && _stricmp(user, USER->UserName) == 0)
{
if ((strcmp(password, USER->Password) == 0) && (USER->Secure || WebMail))
{
// ok
NewSession = AllocateSession(Appl[0], 'M');
*Session = NewSession;
if (NewSession)
{
ReplyLen = 0;
strcpy(NewSession->Callsign, USER->Callsign);
}
else
{
ReplyLen = SetupNodeMenu(Reply, LOCAL);
ReplyLen += sprintf(&Reply[ReplyLen], "%s", BusyError);
}
return ReplyLen;
}
}
}
// Pass failed attempt to BBS code so it can try a bbs user login
// Need to put url back together
if (user && user[0] && password && password[0])
{
sprintf(&MsgPtr[strlen(MsgPtr)], "?%s&%s", user, password);
}
}
NewSession = AllocateSession(Appl[0], 'M');
*Session = NewSession;
if (NewSession)
ReplyLen = 0;
else
{
ReplyLen = SetupNodeMenu(Reply, LOCAL);
ReplyLen += sprintf(&Reply[ReplyLen], "%s", BusyError);
}
return ReplyLen;
}
@ -4846,6 +5278,3 @@ void SHA1PadMessage(SHA1Context *context)
} }

View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#ifdef LINBPQ #ifdef LINBPQ
#include "CHeaders.h" #include "cheaders.h"
#endif #endif
#include "bpqchat.h" #include "bpqchat.h"
@ -77,6 +77,8 @@ char PopupText[260] = "";
int PopupMode = 0; int PopupMode = 0;
int chatPaclen = 236; int chatPaclen = 236;
int reportChatEvents = 0;
char RtKnown[MAX_PATH] = "RTKnown.txt"; char RtKnown[MAX_PATH] = "RTKnown.txt";
char RtUsr[MAX_PATH] = "STUsers.txt"; char RtUsr[MAX_PATH] = "STUsers.txt";
char RtUsrTemp[MAX_PATH] = "STUsers.tmp"; char RtUsrTemp[MAX_PATH] = "STUsers.tmp";
@ -1184,7 +1186,7 @@ static BOOL CheckforDups(ChatCIRCUIT * circuit, char * Call, char * Msg)
// Duplicate, so discard, but save time // Duplicate, so discard, but save time
DupInfo[i].DupTime = Now; 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 return TRUE; // Duplicate
} }
@ -1858,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);
@ -2079,6 +2081,18 @@ void text_tellu_Joined(USER * user)
sprintf(buf, "%s%-6.6s : %s *** Joined Chat, Topic %s", Stamp, user->call, user->name, user->topic->name); sprintf(buf, "%s%-6.6s : %s *** Joined Chat, Topic %s", Stamp, user->call, user->name, user->topic->name);
if (reportChatEvents)
{
#ifdef WIN32
if (pRunEventProgram)
pRunEventProgram("ChatNewUser.exe", user->call);
#else
sprintf(prog, "%s/%s", BPQDirectory, "ChatNewUser");
RunEventProgram(prog, user->call);
#endif
}
// Send it to all connected users in the same topic. // Send it to all connected users in the same topic.
// Echo to originator if requested. // Echo to originator if requested.
@ -2109,14 +2123,6 @@ void text_tellu_Joined(USER * user)
nputc(circuit, 7); nputc(circuit, 7);
nputc(circuit, 13); nputc(circuit, 13);
#ifdef WIN32
if (pRunEventProgram)
pRunEventProgram("ChatNewUser.exe", user->call);
#else
sprintf(prog, "%s/%s", BPQDirectory, "ChatNewUser");
RunEventProgram(prog, user->call);
#endif
} }
} }
// Tell one link circuit about a local user change of topic. // Tell one link circuit about a local user change of topic.
@ -2815,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;
@ -2830,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);
@ -2867,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);
@ -2877,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);
@ -2901,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);
@ -3676,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;
@ -4170,11 +4176,12 @@ BOOL GetChatConfig(char * ConfigName)
ChatApplNum = GetIntValue(group, "ApplNum"); ChatApplNum = GetIntValue(group, "ApplNum");
MaxChatStreams = GetIntValue(group, "MaxStreams"); MaxChatStreams = GetIntValue(group, "MaxStreams");
reportChatEvents = GetIntValue(group, "reportChatEvents");
chatPaclen = GetIntValue(group, "chatPaclen"); chatPaclen = GetIntValue(group, "chatPaclen");
GetStringValue(group, "OtherChatNodes", OtherNodesList); GetStringValue(group, "OtherChatNodes", OtherNodesList, 1000);
GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg); GetStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg, 1000);
GetStringValue(group, "MapPosition", Position); GetStringValue(group, "MapPosition", Position, 81);
GetStringValue(group, "MapPopup", PopupText); GetStringValue(group, "MapPopup", PopupText, 260);
PopupMode = GetIntValue(group, "PopupMode"); PopupMode = GetIntValue(group, "PopupMode");
if (chatPaclen == 0) if (chatPaclen == 0)
@ -4201,6 +4208,7 @@ VOID SaveChatConfigFile(char * ConfigName)
SaveIntValue(group, "ApplNum", ChatApplNum); SaveIntValue(group, "ApplNum", ChatApplNum);
SaveIntValue(group, "MaxStreams", MaxChatStreams); SaveIntValue(group, "MaxStreams", MaxChatStreams);
SaveIntValue(group, "reportChatEvents", reportChatEvents);
SaveIntValue(group, "chatPaclen", chatPaclen); SaveIntValue(group, "chatPaclen", chatPaclen);
SaveStringValue(group, "OtherChatNodes", OtherNodesList); SaveStringValue(group, "OtherChatNodes", OtherNodesList);
SaveStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg); SaveStringValue(group, "ChatWelcomeMsg", ChatWelcomeMsg);

View File

@ -21,6 +21,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// //
// Housekeeping Module // Housekeeping Module
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#include "bpqmail.h" #include "bpqmail.h"
char * APIENTRY GetBPQDirectory(); char * APIENTRY GetBPQDirectory();
@ -343,12 +348,12 @@ VOID ExpireMessages()
Killed = 0; Killed = 0;
PRLimit = now - PR*86400; PRLimit = now - (time_t)PR*86400;
PURLimit = now - PUR*86400; PURLimit = now -(time_t)PUR*86400;
PFLimit = now - PF*86400; PFLimit = now - (time_t)PF*86400;
PNFLimit = now - PNF*86400; PNFLimit = now - (time_t)PNF*86400;
BFLimit = now - BF*86400; BFLimit = now - (time_t)BF*86400;
BNFLimit = now - BNF*86400; BNFLimit = now -(time_t) BNF*86400;
if (NTSU == 0) if (NTSU == 0)
{ {
@ -391,7 +396,7 @@ VOID ExpireMessages()
if (Msg->datecreated < PURLimit) if (Msg->datecreated < PURLimit)
{ {
if (SendNonDeliveryMsgs) if (SendNonDeliveryMsgs)
SendNonDeliveryMessage(Msg, TRUE, PUR); SendNonDeliveryMessage(Msg, TRUE, (int)PUR);
KillMsg(Msg); KillMsg(Msg);
} }
@ -401,7 +406,7 @@ VOID ExpireMessages()
if (Msg->datecreated < PNFLimit) if (Msg->datecreated < PNFLimit)
{ {
if (SendNonDeliveryMsgs) if (SendNonDeliveryMsgs)
SendNonDeliveryMessage(Msg, FALSE, PNF); SendNonDeliveryMessage(Msg, FALSE, (int)PNF);
KillMsg(Msg); KillMsg(Msg);
} }

252
IPCode.c
View File

@ -81,7 +81,7 @@ TODo ?Multiple Adapters
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
#include "ipcode.h" #include "ipcode.h"
@ -95,9 +95,13 @@ TODo ?Multiple Adapters
#pragma comment(lib, "IPHLPAPI.lib") #pragma comment(lib, "IPHLPAPI.lib")
#endif #endif
#include "pcap.h" #include <pcap.h>
#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
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#endif
#ifndef LINBPQ #ifndef LINBPQ
#include "kernelresource.h" #include "kernelresource.h"
@ -233,7 +237,7 @@ UCHAR ourMACAddr[6] = {02,'B','P','Q',1,1};
UCHAR RealMacAddress[6]; UCHAR RealMacAddress[6];
int IPPortMask = 0; uint64_t IPPortMask = 0;
IPSTATS IPStats = {0}; IPSTATS IPStats = {0};
@ -383,7 +387,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;
@ -1271,6 +1275,8 @@ static VOID Send_AX_Datagram(PMESSAGE Block, DWORD Len, UCHAR Port, UCHAR * HWAD
memcpy(Block->DEST, HWADDR, 7); memcpy(Block->DEST, HWADDR, 7);
memcpy(Block->ORIGIN, MYCALL, 7); memcpy(Block->ORIGIN, MYCALL, 7);
Block->DEST[6] &= 0x7e; // Clear End of Call Block->DEST[6] &= 0x7e; // Clear End of Call
Block->DEST[6] |= 0x80; // set Command Bit
Block->ORIGIN[6] |= 1; // Set End of Call Block->ORIGIN[6] |= 1; // Set End of Call
Block->CTL = 3; //UI Block->CTL = 3; //UI
@ -1546,7 +1552,8 @@ VOID ProcessEthIPMsg(PETHMSG Buffer)
VOID ProcessEthARPMsg(PETHARP arpptr, BOOL FromTAP) VOID ProcessEthARPMsg(PETHARP arpptr, BOOL FromTAP)
{ {
int i=0, Mask=IPPortMask; int i=0;
uint64_t Mask=IPPortMask;
PARPDATA Arp; PARPDATA Arp;
PROUTEENTRY Route; PROUTEENTRY Route;
BOOL Found; BOOL Found;
@ -1746,12 +1753,12 @@ ProxyARPReply:
memset(AXARPREQMSG.TARGETHWADDR, 0, 7); memset(AXARPREQMSG.TARGETHWADDR, 0, 7);
AXARPREQMSG.ARPOPCODE = 0x0100; AXARPREQMSG.ARPOPCODE = 0x0100;
for (i=1; i<=NUMBEROFPORTS; i++) for (i = 1; i <= MaxBPQPortNo; i++)
{ {
if (Mask & 1) if (Mask & 1)
Send_AX_Datagram((PMESSAGE)&AXARPREQMSG, 46, i, QST); Send_AX_Datagram((PMESSAGE)&AXARPREQMSG, 46, i, QST);
Mask>>=1; Mask >>= 1;
} }
break; break;
@ -1845,7 +1852,8 @@ SendBack:
VOID ProcessAXARPMsg(PAXARP arpptr) VOID ProcessAXARPMsg(PAXARP arpptr)
{ {
int i=0, Mask=IPPortMask; int i=0;
uint64_t Mask=IPPortMask;
PARPDATA Arp; PARPDATA Arp;
PROUTEENTRY Route; PROUTEENTRY Route;
@ -1952,13 +1960,13 @@ AXProxyARPReply:
AXARPREQMSG.TARGETIPADDR = arpptr->TARGETIPADDR; AXARPREQMSG.TARGETIPADDR = arpptr->TARGETIPADDR;
AXARPREQMSG.SENDIPADDR = arpptr->SENDIPADDR; AXARPREQMSG.SENDIPADDR = arpptr->SENDIPADDR;
for (i=1; i<=NUMBEROFPORTS; i++) for (i=1; i<=MaxBPQPortNo; i++)
{ {
if (i != arpptr->MSGHDDR.PORT) if (i != arpptr->MSGHDDR.PORT)
if (Mask & 1) if (Mask & 1)
Send_AX_Datagram((PMESSAGE)&AXARPREQMSG, 46, i, QST); Send_AX_Datagram((PMESSAGE)&AXARPREQMSG, 46, i, QST);
Mask>>=1; Mask >>= 1;
} }
memset(ETHARPREQMSG.MSGHDDR.DEST, 0xff, 6); memset(ETHARPREQMSG.MSGHDDR.DEST, 0xff, 6);
@ -2216,7 +2224,10 @@ BOOL CheckIPChecksum(PIPMSG IPptr)
checksum = cksum((unsigned short *)IPptr, 20); checksum = cksum((unsigned short *)IPptr, 20);
if (checksum == 0xffff) return TRUE; else return FALSE; if (checksum == 0xffff)
return TRUE;
else
return FALSE;
} }
BOOL Check_Checksum(VOID * ptr1, int Len) BOOL Check_Checksum(VOID * ptr1, int Len)
@ -2225,7 +2236,10 @@ BOOL Check_Checksum(VOID * ptr1, int Len)
checksum = cksum((unsigned short *)ptr1, Len); checksum = cksum((unsigned short *)ptr1, Len);
if (checksum == 0xffff) return TRUE; else return FALSE; if (checksum == 0xffff)
return TRUE;
else
return FALSE;
} }
USHORT Generate_CHECKSUM(VOID * ptr1, int Len) USHORT Generate_CHECKSUM(VOID * ptr1, int Len)
@ -3279,7 +3293,7 @@ static BOOL ReadConfigFile()
static int ProcessLine(char * buf) static int ProcessLine(char * buf)
{ {
char * ptr, * p_value, * p_origport, * p_host, * p_port; char * ptr, * p_value, * p_origport, * p_host;
int port, mappedport, ipad, mappedipad; int port, mappedport, ipad, mappedipad;
BOOL NATTAP = FALSE; BOOL NATTAP = FALSE;
int i; int i;
@ -3445,16 +3459,28 @@ static int ProcessLine(char * buf)
if (_stricmp(ptr,"IPPorts") == 0) if (_stricmp(ptr,"IPPorts") == 0)
{ {
p_port = strtok(p_value, " ,\t\n\r"); struct _EXTPORTDATA * PORTVEC;
while (p_port != NULL)
{
i=atoi(p_port);
if (i == 0) return FALSE;
if (i > NUMBEROFPORTS) return FALSE;
IPPortMask |= 1 << (i-1); while (p_value != NULL)
p_port = strtok(NULL, " ,\t\n\r"); {
i=atoi(p_value);
if (i == 0) return FALSE;
PORTVEC = (struct _EXTPORTDATA * )GetPortTableEntryFromPortNum(i);
if (PORTVEC == NULL)
return FALSE;
// if not KISS, make sure it can send UI frames
if (PORTVEC->PORTCONTROL.PORTTYPE == 16) // EXTERNAL
if (PORTVEC->PORTCONTROL.PROTOCOL == 10) // Pactor/WINMOR
if (PORTVEC->PORTCONTROL.UICAPABLE == 0)
return FALSE;
IPPortMask |= (uint64_t)1 << (i-1);
p_value = strlop(p_value, ',');
} }
return (TRUE); return (TRUE);
} }
@ -4523,6 +4549,50 @@ void OpenTAP()
return; return;
} }
// Fix from github user isavitsky
/*
* After some research I found that on most of my
* systems, including Raspberry Pi IV, a slight delay
* is needed before considering the TAP device
* up and running. Otherwise the interface structures
* do not initialise properly and later in the code
* around the line 4700 when we initialise our ARP
* structure:
*
* memcpy(Arp->HWADDR, xbuffer.ifr_hwaddr.sa_data, 6);
*
* the MAC address is getting filled in with random
* value which makes the communication via our TAP
* device using the configured IPADDR virtually
* impossible.
*
*/
Debugprintf("Waiting for the TAP to become UP and RUNNING");
for (int i=10; i>0; i--)
{
Sleep(10);
if ((err = ioctl(sockfd, SIOCGIFFLAGS, &ifr)) < 0)
{
perror("SIOCGIFFLAGS");
return;
}
if((ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING))
{
Debugprintf("TAP is UP and RUNNING");
break;
}
else if (i == 1)
{
Debugprintf("TAP is still not UP and RUNNING");
return;
}
}
printf("TAP brought up\n"); printf("TAP brought up\n");
// Set MTU to 256 // Set MTU to 256
@ -4665,7 +4735,7 @@ void OpenTAP()
extern struct DATAMESSAGE * REPLYBUFFER; extern struct DATAMESSAGE * REPLYBUFFER;
char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...); char * __cdecl Cmdprintf(TRANSPORTENTRY * Session, char * Bufferptr, const char * format, ...);
VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// Send ICMP Echo Request // Send ICMP Echo Request
@ -4723,7 +4793,7 @@ VOID PING(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD
return; return;
} }
VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY IP Gateway ARP status or Clear // DISPLAY IP Gateway ARP status or Clear
@ -4818,7 +4888,7 @@ VOID SHOWARP(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX *
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWNAT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY IP Gateway ARP status or Clear // DISPLAY IP Gateway ARP status or Clear
@ -4877,7 +4947,7 @@ int CountBits(uint32_t in)
return n; return n;
} }
VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMDX * CMD) VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// DISPLAY IP Gateway ARP status or Clear // DISPLAY IP Gateway ARP status or Clear
@ -4902,7 +4972,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, CMD
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++)
{ {
@ -5119,33 +5189,17 @@ int BuildReply(UCHAR * Buffer, int Offset, UCHAR * OID, int OIDLen, UCHAR * Valu
// snmpget -v1 -c jnos [ve4klm.ampr.org | www.langelaar.net] 1.3.6.1.2.1.2.2.1.16.5 // snmpget -v1 -c jnos [ve4klm.ampr.org | www.langelaar.net] 1.3.6.1.2.1.2.2.1.16.5
int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr)
VOID ProcessSNMPMessage(PIPMSG IPptr)
{ {
int Len;
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
char Community[256]; char Community[256];
UCHAR OID[256]; UCHAR OID[256];
int OIDLen; int OIDLen;
UCHAR * Msg;
int Type; int Type;
int Length, ComLen; int Length, ComLen;
int IntVal; int IntVal;
int ReqID; int ReqID;
int RequestType; int RequestType;
Len = ntohs(IPptr->IPLENGTH);
Len-=20;
Check_Checksum(UDPptr, Len);
// 4 bytes version
// Null Terminated Community
Msg = (char *) UDPptr;
Msg += 8; // Over UDP Header
Len -= 8;
// ASN 1 Encoding - Type, Len, Data // ASN 1 Encoding - Type, Len, Data
@ -5157,7 +5211,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
// First should be a Sequence // First should be a Sequence
if (Type != 0x30) if (Type != 0x30)
return; return 0;
Len -= 2; Len -= 2;
@ -5168,7 +5222,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
// Should be Integer - SNMP Version - We support V1, identified by zero // Should be Integer - SNMP Version - We support V1, identified by zero
if (Type != 2 || Length != 1 || IntVal != 0) if (Type != 2 || Length != 1 || IntVal != 0)
return; return 0;
Len -= 3; Len -= 3;
@ -5178,7 +5232,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
// Should Be String (community) // Should Be String (community)
if (Type != 4) if (Type != 4)
return; return 0;
memcpy(Community, Msg, ComLen); memcpy(Community, Msg, ComLen);
Community[ComLen] = 0; Community[ComLen] = 0;
@ -5204,23 +5258,23 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Length = *(Msg++); Length = *(Msg++);
if (Type != 2) if (Type != 2)
return; return 0;
ReqID = ASNGetInt(Msg, Length); ReqID = ASNGetInt(Msg, Length);
Len -= (2 + Length); Len -= (2 + Length);
Msg += Length; Msg += Length;
// Two more Integers - error status, error index // Two more Integers - error status, error index
Type = *(Msg++); Type = *(Msg++);
Length = *(Msg++); Length = *(Msg++);
if (Type != 2) if (Type != 2)
return; return 0;
ASNGetInt(Msg, Length); ASNGetInt(Msg, Length);
Len -= (2 + Length); Len -= (2 + Length);
Msg += Length; Msg += Length;
@ -5228,10 +5282,10 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Length = *(Msg++); Length = *(Msg++);
if (Type != 2) if (Type != 2)
return; return 0;
ASNGetInt(Msg, Length); ASNGetInt(Msg, Length);
Len -= (2 + Length); Len -= (2 + Length);
Msg += Length; Msg += Length;
@ -5243,7 +5297,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Len -= 2; Len -= 2;
if (Type != 0x30) if (Type != 0x30)
return; return 0;
Type = *(Msg++); Type = *(Msg++);
Length = *(Msg++); Length = *(Msg++);
@ -5251,7 +5305,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Len -= 2; Len -= 2;
if (Type != 0x30) if (Type != 0x30)
return; return 0;
// Next is OID // Next is OID
@ -5259,7 +5313,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Length = *(Msg++); Length = *(Msg++);
if (Type != 6) // Object ID if (Type != 6) // Object ID
return; return 0;
memcpy(OID, Msg, Length); memcpy(OID, Msg, Length);
OID[Length] = 0; OID[Length] = 0;
@ -5268,30 +5322,29 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Len -=2; // Header Len -=2; // Header
Len -= Length; Len -= Length;
Msg += Length; Msg += Length;
// Should Just have a null value left // Should Just have a null value left
Type = *(Msg++); Type = *(Msg++);
Length = *(Msg++); Length = *(Msg++);
if (Type != 5 || Length != 0) if (Type != 5 || Length != 0)
return; return 0;
Len -=2; // Header Len -=2; // Header
// Should be nothing left // Should be nothing left
} }
if (RequestType = 160) if (RequestType == 160)
{ {
UCHAR Reply[256];
int Offset = 255; int Offset = 255;
int PDULen, SendLen; int PDULen = 0;
char Value[256]; char Value[256];
int ValLen; int ValLen;
// Only Support Get // Only Support Get
if (memcmp(OID, sysName, sysNameLen) == 0) if (memcmp(OID, sysName, sysNameLen) == 0)
@ -5300,7 +5353,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Value[0] = 4; // String Value[0] = 4; // String
Value[1] = ValLen; Value[1] = ValLen;
memcpy(&Value[2], MYNODECALL, ValLen); memcpy(&Value[2], MYNODECALL, ValLen);
PDULen = BuildReply(Reply, Offset, sysName, sysNameLen, Value, ReqID); PDULen = BuildReply(Reply, Offset, sysName, sysNameLen, Value, ReqID);
} }
else if (memcmp(OID, sysUpTime, sysUpTimeLen) == 0) else if (memcmp(OID, sysUpTime, sysUpTimeLen) == 0)
@ -5330,7 +5383,7 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
} }
else else
return; return 0;
Offset -= PDULen; Offset -= PDULen;
Offset -= ComLen; Offset -= ComLen;
@ -5348,25 +5401,56 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
Reply[--Offset] = PDULen + ComLen + 5; Reply[--Offset] = PDULen + ComLen + 5;
Reply[--Offset] = 48; Reply[--Offset] = 48;
SendLen = PDULen + ComLen + 7; *OffPtr = Offset;
memcpy(UDPptr->UDPData, &Reply[Offset], SendLen); return PDULen + ComLen + 7;
// Swap Dest to Origin
IPptr->IPDEST = IPptr->IPSOURCE;
IPptr->IPSOURCE.addr = OurIPAddr;
UDPptr->DESTPORT = UDPptr->SOURCEPORT;
UDPptr->SOURCEPORT = htons(161);
SendLen += 8; // UDP Header
UDPptr->LENGTH = htons(SendLen);
IPptr->IPLENGTH = htons(SendLen + 20);
CheckSumAndSendUDP(IPptr, UDPptr, SendLen);
} }
return 0;
// Ingnore others
} }
VOID ProcessSNMPMessage(PIPMSG IPptr)
{
int Len;
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
UCHAR * Msg;
UCHAR Reply[256];
int SendLen;
int Offset = 0;
Len = ntohs(IPptr->IPLENGTH);
Len-=20;
Check_Checksum(UDPptr, Len);
// 4 bytes version
// Null Terminated Community
Msg = (char *) UDPptr;
Msg += 8; // Over UDP Header
Len -= 8;
SendLen = ProcessSNMPPayload(Msg, Len, Reply, &Offset);
if (SendLen == 0)
return;
memcpy(UDPptr->UDPData, &Reply[Offset], SendLen);
// Swap Dest to Origin
IPptr->IPDEST = IPptr->IPSOURCE;
IPptr->IPSOURCE.addr = OurIPAddr;
UDPptr->DESTPORT = UDPptr->SOURCEPORT;
UDPptr->SOURCEPORT = htons(161);
SendLen += 8; // UDP Header
UDPptr->LENGTH = htons(SendLen);
IPptr->IPLENGTH = htons(SendLen + 20);
CheckSumAndSendUDP(IPptr, UDPptr, SendLen);
}

View File

@ -53,7 +53,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdlib.h> #include <stdlib.h>
#include "time.h" #include "time.h"
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
#include "bpq32.h" #include "bpq32.h"
@ -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
@ -1099,7 +1128,7 @@ VOID KAMPoll(int Port)
// Limit amount in TX, so we keep some on the TX Q and don't send turnround too early // Limit amount in TX, so we keep some on the TX Q and don't send turnround too early
if (TNC->Streams[0].BytesTXed - TNC->Streams[0].BytesAcked > 200) if (TNC->Streams[0].bytesTXed - TNC->Streams[0].BytesAcked > 200)
continue; continue;
// Dont send if IRS State // Dont send if IRS State
@ -1132,7 +1161,7 @@ VOID KAMPoll(int Port)
} }
Next = 0; Next = 0;
STREAM->BytesTXed += datalen; STREAM->bytesTXed += datalen;
if (Stream == 0) if (Stream == 0)
{ {
@ -1157,7 +1186,7 @@ VOID KAMPoll(int Port)
if (Stream == 0) if (Stream == 0)
{ {
sprintf(Status, "RX %d TX %d ACKED %d ", sprintf(Status, "RX %d TX %d ACKED %d ",
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked); TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, Status); SetWindowText(TNC->xIDC_TRAFFIC, Status);
if ((TNC->HFPacket == 0) && (TNC->Streams[0].BPQtoPACTOR_Q == 0)) // Nothing following if ((TNC->HFPacket == 0) && (TNC->Streams[0].BPQtoPACTOR_Q == 0)) // Nothing following
@ -1266,6 +1295,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)
@ -1532,14 +1606,14 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
{ {
if (Msg[1] == '2') // HF Port if (Msg[1] == '2') // HF Port
{ {
if (TNC->Streams[0].BytesTXed) if (TNC->Streams[0].bytesTXed)
TNC->Streams[0].BytesAcked += Len - 3; // We get an ack before the first send TNC->Streams[0].BytesAcked += Len - 3; // We get an ack before the first send
sprintf(Status, "RX %d TX %d ACKED %d ", sprintf(Status, "RX %d TX %d ACKED %d ",
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked); TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, Status); SetWindowText(TNC->xIDC_TRAFFIC, Status);
if (TNC->Streams[0].BytesTXed - TNC->Streams[0].BytesAcked < 500) if (TNC->Streams[0].bytesTXed - TNC->Streams[0].BytesAcked < 500)
TNC->Streams[0].FramesOutstanding = 0; TNC->Streams[0].FramesOutstanding = 0;
} }
return; return;
@ -1555,7 +1629,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
Len-=3; // Remove Header Len-=3; // Remove Header
buffptr->Len = Len; // Length buffptr->Len = Len; // Length
STREAM->BytesRXed += Len; STREAM->bytesRXed += Len;
memcpy(buffptr->Data, Buffer, Len); memcpy(buffptr->Data, Buffer, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr); C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
@ -1563,7 +1637,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Stream == 0) if (Stream == 0)
{ {
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d ", sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d ",
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked); TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
@ -1644,6 +1718,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;
@ -1762,7 +1840,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
Buffer[Len-4] = 0; Buffer[Len-4] = 0;
} }
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = 0; STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = 0;
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
if (Stream == 0) if (Stream == 0)
@ -1776,7 +1854,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
Rig_Command( (TRANSPORTENTRY *) -1, Msg); Rig_Command( (TRANSPORTENTRY *) -1, Msg);
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d ", sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d ",
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked); TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC); SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
} }
@ -1790,6 +1868,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];
@ -1874,7 +1956,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
memcpy(&CTBuff[3], &CTEXTMSG[Next], Len); memcpy(&CTBuff[3], &CTEXTMSG[Next], Len);
EncodeAndSend(TNC, CTBuff, Len + 3); EncodeAndSend(TNC, CTBuff, Len + 3);
EncodeAndSend(TNC, "E", 1); // Changeover when all sent EncodeAndSend(TNC, "E", 1); // Changeover when all sent
TNC->Streams[0].BytesTXed += CTEXTLEN; TNC->Streams[0].bytesTXed += CTEXTLEN;
} }
return; return;
@ -2047,7 +2129,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;
} }

132
KISSHF.c
View File

@ -27,7 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "CHeaders.h" #include "cheaders.h"
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
@ -50,8 +50,8 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID SendInitScript(struct TNCINFO * TNC); VOID SendInitScript(struct TNCINFO * TNC);
int KISSHFGetLine(char * buf); int KISSHFGetLine(char * buf);
int ProcessEscape(UCHAR * TXMsg); int ProcessEscape(UCHAR * TXMsg);
VOID KISSHFProcessReceivedPacket(struct TNCINFO * TNC); VOID KISSHFProcessReceivedPacket(struct TNCINFO * TNC, int Channel);
static int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); static int KissEncode(struct TNCINFO * TNC, UCHAR * inbuff, UCHAR * outbuff, int len, int Channel);
int ConnecttoKISS(int port); int ConnecttoKISS(int port);
TRANSPORTENTRY * SetupNewSession(TRANSPORTENTRY * Session, char * Bufferptr); TRANSPORTENTRY * SetupNewSession(TRANSPORTENTRY * Session, char * Bufferptr);
BOOL DecodeCallString(char * Calls, BOOL * Stay, BOOL * Spy, UCHAR * AXCalls); BOOL DecodeCallString(char * Calls, BOOL * Stay, BOOL * Spy, UCHAR * AXCalls);
@ -265,6 +265,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
struct TNCINFO * TNC = TNCInfo[port]; struct TNCINFO * TNC = TNCInfo[port];
struct STREAMINFO * STREAM = &TNC->Streams[0]; struct STREAMINFO * STREAM = &TNC->Streams[0];
struct ScanEntry * Scan; struct ScanEntry * Scan;
int Channel = ((TNC->PortRecord->PORTCONTROL.CHANNELNUM - 1) & 15) << 4;
if (TNC == NULL) if (TNC == NULL)
return 0; // Port not defined return 0; // Port not defined
@ -349,6 +350,7 @@ ok:
// See if any frames for this port // See if any frames for this port
STREAM = &TNC->Streams[0]; STREAM = &TNC->Streams[0];
if (STREAM->BPQtoPACTOR_Q) if (STREAM->BPQtoPACTOR_Q)
@ -357,7 +359,7 @@ ok:
UCHAR * data = &buffptr->Data[0]; UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--; STREAM->FramesQueued--;
txlen = (int)buffptr->Len; txlen = (int)buffptr->Len;
STREAM->BytesTXed += txlen; STREAM->bytesTXed += txlen;
bytes=SerialSendData(TNC, data, txlen); bytes=SerialSendData(TNC, data, txlen);
WritetoTrace(TNC, data, txlen); WritetoTrace(TNC, data, txlen);
@ -417,7 +419,10 @@ ok:
if (buff->PID != 240) // ax.25 address if (buff->PID != 240) // ax.25 address
{ {
txlen = KissEncode(&buff->PID, txbuff, txlen); txlen = KissEncode(TNC, &buff->PID, txbuff, txlen, Channel);
// We need to che check for ackmode
txlen = send(TNC->TCPSock, txbuff, txlen, 0); txlen = send(TNC->TCPSock, txbuff, txlen, 0);
return 1; return 1;
} }
@ -453,8 +458,12 @@ 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]))
{ {
} }
@ -504,7 +513,8 @@ ok:
} }
} }
if (toupper(buff->L2DATA[0]) == 'C' && buff->L2DATA[1] == ' ' && txlen > 2) // Connect if ((toupper(buff->L2DATA[0]) == 'C' && buff->L2DATA[1] == ' ' && txlen > 2) // Connect
|| (toupper(buff->L2DATA[0]) == 'N' && buff->L2DATA[1] == ' ' && txlen > 2)) // Connect
{ {
// Connect Command. Pass to L2 code to start session // Connect Command. Pass to L2 code to start session
@ -616,9 +626,9 @@ noFlip3:
RESET2(LINK); // RESET ALL FLAGS RESET2(LINK); // RESET ALL FLAGS
// if (CMD->String[0] == 'N' && SUPPORT2point2) if (toupper(buff->L2DATA[0]) == 'N' && SUPPORT2point2)
// LINK->L2STATE = 1; // New (2.2) send XID LINK->L2STATE = 1; // New (2.2) send XID
// else else
LINK->L2STATE = 2; // Send SABM LINK->L2STATE = 2; // Send SABM
LINK->CIRCUITPOINTER = NewSess; LINK->CIRCUITPOINTER = NewSess;
@ -720,12 +730,18 @@ VOID KISSHFReleaseTNC(struct TNCINFO * TNC)
ReleaseOtherPorts(TNC); ReleaseOtherPorts(TNC);
} }
VOID KISSHFSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC) VOID KISSHFSuspendPort(struct TNCINFO * TNC, struct TNCINFO * THISTNC)
{ {
TNC->PortRecord->PORTCONTROL.PortSuspended = 1;
strcpy(TNC->WEB_TNCSTATE, "Interlocked");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
} }
VOID KISSHFReleasePort(struct TNCINFO * TNC) VOID KISSHFReleasePort(struct TNCINFO * TNC)
{ {
TNC->PortRecord->PORTCONTROL.PortSuspended = 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)
@ -735,9 +751,9 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
"function ScrollOutput()\r\n" "function ScrollOutput()\r\n"
"{var textarea = document.getElementById('textarea');" "{var textarea = document.getElementById('textarea');"
"textarea.scrollTop = textarea.scrollHeight;}</script>" "textarea.scrollTop = textarea.scrollHeight;}</script>"
"</head><title>VARA Status</title></head><body id=Text onload=\"ScrollOutput()\">" "</head><title>KISSHF Status</title></head><body id=Text onload=\"ScrollOutput()\">"
"<h2><form method=post target=\"POPUPW\" onsubmit=\"POPUPW = window.open('about:blank','POPUPW'," "<h2><form method=post target=\"POPUPW\" onsubmit=\"POPUPW = window.open('about:blank','POPUPW',"
"'width=440,height=150');\" action=ARDOPAbort?%d>KISSHF Status" "'width=440,height=50');\" action=ARDOPAbort?%d>KISSHF Status"
"<input name=Save value=\"Abort Session\" type=submit style=\"position: absolute; right: 20;\"></form></h2>", "<input name=Save value=\"Abort Session\" type=submit style=\"position: absolute; right: 20;\"></form></h2>",
TNC->Port); TNC->Port);
@ -746,14 +762,14 @@ static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE); Len += sprintf(&Buff[Len], "<tr><td width=110px>Comms State</td><td>%s</td></tr>", TNC->WEB_COMMSSTATE);
Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE); Len += sprintf(&Buff[Len], "<tr><td>TNC State</td><td>%s</td></tr>", TNC->WEB_TNCSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE); // Len += sprintf(&Buff[Len], "<tr><td>Mode</td><td>%s</td></tr>", TNC->WEB_MODE);
Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s</td></tr>", TNC->WEB_CHANSTATE); // Len += sprintf(&Buff[Len], "<tr><td>Channel State</td><td>%s</td></tr>", TNC->WEB_CHANSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE); // Len += sprintf(&Buff[Len], "<tr><td>Proto State</td><td>%s</td></tr>", TNC->WEB_PROTOSTATE);
Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC); // Len += sprintf(&Buff[Len], "<tr><td>Traffic</td><td>%s</td></tr>", TNC->WEB_TRAFFIC);
// Len += sprintf(&Buff[Len], "<tr><td>TNC Restarts</td><td></td></tr>", TNC->WEB_RESTARTS); // Len += sprintf(&Buff[Len], "<tr><td>TNC Restarts</td><td></td></tr>", TNC->WEB_RESTARTS);
Len += sprintf(&Buff[Len], "</table>"); Len += sprintf(&Buff[Len], "</table>");
Len += sprintf(&Buff[Len], "<textarea rows=10 style=\"width:500px; height:250px;\" id=textarea >%s</textarea>", TNC->WebBuffer); Len += sprintf(&Buff[Len], "<textarea rows=2 style=\"width:500px; height:50px;\" id=textarea >%s</textarea>", TNC->WebBuffer);
Len = DoScanLine(TNC, Buff, Len); Len = DoScanLine(TNC, Buff, Len);
return Len; return Len;
@ -797,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);
@ -976,6 +992,7 @@ VOID KISSThread(void * portptr)
char * ptr1; char * ptr1;
char * ptr2; char * ptr2;
UINT * buffptr; UINT * buffptr;
int Channel = ((TNC->PortRecord->PORTCONTROL.CHANNELNUM - 1) & 15) << 4;
if (TNC->HostName == NULL) if (TNC->HostName == NULL)
return; return;
@ -1184,7 +1201,7 @@ VOID KISSThread(void * portptr)
if (FD_ISSET(TNC->TCPSock, &readfs)) if (FD_ISSET(TNC->TCPSock, &readfs))
{ {
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
KISSHFProcessReceivedPacket(TNC); KISSHFProcessReceivedPacket(TNC, Channel);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
} }
@ -1243,16 +1260,43 @@ static int KissDecode(UCHAR * inbuff, UCHAR * outbuff, int len)
} }
#define ACKMODE 4 // CAN USE ACK REQURED FRAMES
#define MSGHDDRLEN (USHORT)(sizeof(VOID *) + sizeof(UCHAR) + sizeof(USHORT))
#define ONEMINUTE 60*3
static int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len) static int KissEncode(struct TNCINFO * TNC, UCHAR * inbuff, UCHAR * outbuff, int len, int Channel)
{ {
int i,txptr=0; int i,txptr=0;
UCHAR c; UCHAR c;
outbuff[0]=FEND; outbuff[0] = FEND;
outbuff[1]=0; outbuff[1] = Channel;
txptr=2; txptr=2;
// See if we need ackmode
if (TNC->PortRecord->PORTCONTROL.KISSFLAGS & ACKMODE)
{
UCHAR * ptr = inbuff - MSGHDDRLEN;
PMESSAGE Buffer = (PMESSAGE)ptr;
if (Buffer->Linkptr) // Frame Needs ACK
{
UINT ACKWORD = (UINT)(Buffer->Linkptr - LINKS);
outbuff[1] |= 0x0c; // ACK OPCODE
outbuff[2] = ACKWORD & 0xff;
outbuff[3] = (ACKWORD >> 8) &0xff;
Buffer->Linkptr->L2TIMER = ONEMINUTE; // Extend timeout
txptr = 4;
// have to reset flag so trace doesnt clear it
Buffer->Linkptr = 0;
}
}
for (i=0;i<len;i++) for (i=0;i<len;i++)
{ {
c=inbuff[i]; c=inbuff[i];
@ -1283,7 +1327,7 @@ static int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len)
} }
VOID KISSHFProcessReceivedPacket(struct TNCINFO * TNC) VOID KISSHFProcessReceivedPacket(struct TNCINFO * TNC, int Channel)
{ {
int InputLen, MsgLen; int InputLen, MsgLen;
unsigned char * ptr; unsigned char * ptr;
@ -1335,10 +1379,42 @@ VOID KISSHFProcessReceivedPacket(struct TNCINFO * TNC)
if (MsgLen > 1) if (MsgLen > 1)
{ {
PMESSAGE Buff = GetBuff(); PMESSAGE Buff;
if ((TNC->ARDOPBuffer[1] & 0xf0) != Channel)
goto ignoreit;
Buff = GetBuff();
MsgLen = KissDecode(TNC->ARDOPBuffer, Buffer, MsgLen); MsgLen = KissDecode(TNC->ARDOPBuffer, Buffer, MsgLen);
// See if ACKMODE ACK
if ((Buffer[1] & 0xf) == 12)
{
//Ackmode
struct _LINKTABLE * LINK;
int ACKWORD = Buffer[2] | Buffer[3] << 8;
if (ACKWORD < MAXLINKS)
{
LINK = LINKS + ACKWORD;
if (LINK->L2TIMER)
LINK->L2TIMER = LINK->L2TIME;
}
ReleaseBuffer(Buff);
goto ignoreit;
}
if ((Buffer[1] & 0xf) != 0)
{
ReleaseBuffer(Buff);
goto ignoreit; // Not data
}
// we dont need the FENDS or control byte // we dont need the FENDS or control byte
MsgLen -= 3; MsgLen -= 3;
@ -1354,6 +1430,8 @@ VOID KISSHFProcessReceivedPacket(struct TNCINFO * TNC)
} }
} }
ignoreit:
if (TNC->InputLen == 0) if (TNC->InputLen == 0)
return; return;
@ -1463,7 +1541,7 @@ void DetachKISSHF(struct PORTCONTROL * PORT)
struct STREAMINFO * STREAM = &TNC->Streams[0]; struct STREAMINFO * STREAM = &TNC->Streams[0];
if (STREAM->Attached) if (STREAM->Attached)
STREAM->ReportDISC = TRUE; // Tell Node STREAM->ReportDISC = 10; // Tell Node but give time for error message to display
STREAM->Connecting = FALSE; STREAM->Connecting = FALSE;
STREAM->Connected = FALSE; STREAM->Connected = FALSE;

View File

@ -10,7 +10,7 @@
// Generated from the TEXTINCLUDE 2 resource. // Generated from the TEXTINCLUDE 2 resource.
// //
#include "afxres.h" #include "afxres.h"
#include "bpqtermmdi.h" #include "BpqTermMDI.h"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
@ -241,6 +241,7 @@ BEGIN
END END
POPUP "Monitor" POPUP "Monitor"
BEGIN BEGIN
MENUITEM "Use Local Time", MONLOCALTIME
MENUITEM "Monitor TX", BPQMTX MENUITEM "Monitor TX", BPQMTX
MENUITEM "Monitor Supervisory", BPQMCOM MENUITEM "Monitor Supervisory", BPQMCOM
MENUITEM "Monitor UI Only", MON_UI_ONLY MENUITEM "Monitor UI Only", MON_UI_ONLY
@ -276,13 +277,13 @@ INCOMINGCALL WAVE MOVEABLE PURE "Ring.wav"
BEGIN BEGIN
"kernelresource.h\0" "kernelresource.h\0"
"""\r\n" """\r\n"
"bpqtermmdi.h\0" "BpqTermMDI.h\0"
END END
2 TEXTINCLUDE DISCARDABLE 2 TEXTINCLUDE DISCARDABLE
BEGIN BEGIN
"#include ""afxres.h""\r\n" "#include ""afxres.h""\r\n"
"#include ""bpqtermmdi.h""\r\n" "#include ""BpqTermMDI.h""\r\n"
"\0" "\0"
END END

1091
L2Code.c

File diff suppressed because it is too large Load Diff

View File

@ -49,7 +49,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "stdio.h" #include "stdio.h"
#include <fcntl.h> #include <fcntl.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
VOID UPDATEDESTLIST(); VOID UPDATEDESTLIST();
@ -67,6 +67,8 @@ extern dest_list * CURRENTNODE;
int L3_10SECS = 10; int L3_10SECS = 10;
extern int PREFERINP3ROUTES;
VOID L3BG() VOID L3BG()
{ {
@ -135,12 +137,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,22 +158,32 @@ 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;
ROUTE = DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR; ROUTE = DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR;
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 +191,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 +222,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;
@ -319,13 +337,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 +351,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
@ -707,11 +725,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++;
@ -845,7 +863,7 @@ VOID SENDNEXTNODESFRAGMENT()
if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL && if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN && DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
(NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if DEST = 0; (NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if NODE = 0;
{ {
// Send it // Send it
@ -878,6 +896,9 @@ VOID SENDNEXTNODESFRAGMENT()
*(ptr1++) = (UCHAR)Qual; *(ptr1++) = (UCHAR)Qual;
if (Qual == 0)
continue;
Count--; Count--;
} }
DEST++; DEST++;
@ -924,7 +945,7 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason)
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason) VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
{ {
// FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
// SET INACTIVE // SET INACTIVE
dest_list * DEST; dest_list * DEST;
@ -945,7 +966,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
@ -1038,7 +1059,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
@ -1120,7 +1141,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,6 +1313,32 @@ VOID REMOVENODE(dest_list * DEST)
NUMBEROFNODES--; NUMBEROFNODES--;
} }
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
{
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL)
return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
L3TRYNEXTDEST(ROUTE); // RESET ASSOCIATED DEST ENTRIES
}
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK) VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
{ {
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED // L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
@ -1304,6 +1351,14 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
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 or refused", Normcall);
}
TellINP3LinkSetupFailed(ROUTE); TellINP3LinkSetupFailed(ROUTE);
@ -1315,7 +1370,7 @@ 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 +1383,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)
{ {

636
L4Code.c
View File

@ -31,32 +31,32 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "stdio.h" #include "stdio.h"
#include <fcntl.h> #include <fcntl.h>
#include "CHeaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
extern BPQVECSTRUC BPQHOSTVECTOR[]; extern BPQVECSTRUC BPQHOSTVECTOR[];
#define BPQHOSTSTREAMS 64 #define BPQHOSTSTREAMS 64
#define IPHOSTVECTOR BPQHOSTVECTOR[BPQHOSTSTREAMS + 3] #define IPHOSTVECTOR BPQHOSTVECTOR[BPQHOSTSTREAMS + 3]
VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session); void CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
VOID SENDL4DISC(TRANSPORTENTRY * Session); void SENDL4DISC(TRANSPORTENTRY * Session);
int C_Q_COUNT(VOID * Q); int C_Q_COUNT(void * Q);
TRANSPORTENTRY * SetupSessionForL2(struct _LINKTABLE * LINK); TRANSPORTENTRY * SetupSessionForL2(struct _LINKTABLE * LINK);
VOID InformPartner(struct _LINKTABLE * LINK, int Reason); void InformPartner(struct _LINKTABLE * LINK, int Reason);
VOID IFRM150(TRANSPORTENTRY * Session, PDATAMESSAGE Buffer); void IFRM150(TRANSPORTENTRY * Session, PDATAMESSAGE Buffer);
VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG); void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
BOOL FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex); BOOL FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex);
int GETBUSYBIT(TRANSPORTENTRY * L4); int GETBUSYBIT(TRANSPORTENTRY * L4);
BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySessions); BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySessions);
VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE); TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE);
extern char * ALIASPTR; extern char * ALIASPTR;
VOID SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER * L3MSG, BOOL BPQNODE, UINT Applmask, UCHAR * ApplCall); void SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER * L3MSG, BOOL BPQNODE, UINT Applmask, UCHAR * ApplCall);
VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG); void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG);
VOID L4TIMEOUT(TRANSPORTENTRY * L4); void L4TIMEOUT(TRANSPORTENTRY * L4);
struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg); struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg);
int CHECKIFBUSYL4(TRANSPORTENTRY * L4); int CHECKIFBUSYL4(TRANSPORTENTRY * L4);
VOID AUTOTIMER(); VOID AUTOTIMER(TRANSPORTENTRY * L4);
VOID NRRecordRoute(UCHAR * Buff, int Len); VOID NRRecordRoute(UCHAR * Buff, int Len);
VOID REFRESHROUTE(TRANSPORTENTRY * Session); VOID REFRESHROUTE(TRANSPORTENTRY * Session);
VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR); VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR);
@ -67,12 +67,23 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall); VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall);
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode); void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG); void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
extern UINT APPLMASK; int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len);
static UINT APPLMASK;
extern BOOL LogL4Connects; extern BOOL LogL4Connects;
extern BOOL LogAllConnects; extern BOOL LogAllConnects;
extern int L4Compress;
extern int L4CompMaxframe;
extern int L4CompPaclen;
extern int L2Compress;
extern int L2CompMaxframe;
extern int L2CompPaclen;
// L4 Flags Values // L4 Flags Values
#define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED #define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED
@ -115,7 +126,7 @@ VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{ {
// INP3 // INP3
ProcessINP3RIF(LINK->NEIGHBOUR, &L3MSG->L3SRCE[1], L3MSG->LENGTH - 9, L3MSG->Port); ProcessINP3RIF(LINK->NEIGHBOUR, &L3MSG->L3SRCE[1], L3MSG->LENGTH - (MSGHDDRLEN + 2), L3MSG->Port); // = 2 = PID + FF Flag
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
@ -293,6 +304,7 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
return; return;
} }
L3MSG = GetBuff(); L3MSG = GetBuff();
if (L3MSG == 0) if (L3MSG == 0)
@ -341,6 +353,17 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
L3MSG->L4FLAGS = L4INFO | L4->NAKBITS; L3MSG->L4FLAGS = L4INFO | L4->NAKBITS;
if (Msg->PID == 0xF1) // Compressed Message
{
L3MSG->L4FLAGS |= L4COMP;
Msg->PID = 0xF0;
}
else if (Msg->PID == 0xF2) // Compressed Message - More to come
{
L3MSG->L4FLAGS |= (L4COMP | L4MORE);
Msg->PID = 0xF0;
}
L4->L4TIMER = L4->SESSIONT1; // SET TIMER L4->L4TIMER = L4->SESSIONT1; // SET TIMER
L4->L4ACKREQ = 0; // CANCEL ACK NEEDED L4->L4ACKREQ = 0; // CANCEL ACK NEEDED
@ -470,6 +493,9 @@ VOID SENDL4CONNECT(TRANSPORTENTRY * Session)
MSG->LENGTH = (int)(&MSG->L4DATA[17] - (UCHAR *)MSG); MSG->LENGTH = (int)(&MSG->L4DATA[17] - (UCHAR *)MSG);
if (L4Compress)
MSG->L4DATA[16] |= 0x40; // Set Compression Supported
if (Session->SPYFLAG) if (Session->SPYFLAG)
{ {
MSG->L4DATA[17] = 'Z'; // ADD SPY ON BBS FLAG MSG->L4DATA[17] = 'Z'; // ADD SPY ON BBS FLAG
@ -500,6 +526,102 @@ void RETURNEDTONODE(TRANSPORTENTRY * Session)
extern void * BUFFER; extern void * BUFFER;
void sendChunk(TRANSPORTENTRY * L4, unsigned char * Compressed, int complen, int savePort)
{
unsigned char * compdata;
struct DATAMESSAGE * Msg;
int sendLen = complen;
int fragments;
L4->SentAfterCompression += complen;
if (complen > L4CompPaclen)
{
fragments = (complen / L4CompPaclen); // Split to roughly equal sized fraagments
if (fragments * L4CompPaclen != complen)
fragments++;
sendLen = (complen / fragments) + 1;
}
compdata = Compressed;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = savePort;
memcpy(Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1; // 1 for pid field
Msg->PID = PID; // Not sent so use as a flag for compressed msg
compdata += sendLen;
complen -= sendLen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
}
}
void sendL2Chunk(struct _LINKTABLE * LINK, unsigned char * Compressed, int complen, int sendPacLen)
{
unsigned char * compdata;
struct DATAMESSAGE * Msg;
int sendLen = complen;
int fragments;
LINK->SentAfterCompression += complen;
if (complen > L2CompPaclen)
{
fragments = (complen / sendPacLen); // Split to roughly equal sized fraagments
if (fragments * sendPacLen != complen)
fragments++;
sendLen = (complen / fragments) + 1;
}
Debugprintf("L2 Chunk %d Bytes %d PACLEN %d Fragments %d FragSize", complen, sendPacLen, fragments, sendLen);
compdata = Compressed;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = LINK->LINKPORT->PORTNUMBER;
memcpy(Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1; // 1 for pid field
Msg->PID = PID; // Not sent so use as a flag for compressed msg
compdata += sendLen;
complen -= sendLen;
C_Q_ADD(&LINK->TX_Q, Msg);
}
}
VOID L4BG() VOID L4BG()
{ {
// PROCESS DATA QUEUED ON SESSIONS // PROCESS DATA QUEUED ON SESSIONS
@ -561,7 +683,7 @@ VOID L4BG()
LINK = L4->L4TARGET.LINK; LINK = L4->L4TARGET.LINK;
if (COUNT_AT_L2(LINK) > 8) if (COUNT_AT_L2(LINK) > 64)
break; break;
} }
@ -593,16 +715,154 @@ VOID L4BG()
if (L4->L4CIRCUITTYPE & SESSION) if (L4->L4CIRCUITTYPE & SESSION)
{ {
SENDL4MESSAGE(L4, Msg); // Now support compressing NetRom Sessions.
ReleaseBuffer(Msg); // We collect as much data as possible before compressing and re-packetizing
if (L4->AllowCompress)
{
int complen = 0;
unsigned char Compressed[8192];
unsigned char toCompress[8192];
int toCompressLen = 0;
int dataLen;
int savePort = Msg->PORT;
int maxCompSendLen;
// Save first packet, then see if more on TX_Q
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen;
// See if first will compress. If not assume too short or already compressed data and just send
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
if (complen >= dataLen)
{
L4->SentAfterCompression += dataLen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
toCompressLen = 0;
continue;
}
// Worth compressing. Try to collect several packets
if (L4->L4TX_Q == 0)
{
// no more, so just send the stuff we've just compressed. Compressed data will fit in input packet
// Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen);
memcpy(Msg->L2DATA, Compressed, complen);
Msg->PID = 0xF1; // Compressed
Msg->LENGTH = complen + MSGHDDRLEN + 1; // 1 for pid field
L4->SentAfterCompression += complen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
toCompressLen = 0;
continue;
}
ReleaseBuffer(Msg); // Not going to use it
while (L4->L4TX_Q && toCompressLen < (8192 - 256)) // Make sure can't overrin buffer
{
// Collect the data from L4TX_Q
Msg = Q_REM((void *)&L4->L4TX_Q);
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen;
ReleaseBuffer(Msg);
}
toCompress[toCompressLen] = 0;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen);
// Send compressed
// Fragment if more than L4CompPaclen
// Entered with original first fragment in saveMsg;
// Check for too big a compressed frame size. Bigger compresses better but adds latency to link
maxCompSendLen = L4CompPaclen * L4CompMaxframe;
if (complen > maxCompSendLen)
{
// Too Much Data. Needs to recompress less. To avoid too many recompresses be a bit conservative in calulating max size
// to allow for a bit less compression of part of data. Getting it wrong isn't fatal as sending more than optimum isn't fatal
int Fragments;
int ChunkSize;
unsigned char * CompressPtr = toCompress;
int bytesleft = toCompressLen;
// Assume 10% worse compression on smaller input
int j = (complen * 11) / 10; // New Comp size
Fragments = j / maxCompSendLen;
Fragments++;
ChunkSize = (toCompressLen / Fragments) + 1; // 1 for rounding
while (bytesleft > 0)
{
int Len = bytesleft;
if (Len > ChunkSize)
Len = ChunkSize;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len);
sendChunk(L4, Compressed, complen, savePort);
CompressPtr += Len;
bytesleft -= Len;
}
}
else
sendChunk(L4, Compressed, complen,savePort);
toCompressLen = 0;
}
else
{
// Compression Disabled
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
}
continue; continue;
} }
// L2 Link
LINK = L4->L4TARGET.LINK; LINK = L4->L4TARGET.LINK;
// If we want to enforce PACLEN this may be a good place to do it // If we want to enforce PACLEN this may be a good place to do it
Msglen = Msg->LENGTH - (MSGHDDRLEN + 1); //Dont include PID Msglen = Msg->LENGTH - (MSGHDDRLEN + 1); //Dont include PID
LINK->bytesTXed += Msglen;
Paclen = L4->SESSPACLEN; Paclen = L4->SESSPACLEN;
if (Paclen == 0) if (Paclen == 0)
@ -700,12 +960,32 @@ VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session)
Session->L4RESEQ_Q = 0; Session->L4RESEQ_Q = 0;
} }
// if compressed session display stats
if (Session->Sent && Session->Received)
{
char SRCE[10];
char TO[10];
struct DEST_LIST * DEST = Session->L4TARGET.DEST;
SRCE[ConvFromAX25(Session->L4MYCALL, SRCE)] = 0;
TO[ConvFromAX25(DEST->DEST_CALL, TO)] = 0;
Debugprintf("L4 Compression Stats %s %s TX %d %d %d%% RX %d %d %d%%", SRCE, TO,
Session->Sent, Session->SentAfterCompression, ((Session->Sent - Session->SentAfterCompression) * 100) / Session->Sent,
Session->Received, Session->ReceivedAfterExpansion, ((Session->ReceivedAfterExpansion - Session->Received) * 100) / Session->Received);
}
while (Session->L4RESEQ_Q) while (Session->L4RESEQ_Q)
ReleaseBuffer(Q_REM((void *)&Session->L4RESEQ_Q)); ReleaseBuffer(Q_REM((void *)&Session->L4RESEQ_Q));
if (Session->PARTCMDBUFFER) if (Session->PARTCMDBUFFER)
ReleaseBuffer(Session->PARTCMDBUFFER); ReleaseBuffer(Session->PARTCMDBUFFER);
if (Session->unCompress)
free(Session->unCompress);
memset(Session, 0, sizeof(TRANSPORTENTRY)); memset(Session, 0, sizeof(TRANSPORTENTRY));
} }
@ -897,10 +1177,14 @@ VOID L4TimerProc()
L4->STAYFLAG = 0; L4->STAYFLAG = 0;
Partner = L4->L4CROSSLINK; Partner = L4->L4CROSSLINK;
CLOSECURRENTSESSION(L4); CLOSECURRENTSESSION(L4);
if (Partner) if (Partner)
{ {
// if compressed session display stats
Partner->L4KILLTIMER = 0; //ITS TIMES IS ALSO ABOUT TO EXPIRE Partner->L4KILLTIMER = 0; //ITS TIMES IS ALSO ABOUT TO EXPIRE
CLOSECURRENTSESSION(Partner); // CLOSE THIS ONE CLOSECURRENTSESSION(Partner); // CLOSE THIS ONE
} }
@ -975,6 +1259,8 @@ VOID L4TIMEOUT(TRANSPORTENTRY * L4)
{ {
// RETRIED N2 TIMES - FAIL LINK // RETRIED N2 TIMES - FAIL LINK
// if compressed session display stats
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT) CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
return; return;
} }
@ -1247,6 +1533,7 @@ VOID SENDL4DISC(TRANSPORTENTRY * Session)
MSG->LENGTH = (int)(&MSG->L4DATA[0] - (UCHAR *)MSG); MSG->LENGTH = (int)(&MSG->L4DATA[0] - (UCHAR *)MSG);
C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG); C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG);
} }
@ -1297,14 +1584,11 @@ VOID CONNECTREQUEST(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, UINT Appl
char BPQPARAMS[10]; // Extended Connect Params from BPQ Node char BPQPARAMS[10]; // Extended Connect Params from BPQ Node
int CONERROR; int CONERROR;
int Index; int Index;
char xxx[16] = "";
memcpy(BPQPARAMS, &L4T1, 2); // SET DEFAULT T1 IN CASE NOT FROM ANOTHER BPQ NODE memcpy(BPQPARAMS, &L4T1, 2); // SET DEFAULT T1 IN CASE NOT FROM ANOTHER BPQ NODE
BPQPARAMS[2] = 0; // 'SPY' NOT SET BPQPARAMS[2] = 0; // 'SPY' NOT SET
ConvFromAX25(&L3MSG->L4DATA[1], xxx);
if (CheckExcludeList(&L3MSG->L4DATA[1]) == 0) if (CheckExcludeList(&L3MSG->L4DATA[1]) == 0)
{ {
SendConNAK(LINK, L3MSG); SendConNAK(LINK, L3MSG);
@ -1458,6 +1742,9 @@ VOID SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER *
if (BPQNODE) if (BPQNODE)
{ {
L3MSG->L4DATA[1] = L3LIVES; // Our TTL L3MSG->L4DATA[1] = L3LIVES; // Our TTL
if (L4->AllowCompress)
L3MSG->L4DATA[1] |= 0x80;
L3MSG->LENGTH++; L3MSG->LENGTH++;
} }
@ -1533,7 +1820,7 @@ int FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex
return FALSE; return FALSE;
} }
VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG) void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG)
{ {
// EXCHANGE ORIGIN AND DEST // EXCHANGE ORIGIN AND DEST
@ -1548,7 +1835,7 @@ VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG)
L3MSG->L3SRCE[6] |= 1; // Set Last Call L3MSG->L3SRCE[6] |= 1; // Set Last Call
} }
VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG) void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{ {
L3MSG->L4FLAGS = L4CACK | L4BUSY; // REJECT L3MSG->L4FLAGS = L4CACK | L4BUSY; // REJECT
L3MSG->L4DATA[0] = 0; // WINDOW L3MSG->L4DATA[0] = 0; // WINDOW
@ -1559,6 +1846,25 @@ VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
C_Q_ADD(&LINK->TX_Q, L3MSG); C_Q_ADD(&LINK->TX_Q, L3MSG);
} }
VOID SendL4RESET(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{
// Paula's extension
L3MSG->L4FLAGS = L4RESET;
L3SWAPADDRESSES(L3MSG);
L3MSG->L3TTL = L3LIVES;
L3MSG->LENGTH = (int)(&L3MSG->L4DATA[0] - (UCHAR *)L3MSG);
C_Q_ADD(&LINK->TX_Q, L3MSG);
}
VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE) TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE)
{ {
@ -1573,8 +1879,9 @@ VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
L4->CIRCUITID = NEXTID; L4->CIRCUITID = NEXTID;
NEXTID++; NEXTID++;
if (NEXTID == 0)
NEXTID++; // kEEP nON-ZERO if (NEXTID == 0)
NEXTID++; // kEEP nON-ZERO
L4->SESSIONT1 = L4T1; L4->SESSIONT1 = L4T1;
@ -1597,10 +1904,18 @@ VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
// GET BPQ EXTENDED CONNECT PARAMS IF PRESENT // GET BPQ EXTENDED CONNECT PARAMS IF PRESENT
if (L3MSG->LENGTH == MSGHDDRLEN + 38 || L3MSG->LENGTH == MSGHDDRLEN + 39) if (L3MSG->LENGTH == MSGHDDRLEN + 38 || L3MSG->LENGTH == MSGHDDRLEN + 39)
{ {
*BPQNODE = 1; *BPQNODE = 1;
memcpy(BPQPARAMS, &L3MSG->L4DATA[15],L3MSG->LENGTH - (MSGHDDRLEN + 36)); memcpy(BPQPARAMS, &L3MSG->L4DATA[15],L3MSG->LENGTH - (MSGHDDRLEN + 36));
// 40 bit of 2nd byte is Compress Flag
if (BPQPARAMS[1] & 0x40 && L4Compress)
L4->AllowCompress = 1;
BPQPARAMS[1] &= 0xf; // Only bottom bit is significant in Timeeout field
} }
L4->L4CIRCUITTYPE = SESSION | UPLINK; L4->L4CIRCUITTYPE = SESSION | UPLINK;
@ -1658,7 +1973,7 @@ TryAgain:
{ {
SHORT T1; SHORT T1;
DEST->DEST_STATE |= 0x40; // SET BPQ _NODE BIT DEST->DEST_STATE |= 0x40; // SET BPQ NODE BIT
memcpy((char *)&T1, BPQPARAMS, 2); memcpy((char *)&T1, BPQPARAMS, 2);
if (T1 > 300) if (T1 > 300)
@ -1741,22 +2056,48 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
CONNECTREQUEST(LINK, L3MSG, ApplMask, ApplCall); CONNECTREQUEST(LINK, L3MSG, ApplMask, ApplCall);
return; return;
} }
// OTHERS NEED A SESSION // OTHERS NEED A SESSION
L4 = &L4TABLE[L3MSG->L4INDEX]; if (Opcode == L4RESET)
if (L4->CIRCUITID!= L3MSG->L4ID)
{ {
// Paula's extension - other end dosn't know about session so disconnect
// A reset has our far index and id, not our index and id so have to search table for L4 entry
int n = MAXCIRCUITS;
L4 = L4TABLE;
while (n--)
{
if (L4->L4USER[0] && L4->FARID == L3MSG->L4ID && L4->FARINDEX == L3MSG->L4INDEX)
{
// Check L3 source call to be sure (should that be L4 source call??
L3MSG->L3SRCE[6] &= 0xfe; // mask end of call
if (memcmp(L3MSG->L3SRCE, L4->L4TARGET.DEST->DEST_CALL, 7) == 0)
{
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
}
ReleaseBuffer(L3MSG);
return;
}
L4++;
}
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
if ((L4->L4CIRCUITTYPE & SESSION) == 0) if (L3MSG->L4INDEX < MAXCIRCUITS)
{ L4 = &L4TABLE[L3MSG->L4INDEX];
// Not an L4 Session - must be an old connection
ReleaseBuffer(L3MSG); // If wrong ID or not an L4 session we must have restarted or cleared session
if (L4 == 0 || L4->CIRCUITID != L3MSG->L4ID || (L4->L4CIRCUITTYPE & SESSION) == 0)
{
SendL4RESET(LINK, L3MSG); // Paula's extension
return; return;
} }
@ -1767,13 +2108,19 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
case L4CACK: case L4CACK:
// CONNECT ACK // CONNECT ACK
DEST = L4->L4TARGET.DEST; DEST = L4->L4TARGET.DEST;
// EXTRACT EXTENDED PARAMS IF PRESENT // EXTRACT EXTENDED PARAMS IF PRESENT
if (L3MSG->LENGTH > MSGHDDRLEN + 22) // Standard Msg if (L3MSG->LENGTH > MSGHDDRLEN + 22) // Standard Msg
{ {
if (L3MSG->L4DATA[1] & 0x80) // Compress Flag
{
L4->AllowCompress = 1;
L3MSG->L4DATA[1] &= 0x7f;
}
DEST->DEST_STATE &= 0x80; DEST->DEST_STATE &= 0x80;
DEST->DEST_STATE |= (L3MSG->L4DATA[1] - L3MSG->L3TTL) + 0x41; // Hops to dest + x40 DEST->DEST_STATE |= (L3MSG->L4DATA[1] - L3MSG->L3TTL) + 0x41; // Hops to dest + x40
} }
@ -1840,13 +2187,13 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// DISCONNECT REQUEST // DISCONNECT REQUEST
L3MSG->L4INDEX = L4->FARINDEX; L3MSG->L4INDEX = L4->FARINDEX;
L3MSG->L4ID = L4->FARID; L3MSG->L4ID = L4->FARID;
L3MSG->L4FLAGS = L4DACK;
L3SWAPADDRESSES(L3MSG); // EXCHANGE SOURCE AND DEST L3MSG->L4FLAGS = L4DACK;
L3MSG->L3TTL = L3LIVES;
L3SWAPADDRESSES(L3MSG); // EXCHANGE SOURCE AND DEST
L3MSG->L3TTL = L3LIVES;
TNC = LINK->LINKPORT->TNC; TNC = LINK->LINKPORT->TNC;
@ -1855,11 +2202,11 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
else else
C_Q_ADD(&LINK->TX_Q, L3MSG); C_Q_ADD(&LINK->TX_Q, L3MSG);
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT) CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
return; return;
case L4DACK: case L4DACK:
CLEARSESSIONENTRY(L4); CLEARSESSIONENTRY(L4);
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
@ -1874,6 +2221,19 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
return; return;
} }
// Randomly drop packets
/*
Debugprintf("L4 Test Received packet %d ", L3MSG->L4TXNO);
if ((rand() % 7) > 5)
{
Debugprintf("L4 Test Drop packet %d ", L3MSG->L4TXNO);
ReleaseBuffer(L3MSG);
return;
}
*/
ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO); ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO);
// If DISCPENDING or STATE IS 4, THEN SESSION IS CLOSING - IGNORE ANY I FRAMES // If DISCPENDING or STATE IS 4, THEN SESSION IS CLOSING - IGNORE ANY I FRAMES
@ -1898,36 +2258,35 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// FRAME IS A REPEAT // FRAME IS A REPEAT
Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0; Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0;
Debugprintf("Discarding repeated frame seq %d from %s", L3MSG->L4TXNO, Call); Debugprintf("L4 Discarding repeated frame seq %d from %s", L3MSG->L4TXNO, Call);
L4->L4ACKREQ = 1; L4->L4ACKREQ = 1;
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
if (FramesMissing > 0) if (FramesMissing > 0)
{ {
// EXPECTED FRAME HAS BEEN MISSED - ASK FOR IT AGAIN, // EXPECTED FRAME HAS BEEN MISSED - ASK FOR IT AGAIN,
// AND KEEP THIS FRAME UNTIL MISSING ONE ARRIVES // AND KEEP THIS FRAME UNTIL MISSING ONE ARRIVES
L4->NAKBITS |= L4NAK; // SET NAK REQUIRED L4->NAKBITS |= L4NAK; // SET NAK REQUIRED
SENDL4IACK(L4); // SEND DATA ACK COMMAND TO ACK OUTSTANDING FRAMES SENDL4IACK(L4); // SEND DATA ACK COMMAND TO ACK OUTSTANDING FRAMES
// SEE IF WE ALREADY HAVE A COPY OF THIS ONE // SEE IF WE ALREADY HAVE A COPY OF THIS ONE
/*
Saved = L4->L4RESEQ_Q; Saved = L4->L4RESEQ_Q;
Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0; Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0;
Debugprintf("saving seq %d from %s", L3MSG->L4TXNO, Call); Debugprintf("L4 Out Of Seq saving seq %d from %s", L3MSG->L4TXNO, Call);
while (Saved) while (Saved)
{ {
if (Saved->L4TXNO == L3MSG->L4TXNO) if (Saved->L4TXNO == L3MSG->L4TXNO)
{ {
// ALREADY HAVE A COPY - DISCARD IT // ALREADY HAVE A COPY - DISCARD IT
Debugprintf("Already have seq %d - discarding", L3MSG->L4TXNO); Debugprintf("L4 Already have seq %d - discarding", L3MSG->L4TXNO);
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
@ -1937,7 +2296,6 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
C_Q_ADD(&L4->L4RESEQ_Q, L3MSG); // ADD TO CHAIN C_Q_ADD(&L4->L4RESEQ_Q, L3MSG); // ADD TO CHAIN
return; return;
*/
} }
// Frame is OK // Frame is OK
@ -1953,7 +2311,7 @@ L4INFO_OK:
L4->NAKBITS &= ~L4NAK; // CLEAR MESSAGE LOST STATE L4->NAKBITS &= ~L4NAK; // CLEAR MESSAGE LOST STATE
L4->RXSEQNO++; L4->RXSEQNO++;
// REMOVE HEADERS, AND QUEUE INFO // REMOVE HEADERS, AND QUEUE INFO
L3MSG->LENGTH -= 20; // L3/L4 Header L3MSG->LENGTH -= 20; // L3/L4 Header
@ -1966,15 +2324,122 @@ L4INFO_OK:
L3MSG->L3PID = 0xF0; // Normal Data PID L3MSG->L3PID = 0xF0; // Normal Data PID
memmove(L3MSG->L3SRCE, L3MSG->L4DATA, L3MSG->LENGTH - (4 + sizeof(void *))); // if compressed, expand
REFRESHROUTE(L4); if ((L3MSG->L4FLAGS & L4COMP) == 0)
{
// Not Compressed
L4->Received += L3MSG->LENGTH - MSGHDDRLEN - 1;
L4->ReceivedAfterExpansion += L3MSG->LENGTH - MSGHDDRLEN - 1;
memmove(L3MSG->L3SRCE, L3MSG->L4DATA, L3MSG->LENGTH - (4 + sizeof(void *)));
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
}
else
{
char Buffer[8192];
int Len;
int outLen;
int sendLen;
char * sendptr;
int savePort = L3MSG->Port;
// May be more thsn one packet
Len = L3MSG->LENGTH - MSGHDDRLEN - 1;
L4->Received += Len;
if (L3MSG->L4FLAGS & L4MORE)
{
if (L4->unCompressLen == 0)
{
// New packet
L4->unCompress = malloc(8192);
}
// Save data
memcpy(&L4->unCompress[L4->unCompressLen], L3MSG->L4DATA, Len);
L4->unCompressLen += Len;
ReleaseBuffer(L3MSG);
goto checkReseq;
}
if (L4->unCompressLen)
{
// Already have some data - add this to it
memcpy(&L4->unCompress[L4->unCompressLen], L3MSG->L4DATA, Len);
L4->unCompressLen += Len;
Len = doinflate(L4->unCompress, Buffer, L4->unCompressLen, 8192, &outLen);
}
else
{
// Just inflate this bit
Len = doinflate(L3MSG->L4DATA, Buffer, L3MSG->LENGTH - MSGHDDRLEN - 1, 8192, &outLen);
}
free(L4->unCompress);
L4->unCompress = 0;
L4->unCompressLen = 0;
sendLen = outLen;
sendptr = Buffer;
L4->ReceivedAfterExpansion += outLen;
// Send first bit in input buffer. If still some left get new buffers for it
if (sendLen > 236)
sendLen = 236;
memcpy(L3MSG->L3SRCE, sendptr, sendLen); // Converting to DATAMESSAGE format
L3MSG->LENGTH = sendLen + MSGHDDRLEN + 1;
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
outLen -= sendLen;
sendptr += sendLen;
while (outLen > 0)
{
sendLen = outLen;
if (sendLen > 236)
sendLen = 236;
Msg = GetBuff();
if (Msg)
{
// Just ignore if no buffers - shouldn't happen
Msg->PID = 240;
Msg->PORT = savePort;
memcpy(Msg->L2DATA, sendptr, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1;
IFRM150(L4, Msg); // CHECK IF SETTING UP AND PASS ON
}
outLen -= sendLen;
sendptr += sendLen;
}
}
L4->L4ACKREQ = L4DELAY; // SEND INFO ACK AFTER L4DELAY (UNLESS I FRAME SENT) L4->L4ACKREQ = L4DELAY; // SEND INFO ACK AFTER L4DELAY (UNLESS I FRAME SENT)
REFRESHROUTE(L4);
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
// See if anything on reseq Q to process // See if anything on reseq Q to process
checkReseq:
if (L4->L4RESEQ_Q == 0) if (L4->L4RESEQ_Q == 0)
return; return;
@ -1991,13 +2456,13 @@ L4INFO_OK:
*Prev = Saved->Next; // CHAIN NEXT IN CHAIN TO PREVIOUS *Prev = Saved->Next; // CHAIN NEXT IN CHAIN TO PREVIOUS
OLDFRAMES++; // COUNT FOR STATS OLDFRAMES++; // COUNT FOR STATS
L3MSG = Saved; L3MSG = Saved;
Debugprintf("Processing Saved Message %d Address %x", L4->RXSEQNO, L3MSG); Debugprintf("L4 Processing Saved Message %d Address %x", L4->RXSEQNO, L3MSG);
goto L4INFO_OK; goto L4INFO_OK;
} }
Debugprintf("Message %d %x still on Reseq Queue", Saved->L4TXNO, Saved); Debugprintf("L4 Message %d %x still on Reseq Queue", Saved->L4TXNO, Saved);
Prev = &Saved; Prev = &Saved;
Saved = Saved->Next; Saved = Saved->Next;
@ -2010,7 +2475,9 @@ L4INFO_OK:
ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO); ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO);
REFRESHROUTE(L4); REFRESHROUTE(L4);
// Drop Through ReleaseBuffer(L3MSG);
return;
} }
// Unrecognised - Ignore // Unrecognised - Ignore
@ -2061,15 +2528,19 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
if (L4->RTT_TIMER) if (L4->RTT_TIMER)
{ {
// FRAME BEING TIMED HAS BEEN ACKED - UPDATE DEST RTT TIMER // FRAME BEING TIMED HAS BEEN ACKED - UPDATE DEST RTT TIMER
DEST = L4->L4TARGET.DEST; DEST = L4->L4TARGET.DEST;
RTT = GetTickCount() - L4->RTT_TIMER; RTT = GetTickCount() - L4->RTT_TIMER;
if (DEST->DEST_RTT == 0) if (RTT < 180000) // Sanity Check
DEST->DEST_RTT = RTT; {
else if (DEST->DEST_RTT == 0)
DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New DEST->DEST_RTT = RTT;
else
DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New
}
L4->RTT_TIMER = 0;
} }
} }
@ -2091,7 +2562,7 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
if ((L4->FLAGS & DISCPENDING) && L4->L4TX_Q == 0) if ((L4->FLAGS & DISCPENDING) && L4->L4TX_Q == 0)
{ {
// All Acked and DISC Pending, so send it // All Acked and DISC Pending, so send it
SENDL4DISC(L4); SENDL4DISC(L4);
return; return;
} }
@ -2100,13 +2571,13 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
// SEE IF CHOKE SET // SEE IF CHOKE SET
L4->FLAGS &= ~L4BUSY; L4->FLAGS &= ~L4BUSY;
if (L3MSG->L4FLAGS & L4BUSY) if (L3MSG->L4FLAGS & L4BUSY)
{ {
L4->FLAGS |= L3MSG->L4FLAGS & L4BUSY; // Get Busy flag from message L4->FLAGS |= L3MSG->L4FLAGS & L4BUSY; // Get Busy flag from message
if ((L3MSG->L4FLAGS & L4NAK) == 0) if ((L3MSG->L4FLAGS & L4NAK) == 0)
return; // Dont send while biust unless NAC received return; // Dont send while busy unless NAK received
} }
if (L3MSG->L4FLAGS & L4NAK) if (L3MSG->L4FLAGS & L4NAK)
@ -2114,10 +2585,10 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
// RETRANSMIT REQUESTED MESSAGE - WILL BE FIRST ON HOLD QUEUE // RETRANSMIT REQUESTED MESSAGE - WILL BE FIRST ON HOLD QUEUE
Msg = L4->L4HOLD_Q; Msg = L4->L4HOLD_Q;
if (Msg == 0) if (Msg == 0)
return; return;
Copy = GetBuff(); Copy = GetBuff();
if (Copy == 0) if (Copy == 0)
@ -2134,17 +2605,6 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
VOID SENDL4IACK(TRANSPORTENTRY * Session) VOID SENDL4IACK(TRANSPORTENTRY * Session)
{ {
// SEND INFO ACK // SEND INFO ACK
@ -2167,7 +2627,8 @@ VOID SENDL4IACK(TRANSPORTENTRY * Session)
MSG->L4TXNO = 0; MSG->L4TXNO = 0;
MSG->L4RXNO = Session->RXSEQNO; MSG->L4RXNO = Session->RXSEQNO;
Session->L4LASTACKED = Session->RXSEQNO; // SAVE LAST NUMBER ACKED Session->L4LASTACKED = Session->RXSEQNO; // SAVE LAST NUMBER ACKED
@ -2175,7 +2636,10 @@ VOID SENDL4IACK(TRANSPORTENTRY * Session)
MSG->LENGTH = MSGHDDRLEN + 22; MSG->LENGTH = MSGHDDRLEN + 22;
// Debugprintf("Sending L4 IACK %d %x", MSG->L4RXNO, MSG->L4FLAGS);
C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG); C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG);
} }

428
LinBPQ.c
View File

@ -21,7 +21,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include "bpqmail.h" #include "bpqmail.h"
#ifdef WIN32 #ifdef WIN32
#include <Iphlpapi.h> #include <Iphlpapi.h>
@ -45,7 +45,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
BOOL APIENTRY Rig_Init(); BOOL APIENTRY Rig_Init();
void GetSemaphore(struct SEM * Semaphore, int ID);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore); void FreeSemaphore(struct SEM * Semaphore);
VOID CopyConfigFile(char * ConfigName); VOID CopyConfigFile(char * ConfigName);
VOID SendMailForThread(VOID * Param); VOID SendMailForThread(VOID * Param);
@ -75,6 +79,10 @@ int upnpClose();
void SaveAIS(); void SaveAIS();
void initAIS(); void initAIS();
void DRATSPoll(); void DRATSPoll();
void RHPPoll();
VOID GetPGConfig();
void SendBBSDataToPktMap();
extern uint64_t timeLoadedMS; extern uint64_t timeLoadedMS;
@ -369,7 +377,51 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#else #else
#include <execinfo.h>
#include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig)
{
void *array[10];
size_t size;
char msg[] = "\nSIGSEGV Received\n";
write(STDERR_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack
size = backtrace(array, 10);
// print out all the frames to stderr
backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
exit(1);
}
static void abrthandler(int sig)
{
void *array[10];
size_t size;
char msg[] = "\nSIGABRT Received\n";
write(STDERR_FILENO, msg, strlen(msg));
write(STDOUT_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
exit(1);
}
static void sigterm_handler(int sig) static void sigterm_handler(int sig)
{ {
@ -459,9 +511,10 @@ VOID MonitorThread(void * x)
{ {
// It is stuck - try to release // It is stuck - try to release
Debugprintf ("Semaphore locked - Process ID = %d, Held By %d", Debugprintf ("Semaphore locked - Process ID = %d, Held By %d from %s Line %d",
Semaphore.SemProcessID, SemHeldByAPI); Semaphore.SemProcessID, SemHeldByAPI, Semaphore.File, Semaphore.Line);
Semaphore.Flag = 0; Semaphore.Flag = 0;
} }
@ -552,6 +605,8 @@ extern int POP3Timer;
#ifndef WIN32 #ifndef WIN32
#define _getch getchar #define _getch getchar
/** /**
@ -665,7 +720,7 @@ void ConTermPoll()
// Replace CR with CRLF // Replace CR with CRLF
printf(ptr); printf("%s", ptr);
if (ptr2) if (ptr2)
printf("\r\n"); printf("\r\n");
@ -715,7 +770,7 @@ void ConTermPoll()
} }
#include "getopt.h" #include <getopt.h>
static struct option long_options[] = static struct option long_options[] =
{ {
@ -736,6 +791,12 @@ char HelpScreen[] =
int Redirected = 0; int Redirected = 0;
static void segvhandler(int sig);
static void abrthandler(int sig);
void GetRestartData();
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
int i; int i;
@ -765,6 +826,10 @@ int main(int argc, char * argv[])
} }
#else #else
signal(SIGSEGV, segvhandler);
signal(SIGABRT, abrthandler);
setlinebuf(stdout); setlinebuf(stdout);
struct sigaction act; struct sigaction act;
openlog("LINBPQ", LOG_PID, LOG_DAEMON); openlog("LINBPQ", LOG_PID, LOG_DAEMON);
@ -789,6 +854,8 @@ int main(int argc, char * argv[])
printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring); printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
printf("%s\n", VerCopyright); printf("%s\n", VerCopyright);
srand(time(NULL));
// look for optarg format parameters // look for optarg format parameters
@ -814,7 +881,7 @@ int main(int argc, char * argv[])
{ {
case 'h': case 'h':
printf(HelpScreen); printf("%s", HelpScreen);
exit (0); exit (0);
case 'l': case 'l':
@ -1076,221 +1143,229 @@ int main(int argc, char * argv[])
BBSApplMask = 1<<(BBSApplNum-1); BBSApplMask = 1<<(BBSApplNum-1);
// See if we need to warn of possible problem with BaseDir moved by installer // See if we need to warn of possible problem with BaseDir moved by installer
sprintf(BaseDir, "%s", BPQDirectory); sprintf(BaseDir, "%s", BPQDirectory);
// Set up file and directory names // Set up file and directory names
strcpy(UserDatabasePath, BaseDir); strcpy(UserDatabasePath, BaseDir);
strcat(UserDatabasePath, "/"); strcat(UserDatabasePath, "/");
strcat(UserDatabasePath, UserDatabaseName); strcat(UserDatabasePath, UserDatabaseName);
strcpy(MsgDatabasePath, BaseDir); strcpy(MsgDatabasePath, BaseDir);
strcat(MsgDatabasePath, "/"); strcat(MsgDatabasePath, "/");
strcat(MsgDatabasePath, MsgDatabaseName); strcat(MsgDatabasePath, MsgDatabaseName);
strcpy(BIDDatabasePath, BaseDir); strcpy(BIDDatabasePath, BaseDir);
strcat(BIDDatabasePath, "/"); strcat(BIDDatabasePath, "/");
strcat(BIDDatabasePath, BIDDatabaseName); strcat(BIDDatabasePath, BIDDatabaseName);
strcpy(WPDatabasePath, BaseDir); strcpy(WPDatabasePath, BaseDir);
strcat(WPDatabasePath, "/"); strcat(WPDatabasePath, "/");
strcat(WPDatabasePath, WPDatabaseName); strcat(WPDatabasePath, WPDatabaseName);
strcpy(BadWordsPath, BaseDir); strcpy(BadWordsPath, BaseDir);
strcat(BadWordsPath, "/"); strcat(BadWordsPath, "/");
strcat(BadWordsPath, BadWordsName); strcat(BadWordsPath, BadWordsName);
strcpy(NTSAliasesPath, BaseDir); strcpy(NTSAliasesPath, BaseDir);
strcat(NTSAliasesPath, "/"); strcat(NTSAliasesPath, "/");
strcat(NTSAliasesPath, NTSAliasesName); strcat(NTSAliasesPath, NTSAliasesName);
strcpy(MailDir, BaseDir); strcpy(MailDir, BaseDir);
strcat(MailDir, "/"); strcat(MailDir, "/");
strcat(MailDir, "Mail"); strcat(MailDir, "Mail");
#ifdef WIN32 #ifdef WIN32
CreateDirectory(MailDir, NULL); // Just in case CreateDirectory(MailDir, NULL); // Just in case
#else #else
mkdir(MailDir, S_IRWXU | S_IRWXG | S_IRWXO); mkdir(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO); chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif #endif
// Make backup copies of Databases
// CopyConfigFile(ConfigName);
CopyBIDDatabase(); // Make backup copies of Databases
CopyMessageDatabase();
CopyUserDatabase();
CopyWPDatabase();
SetupMyHA(); // CopyConfigFile(ConfigName);
SetupFwdAliases();
SetupNTSAliases(NTSAliasesPath);
GetWPDatabase(); CopyBIDDatabase();
CopyMessageDatabase();
CopyUserDatabase();
CopyWPDatabase();
GetMessageDatabase(); SetupMyHA();
GetUserDatabase(); SetupFwdAliases();
GetBIDDatabase(); SetupNTSAliases(NTSAliasesPath);
GetBadWordFile();
GetHTMLForms();
// Make sure there is a user record for the BBS, with BBS bit set. GetWPDatabase();
user = LookupCall(BBSName); GetMessageDatabase();
GetUserDatabase();
GetBIDDatabase();
GetBadWordFile();
GetHTMLForms();
GetPGConfig();
GetRestartData();
if (user == NULL) // Make sure there is a user record for the BBS, with BBS bit set.
{
user = AllocateUserRecord(BBSName);
user->Temp = zalloc(sizeof (struct TempUserInfo));
}
if ((user->flags & F_BBS) == 0) user = LookupCall(BBSName);
{
// Not Defined as a BBS
if(SetupNewBBS(user))
user->flags |= F_BBS;
}
// if forwarding AMPR mail make sure User/BBS AMPR exists
if (SendAMPRDirect)
{
BOOL NeedSave = FALSE;
user = LookupCall("AMPR");
if (user == NULL) if (user == NULL)
{ {
user = AllocateUserRecord("AMPR"); user = AllocateUserRecord(BBSName);
user->Temp = zalloc(sizeof (struct TempUserInfo)); user->Temp = zalloc(sizeof (struct TempUserInfo));
NeedSave = TRUE;
} }
if ((user->flags & F_BBS) == 0) if ((user->flags & F_BBS) == 0)
{ {
// Not Defined as a BBS // Not Defined as a BBS
if (SetupNewBBS(user)) if(SetupNewBBS(user))
user->flags |= F_BBS; user->flags |= F_BBS;
NeedSave = TRUE;
} }
if (NeedSave) // if forwarding AMPR mail make sure User/BBS AMPR exists
SaveUserDatabase();
}
if (SendAMPRDirect)
// Make sure SYSOPCALL is set
if (SYSOPCall[0] == 0)
strcpy(SYSOPCall, BBSName);
// See if just want to add user (mainly for setup scripts)
if (argc == 5 && _stricmp(argv[1], "--adduser") == 0)
{
BOOL isBBS = FALSE;
char * response;
if (_stricmp(argv[4], "TRUE") == 0)
isBBS = TRUE;
printf("Adding User %s\r\n", argv[2]);
response = AddUser(argv[2], argv[3], isBBS);
printf("%s", response);
exit(0);
}
// Allocate Streams
strcpy(pgm, "BBS");
for (i=0; i < MaxStreams; i++)
{
conn = &Connections[i];
conn->BPQStream = FindFreeStream();
if (conn->BPQStream == 255) break;
NumberofStreams++;
// BPQSetHandle(conn->BPQStream, hWnd);
SetAppl(conn->BPQStream, (i == 0 && EnableUI) ? 0x82 : 2, BBSApplMask);
Disconnect(conn->BPQStream);
}
strcpy(pgm, "LINBPQ");
Debugprintf("POP3 Debug Before Init TCP Timer = %d", POP3Timer);
InitialiseTCP();
Debugprintf("POP3 Debug Before Init NNTP Timer = %d", POP3Timer);
InitialiseNNTP();
SetupListenSet(); // Master set of listening sockets
if (EnableUI || MailForInterval)
SetupUIInterface();
if (MailForInterval)
_beginthread(SendMailForThread, 0, 0);
// Calulate time to run Housekeeping
{
struct tm *tm;
time_t now;
now = time(NULL);
tm = gmtime(&now);
tm->tm_hour = MaintTime / 100;
tm->tm_min = MaintTime % 100;
tm->tm_sec = 0;
MaintClock = mktime(tm) - (time_t)_MYTIMEZONE;
while (MaintClock < now)
MaintClock += MaintInterval * 3600;
Debugprintf("Maint Clock %lld NOW %lld Time to HouseKeeping %lld", (long long)MaintClock, (long long)now, (long long)(MaintClock - now));
if (LastHouseKeepingTime)
{ {
if ((now - LastHouseKeepingTime) > MaintInterval * 3600) BOOL NeedSave = FALSE;
user = LookupCall("AMPR");
if (user == NULL)
{ {
DoHouseKeeping(FALSE); user = AllocateUserRecord("AMPR");
user->Temp = zalloc(sizeof (struct TempUserInfo));
NeedSave = TRUE;
} }
if ((user->flags & F_BBS) == 0)
{
// Not Defined as a BBS
if (SetupNewBBS(user))
user->flags |= F_BBS;
NeedSave = TRUE;
}
if (NeedSave)
SaveUserDatabase();
} }
for (i = optind; i < argc; i++)
// Make sure SYSOPCALL is set
if (SYSOPCall[0] == 0)
strcpy(SYSOPCall, BBSName);
// See if just want to add user (mainly for setup scripts)
if (argc == 5 && _stricmp(argv[1], "--adduser") == 0)
{ {
if (_stricmp(argv[i], "tidymail") == 0) BOOL isBBS = FALSE;
DeleteRedundantMessages(); char * response;
if (_stricmp(argv[i], "nohomebbs") == 0) if (_stricmp(argv[4], "TRUE") == 0)
DontNeedHomeBBS = TRUE; isBBS = TRUE;
printf("Adding User %s\r\n", argv[2]);
response = AddUser(argv[2], argv[3], isBBS);
printf("%s", response);
exit(0);
}
// Allocate Streams
strcpy(pgm, "BBS");
for (i=0; i < MaxStreams; i++)
{
conn = &Connections[i];
conn->BPQStream = FindFreeStream();
if (conn->BPQStream == 255) break;
NumberofStreams++;
// BPQSetHandle(conn->BPQStream, hWnd);
SetAppl(conn->BPQStream, (i == 0 && EnableUI) ? 0x82 : 2, BBSApplMask);
Disconnect(conn->BPQStream);
} }
printf("Mail Started\n"); strcpy(pgm, "LINBPQ");
Logprintf(LOG_BBS, NULL, '!', "Mail Starting");
} InitialiseTCP();
} InitialiseNNTP();
Debugprintf("POP3 Debug After Mail Init Timer = %d", POP3Timer); SetupListenSet(); // Master set of listening sockets
if (EnableUI || MailForInterval)
SetupUIInterface();
if (MailForInterval)
_beginthread(SendMailForThread, 0, 0);
// Calulate time to run Housekeeping
{
struct tm *tm;
time_t now;
now = time(NULL);
tm = gmtime(&now);
tm->tm_hour = MaintTime / 100;
tm->tm_min = MaintTime % 100;
tm->tm_sec = 0;
MaintClock = mktime(tm) - (time_t)_MYTIMEZONE;
while (MaintClock < now)
MaintClock += MaintInterval * 3600;
Debugprintf("Maint Clock %lld NOW %lld Time to HouseKeeping %lld", (long long)MaintClock, (long long)now, (long long)(MaintClock - now));
if (LastHouseKeepingTime)
{
if ((now - LastHouseKeepingTime) > MaintInterval * 3600)
{
DoHouseKeeping(FALSE);
}
}
for (i = optind; i < argc; i++)
{
if (_stricmp(argv[i], "tidymail") == 0)
DeleteRedundantMessages();
if (_stricmp(argv[i], "nohomebbs") == 0)
DontNeedHomeBBS = TRUE;
}
printf("Mail Started\n");
Logprintf(LOG_BBS, NULL, '!', "Mail Starting");
APIClock = 0;
SendBBSDataToPktMap();
}
}
if (NUMBEROFTNCPORTS) if (NUMBEROFTNCPORTS)
InitializeTNCEmulator(); InitializeTNCEmulator();
AGWActive = AGWAPIInit(); AGWActive = AGWAPIInit();
if (Redirected == 0)
ConTerm.BPQStream = FindFreeStream();
#ifndef WIN32 #ifndef WIN32
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
@ -1381,6 +1456,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
@ -1526,6 +1602,7 @@ int main(int argc, char * argv[])
Poll_AGW(); Poll_AGW();
DRATSPoll(); DRATSPoll();
RHPPoll();
HTTPTimer(); HTTPTimer();
@ -1557,13 +1634,15 @@ int main(int argc, char * argv[])
{ {
PollStreams(); PollStreams();
if ((Slowtimer % 20) == 0)
FWDTimerProc();
if (Slowtimer > 100) // 10 secs if (Slowtimer > 100) // 10 secs
{ {
time_t NOW = time(NULL); time_t NOW = time(NULL);
struct tm * tm; struct tm * tm;
TCPTimer(); TCPTimer();
FWDTimerProc();
BBSSlowTimer(); BBSSlowTimer();
if (MaintClock < NOW) if (MaintClock < NOW)
@ -1575,14 +1654,21 @@ int main(int argc, char * argv[])
DoHouseKeeping(FALSE); DoHouseKeeping(FALSE);
} }
if (APIClock < NOW)
{
SendBBSDataToPktMap();
APIClock = NOW + 7200; // Every 2 hours
}
tm = gmtime(&NOW); tm = gmtime(&NOW);
if (tm->tm_wday == 0) // Sunday if (tm->tm_wday == 0) // Sunday
{ {
if (GenerateTrafficReport && (LastTrafficTime + 86400) < NOW) if (GenerateTrafficReport && (LastTrafficTime + 86400) < NOW)
{ {
LastTrafficTime = NOW;
CreateBBSTrafficReport(); CreateBBSTrafficReport();
LastTrafficTime = NOW;
} }
} }
} }

1975
LinBPQ.c~

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "bpqmail.h" #include "bpqmail.h"
void SendMessageReadEvent(char * call, struct MsgInfo * Msg);
void MQTTMessageEvent(void* message);
VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len) VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int len)
{ {
Buffer[len] = 0; Buffer[len] = 0;
@ -86,6 +90,7 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
FBBputs(conn, ">\r"); FBBputs(conn, ">\r");
Msg->status = 'Y'; // Mark as read Msg->status = 'Y'; // Mark as read
SaveMessageDatabase(); SaveMessageDatabase();
SendMessageReadEvent(user->Call, Msg);
} }
else else
{ {
@ -195,6 +200,12 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
} }
conn->FwdMsg->Locked = 0; // Unlock conn->FwdMsg->Locked = 0; // Unlock
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
} }
return; return;
@ -278,7 +289,7 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
{ {
// Reverse forward request // Reverse forward request
// If we have just sent a nessage, Flag it as sent // If we have just sent a message, Flag it as sent
if (conn->FBBMsgsSent) if (conn->FBBMsgsSent)
{ {
@ -296,6 +307,11 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
conn->FwdMsg->Locked = 0; // Unlock conn->FwdMsg->Locked = 0; // Unlock
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
} }
@ -350,6 +366,11 @@ VOID ProcessMBLLine(CIRCUIT * conn, struct UserInfo * user, UCHAR* Buffer, int l
conn->FwdMsg->datechanged=time(NULL); conn->FwdMsg->datechanged=time(NULL);
} }
#ifndef NOMQTT
if (MQTT)
MQTTMessageEvent(conn->FwdMsg);
#endif
conn->UserPointer->ForwardingInfo->MsgCount--; conn->UserPointer->ForwardingInfo->MsgCount--;
} }

View File

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

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -28,7 +28,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "CHeaders.h" #include "cheaders.h"
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
@ -60,7 +60,7 @@ static void ConnecttoMPSKThread(void * portptr);
void CreateMHWindow(); void CreateMHWindow();
int Update_MH_List(struct in_addr ipad, char * call, char proto); int Update_MH_List(struct in_addr ipad, char * call, char proto);
static int ConnecttoMPSK(); static int ConnecttoMPSK(int port);
static int ProcessReceivedData(int bpqport); static int ProcessReceivedData(int bpqport);
static int ProcessLine(char * buf, int Port); static int ProcessLine(char * buf, int Port);
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
@ -71,8 +71,6 @@ static VOID SendData(struct TNCINFO * TNC, char * Msg, int MsgLen);
static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg); static VOID DoMonitorHddr(struct TNCINFO * TNC, struct AGWHEADER * RXHeader, UCHAR * Msg);
VOID SendRPBeacon(struct TNCINFO * TNC); VOID SendRPBeacon(struct TNCINFO * TNC);
char * strlop(char * buf, char delim);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
#define MAXMPSKPORTS 16 #define MAXMPSKPORTS 16
@ -409,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))
{ {
@ -712,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;
@ -1317,7 +1318,7 @@ VOID ProcessMSPKData(struct TNCINFO * TNC)
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr); C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
STREAM->BytesRXed += TNC->DataLen; STREAM->bytesRXed += TNC->DataLen;
} }
TNC->DataLen = 0; TNC->DataLen = 0;
@ -1387,7 +1388,7 @@ DataLoop:
STREAM->Connected = TRUE; STREAM->Connected = TRUE;
STREAM->Connecting = FALSE; STREAM->Connecting = FALSE;
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = 0; STREAM->bytesRXed = STREAM->bytesTXed = 0;
buffptr = GetBuff(); buffptr = GetBuff();
if (buffptr) if (buffptr)
@ -1402,7 +1403,7 @@ DataLoop:
STREAM->Connected = TRUE; STREAM->Connected = TRUE;
STREAM->ConnectTime = time(NULL); STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = 0; STREAM->bytesRXed = STREAM->bytesTXed = 0;
UpdateMH(TNC, CallFrom, '+', 'I'); UpdateMH(TNC, CallFrom, '+', 'I');
@ -1483,7 +1484,7 @@ VOID SendData(struct TNCINFO * TNC, char * Msg, int MsgLen)
char * inptr = Msg; char * inptr = Msg;
SOCKET sock = TNCInfo[MasterPort[TNC->Port]]->TCPSock; SOCKET sock = TNCInfo[MasterPort[TNC->Port]]->TCPSock;
TNC->Streams[0].BytesTXed += MsgLen; TNC->Streams[0].bytesTXed += MsgLen;
for (n = 0; n < MsgLen; n++) for (n = 0; n < MsgLen; n++)
{ {
@ -1541,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);

View File

@ -351,7 +351,7 @@ VOID DoSetIdleTime(CIRCUIT * conn, struct UserInfo * user, char * Arg1, char * C
return; return;
} }
nodeprintf(conn, "Idle Tine set to %d\r", IdleTime); nodeprintf(conn, "Idle Time set to %d\r", IdleTime);
SendPrompt(conn, user); SendPrompt(conn, user);
return; return;
} }

View File

@ -43,6 +43,7 @@ struct SEM AllocSemaphore = {0, 0};
struct SEM ConSemaphore = {0, 0}; struct SEM ConSemaphore = {0, 0};
struct SEM Semaphore = {0, 0}; struct SEM Semaphore = {0, 0};
struct SEM OutputSEM = {0, 0}; struct SEM OutputSEM = {0, 0};
struct SEM ConfigSEM = {0, 0};
struct UserInfo ** UserRecPtr=NULL; struct UserInfo ** UserRecPtr=NULL;
int NumberofUsers=0; int NumberofUsers=0;
@ -132,7 +133,7 @@ char HRoute[100];
char AMPRDomain[100]; char AMPRDomain[100];
BOOL SendAMPRDirect = 0; BOOL SendAMPRDirect = 0;
char SignoffMsg[100]; char SignoffMsg[120];
char AbortedMsg[100]="\rOutput aborted\r"; char AbortedMsg[100]="\rOutput aborted\r";
@ -204,6 +205,7 @@ int MailForInterval = 0;
char zeros[NBMASK]; // For forward bitmask tests char zeros[NBMASK]; // For forward bitmask tests
time_t MaintClock; // Time to run housekeeping time_t MaintClock; // Time to run housekeeping
time_t APIClock; // Time to sent to MOLTE's Database
struct MsgInfo * MsgnotoMsg[100000]; // Message Number to Message Slot List. struct MsgInfo * MsgnotoMsg[100000]; // Message Number to Message Slot List.

Binary file not shown.

View File

@ -1,631 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="LinBPQ"
ProjectGUID="{3766AA10-C777-4ED8-A83D-F1452DE9B666}"
RootNamespace="MailNode"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CKernel;..\CommonSource;..\CInclude"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel32.lib WS2_32.Lib ..\lib\libconfigd.lib DbgHelp.lib setupapi.lib miniupnpc.lib zlibstat.lib"
OutputFile="c:\LINBPQ\$(ProjectName).exe"
LinkIncremental="2"
IgnoreDefaultLibraryNames=""
GenerateDebugInformation="true"
GenerateMapFile="true"
MapFileName="c:\linbpq\linmail.map"
SubSystem="1"
StackReserveSize="4000000"
StackCommitSize="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\CKernel;..\CommonSource;..\CInclude"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="kernel32.lib WS2_32.Lib ..\lib\libconfig.lib DbgHelp.lib Setupapi.lib miniupnpc.lib zlibstat.lib"
OutputFile="c:\devprogs\bpq32\LinBPQ.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
HeapReserveSize="5000000"
StackReserveSize="10000000"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\CommonSource\adif.c"
>
</File>
<File
RelativePath="..\CommonSource\AEAPactor.c"
>
</File>
<File
RelativePath="..\CommonSource\AGWAPI.c"
>
</File>
<File
RelativePath="..\CommonSource\AGWMoncode.c"
>
</File>
<File
RelativePath=".\AISCommon.c"
>
</File>
<File
RelativePath="..\CommonSource\Alloc.c"
>
</File>
<File
RelativePath="..\CommonSource\APRSCode.c"
>
</File>
<File
RelativePath=".\APRSIconData.c"
>
</File>
<File
RelativePath=".\APRSStdPages.c"
>
</File>
<File
RelativePath="..\CommonSource\ARDOP.c"
>
</File>
<File
RelativePath=".\base64.c"
>
</File>
<File
RelativePath="..\CommonSource\BBSHTMLConfig.c"
>
</File>
<File
RelativePath="..\CommonSource\BBSUtilities.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="0"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
AssemblerOutput="2"
ObjectFile="$(IntDir)\"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\bpqaxip.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqether.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqhdlc.c"
>
</File>
<File
RelativePath="..\CommonSource\BPQINP3.c"
>
</File>
<File
RelativePath="..\CommonSource\BPQNRR.c"
>
</File>
<File
RelativePath="..\CommonSource\BPQtoAGW.c"
>
</File>
<File
RelativePath="..\CommonSource\bpqvkiss.c"
>
</File>
<File
RelativePath="..\CommonSource\ChatHTMLConfig.c"
>
</File>
<File
RelativePath="..\CommonSource\cMain.c"
>
</File>
<File
RelativePath="..\CommonSource\Cmd.c"
>
</File>
<File
RelativePath="..\CommonSource\CMSAuth.c"
>
</File>
<File
RelativePath="..\CommonSource\CommonCode.c"
>
</File>
<File
RelativePath="..\CommonSource\compatbits.c"
>
</File>
<File
RelativePath="..\CommonSource\config.c"
>
</File>
<File
RelativePath="..\CommonSource\datadefs.c"
>
</File>
<File
RelativePath=".\DRATS.c"
>
</File>
<File
RelativePath=".\Events.c"
>
</File>
<File
RelativePath="..\CommonSource\FBBRoutines.c"
>
</File>
<File
RelativePath="..\CommonSource\FLDigi.c"
>
</File>
<File
RelativePath=".\FreeDATA.c"
>
</File>
<File
RelativePath=".\getopt.c"
>
</File>
<File
RelativePath="..\CommonSource\HALDriver.c"
>
</File>
<File
RelativePath="..\CommonSource\HanksRT.c"
>
</File>
<File
RelativePath="..\CommonSource\HFCommon.c"
>
</File>
<File
RelativePath="..\CommonSource\hid.c"
>
</File>
<File
RelativePath="..\CommonSource\Housekeeping.c"
>
</File>
<File
RelativePath=".\HSMODEM.c"
>
</File>
<File
RelativePath="..\CommonSource\HTMLCommonCode.c"
>
</File>
<File
RelativePath="..\CommonSource\HTTPcode.c"
>
</File>
<File
RelativePath="..\CommonSource\IPCode.c"
>
</File>
<File
RelativePath="..\CommonSource\KAMPactor.c"
>
</File>
<File
RelativePath="..\CommonSource\kiss.c"
>
</File>
<File
RelativePath="..\CommonSource\KISSHF.c"
>
</File>
<File
RelativePath="..\CommonSource\L2Code.c"
>
</File>
<File
RelativePath="..\CommonSource\L3Code.c"
>
</File>
<File
RelativePath="..\CommonSource\L4Code.c"
>
</File>
<File
RelativePath="..\CommonSource\LinBPQ.c"
>
</File>
<File
RelativePath="..\CommonSource\LzFind.c"
>
</File>
<File
RelativePath="..\CommonSource\lzhuf32.c"
>
</File>
<File
RelativePath="..\CommonSource\LzmaDec.c"
>
</File>
<File
RelativePath="..\CommonSource\LzmaEnc.c"
>
</File>
<File
RelativePath="..\CommonSource\LzmaLib.c"
>
</File>
<File
RelativePath="..\CommonSource\MailCommands.c"
>
</File>
<File
RelativePath="..\CommonSource\MailDataDefs.c"
>
</File>
<File
RelativePath="..\CommonSource\MailRouting.c"
>
</File>
<File
RelativePath="..\CommonSource\MailTCP.c"
>
</File>
<File
RelativePath="..\CommonSource\MBLRoutines.c"
>
</File>
<File
RelativePath="..\CommonSource\md5.c"
>
</File>
<File
RelativePath="..\CommonSource\Moncode.c"
>
</File>
<File
RelativePath="..\CommonSource\Multicast.c"
>
</File>
<File
RelativePath="..\CommonSource\MULTIPSK.c"
>
</File>
<File
RelativePath="..\CommonSource\NNTPRoutines.c"
>
</File>
<File
RelativePath="..\CommonSource\pibits.c"
>
</File>
<File
RelativePath=".\png.c"
>
</File>
<File
RelativePath=".\png.h"
>
</File>
<File
RelativePath=".\pngerror.c"
>
</File>
<File
RelativePath=".\pnggccrd.c"
>
</File>
<File
RelativePath=".\pngget.c"
>
</File>
<File
RelativePath=".\pngmem.c"
>
</File>
<File
RelativePath=".\pngpread.c"
>
</File>
<File
RelativePath=".\pngread.c"
>
</File>
<File
RelativePath=".\pngrio.c"
>
</File>
<File
RelativePath=".\pngrtran.c"
>
</File>
<File
RelativePath=".\pngrutil.c"
>
</File>
<File
RelativePath=".\pngset.c"
>
</File>
<File
RelativePath=".\pngtrans.c"
>
</File>
<File
RelativePath=".\pngvcrd.c"
>
</File>
<File
RelativePath=".\pngwio.c"
>
</File>
<File
RelativePath=".\pngwrite.c"
>
</File>
<File
RelativePath=".\pngwtran.c"
>
</File>
<File
RelativePath=".\pngwutil.c"
>
</File>
<File
RelativePath="..\CommonSource\RigControl.c"
>
</File>
<File
RelativePath="..\CommonSource\SCSPactor.c"
>
</File>
<File
RelativePath="..\CommonSource\SCSTrackeMulti.c"
>
</File>
<File
RelativePath="..\CommonSource\SCSTracker.c"
>
</File>
<File
RelativePath="..\CommonSource\SerialPort.c"
>
</File>
<File
RelativePath="..\CommonSource\TelnetV6.c"
>
</File>
<File
RelativePath="..\CommonSource\TNCCode.c"
>
</File>
<File
RelativePath="..\CommonSource\TNCEmulators.c"
>
</File>
<File
RelativePath="..\CommonSource\UIRoutines.c"
>
</File>
<File
RelativePath=".\upnp.c"
>
</File>
<File
RelativePath="..\CommonSource\utf8Routines.c"
>
</File>
<File
RelativePath="..\CommonSource\UZ7HODrv.c"
>
</File>
<File
RelativePath="..\CommonSource\V4.c"
>
</File>
<File
RelativePath="..\CommonSource\VARA.c"
>
</File>
<File
RelativePath="..\CommonSource\WebMail.c"
>
</File>
<File
RelativePath="..\CommonSource\WINMOR.c"
>
</File>
<File
RelativePath=".\WinRPR.c"
>
</File>
<File
RelativePath="..\CommonSource\WPRoutines.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-MHE5LO8"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-MHE5LO8"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="C:\linbpq"
CommandArguments="-h"
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="DESKTOP-TGEL8RC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="HPLAPTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="HPLAPTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="c:\linbpq"
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,292 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectName>LinBPQ</ProjectName>
<ProjectGuid>{3766AA10-C777-4ED8-A83D-F1452DE9B666}</ProjectGuid>
<RootNamespace>MailNode</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>NotSet</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>15.0.28307.799</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(Configuration)\</IntDir>
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(Configuration)\</IntDir>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\CKernel;..\CommonSource;..\CInclude;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>kernel32.lib;WS2_32.Lib;..\lib\libconfigd.lib;DbgHelp.lib;setupapi.lib;miniupnpc.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\LINBPQ\$(ProjectName).exe</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>c:\linbpq\linmail.map</MapFileName>
<SubSystem>Console</SubSystem>
<StackReserveSize>4000000</StackReserveSize>
<StackCommitSize>0</StackCommitSize>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\CKernel;..\CommonSource;..\CInclude;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;LINBPQ;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>kernel32.lib;WS2_32.Lib;..\lib\libconfigd.lib;DbgHelp.lib;setupapi.lib;miniupnpc.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\LINBPQ\$(ProjectName).exe</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>c:\linbpq\linmail.map</MapFileName>
<SubSystem>Console</SubSystem>
<StackReserveSize>4000000</StackReserveSize>
<StackCommitSize>0</StackCommitSize>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>..\CKernel;..\CommonSource;..\CInclude;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader />
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>kernel32.lib;WS2_32.Lib;..\lib\libconfig.lib;DbgHelp.lib;Setupapi.lib;miniupnpc.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\devprogs\bpq32\LinBPQ.exe</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<HeapReserveSize>5000000</HeapReserveSize>
<StackReserveSize>10000000</StackReserveSize>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<TargetMachine>MachineX86</TargetMachine>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>..\CKernel;..\CommonSource;..\CInclude;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>kernel32.lib;WS2_32.Lib;..\lib\libconfig.lib;DbgHelp.lib;Setupapi.lib;miniupnpc.lib;zlibstat.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>c:\devprogs\bpq32\LinBPQ.exe</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<HeapReserveSize>5000000</HeapReserveSize>
<StackReserveSize>10000000</StackReserveSize>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="adif.c" />
<ClCompile Include="AEAPactor.c" />
<ClCompile Include="AGWAPI.c" />
<ClCompile Include="AGWMoncode.c" />
<ClCompile Include="AISCommon.c" />
<ClCompile Include="Alloc.c" />
<ClCompile Include="APRSCode.c" />
<ClCompile Include="APRSIconData.c" />
<ClCompile Include="APRSStdPages.c" />
<ClCompile Include="ARDOP.c" />
<ClCompile Include="base64.c" />
<ClCompile Include="BBSHTMLConfig.c" />
<ClCompile Include="BBSUtilities.c">
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</AssemblerOutput>
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</AssemblerOutput>
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">All</AssemblerOutput>
<AssemblerOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">All</AssemblerOutput>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)</ObjectFileName>
</ClCompile>
<ClCompile Include="bpqaxip.c" />
<ClCompile Include="bpqether.c" />
<ClCompile Include="bpqhdlc.c" />
<ClCompile Include="BPQINP3.c" />
<ClCompile Include="BPQNRR.c" />
<ClCompile Include="BPQtoAGW.c" />
<ClCompile Include="bpqvkiss.c" />
<ClCompile Include="ChatHTMLConfig.c" />
<ClCompile Include="cMain.c" />
<ClCompile Include="Cmd.c" />
<ClCompile Include="CMSAuth.c" />
<ClCompile Include="CommonCode.c" />
<ClCompile Include="compatbits.c" />
<ClCompile Include="config.c" />
<ClCompile Include="datadefs.c" />
<ClCompile Include="DRATS.c" />
<ClCompile Include="Events.c" />
<ClCompile Include="FBBRoutines.c" />
<ClCompile Include="FLDigi.c" />
<ClCompile Include="FreeDATA.c" />
<ClCompile Include="HALDriver.c" />
<ClCompile Include="HanksRT.c" />
<ClCompile Include="HFCommon.c" />
<ClCompile Include="hid.c" />
<ClCompile Include="Housekeeping.c" />
<ClCompile Include="HSMODEM.c" />
<ClCompile Include="HTMLCommonCode.c" />
<ClCompile Include="HTTPcode.c" />
<ClCompile Include="IPCode.c" />
<ClCompile Include="KAMPactor.c" />
<ClCompile Include="kiss.c" />
<ClCompile Include="KISSHF.c" />
<ClCompile Include="L2Code.c" />
<ClCompile Include="L3Code.c" />
<ClCompile Include="L4Code.c" />
<ClCompile Include="LinBPQ.c" />
<ClCompile Include="LzFind.c" />
<ClCompile Include="lzhuf32.c" />
<ClCompile Include="LzmaDec.c" />
<ClCompile Include="LzmaEnc.c" />
<ClCompile Include="LzmaLib.c" />
<ClCompile Include="MailCommands.c" />
<ClCompile Include="MailDataDefs.c" />
<ClCompile Include="MailRouting.c" />
<ClCompile Include="MailTCP.c" />
<ClCompile Include="MBLRoutines.c" />
<ClCompile Include="md5.c" />
<ClCompile Include="Moncode.c" />
<ClCompile Include="Multicast.c" />
<ClCompile Include="MULTIPSK.c" />
<ClCompile Include="NNTPRoutines.c" />
<ClCompile Include="pibits.c" />
<ClCompile Include="png.c" />
<ClCompile Include="pngerror.c" />
<ClCompile Include="pnggccrd.c" />
<ClCompile Include="pngget.c" />
<ClCompile Include="pngmem.c" />
<ClCompile Include="pngpread.c" />
<ClCompile Include="pngread.c" />
<ClCompile Include="pngrio.c" />
<ClCompile Include="pngrtran.c" />
<ClCompile Include="pngrutil.c" />
<ClCompile Include="pngset.c" />
<ClCompile Include="pngtrans.c" />
<ClCompile Include="pngvcrd.c" />
<ClCompile Include="pngwio.c" />
<ClCompile Include="pngwrite.c" />
<ClCompile Include="pngwtran.c" />
<ClCompile Include="pngwutil.c" />
<ClCompile Include="RigControl.c" />
<ClCompile Include="SCSPactor.c" />
<ClCompile Include="SCSTrackeMulti.c" />
<ClCompile Include="SCSTracker.c" />
<ClCompile Include="SerialPort.c" />
<ClCompile Include="TelnetV6.c" />
<ClCompile Include="TNCCode.c" />
<ClCompile Include="TNCEmulators.c" />
<ClCompile Include="UIRoutines.c" />
<ClCompile Include="upnp.c" />
<ClCompile Include="utf8Routines.c" />
<ClCompile Include="UZ7HODrv.c" />
<ClCompile Include="V4.c" />
<ClCompile Include="VARA.c" />
<ClCompile Include="WebMail.c" />
<ClCompile Include="WINMOR.c" />
<ClCompile Include="WinRPR.c" />
<ClCompile Include="WPRoutines.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="png.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,324 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="adif.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AEAPactor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AGWAPI.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AGWMoncode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AISCommon.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Alloc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="APRSCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="APRSIconData.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="APRSStdPages.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ARDOP.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="base64.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BBSHTMLConfig.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BBSUtilities.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqaxip.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqether.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqhdlc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQINP3.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQNRR.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BPQtoAGW.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="bpqvkiss.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ChatHTMLConfig.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="cMain.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Cmd.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CMSAuth.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CommonCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="compatbits.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="config.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="datadefs.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DRATS.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Events.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FBBRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FLDigi.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FreeDATA.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HALDriver.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HanksRT.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HFCommon.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="hid.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Housekeeping.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HSMODEM.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HTMLCommonCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="HTTPcode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="IPCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="KAMPactor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="kiss.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="KISSHF.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="L2Code.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="L3Code.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="L4Code.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LinBPQ.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzFind.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="lzhuf32.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzmaDec.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzmaEnc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="LzmaLib.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailCommands.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailDataDefs.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailRouting.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MailTCP.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MBLRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="md5.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Moncode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Multicast.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MULTIPSK.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="NNTPRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pibits.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="png.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngerror.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pnggccrd.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngget.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngmem.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngpread.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngread.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngrio.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngrtran.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngrutil.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngset.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngtrans.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngvcrd.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngwio.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngwrite.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngwtran.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pngwutil.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RigControl.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SCSPactor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SCSTrackeMulti.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SCSTracker.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SerialPort.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TelnetV6.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TNCCode.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TNCEmulators.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="UIRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="upnp.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="utf8Routines.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="UZ7HODrv.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="V4.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="VARA.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WebMail.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WINMOR.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WinRPR.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="WPRoutines.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="png.h">
<Filter>Source Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More