Compare commits

..

165 commits

Author SHA1 Message Date
Hibby e569b24f9a Changelog! 2025-10-24 00:48:59 +01:00
Hibby 272c31f62b Refresh patches with gbp pq! 2025-10-24 00:40:43 +01:00
Hibby f99a060918 Update upstream source from tag 'upstream/6.0.25.8+repack'
Update to upstream version '6.0.25.8+repack'
with Debian dir 34f11488df
2025-10-24 00:36:53 +01:00
Hibby 453f162d22 New upstream version 6.0.25.8+repack 2025-10-24 00:36:48 +01:00
Hibby 13c0b79af7 Don't forget about the changelog 2025-10-10 23:55:55 +01:00
Hibby 2e55f0a4ca Build on latest gcc standards 2025-10-10 23:54:35 +01:00
Hibby acbaf26ac1 New upstream 2025-10-10 23:51:40 +01:00
Hibby 70d9b41cc1 Update upstream source from tag 'upstream/6.0.25.06+repack'
Update to upstream version '6.0.25.06+repack'
with Debian dir 0466cb7b03
2025-10-10 23:37:36 +01:00
Hibby 96ac3e4a36 New upstream version 6.0.25.06+repack 2025-10-10 23:37:31 +01:00
Hibby c0425ff0e2 Migrate patches tp gbp pq 2025-09-20 15:58:22 +01:00
Hibby e4d8eadb91 Set c standard, it builds! 2025-09-20 15:41:51 +01:00
Hibby ac03394a07
First work on new version 2025-09-09 22:10:43 +01:00
Hibby d0f299bc02 Update upstream source from tag 'upstream/6.0.25.1+repack'
Update to upstream version '6.0.25.1+repack'
with Debian dir 5c600492d3
2025-09-04 22:52:15 +01:00
Hibby 7c796758d1 New upstream version 6.0.25.1+repack 2025-09-04 22:52:12 +01:00
Hibby 78f78927ab
Release new version 2025-08-17 22:40:01 +01:00
Hibby 27d95452b1 Update upstream source from tag 'upstream/6.0.24.82+repack'
Update to upstream version '6.0.24.82+repack'
with Debian dir a145ad04db
2025-08-17 22:31:33 +01:00
Hibby e925e16114 New upstream version 6.0.24.82+repack 2025-08-17 22:31:27 +01:00
Hibby d97d9d821b
Commit before next update! 2025-08-17 22:30:20 +01:00
Hibby a6b3c4bdc9 Update upstream source from tag 'upstream/6.0.24.80+repack'
Update to upstream version '6.0.24.80+repack'
with Debian dir 9e943f8d36
2025-08-12 20:09:07 +01:00
Hibby 3e1cbdfa4d New upstream version 6.0.24.80+repack 2025-08-12 20:09:04 +01:00
Hibby 7a5122a60f
Changelog for release, makefile patch refresh 2025-07-31 01:31:52 +01:00
Hibby 0013c3199a Update upstream source from tag 'upstream/6.0.24.78+repack'
Update to upstream version '6.0.24.78+repack'
with Debian dir 819c1fdecb
2025-07-31 01:28:57 +01:00
Hibby fa3201d982 New upstream version 6.0.24.78+repack 2025-07-31 01:28:54 +01:00
Hibby 5d30fbc104
New files to exclude 2025-07-31 01:28:13 +01:00
Hibby e21707174e
Release! 2025-07-22 21:52:16 +01:00
Hibby 26324bdc39
First build 2025-07-22 21:44:33 +01:00
Hibby 1cc87cf766 Update upstream source from tag 'upstream/6.0.24.77+repack'
Update to upstream version '6.0.24.77+repack'
with Debian dir bbbd57413e
2025-07-22 20:57:03 +01:00
Hibby 1f40ff4a07 New upstream version 6.0.24.77+repack 2025-07-22 20:56:59 +01:00
Hibby 30b1e26a04
Did a port on minibuildd for +1, this is technically +2 2025-07-16 19:16:00 +01:00
Hibby 31bda6ce76
Trixie release 2025-07-16 19:11:08 +01:00
Hibby d2c3489aef
Release 2025-07-15 01:11:11 +01:00
Hibby 6371d5385a Update upstream source from tag 'upstream/6.0.24.75+repack'
Update to upstream version '6.0.24.75+repack'
with Debian dir 8aa30a6de8
2025-07-14 23:14:14 +01:00
Hibby b2315840b2 New upstream version 6.0.24.75+repack 2025-07-14 23:14:11 +01:00
Hibby 8d3874ec4e
Update d/copyright to ignore svn 2025-07-14 23:12:11 +01:00
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 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 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 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 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 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 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 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 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 8a18ca1868
pull more files out, update watch for repack 2024-11-29 12:55:39 +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 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 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 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 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 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 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 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 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 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 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
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 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 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 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 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
125 changed files with 9442 additions and 44265 deletions

139
.rej
View file

@ -1,139 +0,0 @@
--- APRSCode.c
+++ APRSCode.c
@@ -3674,7 +3674,7 @@
if (ptr1)
*ptr1 = 0;
-// Debugprintf("Duplicate Message supressed %s", Msg);
+// Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate
}
}
--- BPQChat.rc
+++ BPQChat.rc
@@ -162,7 +162,7 @@
WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER
- LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
+ LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24
END
--- BPQMail.rc
+++ BPQMail.rc
@@ -1045,7 +1045,7 @@
CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
- CONTROL "Supress Mailing of Housekeeping Results",
+ CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
--- HanksRT.c
+++ HanksRT.c
@@ -1186,7 +1186,7 @@
// Duplicate, so discard, but save time
DupInfo[i].DupTime = Now;
- Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
+ Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate
}
--- RigControl.c
+++ RigControl.c
@@ -8385,7 +8385,7 @@
switch (Msg[0])
{
- case 'f': // Get Freqency
+ case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep);
return 0;
--- UZ7HODrv.c
+++ UZ7HODrv.c
@@ -374,7 +374,7 @@
{
// Read Freq
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1;
}
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}
--- WinRPRHelper.c
+++ WinRPRHelper.c
@@ -111,7 +111,7 @@
if (argc < 3)
{
- printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
+ printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n");
--- config.c
+++ config.c
@@ -649,7 +649,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
- Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
+ Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf("");
--- kiss.c
+++ kiss.c
@@ -1485,7 +1485,7 @@
}
}
else
- Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",
+ Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",
KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
goto SeeifMore; // SEE IF ANYTHING ELSE
--- templatedefs.c
+++ templatedefs.c
@@ -1165,7 +1165,7 @@
"Send Non-delivery Notifications<br>\r\n"
"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
" <br />\r\n"
- "Supress Mailing of<br>\r\n"
+ "Suppress Mailing of<br>\r\n"
"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"<div style=\"text-align: center;\"><input class='btn' name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
@@ -1454,7 +1454,7 @@
"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
- "seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
+ "separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
"<br></div>\n"
--- WebMail.c
+++ WebMail.c
@@ -2020,7 +2020,7 @@
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' "
- "value='Include Orignal Msg'>";
+ "value='Include Original Msg'>";
char Temp[1024];
char ReplyAddr[128];

View file

@ -1412,10 +1412,11 @@ VOID * SIXPACKExtInit(EXTPORTDATA * PortEntry)
TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo)); TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SIXPACK; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SIXPACK;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View file

@ -382,7 +382,8 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_AEA; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
TNC->TEXTMODE = FALSE; TNC->TEXTMODE = FALSE;
@ -390,8 +391,6 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->InitScript = _strupr(TNC->InitScript); TNC->InitScript = _strupr(TNC->InitScript);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View file

@ -36,7 +36,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
struct AGWHeader struct AGWHeader
{ {
unsigned int Port; uint8_t Port;
uint8_t filler1[3];
unsigned char DataKind; unsigned char DataKind;
unsigned char filler2; unsigned char filler2;
unsigned char PID; unsigned char PID;
@ -128,7 +129,7 @@ int DataSocket_Write(struct AGWSocketConnectionInfo * sockptr, SOCKET sock);
int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr); int AGWGetSessionKey(char * key, struct AGWSocketConnectionInfo * sockptr);
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr); int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr);
int SendDataToAppl(int Stream, byte * Buffer, int Length); int SendDataToAppl(int Stream, byte * Buffer, int Length);
int InternalAGWDecodeFrame(char * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes); int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int doNodes);
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr); int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length); int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
int ShowApps(); int ShowApps();
@ -720,7 +721,7 @@ int AGWDoMonitorData()
RawLen = monbuff->LENGTH; RawLen = monbuff->LENGTH;
if (RawLen < 7 || RawLen > 350) if (RawLen < MSGHDDRLEN || RawLen > 350)
{ {
ReleaseBuffer(monbuff); ReleaseBuffer(monbuff);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
@ -734,12 +735,16 @@ int AGWDoMonitorData()
ReleaseBuffer(monbuff); ReleaseBuffer(monbuff);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
// Set monbuff to point to the copy
monbuff = (MESSAGE *)Buffer;
//' 4 byte chain //' 4 byte chain
//' 1 byte port - top bit = transmit //' 1 byte port - top bit = transmit
//' 2 byte length (LO-HI) //' 2 byte length (LO-HI)
Port = Buffer[4]; Port = monbuff->PORT;
if (Port > 127) if (Port > 127)
{ {
@ -751,6 +756,12 @@ int AGWDoMonitorData()
RXFlag = TRUE; RXFlag = TRUE;
} }
if (Port == 0)
{
Debugprintf("AGWMON Port number is zero");
return 0;
}
// Can now have different mon flags per connection, so need to run decode for each socket // Can now have different mon flags per connection, so need to run decode for each socket
for (n = 1; n<= CurrentSockets; n++) for (n = 1; n<= CurrentSockets; n++)
@ -759,7 +770,7 @@ int AGWDoMonitorData()
if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag)) if (sockptr->SocketActive && sockptr->MonFlag && (RXFlag || LoopMonFlag))
{ {
Length = InternalAGWDecodeFrame(Buffer, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes); Length = InternalAGWDecodeFrame(monbuff, AGWBuffer, Stamp, &Frametype, sockptr->useLocalTime, sockptr->doNodes);
if (Length > 0) if (Length > 0)
{ {
@ -803,7 +814,7 @@ int AGWDoMonitorData()
} }
} }
RawLen = RawLen - 6; RawLen = RawLen - (MSGHDDRLEN - 1); // One more for KISS control
if (RXFlag || Loopflag) // Send transmitted frames if requested if (RXFlag || Loopflag) // Send transmitted frames if requested
{ {
@ -811,8 +822,12 @@ int AGWDoMonitorData()
// //
// Send raw data to any sockets that have requested Raw frames // Send raw data to any sockets that have requested Raw frames
// //
Buffer[6]=0; // Format is ax.25 packet prceeded by a KISS command byte 00 for channel 1 0x10 for channel 2 etc
// As this is an application API I think all should go as Port 1
Buffer[MSGHDDRLEN - 1] = 0; // Just in case big-endian
AGWTXHeader.Port = Port - 1; // AGW Ports start from 0 AGWTXHeader.Port = Port - 1; // AGW Ports start from 0
AGWTXHeader.DataKind = 'K'; AGWTXHeader.DataKind = 'K';
@ -824,14 +839,12 @@ int AGWDoMonitorData()
sockptr=&Sockets[n]; sockptr=&Sockets[n];
if (sockptr->SocketActive && sockptr->RawFlag) if (sockptr->SocketActive && sockptr->RawFlag)
SendRawPacket(sockptr, &Buffer[6], RawLen); SendRawPacket(sockptr, &Buffer[MSGHDDRLEN - 1], RawLen);
} }
} }
} }
return 0;
return 0;
} }
int DeleteConnection(struct BPQConnectionInfo * Con) int DeleteConnection(struct BPQConnectionInfo * Con)
@ -1128,6 +1141,7 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr) int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
{ {
int AGWVersion[2]={2003,999}; int AGWVersion[2]={2003,999};
byte AGWPortCaps[12] = { 0, 255, 30, 10, 63, 10, 4, 0, 1, 0, 0, 0 };
char AGWRegReply[1]; char AGWRegReply[1];
struct BPQConnectionInfo * Connection; struct BPQConnectionInfo * Connection;
int Stream; int Stream;
@ -1142,6 +1156,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
int con,conport; int con,conport;
int AGWYReply = 0; int AGWYReply = 0;
int state, change; int state, change;
int n;
// if we have hidden some ports then the port in the AGW packet will be an index into the visible ports, // if we have hidden some ports then the port in the AGW packet will be an index into the visible ports,
// not the real port number // not the real port number
@ -1194,9 +1209,9 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
// Need to convert port index (used by AGW) to port number // Need to convert port index (used by AGW) to port number
conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]); conport=GetPortNumber(VisiblePortToRealPort[key[0]-49] + 1);
sprintf(ConnectMsg,"C %d %s",conport,ToCall); n = sprintf(ConnectMsg,"C %d %s",conport,ToCall);
// if 'v' command add digis // if 'v' command add digis
@ -1211,7 +1226,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
while(nDigis--) while(nDigis--)
{ {
sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis); n += sprintf(&ConnectMsg[n], " %s", Digis);
Digis += 10; Digis += 10;
} }
} }
@ -1292,9 +1307,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
// Version // Version
memset(&AGWTXHeader,0,36); memset(&AGWTXHeader,0,36);
AGWTXHeader.DataKind = 'R'; AGWTXHeader.DataKind = 'R';
AGWTXHeader.DataLength = 8; // Length AGWTXHeader.DataLength = 8; // Length
SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]); SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]);
@ -1308,15 +1321,27 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
memset(&AGWTXHeader,0,36); memset(&AGWTXHeader,0,36);
AGWTXHeader.DataKind = 'G'; AGWTXHeader.DataKind = 'G';
AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length
SendtoSocket(sockptr->socket, AGWPorts); SendtoSocket(sockptr->socket, AGWPorts);
return 0; return 0;
case 'g':
// Port capabilities. Currently hard-coded.
AGWTXHeader.Port = sockptr->AGWRXHeader.Port;
AGWTXHeader.DataKind = 'g';
AGWTXHeader.DataLength = 12;
SendtoSocket(sockptr->socket, (char *)&AGWPortCaps[0]);
return 0;
case 'k': case 'k':
@ -1415,6 +1440,8 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
AGWTXHeader.DataKind = 'X'; AGWTXHeader.DataKind = 'X';
memcpy(&AGWTXHeader.callfrom, RegCall, 10);
AGWTXHeader.DataLength = 1; // Length AGWTXHeader.DataLength = 1; // Length
AGWRegReply[0] = 1; AGWRegReply[0] = 1;

View file

@ -49,9 +49,14 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define DM 0x0F #define DM 0x0F
#define UA 0x63 #define UA 0x63
#define FRMR 0x87 #define FRMR 0x87
#define XID 0xAF
#define TEST 0xE3
#define RR 1 #define RR 1
#define RNR 5 #define RNR 5
#define REJ 9 #define REJ 9
#define SREJ 0x0D
#define SABME 0x6F
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
@ -261,6 +266,18 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
strcpy(SUP, "FRMR"); strcpy(SUP, "FRMR");
FRMRFLAG = 1; FRMRFLAG = 1;
break; break;
case XID:
strcpy(SUP, "XID");
XIDFLAG = 1;
break;
case TEST:
strcpy(SUP, "TEST");
TESTFLAG = 1;
break;
} }
Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR); Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR);
@ -270,7 +287,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
// Super // Super
int NR = (CTL >> 5) & 7; int NR = (CTL >> 5) & 7;
char SUP[4] = "??"; char SUP[5] = "??";
switch (CTL & 0x0F) switch (CTL & 0x0F)
{ {
@ -288,6 +305,13 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
strcpy(SUP, "REJ"); strcpy(SUP, "REJ");
break; break;
case SREJ:
strcpy(SUP, "SREJ");
break;
} }
Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR); Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
@ -300,6 +324,72 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
if (FRMRFLAG) if (FRMRFLAG)
Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]); Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]);
if (XIDFLAG)
{
// Decode and display XID
UCHAR * ptr = &ADJBUFFER->PID;
if (*ptr++ == 0x82 && *ptr++ == 0x80)
{
int Type;
int Len;
unsigned int value;
int xidlen = *(ptr++) << 8;
xidlen += *ptr++;
// XID is set of Type, Len, Value n-tuples
// G8BPQ-2>G8BPQ:(XID cmd, p=1) Half-Duplex SREJ modulo-128 I-Field-Length-Rx=256 Window-Size-Rx=32 Ack-Timer=3000 Retries=10
while (xidlen > 0)
{
Type = *ptr++;
Len = *ptr++;
value = 0;
xidlen -= (Len + 2);
while (Len--)
{
value <<=8;
value += *ptr++;
}
switch(Type)
{
case 2: //Bin fields
case 3:
Output += sprintf((char *)Output, " %d=%x", Type, value);
break;
case 6: //RX Size
Output += sprintf((char *)Output, " RX Paclen=%d", value / 8);
break;
case 8: //RX Window
Output += sprintf((char *)Output, " RX Window=%d", value);
break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
}
}
}
}
if (Info) if (Info)
{ {
// We have an info frame // We have an info frame
@ -419,6 +509,14 @@ UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNo
return Output; return Output;
} }
if (ADJBUFFER->L2DATA[0] == 0xfe) // Paula's Nodes Poll
{
memcpy(Alias, ++ptr, 6);
Output += sprintf((char *)Output, " NODES POLL from %s\r", Alias);
return Output;
}
// Display normal NET/ROM transmissions // Display normal NET/ROM transmissions
Output += sprintf((char *)Output, " NET/ROM\r "); Output += sprintf((char *)Output, " NET/ROM\r ");

View file

@ -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);
} }

View file

@ -553,6 +553,8 @@ int APRSWriteLog(char * msg)
UCHAR Value[MAX_PATH]; UCHAR Value[MAX_PATH];
time_t T; time_t T;
struct tm * tm; struct tm * tm;
int n;
if (LogAPRSIS == 0) if (LogAPRSIS == 0)
return 0; return 0;
@ -574,8 +576,9 @@ int APRSWriteLog(char * msg)
strcat(Value, "logs/APRS_"); strcat(Value, "logs/APRS_");
} }
sprintf(Value, "%s%02d%02d%02d.log", Value, n = strlen(Value);
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
sprintf(&Value[n], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "ab")) == NULL) if ((file = fopen(Value, "ab")) == NULL)
return FALSE; return FALSE;

File diff suppressed because it is too large Load diff

View file

@ -1,139 +0,0 @@
--- APRSCode.c
+++ APRSCode.c
@@ -3674,7 +3674,7 @@
if (ptr1)
*ptr1 = 0;
-// Debugprintf("Duplicate Message supressed %s", Msg);
+// Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate
}
}
--- BPQChat.rc
+++ BPQChat.rc
@@ -162,7 +162,7 @@
WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER
- LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
+ LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24
END
--- BPQMail.rc
+++ BPQMail.rc
@@ -1045,7 +1045,7 @@
CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
- CONTROL "Supress Mailing of Housekeeping Results",
+ CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
--- HanksRT.c
+++ HanksRT.c
@@ -1186,7 +1186,7 @@
// Duplicate, so discard, but save time
DupInfo[i].DupTime = Now;
- Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
+ Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate
}
--- RigControl.c
+++ RigControl.c
@@ -8385,7 +8385,7 @@
switch (Msg[0])
{
- case 'f': // Get Freqency
+ case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep);
return 0;
--- UZ7HODrv.c
+++ UZ7HODrv.c
@@ -374,7 +374,7 @@
{
// Read Freq
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1;
}
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}
--- WinRPRHelper.c
+++ WinRPRHelper.c
@@ -111,7 +111,7 @@
if (argc < 3)
{
- printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
+ printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n");
--- config.c
+++ config.c
@@ -649,7 +649,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
- Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
+ Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf("");
--- kiss.c
+++ kiss.c
@@ -1485,7 +1485,7 @@
}
}
else
- Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",
+ Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",
KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
goto SeeifMore; // SEE IF ANYTHING ELSE
--- templatedefs.c
+++ templatedefs.c
@@ -1165,7 +1165,7 @@
"Send Non-delivery Notifications<br>\r\n"
"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
" <br />\r\n"
- "Supress Mailing of<br>\r\n"
+ "Suppress Mailing of<br>\r\n"
"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"<div style=\"text-align: center;\"><input class='btn' name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
@@ -1454,7 +1454,7 @@
"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
- "seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
+ "separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
"<br></div>\n"
--- WebMail.c
+++ WebMail.c
@@ -2020,7 +2020,7 @@
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' "
- "value='Include Orignal Msg'>";
+ "value='Include Original Msg'>";
char Temp[1024];
char ReplyAddr[128];

85
ARDOP.c
View file

@ -62,6 +62,12 @@ int (WINAPI FAR *EnumProcessesPtr)();
#include "tncinfo.h" #include "tncinfo.h"
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
#define WSA_ACCEPT WM_USER + 1 #define WSA_ACCEPT WM_USER + 1
#define WSA_DATA WM_USER + 2 #define WSA_DATA WM_USER + 2
#define WSA_CONNECT WM_USER + 3 #define WSA_CONNECT WM_USER + 3
@ -136,6 +142,7 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
if (TNC->Streams[0].Attached) if (TNC->Streams[0].Attached)
TNC->Streams[0].ReportDISC = TRUE; TNC->Streams[0].ReportDISC = TRUE;
TNC->Streams[0].Connecting = 0;
TNC->Streams[0].Connected = 0; TNC->Streams[0].Connected = 0;
TNC->Streams[0].Attached = 0; TNC->Streams[0].Attached = 0;
@ -566,7 +573,7 @@ static int ProcessLine(char * buf, int Port)
} }
void ARDOPThread(struct TNCINFO * TNC); void ARDOPThread(VOID * Param);
VOID ARDOPProcessDataSocketData(int port); VOID ARDOPProcessDataSocketData(int port);
int ConnecttoARDOP(struct TNCINFO * TNC); int ConnecttoARDOP(struct TNCINFO * TNC);
static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC); static VOID ARDOPProcessReceivedData(struct TNCINFO * TNC);
@ -887,8 +894,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime)) if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
{ {
Debugprintf("ARDOP closing session on SessionTimelimit");
ARDOPSendCommand(TNC, "DISCONNECT", TRUE); ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
STREAM->Disconnecting = TRUE; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0;
} }
} }
@ -898,6 +907,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime)) if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
{ {
Debugprintf("ARDOP closing session on AttachTimelimit");
STREAM->ReportDISC = 1; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0; STREAM->AttachTime = 0;
} }
@ -1492,7 +1502,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1731,7 +1744,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
@ -1979,6 +1992,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->LogPath) if (TNC->LogPath)
ARDOPOpenLogFiles(TNC); ARDOPOpenLogFiles(TNC);
@ -1991,7 +2005,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_ARDOP; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1999,7 +2013,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -2054,21 +2067,12 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
strcat(TempScript, "ARQTIMEOUT 90\r"); strcat(TempScript, "ARQTIMEOUT 90\r");
// strcat(TempScript, "ROBUST False\r"); // strcat(TempScript, "ROBUST False\r");
strcat(TempScript, TNC->InitScript); // Make MYAUX and MYCALL overridable
free(TNC->InitScript);
TNC->InitScript = TempScript;
// Set MYCALL
// strcat(TNC->InitScript,"FECRCV True\r");
// strcat(TNC->InitScript,"AUTOBREAK True\r");
sprintf(Msg, "MYCALL %s\r", TNC->NodeCall); sprintf(Msg, "MYCALL %s\r", TNC->NodeCall);
strcat(TNC->InitScript, Msg); strcat(TempScript, Msg);
// strcat(TNC->InitScript,"PROCESSID\r");
// strcat(TNC->InitScript,"CODEC TRUE\r");
// strcat(TNC->InitScript,"LISTEN TRUE\r");
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
@ -2092,9 +2096,25 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (strlen(Aux) > 8) if (strlen(Aux) > 8)
{ {
Aux[strlen(Aux) - 1] = '\r'; Aux[strlen(Aux) - 1] = '\r';
strcat(TNC->InitScript, Aux); strcat(TempScript, Aux);
} }
strcat(TempScript, TNC->InitScript);
free(TNC->InitScript);
TNC->InitScript = TempScript;
// strcat(TNC->InitScript,"FECRCV True\r");
// strcat(TNC->InitScript,"AUTOBREAK True\r");
// strcat(TNC->InitScript,"PROCESSID\r");
// strcat(TNC->InitScript,"CODEC TRUE\r");
// strcat(TNC->InitScript,"LISTEN TRUE\r");
strcpy(TNC->CurrentMYC, TNC->NodeCall); strcpy(TNC->CurrentMYC, TNC->NodeCall);
if (TNC->WL2K == NULL) if (TNC->WL2K == NULL)
@ -2282,11 +2302,11 @@ VOID TNCLost(struct TNCINFO * TNC)
} }
if (STREAM->Attached) if (STREAM->Attached)
{
STREAM->Connected = FALSE;
STREAM->Connecting = FALSE;
STREAM->ReportDISC = TRUE; STREAM->ReportDISC = TRUE;
}
STREAM->Connected = FALSE;
STREAM->Connecting = FALSE;
} }
} }
@ -2298,12 +2318,13 @@ int ConnecttoARDOP(struct TNCINFO * TNC)
return 0; return 0;
} }
VOID ARDOPThread(struct TNCINFO * TNC) VOID ARDOPThread(VOID * Param)
{ {
// Opens sockets and looks for data on control and data sockets. // Opens sockets and looks for data on control and data sockets.
// Socket may be TCP/IP or Serial // Socket may be TCP/IP or Serial
struct TNCINFO * TNC = (struct TNCINFO *) Param;
char Msg[255]; char Msg[255];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
@ -3136,6 +3157,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Incoming Connect // Incoming Connect
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
STREAM->AttachTime = time(NULL);
// Stop other ports in same group // Stop other ports in same group
@ -3318,9 +3340,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
} }
if (_memicmp(Buffer, "DISCONNECTED", 12) == 0 if (_memicmp(Buffer, "DISCONNECTED", 12) == 0
|| _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0 || _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0
|| _memicmp(Buffer, "STATUS END ARQ CALL", 19) == 0
|| _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0 || _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0
// || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0 // || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0
|| _memicmp(Buffer, "ABORT", 5) == 0) || _memicmp(Buffer, "ABORT", 5) == 0)
@ -5743,8 +5765,7 @@ VOID ARDOPSCSPoll(struct TNCINFO * TNC)
// Probably only for Teensy with ESP01. Runs SCS Emulator over a TCP Link // Probably only for Teensy with ESP01. Runs SCS Emulator over a TCP Link
VOID SerialConnecttoTCPThread(VOID * Param);
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC);
int SerialConnecttoTCP(struct TNCINFO * TNC) int SerialConnecttoTCP(struct TNCINFO * TNC)
{ {
@ -5752,9 +5773,9 @@ int SerialConnecttoTCP(struct TNCINFO * TNC)
return 0; return 0;
} }
VOID SerialConnecttoTCPThread(VOID * Param)
VOID SerialConnecttoTCPThread(struct TNCINFO * TNC)
{ {
struct TNCINFO * TNC = (struct TNCINFO *) Param;
char Msg[255]; char Msg[255];
int i; int i;
u_long param = 1; u_long param = 1;
@ -5953,8 +5974,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

@ -117,6 +117,8 @@ struct UserInfo * FindBBS(char * Name);
void ReleaseWebMailStruct(WebMailInfo * WebMail); void ReleaseWebMailStruct(WebMailInfo * WebMail);
VOID TidyWelcomeMsg(char ** pPrompt); VOID TidyWelcomeMsg(char ** pPrompt);
int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token); int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token);
void UndoTransparency(char * input);
int GetMessageSlotFromMessageNumber(int msgno);
char UNC[] = ""; char UNC[] = "";
char CHKD[] = "checked=checked "; char CHKD[] = "checked=checked ";
@ -186,7 +188,7 @@ char RefreshMainPage[] = "<html><head>"
char StatusPage [] = char StatusPage [] =
"<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>" "<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>"
"<br>User&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[] =
@ -1701,6 +1703,8 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
free(Filters); free(Filters);
Filters = NULL; Filters = NULL;
UndoTransparency(input);
while (input) while (input)
{ {
// extract and validate before saving // extract and validate before saving
@ -1714,7 +1718,7 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
input = strstr(input, "&Type="); input = strstr(input, "&Type=");
if (Filter.Action == 'H' || Filter.Action == 'R') if (Filter.Action == 'H' || Filter.Action == 'R' || Filter.Action == 'A')
{ {
Filter.Type = toupper(input[6]); Filter.Type = toupper(input[6]);
input = strstr(input, "&From="); input = strstr(input, "&From=");
@ -2439,8 +2443,8 @@ VOID ProcessMsgFwdUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
set_fwd_bit(Msg->fbbs, BBSNumber); set_fwd_bit(Msg->fbbs, BBSNumber);
User->ForwardingInfo->MsgCount++; User->ForwardingInfo->MsgCount++;
clear_fwd_bit(Msg->forw, BBSNumber); clear_fwd_bit(Msg->forw, BBSNumber);
if (FirstMessageIndextoForward > Msg->number) if (FirstMessageIndextoForward > GetMessageSlotFromMessageNumber(Msg->number))
FirstMessageIndextoForward = Msg->number; FirstMessageIndextoForward = GetMessageSlotFromMessageNumber(Msg->number);
} }
*RLen = SendMessageDetails(Msg, Reply, Session->Key); *RLen = SendMessageDetails(Msg, Reply, Session->Key);
@ -2755,6 +2759,19 @@ VOID SendUIPage(char * Reply, int * ReplyLen, char * Key)
*ReplyLen = Len; *ReplyLen = Len;
} }
void ConvertSpaceTonbsp(char * msg)
{
// Replace any space with &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;
@ -2776,6 +2793,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");
} }
@ -2789,16 +2808,16 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
strcpy(Name, conn->UserPointer->Name); strcpy(Name, conn->UserPointer->Name);
Name[9] = 0; Name[9] = 0;
i=sprintf_s(msg, sizeof(msg), "%s%s%s%s%2d&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);
} }

View file

@ -69,6 +69,10 @@ extern BPQVECSTRUC ** BPQHOSTVECPTR;
UCHAR * GetLogDirectory(); UCHAR * GetLogDirectory();
DllExport int APIENTRY SessionStateNoAck(int stream, int * state); DllExport int APIENTRY SessionStateNoAck(int stream, int * state);
int RefreshWebMailIndex(); int RefreshWebMailIndex();
struct PORTCONTROL * GetPortTableEntryFromSlot(int portslot);
int GetPortHardwareType(struct PORTCONTROL *PORT);
int GetNumberofPorts();
#else #else
__declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR; __declspec(dllimport) BPQVECSTRUC ** BPQHOSTVECPTR;
typedef char * (WINAPI FAR *FARPROCZ)(); typedef char * (WINAPI FAR *FARPROCZ)();
@ -527,7 +531,20 @@ struct MsgInfo * GetMsgFromNumber(int msgno)
return MsgnotoMsg[msgno]; return MsgnotoMsg[msgno];
} }
int GetMessageSlotFromMessageNumber(int msgno)
{
int i;
for (i=1; i <= NumberofMessages; i++)
{
if (MsgHddrPtr[i]->number == msgno)
return i;
}
return 0;
}
struct UserInfo * AllocateUserRecord(char * Call) struct UserInfo * AllocateUserRecord(char * Call)
{ {
struct UserInfo * User = zalloc(sizeof (struct UserInfo)); struct UserInfo * User = zalloc(sizeof (struct UserInfo));
@ -2085,6 +2102,7 @@ hold certain types or sizes of messages.
The first letter of each valid line specifies the action : The first letter of each valid line specifies the action :
A = Accept : Message is accepted without checking other filters
R = Reject : The message will not be received. R = Reject : The message will not be received.
H = Hold : The message will be received but held until the sysop reviews. H = Hold : The message will be received but held until the sysop reviews.
L = Local Hold : Only messages created on this BBS will be held. L = Local Hold : Only messages created on this BBS will be held.
@ -2179,21 +2197,38 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
while (p) while (p)
{ {
if (p->Action != 'R') if (p->Action != 'R' && p->Action != 'A')
goto Continue; goto Continue;
if (p->Type != Type && p->Type != '*') if (p->Type != Type && p->Type != '*')
goto Continue; goto Continue;
// wildcardcompare returns true on a match
if (wildcardcompare(From, p->From) == 0) if (wildcardcompare(From, p->From) == 0)
goto Continue; goto Continue;
if (wildcardcompare(ToCopy, p->TO) == 0) if (p->TO[0] == '!')
goto Continue; {
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
goto Continue;
}
else
{
if (wildcardcompare(ToCopy, p->TO) == 0)
goto Continue;
}
if (ATBBS) if (ATBBS)
if (wildcardcompare(ATBBS, p->AT) == 0) {
char AtCopy[256];
strcpy(AtCopy, ATBBS);
_strupr(AtCopy);
if (wildcardcompare(AtCopy, p->AT) == 0)
goto Continue; goto Continue;
}
if (BID) if (BID)
if (wildcardcompare(BID, p->BID) == 0) if (wildcardcompare(BID, p->BID) == 0)
@ -2202,6 +2237,11 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
if (p->MaxLen && Len < p->MaxLen) if (p->MaxLen && Len < p->MaxLen)
goto Continue; goto Continue;
// if type 'A' matches all rules then accept without checking rest
if (p->Action == 'A')
return FALSE;
return TRUE; // Hold return TRUE; // Hold
Continue: Continue:
@ -2244,6 +2284,7 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
{ {
char ** Calls; char ** Calls;
FBBFilter * p = Filters; FBBFilter * p = Filters;
char ToCopy[256];
if (HoldFrom && From) if (HoldFrom && From)
{ {
@ -2307,6 +2348,9 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
// check fbb reject.sys type filters // check fbb reject.sys type filters
strcpy(ToCopy, To);
_strupr(ToCopy);
while (p) while (p)
{ {
if (p->Action != 'H') if (p->Action != 'H')
@ -2318,9 +2362,16 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
if (wildcardcompare(Msg->from, p->From) == 0) if (wildcardcompare(Msg->from, p->From) == 0)
goto Continue; goto Continue;
if (wildcardcompare(Msg->to, p->TO) == 0) if (p->TO[0] == '!')
goto Continue; {
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
goto Continue;
}
else
{
if (wildcardcompare(ToCopy, p->TO) == 0)
goto Continue;
}
if (wildcardcompare(Msg->via, p->AT) == 0) if (wildcardcompare(Msg->via, p->AT) == 0)
goto Continue; goto Continue;
@ -3388,6 +3439,7 @@ void Flush(CIRCUIT * conn)
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len); SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->OutputGetPointer+=len; conn->OutputGetPointer+=len;
conn->bytesSent += len;
tosend-=len; tosend-=len;
SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25); SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25);
FreeSemaphore(&OutputSEM); FreeSemaphore(&OutputSEM);
@ -3399,6 +3451,7 @@ void Flush(CIRCUIT * conn)
} }
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len); SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->bytesSent += len;
conn->OutputGetPointer+=len; conn->OutputGetPointer+=len;
@ -5216,7 +5269,6 @@ char * CheckToAddress(CIRCUIT * conn, char * Addr)
return NewAddr; return NewAddr;
} }
} }
else
{ {
WPRecP WP = LookupWP(Addr); WPRecP WP = LookupWP(Addr);
@ -5437,7 +5489,18 @@ BOOL DecodeSendParams(CIRCUIT * conn, char * Context, char ** From, char *To, ch
} }
else else
{ {
conn->LocalMsg = TRUE; // See if a WP entry
WP = LookupWP(To);
if (WP)
{
*ATBBS = WP->first_homebbs;
nodeprintf(conn, "Address @%s added from WP\r", *ATBBS);
conn->LocalMsg = FALSE;
}
else
conn->LocalMsg = TRUE;
} }
} }
else else
@ -5810,12 +5873,12 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
continue; continue;
} }
} }
ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, Addr, Via); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", Addr, Via);
continue; continue;
} }
@ -5833,7 +5896,7 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
// Add to B2 Message for RMS // Add to B2 Message for RMS
@ -9016,6 +9079,10 @@ CheckForSID:
return TRUE; return TRUE;
} }
#ifndef LINBPQ
extern FARPROCX pGetPortHardwareType;
#endif
VOID Parse_SID(CIRCUIT * conn, char * SID, int len) VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
{ {
ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME); // Default Idletime for BBS Sessions ChangeSessionIdletime(conn->BPQStream, BBSIDLETIME); // Default Idletime for BBS Sessions
@ -9072,10 +9139,44 @@ VOID Parse_SID(CIRCUIT * conn, char * SID, int len)
{ {
// We should really only do this on Telnet Connections, as OpenBCM flag is used to remove relnet transparency // We should really only do this on Telnet Connections, as OpenBCM flag is used to remove relnet transparency
// See if Telnet
struct PORTCONTROL * PORT;
char Call[11] = "";
int port, dummy;
GetConnectionInfo(conn->BPQStream, Call, &port, &dummy, &dummy, &dummy, &dummy);
PORT = GetPortTableEntryFromSlot(0); // Get first entry
do
{
if (PORT->PORTNUMBER == port)
break;
PORT=PORT->PORTPOINTER;
} while (PORT);
#define H_TELNET 6
#ifndef LINBPQ
if (pGetPortHardwareType)
{
if (PORT && GetPortHardwareType(PORT) == H_TELNET)
conn->OpenBCM = TRUE;
}
else
conn->OpenBCM = TRUE; // Old Node version so follow old behavoiur and treat all as telnet
#else
if (PORT && GetPortHardwareType(PORT) == H_TELNET)
conn->OpenBCM = TRUE;
#endif
conn->OpenBCM = TRUE;
} }
if (_memicmp(SID, "PMS-3.2", 7) == 0) if (_memicmp(SID, "PMS-3.2", 7) == 0)
{ {
// Paccom TNC that doesn't send newline prompt ater receiving subject // Paccom TNC that doesn't send newline prompt ater receiving subject
@ -10245,7 +10346,7 @@ BOOL GetConfig(char * ConfigName)
GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100); GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default
GetStringValue(group, "SignoffMsg", ISPAccountName, 50); GetStringValue(group, "SignoffMsg", SignoffMsg, 50);
DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass)); DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
@ -10550,7 +10651,7 @@ int Connected(int Stream)
char callsign[10]; char callsign[10];
int port, paclen, maxframe, l4window; int port, paclen, maxframe, l4window;
char ConnectedMsg[] = "*** CONNECTED "; char ConnectedMsg[] = "*** CONNECTED ";
char Msg[100]; char Msg[256];
char Title[100]; char Title[100];
int64_t Freq = 0; int64_t Freq = 0;
int Mode = 0; int Mode = 0;
@ -10633,7 +10734,13 @@ int Connected(int Stream)
} }
} }
} }
if (Mode < 0 || Mode > 54)
Mode = 0;
if (Freq < 0 || Freq > 11000000000)
Freq = 0;
memset(conn, 0, sizeof(ConnectionInfo)); // Clear everything memset(conn, 0, sizeof(ConnectionInfo)); // Clear everything
conn->Active = TRUE; conn->Active = TRUE;
conn->BPQStream = Stream; conn->BPQStream = Stream;
@ -10698,7 +10805,7 @@ int Connected(int Stream)
LongFreq = GetPortFrequency(port, FreqString); LongFreq = GetPortFrequency(port, FreqString);
#endif #endif
} }
Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %d Mode %ld\r\n", callsign, port, LongFreq, Mode); Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %lld Mode %d\r\n", callsign, port, LongFreq, Mode);
sprintf(Title, "New User %s", callsign); sprintf(Title, "New User %s", callsign);
@ -10758,10 +10865,10 @@ int Connected(int Stream)
} }
if (port) if (port)
n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %d Mode %s", n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %lld Mode %s",
user->Call, port, Freq, WL2KModes[Mode]); user->Call, port, Freq, WL2KModes[Mode]);
else else
n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call); n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call);
// Send SID and Prompt (Unless Sync) // Send SID and Prompt (Unless Sync)
@ -11051,7 +11158,6 @@ int DoReceivedData(int Stream)
if (Stream == conn->BPQStream) if (Stream == conn->BPQStream)
{ {
conn->SIDResponseTimer = 0; // Got a message, so cancel timeout. conn->SIDResponseTimer = 0; // Got a message, so cancel timeout.
do do
{ {
// May have several messages per packet, or message split over packets // May have several messages per packet, or message split over packets
@ -11068,6 +11174,7 @@ int DoReceivedData(int Stream)
if (InputLen == 0 && conn->InputMode != 'Y') if (InputLen == 0 && conn->InputMode != 'Y')
return 0; return 0;
conn->bytesRxed += InputLen;
conn->InputLen += InputLen; conn->InputLen += InputLen;
if (conn->InputLen == 0) return 0; if (conn->InputLen == 0) return 0;

752
BPQINP3.c

File diff suppressed because it is too large Load diff

BIN
BPQMail.aps Normal file

Binary file not shown.

View file

@ -1147,6 +1147,15 @@
// Send forwarding info to packetnodes.spots.radio database (51) // Send forwarding info to packetnodes.spots.radio database (51)
// Fix bug in WP Message processing (56) // Fix bug in WP Message processing (56)
// Fix treating addresses ending in WW as Internet (57) // Fix treating addresses ending in WW as Internet (57)
// Run sending to packetnodes.spots.radio in a separate thread (61)
// Fix loading ISP Account Name from config file (67)
// Fixes to using {FormFolder} in Webmail Templates (68)
// Save FBB transfer restart data over program restarts (69)
// Add Send and Receive byte counts to status displays (69)
// Validate Mode and Frequency and fix formatting in Connected Message (71)
// Fix using OpenBCM on other than Telnet connections (75)
// Fix sending + in Webmail (80)
// Fix forwarding problem when using Web interface to change message routing (73)
#include "bpqmail.h" #include "bpqmail.h"
#include "winstdint.h" #include "winstdint.h"
@ -1167,6 +1176,7 @@ FARPROCX pRunEventProgram;
FARPROCX pGetPortFrequency; FARPROCX pGetPortFrequency;
FARPROCX pSendWebRequest; FARPROCX pSendWebRequest;
FARPROCX pGetLatLon; FARPROCX pGetLatLon;
FARPROCX pGetPortHardwareType;
BOOL WINE = FALSE; BOOL WINE = FALSE;
@ -1723,6 +1733,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
// SaveUserDatabase(); // SaveUserDatabase();
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveRestartData();
configSaved = 1; configSaved = 1;
SaveConfig(ConfigName); SaveConfig(ConfigName);
@ -1949,6 +1960,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8"); pGetPortFrequency = GetProcAddress(ExtDriver,"_GetPortFrequency@8");
pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16"); pSendWebRequest = GetProcAddress(ExtDriver,"_SendWebRequest@16");
pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8"); pGetLatLon = GetProcAddress(ExtDriver,"_GetLatLon@8");
pGetPortHardwareType = GetProcAddress(ExtDriver,"_GetPortHardwareType@4");
if (pGetLOC) if (pGetLOC)
@ -3019,9 +3032,9 @@ int RefreshMainWindow()
strcpy(msg,"Logging in"); strcpy(msg,"Logging in");
else else
{ {
i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d", i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d %5d %5d",
conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream, conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream,
"BBS", conn->OutputQueueLength - conn->OutputGetPointer); "BBS", conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed);
} }
} }
} }
@ -3082,6 +3095,7 @@ static PSOCKADDR_IN psin;
SOCKET sock; SOCKET sock;
void GetRestartData();
BOOL Initialise() BOOL Initialise()
{ {
@ -3269,6 +3283,8 @@ BOOL Initialise()
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetRestartData();
UsingingRegConfig = FALSE; UsingingRegConfig = FALSE;
// Make sure SYSOPCALL is set // Make sure SYSOPCALL is set

1090
BPQMail.rc

File diff suppressed because it is too large Load diff

View file

@ -45,6 +45,8 @@ extern VOID Q_ADD();
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
TRANSPORTENTRY * NRRSession; TRANSPORTENTRY * NRRSession;
int NRRID = 1; // Id to correlate requests and responses
/* /*
datagrams (and other things) to be transported in Netrom L3 frames. datagrams (and other things) to be transported in Netrom L3 frames.
@ -75,7 +77,9 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
{ {
UCHAR * BUFFER = GetBuff(); UCHAR * BUFFER = GetBuff();
UCHAR * ptr1; UCHAR * ptr1;
struct _MESSAGE * Msg; struct _MESSAGE * Msg1;
time_t Now = time(NULL);
int ID = (Msg->L4TXNO << 8) | Msg->L4RXNO;
if (BUFFER == NULL) if (BUFFER == NULL)
return; return;
@ -84,7 +88,18 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
*ptr1++ = 0xf0; // PID *ptr1++ = 0xf0; // PID
ptr1 += sprintf(ptr1, "NRR Response:");
if (BUFFER == NULL)
return;
ptr1 = &BUFFER[MSGHDDRLEN];
*ptr1++ = 0xf0; // PID
if (ID == NRRSession->NRRID)
ptr1 += sprintf(ptr1, "NRR Response in %d Secs:", (int)(Now - NRRSession->NRRTime));
else
ptr1 += sprintf(ptr1, "NRR Response:", (int)(Now - NRRSession->NRRTime));
Buff += 21 + MSGHDDRLEN; Buff += 21 + MSGHDDRLEN;
Len -= (21 + MSGHDDRLEN); Len -= (21 + MSGHDDRLEN);
@ -97,7 +112,7 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
if ((Buff[7] & 0x80) == 0x80) // Check turnround bit if ((Buff[7] & 0x80) == 0x80) // Check turnround bit
*ptr1++ = '*'; *ptr1++ = '*';
Buff+=8; Buff += 8;
Len -= 8; Len -= 8;
} }
@ -111,11 +126,11 @@ VOID NRRecordRoute(UCHAR * Buff, int Len)
Len = (int)(ptr1 - BUFFER); Len = (int)(ptr1 - BUFFER);
Msg = (struct _MESSAGE *)BUFFER; Msg1 = (struct _MESSAGE *)BUFFER;
Msg->LENGTH = Len; Msg1->LENGTH = Len;
Msg->CHAIN = NULL; Msg1->CHAIN = NULL;
C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER); C_Q_ADD(&NRRSession->L4TX_Q, (UINT *)BUFFER);
@ -183,11 +198,16 @@ VOID SendNRRecordRoute(struct DEST_LIST * DEST, TRANSPORTENTRY * Session)
Msg->L4ID = 1; Msg->L4ID = 1;
Msg->L4INDEX = 0; Msg->L4INDEX = 0;
Msg->L4FLAGS = 0; Msg->L4FLAGS = 0;
Msg->L4TXNO = NRRID << 8;
Msg->L4RXNO = NRRID & 0xff;
memcpy(Msg->L4DATA, MYCALL, 7); memcpy(Msg->L4DATA, MYCALL, 7);
Msg->L4DATA[7] = Stream + 28; Msg->L4DATA[7] = Stream + 28;
Msg->LENGTH = 8 + 21 + MSGHDDRLEN; Msg->LENGTH = 8 + 21 + MSGHDDRLEN;
Session->NRRTime = time(NULL);
Session->NRRID = NRRID++;
C_Q_ADD(&DEST->DEST_Q, Msg); C_Q_ADD(&DEST->DEST_Q, Msg);
} }

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

@ -2973,6 +2973,30 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
if (wParam == 0x7) // BEL (Ctrl/G)
{
// Get buffer, append 07 and write back
Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1,
(LPARAM) (LPCSTR)Cinfo->kbbuf);
Cinfo->kbbuf[Cinfo->kbptr++] = 7;
Cinfo->kbbuf[Cinfo->kbptr] = 0;
SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
// Send cursor right
for (i = 0; i < strlen(Cinfo->kbbuf); i++)
{
SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
}
return 0;
}
} }

File diff suppressed because it is too large Load diff

152
Bpq32.c
View file

@ -1180,7 +1180,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix processing of the Winlink API /account/exists response (82) // Fix processing of the Winlink API /account/exists response (82)
// Fix sending CTEXT to L4 connects to Node when FULL_CTEXT is not set // Fix sending CTEXT to L4 connects to Node when FULL_CTEXT is not set
// Version 6.0.25.? // Version 6.0.25.1 Sept 2025
// Fix 64 bit compatibility problems in SCSTracker and UZ7HO drivers // Fix 64 bit compatibility problems in SCSTracker and UZ7HO drivers
// Add Chat PACLEN config (5) // Add Chat PACLEN config (5)
@ -1243,11 +1243,61 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix MailAPI msgs endpoint // Fix MailAPI msgs endpoint
// Attempt to fix NC going to wrong application. (57) // Attempt to fix NC going to wrong application. (57)
// Improve ARDOP end of session code (58) // Improve ARDOP end of session code (58)
// Run M0LTE Map repoorting in a separate thread (59) // Run M0LTE Map reporting in a separate thread (59/60)
// Add support fro WhatsPac (59) // Add RHP support for WhatsPac (59)
// Add timestamps to LIS monitor // Add timestamps to LIS monitor (60)
// Fix problem with L4 frames being delivered out of sequence (60)
// Add Compression of Netrom connections (62)
// Improve handling of Locked Routes (62)
// Add L4 RESET (Paula G8PZT's extension to NETROM)
// Fix problem using SENDRAW from BPQMail (63)
// Fix compatibility with latest ardopcf (64)
// Fix bug in RHP socket timeout code (65)
// Fix L4 RTT (66)
// Fix RigConrol with Chanxx but no other settings (66)
// Add option to compress L2 frames (67)
// Sort Routes displays (67)
// Fix Ardop session premature close (70)
// Add timestamps to log entries in Web Driver windows (70)
// Generate stack backtrace if SIGSEGV or SIGABRT occur (Linux) (70)
// Remove some debug logging from L2 code (70)
// Fix compiling LinBPQ with nomqtt option (70)
// Improve handling of binary data in RHP interface (70)
// Fix sending KISS commands to multiport or multidropped TNCs (70)
// Add MHUV and MHLV commands (Verbose listing with timestamps in clock time) (70)
// Improvements to INP3 (71)
// Improvements to KAM driver including support for GTOR connects (71)
// Support IPv6 for Telnet outward connects (72)
// Fix decaying NETROM routes (72)
// Add OnlyVer2point0 config command (72)
// Add option to allow AX/UDP on a network using NAT (72)
// Include AGWAPI fixes from Martin KD6YAM to enable use with Paracon terminal (72)
// Fix 64 bit compatiblility issues with AGWAPI (73)
// Fix KAM Pactor Interlock (73)
// Fix Node map reporting, broken in .73 (74)
// Fixes to build on FreeBSD and NetBSD from jg1uaa (77)
// Fix to L4Compress from Steve G7TAJ (77)
// Fix possible FRMR when RNR is cleared by SREJ (78)
// Fix error in .77 L4Compress fix (mine, not Steve's!) (78)
// Fix possible stuck L2 session when handling SREJ (79)
// Allow sending CTRL/G From console (Windows) (80)
// Fix Webmail autorefresh extra threads problem (websock connection lost handling) (82)
// Fix overwriting application alias (83)
// Version 6.0.26.?
// Fix for compiling with gcc15 (2)
// Fix possble stuck L2 session caused by window being set to zero (3)
// Improvments to INP3 (4, 5)
// Add Node API /api/tcpqueues (5)
// Add sending link events to OARC API (disabled by default) (6)
// Fix possible program error in Telnet_Connected (7)
// Close links when program is closed down (7)
// Fix possible problem with deleting routes when using both NODES and INP3 routing on same link (7)
// Add Paula's Netromx (allows connects to different applications using Node call) (8)
// Add Netrom over TCP (8)
// Fix FRMR caused by sending SREJ when no frames outstanding (8)
#define CKernel #define CKernel
@ -1343,6 +1393,8 @@ void * HSMODEMExtInit(EXTPORTDATA * PortEntry);
void * FreeDataExtInit(EXTPORTDATA * PortEntry); void * FreeDataExtInit(EXTPORTDATA * PortEntry);
void * SIXPACKExtInit(EXTPORTDATA * PortEntry); void * SIXPACKExtInit(EXTPORTDATA * PortEntry);
VOID RealCloseAllPrograms();
extern char * ConfigBuffer; // Config Area extern char * ConfigBuffer; // Config Area
VOID REMOVENODE(dest_list * DEST); VOID REMOVENODE(dest_list * DEST);
DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall); DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
@ -1352,6 +1404,8 @@ VOID ADIFWriteFreqList();
void SaveAIS(); void SaveAIS();
void initAIS(); void initAIS();
void initADSB(); void initADSB();
int CloseAllSessions();
int CloseAllLinks();
extern BOOL ADIFLogEnabled; extern BOOL ADIFLogEnabled;
@ -1410,7 +1464,8 @@ extern char MYCALL[]; // 7 chars, ax.25 format
extern HWND hIPResWnd; extern HWND hIPResWnd;
extern BOOL IPMinimized; extern BOOL IPMinimized;
extern int NODESINPROGRESS; extern int NODESINPROGRESS;
extern int NODESToOnePort;
extern VOID * CURRENTNODE; extern VOID * CURRENTNODE;
@ -1480,7 +1535,7 @@ extern char ReportDest[7];
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
extern uint64_t timeLoadedMS; extern uint64_t INP3timeLoadedMS;
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Consoleprintf(const char * format, ...); VOID __cdecl Consoleprintf(const char * format, ...);
@ -1598,6 +1653,8 @@ BOOL IGateEnabled = TRUE;
extern int ISDelayTimer; // Time before trying to reopen APRS-IS link extern int ISDelayTimer; // Time before trying to reopen APRS-IS link
extern int ISPort; extern int ISPort;
int CLOSING = 0;
UINT * WINMORTraceQ = NULL; UINT * WINMORTraceQ = NULL;
UINT * SetWindowTextQ = NULL; UINT * SetWindowTextQ = NULL;
@ -1653,6 +1710,8 @@ BOOL ReconfigFlag = FALSE;
BOOL RigReconfigFlag = FALSE; BOOL RigReconfigFlag = FALSE;
BOOL APRSReconfigFlag = FALSE; BOOL APRSReconfigFlag = FALSE;
BOOL CloseAllNeeded = FALSE; BOOL CloseAllNeeded = FALSE;
int CloseAllTimer = 0;
BOOL NeedWebMailRefresh = FALSE; BOOL NeedWebMailRefresh = FALSE;
int AttachedPIDList[100] = {0}; int AttachedPIDList[100] = {0};
@ -2334,6 +2393,52 @@ VOID TimerProcX()
CheckGuardZone(); CheckGuardZone();
if (CloseAllTimer == 50) // First entry
{
if (CloseAllSessions() == 0)
{
if (CloseAllLinks() == 0) // No sessions closed so close links now
CloseAllTimer = 0; // No Links so close now
else
CloseAllTimer = 39; // ~4 secs for links to close
}
}
if (CloseAllTimer == 40) // First entry
CloseAllLinks(); // No sessions closed so close links now
if (CloseAllTimer)
{
// See if any links left
struct _LINKTABLE * LINK = LINKS;
int i = MAXLINKS;
if (CloseAllTimer == 0)
RealCloseAllPrograms();
while (i--)
{
if (LINK->LINKCALL[0])
{
break;
}
if (i == 0)
{
CloseAllTimer = 0;
RealCloseAllPrograms();
return;
}
LINK++;
continue;
}
CloseAllTimer--;
if(CloseAllTimer == 0)
RealCloseAllPrograms();
}
return; return;
} }
@ -2369,7 +2474,9 @@ FirstInit()
EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses"); EnumProcessesPtr = (FARPROCX)GetProcAddress(ExtDriver,"EnumProcesses");
} }
timeLoadedMS = GetTickCount(); INP3timeLoadedMS = GetTickCount();
srand(time(NULL));
INITIALISEPORTS(); INITIALISEPORTS();
@ -5858,13 +5965,24 @@ DllExport VOID APIENTRY CreateNewTrayIcon()
trayMenu = NULL; trayMenu = NULL;
} }
void hookNodeClosing(char * Reason);
DllExport VOID APIENTRY CloseAllPrograms() DllExport VOID APIENTRY CloseAllPrograms()
{ {
// HANDLE hProc; CLOSING = TRUE;
// Close all attached BPQ32 programs // Tell BG to shut when all links are gone or after 5 secs
Closing = TRUE; CloseAllTimer = 50;
}
VOID RealCloseAllPrograms()
{
hookNodeClosing("Shutdown");
Sleep(500);
Closing = 1;
ShowWindow(FrameWnd, SW_RESTORE); ShowWindow(FrameWnd, SW_RESTORE);
@ -6112,13 +6230,14 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len = sprintf(RegLine, "%s\\\r\n", RegLine); len += sprintf(&RegLine[len], "\\\r\n", RegLine);
strcat(RegLine, "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]); len += sprintf(&RegLine[len], "%02x,", Value[k]);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;
RegLine[++len] = 0x0a; RegLine[++len] = 0x0a;
@ -6144,19 +6263,20 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len = sprintf(RegLine, "%s\\\r\n", RegLine); len += sprintf(&RegLine[len], "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
len += sprintf(&RegLine[len], "%02x,", Value[k]);
if (len > 76) if (len > 76)
{ {
len = sprintf(RegLine, "%s\\\r\n", RegLine); len += sprintf(&RegLine[len], "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
} }
len = sprintf(RegLine, "%s00,", RegLine); len += sprintf(&RegLine[len], "00,");
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;

View file

@ -23,7 +23,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#ifdef LINBPQ #ifdef LINBPQ
#include "compatbits.h" #include "compatbits.h"
char * strlop(char * buf, char delim);
#define APIENTRY #define APIENTRY
#define VOID void #define VOID void
@ -32,6 +31,8 @@ char * strlop(char * buf, char delim);
#include <windows.h> #include <windows.h>
#endif #endif
char * strlop(char * buf, char delim);
VOID APIENTRY md5 (char *arg, unsigned char * checksum); VOID APIENTRY md5 (char *arg, unsigned char * checksum);

View file

@ -590,7 +590,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
{ {
if (conn->Flags & CHATLINK) if (conn->Flags & CHATLINK)
{ {
if (conn->BPQStream > 64 || conn->u.link == 0) if (conn->BPQStream > 64 || conn->u.link == 0 || conn->u.link->alias == 0)
Len += sprintf(&Streams[Len], "<tr><td onclick= SelectRow(%d) id=cell_%d>** Corrupt ChatLink **</td>" Len += sprintf(&Streams[Len], "<tr><td onclick= SelectRow(%d) id=cell_%d>** Corrupt ChatLink **</td>"
"<td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td></tr>", i, i); "<td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td><td>&nbsp;&nbsp;</td></tr>", i, i);
else else
@ -600,7 +600,7 @@ VOID SendChatStatusPage(char * Reply, int * ReplyLen, char * Key)
"", conn->OutputQueueLength - conn->OutputGetPointer); "", conn->OutputQueueLength - conn->OutputGetPointer);
} }
else else
if ((conn->Flags & CHATMODE) && conn->topic) if ((conn->Flags & CHATMODE) && conn->topic && conn->u.user && conn->u.user->call)
{ {
Len += sprintf(&Streams[Len], "<tr><td onclick='SelectRow(%d)' id='cell_%d'>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%d</td></tr>", Len += sprintf(&Streams[Len], "<tr><td onclick='SelectRow(%d)' id='cell_%d'>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%d</td></tr>",
i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream, i, i, conn->u.user->name, conn->u.user->call, conn->BPQStream,

View file

@ -983,7 +983,30 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
if (wParam == 0x7) // BEL (Ctrl/G)
{
// Get buffer, append 07 and write back
Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1,
(LPARAM) (LPCSTR)Cinfo->kbbuf);
Cinfo->kbbuf[Cinfo->kbptr++] = 7;
Cinfo->kbbuf[Cinfo->kbptr] = 0;
SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
// Send cursor right
for (i = 0; i < strlen(Cinfo->kbbuf); i++)
{
SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
}
return 0;
}
} }
return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam);

748
Cmd.c

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -18,7 +18,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c // General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
@ -50,6 +49,12 @@ extern struct CONFIGTABLE xxcfg;
#endif #endif
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
struct TNCINFO * TNCInfo[71]; // Records are Malloc'd struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
extern int ReportTimer; extern int ReportTimer;
@ -78,6 +83,9 @@ char * stristr (char *ch1, char *ch2);
extern VOID * ENDBUFFERPOOL; extern VOID * ENDBUFFERPOOL;
extern int PoolBuilt;
extern int EnableOARCAPI;
// Read/Write length field in a buffer header // Read/Write length field in a buffer header
@ -364,7 +372,7 @@ BOK1:
if (n > 1000) if (n > 1000)
{ {
Debugprintf("Loop searching free chain - pointer = %p %p", debug, pointer); Debugprintf("Releasebuffer Loop searching free chain - pointer = %p %p from %s Line %d", debug, pointer, File, Line);
return 0; return 0;
} }
} }
@ -377,6 +385,11 @@ BOK1:
QCOUNT++; QCOUNT++;
if (PoolBuilt && QCOUNT > MAXBUFFS)
{
Debugprintf("Releasebuffer QCOUNT > MAXBUFFS - pointer = %p from %s Line %d", pointer, File, Line);
return 0;
}
return 0; return 0;
} }
@ -474,7 +487,7 @@ int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF)
next = Q[0]; next = Q[0];
while (next[0] != 0) while (next[0] != 0)
next=next[0]; // Chain to end of queue next = next[0]; // Chain to end of queue
next[0] = BUFF; // New one on end next[0] = BUFF; // New one on end
@ -914,7 +927,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
sprintf(Msg, "%d SCANSTOP", TNC->Port); sprintf(Msg, "%d SCANSTOP", TNC->Port);
Rig_Command( (TRANSPORTENTRY *) -1, Msg); Rig_Command((TRANSPORTENTRY *) -1, Msg);
UpdateMH(TNC, Call, '+', 'I'); UpdateMH(TNC, Call, '+', 'I');
} }
@ -1062,6 +1075,7 @@ BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
WritetoConsoleLocal("\n"); WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record "); WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf); WritetoConsoleLocal(errbuf);
WritetoConsoleLocal("\n");
} }
} }
} }
@ -1125,6 +1139,11 @@ int CompareNode(struct DEST_LIST ** a, struct DEST_LIST ** b)
return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7); return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7);
} }
int CompareRoutes(struct ROUTE ** a, struct ROUTE ** b)
{
return memcmp(a[0]->NEIGHBOUR_CALL, b[0]->NEIGHBOUR_CALL, 7);
}
DllExport int APIENTRY CountFramesQueuedOnStream(int Stream) DllExport int APIENTRY CountFramesQueuedOnStream(int Stream)
{ {
BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1 BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1
@ -1493,8 +1512,8 @@ int SendMsgEx(int stream, char * msg, int len, int GetSem)
if (QCOUNT < 50) if (QCOUNT < 50)
return 0; // Dont want to run out return 0; // Dont want to run out
if (GetSem) if (GetSem)
GetSemaphore(&Semaphore, 10); GetSemaphore(&Semaphore, 10);
if ((MSG = GetBuff()) == 0) if ((MSG = GetBuff()) == 0)
{ {
@ -1623,7 +1642,7 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
MSG->LENGTH = len + MSGHDDRLEN; MSG->LENGTH = len + MSGHDDRLEN;
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF) // PACTOR/WINMOR Style if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF) // PACTOR/WINMOR Style
{ {
// Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR // Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
@ -2130,7 +2149,16 @@ int CanPortDigi(int Port)
return TRUE; return TRUE;
} }
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum) DllExport int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT)
{
if (PORT)
return PORT->Hardware;
return 0;
}
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum)
{ {
struct PORTCONTROL * PORTVEC = PORTTABLE; struct PORTCONTROL * PORTVEC = PORTTABLE;
@ -2687,6 +2715,14 @@ int DoRoutes()
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{ {
// Dont save routes from config file here or they are difficult to get rid of
if (Routes->NEIGHBOUR_FLAG & LOCKEDBYCONFIG)
{
Routes++;
continue;
}
len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall); len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall);
Normcall[len]=0; Normcall[len]=0;
@ -2710,7 +2746,7 @@ int DoRoutes()
digis[0] = 0; digis[0] = 0;
len=sprintf(line, len=sprintf(line,
"ROUTE ADD %s %d %d %s %d %d %d %d %d\n", "ROUTE ADD %s %d %d %s %d %d %d %d %d %c\n",
Normcall, Normcall,
Routes->NEIGHBOUR_PORT, Routes->NEIGHBOUR_PORT,
Routes->NEIGHBOUR_QUAL, digis, Routes->NEIGHBOUR_QUAL, digis,
@ -2718,7 +2754,8 @@ int DoRoutes()
Routes->NBOUR_FRACK, Routes->NBOUR_FRACK,
Routes->NBOUR_PACLEN, Routes->NBOUR_PACLEN,
Routes->INP3Node | (Routes->NoKeepAlive << 2), Routes->INP3Node | (Routes->NoKeepAlive << 2),
Routes->OtherendsRouteQual); Routes->OtherendsRouteQual,
(Routes->NEIGHBOUR_FLAG & LOCKEDBYSYSOP)?'!':' ');
fputs(line, file); fputs(line, file);
} }
@ -3283,8 +3320,12 @@ SOCKADDR_IN reportdest = {0};
SOCKET ReportSocket = 0; SOCKET ReportSocket = 0;
SOCKET NodeAPISocket = 0 ;
SOCKADDR_IN Chatreportdest = {0}; SOCKADDR_IN Chatreportdest = {0};
SOCKADDR_IN UDPreportdest = {0};
extern char LOCATOR[]; // Locator for Reporting - may be Maidenhead or LAT:LON extern char LOCATOR[]; // Locator for Reporting - may be Maidenhead or LAT:LON
extern char MAPCOMMENT[]; // Locator for Reporting - may be Maidenhead or LAT:LON extern char MAPCOMMENT[]; // Locator for Reporting - may be Maidenhead or LAT:LON
extern char LOC[7]; // Maidenhead Locator for Reporting extern char LOC[7]; // Maidenhead Locator for Reporting
@ -3640,11 +3681,22 @@ pthread_t ResolveUpdateThreadId = 0;
char NodeMapServer[80] = "update.g8bpq.net"; char NodeMapServer[80] = "update.g8bpq.net";
char ChatMapServer[80] = "chatupdate.g8bpq.net"; char ChatMapServer[80] = "chatupdate.g8bpq.net";
char NodeAPIServer[80] = "node-api.packet.oarc.uk";
int NodeAPIPort = 13579;
int nodeStartedSent = 0;
extern time_t LastNodeStatus;
void hookNodeStarted();
VOID ResolveUpdateThread(void * Unused) VOID ResolveUpdateThread(void * Unused)
{ {
struct hostent * HostEnt1; struct hostent * HostEnt1;
struct hostent * HostEnt2; struct hostent * HostEnt2;
struct hostent * HostEnt3;
ResolveUpdateThreadId = GetCurrentThreadId(); ResolveUpdateThreadId = GetCurrentThreadId();
@ -3672,12 +3724,28 @@ VOID ResolveUpdateThread(void * Unused)
if (HostEnt2) if (HostEnt2)
memcpy(&Chatreportdest.sin_addr.s_addr,HostEnt2->h_addr,4); memcpy(&Chatreportdest.sin_addr.s_addr,HostEnt2->h_addr,4);
if (HostEnt1 && HostEnt2) Debugprintf("Resolving %s", NodeAPIServer);
HostEnt3 = gethostbyname(NodeAPIServer);
if (HostEnt3)
{ {
Sleep(1000 * 60 * 30); memcpy(&UDPreportdest.sin_addr.s_addr,HostEnt3->h_addr,4);
if (nodeStartedSent == 0)
{
hookNodeStarted();
nodeStartedSent = 1;
LastNodeStatus = time(NULL);
}
}
if (HostEnt1 && HostEnt2)
{
Sleep(1000 * 60 * 30);
continue; continue;
} }
Debugprintf("Resolve Failed for update.g8bpq.net or chatmap.g8bpq.net"); Debugprintf("Resolve Failed for update.g8bpq.net or chatmap.g8bpq.net");
Sleep(1000 * 60 * 5); Sleep(1000 * 60 * 5);
} }
@ -3711,7 +3779,7 @@ VOID OpenReportingSockets()
reportdest.sin_port = htons(81); reportdest.sin_port = htons(81);
ConvToAX25("DUMMY-1", ReportDest); ConvToAX25("DUMMY-1", ReportDest);
} }
// Set up Chat Report even if no LOCATOR reportdest.sin_family = AF_INET; // Set up Chat Report even if no LOCATOR reportdest.sin_family = AF_INET;
// Socket must be opened in MailChat Process // Socket must be opened in MailChat Process
@ -4784,6 +4852,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
struct stat STAT; struct stat STAT;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
char PortList[256] = ""; char PortList[256] = "";
int len = 0;
while (PORT) while (PORT)
{ {
@ -4825,7 +4894,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
*ptr = '\r'; *ptr = '\r';
sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER); len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER);
} }
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;
@ -5163,14 +5232,14 @@ skipit:
} }
} }
void SendDataToPktMapThread(); void SendDataToPktMapThread(void * Param);
void SendDataToPktMap() void SendDataToPktMap()
{ {
_beginthread(SendDataToPktMapThread,2048000,0); _beginthread(SendDataToPktMapThread,2048000,0);
} }
void SendDataToPktMapThread() void SendDataToPktMapThread(void * Param)
{ {
char Return[256] = ""; char Return[256] = "";
char Request[64]; char Request[64];

941
Events.c

File diff suppressed because it is too large Load diff

View file

@ -27,6 +27,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line); void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void DeleteRestartData(CIRCUIT * conn);
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress); int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
@ -41,6 +43,130 @@ int B2RestartCount = 0;
extern char ProperBaseDir[]; extern char ProperBaseDir[];
char RestartDir[MAX_PATH] = "";
void GetRestartData()
{
int i;
struct FBBRestartData Restart;
struct FBBRestartData * RestartRec;
char MsgFile[MAX_PATH];
FILE * hFile;
int FileSize;
struct stat STAT;
size_t ReadLen = 0;
time_t Age;
strcpy(RestartDir, MailDir);
strcat(RestartDir, "/Restart");
// Make sure RestartDir exists
#ifdef WIN32
CreateDirectory(RestartDir, NULL); // Just in case
#else
mkdir(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
chmod(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif
// look for restart files. These will be numbered from 1 up
for (i = 1; 1; i++)
{
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
if (stat(MsgFile, &STAT) == -1)
break;
FileSize = STAT.st_size;
Age = time(NULL) - STAT.st_ctime;
if (Age > 86400 * 2) // Max 2 days
continue;
hFile = fopen(MsgFile, "rb");
if (hFile == NULL)
break;
// Read Restart Record
fread(&Restart, 1, sizeof(struct FBBRestartData), hFile);
if ((Restart.MailBufferSize + sizeof(struct FBBRestartData)) != FileSize) // Duff file
{
fclose(hFile);
break;
}
RestartRec = zalloc(sizeof (struct FBBRestartData));
GetSemaphore(&AllocSemaphore, 0);
RestartData = realloc(RestartData,(++RestartCount+1) * sizeof(void *));
RestartData[RestartCount] = RestartRec;
FreeSemaphore(&AllocSemaphore);
memcpy(RestartRec, &Restart, sizeof(struct FBBRestartData));
RestartRec->MailBuffer = malloc(RestartRec->MailBufferSize);
ReadLen = fread(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile);
Logprintf(LOG_BBS, 0, '?', "Restart Data for %s %s Len %d Loaded", RestartRec->Call, RestartRec->bid, RestartRec->length);
fclose(hFile);
}
}
void SaveRestartData()
{
// Save restart data to file so we can reload on restart
// Restart data has pointers to buffers so we must save copy of data and reconstitue on restart
// Delete and resave all restart data to keep restart directory clean
int i, n = 1;
char MsgFile[MAX_PATH];
FILE * hFile;
size_t WriteLen=0;
struct FBBRestartData * RestartRec = NULL;
struct stat STAT;
time_t NOW = time(NULL);
for (i = 1; 1; i++)
{
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
if (stat(MsgFile, &STAT) == -1)
break;
DeleteFile(MsgFile);
}
for (i = 1; i <= RestartCount; i++)
{
RestartRec = RestartData[i];
if (RestartRec == 0)
return; // Shouldn't happen!
if ((NOW - RestartRec->TimeCreated) > 86400 * 2) // Max 2 days
continue;
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, n++);
hFile = fopen(MsgFile, "wb");
if (hFile)
{
WriteLen = fwrite(RestartRec, 1, sizeof(struct FBBRestartData), hFile); // Save Header
WriteLen = fwrite(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile); // Save Data
fclose(hFile);
}
}
}
VOID FBBputs(CIRCUIT * conn, char * buf) VOID FBBputs(CIRCUIT * conn, char * buf)
{ {
// Sends to user and logs // Sends to user and logs
@ -985,12 +1111,12 @@ loop:
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((RestartRec->UserPointer == conn->UserPointer) if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
&& (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0)) && (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
{ {
if (RestartRec->TempMsg->length <= offset) if (RestartRec->length <= offset)
{ {
conn->TempMsg->length = RestartRec->TempMsg->length; conn->TempMsg->length = RestartRec->length;
conn->MailBuffer = RestartRec->MailBuffer; conn->MailBuffer = RestartRec->MailBuffer;
conn->MailBufferSize = RestartRec->MailBufferSize; conn->MailBufferSize = RestartRec->MailBufferSize;
@ -1019,6 +1145,7 @@ loop:
RestartData[n] = RestartData[n+1]; // move down all following entries RestartData[n] = RestartData[n+1]; // move down all following entries
} }
RestartCount--; RestartCount--;
SaveRestartData();
} }
} }
@ -1146,6 +1273,7 @@ loop:
{ {
#endif #endif
conn->InputMode = 0; // So we won't save Restart data if decode fails conn->InputMode = 0; // So we won't save Restart data if decode fails
DeleteRestartData(conn);
Decode(conn, 0); // Setup Next Message will reset InputMode if needed Decode(conn, 0); // Setup Next Message will reset InputMode if needed
#ifndef LINBPQ #ifndef LINBPQ
} }
@ -1845,14 +1973,14 @@ VOID SaveFBBBinary(CIRCUIT * conn)
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((RestartRec->UserPointer == conn->UserPointer) if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
&& (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0)) && (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
{ {
// Fund it, so reuse // Found it, so reuse
// If we have more data, reset retry count // If we have more data, reset retry count
if (RestartRec->TempMsg->length < conn->TempMsg->length) if (RestartRec->length < conn->TempMsg->length)
RestartRec->Count = 0;; RestartRec->Count = 0;;
break; break;
@ -1869,19 +1997,53 @@ VOID SaveFBBBinary(CIRCUIT * conn)
RestartData[RestartCount] = RestartRec; RestartData[RestartCount] = RestartRec;
FreeSemaphore(&AllocSemaphore); FreeSemaphore(&AllocSemaphore);
RestartRec->TimeCreated = time(NULL);
} }
RestartRec->UserPointer = conn->UserPointer; strcpy(RestartRec->Call, conn->UserPointer->Call);
RestartRec->TempMsg = conn->TempMsg; RestartRec->length = conn->TempMsg->length;
strcpy(RestartRec->bid, conn->TempMsg->bid);
RestartRec->MailBuffer = conn->MailBuffer; RestartRec->MailBuffer = conn->MailBuffer;
RestartRec->MailBufferSize = conn->MailBufferSize; RestartRec->MailBufferSize = conn->MailBufferSize;
len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart", len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart",
conn->Callsign, conn->TempMsg->length); conn->Callsign, conn->TempMsg->length);
SaveRestartData();
WriteLogLine(conn, '|',Msg, len, LOG_BBS); WriteLogLine(conn, '|',Msg, len, LOG_BBS);
} }
void DeleteRestartData(CIRCUIT * conn)
{
struct FBBRestartData * RestartRec = NULL;
int i, n;
if (conn->TempMsg == NULL)
return;
for (i = 1; i <= RestartCount; i++)
{
RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
{
// Remove restrt data
for (n = i; n < RestartCount; n++)
{
RestartData[n] = RestartData[n+1]; // move down all following entries
}
RestartCount--;
SaveRestartData();
return;
}
}
}
BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader) BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
{ {
int i, n; int i, n;
@ -1895,15 +2057,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((RestartRec->UserPointer == conn->UserPointer) if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
&& (strcmp(RestartRec->TempMsg->bid, FBBHeader->BID) == 0)) && (strcmp(RestartRec->bid, FBBHeader->BID) == 0))
{ {
char Msg[120]; char Msg[120];
int len; int len;
RestartRec->Count++; RestartRec->Count++;
if (RestartRec->Count > 3) if (RestartRec->Count > 10)
{ {
len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning", len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning",
FBBHeader->BID); FBBHeader->BID);
@ -1918,15 +2080,16 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
} }
RestartCount--; RestartCount--;
SaveRestartData();
return FALSE; return FALSE;
} }
len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d", len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d",
FBBHeader->BID, RestartRec->TempMsg->length); FBBHeader->BID, RestartRec->length);
WriteLogLine(conn, '|',Msg, len, LOG_BBS); WriteLogLine(conn, '|',Msg, len, LOG_BBS);
return (RestartRec->TempMsg->length); return (RestartRec->length);
} }
} }

View file

@ -36,6 +36,12 @@ extern int (WINAPI FAR *EnumProcessesPtr)();
#include "bpq32.h" #include "bpq32.h"
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
#define VERSION_MAJOR 2 #define VERSION_MAJOR 2
#define VERSION_MINOR 0 #define VERSION_MINOR 0
@ -538,8 +544,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]))
{ {
} }
@ -815,7 +825,7 @@ pollloop:
char outbuff[1000]; char outbuff[1000];
int newlen; int newlen;
buff->L2DATA[-1] = 6; // KISS Control buff->PID = 6; // KISS Control (PID is just before Data)
newlen = KissEncode(&buff->L2DATA[-1], outbuff, txlen); newlen = KissEncode(&buff->L2DATA[-1], outbuff, txlen);
sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr)); sendto(TNC->TCPDataSock, outbuff, newlen, 0, (struct sockaddr *)&TNC->Datadestaddr, sizeof(struct sockaddr));
@ -1180,7 +1190,6 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
@ -1211,7 +1220,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_FLDIGI; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View file

@ -43,6 +43,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
int KillTNC(struct TNCINFO * TNC); int KillTNC(struct TNCINFO * TNC);
static int RestartTNC(struct TNCINFO * TNC); static int RestartTNC(struct TNCINFO * TNC);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
extern int (WINAPI FAR *GetModuleFileNameExPtr)(); extern int (WINAPI FAR *GetModuleFileNameExPtr)();
extern int (WINAPI FAR *EnumProcessesPtr)(); extern int (WINAPI FAR *EnumProcessesPtr)();
static int Socket_Data(int sock, int error, int eventcode); static int Socket_Data(int sock, int error, int eventcode);
@ -452,6 +457,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC->lasttime = ltime; TNC->lasttime = ltime;
ConnecttoFreeData(port); ConnecttoFreeData(port);
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
@ -740,7 +750,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1393,14 +1406,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_FREEDATA; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FREEDATA;
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->ARDOPDataBuffer = malloc(MAXRXSIZE); TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
TNC->ARDOPBuffer = malloc(FREEDATABUFLEN); TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -4139,7 +4152,7 @@ void buildParamString(struct TNCINFO * TNC, char * line)
FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel); FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
if (FDI->hamlibHost) if (FDI->hamlibHost)
sprintf(line, "%s --rigctld_ip %s --rigctld_port %d", line, FDI->hamlibHost, FDI->hamlibPort); sprintf(&line[strlen(line)], " --rigctld_ip %s --rigctld_port %d", FDI->hamlibHost, FDI->hamlibPort);
if (FDI->LimitBandWidth) if (FDI->LimitBandWidth)
strcat(line, " --500hz"); strcat(line, " --500hz");

View file

@ -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)
{ {

View file

@ -336,7 +336,8 @@ LRESULT CALLBACK PacWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
} }
#endif #endif
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc()) BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height,
VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream))
{ {
#ifdef LINBPQ #ifdef LINBPQ
return FALSE; return FALSE;
@ -1865,9 +1866,6 @@ static char ** SeparateMultiString(char * MultiString)
return Value; return Value;
} }
extern int nextDummyInterlock; extern int nextDummyInterlock;
int standardParams(struct TNCINFO * TNC, char * buf) int standardParams(struct TNCINFO * TNC, char * buf)
@ -1916,7 +1914,7 @@ int standardParams(struct TNCINFO * TNC, char * buf)
TNC->ActiveTXFreq = atof(&buf[13]); TNC->ActiveTXFreq = atof(&buf[13]);
else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session
TNC->ActiveRXFreq = atof(&buf[13]); TNC->ActiveRXFreq = atof(&buf[13]);
else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at start of session else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at end of session
TNC->DisconnectScript = SeparateMultiString(&buf[17]); TNC->DisconnectScript = SeparateMultiString(&buf[17]);
else if (_memicmp(buf, "PTTONHEX", 8) == 0) else if (_memicmp(buf, "PTTONHEX", 8) == 0)
{ {

View file

@ -648,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]))
{ {
} }
@ -1177,10 +1181,10 @@ VOID * HSMODEMExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_HSMODEM;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HSMODEM;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

File diff suppressed because it is too large Load diff

View file

@ -71,6 +71,8 @@ BOOL SHA1PasswordHash(char * String, char * Hash);
char * byte_base64_encode(char *str, int len); char * byte_base64_encode(char *str, int len);
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
extern struct ROUTE * NEIGHBOURS; extern struct ROUTE * NEIGHBOURS;
extern int ROUTE_LEN; extern int ROUTE_LEN;
@ -103,9 +105,13 @@ extern int NumberofPorts;
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
extern struct AXIPPORTINFO * Portlist[];
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len); VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
int CompareNode(const void *a, const void *b); int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b); int CompareAlias(const void *a, const void *b);
int CompareRoutes(const void * a, const void * b);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token); void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen); void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
@ -143,7 +149,7 @@ char Tail[] = "</body></html>";
char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>" char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>"
"<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>"; "<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>";
char RouteLine[] = "<tr><td>%s%d</td><td>%s%c</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>"; char RouteLine[] = "<tr><td>%s%d</td><td>%s%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>";
char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>" char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>"
"<table align=center bgcolor=white>" "<table align=center bgcolor=white>"
"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>" "<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
@ -2412,7 +2418,10 @@ doHeader:
if (Session == 0) if (Session == 0)
Session = &Dummy; Session = &Dummy;
Session->TNC = LOCAL; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag if (LOCAL)
Session->TNC = (struct TNCINFO *)(uintptr_t)1; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
else
Session->TNC = 0;
WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL); WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL); WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
@ -3789,33 +3798,129 @@ doHeader:
*/ */
// AXIP Partners
if (_stricmp(NodeURL, "/Node/AXIP.html") == 0)
{
int i;
char Normcall[10];
int Width = 5;
int x = 0, n = 0, nd = 0;
struct arp_table_entry * List[1000];
struct arp_table_entry * ListD[1000];
char AXIPList[10000] = "";
int ListLen = 0;
struct AXIPPORTINFO * AXPORT = Portlist[0];
struct PORTCONTROL * PORT = PORTTABLE;
struct arp_table_entry * arp;
time_t NOW = time(NULL);
char AXIPHeader[] =
"<table align='center' bgcolor='ffffff' border=2 cellpadding=10 cellspacing=2 style=font-family:monospace>"
"<tr><td align='center'>AXIP Up</td><td align='center'>AXIP Down</td></tr><tr><td valign='top'>%s";
while (PORT)
{
AXPORT = Portlist[PORT->PORTNUMBER];
if (AXPORT)
{
// Get ARP entries
for (i = 0; i < AXPORT->arp_table_len; i++)
{
arp = &AXPORT->arp_table[i];
if (arp->LastHeard == 0 || (NOW - arp->LastHeard) > 3600) // Considered down
ListD[nd++] = arp;
else
List[n++] = arp;
}
}
PORT = PORT->PORTPOINTER;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareNode);
if (nd > 1)
qsort(ListD, nd, sizeof(void *), CompareNode);
for (i = 0; i < n; i++)
{
int len = ConvFromAX25(List[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (List[i]->LastHeard)?(NOW - List[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], AXIPHeader, AXIPList);
ListLen = 0;
for (i = 0; i < nd; i++)
{
int len = ConvFromAX25(ListD[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (ListD[i]->LastHeard)?(NOW - ListD[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td><td valign='top'>%s", AXIPList);
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td></tr></table></body></html>");
}
if (_stricmp(NodeURL, "/Node/Routes.html") == 0) if (_stricmp(NodeURL, "/Node/Routes.html") == 0)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int count; int count, i;
char Normcall[10]; char Normcall[10];
char locked; char locked[4] = " ";
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
int Iframes, Retries; int Iframes, Retries;
char Active[10]; char Active[10];
int Queued; int Queued;
int x = 0, n = 0;
struct ROUTE * List[1000];
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr); ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr);
for (count=0; count<MaxRoutes; count++) // Build and sort list of routes
for (count = 0; count < MaxRoutes; count++)
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{
List[n++] = Routes;
if (n > 999)
break;
}
Routes++;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareRoutes);
for (i = 0; i < n; i++)
{
Routes = List[i];
{ {
int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall); int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
Normcall[len]=0; Normcall[len]=0;
if ((Routes->NEIGHBOUR_FLAG & 1) == 1) if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG)
locked = '!'; strcpy(locked, "!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
locked = ' '; strcpy(locked, " ");
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
@ -4322,7 +4427,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
{ {
int ReplyLen = 0; int ReplyLen = 0;
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
char * user, * password, * Key; char * user, * password;
struct HTTPConnectionInfo * NewSession; struct HTTPConnectionInfo * NewSession;
int i; int i;
struct UserRec * USER; struct UserRec * USER;
@ -4371,7 +4476,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
if (user && user[0] && password && password[0]) if (user && user[0] && password && password[0])
{ {
sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password); sprintf(&MsgPtr[strlen(MsgPtr)], "?%s&%s", user, password);
} }
} }
@ -4734,7 +4839,14 @@ void ProcessWebmailWebSockThread(void * conn)
Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0); Sent = send(sockptr->socket, _REPLYBUFFER, ReplyLen, 0);
while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max if (Sent == -1) // Connecton lost
{
closesocket(sockptr->socket);
free(conn);
return;
}
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
{ {
if (Sent > 0) // something sent if (Sent > 0) // something sent
{ {
@ -4780,11 +4892,16 @@ void ProcessWebmailWebSockThread(void * conn)
CloseHandle(hPipe); CloseHandle(hPipe);
// ?? do we need a thread to handle write which may block
Sent = send(sockptr->socket, Reply, ReplyLen, 0); Sent = send(sockptr->socket, Reply, ReplyLen, 0);
while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max if (Sent == -1) // Connecton lost
{
free(conn);
closesocket(sockptr->socket);
return;
}
while (Sent != ReplyLen && Loops++ < 3000) // 90 secs max
{ {
// Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops); // Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);

View file

@ -426,7 +426,7 @@ VOID ChatExpandAndSendMessage(ChatCIRCUIT * conn, char * Msg, int LOG)
len = RemoveLF(NewMessage, (int)strlen(NewMessage)); len = RemoveLF(NewMessage, (int)strlen(NewMessage));
ChatWriteLogLine(conn, '>', NewMessage, len, LOG); ChatWriteLogLine(conn, '>', NewMessage, len, LOG_CHAT);
ChatQueueMsg(conn, NewMessage, len); ChatQueueMsg(conn, NewMessage, len);
} }
@ -1229,7 +1229,7 @@ void chkctl(ChatCIRCUIT *ckt_from, char * Buffer, int Len)
for (i = 1; i < (Len - 1); i++) for (i = 1; i < (Len - 1); i++)
{ {
if (Buffer[i] < 32) if (Buffer[i] < 32 && Buffer[i] != 7) // Accept BELL
{ {
if (Buffer[i] == 9) if (Buffer[i] == 9)
{ {
@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
__try __try
{ {
#endif #endif
len = sprintf(line, "%s %p %s", line, cn->node, cn->node->alias); len += sprintf(&line[len], " %p %s", cn->node, cn->node->alias);
if (len > 80) if (len > 80)
{ {
Debugprintf("%s", line); Debugprintf("%s", line);
@ -2821,7 +2821,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
CHATNODE *node; CHATNODE *node;
LINK *link; LINK *link;
char line[1000]; char line[1000];
int len; int len = 0;
CN *cn; CN *cn;
int i = 0; int i = 0;
@ -2836,16 +2836,16 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
nprintf(conn, "%d Node(s)\r", i); nprintf(conn, "%d Node(s)\r", i);
if (Flag == 'c') if (Flag == 'c')
sprintf(line, "Here %-6.6s <-", OurNode); len = sprintf(line, "Here %-6.6s <-", OurNode);
else else
sprintf(line, "Here %-6.6s <-", OurAlias); len = sprintf(line, "Here %-6.6s <-", OurAlias);
for (node = node_hd; node; node = node->next) if (node->refcnt) for (node = node_hd; node; node = node->next) if (node->refcnt)
{ {
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "%s %s", line, node->call); len += sprintf(&line[len], " %s", node->call);
else else
len = sprintf(line, "%s %s", line, node->alias); len += sprintf(&line[len], " %s", node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2873,9 +2873,9 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
__try __try
{ {
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "%s %s", line, cn->node->call); len += sprintf(&line[len], " %s", cn->node->call);
else else
len = sprintf(line, "%s %s", line, cn->node->alias); len += sprintf(&line[len], " %s", cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2883,23 +2883,23 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len = sprintf(line, "%s *PE* Corrupt Rec %x %x", line, cn, cn->node);} {len += sprintf(&line[len], " *PE* Corrupt Rec %x %x", cn, cn->node);}
} }
else else
len = sprintf(line, "%s Corrupt Rec %x %x ", line, cn, cn->node); len = sprintf(&line[len], " Corrupt Rec %x %x ", cn, cn->node);
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len = sprintf(line, "%s *PE* Corrupt Rec %x %x ", line, cn, cn->node);} {len += sprintf(&line[len], " *PE* Corrupt Rec %x %x ", cn, cn->node);}
#else #else
for (cn = circuit->hnode; cn; cn = cn->next) for (cn = circuit->hnode; cn; cn = cn->next)
{ {
if (cn->node && cn->node->alias) if (cn->node && cn->node->alias)
{ {
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "%s %s", line, cn->node->call); len += sprintf(&line[len], " %s", cn->node->call);
else else
len = sprintf(line, "%s %s", line, cn->node->alias); len += sprintf(&line[len], " %s", cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2907,7 +2907,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
else else
len = sprintf(line, "%s Corrupt Rec %p %p ", line, cn, cn->node); len += sprintf(&line[len], " Corrupt Rec %p %p ", cn, cn->node);
} }
#endif #endif
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -3682,7 +3682,7 @@ VOID SendChatLinkStatus()
} }
} }
len = sprintf(Msg, "%s%s %c ", Msg, link->call, '0' + link->flags); len += sprintf(&Msg[len], "%s %c ", link->call, '0' + link->flags);
if (len > 240) if (len > 240)
break; break;

View file

@ -100,7 +100,10 @@ TODo ?Multiple Adapters
#ifdef WIN32 #ifdef WIN32
int pcap_sendpacket(pcap_t *p, u_char *buf, int size); int pcap_sendpacket(pcap_t *p, u_char *buf, int size);
#else #else
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int); #ifndef PCAP_API
#define PCAP_API extern
#endif
PCAP_API int pcap_sendpacket(pcap_t *, const u_char *, int);
#endif #endif
#ifndef LINBPQ #ifndef LINBPQ
@ -387,7 +390,7 @@ char * FormatIP(uint32_t Addr)
return FormatIPWork; return FormatIPWork;
} }
int CompareRoutes (const VOID * a, const VOID * b) int CompareIPRoutes (const VOID * a, const VOID * b)
{ {
PROUTEENTRY x; PROUTEENTRY x;
PROUTEENTRY y; PROUTEENTRY y;
@ -4972,7 +4975,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, str
Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes); Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
if (NumberofRoutes) if (NumberofRoutes)
qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareRoutes); qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareIPRoutes);
for (i=0; i < NumberofRoutes; i++) for (i=0; i < NumberofRoutes; i++)
{ {
@ -5413,11 +5416,8 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
int Len; int Len;
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data; PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
UCHAR * Msg; UCHAR * Msg;
int Type;
int Length, ComLen;
int IntVal;
UCHAR Reply[256]; UCHAR Reply[256];
int PDULen, SendLen; int SendLen;
int Offset = 0; int Offset = 0;
Len = ntohs(IPptr->IPLENGTH); Len = ntohs(IPptr->IPLENGTH);

View file

@ -70,6 +70,8 @@ static RECT Rect;
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len); int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
static FILE * LogHandle[32] = {0}; static FILE * LogHandle[32] = {0};
@ -517,6 +519,28 @@ ok:
return 0; return 0;
} }
VOID KAMSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC)
{
struct STREAMINFO * STREAM = &TNC->Streams[0];
strcpy(TNC->WEB_TNCSTATE, "Interlocked");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
// STREAM->CmdSet = STREAM->CmdSave = zalloc(100);
// sprintf(STREAM->CmdSet, "I%s\r", "SCSPTC"); // Should prevent connects
}
VOID KAMReleasePort(struct TNCINFO * TNC)
{
struct STREAMINFO * STREAM = &TNC->Streams[0];
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
}
static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL) static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
{ {
int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>" int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>"
@ -567,15 +591,15 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
return ExtProc; return ExtProc;
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_KAM; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KAM;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
PortEntry->MAXHOSTMODESESSIONS = 11; // Default PortEntry->MAXHOSTMODESESSIONS = 11; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -595,6 +619,11 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort; PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort;
PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort; PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort;
// TNC->SuspendPortProc = KAMSuspendPort;
// TNC->ReleasePortProc = KAMReleasePort;
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
@ -886,24 +915,39 @@ VOID KAMPoll(int Port)
calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, TNC->Streams[0].MyCall); calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, TNC->Streams[0].MyCall);
TNC->Streams[0].MyCall[calllen] = 0; TNC->Streams[0].MyCall[calllen] = 0;
EncodeAndSend(TNC, "X", 1); // ??Return to packet mode?? EncodeAndSend(TNC, "X", 1); // ??Return to packet mode??
if (TNC->VeryOldMode)
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall); if (TNC->VeryOldMode)
else {
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall); datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->Streams[0].MyCall);
EncodeAndSend(TNC, TXMsg, datalen); EncodeAndSend(TNC, TXMsg, datalen);
TNC->InternalCmd = 'M'; }
else
{
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->Streams[0].MyCall);
EncodeAndSend(TNC, TXMsg, datalen);
if (TNC->OldMode == 0)
{
EncodeAndSend(TNC, TXMsg, datalen);
datalen = sprintf(TXMsg, "C20MYGTCALL %s", TNC->Streams[0].MyCall);
}
}
TNC->InternalCmd = 'M';
TNC->NeedPACTOR = 0; // Cancel enter Pactor TNC->NeedPACTOR = 0; // Cancel enter Pactor
sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall); SuspendOtherPorts(TNC);
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
// Stop Scanning sprintf(TNC->WEB_TNCSTATE, "In Use by %s", TNC->Streams[0].MyCall);
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
sprintf(Msg, "%d SCANSTOP", TNC->Port); // Stop Scanning
sprintf(Msg, "%d SCANSTOP", TNC->Port);
Rig_Command( (TRANSPORTENTRY *) -1, Msg); Rig_Command( (TRANSPORTENTRY *) -1, Msg);
} }
} }
@ -1036,9 +1080,22 @@ VOID KAMPoll(int Port)
UCHAR TXMsg[80] = "D20"; UCHAR TXMsg[80] = "D20";
if (TNC->VeryOldMode) if (TNC->VeryOldMode)
{
datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall); datalen = sprintf(TXMsg, "C20MYCALL %s", TNC->NodeCall);
EncodeAndSend(TNC, TXMsg, datalen);
}
else else
{
datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall); datalen = sprintf(TXMsg, "C20MYPTCALL %s", TNC->NodeCall);
EncodeAndSend(TNC, TXMsg, datalen);
if (TNC->OldMode == 0)
{
datalen = sprintf(TXMsg, "C20MYGTCALL %s", TNC->NodeCall);
EncodeAndSend(TNC, TXMsg, datalen);
}
}
EncodeAndSend(TNC, TXMsg, datalen); EncodeAndSend(TNC, TXMsg, datalen);
if (TNC->OldMode) if (TNC->OldMode)
@ -1046,6 +1103,7 @@ VOID KAMPoll(int Port)
else else
EncodeAndSend(TNC, "C20TOR", 6); // Back to Listen EncodeAndSend(TNC, "C20TOR", 6); // Back to Listen
TNC->InternalCmd = 'T'; TNC->InternalCmd = 'T';
TNC->Timeout = 50; TNC->Timeout = 50;
TNC->IntCmdDelay--; TNC->IntCmdDelay--;
@ -1266,6 +1324,51 @@ VOID KAMPoll(int Port)
return; return;
} }
if (memcmp(MsgPtr, "GTOR ", 5) == 0) // GTOR Connect
{
memcpy(STREAM->RemoteCall, &MsgPtr[5], 9);
STREAM->Connecting = TRUE;
// If Stream 0, Convert C CALL to PACTOR CALL
if (Stream == 0)
{
datalen = sprintf(TXMsg, "C20GTOR %s", TNC->Streams[0].RemoteCall);
// If Pactor, check busy detecters on any interlocked ports
if (TNC->HFPacket == 0 && InterlockedCheckBusy(TNC) && TNC->OverrideBusy == 0)
{
// Channel Busy. Wait
TNC->ConnectCmd = _strdup(TXMsg);
sprintf(TNC->WEB_TNCSTATE, "Waiting for clear channel");
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
TNC->BusyDelay = TNC->BusyWait * 10;
return;
}
TNC->OverrideBusy = FALSE;
sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s",
TNC->Streams[0].MyCall, TNC->Streams[0].RemoteCall);
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
}
else
datalen = sprintf(TXMsg, "C1%cC %s", Stream + '@', STREAM->RemoteCall);
EncodeAndSend(TNC, TXMsg, datalen);
TNC->Timeout = 50;
TNC->InternalCmd = 'C'; // So we dont send the reply to the user.
ReleaseBuffer(buffptr);
STREAM->Connecting = TRUE;
return;
}
if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0) // Disconnect if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0) // Disconnect
{ {
if (Stream == 0) if (Stream == 0)
@ -1644,6 +1747,10 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
return; return;
} }
WritetoTrace(TNC, Buffer, Len);
// Pass to Appl // Pass to Appl
Stream = TNC->CmdStream; Stream = TNC->CmdStream;
@ -1680,6 +1787,76 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Msg[0] == '?') // Status if (Msg[0] == '?') // Status
{ {
TNC->Timeout = 0; TNC->Timeout = 0;
/*
The response frame from the TNC will be:
<FEND>?0MSXY<FEND> - where MSXY are coded as follows:
M One byte indicating the current mode of operation.
A=Packet
B=RTTY
C=ASCII
D=AMTOR
E=FEC
F=SELFEC
G=LAMTOR
H=PACTOR
I=PTLISTEN
J=GTOR
K=NAVTEX
L=CW
M=TOR Standby
N=GMON
O=PSK31
S One byte indicating a sub-mode of operation. The byte
contains an ASCII character as follows:
0=Standby
1=Phasing
2=Connected
3=Disconnecting
4=FEC
5=SELFEC
6=PTFEC
X One byte (called status byte X). This byte is bit-
encoded to indicate specific conditions as follows:
Bit 0 = (IDLE) set to 1 when receiving IDLE
characters in a frame.
Bit 1 = (ERR) set to 1 to indicate the received frame
failed CRC check, or was not a valid CS
response frame.
Bit 2 = (Combined receive) set to 1 to indicate that
the data was constructed through the use of
error correction (i.e. Golay error correction
for G-TOR or Memory ARQ for Pactor).
Bit 3 = (RQ) set to 1 to indicate an RQ frame. If you
are the ISS, it indicates that the receiving
station has asked for a repeat of the last
data due to received errors. When you are the
IRS, it indicates that the transmitting
station has sent the same data that you have
already received. This means that the sending
station did not properly copy your
acknowledgement (CS code).
Bit 4 = (Huffman) set to 1 to indicate that this
frame contains data which uses Huffman
compression.
Bit 5 = (ISS) set to 1 to indicate that your station
is currently the ISS.
Bit 6&7 = (Speed) these two bits indicate the current
speed of an ARQ link or the PSK31 mode. The
coding of the bits is:
00 = 100 baud or BPSK31
01 = 200 baud or QPSK31
10 = 300 baud
Y One byte (called status byte Y). This byte is bit-
encoded to indicate specific conditions as follows:
Bit 0 = reserved (set to 0).
Bit 1 = (PTT) PTT is active.
Bit 2 = (Changeover) changeover in progress
Bits 3-7 = reserved (set to 0).
*/
return; return;
} }
@ -1790,6 +1967,10 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Msg[1] == '2' && Msg[2] == 'A') if (Msg[1] == '2' && Msg[2] == 'A')
TNC->HFPacket = TRUE; TNC->HFPacket = TRUE;
// Stop other ports in same group
SuspendOtherPorts(TNC);
ProcessIncommingConnect(TNC, Call, Stream, TRUE); ProcessIncommingConnect(TNC, Call, Stream, TRUE);
SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream]; SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
@ -2047,7 +2228,11 @@ VOID ForcedClose(struct TNCINFO * TNC, int Stream)
VOID CloseComplete(struct TNCINFO * TNC, int Stream) VOID CloseComplete(struct TNCINFO * TNC, int Stream)
{ {
TNC->NeedPACTOR = 50; sprintf(TNC->WEB_TNCSTATE, "Free");
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
ReleaseOtherPorts(TNC);
TNC->NeedPACTOR = 50;
} }

View file

@ -458,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]))
{ {
} }
@ -809,10 +813,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_KISSHF; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KISSHF;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

749
L2Code.c

File diff suppressed because it is too large Load diff

164
L3Code.c
View file

@ -60,6 +60,12 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE);
VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall); VOID SendNETROMRoute(struct PORTCONTROL * PORT, unsigned char * axcall);
void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer); void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer);
void SendVARANetromMsg(struct TNCINFO * TNC,L3MESSAGEBUFFER * Buffer); void SendVARANetromMsg(struct TNCINFO * TNC,L3MESSAGEBUFFER * Buffer);
VOID SENDNODESMSG(int Portnum);
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
extern int NODESINPROGRESS;
extern int NODESToOnePort;
extern int CLOSING;
extern BOOL NODESINPROGRESS ;; extern BOOL NODESINPROGRESS ;;
PPORTCONTROL L3CURRENTPORT; PPORTCONTROL L3CURRENTPORT;
@ -67,6 +73,8 @@ extern dest_list * CURRENTNODE;
int L3_10SECS = 10; int L3_10SECS = 10;
extern int PREFERINP3ROUTES;
VOID L3BG() VOID L3BG()
{ {
@ -92,7 +100,15 @@ VOID L3BG()
{ {
ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR; ROUTE = DEST->NRROUTE[ActiveRoute - 1].ROUT_NEIGHBOUR;
// if NetROM over VARA pass direct to the driver // if NetROM over VARA or NetROM over TCP pass direct to the driver
if (ROUTE && ROUTE->TCPPort)
{
PL3MESSAGEBUFFER Frame = (PL3MESSAGEBUFFER)Q_REM(&DEST->DEST_Q);
TCPNETROMSend(ROUTE, Frame);
ReleaseBuffer(Frame);
continue;
}
if (ROUTE) if (ROUTE)
{ {
@ -135,12 +151,14 @@ VOID L3BG()
// Drop through to Activate // Drop through to Activate
} }
// No Active Route
if (ACTIVATE_DEST(DEST) == FALSE) if (ACTIVATE_DEST(DEST) == FALSE)
{ {
// Node has no routes - get rid of it // Node has no routes - get rid of it
REMOVENODE(DEST); REMOVENODE(DEST);
return; // Avoid riskof looking at lod entries return; // Avoid risk of looking at old entries
} }
} }
} }
@ -154,22 +172,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 +205,17 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
// Current Route is 1 // Current Route is 1
if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
return FALSE; // No INP3 so No Routes return FALSE; // No INP3 so No Routes
DEST->DEST_ROUTE = 4; // First INP3 DEST->DEST_ROUTE = 4; // First INP3
ROUTE = DEST->ROUTE[0].ROUT_NEIGHBOUR; ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR;
} }
if (ROUTE == 0) // Shouldn't happen
return FALSE;
// if NetROM over VARA conection is made by the driver // if NetROM over VARA conection is made by the driver
TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT]; TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
@ -204,7 +236,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
return L2SETUPCROSSLINK(ROUTE); return L2SETUPCROSSLINK(ROUTE);
} }
// We mst be waiting for link to come up // We umst be waiting for link to come up
return TRUE; return TRUE;
@ -223,6 +255,13 @@ char Call1[10];
char Call2[10]; char Call2[10];
char Call3[10]; char Call3[10];
VOID PROCESSNODESPOLL(struct PORTCONTROL * PORT)
{
// Pauls G8BPT's request NODES Broadcast
SENDNODESMSG(PORT->PORTNUMBER);
return;
}
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT) VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
{ {
// PROCESS A NET/ROM 'NODES' MESSAGE // PROCESS A NET/ROM 'NODES' MESSAGE
@ -259,7 +298,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
{ {
APPL=&APPLCALLTABLE[App]; APPL=&APPLCALLTABLE[App];
if (APPL->APPLHASALIAS == 0 && CompareCalls(Msg->ORIGIN, APPL->APPLCALL)) if (CompareCalls(Msg->ORIGIN, APPL->APPLCALL))
return; return;
} }
@ -319,13 +358,13 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
// if locked route with quality zero ignore // if locked route with quality zero ignore
if ((ROUTE->NEIGHBOUR_FLAG & 1)) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG)) // LOCKED ROUTE
if (ROUTE->NEIGHBOUR_QUAL == 0) if (ROUTE->NEIGHBOUR_QUAL == 0)
return; return;
// If Ignoreunlocked set, ignore it not locked // If Ignoreunlocked set, ignore it not locked
if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG) == 0) // LOCKED ROUTE
if (PORT->IgnoreUnlocked) if (PORT->IgnoreUnlocked)
return; return;
@ -333,7 +372,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
// if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES // if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES
if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // Not LOCKED ROUTE if (ROUTE->NEIGHBOUR_FLAG == 0) // Not LOCKED ROUTE
ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY; ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY;
// GET TIME FROM BIOS DATA AREA OR RTC // GET TIME FROM BIOS DATA AREA OR RTC
@ -368,7 +407,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
NUMBEROFNODES++; NUMBEROFNODES++;
} }
// ALWAYS UPDATE ALIAS IN CASE NOT PRESENT IN ORIGINAL TABLE // ALWAYS UPDATE ALIAS IN CASE NOT PRESENT IN ORIGINAL TABLE
ptr1 = &Msg->L2DATA[1]; ptr1 = &Msg->L2DATA[1];
ptr2 = &DEST->DEST_ALIAS[0]; ptr2 = &DEST->DEST_ALIAS[0];
@ -436,10 +475,10 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
if (CheckExcludeList(ptr1) == 0) // Excluded if (CheckExcludeList(ptr1) == 0) // Excluded
continue; continue;
for (n = 0; n < 32; n++) for (n = 0; n < NumberofAppls; n++)
{ {
if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL)) if (CompareCalls(ptr1, APPLCALLTABLE[n].APPLCALL))
continue; goto IgnoreNode; // Don't update our applications
} }
// MAKE SURE ITS NOT CORRUPTED // MAKE SURE ITS NOT CORRUPTED
@ -548,7 +587,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
ptr1 += 7; ptr1 += 7;
// UPDATE ALIAS // UPDATE ALIAS#
memcpy(DEST->DEST_ALIAS, ptr1, 6); memcpy(DEST->DEST_ALIAS, ptr1, 6);
@ -707,11 +746,11 @@ int COUNTNODES(struct ROUTE * ROUTE)
count++; count++;
else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->ROUTE[0].ROUT_NEIGHBOUR == ROUTE) else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE) else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
DEST++; DEST++;
@ -726,12 +765,26 @@ VOID L3BG();
VOID SENDNEXTNODESFRAGMENT(); VOID SENDNEXTNODESFRAGMENT();
VOID SENDNODESMSG() VOID SENDNODESMSG(int Portnum)
{ {
if (NODESINPROGRESS) if (NODESINPROGRESS)
return; return;
L3CURRENTPORT = PORTTABLE; NODESToOnePort = Portnum;
if (Portnum) // Nodes to one port only
{
L3CURRENTPORT = GetPortTableEntryFromPortNum(Portnum);
if (L3CURRENTPORT == 0)
{
NODESToOnePort = 0;
return;
}
}
else
L3CURRENTPORT = PORTTABLE;
SENDNEXTNODESFRAGMENT(); SENDNEXTNODESFRAGMENT();
} }
@ -767,16 +820,19 @@ VOID SENDNEXTNODESFRAGMENT()
// No NODES to this port, so go to next // No NODES to this port, so go to next
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;
if (PORT == NULL)
if (PORT == NULL || NODESToOnePort)
{ {
// Finished // Finished
NODESToOnePort = 0;
NODESINPROGRESS = 0; NODESINPROGRESS = 0;
return; return;
} }
} }
L3CURRENTPORT = PORT; if (NODESToOnePort == 0) // CurrentPort already set if NODESToOnePort
L3CURRENTPORT = PORT;
DEST = CURRENTNODE = DESTS; // START OF LIST DEST = CURRENTNODE = DESTS; // START OF LIST
NODESINPROGRESS = 1; NODESINPROGRESS = 1;
@ -833,19 +889,30 @@ VOID SENDNEXTNODESFRAGMENT()
if (DEST >= ENDDESTLIST) if (DEST >= ENDDESTLIST)
{ {
CURRENTNODE = 0; // Finished on this port CURRENTNODE = 0; // Finished on this port
L3CURRENTPORT = PORT->PORTPOINTER;
if (L3CURRENTPORT == NULL)
{
// Finished
// if sending to only one port then stop
if (NODESToOnePort)
{
NODESToOnePort = 0;
NODESINPROGRESS = 0; NODESINPROGRESS = 0;
} }
else
{
L3CURRENTPORT = PORT->PORTPOINTER;
if (L3CURRENTPORT == NULL)
{
// Finished
NODESINPROGRESS = 0;
}
}
goto Sendit; goto Sendit;
} }
if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL && if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN && DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
(NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if DEST = 0; (NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if NODE = 0;
{ {
// Send it // Send it
@ -878,6 +945,9 @@ VOID SENDNEXTNODESFRAGMENT()
*(ptr1++) = (UCHAR)Qual; *(ptr1++) = (UCHAR)Qual;
if (Qual == 0)
continue;
Count--; Count--;
} }
DEST++; DEST++;
@ -924,13 +994,15 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason)
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason) VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
{ {
// FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
// SET INACTIVE // SET INACTIVE
dest_list * DEST; dest_list * DEST;
int n; int n;
if (Reason != NORMALCLOSE || ROUTE->INP3Node) // If a link restarts and is no longer inp3 we must still clear any inp3 routes
// if (Reason != NORMALCLOSE || ROUTE->INP3Node)
TellINP3LinkGone(ROUTE); TellINP3LinkGone(ROUTE);
DEST = DESTS; DEST = DESTS;
@ -945,7 +1017,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
if (DEST->DEST_ROUTE == 0) if (DEST->DEST_ROUTE == 0)
continue; continue;
if (DEST->ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route if (DEST->INP3ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route
{ {
// Yes, so clear // Yes, so clear
@ -1023,7 +1095,7 @@ VOID L3TimerProc()
L3TIMER = L3INTERVAL; L3TIMER = L3INTERVAL;
UPDATEDESTLIST(); UPDATEDESTLIST();
SENDNODESMSG(); SENDNODESMSG(0);
} }
} }
@ -1038,7 +1110,7 @@ VOID L3TimerProc()
{ {
ROUTE++; ROUTE++;
if (ROUTE->NEIGHBOUR_FLAG & 1) // Locked? if (ROUTE->NEIGHBOUR_FLAG) // Locked?
continue; continue;
if (ROUTE->NEIGHBOUR_LINK) // Has an active Session if (ROUTE->NEIGHBOUR_LINK) // Has an active Session
@ -1061,6 +1133,11 @@ VOID L3FastTimer()
MESSAGE * Msg; MESSAGE * Msg;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
// Not if Node is closing
if (CLOSING)
return;
INP3TIMER(); INP3TIMER();
// Send Node faster if VARA // Send Node faster if VARA
@ -1120,7 +1197,7 @@ UPDEST000:
{ {
// Any INP3 Routes? // Any INP3 Routes?
if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
{ {
// NO ROUTES LEFT TO DEST - REMOVE IT // NO ROUTES LEFT TO DEST - REMOVE IT
@ -1292,19 +1369,25 @@ VOID REMOVENODE(dest_list * DEST)
NUMBEROFNODES--; NUMBEROFNODES--;
} }
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK) VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
{ {
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED // L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE; struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL) if (ROUTE == NULL)
return; // NOTHING ??? return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
TellINP3LinkSetupFailed(ROUTE); TellINP3LinkSetupFailed(ROUTE);
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
@ -1313,9 +1396,10 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
} }
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE) VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
{ {
// FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
// SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE // SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
int n = MAXDESTS; int n = MAXDESTS;
@ -1328,7 +1412,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
if (ActiveRoute) if (ActiveRoute)
{ {
ActiveRoute --; // Routes numbered 1 - 6, idex from 0 ActiveRoute --; // Routes numbered 1 - 6, index from 0
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE) if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
{ {

1035
L4Code.c

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -83,8 +83,10 @@ void RHPPoll();
VOID GetPGConfig(); VOID GetPGConfig();
void SendBBSDataToPktMap(); void SendBBSDataToPktMap();
void CloseAllLinks();
void hookNodeClosing(char * Reason);
extern uint64_t timeLoadedMS; extern uint64_t INP3timeLoadedMS;
BOOL IncludesMail = FALSE; BOOL IncludesMail = FALSE;
BOOL IncludesChat = FALSE; BOOL IncludesChat = FALSE;
@ -262,9 +264,9 @@ extern char MailDir[MAX_PATH];
extern time_t MaintClock; // Time to run housekeeping extern time_t MaintClock; // Time to run housekeeping
#ifdef WIN32 #ifdef WIN32
BOOL KEEPGOING = 30; // 5 secs to shut down int KEEPGOING = 30; // 5 secs to shut down
#else #else
BOOL KEEPGOING = 50; // 5 secs to shut down int KEEPGOING = 50; // 5 secs to shut down
#endif #endif
BOOL Restarting = FALSE; BOOL Restarting = FALSE;
BOOL CLOSING = FALSE; BOOL CLOSING = FALSE;
@ -337,6 +339,7 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
// Handle the CTRL-C signal. // Handle the CTRL-C signal.
case CTRL_C_EVENT: case CTRL_C_EVENT:
printf( "Ctrl-C event\n\n" ); printf( "Ctrl-C event\n\n" );
CloseAllLinks();
CLOSING = TRUE; CLOSING = TRUE;
Beep( 750, 300 ); Beep( 750, 300 );
return( TRUE ); return( TRUE );
@ -344,7 +347,8 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
// CTRL-CLOSE: confirm that the user wants to exit. // CTRL-CLOSE: confirm that the user wants to exit.
case CTRL_CLOSE_EVENT: case CTRL_CLOSE_EVENT:
CLOSING = TRUE; CloseAllLinks();
CLOSING = TRUE;
printf( "Ctrl-Close event\n\n" ); printf( "Ctrl-Close event\n\n" );
Sleep(20000); Sleep(20000);
Beep( 750, 300 ); Beep( 750, 300 );
@ -354,7 +358,8 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
case CTRL_BREAK_EVENT: case CTRL_BREAK_EVENT:
Beep( 900, 200 ); Beep( 900, 200 );
printf( "Ctrl-Break event\n\n" ); printf( "Ctrl-Break event\n\n" );
CLOSING = TRUE; CloseAllLinks();
CLOSING = TRUE;
Beep( 750, 300 ); Beep( 750, 300 );
return FALSE; return FALSE;
@ -366,7 +371,8 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
case CTRL_SHUTDOWN_EVENT: case CTRL_SHUTDOWN_EVENT:
Beep( 750, 500 ); Beep( 750, 500 );
printf( "Ctrl-Shutdown event\n\n" ); printf( "Ctrl-Shutdown event\n\n" );
CLOSING = TRUE; CloseAllLinks();
CLOSING = TRUE;
Beep( 750, 300 ); Beep( 750, 300 );
return FALSE; return FALSE;
@ -381,51 +387,66 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#include <signal.h> #include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig) static void segvhandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "SIGSEGV Received\n"; char msg[] = "\nSIGSEGV Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
// print out all the frames to stderr // print out all the frames to stderr
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1); write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
hookNodeClosing("sigsegv");
Sleep(500);
exit(1);
} }
static void abrthandler(int sig) static void abrthandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "SIGABRT Received\n"; char msg[] = "\nSIGABRT Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
write(STDOUT_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1); write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
hookNodeClosing("sigabrt");
Sleep(500);
exit(1);
} }
static void sigterm_handler(int sig) static void sigterm_handler(int sig)
{ {
syslog(LOG_INFO, "terminating on SIGTERM\n"); syslog(LOG_INFO, "terminating on SIGTERM\n");
CLOSING = TRUE; CLOSING = TRUE;
CloseAllLinks();
} }
static void sigint_handler(int sig) static void sigint_handler(int sig)
{ {
printf("terminating on SIGINT\n"); printf("terminating on SIGINT\n");
CLOSING = TRUE; CLOSING = TRUE;
CloseAllLinks();
} }
@ -787,6 +808,8 @@ int Redirected = 0;
static void segvhandler(int sig); static void segvhandler(int sig);
static void abrthandler(int sig); static void abrthandler(int sig);
void GetRestartData();
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -830,21 +853,22 @@ int main(int argc, char * argv[])
#endif #endif
#endif #endif
// Disable Console Terminal if stdout redirected // Disable Console Terminal if stdout redirected
// printf("STDOUT %d\n",isatty(STDOUT_FILENO)); // printf("STDOUT %d\n",isatty(STDOUT_FILENO));
// printf("STDIN %d\n",isatty(STDIN_FILENO)); // printf("STDIN %d\n",isatty(STDIN_FILENO));
if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)) if (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO))
Redirected = 1; Redirected = 1;
timeLoadedMS = GetTickCount(); INP3timeLoadedMS = GetTickCount();
#endif #endif
printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring); printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
printf("%s\n", VerCopyright); printf("%s\n", VerCopyright);
srand(time(NULL));
// look for optarg format parameters // look for optarg format parameters
@ -902,7 +926,10 @@ int main(int argc, char * argv[])
Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring); Debugprintf("G8BPQ AX25 Packet Switch System Version %s %s", TextVerstring, Datestring);
#ifndef MACBPQ #if defined(MACBPQ) || defined(FREEBSD)
time_t dummy;
_MYTIMEZONE = -localtime(&dummy)->tm_gmtoff;
#else
_MYTIMEZONE = _timezone; _MYTIMEZONE = _timezone;
#endif #endif
@ -1174,6 +1201,8 @@ int main(int argc, char * argv[])
chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO); chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif #endif
// Make backup copies of Databases // Make backup copies of Databases
// CopyConfigFile(ConfigName); // CopyConfigFile(ConfigName);
@ -1195,6 +1224,7 @@ int main(int argc, char * argv[])
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetPGConfig(); GetPGConfig();
GetRestartData();
// Make sure there is a user record for the BBS, with BBS bit set. // Make sure there is a user record for the BBS, with BBS bit set.
@ -1442,6 +1472,7 @@ int main(int argc, char * argv[])
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveConfig(ConfigName); SaveConfig(ConfigName);
SaveRestartData();
} }
KEEPGOING--; // Give time for links to close KEEPGOING--; // Give time for links to close
@ -1665,6 +1696,9 @@ int main(int argc, char * argv[])
Slowtimer = 0; Slowtimer = 0;
} }
hookNodeClosing("Shutdown");
Sleep(500);
printf("Closing Ports\n"); printf("Closing Ports\n");
CloseTNCEmulator(); CloseTNCEmulator();

View file

@ -407,7 +407,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -710,7 +713,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_MPSK; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK;
MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
@ -1539,7 +1542,7 @@ VOID CloseComplete(struct TNCINFO * TNC, int Stream)
sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode); sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
if (TNC->MPSKInfo->Beacon) if (TNC->MPSKInfo->Beacon)
sprintf(Cmd, "%s%cBEACON_ARQ_FAE\x1b", Cmd, '\x1a'); sprintf(&Cmd[strlen(Cmd)], "%cBEACON_ARQ_FAE\x1b", '\x1a');
Len = strlen(Cmd); Len = strlen(Cmd);

View file

@ -1570,12 +1570,12 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
continue; continue;
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, &Addr[4]); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", &Addr[4]);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;
} }
ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, &Addr[4], Via); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", &Addr[4], Via);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;
} }
@ -1591,7 +1591,7 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
continue; continue;
ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr); ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;

136
Moncode.c
View file

@ -59,7 +59,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define NODES_SIG 0xFF #define NODES_SIG 0xFF
UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen); UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen);
char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen); char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen);
UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen); UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
@ -535,6 +535,16 @@ KC6OAR*>ID:
Output += sprintf((char *)Output, " RX Window=%d", value); Output += sprintf((char *)Output, " RX Window=%d", value);
break; break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
} }
} }
} }
@ -551,6 +561,15 @@ KC6OAR*>ID:
switch (ADJBUFFER->PID) switch (ADJBUFFER->PID)
{ {
case 0xF1:
case 0xF2:
// Compressed L2 Data
Output += sprintf((char *)Output, " <%d Bytes of Compressed L2 Data>", MsgLen - (19 + sizeof(void *)));
break;
case 0xF0: // Normal Data case 0xF0: // Normal Data
{ {
char Infofield[257]; char Infofield[257];
@ -636,12 +655,13 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
char Node[10]; char Node[10];
UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window; UCHAR TTL, Index, ID, TXNO, RXNO, OpCode, Flags, Window;
UCHAR * ptr = &ADJBUFFER->L2DATA[0]; UCHAR * ptr = &ADJBUFFER->L2DATA[0];
int service = 0;
int netromx = 0; // Set if Paula's connect to service
if (ADJBUFFER->L2DATA[0] == NODES_SIG) if (ADJBUFFER->L2DATA[0] == NODES_SIG)
{ {
// Display NODES // Display NODES
// If an INP3 RIF (type <> UI) decode as such // If an INP3 RIF (type <> UI) decode as such
if (ADJBUFFER->CTL != 3) // UI if (ADJBUFFER->CTL != 3) // UI
@ -672,6 +692,14 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
return Output; return Output;
} }
if (ADJBUFFER->L2DATA[0] == 0xfe) // Paula's Nodes Poll
{
memcpy(Alias, ++ptr, 6);
Output += sprintf((char *)Output, " NODES POLL from %s\r", Alias);
return Output;
}
// Display normal NET/ROM transmissions // Display normal NET/ROM transmissions
Output += sprintf((char *)Output, " NET/ROM\r "); Output += sprintf((char *)Output, " NET/ROM\r ");
@ -695,6 +723,12 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
switch (OpCode) switch (OpCode)
{ {
case L4CREQX: // Paula's connect to service
netromx = 1;
service = (RXNO << 8) | TXNO;
case L4CREQ: case L4CREQ:
Window = *(ptr++); Window = *(ptr++);
@ -703,7 +737,10 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
Node[ConvFromAX25(ptr, Node)] = 0; Node[ConvFromAX25(ptr, Node)] = 0;
ptr +=7; ptr +=7;
Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node); if (netromx)
Output += sprintf((char *)Output, "<CON REQX> w=%d %d@%s at %s", Window, service, Dest, Node);
else
Output += sprintf((char *)Output, "<CON REQ> w=%d %s at %s", Window, Dest, Node);
if (MsgLen > 38) // BPQ Extended Params if (MsgLen > 38) // BPQ Extended Params
{ {
@ -718,7 +755,7 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
if (Flags & L4BUSY) // BUSY RETURNED if (Flags & L4BUSY) // BUSY RETURNED
return Output + sprintf((char *)Output, " <CON NAK> - BUSY"); return Output + sprintf((char *)Output, " <CON NAK> - BUSY");
return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[1], TXNO, RXNO); return Output + sprintf((char *)Output, " <CON ACK> w=%d my cct=%02X%02X", ptr[0], TXNO, RXNO);
case L4DREQ: case L4DREQ:
@ -728,6 +765,10 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
return Output + sprintf((char *)Output, " <DISC ACK>"); return Output + sprintf((char *)Output, " <DISC ACK>");
case L4RESET:
return Output + sprintf((char *)Output, " <RESET>");
case L4INFO: case L4INFO:
{ {
char Infofield[257]; char Infofield[257];
@ -746,6 +787,9 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
if (Flags & L4MORE) if (Flags & L4MORE)
*(Output++) = 'M'; *(Output++) = 'M';
if (Flags & L4COMP)
*(Output++) = 'C';
MsgLen = MsgLen - (19 + sizeof(void *)); MsgLen = MsgLen - (19 + sizeof(void *));
if (MsgLen < 0 || MsgLen > 257) if (MsgLen < 0 || MsgLen > 257)
@ -959,3 +1003,87 @@ char * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output)
ptr[15], ptr[16], ptr[17], ptr[18], Dest, ptr[26], ptr[27], ptr[28], ptr[29]); ptr[15], ptr[16], ptr[17], ptr[18], Dest, ptr[26], ptr[27], ptr[28], ptr[29]);
} }
char Lastpacketlog[256];
int PacketLogDelay = 30000;
extern BPQVECSTRUC * FILEMONVECTOR;
extern UCHAR LogDirectory[260];
void WritePacketLogThread(void * param)
{
char FN[256];
time_t T;
struct tm * tm;
FILE * Handle;
int MsgLen;
MESSAGE * MSG;
MESSAGE * Q;
char buffer[512];
while(1)
{
BOOL SaveMTX = MTX;
BOOL SaveMCOM = MCOM;
BOOL SaveMUI = MUIONLY;
Sleep(PacketLogDelay);
// Get chain of queued packets under semaphore
GetSemaphore(&Semaphore, 101);
Q = FILEMONVECTOR->HOSTTRACEQ;
FILEMONVECTOR->HOSTTRACEQ = 0;
FreeSemaphore(&Semaphore);
if (Q == 0)
continue;
// Open log file and write decoded packets
T = time(NULL);
tm = gmtime(&T);
if (LogDirectory[0] == 0)
{
strcpy(FN, "logs/PacketLog");
}
else
{
strcpy(FN, LogDirectory);
strcat(FN, "/");
strcat(FN, "logs/PacketLog");
}
sprintf(&FN[strlen(FN)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(FN, "ab");
if (Handle == NULL)
return;
while (Q)
{
MSG = Q;
Q = MSG->CHAIN; // get first
IntSetTraceOptionsEx(MMASK, 1, 1, 0);
MsgLen = IntDecodeFrame(MSG, buffer, MSG->Timestamp, 0xffffffffffffffff, FALSE, FALSE);
IntSetTraceOptionsEx(MMASK, SaveMTX, SaveMCOM, SaveMUI);
fwrite(buffer , 1, MsgLen, Handle);
GetSemaphore(&Semaphore, 101);
ReleaseBuffer(MSG);
FreeSemaphore(&Semaphore);
}
fclose(Handle);
}
return;
}

View file

@ -919,6 +919,9 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
DoRefresh(Cinfo); DoRefresh(Cinfo);
Cinfo->Console->bytesRxed += Cinfo->kbptr+1;
if (Cinfo->Console->SysopChatStream) if (Cinfo->Console->SysopChatStream)
SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1); SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1);
else else
@ -941,6 +944,30 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
if (wParam == 0x7) // BEL (Ctrl/G)
{
// Get buffer, append 07 and write back
Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1,
(LPARAM) (LPCSTR)Cinfo->kbbuf);
Cinfo->kbbuf[Cinfo->kbptr++] = 7;
Cinfo->kbbuf[Cinfo->kbptr] = 0;
SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf);
// Send cursor right
for (i = 0; i < strlen(Cinfo->kbbuf); i++)
{
SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0);
SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0);
}
return 0;
}
} }

551
NETROMTCP.c Normal file
View file

@ -0,0 +1,551 @@
/*
Copyright 2001-2022 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/
/*
Netrom over TCP Support
This is intended for operation over radio links with an IP interface, eg New Packet Radio or possibly microwave links
To simplify interface to the rest of the oode dummy LINK and PORT records are created
Packet Format is Length (2 byte little endian) Call (10 bytes ASCII) NETROM L3/4 Packet, starting 0xcf (to detect framing errors).
A TCP message can contain multiple packets and/or partial packets
It uses the Telnet Server, with port defined in NETROMPORT
ROUTE definitions have an extra field, the TCP Port Number
*/
//#pragma data_seg("_BPQDATA")
#define _CRT_SECURE_NO_DEPRECATE
#include "time.h"
#include "stdio.h"
#include <fcntl.h>
//#include "vmm.h"
#include "cheaders.h"
#include "asmstrucs.h"
#include "telnetserver.h"
#define NETROM_PID 0xCF
void NETROMConnectionLost(struct ConnectionInfo * sockptr);
int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo);
int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr);
void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info);
VOID SendRTTMsg(struct ROUTE * Route);
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
struct NRTCPMsg
{
short Length;
char Call[10];
unsigned char PID;
char Packet[1024];
};
struct NRTCPSTRUCT
{
struct ConnectionInfo * sockptr;
struct _LINKTABLE * LINK; // Dummy Link Record for this ROUTE
struct ROUTE * Route; // May need backlink
char Call[10];
};
struct NRTCPSTRUCT * NRTCPInfo[256] = {0};
// Do we want to use normal TCP server connections, which are limited, or our own. Let's try our own for now
struct ConnectionInfo * AllocateNRTCPRec()
{
struct ConnectionInfo * sockptr = 0;
struct NRTCPSTRUCT * Info;
int i;
for (i = 0; i < 255; i++)
{
if (NRTCPInfo[i] == 0)
{
// only allocate as many as needed
Info = NRTCPInfo[i] = (struct NRTCPSTRUCT *)zalloc(sizeof(struct NRTCPSTRUCT));
Info->sockptr = (struct ConnectionInfo *)zalloc(sizeof(struct ConnectionInfo));
Info->LINK = (struct _LINKTABLE *)zalloc(sizeof(struct _LINKTABLE));
Info->sockptr->Number = i;
}
else
Info = NRTCPInfo[i];
sockptr = Info->sockptr;
if (sockptr->SocketActive == FALSE)
{
sockptr->SocketActive = TRUE;
sockptr->ConnectTime = sockptr->LastSendTime = time(NULL);
Debugprintf("NRTCP Allocated %d", i);
return sockptr;
}
}
return 0;
}
void checkNRTCPSockets(int portNo)
{
SOCKET sock;
int Active = 0;
SOCKET maxsock;
int retval;
int i;
struct timeval timeout;
fd_set readfd, writefd, exceptfd;
struct ConnectionInfo * sockptr;
timeout.tv_sec = 0;
timeout.tv_usec = 0; // poll
maxsock = 0;
FD_ZERO(&readfd);
FD_ZERO(&writefd);
FD_ZERO(&exceptfd);
for (i = 0; i < 255; i++)
{
if (NRTCPInfo[i] == 0)
break; // only as many as have been used
sockptr = NRTCPInfo[i]->sockptr;
if (sockptr->SocketActive == 0)
continue;
if (sockptr->Connecting)
{
// look for complete or failed
FD_SET(sockptr->socket, &writefd);
FD_SET(sockptr->socket, &exceptfd);
}
else
{
FD_SET(sockptr->socket, &readfd);
FD_SET(sockptr->socket, &exceptfd);
}
Active++;
if (sockptr->socket > maxsock)
maxsock = sockptr->socket;
}
if (Active)
{
retval = select((int)maxsock + 1, &readfd, &writefd, &exceptfd, &timeout);
if (retval == -1)
{
perror("data select");
Debugprintf("NRTCP Select Error %d Active %d", WSAGetLastError(), Active);
}
else
{
if (retval)
{
// see who has data
for (i = 0; i < 255; i++)
{
if (NRTCPInfo[i] == 0)
break;
sockptr = NRTCPInfo[i]->sockptr;
if (sockptr->SocketActive == 0)
continue;
sock = sockptr->socket;
if (FD_ISSET(sock, &writefd))
NETROMConnected(sockptr, sock, NRTCPInfo[i]);
if (FD_ISSET(sock, &readfd))
DataSocket_ReadNETROM(sockptr, sock, NRTCPInfo[i], portNo);
if (FD_ISSET(sock, &exceptfd))
NETROMConnectionLost(sockptr);
}
}
}
}
}
int NETROMOpenConnection(struct ROUTE * Route)
{
struct NRTCPSTRUCT * Info;
struct ConnectionInfo * sockptr;
Debugprintf("Opening NRTCP Connection");
if (Route->TCPSession)
{
// SESSION ALREADY EXISTS
sockptr = Route->TCPSession->sockptr;
if (sockptr->Connected || sockptr->Connecting)
return TRUE;
// previous connect failed
}
else
{
sockptr = AllocateNRTCPRec();
if (sockptr == NULL)
return 0;
Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
memcpy(Info->Call, MYNETROMCALL, 10);
Route->NEIGHBOUR_LINK = Info->LINK;
Info->Route = Route;
Info->LINK->NEIGHBOUR = Route;
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
}
return NETROMTCPConnect(Route, sockptr);
}
int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
{
int err;
u_long param=1;
BOOL bcopt=TRUE;
SOCKET sock;
struct sockaddr_in sinx;
int addrlen=sizeof(sinx);
char PortString[20];
struct addrinfo hints, *res = 0, *saveres;
int Port = Route->TCPPort;
sprintf(PortString, "%d", Port);
// get host info, make socket, and connect it
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(Route->TCPHost, PortString, &hints, &res);
if (!res)
{
err = WSAGetLastError();
Debugprintf("Resolve HostName %s Failed - Error %d", Route->TCPHost, err);
return FALSE; // Resolve failed
}
// Step thorough the list of hosts
saveres = res; // Save for free
sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sock == INVALID_SOCKET)
{
Debugprintf, ("Netrom over TCP Create Socket Failed");
return FALSE;
}
ioctl(sock, FIONBIO, &param);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
{
//
// Connected successful
//
sockptr->Connected = TRUE;
freeaddrinfo(saveres);
return TRUE;
}
else
{
freeaddrinfo(saveres);
err=WSAGetLastError();
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
{
// Connect in Progress
sockptr->Connecting = TRUE;
return TRUE;
}
else
{
// Connect failed
closesocket(sockptr->socket);
return FALSE;
}
}
return FALSE;
}
void NETROMConnectionAccepted(struct ConnectionInfo * sockptr)
{
// Not sure we can do much here until first message arrives with callsign
sockptr->Connected = TRUE;
Debugprintf("NRTCP Connection Accepted");
}
void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info)
{
// Connection Complete
Debugprintf("NRTCP Connected");
sockptr->Connecting = FALSE;
sockptr->Connected = TRUE;
Info->LINK->L2STATE = 5;
if (Info->Route->INP3Node)
SendRTTMsg(Info->Route);
}
int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo)
{
int len=0, maxlen;
struct NRTCPMsg * Msg;
struct _L3MESSAGEBUFFER * L3Msg;
struct ROUTE * Route;
UCHAR axCall[7];
PMESSAGE Buffer;
ioctl(sock,FIONREAD,&len);
maxlen = InputBufferLen - sockptr->InputLen;
if (len > maxlen) len = maxlen;
len = recv(sock, &sockptr->InputBuffer[sockptr->InputLen], len, 0);
if (len == SOCKET_ERROR || len == 0)
{
// Failed or closed - clear connection
NETROMConnectionLost(sockptr);
return 0;
}
sockptr->InputLen += len;
// Process data
checkLen:
// See if we have a whole packet
Msg = (struct NRTCPMsg *)&sockptr->InputBuffer[0];
if (Msg->Length > sockptr->InputLen) // if not got whole frame wait
return 0;
if (Info->Call[0] == 0)
{
// first packet - do we need to do anything?
// This must be an incoming connection as Call is set before calling so need to find route record and set things up.
memcpy(Info->Call, Msg->Call, 10);
ConvToAX25(Msg->Call, axCall);
if (FindNeighbour(axCall, portNo, &Route))
{
Info->Route = Route;
Route->NEIGHBOUR_LINK = Info->LINK;
Info->LINK->NEIGHBOUR = Route;
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
Route->TCPSession = Info;
Info->LINK->L2STATE = 5;
if (Info->Route->INP3Node)
SendRTTMsg(Info->Route);
}
else
goto seeifMore; // Should we kill connection?
}
if (memcmp(Info->Call, Msg->Call, 10) != 0)
{
// something wrong - maybe connection reused
}
// Format as if come from an ax.25 link
L3Msg = GetBuff();
if (L3Msg == 0)
goto seeifMore;
L3Msg->LENGTH = (Msg->Length - 12) + MSGHDDRLEN;
L3Msg->Next = 0;
L3Msg->Port = 0;
L3Msg->L3PID = NETROM_PID;
memcpy(&L3Msg->L3SRCE, Msg->Packet, Msg->Length - 13);
// Create a dummy L2 message so we can trace it
Buffer = GetBuff();
if (Buffer)
{
Buffer->CHAIN = 0;
Buffer->CTL = 0;
Buffer->PORT = portNo;
ConvToAX25(Info->Call, Buffer->ORIGIN);
ConvToAX25(MYNETROMCALL, Buffer->DEST);
memcpy(Buffer->L2DATA, &L3Msg->L3SRCE[0], Msg->Length - 13);
Buffer->ORIGIN[6] |= 1; // Set end of calls
Buffer->PID = NETROM_PID;
Buffer->LENGTH = Msg->Length + 10;
time(&Buffer->Timestamp);
BPQTRACE(Buffer, FALSE);
ReleaseBuffer(Buffer);
}
NETROMMSG(Info->LINK, L3Msg);
seeifMore:
sockptr->InputLen -= Msg->Length;
if (sockptr->InputLen > 0)
{
memmove(sockptr->InputBuffer, &sockptr->InputBuffer[Msg->Length], sockptr->InputLen);
goto checkLen;
}
return 0;
}
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
{
struct NRTCPMsg Msg;
unsigned char * Data = (unsigned char *)&Frame->L3SRCE[0];
int DataLen = Frame->LENGTH - (MSGHDDRLEN + 1); // Not including PID
int Ret;
PMESSAGE Buffer;
Msg.Length = DataLen + 13; // include PID
memcpy(Msg.Call, MYNETROMCALL, 10);
Msg.PID = NETROM_PID;
memcpy(Msg.Packet, Data, DataLen);
if (Route->TCPSession == 0)
return;
Ret = send(Route->TCPSession->sockptr->socket, (char *)&Msg, DataLen + 13, 0);
// Create a dummy L2 message so we can trace it
Buffer = GetBuff();
if (Buffer)
{
Buffer->CHAIN = 0;
Buffer->CTL = 0;
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
memcpy(Buffer->L2DATA, &Frame->L3SRCE[0], DataLen);
Buffer->ORIGIN[6] |= 1; // Set end of calls
Buffer->PID = NETROM_PID;
Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
time(&Buffer->Timestamp);
BPQTRACE(Buffer, FALSE);
ReleaseBuffer(Buffer);
}
}
void NETROMConnectionLost(struct ConnectionInfo * sockptr)
{
struct NRTCPSTRUCT * Info = NRTCPInfo[sockptr->Number];
struct ROUTE * Route;
closesocket(sockptr->socket);
// If there is an attached route (there should be) clear all connections
if (Info)
{
Route = Info->Route;
if (sockptr->Connected)
L3LINKCLOSED(Info->LINK, LINKLOST);
if (sockptr->Connecting)
L3LINKCLOSED(Info->LINK, SETUPFAILED);
Route->TCPSession = 0;
Info->Call[0] = 0;
}
sockptr->SocketActive = FALSE;
memset(sockptr, 0, sizeof(struct ConnectionInfo));
}

Binary file not shown.

Binary file not shown.

View file

@ -1,641 +0,0 @@
/*
Copyright 2001-2022 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/
/*
Paula (G8PZT)'s Remote Host Protocol interface.
For now only sufficient support for WhatsPac
*/
#define _CRT_SECURE_NO_DEPRECATE
#include "cheaders.h"
#include "bpq32.h"
int FindFreeStreamNoSem();
DllExport int APIENTRY DeallocateStream(int stream);
int SendMsgNoSem(int stream, char * msg, int len);
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len);
static int GetJSONInt(char * _REPLYBUFFER, char * Name);
// Generally Can have multiple RHP connections and each can have multiple RHF Sessions
struct RHPSessionInfo
{
SOCKET Socket; // Websocks Socket
int BPQStream;
int Handle; // RHP session ID
int Seq;
char Local[12];
char Remote[12];
BOOL Connecting; // Set while waiting for connection to complete
BOOL Listening;
BOOL Connected;
};
struct RHPConnectionInfo
{
SOCKET socket;
struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions;
};
struct RHPConnectionInfo ** RHPSockets = NULL;
int NumberofRHPConnections = 0;
struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions;
char ErrCodes[18][24] =
{"Ok", "Unspecified", "Bad or missing type", "Invalid handle", "No memory", "Bad or missing mode",
"Invalid local address",
"Invalid remote address" ,
"Bad or missing family" ,
"Duplicate socket" ,
"No such port" ,
"Invalid protocol" ,
"Bad parameter" ,
"No buffers" ,
"Unauthorised" ,
"No Route" ,
"Operation not supported"};
extern char pgm[256];
SOCKET agwsock;
extern int SemHeldByAPI;
char szBuff[80];
int WhatsPacConfigured = 1;
int RHPPaclen = 236;
int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
int processRHCPClose(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
{
int Loops = 0;
int Sent;
int TxLen;
char * OutBuffer = Msg;
// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
if (Len < 126)
{
// Two Byte Header
OutBuffer[8] = 0x81; // Fin, Data
OutBuffer[9] = Len;
TxLen = Len + 2;
OutBuffer = &Msg[8];
}
else if (Len < 65536)
{
OutBuffer[6] = 0x81; // Fin, Data
OutBuffer[7] = 126; // Unmasked, Extended Len 16
OutBuffer[8] = Len >> 8;
OutBuffer[9] = Len & 0xff;
TxLen = Len + 4;
OutBuffer = &Msg[6];
}
else
{
OutBuffer[0] = 0x81; // Fin, Data
OutBuffer[1] = 127; // Unmasked, Extended Len 64 bits
// Len is 32 bits, so pad with zeros
OutBuffer[2] = 0;
OutBuffer[3] = 0;
OutBuffer[4] = 0;
OutBuffer[5] = 0;
OutBuffer[6] = (Len >> 24) & 0xff;
OutBuffer[7] = (Len >> 16) & 0xff;
OutBuffer[8] = (Len >> 8) & 0xff;
OutBuffer[9] = Len & 0xff;
TxLen = Len + + 10;
OutBuffer = &Msg[0];
}
// Send may block
Sent = send(socket, OutBuffer, TxLen, 0);
while (Sent != TxLen && Loops++ < 3000) // 100 secs max
{
if (Sent > 0) // something sent
{
TxLen -= Sent;
memmove(OutBuffer, &OutBuffer[Sent], TxLen);
}
Sleep(30);
Sent = send(socket, OutBuffer, TxLen, 0);
if (Sent == -1)
break;
}
free(Msg);
return;
}
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
{
// RHP messages can be sent over Websocks or normal http but I think WhatsPac only uses WebSocks
return 0;
}
void ProcessRHPWebSock(SOCKET socket, char * Msg, int MsgLen)
{
int Loops = 0;
int InputLen = 0;
int Len;
char Value[16];
char * OutBuffer = malloc(250000);
struct RHPConnectionInfo * RHPSocket = NULL;
int n;
Msg[MsgLen] = 0;
// Find Connection Record. If none, create one
for (n = 0; n < NumberofRHPConnections; n++)
{
if (RHPSockets[n]->socket == socket)
{
RHPSocket = RHPSockets[n];
break;
}
}
if (RHPSocket == 0)
{
NumberofRHPConnections;
RHPSockets = realloc(RHPSockets, sizeof(void *) * (NumberofRHPConnections + 1));
RHPSocket = RHPSockets[NumberofRHPConnections] = zalloc(sizeof (struct RHPConnectionInfo));
NumberofRHPConnections++;
RHPSocket->socket = socket;
}
// {"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
// {"type": "openReply", "id": 82, "handle": 1, "errCode": 0, "errText": "Ok"}
// {"seqno": 0, "type": "status", "handle": 1, "flags": 0}
// ("seqno": 1, "type": "close", "handle": 1}
// {"id":40,"type":"close","handle":1}
// {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
// {"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
GetJSONValue(Msg, "\"type\":", Value, 15);
if (_stricmp(Value, "open") == 0)
{
Len = processRHCPOpen(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
if (Len)
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "send") == 0)
{
Len = processRHCPSend(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "close") == 0)
{
Len = processRHCPClose(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
return;
}
Debugprintf(Msg);
}
void ProcessRHPWebSockClosed(SOCKET socket)
{
// Close any connections on this scoket and delete socket entry
struct RHPConnectionInfo * RHPSocket = NULL;
int n;
// Find Connection Record. CLear any Sessions
for (n = 0; n < NumberofRHPConnections; n++)
{
if (RHPSockets[n]->socket == socket)
{
RHPSocket = RHPSockets[n];
break;
}
}
}
int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
{
//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
struct RHPSessionInfo * RHPSession = 0;
char * Value = malloc(strlen(Msg)); // Will always be long enough
int ID;
char pfam[16];
char Mode[16];
int Port;
char Local[16];
char Remote[16];
int flags;
int Handle = 1;
int Stream;
unsigned char AXCall[10];
int Len;
int n;
// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
ID = GetJSONInt(Msg, "\"id\":");
GetJSONValue(Msg, "\"pfam\":", pfam, 15);
GetJSONValue(Msg, "\"mode\":", Mode, 15);
Port = GetJSONInt(Msg, "\"port\":");
GetJSONValue(Msg, "\"local\":", Local, 15);
GetJSONValue(Msg, "\"remote\":", Remote, 15);
flags = GetJSONInt(Msg, "\"flags\":");
if (_stricmp(pfam, "ax25") != 0)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
if (_stricmp(Mode, "stream") == 0)
{
{
// Allocate a RHP Session
// See if there is an old one we can reuse
for (n = 0; n < NumberofRHPSessions; n++)
{
if (RHPSessions[n]->BPQStream == 0)
{
RHPSession = RHPSessions[n];
Handle = n + 1;
Stream = RHPSessions[n]->BPQStream;
break;
}
}
if (RHPSession == 0)
{
RHPSessions = realloc(RHPSessions, sizeof(void *) * (NumberofRHPSessions + 1));
RHPSession = RHPSessions[NumberofRHPSessions] = zalloc(sizeof (struct RHPSessionInfo));
NumberofRHPSessions++;
Handle = NumberofRHPSessions;
}
strcpy(pgm, "RHP");
Stream = FindFreeStreamNoSem();
strcpy(pgm, "bpq32.exe");
if (Stream == 255)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
RHPSession->BPQStream = Stream;
RHPSession->Handle = Handle;
RHPSession->Connecting = TRUE;
RHPSession->Socket = RHPSocket->socket;
strcpy(RHPSession->Local, Local);
strcpy(RHPSession->Remote, Remote);
Connect(Stream);
ConvToAX25(Local, AXCall);
ChangeSessionCallsign(Stream, AXCall);
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\"}", ID, Handle);
}
}
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
}
int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
{
// {"type":"send","handle":1,"data":";;;;;;\r","id":70}
struct RHPSessionInfo * RHPSession;
int ID;
char * Data;
char * ptr;
int c;
int Len;
int Handle = 1;
Data = malloc(strlen(Msg));
ID = GetJSONInt(Msg, "\"id\":");
Handle = GetJSONInt(Msg, "\"handle\":");
GetJSONValue(Msg, "\"data\":", Data, strlen(Msg) - 1);
if (Handle < 1 || Handle > NumberofRHPSessions)
{
free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
}
RHPSession = RHPSessions[Handle - 1];
// Look for \ escapes
ptr = Data;
while (ptr = strchr(ptr, '\\'))
{
c = ptr[1];
switch (c)
{
case 'r':
*ptr = 13;
break;
case '\\':
*ptr = '\\';
break;
case '"':
*ptr = '"';
break;
}
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
ptr++;
}
Debugprintf(Data);
Len = strlen(Data);
ptr = Data;
while (Len > RHPPaclen)
{
SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
Len -= RHPPaclen;
ptr += RHPPaclen;
}
SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
}
int processRHCPClose(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
{
// {"id":70,"type":"close","handle":1}
struct RHPSessionInfo * RHPSession;
int ID;
int Handle = 1;
char * OutBuffer = malloc(256);
ID = GetJSONInt(Msg, "\"id\":");
Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
RHPSession = RHPSessions[Handle - 1];
Disconnect(RHPSession->BPQStream);
RHPSession->Connected = 0;
RHPSession->Connecting = 0;
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
}
void RHPPoll()
{
int Stream;
int n;
int state, change;
int Len;
char * RHPMsg;
unsigned char Buffer[1024]; // Space to escape control chars
int pktlen, count;
struct RHPSessionInfo * RHPSession;
for (n = 0; n < NumberofRHPSessions; n++)
{
RHPSession = RHPSessions[n];
Stream = RHPSession->BPQStream;
// See if connected state has changed
SessionState(Stream, &state, &change);
if (change == 1)
{
if (state == 1)
{
// Connected
RHPSession->Seq = 0;
RHPSession->Connecting = FALSE;
RHPSession->Connected = TRUE;
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
// Send RHP CTEXT
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"Connected to RHP Server\\r\"}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
}
else
{
// Disconnected. Send Close to client
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"type\": \"close\", \"seqno\": %d, \"handle\": %d}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
RHPSession->Connected = 0;
RHPSession->Connecting = 0;
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
}
}
do
{
GetMsg(Stream, Buffer, &pktlen, &count);
if (pktlen > 0)
{
char * ptr = Buffer;
char c;
Buffer[pktlen] = 0;
// Message is JSON so Convert CR to \r, \ to \\ " to \"
while (c = *(ptr))
{
switch (c)
{
case 13:
memmove(ptr + 2, ptr + 1, strlen(ptr));
*(ptr++) = '\\';
*(ptr++) = 'r';
break;
case '"':
memmove(ptr + 2, ptr + 1, strlen(ptr));
*(ptr++) = '\\';
*(ptr++) = '"';
break;
case '\\':
memmove(ptr + 2, ptr + 1, strlen(ptr));
*(ptr++) = '\\';
*(ptr++) = '\\';
break;
}
ptr++;
}
RHPMsg = malloc(1024);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"%s\"}", RHPSession->Seq++, RHPSession->Handle, Buffer);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
}
}
while (count > 0);
}
}
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len)
{
char * ptr1, * ptr2;
Value[0] = 0;
ptr1 = strstr(_REPLYBUFFER, Name);
if (ptr1 == 0)
return;
ptr1 += (strlen(Name) + 1);
// "data":"{\"t\":\"c\",\"n\":\"John\",\"c\":\"G8BPQ\",\"lm\":1737912636,\"le\":1737883907,\"led\":1737758451,\"v\":0.33,\"cc\":[{\"cid\":1,\"lp\":1737917257201,\"le\":1737913735726,\"led\":1737905249785},{\"cid\":0,\"lp\":1737324074107,\"le\":1737323831510,\"led\":1737322973662},{\"cid\":5,\"lp\":1737992107419,\"le\":1737931466510,\"led\":1737770056244}]}\r","id":28}
// There may be escaped " in data stream
ptr2 = strchr(ptr1, '"');
while (*(ptr2 - 1) == '\\')
{
ptr2 = strchr(ptr2 + 2, '"');
}
if (ptr2)
{
size_t ValLen = ptr2 - ptr1;
if (ValLen > Len)
ValLen = Len;
memcpy(Value, ptr1, ValLen);
Value[ValLen] = 0;
}
return;
}
static int GetJSONInt(char * _REPLYBUFFER, char * Name)
{
char * ptr1;
ptr1 = strstr(_REPLYBUFFER, Name);
if (ptr1 == 0)
return 0;
ptr1 += (strlen(Name));
return atoi(ptr1);
}

1510
RHP.c

File diff suppressed because it is too large Load diff

View file

@ -110,7 +110,7 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT);
int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr); int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr);
void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length); void ProcessHAMLIBFrame(struct RIGPORTINFO * PORT, int Length);
VOID HAMLIBPoll(struct RIGPORTINFO * PORT); VOID HAMLIBPoll(struct RIGPORTINFO * PORT);
void HAMLIBSlaveThread(struct RIGINFO * RIG); void HAMLIBSlaveThread(VOID * Param);
void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT); void CheckAndProcessRTLUDP(struct RIGPORTINFO * PORT);
VOID RTLUDPPoll(struct RIGPORTINFO * PORT); VOID RTLUDPPoll(struct RIGPORTINFO * PORT);
VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT); VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT);
@ -122,8 +122,8 @@ VOID ProcessSDRRadioFrame(struct RIGPORTINFO * PORT, int Length);
VOID SDRRadioPoll(struct RIGPORTINFO * PORT); VOID SDRRadioPoll(struct RIGPORTINFO * PORT);
VOID SetupPortRIGPointers(); VOID SetupPortRIGPointers();
VOID PTTCATThread(struct RIGINFO *RIG); VOID PTTCATThread(void * Param);
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT);
// ----- G7TAJ ---- // ----- G7TAJ ----
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT); VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT);
@ -2217,7 +2217,7 @@ int BittoInt(UINT BitMask)
return i; return i;
} }
extern char * RadioConfigMsg[36]; extern char * RadioConfigMsg[70];
struct TNCINFO RIGTNC; // Dummy TNC Record for Rigcontrol without a corresponding TNC struct TNCINFO RIGTNC; // Dummy TNC Record for Rigcontrol without a corresponding TNC
@ -5286,8 +5286,12 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
ptr = strtok_s(NULL, ",", &Context); ptr = strtok_s(NULL, ",", &Context);
if (ptr == NULL)
if (*MemoryNumber) // If channel, dont need mode
return TRUE;
if (ptr == NULL || strlen(ptr) > 8) if (ptr == NULL || strlen(ptr) > 8)
return FALSE; return FALSE; // Mode Missing
// If channel, dont need mode // If channel, dont need mode
@ -5446,7 +5450,26 @@ void DecodeCM108(int Port, char * ptr)
hid_device *handle = NULL; hid_device *handle = NULL;
if (strlen(ptr) > 16) if (strlen(ptr) > 16)
CM108Device = _strdup(ptr); {
path_to_open = _strdup(ptr);
handle = hid_open_path(path_to_open);
if (handle)
{
hid_close(handle);
CM108Device = _strdup(path_to_open);
}
else
{
char msg[128];
sprintf(msg,"Port %d Unable to open CM108 device %s", Port, path_to_open);
WritetoConsole(msg);
}
}
else else
{ {
VID = strtol(ptr, &next, 0); VID = strtol(ptr, &next, 0);
@ -7393,6 +7416,8 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
int Interlock = RIG->Interlock; int Interlock = RIG->Interlock;
char PortString[128] = ""; char PortString[128] = "";
char TxPortString[128] = ""; char TxPortString[128] = "";
int n = 0;
int nn = 0;
// Find TNC ports in this Rig's scan group // Find TNC ports in this Rig's scan group
@ -7409,7 +7434,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
sprintf(PortString, "%s,%d", PortString, p); n += sprintf(&PortString[n], ",%d", p);
TNC->RIG = RIG; TNC->RIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7419,7 +7444,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
sprintf(TxPortString, "%s,%d", TxPortString, p); nn += sprintf(&TxPortString[nn], ",%d", p);
TNC->TXRIG = RIG; TNC->TXRIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7459,8 +7484,9 @@ VOID SetupPortRIGPointers()
#ifdef WIN32 #ifdef WIN32
VOID PTTCATThread(struct RIGINFO *RIG) VOID PTTCATThread(void * Param)
{ {
struct RIGINFO * RIG = (struct RIGINFO *)Param;
DWORD dwLength = 0; DWORD dwLength = 0;
int Length, ret, i; int Length, ret, i;
UCHAR * ptr1; UCHAR * ptr1;
@ -8446,7 +8472,7 @@ int DecodeHAMLIBAddr(struct RIGPORTINFO * PORT, char * ptr)
return 1; return 1;
} }
VOID HAMLIBThread(struct RIGPORTINFO * PORT); VOID HAMLIBThread(void * Param);
VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT) VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
{ {
@ -8456,10 +8482,11 @@ VOID ConnecttoHAMLIB(struct RIGPORTINFO * PORT)
return ; return ;
} }
VOID HAMLIBThread(struct RIGPORTINFO * PORT) VOID HAMLIBThread(void * Param)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
struct RIGPORTINFO * PORT = (struct RIGPORTINFO * )Param;
char Msg[255]; char Msg[255];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
@ -8581,10 +8608,11 @@ Lost:
void HAMLIBSlaveThread(struct RIGINFO * RIG) void HAMLIBSlaveThread(VOID * Param)
{ {
// Wait for connections and messages from HAMLIB Clients // Wait for connections and messages from HAMLIB Clients
struct RIGINFO * RIG = (struct RIGINFO *)Param;
fd_set readfs; fd_set readfs;
fd_set errorfs; fd_set errorfs;
struct timeval timeout; struct timeval timeout;
@ -8900,7 +8928,7 @@ VOID FLRIGSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value)
VOID FLRIGThread(struct RIGPORTINFO * PORT); VOID FLRIGThread(VOID * Param);
VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT) VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
{ {
@ -8909,10 +8937,11 @@ VOID ConnecttoFLRIG(struct RIGPORTINFO * PORT)
return ; return ;
} }
VOID FLRIGThread(struct RIGPORTINFO * PORT) VOID FLRIGThread(VOID * Param)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
char Msg[255]; char Msg[255];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;
@ -10152,7 +10181,7 @@ void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT)
VOID SDRANGELThread(struct RIGPORTINFO * PORT); VOID SDRANGELThread(VOID * Param);
VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT) VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
{ {
@ -10161,9 +10190,11 @@ VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT)
return ; return ;
} }
VOID SDRANGELThread(struct RIGPORTINFO * PORT) VOID SDRANGELThread(VOID * Param)
{ {
// Opens sockets and looks for data // Opens sockets and looks for data
struct RIGPORTINFO * PORT = (struct RIGPORTINFO *)Param;
char Msg[512]; char Msg[512];
int err, i, ret; int err, i, ret;
u_long param=1; u_long param=1;

View file

@ -854,7 +854,8 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SCS; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
OpenLogFile(TNC->Port); OpenLogFile(TNC->Port);
CloseLogFile(TNC->Port); CloseLogFile(TNC->Port);
@ -885,8 +886,6 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;

View file

@ -376,7 +376,8 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_TRKM; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -392,8 +393,6 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View file

@ -666,7 +666,8 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_TRK; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -682,8 +683,6 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

51
ScanHID.c Normal file
View file

@ -0,0 +1,51 @@
// ScanHID.cpp : Defines the entry point for the console application.
//
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "hidapi.h"
int main(int argc, char* argv[])
{
char product[256];
char sernum[256] = "NULL";
struct hid_device_info *devs, *cur_dev;
const char *path_to_open = NULL;
hid_device *handle = NULL;
// Look for Device
devs = hid_enumerate(0,0); // so we list devices(USHORT)VID, (USHORT)PID);
cur_dev = devs;
while (cur_dev)
{
wcstombs(product, cur_dev->product_string, 255);
if (cur_dev->serial_number)
wcstombs(sernum, cur_dev->serial_number, 255);
if (product)
printf("HID Device %s VID %X PID %X Ser %s\r\n Path %s\r\n\r\n", product, cur_dev->vendor_id, cur_dev->product_id, sernum, cur_dev->path);
else
printf("HID Device %s VID %X PID %X Ser %s\r\n Path %s\r\n\r\n", "Missing Product", cur_dev->vendor_id, cur_dev->product_id, sernum, cur_dev->path);
cur_dev = cur_dev->next;
}
hid_free_enumeration(devs);
printf("Press any key to Exit");
_getch();
}

View file

@ -508,9 +508,12 @@ ok:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cnd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
} }
else else
@ -770,9 +773,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_SERIAL;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View file

@ -322,7 +322,10 @@ Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR Port)
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT; EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
C_Q_ADD(&EXTPORT->UI_Q, Copy); if (EXTPORT->UI_Q)
C_Q_ADD(&EXTPORT->UI_Q, Copy);
else
C_Q_ADD(&EXTPORT->UI_Q, Copy);
return; return;
} }

View file

@ -241,8 +241,14 @@ typedef struct _SERIAL_STATUS {
#ifndef WIN32 #ifndef WIN32
#ifdef MACBPQ #if defined(MACBPQ)
#include <util.h> #include <util.h>
#elif defined(FREEBSD)
#if defined(__FreeBSD__) || defined(__DragonFly__)
#include <libutil.h>
#else
#include <util.h>
#endif
#endif #endif
extern int posix_openpt (int __oflag); extern int posix_openpt (int __oflag);
@ -262,7 +268,7 @@ HANDLE LinuxOpenPTY(char * Name)
u_long param=1; u_long param=1;
struct termios term; struct termios term;
#ifdef MACBPQ #if defined(MACBPQ) || defined(FREEBSD)
// Create a pty pair // Create a pty pair

File diff suppressed because it is too large Load diff

View file

@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// Telnet Driver for BPQ Switch // Telnet Driver for BPQ Switch
// //
@ -89,7 +90,7 @@ void RHPThread(void * Params);
void ProcessRHPWebSockClosed(SOCKET socket); void ProcessRHPWebSockClosed(SOCKET socket);
int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr); int ProcessSNMPPayload(UCHAR * Msg, int Len, UCHAR * Reply, int * OffPtr);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
void checkNRTCPSockets(int portNo);
#ifndef LINBPQ #ifndef LINBPQ
extern HKEY REGTREE; extern HKEY REGTREE;
@ -113,7 +114,7 @@ extern int REALTIMETICKS;
#define MaxSockets 26 #define MaxSockets 26
struct UserRec RelayUser; struct UserRec RelayUser;
struct UserRec SyncUser = {"","Sync"};; struct UserRec SyncUser = {"","Sync"};
struct UserRec CMSUser; struct UserRec CMSUser;
struct UserRec HostUser = {"","Host"}; struct UserRec HostUser = {"","Host"};
struct UserRec TriModeUser; struct UserRec TriModeUser;
@ -171,12 +172,14 @@ VOID Tel_Format_Addr(struct ConnectionInfo * sockptr, char * dst);
VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr); VOID ProcessTrimodeCommand(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, char * MsgPtr);
VOID ProcessTrimodeResponse(struct TNCINFO * TNC, struct STREAMINFO * STREAM, unsigned char * MsgPtr, int Msglen); VOID ProcessTrimodeResponse(struct TNCINFO * TNC, struct STREAMINFO * STREAM, unsigned char * MsgPtr, int Msglen);
VOID ProcessTriModeDataMessage(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, struct STREAMINFO * STREAM); VOID ProcessTriModeDataMessage(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCKET sock, struct STREAMINFO * STREAM);
void processNETROMFrame(unsigned char * Message, int Len, struct ConnectionInfo * sockptr);
void NETROMConnectionLost(struct ConnectionInfo * sockptr);
void NETROMConnectionAccepted(struct ConnectionInfo * sockptr);
struct ConnectionInfo * AllocateNRTCPRec();
static int LogAge = 13; static int LogAge = 13;
#ifdef WIN32 #ifdef WIN32
int DeleteLogFile(char * Log); int DeleteLogFile(char * Log);
@ -541,6 +544,9 @@ int ProcessLine(char * buf, int Port)
else if (_stricmp(param,"HTTPPORT") == 0) else if (_stricmp(param,"HTTPPORT") == 0)
HTTPPort = TCP->HTTPPort = atoi(value); HTTPPort = TCP->HTTPPort = atoi(value);
else if (_stricmp(param,"NETROMPORT") == 0)
TCP->NETROMPort = atoi(value);
else if (_stricmp(param,"APIPORT") == 0) else if (_stricmp(param,"APIPORT") == 0)
TCP->APIPort = atoi(value); TCP->APIPort = atoi(value);
@ -953,13 +959,27 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (sockptr->WebSocks == 0) if (sockptr->WebSocks == 0)
{ {
if (sockptr->LastSendTime && (REALTIMETICKS - sockptr->LastSendTime) > 1500) // ~ 2.5 mins if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 150) // ~ 2.5 mins
{ {
closesocket(sockptr->socket); closesocket(sockptr->socket);
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC); ShowConnections(TNC);
} }
} }
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
// RHP Sockets (Used for WhatsPack) Need a timeout
// Normally keepalives are sent each way around every 9 mins
// Keepalives aren't sent when connecting so may need a bit longer
if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 20 * 60) // 20mins
{
ProcessRHPWebSockClosed(sockptr->socket);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
}
} }
else else
{ {
@ -1124,7 +1144,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
shutdown(TCP->FBBsock[n++], SD_BOTH); shutdown(TCP->FBBsock[n++], SD_BOTH);
shutdown(TCP->Relaysock, SD_BOTH); shutdown(TCP->Relaysock, SD_BOTH);
shutdown(TCP->HTTPsock, SD_BOTH); shutdown(TCP->HTTPSock, SD_BOTH);
shutdown(TCP->HTTPsock6, SD_BOTH); shutdown(TCP->HTTPsock6, SD_BOTH);
@ -1148,7 +1168,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
closesocket(TCP->Relaysock); closesocket(TCP->Relaysock);
closesocket(TCP->Relaysock6); closesocket(TCP->Relaysock6);
closesocket(TCP->HTTPsock); closesocket(TCP->HTTPSock);
closesocket(TCP->HTTPsock6); closesocket(TCP->HTTPsock6);
// Save info from old TNC record // Save info from old TNC record
@ -1174,7 +1194,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->Hardware = H_TELNET; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
// Get Menu Handles // Get Menu Handles
@ -1233,7 +1253,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
shutdown(TCP->FBBsock[n++], SD_BOTH); shutdown(TCP->FBBsock[n++], SD_BOTH);
shutdown(TCP->Relaysock, SD_BOTH); shutdown(TCP->Relaysock, SD_BOTH);
shutdown(TCP->HTTPsock, SD_BOTH); shutdown(TCP->HTTPSock, SD_BOTH);
shutdown(TCP->HTTPsock6, SD_BOTH); shutdown(TCP->HTTPsock6, SD_BOTH);
shutdown(TCP->sock6, SD_BOTH); shutdown(TCP->sock6, SD_BOTH);
@ -1260,7 +1280,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
closesocket(TCP->FBBsock6[n++]); closesocket(TCP->FBBsock6[n++]);
closesocket(TCP->Relaysock6); closesocket(TCP->Relaysock6);
closesocket(TCP->HTTPsock); closesocket(TCP->HTTPSock);
closesocket(TCP->HTTPsock6); closesocket(TCP->HTTPsock6);
return (0); return (0);
@ -1449,13 +1469,12 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
TCP = TNC->TCPInfo; TCP = TNC->TCPInfo;
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->Hardware = H_TELNET; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] != 0) if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall); ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
@ -1484,6 +1503,8 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
PortEntry->PORTCONTROL.TNC = TNC; PortEntry->PORTCONTROL.TNC = TNC;
PortEntry->PORTCONTROL.Hardware = TNC->Hardware;
TNC->WebWindowProc = WebProc; TNC->WebWindowProc = WebProc;
TNC->WebWinX = 260; TNC->WebWinX = 260;
TNC->WebWinY = 325; TNC->WebWinY = 325;
@ -1697,11 +1718,14 @@ BOOL OpenSockets(struct TNCINFO * TNC)
} }
if (TCP->HTTPPort) if (TCP->HTTPPort)
TCP->HTTPsock = OpenSocket4(TNC, TCP->HTTPPort); TCP->HTTPSock = OpenSocket4(TNC, TCP->HTTPPort);
if (TCP->APIPort) if (TCP->APIPort)
TCP->APIsock = OpenSocket4(TNC, TCP->APIPort); TCP->APIsock = OpenSocket4(TNC, TCP->APIPort);
if (TCP->NETROMPort)
TCP->NETROMSock = OpenSocket4(TNC, TCP->NETROMPort);
if (TCP->SyncPort) if (TCP->SyncPort)
TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort); TCP->Syncsock = OpenSocket4(TNC, TCP->SyncPort);
@ -1820,6 +1844,9 @@ BOOL OpenSockets6(struct TNCINFO * TNC)
if (TCP->APIPort) if (TCP->APIPort)
TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort); TCP->APIsock6 = OpenSocket6(TNC, TCP->APIPort);
if (TCP->NETROMPort)
TCP->NETROMSock6 = OpenSocket6(TNC, TCP->NETROMPort);
if (TCP->SyncPort) if (TCP->SyncPort)
TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort); TCP->Syncsock6 = OpenSocket6(TNC, TCP->SyncPort);
@ -1872,7 +1899,7 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
maxsock = sock; maxsock = sock;
} }
sock = TCP->HTTPsock; sock = TCP->HTTPSock;
if (sock) if (sock)
{ {
FD_SET(sock, readfd); FD_SET(sock, readfd);
@ -1888,6 +1915,14 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
maxsock = sock; maxsock = sock;
} }
sock = TCP->NETROMSock;
if (sock)
{
FD_SET(sock, readfd);
if (sock > maxsock)
maxsock = sock;
}
sock = TCP->Syncsock; sock = TCP->Syncsock;
if (sock) if (sock)
{ {
@ -1963,6 +1998,14 @@ static VOID SetupListenSet(struct TNCINFO * TNC)
maxsock = sock; maxsock = sock;
} }
sock = TCP->NETROMSock6;
if (sock)
{
FD_SET(sock, readfd);
if (sock > maxsock)
maxsock = sock;
}
sock = TCP->DRATSsock6; sock = TCP->DRATSsock6;
if (sock) if (sock)
@ -2050,13 +2093,20 @@ VOID TelnetPoll(int Port)
Socket_Accept(TNC, sock, TCP->RelayPort); Socket_Accept(TNC, sock, TCP->RelayPort);
} }
sock = TCP->HTTPsock; sock = TCP->HTTPSock;
if (sock) if (sock)
{ {
if (FD_ISSET(sock, &readfd)) if (FD_ISSET(sock, &readfd))
Socket_Accept(TNC, sock, TCP->HTTPPort); Socket_Accept(TNC, sock, TCP->HTTPPort);
} }
sock = TCP->NETROMSock;
if (sock)
{
if (FD_ISSET(sock, &readfd))
Socket_Accept(TNC, sock, TCP->NETROMPort);
}
sock = TCP->DRATSsock; sock = TCP->DRATSsock;
if (sock) if (sock)
{ {
@ -2104,6 +2154,14 @@ VOID TelnetPoll(int Port)
Socket_Accept(TNC, sock, TCP->HTTPPort); Socket_Accept(TNC, sock, TCP->HTTPPort);
} }
sock = TCP->NETROMSock6;
if (sock)
{
if (FD_ISSET(sock, &readfd))
Socket_Accept(TNC, sock, TCP->NETROMPort);
}
sock = TCP->DRATSsock6; sock = TCP->DRATSsock6;
if (sock) if (sock)
{ {
@ -2231,9 +2289,12 @@ VOID TelnetPoll(int Port)
} }
} }
nosocks: nosocks:
// Poll TCPNR
checkNRTCPSockets(Port);
// Try SNMP // Try SNMP
if (TCP->SNMPsock) if (TCP->SNMPsock)
@ -2473,15 +2534,11 @@ nosocks:
if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT) if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
{ {
#ifdef WIN32 if ((time(NULL) - sockptr->LastSendTime) > (L4LIMIT - 60)) // PC Ticks are about 10% slow
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 9) // PC Ticks are about 10% slow
#else
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 10)
#endif
{ {
// Send Keepalive // Send Keepalive
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
BuffertoNode(sockptr, "Keepalive\r", 10); BuffertoNode(sockptr, "Keepalive\r", 10);
} }
} }
@ -2611,7 +2668,7 @@ nosocks:
if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K') if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
{ {
sockptr->Keepalive = TRUE; sockptr->Keepalive = TRUE;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
} }
if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S') if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
@ -2843,7 +2900,7 @@ nosocks:
SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen); SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
sockptr->FromHostBuffGetptr += Msglen; sockptr->FromHostBuffGetptr += Msglen;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
} }
} }
} }
@ -3050,7 +3107,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
shutdown(TCP->FBBsock[n++], SD_BOTH); shutdown(TCP->FBBsock[n++], SD_BOTH);
shutdown(TCP->Relaysock, SD_BOTH); shutdown(TCP->Relaysock, SD_BOTH);
shutdown(TCP->HTTPsock, SD_BOTH); shutdown(TCP->HTTPSock, SD_BOTH);
shutdown(TCP->HTTPsock6, SD_BOTH); shutdown(TCP->HTTPsock6, SD_BOTH);
@ -3075,7 +3132,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
closesocket(TCP->Relaysock); closesocket(TCP->Relaysock);
closesocket(TCP->Relaysock6); closesocket(TCP->Relaysock6);
closesocket(TCP->HTTPsock); closesocket(TCP->HTTPSock);
closesocket(TCP->HTTPsock6); closesocket(TCP->HTTPsock6);
// Save info from old TNC record // Save info from old TNC record
@ -3100,7 +3157,10 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->Hardware = H_TELNET; TNC->PortRecord = PortRecord;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->hDlg = SavehDlg; TNC->hDlg = SavehDlg;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
@ -3131,8 +3191,6 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, "."); ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
} }
TNC->PortRecord = PortRecord;
Sleep(500); Sleep(500);
OpenSockets(TNC); OpenSockets(TNC);
OpenSockets6(TNC); OpenSockets6(TNC);
@ -3243,6 +3301,35 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
return 0; return 0;
} }
// Netrom Over TCP uses its own Connection Entries
if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
{
sockptr = AllocateNRTCPRec();
if (sockptr == 0)
{
// No entries - accept and close
sock = accept(SocketId, (struct sockaddr *)&sin6, &addrlen);
send(sock,"No Free Sessions\r\n", 18,0);
Debugprintf("No Free Netrom Telnet Sessions");
Sleep (500);
closesocket(sock);
return 0;
}
sock = accept(SocketId, (struct sockaddr *)&sockptr->sin, &addrlen);
sockptr->socket = sock;
ioctl(sock, FIONBIO, &param);
sockptr->NETROMMode = TRUE;
NETROMConnectionAccepted(sockptr);
return 0;
}
// Find a free Session // Find a free Session
for (n = 1; n <= TCP->MaxSessions; n++) for (n = 1; n <= TCP->MaxSessions; n++)
@ -3294,7 +3381,8 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
TNC->Streams[n].FramesQueued = 0; TNC->Streams[n].FramesQueued = 0;
sockptr->HTTPMode = FALSE; sockptr->HTTPMode = FALSE;
sockptr->APIMode = FALSE; sockptr->APIMode = FALSE;
sockptr->NETROMMode = FALSE;
sockptr->SyncMode = FALSE; sockptr->SyncMode = FALSE;
sockptr->DRATSMode = FALSE; sockptr->DRATSMode = FALSE;
sockptr->FBBMode = FALSE; sockptr->FBBMode = FALSE;
@ -3309,9 +3397,12 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
memset(sockptr->ADIF, 0, sizeof(struct ADIF)); memset(sockptr->ADIF, 0, sizeof(struct ADIF));
if (SocketId == TCP->HTTPsock || SocketId == TCP->HTTPsock6) if (SocketId == TCP->HTTPSock || SocketId == TCP->HTTPsock6)
sockptr->HTTPMode = TRUE; sockptr->HTTPMode = TRUE;
if (SocketId == TCP->NETROMSock || SocketId == TCP->NETROMSock6)
sockptr->NETROMMode = TRUE;
if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6) if (SocketId == TCP->APIsock || SocketId == TCP->APIsock6)
{ {
sockptr->HTTPMode = TRUE; // API is a type of HTTP socket sockptr->HTTPMode = TRUE; // API is a type of HTTP socket
@ -3345,7 +3436,7 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
if (sockptr->HTTPMode) if (sockptr->HTTPMode)
return 0; return 0;
if (sockptr->DRATSMode) if (sockptr->DRATSMode)
{ {
send(sock, "100 Authentication not required\n", 33, 0); send(sock, "100 Authentication not required\n", 33, 0);
@ -3755,7 +3846,7 @@ MsgLoop:
BuffertoNode(sockptr, NodeLine, len); BuffertoNode(sockptr, NodeLine, len);
sockptr->InputLen = 0; sockptr->InputLen = 0;
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
} }
@ -3929,7 +4020,7 @@ MsgLoop:
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
} }
@ -4185,7 +4276,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
@ -4305,7 +4396,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL)); SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
ShowConnections(TNC);; ShowConnections(TNC);
return 0; return 0;
@ -4804,7 +4895,7 @@ MsgLoop:
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC);; ShowConnections(TNC);
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
@ -4880,7 +4971,7 @@ MsgLoop:
WriteLog (logmsg); WriteLog (logmsg);
} }
ShowConnections(TNC);; ShowConnections(TNC);
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
sockptr->InputLen=InputLen; sockptr->InputLen=InputLen;
@ -4978,6 +5069,7 @@ struct RHPParamBlock
unsigned char * Msg; unsigned char * Msg;
int Len; int Len;
SOCKET Socket; SOCKET Socket;
struct ConnectionInfo * sockptr;
}; };
@ -5004,23 +5096,20 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
// Failed or closed - clear connection // Failed or closed - clear connection
// if Websock connection till app // if Websock connection tell app
if (sockptr->WebSocks) if (sockptr->WebSocks)
{ {
if (memcmp(sockptr->WebURL, "rhp", 3) == 0) if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
ProcessRHPWebSockClosed(sockptr->socket); ProcessRHPWebSockClosed(sockptr->socket);
DataSocket_Disconnect(TNC, sockptr);
return 0;
}
}
else
{
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
DataSocket_Disconnect(TNC, sockptr); DataSocket_Disconnect(TNC, sockptr);
return 0; return 0;
} }
TNC->Streams[sockptr->Number].ReportDISC = TRUE; //Tell Node
DataSocket_Disconnect(TNC, sockptr);
return 0;
} }
MsgPtr = &sockptr->InputBuffer[0]; MsgPtr = &sockptr->InputBuffer[0];
@ -5107,7 +5196,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5120,10 +5209,13 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock)); struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
ParamBlock->sockptr = sockptr;
ParamBlock->Socket = sockptr->socket; ParamBlock->Socket = sockptr->socket;
ParamBlock->Len = Len; ParamBlock->Len = Len;
ParamBlock->Msg = malloc(Len + 10); ParamBlock->Msg = malloc(Len + 10);
memcpy(ParamBlock->Msg, Payload, Len); memcpy(ParamBlock->Msg, Payload, Len);
sockptr->LastSendTime = time(NULL);
_beginthread(RHPThread, 0, (VOID *)ParamBlock); _beginthread(RHPThread, 0, (VOID *)ParamBlock);
sockptr->InputLen = 0; sockptr->InputLen = 0;
@ -5131,7 +5223,13 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
} }
} }
else else
{
Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]); Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
sockptr->InputLen = 0; sockptr->InputLen = 0;
return 0; return 0;
@ -5158,7 +5256,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5251,6 +5349,7 @@ int DataSocket_ReadDRATS(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
} }
int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr) int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr)
{ {
int n; int n;
@ -5265,7 +5364,7 @@ int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr
ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, "."); ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
#endif #endif
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC);; ShowConnections(TNC);
} }
return 0; return 0;
} }
@ -5452,8 +5551,7 @@ int WriteLog(char * msg)
strcat(Value, "logs/Telnet_"); strcat(Value, "logs/Telnet_");
} }
sprintf(Value, "%s%02d%02d%02d.log", Value, sprintf(&Value[strlen(Value)], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "a")) == NULL) if ((file = fopen(Value, "a")) == NULL)
return FALSE; return FALSE;
@ -5508,8 +5606,7 @@ VOID WriteCMSLog(char * msg)
strcat(Value, "logs/CMSAccess"); strcat(Value, "logs/CMSAccess");
} }
sprintf(Value, "%s_%04d%02d%02d.log", Value, sprintf(&Value[strlen(Value)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(Value, "ab"); Handle = fopen(Value, "ab");
@ -5667,7 +5764,9 @@ int Telnet_Connected(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCK
} }
else else
{ {
if (TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL[0]) struct _TRANSPORTENTRY * CROSSLINK = TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK;
if (CROSSLINK && CROSSLINK->APPL[0])
buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r", buffptr->Len = sprintf(&buffptr->Data[0], "*** Connected to %s\r",
TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL); TNC->PortRecord->ATTACHEDSESSIONS[Stream]->L4CROSSLINK->APPL);
else else
@ -6323,26 +6422,80 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
struct ConnectionInfo * sockptr; struct ConnectionInfo * sockptr;
SOCKET sock; SOCKET sock;
struct sockaddr_in sinx; struct sockaddr_in sinx;
struct sockaddr_in destaddr;
int addrlen=sizeof(sinx); int addrlen=sizeof(sinx);
int i; char PortString[20];
struct addrinfo hints, *res = 0, *saveres;
sprintf(PortString, "%d", Port);
// get host info, make socket, and connect it
memset(&hints, 0, sizeof hints);
if (TCP->IPV6 == 0 && TCP->IPV4)
hints.ai_family = AF_INET;
else if (TCP->IPV4 == 0 && TCP->IPV6)
hints.ai_family = AF_INET6;
else if (TCP->IPV4 && TCP->IPV6)
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
else
{
ReportError(STREAM, "Neither IPv4 nor IPv5 are enabled");
return FALSE; // Resolve failed
}
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(Host, PortString, &hints, &res);
if (!res)
{
char Msg[256];
err = WSAGetLastError();
sprintf(Msg, "Resolve HostName Failed - Error %d", err);
ReportError(STREAM, Msg);
return FALSE; // Resolve failed
}
// Step thorough the list of hosts
saveres = res; // Save for free
/* if (res->ai_next) // More than one
{
int n = ISHostIndex;
while (n && res->ai_next)
{
res = res->ai_next;
n--;
}
if (n)
{
// We have run off the end of the list
ISHostIndex = 0; // Back to start
res = saveres;
}
else
ISHostIndex++;
}
*/
// getnameinfo(res->ai_addr, (int)res->ai_addrlen, RealISHost, 256, serv, 256, 0);
sockptr = STREAM->ConnectionInfo; sockptr = STREAM->ConnectionInfo;
sock = sockptr->socket = socket(AF_INET, SOCK_STREAM, 0); sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sock == INVALID_SOCKET)
{
ReportError(STREAM, "Create Socket Failed");
return FALSE;
}
sockptr->SocketActive = TRUE; sockptr->SocketActive = TRUE;
sockptr->InputLen = 0; sockptr->InputLen = 0;
sockptr->LoginState = 2; sockptr->LoginState = 2;
sockptr->UserPointer = 0; sockptr->UserPointer = 0;
sockptr->DoEcho = FALSE; sockptr->DoEcho = FALSE;
sockptr->FBBMode = FBB; // Raw Data sockptr->FBBMode = FBB; // Raw Data
if (sockptr->ADIF == NULL) if (sockptr->ADIF == NULL)
@ -6351,49 +6504,19 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
memset(sockptr->ADIF, 0, sizeof(struct ADIF)); memset(sockptr->ADIF, 0, sizeof(struct ADIF));
// Resolve Name if needed if (sock == INVALID_SOCKET)
sockptr->sin.sin_family = AF_INET;
sockptr->sin.sin_port = htons(Port);
sockptr->sin.sin_addr.s_addr = inet_addr(Host);
if (sockptr->sin.sin_addr.s_addr == INADDR_NONE)
{ {
struct hostent * HostEnt; ReportError(STREAM, "Create Socket Failed");
return FALSE;
// Resolve name to address
HostEnt = gethostbyname(Host);
if (!HostEnt)
{
ReportError(STREAM, "Resolve HostName Failed");
return FALSE; // Resolve failed
}
i = 0;
while (HostEnt->h_addr_list[i] != 0)
{
struct in_addr addr;
addr.s_addr = *(u_long *) HostEnt->h_addr_list[i++];
}
memcpy(&sockptr->sin.sin_addr.s_addr, HostEnt->h_addr, 4);
} }
ioctl (sockptr->socket, FIONBIO, &param); ioctl (sock, FIONBIO, &param);
setsockopt (sockptr->socket, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
sinx.sin_family = AF_INET; setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
sinx.sin_addr.s_addr = INADDR_ANY;
sinx.sin_port = 0;
if (bind(sockptr->socket, (struct sockaddr *) &sinx, addrlen) != 0 ) // memcpy(work, res->ai_addr->sa_data, 4);
{
ReportError(STREAM, "Bind Failed");
return FALSE;
}
if (LogEnabled) if (LogEnabled)
{ {
char logmsg[512]; char logmsg[512];
@ -6402,21 +6525,21 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
WriteLog (logmsg); WriteLog (logmsg);
} }
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
if (connect(sockptr->socket,(struct sockaddr *) &sockptr->sin, sizeof(destaddr)) == 0)
{ {
// //
// Connected successful // Connected successful
// //
ReportError(STREAM, "*** Connected"); ReportError(STREAM, "*** Connected");
freeaddrinfo(saveres);
// Get Send Buffer Size
return TRUE; return TRUE;
} }
else else
{ {
freeaddrinfo(saveres);
err=WSAGetLastError(); err=WSAGetLastError();
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
@ -6442,7 +6565,6 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
} }
return FALSE; return FALSE;
} }
@ -7154,7 +7276,7 @@ int DoRefreshWebMailIndex()
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = REALTIMETICKS; sockptr->LastSendTime = time(NULL);
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));

View file

@ -80,6 +80,11 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer); VOID ProcessARQPacket(struct PORTCONTROL * PORT, MESSAGE * Buffer);
char * strlop(char * buf, char delim); char * strlop(char * buf, char delim);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
extern char MYALIASLOPPED[10]; extern char MYALIASLOPPED[10];
@ -464,7 +469,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_UIARQ; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View file

@ -78,6 +78,11 @@ VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len); int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
int standardParams(struct TNCINFO * TNC, char * buf); int standardParams(struct TNCINFO * TNC, char * buf);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
extern UCHAR BPQDirectory[]; extern UCHAR BPQDirectory[];
#define MAXUZ7HOPORTS 16 #define MAXUZ7HOPORTS 16
@ -685,6 +690,11 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ConnecttoUZ7HO(port); ConnecttoUZ7HO(port);
lasttime[port] = ltime; lasttime[port] = ltime;
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
else else
{ {
@ -1023,8 +1033,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]))
{ {
} }
@ -1400,7 +1414,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->Hardware = H_UZ7HO; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO;
UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;

9
V4.c
View file

@ -622,7 +622,10 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]); char cmd[56];
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -971,13 +974,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_V4; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_V4;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

47
VARA.c
View file

@ -73,6 +73,11 @@ int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT); VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT);
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG); VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
#ifndef LINBPQ #ifndef LINBPQ
BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM lParam); BOOL CALLBACK EnumVARAWindowsProc(HWND hwnd, LPARAM lParam);
#endif #endif
@ -1163,6 +1168,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->ARDOPDataBuffer = malloc(8192); TNC->ARDOPDataBuffer = malloc(8192);
@ -1170,7 +1176,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->Hardware = H_VARA; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_VARA;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1178,8 +1184,6 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else
@ -1446,9 +1450,6 @@ VOID VARAThread(void * portptr)
return; return;
} }
// printf("Starting VARA Thread\n");
// if on Windows and Localhost see if TNC is running // if on Windows and Localhost see if TNC is running
#ifdef WIN32 #ifdef WIN32
@ -1564,14 +1565,11 @@ TNCRunning:
sinx.sin_addr.s_addr = INADDR_ANY; sinx.sin_addr.s_addr = INADDR_ANY;
sinx.sin_port = 0; sinx.sin_port = 0;
// printf("Trying to connect to VARA TNC\n");
if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0) if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0)
{ {
// Connected successful // Connected successful
goto VConnected; goto VConnected;
} }
if (TNC->Alerted == FALSE) if (TNC->Alerted == FALSE)
@ -2115,7 +2113,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Only allow VarAC mode for incomming sessions // Only allow VarAC mode for incomming sessions
ProcessIncommingConnectEx(TNC, Call, 0, (TNC->NetRomMode == 0), TRUE); ProcessIncommingConnectEx(TNC, Call, 0, (TNC->NetRomMode == 0), TRUE);
SESS = TNC->PortRecord->ATTACHEDSESSIONS[0]; SESS = TNC->PortRecord->ATTACHEDSESSIONS[0];
if (Speed) if (Speed)
@ -2230,6 +2228,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (App < 32) if (App < 32)
{ {
char AppName[13]; char AppName[13];
char AppBuffer[64];
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
@ -2244,7 +2243,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (CheckAppl(TNC, AppName)) if (CheckAppl(TNC, AppName))
{ {
MsgLen = sprintf(Buffer, "%s\r", AppName); MsgLen = sprintf(AppBuffer, "%s\r", AppName);
buffptr = GetBuff(); buffptr = GetBuff();
@ -2254,7 +2253,9 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
buffptr->Len = MsgLen; buffptr->Len = MsgLen;
memcpy(buffptr->Data, Buffer, MsgLen); memcpy(buffptr->Data, AppBuffer, MsgLen);
Debugprintf("Calling Application %s", AppBuffer);
C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
@ -2429,7 +2430,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// return; // return;
} }
if (_memicmp(Buffer, "REGISTERED", 9) == 0) if (_memicmp(Buffer, "LINK REGISTERED", 9) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer)); WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
@ -2443,6 +2444,13 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
return; return;
} }
if (_memicmp(Buffer, "UNENCRYPTED LINK ", 11) == 0)
{
strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
return;
}
if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0) if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
@ -2668,7 +2676,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
{ {
int InputLen, MsgLen; int InputLen, MsgLen;
char * ptr, * ptr2; char * ptr, * ptr2;
char Buffer[4096]; char Buffer[8192];
// shouldn't get several messages per packet, as each should need an ack // shouldn't get several messages per packet, as each should need an ack
// May get message split over packets // May get message split over packets
@ -2676,7 +2684,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
if (TNC->InputLen > 8000) // Shouldnt have packets longer than this if (TNC->InputLen > 8000) // Shouldnt have packets longer than this
TNC->InputLen=0; TNC->InputLen=0;
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8192 - TNC->InputLen, 0); InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0);
if (InputLen == 0 || InputLen == SOCKET_ERROR) if (InputLen == 0 || InputLen == SOCKET_ERROR)
{ {
@ -2699,12 +2707,18 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
TNC->InputLen += InputLen; TNC->InputLen += InputLen;
TNC->ARDOPBuffer[TNC->InputLen] = 0;
Debugprintf("VARA Processing buffer - %s", TNC->ARDOPBuffer);
loop: loop:
ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen); ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen);
if (ptr == 0) // CR in buffer if (ptr == 0) // CR in buffer
{
Debugprintf("VARA Part Packet Received - Waiting for rest");
return; // Wait for it return; // Wait for it
}
ptr2 = &TNC->ARDOPBuffer[TNC->InputLen]; ptr2 = &TNC->ARDOPBuffer[TNC->InputLen];
@ -2727,9 +2741,10 @@ loop:
if (TNC->InputLen < MsgLen) if (TNC->InputLen < MsgLen)
{ {
TNC->InputLen = 0; TNC->InputLen = 0;
Debugprintf("VARA Corrupt multi command input");
return; return;
} }
memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen-MsgLen); memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen - MsgLen);
TNC->InputLen -= MsgLen; TNC->InputLen -= MsgLen;
goto loop; goto loop;

View file

@ -1,125 +0,0 @@
#ifdef Kernel
#define Vers 5,2,9,2
#define Verstring "5.2.9.2\0"
#define Datestring "September 2012"
#define VerComments "G8BPQ Packet Switch V5.2.9.2\0"
#define VerCopyright "Copyright © 2001-2012 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"
#endif
#define KVers 6,0,24,59
#define KVerstring "6.0.24.59\0"
#ifdef CKernel
#define Vers KVers
#define Verstring KVerstring
#define Datestring "January 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"
#define VerProduct "BPQ32"
#endif
#ifdef TermTCP
#define Vers 1,0,16,2
#define Verstring "1.0.16.2\0"
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTermTCP"
#endif
#ifdef BPQTerm
#define Vers 2,2,5,2
#define Verstring "2.2.5.2\0"
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTerminal"
#endif
#ifdef BPQTermMDI
#define Vers 2,2,0,3
#define Verstring "2.2.0.3\0"
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
#endif
#ifdef MAIL
#define Vers KVers
#define Verstring KVerstring
#define VerComments "Mail server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQMail"
#endif
#ifdef HOSTMODES
#define Vers 1,1,8,1
#define Verstring "1.1.8.1\0"
//#define SPECIALVERSION "Test 3"
#define VerComments "Host Modes Emulator for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2019 John Wiseman G8BPQ\0"
#define VerDesc "Host Modes Emulator for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQHostModes"
#endif
#ifdef UIUTIL
#define Vers 0,1,3,1
#define Verstring "0.1.3.1\0"
#define VerComments "Beacon Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2019 John Wiseman G8BPQ\0"
#define VerDesc "Beacon Utility for G8BPQ Switch\0"
#define VerProduct "BPQUIUtil"
#endif
#ifdef AUTH
#define Vers 0,1,0,0
#define Verstring "0.1.0.0\0"
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
#endif
#ifdef APRS
#define Vers KVers
#define Verstring KVerstring
#define VerComments "APRS Client for G8BPQ Switch\0"
#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
#define VerDesc "APRS Client for G8BPQ Switch\0"
#define VerProduct "BPQAPRS"
#endif
#ifdef CHAT
#define Vers KVers
#define Verstring KVerstring
#define VerComments "Chat server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQChat"
#endif

View file

@ -10,14 +10,15 @@
#endif #endif
#define KVers 6,0,24,59 #define KVers 6,0,25,8
#define KVerstring "6.0.24.59\0" #define KVerstring "6.0.25.8\0"
#ifdef CKernel #ifdef CKernel
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define Datestring "February 2025" #define Datestring "October 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring #define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0" #define VerDesc "BPQ32 Switch\0"

View file

@ -105,6 +105,11 @@ int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
BOOL KillOldTNC(char * Path); BOOL KillOldTNC(char * Path);
int standardParams(struct TNCINFO * TNC, char * buf); int standardParams(struct TNCINFO * TNC, char * buf);
void hookL4SessionAttempt(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionAccepted(struct STREAMINFO * , char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);
static char ClassName[]="WINMORSTATUS"; static char ClassName[]="WINMORSTATUS";
static char WindowTitle[] = "WINMOR"; static char WindowTitle[] = "WINMOR";
static int RigControlRow = 165; static int RigControlRow = 165;
@ -139,6 +144,10 @@ VOID WritetoTraceSupport(struct TNCINFO * TNC, char * Msg, int Len)
int LineLen, i; int LineLen, i;
UCHAR Save; UCHAR Save;
int SaveLen = Len; int SaveLen = Len;
char Time[16];
time_t T;
struct tm * tm;
if (Len < 0) if (Len < 0)
return; return;
@ -206,10 +215,16 @@ lineloop:
#endif #endif
// Write to Web Buffer // Write to Web Buffer
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, Line); strcat(TNC->WebBuffer, Line);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved
Skip: Skip:
ptr1 = ptr2; ptr1 = ptr2;
@ -248,10 +263,16 @@ lineloop:
#else #else
index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 ); index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
#endif #endif
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, ptr1); strcat(TNC->WebBuffer, ptr1);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved
} }
} }
@ -984,8 +1005,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]))
{ {
} }
@ -1462,11 +1487,12 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->Hardware = H_WINMOR; TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1474,7 +1500,6 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View file

@ -37,6 +37,7 @@ VOID Do_Save_WPRec(HWND hDlg);
VOID SaveInt64Value(config_setting_t * group, char * name, long long value); VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
VOID SaveIntValue(config_setting_t * group, char * name, int value); VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveStringValue(config_setting_t * group, char * name, char * value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
WPRec * AllocateWPRecord() WPRec * AllocateWPRecord()

273
WebMail.c
View file

@ -1446,7 +1446,12 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// Neither do js or file downloads // Neither do js or file downloads
if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0) // This could be a request for a Template file
// WebMail/Local_Templates/My Forms/inc/logo_ad63.png
// WebMail/Standard Templates/
if (_memicmp(NodeURL, "/WebMail/Local", 14) == 0 || (_memicmp(NodeURL, "/WebMail/Standard", 17) == 0))
{ {
int FileSize; int FileSize;
char * MsgBytes; char * MsgBytes;
@ -1456,9 +1461,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
char TimeString[64]; char TimeString[64];
char FileTimeString[64]; char FileTimeString[64];
struct stat STAT; struct stat STAT;
char * FN = &NodeURL[16]; char * FN = &NodeURL[9];
char * fileBit = FN; char * fileBit = FN;
char * ext; char * ext;
char Type[64] = "Content-Type: text/html\r\n";
UndoTransparency(FN); UndoTransparency(FN);
ext = strchr(FN, '.'); ext = strchr(FN, '.');
@ -1491,27 +1497,112 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
FormatTime2(FileTimeString, STAT.st_ctime); FormatTime2(FileTimeString, STAT.st_ctime);
FormatTime2(TimeString, time(NULL)); FormatTime2(TimeString, time(NULL));
if (_stricmp(ext, ".htm") == 0 || _stricmp(ext, ".html") == 0 || _stricmp(ext, ".css") == 0 || _stricmp(ext, ".js") == 0) ext++;
{
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n" if (_stricmp(ext, "js") == 0)
"Content-Type: text/css\r\n" strcpy(Type, "Content-Type: text/javascript\r\n");
"Date: %s\r\n"
"Last-Modified: %s\r\n" if (_stricmp(ext, "css") == 0)
"\r\n%s", FileSize, TimeString, FileTimeString, MsgBytes); strcpy(Type, "Content-Type: text/css\r\n");
}
else
{
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"Content-Type: application/octet-stream\r\n"
"Content-Disposition: attachment; filename=\"%s\"\r\n"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n%s", FileSize, fileBit, TimeString, FileTimeString, MsgBytes);
} if (_stricmp(ext, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
// File may be binary so output header then copy in message
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"%s"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n", FileSize, Type,TimeString, FileTimeString);
memcpy(&Reply[*RLen], MsgBytes, FileSize);
*RLen += FileSize;
free (MsgBytes); free (MsgBytes);
return; return;
} }
//
if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0)
{
int FileSize;
char * MsgBytes;
char MsgFile[512];
FILE * hFile;
size_t ReadLen;
char TimeString[64];
char FileTimeString[64];
struct stat STAT;
char * FN = &NodeURL[16];
char * fileBit = FN;
char * ext;
char Type[64] = "Content-Type: text/html\r\n";
UndoTransparency(FN);
ext = strchr(FN, '.');
sprintf(MsgFile, "%s/%s", BPQDirectory, FN);
while (strchr(fileBit, '/'))
fileBit = strlop(fileBit, '/');
if (stat(MsgFile, &STAT) == -1)
{
*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
return;
}
hFile = fopen(MsgFile, "rb");
if (hFile == 0)
{
*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
return;
}
FileSize = STAT.st_size;
MsgBytes = malloc(FileSize + 1);
ReadLen = fread(MsgBytes, 1, FileSize, hFile);
fclose(hFile);
FormatTime2(FileTimeString, STAT.st_ctime);
FormatTime2(TimeString, time(NULL));
ext++;
if (_stricmp(ext, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ext, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ext, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
// File may be binary so output header then copy in message
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"%s"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n", FileSize, Type,TimeString, FileTimeString);
memcpy(&Reply[*RLen], MsgBytes, FileSize);
*RLen += FileSize;
free (MsgBytes);
return;
}
Session = NULL; Session = NULL;
@ -2293,6 +2384,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
struct HtmlFormDir * Dir; struct HtmlFormDir * Dir;
int i; int i;
int len;
SubDir = strlop(&NodeURL[17], ':'); SubDir = strlop(&NodeURL[17], ':');
DirNo = atoi(&NodeURL[17]); DirNo = atoi(&NodeURL[17]);
@ -2313,9 +2405,9 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (SubDir) if (SubDir)
sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName); len = sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
else else
sprintf(popup, popuphddr, Key, Dir->DirName); len = sprintf(popup, popuphddr, Key, Dir->DirName);
if (SubDir) if (SubDir)
{ {
@ -2326,7 +2418,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// We only send if there is a .txt file // We only send if there is a .txt file
if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0) if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
sprintf(popup, "%s <option value=%d:%d,%d>%s", popup, DirNo, SubDirNo, i, Name); len += sprintf(&popup[len], " <option value=%d:%d,%d>%s", DirNo, SubDirNo, i, Name);
} }
} }
else else
@ -2338,10 +2430,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// We only send if there is a .txt file // We only send if there is a .txt file
if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0) if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
sprintf(popup, "%s <option value=%d,%d>%s", popup, DirNo, i, Name); len += sprintf(&popup[len], " <option value=%d,%d>%s", DirNo, i, Name);
} }
} }
sprintf(popup, "%s</select></p>", popup); len += sprintf(&popup[len], "</select></p>");
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -2409,6 +2501,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
int i; int i;
int MsgLen = 0; int MsgLen = 0;
char * Boundary; char * Boundary;
int len;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
@ -2455,7 +2548,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
// Also to active fields in case not changed by form // Also to active fields in case not changed by form
sprintf(popup, popuphddr, Session->Key); len = sprintf(popup, popuphddr, Session->Key);
LastGroup = HtmlFormDirs[0]->FormSet; // Save so we know when changes LastGroup = HtmlFormDirs[0]->FormSet; // Save so we know when changes
@ -2468,21 +2561,21 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
if (strcmp(LastGroup, Dir->FormSet) != 0) if (strcmp(LastGroup, Dir->FormSet) != 0)
{ {
LastGroup = Dir->FormSet; LastGroup = Dir->FormSet;
sprintf(popup, "%s%s", popup, NewGroup); len += sprintf(&popup[len], "%s", NewGroup);
} }
sprintf(popup, "%s <option value=%d>%s", popup, i, Dir->DirName); len += sprintf(&popup[len], " <option value=%d>%s", i, Dir->DirName);
// Recurse any Subdirs // Recurse any Subdirs
n = 0; n = 0;
while (n < Dir->DirCount) while (n < Dir->DirCount)
{ {
sprintf(popup, "%s <option value=%d:%d>%s", popup, i, n, Dir->Dirs[n]->DirName); len += sprintf(&popup[len], " <option value=%d:%d>%s", i, n, Dir->Dirs[n]->DirName);
n++; n++;
} }
} }
sprintf(popup, "%s</select></td></tr></table></p>", popup); len += sprintf(&popup[len], "%</select></td></tr></table></p>");
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
@ -2569,10 +2662,10 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
if (strlen(WebMail->BID) > 12) if (strlen(WebMail->BID) > 12)
WebMail->BID[12] = 0; WebMail->BID[12] = 0;
UndoTransparency(WebMail->BID); // UndoTransparency(WebMail->BID);
UndoTransparency(WebMail->To); // UndoTransparency(WebMail->To);
UndoTransparency(WebMail->Subject); // UndoTransparency(WebMail->Subject);
UndoTransparency(WebMail->Body); // UndoTransparency(WebMail->Body);
MsgLen = strlen(WebMail->Body); MsgLen = strlen(WebMail->Body);
@ -2729,6 +2822,18 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
strcpy(Msg->via, ToUser->HomeBBS); strcpy(Msg->via, ToUser->HomeBBS);
sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via); sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
} }
else
{
// No HomeBBS - check WP
WPRecP WP = LookupWP(Msg->to);
if (WP)
{
strcpy(Msg->via, WP->first_homebbs);
sprintf(Prompt, "%s added from WP", Msg->via);
}
}
} }
else else
{ {
@ -2881,7 +2986,7 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
// RMS Express Forms Support // RMS Express Forms Support
char * GetHTMLViewerTemplate(char * FN) char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
{ {
int i, j, k, l; int i, j, k, l;
@ -2895,6 +3000,7 @@ char * GetHTMLViewerTemplate(char * FN)
{ {
if (strcmp(FN, Dir->Forms[j]->FileName) == 0) if (strcmp(FN, Dir->Forms[j]->FileName) == 0)
{ {
*FormDir = Dir;
return CheckFile(Dir, FN); return CheckFile(Dir, FN);
} }
} }
@ -2915,6 +3021,7 @@ char * GetHTMLViewerTemplate(char * FN)
{ {
if (_stricmp(FN, SDir->Forms[k]->FileName) == 0) if (_stricmp(FN, SDir->Forms[k]->FileName) == 0)
{ {
*FormDir = SDir;
return CheckFile(SDir, SDir->Forms[k]->FileName); return CheckFile(SDir, SDir->Forms[k]->FileName);
} }
} }
@ -2978,6 +3085,13 @@ VOID GetPage(struct HTTPConnectionInfo * Session, char * NodeURL)
ptr = strchr(&NodeURL[17], ','); ptr = strchr(&NodeURL[17], ',');
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (DirNo == -1)
{
*WebMail->RLen = sprintf(WebMail->Reply, "<html><script>alert(\"No Page Selected. \");window.location.href = '/Webmail/NewMsg?%s';</script></html>", Session->Key);
return;
}
SubDir = strlop(&NodeURL[17], ':'); SubDir = strlop(&NodeURL[17], ':');
if (SubDir) if (SubDir)
{ {
@ -3291,6 +3405,13 @@ BOOL ParseXML(WebMailInfo * WebMail, char * XMLOrig)
// Extract Fields (stuff between < and >. Ignore Whitespace between fields // Extract Fields (stuff between < and >. Ignore Whitespace between fields
// Add FormFolder Key with our folder
// XMLKeys->Key = "FormFolder";
// XMLKeys->Value = _strdup(FormDir);
// XMLKeys++;
ptr1 = strstr(XML, "<xml_file_version>"); ptr1 = strstr(XML, "<xml_file_version>");
while (ptr1) while (ptr1)
@ -3394,6 +3515,8 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
size_t varlen, xmllen; size_t varlen, xmllen;
char var[100] = "<"; char var[100] = "<";
KeyValues * KeyValue; KeyValues * KeyValue;
struct HtmlFormDir * Dir;
char FormDir[MAX_PATH];
if (ParseXML(WebMail, XML)) if (ParseXML(WebMail, XML))
ptr = FindXMLVariable(WebMail, "display_form"); ptr = FindXMLVariable(WebMail, "display_form");
@ -3407,7 +3530,11 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
strcpy(FN, ptr); strcpy(FN, ptr);
Form = GetHTMLViewerTemplate(FN); Form = GetHTMLViewerTemplate(FN, &Dir);
sprintf(FormDir, "WMFile/%s/%s/", Dir->FormSet, Dir->DirName);
if (Form == NULL) if (Form == NULL)
{ {
@ -3423,6 +3550,15 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
// Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody} // Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody}
// So is {FormFolder} instread of {var FormFolder}
// As a fiddle replace {FormFolder} with {var Folder} and look for that
while (varptr = stristr(Form, "{FormFolder}"))
{
memcpy(varptr, "{var ", 5);
}
varptr = stristr(Form, "{MsgOriginalBody}"); varptr = stristr(Form, "{MsgOriginalBody}");
{ {
char * temp, * tempsave; char * temp, * tempsave;
@ -3562,6 +3698,23 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
while (KeyValue->Key) while (KeyValue->Key)
{ {
if (_stricmp(var, "Folder") == 0)
{
// Local form folder, not senders
xmllen = strlen(FormDir);
// Ok, we have the position of the variable and the substitution text.
// Copy message up to variable to Result, then copy value
memcpy(Reply, formptr, varptr - formptr - 5); // omit "{var "
Reply += (varptr - formptr - 5);
strcpy(Reply, FormDir);
Reply += xmllen;
break;
}
if (_stricmp(var, KeyValue->Key) == 0) if (_stricmp(var, KeyValue->Key) == 0)
{ {
xmllen = strlen(KeyValue->Value); xmllen = strlen(KeyValue->Value);
@ -3577,6 +3730,8 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
break; break;
} }
KeyValue++;
if (KeyValue->Key == NULL) if (KeyValue->Key == NULL)
{ {
// Not found in XML // Not found in XML
@ -3586,7 +3741,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
sprintf(Err, VarNotFoundMsg, var, "%s"); sprintf(Err, VarNotFoundMsg, var, "%s");
return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err); return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err);
} }
KeyValue++;
} }
formptr = endptr + 1; formptr = endptr + 1;
@ -4096,6 +4251,18 @@ VOID SaveTemplateMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, cha
strcpy(Msg->via, ToUser->HomeBBS); strcpy(Msg->via, ToUser->HomeBBS);
sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via); sprintf(Prompt, "%s added from HomeBBS. Message Saved", Msg->via);
} }
else
{
// No HomeBBS - Check WP
WPRecP WP = LookupWP(Msg->to);
if (WP)
{
strcpy(Msg->via, WP->first_homebbs);
sprintf(Prompt, "%s added from WP", Msg->via);
}
}
} }
else else
{ {
@ -4316,6 +4483,18 @@ VOID BuildMessageFromHTMLInput(struct HTTPConnectionInfo * Session, char * Reply
strcpy(Msg->via, ToUser->HomeBBS); strcpy(Msg->via, ToUser->HomeBBS);
sprintf(Prompt, "%s added from HomeBBS", Msg->via); sprintf(Prompt, "%s added from HomeBBS", Msg->via);
} }
else
{
// No HomeBBS - Check WP
WPRecP WP = LookupWP(Msg->to);
if (WP)
{
strcpy(Msg->via, WP->first_homebbs);
sprintf(Prompt, "%s added from WP", Msg->via);
}
}
} }
else else
{ {
@ -5446,8 +5625,6 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
#endif #endif
printf("%s\n", MsgFile);
if (stat(MsgFile, &STAT) != -1) if (stat(MsgFile, &STAT) != -1)
{ {
hFile = fopen(MsgFile, "rb"); hFile = fopen(MsgFile, "rb");
@ -5464,8 +5641,6 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
MsgBytes[FileSize] = 0; MsgBytes[FileSize] = 0;
fclose(hFile); fclose(hFile);
printf("%d %s\n", strlen(MsgBytes), MsgBytes);
return MsgBytes; return MsgBytes;
} }
return NULL; return NULL;
@ -5495,6 +5670,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
char * ptr, * ptr1; char * ptr, * ptr1;
char * prompt; char * prompt;
char * var[100]; char * var[100];
int len;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
@ -5564,7 +5740,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
ptr = ptr1; ptr = ptr1;
} }
sprintf(popup, popuphddr, Session->Key, prompt, vars + 1); len = sprintf(popup, popuphddr, Session->Key, prompt, vars + 1);
for (i = 0; i < vars; i++) for (i = 0; i < vars; i++)
{ {
@ -5573,9 +5749,9 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
if (key == NULL) if (key == NULL)
key = var[i]; key = var[i];
sprintf(popup, "%s <option value='%s'>%s", popup, key, var[i]); len += sprintf(&popup[len], " <option value='%s'>%s", key, var[i]);
} }
sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup); len += sprintf(&popup[len], "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>");
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
free(SelCopy); free(SelCopy);
@ -6134,16 +6310,17 @@ VOID getAttachmentList(struct HTTPConnectionInfo * Session, char * Reply, int *
char popup[10000]; char popup[10000];
int i; int i;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
int len;
sprintf(popup, popuphddr, Session->Key, WebMail->Files); len = sprintf(popup, popuphddr, Session->Key, WebMail->Files);
for (i = 0; i < WebMail->Files; i++) for (i = 0; i < WebMail->Files; i++)
{ {
if(WebMail->FileLen[i] < 100000) if(WebMail->FileLen[i] < 100000)
sprintf(popup, "%s <option value=%d>%s (Len %d)", popup, i + 1, WebMail->FileName[i], WebMail->FileLen[i]); len += sprintf(&popup[len], " <option value=%d>%s (Len %d)", i + 1, WebMail->FileName[i], WebMail->FileLen[i]);
} }
sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup); len += sprintf(&popup[len], "%</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>");
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -6289,7 +6466,7 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
} }
} }
ptr += sprintf(ptr, "%s</pre> \r\n", ptr); ptr += sprintf(&ptr[strlen(ptr)], "</pre> \r\n");
Len = ptr - &OutBuffer[10]; Len = ptr - &OutBuffer[10];

View file

@ -795,7 +795,8 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
WritetoConsoleLocal(msg); WritetoConsoleLocal(msg);
TNC->Port = port; TNC->Port = port;
TNC->Hardware = H_WINRPR; TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -811,8 +812,6 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else
@ -1581,8 +1580,6 @@ TNCRunning:
// Send INIT script // Send INIT script
// VARA needs each command in a separate send
ptr1 = &TNC->InitScript[0]; ptr1 = &TNC->InitScript[0];
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
@ -1607,7 +1604,6 @@ TNCRunning:
c = *(ptr2 + 1); // Save next char c = *(ptr2 + 1); // Save next char
*(ptr2 + 1) = 0; // Terminate string *(ptr2 + 1) = 0; // Terminate string
} }
// VARASendCommand(TNC, ptr1, TRUE);
if (ptr2) if (ptr2)
*(1 + ptr2++) = c; // Put char back *(1 + ptr2++) = c; // Put char back

3
adif.c
View file

@ -409,8 +409,7 @@ BOOL WriteADIFRecord(ADIF * ADIF)
strcat(Value, "logs/BPQ_CMS_ADIF"); strcat(Value, "logs/BPQ_CMS_ADIF");
} }
sprintf(Value, "%s_%04d%02d.adi", Value, sprintf(&Value[strlen(Value)], "_%04d%02d.adi", tm->tm_year +1900, tm->tm_mon+1);
tm->tm_year +1900, tm->tm_mon+1);
STAT.st_size = 0; STAT.st_size = 0;
stat(Value, &STAT); stat(Value, &STAT);

View file

@ -33,6 +33,7 @@ typedef int (FAR *FARPROCY)();
#define L4BUSY 0x80 // BNA - DONT SEND ANY MORE #define L4BUSY 0x80 // BNA - DONT SEND ANY MORE
#define L4NAK 0x40 // NEGATIVE RESPONSE FLAG #define L4NAK 0x40 // NEGATIVE RESPONSE FLAG
#define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG #define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG
#define L4COMP 0x10 // BPQ Specific use of spare it - data is compressed
#define L4CREQ 1 // CONNECT REQUEST #define L4CREQ 1 // CONNECT REQUEST
#define L4CACK 2 // CONNECT ACK #define L4CACK 2 // CONNECT ACK
@ -40,7 +41,8 @@ typedef int (FAR *FARPROCY)();
#define L4DACK 4 // DISCONNECT ACK #define L4DACK 4 // DISCONNECT ACK
#define L4INFO 5 // INFORMATION #define L4INFO 5 // INFORMATION
#define L4IACK 6 // INFORMATION ACK #define L4IACK 6 // INFORMATION ACK
#define L4RESET 7 // Paula's extension
#define L4CREQX 8 // Paula's extension
extern char MYCALL[]; // 7 chars, ax.25 format extern char MYCALL[]; // 7 chars, ax.25 format
extern char MYALIASTEXT[]; // 6 chars, not null terminated extern char MYALIASTEXT[]; // 6 chars, not null terminated
@ -62,15 +64,6 @@ extern int ENDOFDATA;
extern int L3LIVES; extern int L3LIVES;
extern int NUMBEROFNODES; extern int NUMBEROFNODES;
struct CMDX
{
char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH
// VOID (*CMDPROC)(struct _TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);// COMMAND PROCESSOR
VOID (*CMDPROC)();// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset
};
struct APPLCONFIG struct APPLCONFIG
{ {
@ -170,6 +163,29 @@ typedef struct _TRANSPORTENTRY
char APPL[16]; // Set if session initiated by an APPL char APPL[16]; // Set if session initiated by an APPL
int L4LIMIT; // Idle time for this Session int L4LIMIT; // Idle time for this Session
// Now support compressing NetRom Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
int segsSent;
int segsRcvd;
int segsResent;
int NRRID;
time_t NRRTime;
int Service; // For Paula's Connnect to Service
} TRANSPORTENTRY; } TRANSPORTENTRY;
// //
@ -195,6 +211,9 @@ typedef struct ROUTE
UCHAR NEIGHBOUR_QUAL; UCHAR NEIGHBOUR_QUAL;
UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE
#define LOCKEDBYCONFIG 1
#define LOCKEDBYSYSOP 2
struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR
USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM) USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM)
@ -209,13 +228,15 @@ typedef struct ROUTE
BOOL INP3Node; BOOL INP3Node;
BOOL NoKeepAlive; // Suppress Keepalive Processing BOOL NoKeepAlive; // Suppress Keepalive Processing
int LastConnectAttempt; // To stop us trying too often int LastConnectAttempt; // To stop us trying too often
int ConnectionAttempts;
int Status; // int Status; //
int OldBPQ; // Set if other end is BPQ sending RIF in mS
int LastRTT; // Last Value Reported int LastRTT; // Last Value Reported
int RTT; // Current int RTT; // Current
int SRTT; // Smoothed RTT int SRTT; // Smoothed RTT
int NeighbourSRTT; // Other End SRTT int NeighbourSRTT; // Other End SRTT
// int RTTIncrement; // Average of Ours and Neighbours SRTT in 10 ms int RTTIncrement; // Average of Ours and Neighbours SRTT in 10 ms - smoothed neighbor transport time (SNTT) in spec
int BCTimer; // Time to next L3RTT Broadcast int BCTimer; // Time to next L3RTT Broadcast
int Timeout; // Lost Response Timer int Timeout; // Lost Response Timer
int Retries; // Lost Response Count int Retries; // Lost Response Count
@ -224,6 +245,12 @@ typedef struct ROUTE
int OtherendsRouteQual; // Route quality used by other end. int OtherendsRouteQual; // Route quality used by other end.
int OtherendLocked; // Route quality locked by ROUTES entry. int OtherendLocked; // Route quality locked by ROUTES entry.
int FirstTimeFlag; // Set once quality has been set by direct receive int FirstTimeFlag; // Set once quality has been set by direct receive
int RemoteMAXRTT; // For INP3
int RemoteMAXHOPS;
char * TCPHost; // For NETROM over TCP
int TCPPort;
struct NRTCPSTRUCT * TCPSession;
} *PROUTE; } *PROUTE;
@ -233,6 +260,7 @@ typedef struct ROUTE
#define GotRTTResponse 2 // Other end has sent us a RTT Response #define GotRTTResponse 2 // Other end has sent us a RTT Response
#define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node #define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node
// (could just be monitoring RTT for some reason // (could just be monitoring RTT for some reason
#define SentRTTRequest 8
#define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls #define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls
// (only sent when we have seen both a request and response) // (only sent when we have seen both a request and response)
@ -440,15 +468,18 @@ typedef struct _APPLCALLS
// This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs, // This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs,
// But if these are significant (say 25% or 100 ms) they will be retransmitted // But if these are significant (say 25% or 100 ms) they will be retransmitted
// We treat the Routes as an array of 6. First 3 are NODES routes, next 3 are INP3 Routes. This works, but maybe is not ideal
typedef struct NR_DEST_ROUTE_ENTRY typedef struct NR_DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
UCHAR ROUT_QUALITY; // QUALITY UCHAR ROUT_QUALITY; // QUALITY
UCHAR ROUT_OBSCOUNT; UCHAR ROUT_OBSCOUNT;
UCHAR Padding[5]; // SO Entries are the same length UCHAR ROUT_LOCKED;
UCHAR Padding[4]; // So Entries are the same length
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct DEST_ROUTE_ENTRY typedef struct INP3_DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
USHORT LastRTT; // Last Value Reported USHORT LastRTT; // Last Value Reported
@ -467,13 +498,13 @@ typedef struct DEST_LIST
UCHAR DEST_ALIAS[6]; UCHAR DEST_ALIAS[6];
UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC
UCHAR DEST_LOCKED;
UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION
UCHAR INP3FLAGS; UCHAR INP3FLAGS;
struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest struct NR_DEST_ROUTE_ENTRY NRROUTE[3]; // Best 3 NR neighbours for this dest
struct INP3_DEST_ROUTE_ENTRY INP3ROUTE[3]; // Best 3 INP neighbours for this dest
struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION
@ -677,11 +708,14 @@ typedef struct PORTCONTROL
BOOL NormalizeQuality; // Normalise Node Qualities BOOL NormalizeQuality; // Normalise Node Qualities
BOOL IgnoreUnlocked; // Ignore Unlocked routes BOOL IgnoreUnlocked; // Ignore Unlocked routes
BOOL INP3ONLY; // Default to INP3 and disallow NODES BOOL INP3ONLY; // Default to INP3 and disallow NODES
BOOL ALLOWINP3; // Accept INP3 if offered by other end
BOOL ENABLEINP3; // Send INP3 RTT probes to discovered neighbours
void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ
struct PORTCONTROL * HookPort; struct PORTCONTROL * HookPort;
int PortSlot; // Index in Port Table int PortSlot; // Index in Port Table
struct TNCINFO * TNC; // Associated TNC record struct TNCINFO * TNC; // Associated TNC record
int HWType; // Hardware type of Driver. In here as external apps don't have access to TNC record
int RIGPort; // Linked port for freq resporting int RIGPort; // Linked port for freq resporting
unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED) unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED)
char * CTEXT; // Port Specific CText char * CTEXT; // Port Specific CText
@ -701,6 +735,9 @@ typedef struct PORTCONTROL
UCHAR * TX; // % Sending UCHAR * TX; // % Sending
UCHAR * BUSY; // % Active (Normally DCD active or TX) UCHAR * BUSY; // % Active (Normally DCD active or TX)
int Hardware; // TNC H_TYPE. Copied here for access from application context
} PORTCONTROLX, *PPORTCONTROL; } PORTCONTROLX, *PPORTCONTROL;
typedef struct FULLPORTDATA typedef struct FULLPORTDATA
@ -901,6 +938,9 @@ typedef struct _LINKTABLE
VOID * FRAMES[8]; // FRAMES WAITING ACK VOID * FRAMES[8]; // FRAMES WAITING ACK
VOID * RXFRAMES[8]; // Frames received out of sequence VOID * RXFRAMES[8]; // Frames received out of sequence
time_t LASTFRAMESENT; // For detecting stuck links
int LASTSENTQCOUNT; //
UCHAR L2STATE; // PROCESSING STATE UCHAR L2STATE; // PROCESSING STATE
UCHAR Ver2point2; // Set if running 2.2 UCHAR Ver2point2; // Set if running 2.2
USHORT L2TIMER; // FRAME RETRY TIMER USHORT L2TIMER; // FRAME RETRY TIMER
@ -934,6 +974,26 @@ typedef struct _LINKTABLE
time_t ConnectTime; // For session stats time_t ConnectTime; // For session stats
int bytesRXed; // Info bytes only int bytesRXed; // Info bytes only
int bytesTXed; int bytesTXed;
int framesRXed;
int framesTXed;
int framesResent;
// Now support compressing L2 Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
char ApplName[16];
time_t lastStatusSentTime;
} LINKTABLE; } LINKTABLE;
@ -1043,7 +1103,11 @@ struct SEM
int Gets; int Gets;
int Rels; int Rels;
DWORD SemProcessID; DWORD SemProcessID;
#ifdef WIN32
DWORD SemThreadID; DWORD SemThreadID;
#else
pthread_t SemThreadID;
#endif
int Line; // caller file and line int Line; // caller file and line
char File[MAX_PATH]; char File[MAX_PATH];
}; };
@ -1330,6 +1394,8 @@ struct arp_table_entry
// SOCKET SourceSocket; // SOCKET SourceSocket;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
BOOL noUpdate; // Don't update dest address from incoming packet BOOL noUpdate; // Don't update dest address from incoming packet
BOOL replytoSourcePort; // Update map entry dest port from source port of each packet.
time_t LastHeard; // Last Packet received from this ststiom
}; };
@ -1419,6 +1485,25 @@ struct AXIPPORTINFO
}; };
struct CMDX
{
char String[12]; // COMMAND STRING
UCHAR CMDLEN; // SIGNIFICANT LENGTH
VOID (*CMDPROC)(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD);// COMMAND PROCESSOR
// VOID (*CMDPROC)();// COMMAND PROCESSOR
size_t CMDFLAG; // FLAG/VALUE Offset
};
struct NETROMX
{
int ServiceNo;
char ServiceName[10];
};
extern struct NETROMX SERVICES[];
extern int NUMBEROFSSERVICES;
#define Disconnect(stream) SessionControl(stream,2,0) #define Disconnect(stream) SessionControl(stream,2,0)
#define Connect(stream) SessionControl(stream,1,0) #define Connect(stream) SessionControl(stream,1,0)

View file

@ -22,6 +22,8 @@ count on BPQ32.dll gets messed up, and the code will not unload cleanly.
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portslot);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
int APIENTRY GetPortHardwareType(struct PORTCONTROL *PORT);
// Returns number of free buffers // Returns number of free buffers
// (BPQHOST function 7 (part)). // (BPQHOST function 7 (part)).

View file

@ -192,8 +192,8 @@ extern UCHAR BPQDirectory[];
extern int OffsetH, OffsetW; extern int OffsetH, OffsetW;
static void ResolveNames(struct AXIPPORTINFO * PORT); static void ResolveNames(VOID * Param);
void OpenSockets(struct AXIPPORTINFO * PORT); void OpenSockets(VOID * Param);
void CloseSockets(struct AXIPPORTINFO * PORT); void CloseSockets(struct AXIPPORTINFO * PORT);
@ -204,7 +204,7 @@ int Update_MH_KeepAlive(struct AXIPPORTINFO * PORT, struct in_addr ipad, char pr
unsigned short int compute_crc(unsigned char *buf,int l); unsigned short int compute_crc(unsigned char *buf,int l);
unsigned int find_arp(unsigned char * call); unsigned int find_arp(unsigned char * call);
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name, BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name,
int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate); int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort);
BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len); BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len);
BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen); BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
static BOOL ReadConfigFile(int Port); static BOOL ReadConfigFile(int Port);
@ -213,7 +213,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT);
BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT); BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
int DumpFrameInHex(unsigned char * msg, int len); int DumpFrameInHex(unsigned char * msg, int len);
VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen); VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen);
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr); BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort);
int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock); int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock);
int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer); int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
@ -221,7 +221,7 @@ int KissDecode(UCHAR * inbuff, int len);
int Socket_Accept(int SocketId); int Socket_Accept(int SocketId);
int Socket_Connect(int SocketId, int Error); int Socket_Connect(int SocketId, int Error);
int Socket_Data(int sock, int error, int eventcode); int Socket_Data(int sock, int error, int eventcode);
VOID TCPConnectThread(struct arp_table_entry * arp); VOID TCPConnectThread(VOID * Param);
VOID __cdecl Debugprintf(const char * format, ...); VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Consoleprintf(const char * format, ...); VOID __cdecl Consoleprintf(const char * format, ...);
BOOL OpenListeningSocket(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp); BOOL OpenListeningSocket(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp);
@ -429,7 +429,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply) if (PORT->Checkifcanreply)
{ {
if (CheckSourceisResolvable(PORT, call, 0, &RXaddr)) if (CheckSourceisResolvable(PORT, call, 0, &RXaddr, 0))
return 1; return 1;
@ -437,7 +437,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
// Can't reply. If AutoConfig is set, add to table and accept, else reject // Can't reply. If AutoConfig is set, add to table and accept, else reject
if (PORT->AutoAddARP) if (PORT->AutoAddARP)
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0, 0);
else else
{ {
char From[11] = "|"; char From[11] = "|";
@ -536,7 +536,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply) if (PORT->Checkifcanreply)
{ {
if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr)) if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr, PORT->udpport[i]))
return 1; return 1;
else else
{ {
@ -547,10 +547,10 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
{ {
char Addr[80]; char Addr[80];
Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE); Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0, 0);
} }
else else
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0); return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0, 0);
else else
{ {
char From[11] = "|"; char From[11] = "|";
@ -692,7 +692,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
else else
Consoleprintf("Failed to reread config file - leaving config unchanged"); Consoleprintf("Failed to reread config file - leaving config unchanged");
_beginthread(OpenSockets, 0, PORT ); _beginthread(OpenSockets, 0, PORT);
GetAXIPCache(PORT); GetAXIPCache(PORT);
@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
return; return;
} }
// Seelcte source port by choosing right socket // Select source port by choosing right socket
// First Set Default for Protocol // First Set Default for Protocol
@ -844,8 +844,9 @@ int InitAXIP(int Port)
return (TRUE); return (TRUE);
} }
void OpenSockets(struct AXIPPORTINFO * PORT) void OpenSockets(void * Param)
{ {
struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
char Msg[255]; char Msg[255];
int err; int err;
u_long param=1; u_long param=1;
@ -1343,6 +1344,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
char axcall[7]; char axcall[7];
BOOL UDPFlag, BCFlag; BOOL UDPFlag, BCFlag;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
int useSourcePort = 0;
for (i=1; i <= MAXBPQPORTS; i++) for (i=1; i <= MAXBPQPORTS; i++)
{ {
@ -1391,7 +1393,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
{ {
if (convtoax25(call,axcall,&calllen)) if (convtoax25(call,axcall,&calllen))
{ {
add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0); add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0, useSourcePort);
ResolveDelay = 2; ResolveDelay = 2;
return(DestroyWindow(hWnd)); return(DestroyWindow(hWnd));
} }
@ -1527,8 +1529,9 @@ static void CreateResolverWindow(struct AXIPPORTINFO * PORT)
extern HWND hWndPopup; extern HWND hWndPopup;
static void ResolveNames(struct AXIPPORTINFO * PORT) static void ResolveNames(VOID * Param)
{ {
struct AXIPPORTINFO * PORT = (struct AXIPPORTINFO *)Param;
int count = 0; int count = 0;
PORT->ResolveNamesThreadId = GetCurrentThreadId(); // Detect if another started PORT->ResolveNamesThreadId = GetCurrentThreadId(); // Detect if another started
@ -2147,6 +2150,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
int Interval; int Interval;
int noUpdate=FALSE; int noUpdate=FALSE;
int TCPMode; int TCPMode;
int useSourcePort = 0;
ptr = strtok(buf, " \t\n\r"); ptr = strtok(buf, " \t\n\r");
@ -2234,6 +2238,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
bcflag=0; bcflag=0;
TCPMode=0; TCPMode=0;
SourcePort = 0; SourcePort = 0;
useSourcePort = 0;
// //
// Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params // Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params
@ -2264,7 +2269,14 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (p_udpport == NULL) return (FALSE); if (p_udpport == NULL) return (FALSE);
port = atoi(p_udpport); if (_stricmp(p_udpport,"FROMPORT") == 0)
{
useSourcePort = TRUE;
port = 0;
}
else
port = atoi(p_udpport);
p_UDP = strtok(NULL, " \t\n\r"); p_UDP = strtok(NULL, " \t\n\r");
continue; continue;
} }
@ -2327,7 +2339,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (SourcePort == 0) if (SourcePort == 0)
SourcePort = port; SourcePort = port;
add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate); add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate, useSourcePort);
return (TRUE); return (TRUE);
} }
} // End of Process MAP } // End of Process MAP
@ -2438,7 +2450,7 @@ BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call,int * calllen
} }
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port, BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port,
UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate) UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort)
{ {
struct arp_table_entry * arp; struct arp_table_entry * arp;
@ -2457,7 +2469,8 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->PORT = PORT; arp->PORT = PORT;
if (port == 0) PORT->needip = 1; // Enable Raw IP Mode if (port == 0 && arp->replytoSourcePort == 0)
PORT->needip = 1; // Enable Raw IP Mode
arp->ResolveFlag=TRUE; arp->ResolveFlag=TRUE;
PORT->NeedResolver=TRUE; PORT->NeedResolver=TRUE;
@ -2476,6 +2489,7 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->TCPMode = TCPFlag; arp->TCPMode = TCPFlag;
arp->noUpdate = noUpdate; arp->noUpdate = noUpdate;
PORT->arp_table_len++; PORT->arp_table_len++;
arp->replytoSourcePort = useSourcePort;
if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70) if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70)
PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70; PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70;
@ -2576,7 +2590,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT)
return (0); return (0);
} }
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr) BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort)
{ {
// Makes sure we can reply to call before accepting message // Makes sure we can reply to call before accepting message
@ -2606,10 +2620,17 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port,
struct sockaddr_in * SA = rxaddr; struct sockaddr_in * SA = rxaddr;
memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4); memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4);
} }
// Dont think I should update port // Dont think I should update port unless using source port for dest
//arp->port = Port; if (arp->replytoSourcePort)
{
arp->port = FromPort;
arp->destaddr.sin_port = htons(arp->port);
if (arp->SourcePort == 0)
arp->SourcePort = ToPort;
}
} }
arp->LastHeard = time(NULL);
return 1; // Ok to process return 1; // Ok to process
} }
index++; index++;
@ -2977,8 +2998,9 @@ int KissDecode(UCHAR * inbuff, int len)
return txptr; return txptr;
} }
VOID TCPConnectThread(struct arp_table_entry * arp) VOID TCPConnectThread(void * Param)
{ {
struct arp_table_entry * arp = (struct arp_table_entry *)Param;
char Msg[255]; char Msg[255];
int err, i; int err, i;
u_long param=1; u_long param=1;

View file

@ -73,6 +73,9 @@
//.25 //.25
// Increase size of status display buffers (7) // Increase size of status display buffers (7)
// Allow sending BEL (CTRL/G) (79)
// Fix sending BEL (CTRL/G) (81)
#include "BPQChat.h" #include "BPQChat.h"
#include "Dbghelp.h" #include "Dbghelp.h"

View file

@ -290,6 +290,9 @@ typedef struct ConnectionInfo_S
struct ConnectionInfo_S * SysopChatStream; // Stream sysop is chatting to struct ConnectionInfo_S * SysopChatStream; // Stream sysop is chatting to
int bytesSent;
int bytesRxed;
} ConnectionInfo, CIRCUIT; } ConnectionInfo, CIRCUIT;
// Flags Equates // Flags Equates
@ -336,11 +339,13 @@ typedef struct ConnectionInfo_S
struct FBBRestartData struct FBBRestartData
{ {
struct MsgInfo * TempMsg; // Header while message is being received char Call[10];
struct UserInfo * UserPointer; char bid[13];
int length;
UCHAR * MailBuffer; // Mail Message being received UCHAR * MailBuffer; // Mail Message being received
int MailBufferSize; // Total Malloc'ed size. Actual size in in Msg Struct int MailBufferSize; // Total Malloc'ed size. Actual size in in Msg Struct
int Count; // Give up if too many restarts int Count; // Give up if too many restarts
time_t TimeCreated;
}; };
// We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so // We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so
@ -1387,6 +1392,7 @@ BOOL CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSFo
BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements); BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements);
int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo); int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo);
int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS); int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS);
void SaveRestartData();
VOID ReRouteMessages(); VOID ReRouteMessages();

File diff suppressed because it is too large Load diff

202
cMain.c
View file

@ -15,7 +15,8 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// C replacement for Main.asm // C replacement for Main.asm
@ -51,16 +52,33 @@ int CanPortDigi(int Port);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
void MQTTTimer(); void MQTTTimer();
void SaveMH(); void SaveMH();
VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
void WritePacketLogThread(void * param);
void hookNodeStarted();
void hookNodeRunning();
void APIL2Trace(struct _MESSAGE * Message, char Dirn);
#include "configstructs.h" #include "configstructs.h"
extern struct CONFIGTABLE xxcfg; extern struct CONFIGTABLE xxcfg;
extern BOOL needAIS; extern BOOL needAIS;
extern int needADSB; extern int needADSB;
extern int EnableOARCAPI;
extern SOCKET NodeAPISocket;
extern int nodeStartedSent;
extern SOCKADDR_IN UDPreportdest;
extern char NodeAPIServer[80];
extern int NodeAPIPort;
time_t LastNodeStatus = 0;
int nodeStatusTimer = 20 * 60; // 20 mins
struct PORTCONFIG * PortRec; struct PORTCONFIG * PortRec;
#define RNRSET 0x2 // RNR RECEIVED FROM OTHER END #define RNRSET 0x2 // RNR RECEIVED FROM OTHER END
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
// STATION INFORMATION // STATION INFORMATION
@ -139,6 +157,16 @@ int NODE = 1; // INCLUDE SWITCH SUPPORT
int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ
int L4Compress = 0;
int L4CompMaxframe = 3;
int L4CompPaclen = 236;
int L2Compress = 0;
int L2CompMaxframe = 3;
int L2CompPaclen = 236;
int PREFERINP3ROUTES = 0;
BOOL LogL4Connects = FALSE; BOOL LogL4Connects = FALSE;
BOOL LogAllConnects = FALSE; BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE; BOOL AUTOSAVEMH = TRUE;
@ -156,6 +184,8 @@ char MQTT_PASS[80] = "";
int MQTT_Connecting = 0; int MQTT_Connecting = 0;
int MQTT_Connected = 0; int MQTT_Connected = 0;
int PoolBuilt = 0;
//TNCTABLE DD 0 //TNCTABLE DD 0
//NUMBEROFSTREAMS DD 0 //NUMBEROFSTREAMS DD 0
@ -164,6 +194,7 @@ extern VOID * ENDPOOL;
extern void * APPL_Q; // Queue of frames for APRS Appl extern void * APPL_Q; // Queue of frames for APRS Appl
extern BOOL APRSActive; extern BOOL APRSActive;
extern int DEBUGINP3;
#define BPQHOSTSTREAMS 64 #define BPQHOSTSTREAMS 64
@ -177,9 +208,12 @@ BPQVECSTRUC * TELNETMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS];
BPQVECSTRUC * AGWMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 1]; BPQVECSTRUC * AGWMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 1];
BPQVECSTRUC * APRSMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 2]; BPQVECSTRUC * APRSMONVECPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 2];
BPQVECSTRUC * IPHOSTVECTORPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 3]; BPQVECSTRUC * IPHOSTVECTORPTR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 3];
BPQVECSTRUC * FILEMONVECTOR = &BPQHOSTVECTOR[BPQHOSTSTREAMS + 4];
int BPQVECLENGTH = sizeof(BPQVECSTRUC); int BPQVECLENGTH = sizeof(BPQVECSTRUC);
int MONTOFILEFLAG = 0;
int NODEORDER = 0; int NODEORDER = 0;
UCHAR LINKEDFLAG = 0; UCHAR LINKEDFLAG = 0;
@ -233,6 +267,8 @@ int CFLAG = 0; // C =HOST Command
VOID * IDMSG_Q = NULL; // ID/BEACONS WAITING TO BE SENT VOID * IDMSG_Q = NULL; // ID/BEACONS WAITING TO BE SENT
int NODESINPROGRESS = 0; int NODESINPROGRESS = 0;
int NODESToOnePort = 0; // Set to port num to send NODES to only one port.
VOID * CURRENTNODE = NULL; // NEXT _NODE TO SEND VOID * CURRENTNODE = NULL; // NEXT _NODE TO SEND
VOID * DESTHEADER = NULL; // HEAD OF SORTED NODES CHAIN VOID * DESTHEADER = NULL; // HEAD OF SORTED NODES CHAIN
@ -288,8 +324,8 @@ VOID LINKINIT(PEXTPORTDATA PORTVEC)
VOID LINKTX(PEXTPORTDATA PORTVEC, PMESSAGE Buffer) VOID LINKTX(PEXTPORTDATA PORTVEC, PMESSAGE Buffer)
{ {
// LOOP BACK TO SWITCH // LOOP BACK TO SWITCH
struct _LINKTABLE * LINK; struct _LINKTABLE * LINK;
LINK = Buffer->Linkptr; LINK = Buffer->Linkptr;
if (LINK) if (LINK)
@ -822,6 +858,37 @@ BOOL Start()
MQTT_PORT = cfg->C_MQTT_PORT; MQTT_PORT = cfg->C_MQTT_PORT;
strcpy(MQTT_USER, cfg->C_MQTT_USER); strcpy(MQTT_USER, cfg->C_MQTT_USER);
strcpy(MQTT_PASS, cfg->C_MQTT_PASS); strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
L4Compress = cfg->C_L4Compress;
L4CompMaxframe = cfg->C_L4CompMaxframe;
L4CompPaclen = cfg->C_L4CompPaclen;
if (L4CompMaxframe < 1 || L4CompMaxframe > 16)
L4CompMaxframe = 3;
if (L4CompPaclen < 64 || L4CompPaclen > 236)
L4CompPaclen = 236;
L2Compress = cfg->C_L2Compress;
L2CompMaxframe = cfg->C_L2CompMaxframe;
L2CompPaclen = cfg->C_L2CompPaclen;
if (L2CompMaxframe < 1 || L2CompMaxframe > 16)
L2CompMaxframe = 3;
if (L2CompPaclen < 64 || L2CompPaclen > 236)
L2CompPaclen = 236;
PREFERINP3ROUTES = cfg->C_PREFERINP3ROUTES;
if (cfg->C_DEBUGINP3)
DEBUGINP3 = 0;
EnableOARCAPI = cfg->C_OARCAPI;
if (cfg->C_OnlyVer2point0)
SUPPORT2point2 = 0;
// Get pointers to PASSWORD and APPL1 commands // Get pointers to PASSWORD and APPL1 commands
@ -948,6 +1015,8 @@ BOOL Start()
PORT->NormalizeQuality = !PortRec->NoNormalize; PORT->NormalizeQuality = !PortRec->NoNormalize;
PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED; PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED;
PORT->INP3ONLY = PortRec->INP3ONLY; PORT->INP3ONLY = PortRec->INP3ONLY;
PORT->ALLOWINP3 = PortRec->AllowINP3;
PORT->ENABLEINP3 = PortRec->EnableINP3;
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME; PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
@ -972,6 +1041,9 @@ BOOL Start()
PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN; PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN;
PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST; PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST;
if (PORT->QUAL_ADJUST < 0 || PORT->QUAL_ADJUST > 100)
PORT->QUAL_ADJUST = 100;
PORT->DIGIFLAG = PortRec->DIGIFLAG; PORT->DIGIFLAG = PortRec->DIGIFLAG;
if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT)) if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT))
PORT->DIGIPORT = PortRec->DIGIPORT; PORT->DIGIPORT = PortRec->DIGIPORT;
@ -1319,13 +1391,13 @@ BOOL Start()
PORT = GetPortTableEntryFromPortNum(ROUTE->NEIGHBOUR_PORT); PORT = GetPortTableEntryFromPortNum(ROUTE->NEIGHBOUR_PORT);
if (Rcfg->pwind & 0x40) if (Rcfg->nokeepalives)
ROUTE->NoKeepAlive = 1; ROUTE->NoKeepAlive = 1;
else else
if (PORT != NULL) if (PORT != NULL)
ROUTE->NoKeepAlive = PORT->PortNoKeepAlive; ROUTE->NoKeepAlive = PORT->PortNoKeepAlive;
if (Rcfg->pwind & 0x80 || (PORT && PORT->INP3ONLY)) if (Rcfg->inp3 || (PORT && PORT->INP3ONLY))
{ {
ROUTE->INP3Node = 1; ROUTE->INP3Node = 1;
ROUTE->NoKeepAlive = 0; // Cant have INP3 and NOKEEPALIVES ROUTE->NoKeepAlive = 0; // Cant have INP3 and NOKEEPALIVES
@ -1338,7 +1410,13 @@ BOOL Start()
ROUTE->NBOUR_PACLEN = Rcfg->ppacl; ROUTE->NBOUR_PACLEN = Rcfg->ppacl;
ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual; ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual;
ROUTE->NEIGHBOUR_FLAG = 1; // Locked ROUTE->NEIGHBOUR_FLAG = LOCKEDBYCONFIG; // Locked
if (Rcfg->tcphost)
{
ROUTE->TCPHost = Rcfg->tcphost;
ROUTE->TCPPort = Rcfg->tcpport;
}
Rcfg++; Rcfg++;
ROUTE++; ROUTE++;
@ -1429,6 +1507,8 @@ BOOL Start()
ENDBUFFERPOOL = NEXTFREEDATA; ENDBUFFERPOOL = NEXTFREEDATA;
PoolBuilt = 1;
// Copy Bridge Map // Copy Bridge Map
@ -1515,8 +1595,34 @@ BOOL Start()
upnpInit(); upnpInit();
// Start Monitor to file thread
_beginthread(WritePacketLogThread, 0, NULL);
lastSaveSecs = CurrentSecs = lastSlowSecs = time(NULL); lastSaveSecs = CurrentSecs = lastSlowSecs = time(NULL);
// if EnableOARCAPI set try to resolve host here so we can send Node up event before anything else
if (EnableOARCAPI)
{
struct hostent * HostEnt3;
HostEnt3 = gethostbyname(NodeAPIServer);
NodeAPISocket = socket(AF_INET, SOCK_DGRAM, 0);
UDPreportdest.sin_family = AF_INET;
UDPreportdest.sin_port = htons(NodeAPIPort);
if (HostEnt3)
{
memcpy(&UDPreportdest.sin_addr.s_addr,HostEnt3->h_addr,4);
hookNodeStarted();
nodeStartedSent = 1;
LastNodeStatus = time(NULL);
}
}
return 0; return 0;
} }
@ -1546,6 +1652,7 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
struct ROUTE * ROUTE = NEIGHBOURS; struct ROUTE * ROUTE = NEIGHBOURS;
struct ROUTE * FIRSTSPARE = NULL; struct ROUTE * FIRSTSPARE = NULL;
int n = MAXNEIGHBOURS; int n = MAXNEIGHBOURS;
char Normcall[10];
while (n--) while (n--)
{ {
@ -1558,6 +1665,10 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
ROUTE++; ROUTE++;
continue; continue;
} }
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call)) if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
{ {
*REQROUTE = ROUTE; *REQROUTE = ROUTE;
@ -1843,12 +1954,11 @@ VOID ReadNodes()
if (ptr == NULL) continue; if (ptr == NULL) continue;
// I don't thinlk we should load locked flag from save file - only from config // I don't thinlk we should load locked flag from save file - only from config
// Now (2025) have two locked flags, from config or by sysop. Latter is saved and restored
// But need to parse it until I stop saving it
if (ptr[0] == '!') if (ptr[0] == '!')
{ {
// ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
} }
@ -1865,7 +1975,7 @@ VOID ReadNodes()
memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7); memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE - Digi'ed routes must be locked ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE - Digi'ed routes must be locked
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
@ -1921,6 +2031,14 @@ VOID ReadNodes()
if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE
ROUTE->OtherendsRouteQual = atoi(ptr); ROUTE->OtherendsRouteQual = atoi(ptr);
ptr = strtok_s(NULL, seps, &Context); // INP3
if (ptr == NULL) continue;
if (ptr[0] == '!')
{
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context);
}
continue; continue;
} }
@ -2098,6 +2216,12 @@ VOID TIMERINTERRUPT()
if (MQTT) if (MQTT)
MQTTTimer(); MQTTTimer();
if (LastNodeStatus && (time(NULL) - LastNodeStatus) > nodeStatusTimer)
{
LastNodeStatus = time(NULL);
hookNodeRunning();
}
/* /*
if (QCOUNT < 200) if (QCOUNT < 200)
{ {
@ -2153,6 +2277,10 @@ VOID TIMERINTERRUPT()
} }
Message = (struct _MESSAGE *)Buffer; Message = (struct _MESSAGE *)Buffer;
if(NodeAPISocket)
APIL2Trace(Message, 'T');
Message->PORT |= 0x80; // Set TX Bit Message->PORT |= 0x80; // Set TX Bit
BPQTRACE(Message, FALSE); // Dont send TX'ed frames to APRS BPQTRACE(Message, FALSE); // Dont send TX'ed frames to APRS
@ -2264,6 +2392,9 @@ L2Packet:
if (MQTT && PORT->PROTOCOL == 0) if (MQTT && PORT->PROTOCOL == 0)
MQTTKISSRX(Buffer); MQTTKISSRX(Buffer);
if(NodeAPISocket &&PORT->PROTOCOL == 0)
APIL2Trace(Message, 'R');
// Bridge if requested // Bridge if requested
@ -2449,6 +2580,47 @@ ENDOFLIST:
if ((LINK->L2FLAGS & RNRSET) == 0) if ((LINK->L2FLAGS & RNRSET) == 0)
SDETX(LINK); SDETX(LINK);
else
{
// Stuck link debug check
if (LINK->LINKWINDOW == 0 || LINK->LASTFRAMESENT == 0 || (time(NULL) - LINK->LASTFRAMESENT) > 60) // No send for 60 secs
{
if (COUNT_AT_L2(LINK) > 16 || LINK->LINKWINDOW == 0)
{
// Dump Link State
char Normcall[11] = "";
char Normcall2[11] = "";
int Count = COUNT_AT_L2(LINK);
int secs = time(NULL) - LINK->LASTFRAMESENT;
ConvFromAX25(LINK->LINKCALL, Normcall);
ConvFromAX25(LINK->OURCALL, Normcall2);
Debugprintf("*** Stuck L2 Session for %d Secs RNR Set %s %s %d", secs, Normcall, Normcall2, Count);
Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS);
Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3],
LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]);
// Reset Link
InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE
LINK->L2RETRIES -= 1; // Just send one DISC
LINK->L2STATE = 4; // CLOSING
L2SENDCOMMAND(LINK, DISC | PFBIT);
return;
}
}
}
} }
} }
LINK++; LINK++;
@ -2573,6 +2745,18 @@ int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS)
L4++; L4++;
} }
// And to the Monitor to File system.
if (MONTOFILEFLAG) // Trace Enabled?
{
Buffer = GetBuff();
if (Buffer)
{
memcpy(&Buffer->PORT, &Msg->PORT, BUFFLEN - sizeof(void *)); // Dont copy chain word
C_Q_ADD(&FILEMONVECTOR->HOSTTRACEQ, Buffer);
}
}
return TRUE; return TRUE;
} }
; ;

View file

@ -18,5 +18,5 @@ Chat :
MonitorSize = "828,1644,148,770"; MonitorSize = "828,1644,148,770";
DebugSize = "0,0,0,0"; DebugSize = "0,0,0,0";
WindowSize = "231,835,254,602"; WindowSize = "231,835,254,602";
Version = "6,0,24,32"; Version = "6,0,24,81";
}; };

View file

@ -1,451 +1,447 @@
// //
// Prototypes for BPQ32 Node Functions // Prototypes for BPQ32 Node Functions
// //
#define DllImport
#define DllImport
#define EXCLUDEBITS
#define EXCLUDEBITS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "compatbits.h"
#include "compatbits.h"
#include "asmstrucs.h"
#include "asmstrucs.h"
BOOL CheckExcludeList(UCHAR * Call);
BOOL CheckExcludeList(UCHAR * Call);
Dll int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
Dll int ConvFromAX25(unsigned char * incall,unsigned char * outcall); Dll BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call);
Dll BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call); DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call);
DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call); int WritetoConsoleLocal(char * buff);
int WritetoConsoleLocal(char * buff); VOID Consoleprintf(const char * format, ...);
VOID Consoleprintf(const char * format, ...); VOID FreeConfig();
VOID FreeConfig(); int GetListeningPortsPID(int Port);
int GetListeningPortsPID(int Port);
void * InitializeExtDriver(PEXTPORTDATA PORTVEC);
void * InitializeExtDriver(PEXTPORTDATA PORTVEC);
VOID PutLengthinBuffer(PDATAMESSAGE buff, USHORT datalen); // Needed for arm5 portability
VOID PutLengthinBuffer(PDATAMESSAGE buff, USHORT datalen); // Needed for arm5 portability int GetLengthfromBuffer(PDATAMESSAGE buff);
int GetLengthfromBuffer(PDATAMESSAGE buff); int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BOOL APRS, BOOL MCTL);
int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BOOL APRS, BOOL MCTL); int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly); int CountBits64(uint64_t in);
int CountBits64(uint64_t in);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#define GetBuff() _GetBuff(__FILE__, __LINE__)
#define GetBuff() _GetBuff(__FILE__, __LINE__) #define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__) #define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
#define Q_REM(s) _Q_REM(s, __FILE__, __LINE__)
#define Q_REM(s) _Q_REM(s, __FILE__, __LINE__) #define Q_REM_NP(s) _Q_REM_NP(s, __FILE__, __LINE__)
#define Q_REM_NP(s) _Q_REM_NP(s, __FILE__, __LINE__)
#define C_Q_ADD(s, b) _C_Q_ADD(s, b, __FILE__, __LINE__)
#define C_Q_ADD(s, b) _C_Q_ADD(s, b, __FILE__, __LINE__)
void _CheckGuardZone(char * File, int Line);
void _CheckGuardZone(char * File, int Line);
VOID * _Q_REM(VOID **Q, char * File, int Line);
VOID * _Q_REM(VOID **Q, char * File, int Line); VOID * _Q_REM_NP(VOID *Q, char * File, int Line);
VOID * _Q_REM_NP(VOID *Q, char * File, int Line);
int _C_Q_ADD(VOID *Q, VOID *BUFF, char * File, int Line);
int _C_Q_ADD(VOID *Q, VOID *BUFF, char * File, int Line);
UINT _ReleaseBuffer(VOID *BUFF, char * File, int Line);
UINT _ReleaseBuffer(VOID *BUFF, char * File, int Line);
VOID * _GetBuff(char * File, int Line);
VOID * _GetBuff(char * File, int Line); int _C_Q_ADD(VOID *PQ, VOID *PBUFF, char * File, int Line);
int _C_Q_ADD(VOID *PQ, VOID *PBUFF, char * File, int Line);
int C_Q_COUNT(VOID *Q);
int C_Q_COUNT(VOID *Q);
DllExport char * APIENTRY GetApplCall(int Appl);
DllExport char * APIENTRY GetApplCall(int Appl); DllExport char * APIENTRY GetApplAlias(int Appl);
DllExport char * APIENTRY GetApplAlias(int Appl); DllExport int APIENTRY FindFreeStream();
DllExport int APIENTRY FindFreeStream(); DllExport int APIENTRY DeallocateStream(int stream);
DllExport int APIENTRY DeallocateStream(int stream); DllExport int APIENTRY SessionState(int stream, int * state, int * change);
DllExport int APIENTRY SessionState(int stream, int * state, int * change); DllExport int APIENTRY SetAppl(int stream, int flags, int mask);
DllExport int APIENTRY SetAppl(int stream, int flags, int mask); DllExport int APIENTRY GetMsg(int stream, char * msg, int * len, int * count );
DllExport int APIENTRY GetMsg(int stream, char * msg, int * len, int * count ); DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign, int * port, int * sesstype, int * paclen,
int * port, int * sesstype, int * paclen, int * maxframe, int * l4window);
int * maxframe, int * l4window);
#define LIBCONFIG_STATIC
#define LIBCONFIG_STATIC #include "libconfig.h"
#include "libconfig.h"
int GetIntValue(config_setting_t * group, char * name);
int GetIntValue(config_setting_t * group, char * name); BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen); VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveIntValue(config_setting_t * group, char * name, int value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
VOID SaveStringValue(config_setting_t * group, char * name, char * value);
int EncryptPass(char * Pass, char * Encrypt);
int EncryptPass(char * Pass, char * Encrypt); VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len); Dll VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset);
Dll VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset); Dll BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
Dll BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
DllExport int APIENTRY TXCount(int stream);
DllExport int APIENTRY TXCount(int stream); DllExport int APIENTRY RXCount(int stream);
DllExport int APIENTRY RXCount(int stream); DllExport int APIENTRY MONCount(int stream);
DllExport int APIENTRY MONCount(int stream);
VOID ReadNodes();
VOID ReadNodes(); int BPQTRACE(MESSAGE * Msg, BOOL APRS);
int BPQTRACE(MESSAGE * Msg, BOOL APRS);
VOID CommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID CommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID PostStateChange(TRANSPORTENTRY * Session);
VOID PostStateChange(TRANSPORTENTRY * Session);
VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer); VOID DoTheCommand(TRANSPORTENTRY * Session);
VOID DoTheCommand(TRANSPORTENTRY * Session); char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len); VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer); char * strlop(char * buf, char delim);
char * strlop(char * buf, char delim); BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
VOID PostDataAvailable(TRANSPORTENTRY * Session);
VOID PostDataAvailable(TRANSPORTENTRY * Session); int WritetoConsoleLocal(char * buff);
int WritetoConsoleLocal(char * buff); char * CHECKBUFFER(TRANSPORTENTRY * Session, char * Bufferptr);
char * CHECKBUFFER(TRANSPORTENTRY * Session, char * Bufferptr); VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK); VOID SENDL4CONNECT(TRANSPORTENTRY * Session, int Service);
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
VOID CloseSessionPartner(TRANSPORTENTRY * Session); int COUNTNODES(struct ROUTE * ROUTE);
int COUNTNODES(struct ROUTE * ROUTE); int DecodeNodeName(char * NodeName, char * ptr);;
int DecodeNodeName(char * NodeName, char * ptr);; VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer); int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK); void * zalloc(int len);
void * zalloc(int len); BOOL FindDestination(UCHAR * Call, struct DEST_LIST ** REQDEST);
BOOL FindDestination(UCHAR * Call, struct DEST_LIST ** REQDEST);
BOOL ProcessConfig();
BOOL ProcessConfig();
VOID PUT_ON_PORT_Q(struct PORTCONTROL * PORT, MESSAGE * Buffer);
VOID PUT_ON_PORT_Q(struct PORTCONTROL * PORT, MESSAGE * Buffer); VOID CLEAROUTLINK(struct _LINKTABLE * LINK);
VOID CLEAROUTLINK(struct _LINKTABLE * LINK); VOID TellINP3LinkGone(struct ROUTE * Route);
VOID TellINP3LinkGone(struct ROUTE * Route); VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason);
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason);
// Reason Equates
// Reason Equates
#define NORMALCLOSE 0
#define NORMALCLOSE 0 #define RETRIEDOUT 1
#define RETRIEDOUT 1 #define SETUPFAILED 2
#define SETUPFAILED 2 #define LINKLOST 3
#define LINKLOST 3 #define LINKSTUCK 4
#define LINKSTUCK 4
int COUNT_AT_L2(struct _LINKTABLE * LINK);
int COUNT_AT_L2(struct _LINKTABLE * LINK); VOID SENDIDMSG();
VOID SENDIDMSG(); VOID SENDBTMSG();
VOID SENDBTMSG(); VOID INP3TIMER();
VOID INP3TIMER(); VOID REMOVENODE(dest_list * DEST);
VOID REMOVENODE(dest_list * DEST); BOOL ACTIVATE_DEST(struct DEST_LIST * DEST);
BOOL ACTIVATE_DEST(struct DEST_LIST * DEST); VOID TellINP3LinkSetupFailed(struct ROUTE * Route);
VOID TellINP3LinkSetupFailed(struct ROUTE * Route); BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE); VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual);
VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual); BOOL L2SETUPCROSSLINK(PROUTE ROUTE);
BOOL L2SETUPCROSSLINK(PROUTE ROUTE); VOID REMOVENODE(dest_list * DEST);
VOID REMOVENODE(dest_list * DEST); char * SetupNodeHeader(struct DATAMESSAGE * Buffer);
char * SetupNodeHeader(struct DATAMESSAGE * Buffer); VOID L4CONNECTFAILED(TRANSPORTENTRY * L4);
VOID L4CONNECTFAILED(TRANSPORTENTRY * L4); int CountFramesQueuedOnSession(TRANSPORTENTRY * Session);
int CountFramesQueuedOnSession(TRANSPORTENTRY * Session); VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session);
VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session); VOID __cdecl Debugprintf(const char * format, ...);
VOID __cdecl Debugprintf(const char * format, ...);
int APIENTRY Restart();
int APIENTRY Restart(); int APIENTRY Reboot();
int APIENTRY Reboot(); int APIENTRY Reconfig();
int APIENTRY Reconfig(); Dll int APIENTRY SaveNodes ();
Dll int APIENTRY SaveNodes ();
struct SEM;
struct SEM;
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line); void FreeSemaphore(struct SEM * Semaphore);
void FreeSemaphore(struct SEM * Semaphore);
void MySetWindowText(HWND hWnd, char * Msg);
void MySetWindowText(HWND hWnd, char * Msg);
Dll int APIENTRY SessionControl(int stream, int command, int Mask);
Dll int APIENTRY SessionControl(int stream, int command, int Mask);
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits);
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits); int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength);
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength); BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite);
BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite); VOID CloseCOMPort(HANDLE fd);
VOID CloseCOMPort(HANDLE fd);
VOID initUTF8();
VOID initUTF8(); int Is8Bit(unsigned char *cpt, int len);
int Is8Bit(unsigned char *cpt, int len); int WebIsUTF8(unsigned char *ptr, int len);
int WebIsUTF8(unsigned char *ptr, int len); int IsUTF8(unsigned char *ptr, int len);
int IsUTF8(unsigned char *ptr, int len); int Convert437toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
int Convert437toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF); int Convert1251toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
int Convert1251toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF); int Convert1252toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
int Convert1252toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF); int TrytoGuessCode(unsigned char * Char, int Len);
int TrytoGuessCode(unsigned char * Char, int Len);
#define CMD_TO_APPL 1 // PASS COMMAND TO APPLICATION
#define CMD_TO_APPL 1 // PASS COMMAND TO APPLICATION #define MSG_TO_USER 2 // SEND 'CONNECTED' TO USER
#define MSG_TO_USER 2 // SEND 'CONNECTED' TO USER #define MSG_TO_APPL 4 // SEND 'CONECTED' TO APPL
#define MSG_TO_APPL 4 // SEND 'CONECTED' TO APPL #define CHECK_FOR_ESC 8 // Look for ^d (^D) to disconnect session)
#define CHECK_FOR_ESC 8 // Look for ^d (^D) to disconnect session)
#define UI 3
#define UI 3 #define SABM 0x2F
#define SABM 0x2F #define DISC 0x43
#define DISC 0x43 #define DM 0x0F
#define DM 0x0F #define UA 0x63
#define UA 0x63 #define FRMR 0x87
#define FRMR 0x87 #define RR 1
#define RR 1 #define RNR 5
#define RNR 5 #define REJ 9
#define REJ 9
// V2.2 Types
// V2.2 Types
#define SREJ 0x0D
#define SREJ 0x0D #define SABME 0x6F
#define SABME 0x6F #define XID 0xAF
#define XID 0xAF #define TEST 0xE3
#define TEST 0xE3
// XID Optional Functions
#define SUPPORT2point2 1
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
// XID Optional Functions #define OPSREJ 4
#define OPSREJMult 0x200000
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address #define OPREJ 2
#define OPSREJ 4 #define OPMod8 0x400
#define OPSREJMult 0x200000 #define OPMod128 0x800
#define OPREJ 2
#define OPMod8 0x400 #define BPQHOSTSTREAMS 64
#define OPMod128 0x800
extern TRANSPORTENTRY * L4TABLE;
#define BPQHOSTSTREAMS 64 extern unsigned char NEXTID;
extern int MAXCIRCUITS;
extern TRANSPORTENTRY * L4TABLE; extern int L4DEFAULTWINDOW;
extern unsigned char NEXTID; extern int L4T1;
extern int MAXCIRCUITS; extern APPLCALLS APPLCALLTABLE[];
extern int L4DEFAULTWINDOW; extern char * APPLS;
extern int L4T1; extern int NEEDMH;
extern APPLCALLS APPLCALLTABLE[]; extern int RFOnly;
extern char * APPLS;
extern int NEEDMH; extern char SESSIONHDDR[];
extern int RFOnly;
extern UCHAR NEXTID;
extern char SESSIONHDDR[];
extern struct ROUTE * NEIGHBOURS;
extern UCHAR NEXTID; extern int MAXNEIGHBOURS;
extern struct ROUTE * NEIGHBOURS; extern struct ROUTE * NEIGHBOURS;
extern int MAXNEIGHBOURS; extern int ROUTE_LEN;
extern int MAXNEIGHBOURS;
extern struct ROUTE * NEIGHBOURS;
extern int ROUTE_LEN; extern struct DEST_LIST * DESTS; // NODE LIST
extern int MAXNEIGHBOURS; extern struct DEST_LIST * ENDDESTLIST;
extern int DEST_LIST_LEN;
extern struct DEST_LIST * DESTS; // NODE LIST extern int MAXDESTS; // MAX NODES IN SYSTEM
extern struct DEST_LIST * ENDDESTLIST;
extern int DEST_LIST_LEN; extern struct _LINKTABLE * LINKS;
extern int MAXDESTS; // MAX NODES IN SYSTEM extern int LINK_TABLE_LEN;
extern int MAXLINKS;
extern struct _LINKTABLE * LINKS;
extern int LINK_TABLE_LEN;
extern int MAXLINKS;
extern char MYCALL[]; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED)
extern char MYALIASTEXT[]; // {" " ; NODE ALIAS (KEEP TOGETHER)
extern char MYCALL[]; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED) extern UCHAR MYCALLWITHALIAS[13];
extern char MYALIASTEXT[]; // {" " ; NODE ALIAS (KEEP TOGETHER) extern APPLCALLS APPLCALLTABLE[NumberofAppls];
extern UCHAR MYCALLWITHALIAS[13]; extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
extern APPLCALLS APPLCALLTABLE[NumberofAppls]; extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
extern VOID * FREE_Q;
extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
extern struct PORTCONTROL * PORTTABLE;
extern VOID * FREE_Q; extern int NUMBEROFPORTS;
extern struct PORTCONTROL * PORTTABLE;
extern int NUMBEROFPORTS; extern int OBSINIT; // INITIAL OBSOLESCENCE VALUE
extern int OBSMIN; // MINIMUM TO BROADCAST
extern int L3INTERVAL; // "NODES" INTERVAL IN MINS
extern int OBSINIT; // INITIAL OBSOLESCENCE VALUE extern int IDINTERVAL; // "ID" BROADCAST INTERVAL
extern int OBSMIN; // MINIMUM TO BROADCAST extern int BTINTERVAL; // "BT" BROADCAST INTERVAL
extern int L3INTERVAL; // "NODES" INTERVAL IN MINS extern int MINQUAL; // MIN QUALITY FOR AUTOUPDATES
extern int IDINTERVAL; // "ID" BROADCAST INTERVAL extern int HIDENODES; // N * COMMAND SWITCH
extern int BTINTERVAL; // "BT" BROADCAST INTERVAL extern int BBSQUAL; // QUALITY OF BBS RELATIVE TO NODE
extern int MINQUAL; // MIN QUALITY FOR AUTOUPDATES
extern int HIDENODES; // N * COMMAND SWITCH extern int NUMBEROFBUFFERS; // PACKET BUFFERS
extern int BBSQUAL; // QUALITY OF BBS RELATIVE TO NODE extern int PACLEN; //MAX PACKET SIZE
extern int NUMBEROFBUFFERS; // PACKET BUFFERS // L2 SYSTEM TIMER RUNS AT 3 HZ
extern int PACLEN; //MAX PACKET SIZE
extern int T3; // LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions)
// L2 SYSTEM TIMER RUNS AT 3 HZ
extern int L2KILLTIME; // IDLE LINK TIMER (16 MINS)
extern int T3; // LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions) extern int L3LIVES; // MAX L3 HOPS
extern int L4N2; // LEVEL 4 RETRY COUNT
extern int L2KILLTIME; // IDLE LINK TIMER (16 MINS) extern int L4LIMIT; // IDLE SESSION LIMIT - 15 MINS
extern int L3LIVES; // MAX L3 HOPS extern int L4DELAY; // L4 DELAYED ACK TIMER
extern int L4N2; // LEVEL 4 RETRY COUNT
extern int L4LIMIT; // IDLE SESSION LIMIT - 15 MINS extern int BBS; // INCLUDE BBS SUPPORT
extern int L4DELAY; // L4 DELAYED ACK TIMER extern int NODE; // INCLUDE SWITCH SUPPORT
extern int BBS; // INCLUDE BBS SUPPORT extern int FULL_CTEXT; // CTEXT ON ALL CONNECTS IF NZ
extern int NODE; // INCLUDE SWITCH SUPPORT
extern int FULL_CTEXT; // CTEXT ON ALL CONNECTS IF NZ // Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
extern BPQVECSTRUC DUMMYVEC; // Needed to force correct order of following
// Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
extern BPQVECSTRUC BPQHOSTVECTOR[BPQHOSTSTREAMS + 5];
extern BPQVECSTRUC DUMMYVEC; // Needed to force correct order of following
extern int NODEORDER;
extern BPQVECSTRUC BPQHOSTVECTOR[BPQHOSTSTREAMS + 5]; extern UCHAR LINKEDFLAG;
extern int NODEORDER; extern UCHAR UNPROTOCALL[80];
extern UCHAR LINKEDFLAG;
extern UCHAR UNPROTOCALL[80]; extern char * INFOMSG;
extern char * CTEXTMSG;
extern char * INFOMSG; extern int CTEXTLEN;
extern char * CTEXTMSG; extern UCHAR MYALIAS[7]; // ALIAS IN AX25 FORM
extern int CTEXTLEN; extern UCHAR BBSALIAS[7];
extern UCHAR MYALIAS[7]; // ALIAS IN AX25 FORM extern VOID * TRACE_Q; // TRANSMITTED FRAMES TO BE TRACED
extern UCHAR BBSALIAS[7];
extern char HEADERCHAR; // CHAR FOR _NODE HEADER MSGS
extern VOID * TRACE_Q; // TRANSMITTED FRAMES TO BE TRACED
extern int AUTOSAVE; // AUTO SAVE NODES ON EXIT FLAG
extern char HEADERCHAR; // CHAR FOR _NODE HEADER MSGS extern int L4APPL; // Application for BBSCALL/ALIAS connects
extern int CFLAG; // C =HOST Command
extern int AUTOSAVE; // AUTO SAVE NODES ON EXIT FLAG
extern int L4APPL; // Application for BBSCALL/ALIAS connects extern VOID * IDMSG_Q; // ID/BEACONS WAITING TO BE SENT
extern int CFLAG; // C =HOST Command
extern struct DATAMESSAGE BTHDDR;
extern VOID * IDMSG_Q; // ID/BEACONS WAITING TO BE SENT extern struct _MESSAGE IDHDDR;
extern struct DATAMESSAGE BTHDDR; extern VOID * IDMSG;
extern struct _MESSAGE IDHDDR;
extern int L3TIMER; // TIMER FOR 'NODES' MESSAGE
extern VOID * IDMSG; extern int IDTIMER; // TIMER FOR ID MESSAGE
extern int BTTIMER; // TIMER FOR BT MESSAGE
extern int L3TIMER; // TIMER FOR 'NODES' MESSAGE
extern int IDTIMER; // TIMER FOR ID MESSAGE extern int STATSTIME;
extern int BTTIMER; // TIMER FOR BT MESSAGE
extern int STATSTIME; extern BOOL IPRequired;
extern int MaxHops;
extern int MAXRTT;
extern BOOL IPRequired; extern USHORT CWTABLE[];
extern int MaxHops; extern TRANSPORTENTRY * L4TABLE;
extern int MAXRTT; extern UCHAR ROUTEQUAL;
extern USHORT CWTABLE[]; extern UINT BPQMsg;
extern TRANSPORTENTRY * L4TABLE; extern UCHAR ExcludeList[];
extern UCHAR ROUTEQUAL;
extern UINT BPQMsg;
extern UCHAR ExcludeList[]; extern APPLCALLS APPLCALLTABLE[];
extern char VersionStringWithBuild[];
extern APPLCALLS APPLCALLTABLE[]; extern char VersionString[];
extern char VersionStringWithBuild[]; extern int MAXHEARDENTRIES;
extern char VersionString[]; extern int MHLEN;
extern int MAXHEARDENTRIES; extern int APPL1;
extern int MHLEN; extern int PASSCMD;
extern int NUMBEROFCOMMANDS;
extern int APPL1;
extern int PASSCMD; extern char * ConfigBuffer;
extern int NUMBEROFCOMMANDS;
extern char * WL2KReportLine[];
extern char * ConfigBuffer;
extern struct CMDX COMMANDS[];
extern char * WL2KReportLine[];
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
extern struct CMDX COMMANDS[]; extern char CMDALIAS[ALIASLEN][NumberofAppls];
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN; extern int SEMGETS;
extern char CMDALIAS[ALIASLEN][NumberofAppls]; extern int SEMRELEASES;
extern int SEMCLASHES;
extern int SEMGETS; extern int MINBUFFCOUNT;
extern int SEMRELEASES;
extern int SEMCLASHES; extern UCHAR BPQDirectory[];
extern int MINBUFFCOUNT; extern UCHAR BPQProgramDirectory[];
extern UCHAR BPQDirectory[]; extern UCHAR WINMOR[];
extern UCHAR BPQProgramDirectory[]; extern UCHAR PACTORCALL[];
extern UCHAR WINMOR[]; extern UCHAR MCOM;
extern UCHAR PACTORCALL[]; extern UCHAR MUIONLY;
extern UCHAR MTX;
extern UCHAR MCOM; extern uint64_t MMASK;
extern UCHAR MUIONLY;
extern UCHAR MTX; extern UCHAR NODECALL[]; // NODES in ax.25
extern uint64_t MMASK;
extern int L4CONNECTSOUT;
extern UCHAR NODECALL[]; // NODES in ax.25 extern int L4CONNECTSIN;
extern int L4FRAMESTX;
extern int L4CONNECTSOUT; extern int L4FRAMESRX;
extern int L4CONNECTSIN; extern int L4FRAMESRETRIED;
extern int L4FRAMESTX; extern int OLDFRAMES;
extern int L4FRAMESRX; extern int L3FRAMES;
extern int L4FRAMESRETRIED;
extern int OLDFRAMES; extern char * PortConfig[];
extern int L3FRAMES; extern struct SEM Semaphore;
extern UCHAR AuthorisedProgram; // Local Variable. Set if Program is on secure list
extern char * PortConfig[];
extern struct SEM Semaphore; extern int REALTIMETICKS;
extern UCHAR AuthorisedProgram; // Local Variable. Set if Program is on secure list
extern time_t CurrentSecs;
extern int REALTIMETICKS; extern time_t lastSlowSecs;
extern time_t lastSaveSecs;
extern time_t CurrentSecs;
extern time_t lastSlowSecs; // SNMP Variables
extern time_t lastSaveSecs;
extern int InOctets[64];
// SNMP Variables extern int OutOctets[64];
extern int InOctets[64]; extern BOOL CloseAllNeeded;
extern int OutOctets[64]; extern int CloseOnError;
extern BOOL CloseAllNeeded; extern char * PortConfig[70];
extern int CloseOnError; extern struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
extern char * PortConfig[70]; #define MaxBPQPortNo 63 // Port 64 reserved for BBS Mon
extern struct TNCINFO * TNCInfo[71]; // Records are Malloc'd #define MAXBPQPORTS 63
#define MaxBPQPortNo 63 // Port 64 reserved for BBS Mon // IP, APRS use port ocnfig slots above the real port range
#define MAXBPQPORTS 63
#define IPConfigSlot MaxBPQPortNo + 1
// IP, APRS use port ocnfig slots above the real port range #define PortMapConfigSlot MaxBPQPortNo + 2
#define APRSConfigSlot MaxBPQPortNo + 3
#define IPConfigSlot MaxBPQPortNo + 1
#define PortMapConfigSlot MaxBPQPortNo + 2
#define APRSConfigSlot MaxBPQPortNo + 3 extern char * UIUIDigi[MaxBPQPortNo + 1];
extern char UIUIDEST[MaxBPQPortNo + 1][11]; // Dest for Beacons
extern UCHAR FN[MaxBPQPortNo + 1][256]; // Filename
extern char * UIUIDigi[MaxBPQPortNo + 1]; extern int Interval[MaxBPQPortNo + 1]; // Beacon Interval (Mins)
extern char UIUIDEST[MaxBPQPortNo + 1][11]; // Dest for Beacons extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text
extern UCHAR FN[MaxBPQPortNo + 1][256]; // Filename
extern int Interval[MaxBPQPortNo + 1]; // Beacon Interval (Mins) extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text extern BOOL SendFromFile[MaxBPQPortNo + 1];
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown extern BOOL MQTT;
extern BOOL SendFromFile[MaxBPQPortNo + 1]; extern char MQTT_HOST[80];
extern int MQTT_PORT;
extern BOOL MQTT; extern char MQTT_USER[80];
extern char MQTT_HOST[80]; extern char MQTT_PASS[80];
extern int MQTT_PORT;
extern char MQTT_USER[80]; extern int SUPPORT2point2;
extern char MQTT_PASS[80];
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz); DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK); void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK); void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK); void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);

View file

@ -49,7 +49,39 @@ Stuff to make compiling on WINDOWS and LINUX easier
int pthread_equal(pthread_t T1, pthread_t T2); int pthread_equal(pthread_t T1, pthread_t T2);
uintptr_t _beginthread(void(__cdecl *start_address)(void *), unsigned stack_size, void *arglist); uintptr_t _beginthread(void(__cdecl start_address)(void *), unsigned stack_size, void *arglist);
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf
__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
int count = -1;
if (size != 0)
count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
if (count == -1)
count = _vscprintf(format, ap);
return count;
}
__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
int count;
va_list ap;
va_start(ap, format);
count = c99_vsnprintf(outBuf, size, format, ap);
va_end(ap);
return count;
}
#endif
#else #else
@ -152,9 +184,7 @@ int stricmp(const unsigned char * pStr1, const unsigned char *pStr2);
char * strupr(char* s); char * strupr(char* s);
char * strlwr(char* s); char * strlwr(char* s);
pthread_t _beginthread(void(*start_address)(), unsigned stack_size, VOID * arglist); pthread_t _beginthread(void(start_address)(void *), unsigned stack_size, VOID * arglist);
#define WSAGetLastError() errno #define WSAGetLastError() errno
#define GetLastError() errno #define GetLastError() errno

217
config.c
View file

@ -305,9 +305,12 @@ static char *keywords[] =
"APPL5ALIAS", "APPL6ALIAS", "APPL7ALIAS", "APPL8ALIAS", "APPL5ALIAS", "APPL6ALIAS", "APPL7ALIAS", "APPL8ALIAS",
"APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL", "APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL",
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL", "APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", "LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS" "EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS",
"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe",
"L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0", "DEBUGINP3", "ENABLEOARCAPI"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -326,9 +329,12 @@ static void * offset[] =
&xxcfg.C_APPL[4].ApplAlias, &xxcfg.C_APPL[5].ApplAlias, &xxcfg.C_APPL[6].ApplAlias, &xxcfg.C_APPL[7].ApplAlias, &xxcfg.C_APPL[4].ApplAlias, &xxcfg.C_APPL[5].ApplAlias, &xxcfg.C_APPL[6].ApplAlias, &xxcfg.C_APPL[7].ApplAlias,
&xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual, &xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual,
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual, &xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs, &xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS}; /* offset for corresponding data in config file */ &xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS,
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe,
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0, &xxcfg.C_DEBUGINP3, &xxcfg.C_OARCAPI}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -346,9 +352,12 @@ static int routine[] =
13, 13 ,13, 13, 13, 13 ,13, 13,
14, 14, 14, 14, 14, 14, 14, 14,
14, 14 ,14, 14, 14, 14 ,14, 14,
15, 0, 2, 9, 9,
15, 0, 2, 9, 9, 9,
2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20} ; // Routine to process param 2, 2, 0, 1, 20, 20,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1}; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int); int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int); //int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -370,8 +379,7 @@ static char *pkeywords[] =
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY", "BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE", "UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE", "IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "ALLOWINP3", "ENABLEINP3"}; /* parameter keywords */
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -385,7 +393,7 @@ static void * poffset[] =
&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY, &xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize, &xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide, &xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort}; /* offset for corresponding data in config file */ &xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, &xxp.AllowINP3, &xxp.EnableINP3}; /* offset for corresponding data in config file */
static int proutine[] = static int proutine[] =
{ {
@ -399,7 +407,7 @@ static int proutine[] =
0, 1, 2, 18, 15, 16, 2, 0, 1, 2, 18, 15, 16, 2,
1, 17, 1, 1, 1, 1, 2, 1, 17, 1, 1, 1, 1, 2,
2, 2, 1, 1, 19, 2, 2, 2, 1, 1, 19, 2,
1, 20, 1, 21, 22, 1}; /* routine to process parameter */ 1, 20, 1, 21, 22, 1, 1, 1}; /* routine to process parameter */
int PPARAMLIM = sizeof(proutine)/sizeof(int); int PPARAMLIM = sizeof(proutine)/sizeof(int);
@ -533,6 +541,8 @@ BOOL ProcessConfig()
// xxcfg.SaveMH = TRUE; // Default to save // xxcfg.SaveMH = TRUE; // Default to save
xxcfg.C_PREFERINP3ROUTES = 0; // Default to false
GetNextLine(rec); GetNextLine(rec);
while (rec[0]) while (rec[0])
@ -594,7 +604,6 @@ BOOL ProcessConfig()
for (i=0;i<24;i++) for (i=0;i<24;i++)
paramok[45+i]=1; /* or APPLCALLS, APPLALIASS APPLQUAL */ paramok[45+i]=1; /* or APPLCALLS, APPLALIASS APPLQUAL */
paramok[69]=1; // BText optional paramok[69]=1; // BText optional
@ -616,6 +625,16 @@ BOOL ProcessConfig()
paramok[83]=1; // MQTT Params paramok[83]=1; // MQTT Params
paramok[84]=1; // MQTT Params paramok[84]=1; // MQTT Params
paramok[85]=1; // MQTT Params paramok[85]=1; // MQTT Params
paramok[86]=1; // L4Compress
paramok[87]=1; // L4Compress Maxframe
paramok[88]=1; // L4Compress Paclen
paramok[89]=1; // L2Compress
paramok[90]=1; // L2Compress Maxframe
paramok[91]=1; // L2Compress Paclen
paramok[92]=1; // PREFERINP3ROUTES
paramok[93]=1; // ONLYVer2point0
paramok[94]=1; // DEBUGINP3
paramok[95]=1; // EnableOARCAPI
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
{ {
@ -1568,32 +1587,160 @@ int routes(int i)
// strtok and sscanf can't handle successive commas, so split up usig strchr // strtok and sscanf can't handle successive commas, so split up usig strchr
memset(Param, 0, 2048); // Now support keyword=value format
strlop(rec, 13);
strlop(rec, ';');
ptr1 = rec; if (strchr(rec, '='))
while (ptr1 && *ptr1 && n < 8)
{ {
ptr2 = strchr(ptr1, ','); // New format
if (ptr2) *ptr2++ = 0; // call quality port window frack paclen farquality inp3 nokeepalives tcp
strcpy(&Param[n++][0], ptr1); char * ptr, *context;
ptr1 = ptr2; char copy[512] = "";
while(ptr1 && *ptr1 && *ptr1 == ' ')
ptr1++; if (strlen(rec) < 512)
strcpy(copy, rec);
_strupr(rec);
ptr = strtok_s(rec, " ,=", &context);
while (ptr)
{
if (strcmp(ptr, "CALL") == 0)
{
char * Call = strtok_s(NULL, ",=", &context);
if (strlen(Call) < 80)
strcpy(Route->call, Call);
}
else if (strcmp(ptr, "PORT") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->port = atoi(val);
}
else if (strcmp(ptr, "QUALITY") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->quality = atoi(val);
}
else if (strcmp(ptr, "FRACK") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->pfrack = atoi(val);
}
else if (strcmp(ptr, "PACLEN") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->pwind = atoi(val);
}
else if (strcmp(ptr, "WINDOW") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->pwind = atoi(val);
}
else if (strcmp(ptr, "FARQUALITY") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->farQual = atoi(val);
}
else if (strcmp(ptr, "INP3") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->inp3 = atoi(val);
}
else if (strcmp(ptr, "NOKEEPALIVES") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->farQual = atoi(val);
}
else if (strcmp(ptr, "TCP") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
{
char * port = strlop(val, ':');
Route->tcphost = _strdup(val);
if (port)
Route->tcpport = atoi(port);
else
Route->tcpport = 53119;
}
}
else
{
Consoleprintf("Bad Route %s\r\n",rec);
err_flag = 1;
break;
}
ptr = strtok_s(NULL, " ,=", &context);
}
} }
strcpy(Route->call, &Param[0][0]); else
{
Route->quality = atoi(Param[1]); memset(Param, 0, 2048);
Route->port = atoi(Param[2]); strlop(rec, 13);
Route->pwind = atoi(Param[3]); strlop(rec, ';');
Route->pfrack = atoi(Param[4]);
Route->ppacl = atoi(Param[5]); ptr1 = rec;
inp3 = atoi(Param[6]);
Route->farQual = atoi(Param[7]); while (ptr1 && *ptr1 && n < 8)
{
ptr2 = strchr(ptr1, ',');
if (ptr2) *ptr2++ = 0;
strcpy(&Param[n++][0], ptr1);
ptr1 = ptr2;
while(ptr1 && *ptr1 && *ptr1 == ' ')
ptr1++;
}
strcpy(Route->call, &Param[0][0]);
Route->quality = atoi(Param[1]);
Route->port = atoi(Param[2]);
Route->pwind = atoi(Param[3]);
Route->pfrack = atoi(Param[4]);
Route->ppacl = atoi(Param[5]);
inp3 = atoi(Param[6]);
Route->farQual = atoi(Param[7]);
if (inp3 & 1)
Route->inp3 = 1;
if (inp3 & 2)
Route->nokeepalives = 1;
}
if (Route->farQual < 0 || Route->farQual > 255) if (Route->farQual < 0 || Route->farQual > 255)
{ {
@ -1618,14 +1765,6 @@ int routes(int i)
err_flag = 1; err_flag = 1;
} }
// Use top bit of window as INP3 Flag, next as NoKeepAlive
if (inp3 & 1)
Route->pwind |= 0x80;
if (inp3 & 2)
Route->pwind |= 0x40;
if (err_flag == 1) if (err_flag == 1)
{ {
Consoleprintf("%s\r\n",rec); Consoleprintf("%s\r\n",rec);

View file

@ -81,6 +81,8 @@ struct PORTCONFIG
uint64_t PortFreq; uint64_t PortFreq;
char * M0LTEMapInfo; char * M0LTEMapInfo;
int QtSMPort; int QtSMPort;
int AllowINP3;
int EnableINP3;
}; };
struct ROUTECONFIG struct ROUTECONFIG
@ -92,6 +94,10 @@ struct ROUTECONFIG
int pfrack; int pfrack;
int ppacl; int ppacl;
int farQual; int farQual;
int inp3;
int nokeepalives;
char * tcphost;
int tcpport;
}; };
struct CONFIGTABLE struct CONFIGTABLE
@ -170,7 +176,18 @@ struct CONFIGTABLE
int C_MQTT_PORT; int C_MQTT_PORT;
char C_MQTT_USER[80]; char C_MQTT_USER[80];
char C_MQTT_PASS[80]; char C_MQTT_PASS[80];
int C_L4Compress;
int C_L4CompMaxframe;
int C_L4CompPaclen;
int C_L2Compress;
int C_L2CompMaxframe;
int C_L2CompPaclen;
int C_PREFERINP3ROUTES;
int C_OnlyVer2point0;
int C_DEBUGINP3;
int C_OARCAPI;
//#define ApplOffset 80000 // Applications offset in config buffer //#define ApplOffset 80000 // Applications offset in config buffer
//#define InfoOffset 85000 // Infomsg offset in buffer //#define InfoOffset 85000 // Infomsg offset in buffer
//#define InfoMax 2000 // Max Info //#define InfoMax 2000 // Max Info

View file

@ -35,6 +35,9 @@ int RFOnly = 0;
int MAXRTT = 9000; // 90 secs int MAXRTT = 9000; // 90 secs
int MaxHops = 4; int MaxHops = 4;
int DEBUGINP3 = 0;
int EnableOARCAPI = 0;
int RTTInterval = 24; // 4 Minutes int RTTInterval = 24; // 4 Minutes

11
debian/NEWS vendored Normal file
View file

@ -0,0 +1,11 @@
linbpq (6.0.24.22-2) unstable; urgency=medium
This is quite a big update, with config moving from /opt/oarc/bpq/bpq32.cfg to
/etc/bpq32.cfg. The system shall do this automatically for you, however
computers and their programmers are not perfect.
I strongly recommend at this point backing up your entire
/opt/oarc/bpq/ directory (cp -r /opt/oarc/bpq/ ~/bpq-backup/) before
proceeding with the upgrade
-- Dave Hibberd <d@vehibberd.com> Sat, 16 Dec 2023 13:30:06 +0000

23
debian/README.Debian vendored Normal file
View file

@ -0,0 +1,23 @@
README for linbpq on Debian
===========================
Please see https://wiki.oarc.uk/packet:linbpq-apt-installation for this guide
# Set config
Copy the config, edit it & set permissions.
The permissions are so linbpq web interface can edit the config.
sudo mv /usr/share/doc/linbpq/examples/bpq32.cfg /etc/bpq32.cfg
sudo nano /etc/bpq32.cfg
sudo chown :linbpq /etc/bpq32.cfg
sudo chmod 644 /etc/bpq32.cfg
# Start linbpq
sudo systemctl start linbpq
# Access your node
It shall be available by accessing http://localhost:8008 in the browser or telnet localhost 8010
-- Dave Hibberd <hibby@debian.org> Tue, 26 Mar 2024 00:53:42 +0000

50
debian/bpq32.cfg vendored Normal file
View file

@ -0,0 +1,50 @@
SIMPLE
NODECALL=MB7NAA
NODEALIAS=AANODE
LOCATOR=AA00aa
PASSWORD=xxxxxxxx
AUTOSAVE=1
NODESINTERVAL=10
MINQUAL=10
CTEXT:
Thanks for connecting.
Type ? for help.
***
PORT
PORTNUM=1
ID=VHF
TYPE=ASYNC
PROTOCOL=KISS
KISSOPTIONS=ACKMODE
COMPORT=/dev/ttyACM0
SPEED=57600
FRACK=4000
PACLEN=150
DIGIFLAG=0
QUALITY=192
MINQUAL=20
ENDPORT
PORT
PORTNUM=9
ID=Telnet
DRIVER=Telnet
CONFIG
LOGGING=1
CMS=1
DisconnectOnClose=1
SECURETELNET=1
TCPPORT=8010
FBBPORT=8011
HTTPPORT=8008
LOGINPROMPT=user:
PASSWORDPROMPT=password:
MAXSESSIONS=10
CTEXT=Thanks for connecting\n Enter ? for list of commands\n\n
USER=username,xxxxxxxx,m0aaa,,SYSOP
ENDPORT
LINCHAT
APPLICATION 2,CHAT,,MB7NAA-9,AACHAT,255

320
debian/changelog vendored Normal file
View file

@ -0,0 +1,320 @@
linbpq (6.0.25.8+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* Build on latest gcc standards
* New upstream version 6.0.25.8+repack
* Refresh patches with gbp pq!
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Fri, 24 Oct 2025 00:45:16 +0100
linbpq (6.0.25.06+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.06+repack
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Fri, 10 Oct 2025 23:42:04 +0100
linbpq (6.0.25.1+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.1+repack
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Sat, 20 Sep 2025 15:43:32 +0100
linbpq (6.0.24.82+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.82+repack
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Sun, 17 Aug 2025 22:36:49 +0100
linbpq (6.0.24.78+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
* New Upstream
* New files excluded
- No binaries in this release at all maybe!
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Thu, 31 Jul 2025 01:31:38 +0100
linbpq (6.0.24.77+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.77+repack
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Tue, 22 Jul 2025 21:46:13 +0100
linbpq (6.0.24.75+repack-1~hibbian~TRIXIE+2) trixie-hibbian-unstable; urgency=medium
* First trixie release
* Drop hard-dep on hibbian-archive-keyring
-- Dave Hibberd <hibby@debian.org> Wed, 16 Jul 2025 19:10:33 +0100
linbpq (6.0.24.75+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.75+repack
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Tue, 15 Jul 2025 01:10:43 +0100
linbpq (6.0.24.71+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.67+repack
* New upstream version 6.0.24.69+repack
* New upstream version 6.0.24.69.1+repack
* New upstream version 6.0.24.71+repack
* Okay that's a lot of updates.
* Refreshed d/p/makefile to reflect new CFLAG
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Wed, 21 May 2025 21:45:59 +0100
linbpq (6.0.24.66+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Update postinst script to be a little quieter
* MINI_BUILDD_OPTION:
auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Tue, 11 Mar 2025 00:51:35 +0000
linbpq (6.0.24.66+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.66+repack
-- Dave Hibberd <hibby@debian.org> Tue, 04 Mar 2025 22:50:09 +0000
linbpq (6.0.24.65+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
-- Dave Hibberd <hibby@debian.org> Tue, 25 Feb 2025 09:33:24 +0000
linbpq (6.0.24.59a+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* Little tweaks to makefile patch to account for new -rdynamic
-- Dave Hibberd <hibby@debian.org> Mon, 03 Feb 2025 22:32:11 +0000
linbpq (6.0.24.56+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
-- Dave Hibberd <hibby@debian.org> Mon, 06 Jan 2025 21:37:44 +0000
linbpq (6.0.24.55+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* d/rules
- Increased hardening
-- Dave Hibberd <hibby@debian.org> Sun, 05 Jan 2025 23:35:06 +0000
linbpq (6.0.24.54+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* Drop AGW Patch
* Drop Spelling Patch
* Drop Dynamic Links patch
-- Dave Hibberd <hibby@debian.org> Tue, 17 Dec 2024 16:46:05 +0000
linbpq (6.0.24.53+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream
- Patches refreshed
- dropped some edits in ftbfs-gcc14
- dropped d/patches/headers.patch
-- Dave Hibberd <hibby@debian.org> Tue, 03 Dec 2024 00:57:57 +0000
linbpq (6.0.24.52+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream
- Patches happy
-- Dave Hibberd <hibby@debian.org> Sat, 30 Nov 2024 21:47:17 +0000
linbpq (6.0.24.51.1+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Iron out an issue with time...
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 19:57:28 +0000
linbpq (6.0.24.51.1+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import after bug report
* Roll back some ftbfs-gcc14 edits
* Remove some more lib headers
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 19:30:22 +0000
linbpq (6.0.24.51+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
- Patches refreshed
* Upstream is now repacked to include less files
* Big build system review, now using Debian CFLAGS and LDFLAGS
- Hardening enabled, mostly
- A debug symbols package is now available
* Oh yeah, everything is now dynamic linking
- libpng
- libpaho-mqtt
- libjansson
- libminiupnpc
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 13:08:38 +0000
linbpq (6.0.24.50-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
* Files excluded at origtargz generation time for cleanliness
-- Dave Hibberd <hibby@debian.org> Tue, 12 Nov 2024 21:56:38 +0000
linbpq (6.0.24.49-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream import
* Patches refreshed
* Add mqtt requirements
-- Dave Hibberd <hibby@debian.org> Tue, 05 Nov 2024 21:52:29 +0000
linbpq (6.0.24.45-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
* Patches refreshed
-- Dave Hibberd <hibby@debian.org> Fri, 11 Oct 2024 15:48:41 +0100
linbpq (6.0.24.42-1~hibbian+3) bookworm-hibbian-unstable; urgency=medium
* 32bit build error
- Patch updated to fix hopefully
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 12:21:57 +0100
linbpq (6.0.24.42-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Forgot to fix the ninotnc-smt issue, fixed now
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 12:05:54 +0100
linbpq (6.0.24.42-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* Install config to /etc
* New upstream update
* Patches refreshed
* Debian hardening enabled
- 2 new patches created that touch almost every file
- Considered experimental.
- gcc14 builds for Debian Trixie!
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 10:15:11 +0100
linbpq (6.0.24.40-1) unstable; urgency=medium
* Fresh upstream release
- Patches refreshed
* Secure by default patch
-- Dave Hibberd <hibby@debian.org> Sun, 07 Jul 2024 16:09:28 +0100
linbpq (6.0.24.38-1) unstable; urgency=medium
* New Upstream
* Tweak config file per recommendation from 2M0MQN to make first start simple
* Bump standards to 4.7.0.0
-- Dave Hibberd <hibby@debian.org> Sun, 09 Jun 2024 22:38:40 +0100
linbpq (6.0.24.34-2) unstable; urgency=medium
* Fix config permissions bug as reported by Alex 2E1PKY
-- Dave Hibberd <hibby@debian.org> Mon, 08 Apr 2024 22:27:02 +0100
linbpq (6.0.24.34-1) unstable; urgency=medium
* Upstream bump
-- Dave Hibberd <hibby@debian.org> Sat, 06 Apr 2024 02:15:28 +0100
linbpq (6.0.24.33-1) unstable; urgency=medium
* Upstream bump
* Moved config file to examples
* Updated service to fail on no config
* Added helpful README.Debian
-- Dave Hibberd <hibby@debian.org> Tue, 26 Mar 2024 20:24:08 +0000
linbpq (6.0.24.30-1) unstable; urgency=medium
* Upstream bump
-- Dave Hibberd <hibby@debian.org> Fri, 23 Feb 2024 23:24:46 +0000
linbpq (6.0.24.29-1) unstable; urgency=medium
* Upstream bump
* Added my new details
* Tidied up some packaging errors
-- Dave Hibberd <hibby@debian.org> Tue, 13 Feb 2024 00:06:33 +0000
linbpq (6.0.24.27-2) unstable; urgency=medium
* Permissions fix for web-config-editor users
-- Dave Hibberd <d@vehibberd.com> Thu, 18 Jan 2024 10:31:56 +0000
linbpq (6.0.24.27-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Tue, 16 Jan 2024 20:51:43 +0000
linbpq (6.0.24.25-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Thu, 28 Dec 2023 10:44:47 +0000
linbpq (6.0.24.22-2) unstable; urgency=medium
* Moved config file home, caused chaos
-- Dave Hibberd <d@vehibberd.com> Sat, 16 Dec 2023 14:40:20 +0000
linbpq (6.0.24.22-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Fri, 08 Dec 2023 12:29:40 +0000
linbpq (6.0.24.16-1) unstable; urgency=medium
* New Upstream release
-- Dave Hibberd <d@vehibberd.com> Tue, 31 Oct 2023 22:50:01 +0000
linbpq (6.0.24.15-2) unstable; urgency=medium
* debian/conffiles introduced to stop linbpq overwriting config files
- Thanks to Mark 2M0IIG for raising concern about this bug!
-- Dave Hibberd <d@vehibberd.com> Sun, 15 Oct 2023 21:45:24 +0100
linbpq (6.0.24.15-1) unstable; urgency=medium
* New upstream release
-- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 22:19:48 +0100
linbpq (6.0.24.2-1) unstable; urgency=medium
* Initial release.
-- Dave Hibberd <d@vehibberd.com> Mon, 28 Aug 2023 23:20:45 +0100

20
debian/control vendored Normal file
View file

@ -0,0 +1,20 @@
Source: linbpq
Section: hamradio
Priority: optional
Maintainer: Dave Hibberd <hibby@debian.org>
Standards-Version: 4.7.2
Vcs-Browser: https://git.hibbian.org/Hibbian/linbpq
Vcs-Git: https://git.hibbian.org/Hibbian/linbpq.git
Homepage: https://www.cantab.net/users/john.wiseman/Documents/
Build-Depends: debhelper-compat (= 13)
Build-Depends-Arch: libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev, libpng-dev
Rules-Requires-Root: no
Package: linbpq
Architecture: linux-any
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser
Description: Packet node and ax25 stack
LINBPQ is a Linux version of the BPQ32 Node, BBS and Chat Server components.
It is actively developed by John G8BPQ and contains a complete, independent
implementation of ax.25 and net/rom as well as BBS and Chat applications and
can be used either as a packet switch or as a full featured node.

37
debian/copyright vendored Normal file
View file

@ -0,0 +1,37 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: linBPQ
Upstream-Contact: John Wiseman G8BPQ <john.wiseman@cantab.net>
Source: https://www.cantab.net/users/john.wiseman/Documents/
Files-Excluded: *.vcproj* *.bak *.lib *.dll *.wav *.asm *.vcxproj* *.pdb *.exe
.gitignore XAprs zlib.h zconf.h MQTT* pcap.h miniupnpc.h upnpdev.h
igd_desc_parse.h upnpcommands.h upnperrors.h miniupnpctypes.h
*.svn-base *.db *.obj
Files: *
Copyright: 1990-2025 John Wiseman G8BPQ <john.wiseman@cantab.net>
License: GPL-3
Files: debian/*
Copyright: 2016-2025 Dave Hibberd <d@vehibberd.com>
License: GPL-3
Files: debian/linbpq.service
Copyright: 2024-2025 Tom Fanning M0LTE
License: GPL-3
License: GPL-3
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
The GPL License which applies to this package can be found on your Debian
system at /usr/share/common-licenses/GPL-3.

2
debian/dirs vendored Normal file
View file

@ -0,0 +1,2 @@
usr/sbin
opt/oarc/bpq

3
debian/gbp.conf vendored Normal file
View file

@ -0,0 +1,3 @@
[DEFAULT]
debian-branch = hibbian/latest
upstream-branch = upstream/latest

6
debian/gitlab-ci.yml vendored Normal file
View file

@ -0,0 +1,6 @@
include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
reprotest:
extends: .test-reprotest-diffoscope

1
debian/install vendored Normal file
View file

@ -0,0 +1 @@
debian/bpq32.cfg etc/

1
debian/linbpq.examples vendored Normal file
View file

@ -0,0 +1 @@
debian/bpq32.cfg

14
debian/linbpq.service vendored Normal file
View file

@ -0,0 +1,14 @@
[Unit]
Description=Linbpq systemd service file
After=network.target
ConditionPathExists=/etc/bpq32.cfg
[Service]
ExecStart=/usr/sbin/linbpq -c /etc -d /opt/oarc/bpq -l /opt/oarc/bpq
WorkingDirectory=/opt/oarc/bpq
Restart=always
User=linbpq
Group=linbpq
[Install]
WantedBy=multi-user.target

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