140 Commits
Author SHA1 Message Date
zx 22fa90589b Merge pull request 'RPM, tests, pointlist indexing and nlookup-ing, lint fixes' (#4) from zx into master
Altlinux build / build-alt (push) Successful in 2m44s
Archlinux build / build-arch (push) Successful in 3m18s
Archlinux build / make-test (push) Successful in 1m2s
Debian build / build-ubuntu (push) Successful in 4m9s
Reviewed-on: #4
2025-04-21 10:27:14 +03:00
zx ccd0e13c05 Fxd PVS-Studio lint warnings
Altlinux build / build-alt (push) Successful in 2m54s
Archlinux build / build-arch (push) Successful in 3m25s
Archlinux build / make-test (push) Successful in 1m2s
Debian build / build-ubuntu (push) Successful in 3m59s
2025-04-21 00:55:45 +03:00
zx 3a9ee4727a Fixed nlookup and bfindex for pointlist handling. Added -C config option to utils. Updated man-files
Altlinux build / build-alt (push) Successful in 2m46s
Archlinux build / build-arch (push) Successful in 3m19s
Archlinux build / make-test (push) Successful in 1m0s
Debian build / build-ubuntu (push) Successful in 4m7s
2025-04-20 21:56:44 +03:00
zx ff329a7602 CQ adjastement
Altlinux build / build-alt (push) Successful in 2m39s
Archlinux build / build-arch (push) Successful in 3m7s
Archlinux build / make-test (push) Successful in 1m2s
Debian build / build-ubuntu (push) Successful in 4m0s
2025-04-20 00:50:35 +03:00
zx 5a036bb150 Fx contrib and lint err
Altlinux build / build-alt (push) Successful in 2m44s
Archlinux build / build-arch (push) Successful in 3m12s
Archlinux build / make-test (push) Successful in 1m1s
Debian build / build-ubuntu (push) Successful in 4m3s
2025-04-19 08:38:06 +03:00
zx 245f11724d Fx arch testing wf
Altlinux build / build-alt (push) Successful in 2m45s
Archlinux build / build-arch (push) Successful in 3m26s
Archlinux build / make-test (push) Successful in 1m7s
Debian build / build-ubuntu (push) Successful in 4m16s
2025-04-19 08:01:24 +03:00
zx 4d14e01c68 Added fail2ban filters, fx package naming, ver up
Altlinux build / build-alt (push) Failing after 2m18s
Archlinux build / build-arch (push) Successful in 3m22s
Archlinux build / make-test (push) Failing after 38s
Debian build / build-ubuntu (push) Has been cancelled
2025-04-19 07:52:33 +03:00
zx df0c511487 Обновить .gitea/workflows/arch.yaml
Altlinux build / build-alt (push) Successful in 2m20s
Archlinux build / build-arch (push) Successful in 3m19s
Archlinux build / make-test (push) Failing after 33s
Debian build / build-ubuntu (push) Successful in 4m3s
2025-04-19 07:15:14 +03:00
zx f8dd598312 Обновить .gitea/workflows/arch.yaml
Altlinux build / build-alt (push) Successful in 2m21s
Archlinux build / build-arch (push) Successful in 3m6s
Archlinux build / make-test (push) Successful in 33s
Debian build / build-ubuntu (push) Failing after 2m53s
2025-04-19 06:59:33 +03:00
zx c695876504 Обновить .gitea/workflows/arch.yaml
Altlinux build / build-alt (push) Successful in 2m16s
Archlinux build / build-arch (push) Successful in 3m5s
Archlinux build / make-test (push) Failing after 1m16s
Debian build / build-ubuntu (push) Successful in 3m56s
2025-04-19 06:48:12 +03:00
zx 0db3aee60f Обновить .gitea/workflows/arch.yaml
Altlinux build / build-alt (push) Has been cancelled
Debian build / build-ubuntu (push) Has been cancelled
2025-04-19 06:47:04 +03:00
zx f4d89f2fb2 Обновить .gitea/workflows/arch.yaml 2025-04-18 23:08:53 +03:00
zx 9ac18a21a6 Обновить .gitea/workflows/arch.yaml
Altlinux build / build-alt (push) Successful in 2m22s
Archlinux build / make-test (push) Failing after 42s
Debian build / build-ubuntu (push) Successful in 4m12s
Archlinux build / build-arch (push) Successful in 3m18s
2025-04-18 22:59:42 +03:00
zx 537daec883 Make test scripts cross-compatible to *BSD
Altlinux build / build-alt (push) Successful in 2m9s
Archlinux build / build-arch (push) Successful in 2m51s
Debian build / build-ubuntu (push) Successful in 3m41s
2025-04-18 00:36:06 +03:00
zx ee9c78d129 Added full-duplex all-protocol tests through socat, fixed makefile.in for manual inst
Altlinux build / build-alt (push) Successful in 2m16s
Archlinux build / build-arch (push) Successful in 3m2s
Debian build / build-ubuntu (push) Successful in 3m51s
2025-04-17 21:40:34 +03:00
zx 14d2f2992d Обновить .gitea/workflows/alt.yaml
Altlinux build / build-alt (push) Successful in 5m54s
Archlinux build / build-arch (push) Successful in 3m6s
Debian build / build-ubuntu (push) Successful in 3m48s
2025-04-16 19:27:42 +03:00
zx 78aac4f18c Merge pull request 'Fixed Makefile and build systems to include man-pages. Added Alt-linux workflow. Fix rpm spec-file' (#3) from zx into master
Altlinux build / build-alt (push) Successful in 5m39s
Archlinux build / build-arch (push) Successful in 3m4s
Debian build / build-ubuntu (push) Successful in 3m52s
Reviewed-on: #3
2025-04-16 10:36:33 +03:00
zx df5a915287 Обновить README.md
Altlinux build / build-alt (push) Successful in 7m19s
Archlinux build / build-arch (push) Successful in 4m13s
Debian build / build-ubuntu (push) Successful in 4m34s
2025-04-16 10:18:21 +03:00
zx b95128f87a Обновить .gitea/workflows/alt.yaml
Altlinux build / build-alt (push) Successful in 5m39s
Archlinux build / build-arch (push) Successful in 3m0s
Debian build / build-ubuntu (push) Successful in 3m58s
2025-04-16 10:01:00 +03:00
zx 6d042318d5 Обновить rpm/bforce.spec
Altlinux build / build-alt (push) Failing after 5m29s
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-16 09:52:26 +03:00
zx cf7208408c Обновить .gitea/workflows/alt.yaml
Altlinux build / build-alt (push) Failing after 5m13s
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-16 09:46:14 +03:00
zx aae6656a4a Обновить .gitea/workflows/alt.yaml
Altlinux build / build-alt (push) Failing after 5m13s
Archlinux build / build-arch (push) Successful in 2m54s
Debian build / build-ubuntu (push) Has been cancelled
2025-04-16 09:37:44 +03:00
zx 4297b51dca Обновить rpm/bforce.spec
Altlinux build / build-alt (push) Failing after 5m32s
Archlinux build / build-arch (push) Successful in 2m51s
Debian build / build-ubuntu (push) Successful in 3m42s
2025-04-16 09:14:40 +03:00
zx b9e68f295e alt-wf 14
Altlinux build / build-alt (push) Failing after 5m5s
Archlinux build / build-arch (push) Successful in 2m53s
Debian build / build-ubuntu (push) Successful in 3m44s
2025-04-16 06:45:35 +03:00
zx c665ce0aaf alt-wf 13
Altlinux build / build-alt (push) Failing after 4m11s
Archlinux build / build-arch (push) Successful in 2m56s
Debian build / build-ubuntu (push) Has been cancelled
2025-04-16 06:36:12 +03:00
zx 2807cd61ff alt-wf 12
Altlinux build / build-alt (push) Failing after 4m15s
Archlinux build / build-arch (push) Failing after 33s
Debian build / build-ubuntu (push) Has been cancelled
2025-04-16 06:31:11 +03:00
zx 330da47169 alt-wf 11
Altlinux build / build-alt (push) Failing after 4m10s
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-16 06:25:22 +03:00
zx 1d696c0ba0 alt-wf 10
Altlinux build / build-alt (push) Failing after 4m19s
Archlinux build / build-arch (push) Successful in 2m56s
Debian build / build-ubuntu (push) Successful in 3m41s
2025-04-16 01:08:30 +03:00
zx 5a49ebdfe5 alt-wf 9
Altlinux build / build-alt (push) Failing after 4m13s
Archlinux build / build-arch (push) Has been cancelled
Debian build / build-ubuntu (push) Has been cancelled
2025-04-16 01:01:35 +03:00
zx 42246c136f alt-wf 8
Altlinux build / build-alt (push) Failing after 4m16s
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-16 00:56:03 +03:00
zx d8d953b0b3 alt-wf 7
Altlinux build / build-alt (push) Failing after 4m19s
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-16 00:49:15 +03:00
zx c91ca40037 alt-wf 6
Altlinux build / build-alt (push) Failing after 4m12s
Archlinux build / build-arch (push) Successful in 2m53s
Debian build / build-ubuntu (push) Successful in 3m47s
2025-04-16 00:26:53 +03:00
zx 81bbffb312 alt-wf 5
Altlinux build / build-alt (push) Failing after 4m15s
Archlinux build / build-arch (push) Has been cancelled
Debian build / build-ubuntu (push) Has been cancelled
2025-04-16 00:20:04 +03:00
zx 46dc91c446 alt-wf 4
Debian build / build-ubuntu (push) Has been cancelled
Altlinux build / build-alt (push) Failing after 4m14s
Archlinux build / build-arch (push) Successful in 2m52s
2025-04-16 00:12:50 +03:00
zx be3fcc0b5e alt-wf 3
Altlinux build / build-alt (push) Failing after 2m0s
Archlinux build / build-arch (push) Successful in 2m55s
Debian build / build-ubuntu (push) Has been cancelled
2025-04-16 00:06:22 +03:00
zx 416c79b637 alt-wf 2
Altlinux build / build-alt (push) Failing after 1s
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-16 00:04:40 +03:00
zx 6612f8fc89 alt-wf 1
Debian build / build-ubuntu (push) Successful in 3m39s
Altlinux build / build-arch (push) Failing after 1s
Archlinux build / build-arch (push) Successful in 2m51s
2025-04-15 23:40:27 +03:00
zx 2b63aa8cd7 Some minor lint fixes from PVS-Studio, added Alt workflow
Archlinux build / build-arch (push) Successful in 3m37s
Debian build / build-ubuntu (push) Successful in 3m39s
2025-04-15 23:31:40 +03:00
zx b14e52133d Marged lint and automation fixes
Archlinux build / build-arch (push) Successful in 3m5s
Debian build / build-ubuntu (push) Successful in 3m47s
2025-04-15 00:36:39 +03:00
zx 07edf66b72 Fixed some lint errors from cppcheck
Debian build / build-ubuntu (push) Successful in 3m39s
Archlinux build / build-arch (push) Successful in 3m1s
2025-04-15 00:25:59 +03:00
zx 8261016c7e README.md fix
Archlinux build / build-arch (push) Successful in 3m0s
Debian build / build-ubuntu (push) Successful in 3m41s
2025-04-14 21:28:49 +03:00
zx 4d48c2abe9 fx version.h for years
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Has been cancelled
2025-04-14 21:26:17 +03:00
zx 7f7e420b13 Fix arch workflow to download only master version of PKGBUILD.ci
Debian build / build-ubuntu (push) Successful in 3m42s
Archlinux build / build-arch (push) Successful in 2m56s
2025-04-13 23:01:37 +03:00
zx 52b3b230b9 Fix PKGBUILD.ci - reverse naming, artifact collection
Archlinux build / build-arch (push) Successful in 4m3s
Debian build / build-ubuntu (push) Successful in 3m41s
2025-04-13 22:44:38 +03:00
zx 416795159f Fix PKGBUILD.ci - if-fi
Archlinux build / build-arch (push) Failing after 2m48s
Debian build / build-ubuntu (push) Successful in 3m39s
2025-04-13 22:30:27 +03:00
zx 04f62c7725 Fix PKGBUILD.ci for CI workflow, added manual action start
Debian build / build-ubuntu (push) Has been cancelled
Archlinux build / build-arch (push) Successful in 2m52s
2025-04-13 22:26:47 +03:00
zx ddf8f3f9e0 Fixed changelist to represent changes
Debian build / build-ubuntu (push) Successful in 3m39s
Archlinux build / build-arch (push) Failing after 55s
2025-04-13 21:41:43 +03:00
zx 6245ad3e10 CI fx workflow 40
Archlinux build / build-arch (push) Successful in 2m51s
Debian build / build-ubuntu (push) Successful in 3m40s
2025-04-13 20:54:59 +03:00
zx e3a1f7e52e CI fx workflow 39
Archlinux build / build (push) Successful in 3m8s
Debian build / build (push) Successful in 3m40s
2025-04-13 20:10:36 +03:00
zx e94fffb110 CI fx workflow 38
Debian build / build (push) Successful in 3m58s
2025-04-13 19:51:32 +03:00
zx a7cda5b70f CI fx workflow 37
Debian build / build (push) Failing after 5m4s
2025-04-13 19:19:34 +03:00
zx 0d4a4945fe CI fx workflow 36
Debian build / build (push) Successful in 3m36s
2025-04-13 18:41:22 +03:00
zx c658e03af5 CI fx workflow 35
Debian build / build (push) Failing after 3m39s
2025-04-13 18:32:15 +03:00
zx 57e5e00ca3 CI fx workflow 34 and cstd error for var decl after label
Debian build / build (push) Successful in 3m38s
2025-04-13 18:21:43 +03:00
zx 1f7d70b755 CI fx workflow 33 and some lint warnings
Debian build / build (push) Failing after 2m57s
2025-04-13 18:14:04 +03:00
zx 3c60f8de01 CI fx workflow 32
Debian build / build (push) Failing after 2m57s
2025-04-13 17:48:39 +03:00
zx c47397c800 CI fx workflow 31
Debian build / build (push) Failing after 2m12s
2025-04-13 17:45:32 +03:00
zx 224115fffe CI fx workflow 30
Debian build / build (push) Failing after 2m1s
2025-04-13 17:39:35 +03:00
zx 875ea3505f CI fx workflow 29
Debian build / build (push) Failing after 1m37s
2025-04-13 17:07:52 +03:00
zx d581b113c8 CI fx workflow 28
Archlinux build / build (push) Successful in 2m52s
Debian build / build (push) Failing after 29s
2025-04-13 16:49:37 +03:00
zx a296d43987 CI fx workflow 27
Archlinux build / build (push) Successful in 2m58s
Debian build / build (push) Failing after 14s
2025-04-13 16:43:35 +03:00
zx aa32dac10e CI fx workflow 26
Archlinux build / build (push) Successful in 2m57s
Debian build / build (push) Failing after 19s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 15s
2025-04-13 16:33:02 +03:00
zx 6a1a0a6838 CI fx workflow 25
Archlinux build / build (push) Successful in 3m2s
Debian build / build (push) Failing after 19s
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-04-13 16:24:01 +03:00
zx 83ce06579c Debianized again, fixed debuild, CI fx workflow
Archlinux build / build (push) Successful in 2m57s
Debian build / build (push) Successful in 1m8s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
2025-04-13 16:14:26 +03:00
zx 8339af8eac fx workflow 24
Archlinux build / build (push) Successful in 3m19s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-13 00:41:01 +03:00
zx 2477709da4 fx workflow 23
Archlinux build / build (push) Successful in 3m21s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-13 00:25:24 +03:00
zx 136eca95f1 fx workflow 22
Archlinux build / build (push) Successful in 4m30s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 23:57:11 +03:00
zx 030322225f fx workflow 21
Archlinux build / build (push) Failing after 3m27s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
2025-04-12 23:46:27 +03:00
zx 92bd4cae56 fx workflow 20
Archlinux build / build (push) Failing after 3m27s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 23:38:39 +03:00
zx 1837ebd57c fx workflow 19
Archlinux build / build (push) Failing after 3m19s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 23:31:20 +03:00
zx 2eb30b7644 fx workflow 18
Archlinux build / build (push) Failing after 4m29s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 16s
2025-04-12 23:12:44 +03:00
zx 7733d5d663 fx workflow 17
Archlinux build / build (push) Successful in 3m13s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 22:13:05 +03:00
zx 6a2320d922 fx workflow 16 2025-04-12 22:12:42 +03:00
zx 5f10b52c77 fx workflow 15
Archlinux build / build (push) Successful in 3m18s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:49:23 +03:00
zx 55fc94a95b fx workflow 14
Archlinux build / build (push) Failing after 24s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:40:39 +03:00
zx 1667d8a800 fx workflow 13
Archlinux build / build (push) Failing after 8s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:35:56 +03:00
zx 5eced105c8 fx workflow 12
Archlinux build / build (push) Failing after 38s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 19s
2025-04-12 21:32:20 +03:00
zx 7486b9c141 fx workflow 11
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 30s
2025-04-12 21:22:49 +03:00
zx 2fbe1d3e54 fx workflow 10
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 21:16:51 +03:00
zx fa8e081584 fx workflow 9
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:09:10 +03:00
zx 981d4f00b3 fx workflow 8 2025-04-12 21:07:19 +03:00
zx 26ecb8b64c fx actions 7
Archlinux build / build (push) Failing after 1m17s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 15:49:58 +03:00
zx 526338f720 fx actions 6
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 23s
Archlinux build / build (push) Failing after 42s
2025-04-12 15:45:35 +03:00
zx 06f48fe1c1 fx actions 5
Archlinux build / build (push) Failing after 15s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 15:37:10 +03:00
zx 4767b57ec9 fx actions 4
Archlinux build / build (push) Failing after 16s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 21s
2025-04-12 15:32:47 +03:00
zx 8892e3f740 fx actions 3
Archlinux build / build (push) Failing after 9s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 20s
2025-04-12 15:30:13 +03:00
zx 21eeae69cc fx actions 2
Archlinux build / build (push) Failing after 7s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 0s
2025-04-12 15:26:21 +03:00
zx 9799f977b9 fx actions
Archlinux build / build (push) Failing after 4m46s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s
2025-04-12 15:13:29 +03:00
zx 727f7cfdf3 Testing arch workflow 2
Archlinux build / build (push) Failing after 2s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m58s
2025-04-12 15:01:26 +03:00
zx 36747d9071 Testing arch workflow 2025-04-12 15:00:46 +03:00
zx 9fa59cacca fx demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 23s
2025-04-12 11:16:47 +03:00
zx b66dd2156c fx demo workflow 2025-04-12 11:14:05 +03:00
zx 80275d30d3 fx demo workflow 2025-04-12 11:11:51 +03:00
zx a62ae3afca fx demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3s
2025-04-12 11:08:28 +03:00
zx a9f98cdee9 fx demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m28s
2025-04-12 10:44:21 +03:00
zx 10d30223d1 Added demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m51s
2025-04-12 10:25:35 +03:00
zx c5fc6e9245 added .gitea folder 2025-04-11 12:28:15 +03:00
zx 29000cfdd7 Fixes 2025-04-08 20:45:32 +03:00
zx de6ef3936b small fix checknodefalgs 2025-03-23 20:36:07 +03:00
zx 8db2ee4260 confread diag 2025-03-23 20:21:50 +03:00
zx 25081b1bae . 2025-03-22 22:50:53 +03:00
zx deaa8140f5 Fix binkp overrides 2025-03-22 21:52:08 +03:00
zx 7fb8e32a9b Ver 0.26 changelog 2025-03-20 21:28:39 +03:00
zx 235a6a3072 Ver 0.26 2025-03-20 18:40:08 +03:00
zx 4da486264b Fix unprotected handshake options 2025-03-20 18:37:19 +03:00
zx 25cfb143dc fix typo 2025-03-20 12:32:11 +03:00
zx 4e86852c41 Debug for decryption in passwordless transfer 2025-03-20 12:28:07 +03:00
zx 324b11aad7 test fix for binkp sz and call entry 2025-03-19 21:17:28 +03:00
zx 7fd0d85557 Larger debug of binkp state 2025-03-19 18:56:32 +03:00
zx 0cb9a2b2cf Added Archlinux PKGBUILD 2025-03-18 23:53:39 +03:00
zx 9bc3a14dd0 Version 0.25.3 Fixes for daemon mode, flags, nodelist index 2024-07-05 11:13:12 +03:00
zx abb1153cf3 small fix 2024-07-05 09:16:24 +03:00
zx 3f9d10e467 Fixed nodelist index for root zone nodes, added support for IBN:port 2024-07-04 23:05:23 +03:00
zx 46312ebc1b Fixed flag creation, added flags inctic_flag incfile_flag 2024-07-03 22:42:20 +03:00
zx 5ef2b09861 Added systemd and xinetd service files 2024-07-02 23:28:00 +03:00
zx f72259cfe3 mFix aarch64 binkp FSM 2024-07-02 23:17:07 +03:00
zx 73a3376a3d Fixed outgoing proto detection and order - as Direct, BinkP, Ifcico, Telnet, Modem first allowed to connect. You may change this order individually by override flags 2024-07-02 21:51:58 +03:00
zx 983440fc29 Changed version up to 0.25.3 2024-07-01 00:11:18 +03:00
zx 5a7bac039a Changed daemon mode tcpip priority (to be first in outbound calls), fixed daemon_call creating opts record, fixed working time for tcp nodes 2024-07-01 00:10:20 +03:00
zx bba77edecd mFix ipv6 2024-06-25 23:42:52 +03:00
zx 9aed37b92e IPv6 fixes for incoming inetd calls, minors from lint 2024-06-25 23:05:07 +03:00
zx 3526bc5ece Minor debug improvement 2024-06-24 23:23:24 +03:00
zx a1c93b8016 Fixed binkp read deadlock #2 on some arches (aarch64) 2024-06-22 22:56:49 +03:00
zx e6266e8eab Fixed another annoying binkp errors on aarch64 2024-06-22 21:59:22 +03:00
zx 34daba8a0e Fixed binkp deadlock on some arches (aarch64) 2024-06-22 21:28:07 +03:00
zx ea4e8c806f Fixes for binkp on aarch64 platform 2024-06-22 21:18:01 +03:00
zx 51034e6e59 Version 0.25.2: IPv6 outgoing added 2024-06-21 23:01:58 +03:00
zx 6235b78239 IPv6 outgoing connections added - initially 2024-06-21 23:00:29 +03:00
zx b3f2e1bfc6 Added tests for PSTN protocols, minor fixes, version 0.25.1 2024-06-09 15:29:39 +03:00
zx 75aececd6b Added test script for PSTN protocols 2024-06-09 15:27:55 +03:00
zx 7ad43e1e40 Timezone fix (calculation one-liner) 2024-06-08 17:03:33 +03:00
zx 0663d62be8 minor fixes of warnings and misspellings 2024-06-07 23:08:49 +03:00
zx ccf473515d minor timezone fix +/- 2024-05-29 23:18:56 +03:00
zx de81a82f43 Version 0.25. EMSI-II compliant, TZUTC fixed, protocol order for outgoing 2024-05-28 20:49:18 +03:00
zx 6ebf2fc7a3 EMSI handshake FTSC-0088 compliant, protocol_order, EMSI TZUTC 2024-05-27 23:30:25 +03:00
zx 2c58629de4 Session answering fix 2024-05-22 20:55:49 +03:00
zx 721fa8fdf1 Update to 0.24.2 2024-05-20 23:52:02 +03:00
zx fdbeb83ab6 Fixed PSTN answer phone reset, version up 2024-05-20 21:39:50 +03:00
zx deafdc34c7 .gitignore added 2024-05-18 23:57:25 +03:00
zx 7879eb0cdc Env, binkp 64bit, syslog (openlog) fixes 2024-05-18 23:56:03 +03:00
116 changed files with 3278 additions and 1005 deletions
View File
+66
View File
@@ -0,0 +1,66 @@
name: Altlinux build
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀
on:
- push
- workflow_dispatch
if: ${{ github.ref }} == 'refs/head/master'
jobs:
build-alt:
## runs-on: alt-latest
container:
image: prj.zxalexis.ru/zx/alt-rpmbuild
branches:
- 'master'
steps:
- name: Checking environment
continue-on-error: true
run: printenv
- name: Installing prerequisites - update apt
run: apt-get update
## - name: Installing prerequisites - install nodejs for actions & git
## run: apt-get install -y git nodejs su
## - name: Installing build environment
## continue-on-error: true
## run: |
## apt-get install -y gcc rpm-build rpmlint make python gear hasher fakeroot patch rpmdevtools
- name: Installing needed software
run: apt-get install -y bison tcl
- name: Adding build user
run: useradd -d /builder -g users -m builder
- name: Fetching sources
uses: actions/checkout@v4
- name: Getting version info
run: |
echo "BFORCE_VER=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)" >> $GITHUB_ENV
- name: Compressing source to tar.gz archive
run: |
tar -cvzf ../bforce-${{ env.BFORCE_VER }}.tar.gz -C ${{ env.GITHUB_WORKSPACE }}/.. bforce
cp -v ${{ env.GITHUB_WORKSPACE }}/rpm/bforce.spec /builder/
chown builder /builder/bforce.spec
echo '-------------------------------------------------------'
pwd
ls /builder
sed -i 's/^# %setup/%setup/' /builder/bforce.spec
- name: Building buildtree
run: |
su - builder -c "cd /builder && mkdir -pv rpmbuild/{RPMS,SRPMS,SOURCES,BUILD,SPECS}"
ls /builder -l
mkdir -pv /builder/rpmbuild/SOURCES
mv ${{ env.GITHUB_WORKSPACE }}/../bforce-${{ env.BFORCE_VER }}.tar.gz /builder/rpmbuild/SOURCES/
chown -R builder /builder/*
- name: Building binary and source RPM
run: |
su - builder -c 'rpmbuild -bb /builder/bforce.spec --define "_topdir /builder/rpmbuild"'
- name: Constructing artifact name and version
run: |
echo "BFORCE_VERLONG=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
- name: Retrieving artifact files
run: mkdir bforce && cp /builder/rpmbuild/RPMS/x86_64/bforce-*.rpm bforce
- name: Try to upload artifacts bin
uses: actions/upload-artifact@v3
with:
name: bforce-${{ env.BFORCE_VERLONG }}-Alt
path: /builder/rpmbuild/RPMS/x86_64
- name: Echo OK
run: echo "All OK"
+79
View File
@@ -0,0 +1,79 @@
name: Archlinux build
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀
on:
- push
- workflow_dispatch
if: ${{ github.ref }} == 'refs/head/master'
jobs:
build-arch:
runs-on: arch-latest
branches:
- 'master'
steps:
- name: Checking environment
continue-on-error: true
run: printenv
- name: Installing prerequisites - update pacman
run: pacman -Sy
- name: Installing prerequisites - install nodejs for actions & git
run: pacman --disable-sandbox --noconfirm -v -S git nodejs
- name: Adding user builder
continue-on-error: true
run: useradd -d /builder -g users -m builder
- name: Downloading PKGBUILD
run: |
su - builder -c "curl -O http://zxprj:3001/zx/bforce/raw/branch/master/archlinux/bforce.install"
su - builder -c "curl -o PKGBUILD http://zxprj:3001/zx/bforce/raw/branch/master/archlinux/PKGBUILD.ci"
- name: Building archlinux package
run: |
su -w GITHUB_SHA,GITHUB_REF_NAME,GITHUB_REF_TYPE - builder -c makepkg
su - builder -c "ls -la"
- name: Constructing artifact name and version
run: |
echo "BFORCE_VER=$(cat /builder/src/bforce/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
- name: Retrieving artifact files
run: mkdir bforce && cp /builder/bforce-*.pkg.tar.zst bforce
- name: Try to upload artifacts
uses: actions/upload-artifact@v3
with:
name: bforce-${{ env.BFORCE_VER }}-Arch
path: bforce
make-test:
runs-on: arch-latest
branches:
- 'master'
steps:
- name: Checking environment
continue-on-error: true
run: printenv
- name: Installing prerequisites - update pacman
run: pacman -Sy
- name: Installing prerequisites - install nodejs for actions & git
run: pacman --disable-sandbox --noconfirm -v -S git nodejs socat
- name: Downloading source tree
continue-on-error: false
uses: actions/checkout@v3
- name: Constructing artifact name and version
run: |
echo "BFORCE_VER=$(cat ${{ github.workspace }}/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
- uses: actions/download-artifact@v3
with:
name: bforce-${{ env.BFORCE_VER }}-Arch
- name: Display structure of downloaded files
run: ls -R
- name: Installing archlinux package
run: |
ls -la
pacman --noconfirm -v -U bforce-*.pkg.tar.zst
cd ${{ github.workspace }}/tests
echo '-----------------------------------------'
ls -la
- name: Testing package in clean environment
run: |
cd ${{ github.workspace }}/tests
echo '------------>>> TESTING <<<--------------'
BFBIN=/usr/bin/bforce ./mktests.sh
+52
View File
@@ -0,0 +1,52 @@
name: Debian build
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀
on:
- push
- workflow_dispatch
jobs:
build-ubuntu:
runs-on: ubuntu-latest
branches:
- 'master'
- 'zx'
steps:
- name: Checking environment
continue-on-error: true
run: printenv
- name: Installing build-essentials
continue-on-error: false
run: |
apt update
apt install -y build-essential fakeroot devscripts debhelper pkg-config --no-install-recommends
- name: Installing dependencies
continue-on-error: false
run: |
echo '---- bison ----'
apt install -y bison
echo '---- tcl ------'
apt install -y tcl
- name: Cloning source
uses: actions/checkout@v4
- name: Getting version info
run: |
echo "BFORCE_VER=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
- name: Building package
continue-on-error: false
run: |
pwd
echo '---------------------'
cd ${GITHUB_WORKSPACE}/debian
ls -l
debuild -us -uc -b
echo '---build complete---'
ls -l ${{ env.GITHUB_WORKSPACE }}/../
- name: Collecting artifacts
run: |
mkdir -pv ${{ env.GITHUB_WORKSPACE }}/artifacts
mv -v ${{ env.GITHUB_WORKSPACE }}/../*.deb ${{ env.GITHUB_WORKSPACE }}/artifacts/
- name: Try to upload artifacts
uses: actions/upload-artifact@v3
with:
name: bforce-${{ env.BFORCE_VER }}-Ubuntu
path: ${{ env.GITHUB_WORKSPACE }}/artifacts/bforce*.deb
- run: echo "This job's over"
+9
View File
@@ -0,0 +1,9 @@
*.o
debian/Makefile
source/Makefile
source/bin/
source/bforce/expression.c
source/config.log
source/config.status
source/include/config.h
bforce.geany
+54 -2
View File
@@ -228,9 +228,61 @@ Alexey Khromov (zx@zxalexis.ru)
+ Added pre-init debugging (primarily of config readout) to stderr by -v + Added pre-init debugging (primarily of config readout) to stderr by -v
option. Vanished out errorful calls to "log" and "debug" before log and option. Vanished out errorful calls to "log" and "debug" before log and
debug files initialization. debug files initialization.
+ As of bison is default yacc for (almost) every foss system - fix
warning of yacc compliance (delete -y flag in Makefile.in)
+ Fixed build on 64-bit systems (amd64 and aarch64) + Fixed build on 64-bit systems (amd64 and aarch64)
+ Initially added config options incpkt_flag and incbdl_flag to raise + Initially added config options incpkt_flag and incbdl_flag to raise
up flag-driven tosser manipulation up flag-driven tosser manipulation
0.24.2
+ Fixed environment variables while executing external programs
on handshake or session end
+ Fixed flags working on arcmail/netmail recieve
0.25
+ EMSI handshake logic reworked to comply with EMSI-II std (FTSC-0088)
+ New option: proto_order - dezired protocol order for outgoing calls
in EMSI session handshake
EMSI-II-compliance works as follows:
* if both (caller and callee) expose EII flag - selected proto
will be first in caller compat.options compatible with callee
* if caller is EMSI-I-compliant and does not show EII flad -
selection by callee internal order from compatible with caller
+ Changed ifcico protocol port hardcoded to num and not name from
/etc/services line (as of abscence of latter)
+ Config example reworked to include new options
+ New option: emsi_send_tz - to send TZUTC EMSI-handshake part.
0.25.1
+ Added testing script for PSTN comms (tests folder).
0.25.2
+ Adopted for outgoing IPv6 communication
0.25.3
+ Fixed IPv6 address logging in inetd connections
+ Fixed outgoing proto detection and order - as Direct, BinkP, Ifcico,
Telnet, Modem first allowed to connect. You may change this order
individually by override flags.
+ Daemon mode now tries to make outgoing tcp calls prior to modem
+ Daemon mode - fixed working time for tcp nodes (CM)
+ Fixed some x64 errors in comparisons to integers
+ Added systemd and xinetd service files to contrib folder
+ Fixed flag files creation
+ Added flags for TIC files (inctic_flag) and files (incfile_flag)
+ Fixed nodelist index creation
+ Added support for TCP port description in IBN/IFC/ITN flags
0.26
+ Fixed incorrect binkp protocol realization in unprotected sessions.
+ Fixed binkp override appliance in incoming handshake
0.26.1
+ Fixed binkp stuck on overrides in config
+ ReDebianized
+ Added CI automation: builds for Archlinux and Ubuntu
0.26.2
+ Added tests with socat and integrate it with CI
+ Fixed some minor lint errors by PVS-Studio
+ Fixed RPM spec-file to make builds for AltLinux
+ Added fail2ban filter to contrib
+ Fixed node/point-lists indexing and parsing for points listed
+33 -2
View File
@@ -1,4 +1,35 @@
Basic Installation Prerequisites
====================
C compiler (GCC in linux and clang in BSD will work well)
make
yacc or it's GNU's recreation named bison
Tcl optional for a couple of scripts
Installing with packages
=
Debian-based systesms (Debian, *buntu, Mint, Astra)
====================
Install build system for packaging:
apt install build-essential fakeroot devscripts debhelper pkg-config
apt install bison tcl
Use debuild to make deb-s:
cd <SRCDIR>/debian
debuild -us -uc -b
RPM-based systems (RHEL, CentOS, Altlinux, SimplyLinux, RedOS)
=====================
mkdir -p ./rpmbuild/{RPMS,BUILD}
rpmbuild -bb <SRCDIR>/rpm/bforce.spec --define "_topdir $( pwd )/rpmbuild" --define "_builddir <SRCDIR>/source"
Manual Installation
================== ==================
These are generic installation instructions. These are generic installation instructions.
@@ -46,7 +77,7 @@ The simplest way to compile this package is:
Compilers and Options Compilers and Options
===================== =====================
Some systems require unusual options for compilation or linking that Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure' the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using initial values for variables by setting them in the environment. Using
+74 -34
View File
@@ -1,37 +1,58 @@
В этом файле описывается процесс установки и настройки В этом файле описывается процесс установки и настройки
фидонет-совместимого мейлера bforce 0.22.8.ugenk1. фидонет-совместимого мейлера bforce 0.xx.
В данном документе приняты следующие обозначения: В данном документе приняты следующие обозначения:
<SRCDIR> - путь, куда вы распаковали тарболл с исходными <SRCDIR> - путь, куда вы распаковали тарболл с исходными текстами
текстами bforce 0.22.8.ugenk1 (далее bforce) bforce 0.xx (далее bforce)
Тарболл - файл с расширением tar.gz, или tar.bz2 Тарболл - файл с расширением tar.gz, или tar.bz2
Требования к системе Требования к системе
==================== ====================
Для компиляции bforce вам потребуется компилятор (для Для компиляции bforce вам потребуется компилятор с языка С,
gnu/bsd-систем gcc), так же GNU make (make для линукс, так же GNU make (make для линукс, gmake для bsd) и yacc (в linux -
gmake для bsd). bison). Опционально - tcl
Обратитесь к документации по вашей системе того, что бы Создание пакета
узнать как установить вышеперечисленное программное обеспечение. =
Debian-based системы (Debian, *buntu, Mint, Astra)
====================
Установка программ и набора скриптов для сборки пакетов:
apt install build-essential fakeroot devscripts debhelper pkg-config
apt install bison tcl
Для создания пакета из скачанных исходников достаточно воспользоваться
командой debuild:
cd <SRCDIR>/debian
debuild -us -uc -b
RPM-based системы (RHEL, CentOS, Altlinux, SimplyLinux, RedOS)
=====================
mkdir -p ./rpmbuild/{RPMS,BUILD}
rpmbuild -bb <SRCDIR>/rpm/bforce.spec --define "_topdir $( pwd )/rpmbuild" --define "_builddir <SRCDIR>/source"
Установка вручную
=
Процесс компиляции Процесс компиляции
================== ==================
Распакуйте тарболл следующими командами: Распакуйте тарболл следующими командами:
gzip -d bforce-0.22.8.ugenk1.tar.gz gzip -d bforce-master.tar.gz
или или
bzip2 -d bforce-0.22.8.ugenk1.tar.bz2 bzip2 -d bforce-master.tar.bz2
tar -xvf bforce-0.22.8.ugenk1.tar tar -xvf bforce-master.tar
Перейдите в директорию bforce-0.22.8.ugenk1/source: Перейдите в директорию bforce/source:
cd <SRCDIR>/bforce-0.22.8.ugenk1/source cd <SRCDIR>/bforce/source
Для создания Makefile, который наиболее подходит к вашей Для создания Makefile, который наиболее подходит к вашей
системе, наберите: системе, наберите:
@@ -76,6 +97,11 @@ gmake install
Настройка Настройка
========= =========
Рекомендуется установить системную переменную BFCONFIG,
указывающую на местоположение конфигурации bforce.
Проще всего через /etc/environment для общесистемной или
.profile для переменной пользователя.
Для нормальной работы вам нужно отредактировать конфигурационные файлы Для нормальной работы вам нужно отредактировать конфигурационные файлы
bforce. По умолчанию они находятся в /usr/local/fido/etc и называются bforce. По умолчанию они находятся в /usr/local/fido/etc и называются
bforce.conf - основной конфигурационный файл bforce bforce.conf - основной конфигурационный файл bforce
@@ -125,6 +151,19 @@ cat `which mgetty` |strings |grep FIDO |wc -l
где news - это пользователь, из-под которого у вас работает ftn-подсистема. где news - это пользователь, из-под которого у вас работает ftn-подсистема.
Bforce при ИСХОДЯЩИХ звонках использует файлы блокировки порта модема,
при несовпадении каталога или невозможности создания файла
mgetty сбросит модем во время звонка.
Поэтому настоятельно рекомендуется проверить права на папку /var/lock
и то, на какой ФС она расположенв.
Современные системы имеют тенденцию к применению /var/lock как ссылки
на /run/lock, а ФС /run монтируется и создается на tmpfs при каждой
загрузке с помощью systemd-tempfiles.
Для изменения поведения необходимо создать файл в /etc/tempfiles.d/,
совпадающим (за исключением части имени -part) c именем файла в
/usr/lib/systemd/systemd-tempfiles.d.
Рабочий пример legacy-part.conf в папке contrib.
Совместная работа с inetd/xinetd Совместная работа с inetd/xinetd
================================ ================================
К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие
@@ -142,28 +181,29 @@ ifc 60179/tcp # fidonet EMSI over TCP
====================== ======================
Дополнительные утилиты для bforce находятся в <SRCDIR>/contrib: Дополнительные утилиты для bforce находятся в <SRCDIR>/contrib:
bflan - bforce log analyzer bflan - bforce log analyzer
callout.sh - скрипт для отзвонки на аплинков callout.sh - скрипт для отзвонки на аплинков
outman - скрипт outman outman - скрипт outman
timesync.tcl - скрипт для синхорнизации времени с узлами ftn. timesync.tcl - скрипт для синхорнизации времени с узлами ftn.
init.d/bforce - init-скрипт для RedHat init.d/bforce - init-скрипт для RedHat
bfha - bforce history analyzer (bfha) bfha - bforce history analyzer (bfha)
bfha/README - bfha README bfha/README - bfha README
bfha/bfha.pl - собственно, bfha bfha/bfha.pl - собственно, bfha
u-srif - продвинутый freq-процессор legacy-part.conf - файл для донастройки прав на /run/lock в systemd
u-srif - продвинутый freq-процессор
u-srif/u-srif-index.py \ с поддержой отчетов, u-srif/u-srif-index.py \ с поддержой отчетов,
u-srif/u-srif-lookup.py \ ограничений, u-srif/u-srif-lookup.py \ ограничений,
u-srif/u-srif.py \ индексации файловой базы, u-srif/u-srif.py \ индексации файловой базы,
u-srif/conf \ что значительно ускоряет u-srif/conf \ что значительно ускоряет
u-srif/conf/report.footer \ работу. u-srif/conf/report.footer \ работу.
u-srif/conf/report.header \ Написан на python. u-srif/conf/report.header \ Написан на python.
u-srif/conf/u-srif.aliases \ -------------------- u-srif/conf/u-srif.aliases \ --------------------
u-srif/conf/u-srif.conf \ ------------------- u-srif/conf/u-srif.conf \ -------------------
u-srif/conf/u-srif.dirs \ ------------------ u-srif/conf/u-srif.dirs \ ------------------
u-srif/lib / ------------------ u-srif/lib / ------------------
u-srif/lib/uconfig.py / ------------------- u-srif/lib/uconfig.py / -------------------
u-srif/lib/udbase.py / -------------------- u-srif/lib/udbase.py / --------------------
u-srif/lib/ufido.py / --------------------- u-srif/lib/ufido.py / ---------------------
u-srif/lib/unodestat.py / ---------------------- u-srif/lib/unodestat.py / ----------------------
u-srif/lib/utmpl.py / ----------------------- u-srif/lib/utmpl.py / -----------------------
u-srif/lib/uutil.py / ------------------------ u-srif/lib/uutil.py / ------------------------
+29 -4
View File
@@ -1,10 +1,30 @@
![master branch](https://prj.zxalexis.ru/gitea/zx/bforce/actions/workflows/debpkg.yaml/badge.svg?branch=master)
![master branch](https://prj.zxalexis.ru/gitea/zx/bforce/actions/workflows/arch.yaml/badge.svg?branch=master)
![master branch](https://prj.zxalexis.ru/gitea/zx/bforce/actions/workflows/alt.yaml/badge.svg?branch=master)
BinkleyForce FTN mailer BinkleyForce FTN mailer
----------------------- -----------------------
BinkleyForce is a simple ifcico like FTN mailer. It can works via BinkleyForce is a simple ifcico like FTN mailer. It can work via
TCP/IP as well as on modem links. Look sample configs for more TCP/IP as well as on modem links. Look sample configs for more
information. information.
Supported Features
------------------
- PSTN dial-out with EMSI-II/EMSI/YooHoo handshake
- PSTN protocols: Hydra, ZedZap, ZModem
- PSTN dial-in through mgetty
- TCP/IP dial-out through IPv4 and IPv6 networks
- TCP/IP protocols - ifcico / BinkP 1.1
- TCP/IP dial-in through xinetd/inetd
- Daemon mode for outbound queue managing
Linux 2.4.11+, FreeBSD (6+ AFAIR) compatible.
Licence
-------
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
@@ -12,8 +32,9 @@ any later version. See the COPYING file for further information.
Known Bugs Known Bugs
---------- ----------
- BinkD use and expect local file time at BinkP sessions, but - BinkleyForce has no support (yet) for multiple INA: addresses
BinkleyForce always use UTC time (?) - Can not rotate hidden lines
- Can not rotate supported IP protocols in case of failure
Bug Reports Bug Reports
----------- -----------
@@ -26,6 +47,10 @@ New Versions
https://prj.zxalexis.ru/gitea/zx/bforce https://prj.zxalexis.ru/gitea/zx/bforce
SAST Tools
----------
[PVS-Studio](https://pvs-studio.com/pvs-studio/?utm_source=website&utm_medium=github&utm_campaign=open_source) - static analyzer for C, C++, C#, and Java code.
Older Sources Older Sources
------------- -------------
https://github.com/zotrix/binkleyforce/ https://github.com/zotrix/binkleyforce/
@@ -39,4 +64,4 @@ Copyright <br>
> (c) 2007-2008 Sergey Babitch<br> > (c) 2007-2008 Sergey Babitch<br>
> (c) 2011-2014 Sergey Dorofeev<br> > (c) 2011-2014 Sergey Dorofeev<br>
> (c) 2014 Alexander Skovpen<br> > (c) 2014 Alexander Skovpen<br>
> (c) 2024 Alexey Khromov<br> > (c) 2024-2025 Alexey Khromov<br>
+59
View File
@@ -0,0 +1,59 @@
pkgname=bforce
pkgver=r235.a1c93b8
pkgrel=1
pkgdesc="binkleyforce FTN mailer"
arch=('i686' 'x86_64' 'aarch64')
url="https://prj.zxalexis.ru/gitea/zx/bforce/"
license=('GPL2')
source=(
"${pkgname}::git+https://prj.zxalexis.ru/gitea/zx/bforce.git"
)
makedepends=('git' 'gcc' 'make' 'glibc')
provides=('bforce')
build() {
cd "${srcdir}/${pkgname}/source"
./configure --prefix=/ --disable-syslog --with-owner=fido --with-group=uucp
make
}
prepare() {
cd "${pkgname}"
printf "$( pwd )\n"
}
pkgver() {
cd "$pkgname"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
package() {
cd ${pkgdir}
mkdir -p ${pkgdir}/etc
mkdir -p ${pkgdir}/usr/bin
mkdir -p ${pkgdir}/usr/local/bin
mkdir -p ${pkgdir}/usr/share/doc/bforce
mkdir -p ${pkgdir}/usr/share/man/man1
mkdir -p ${pkgdir}/var/log/bforce
mkdir -p ${pkgdir}/var/spool/bforce
mkdir -p ${pkgdir}/var/spool/bforce/bt/in
mkdir -p ${pkgdir}/var/spool/bforce/bt/pin
mkdir -p ${pkgdir}/var/spool/bforce/bt/out
mkdir -p ${pkgdir}/var/spool/bforce/ndl
mkdir -p ${pkgdir}/var/spool/bforce/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bforce ${pkgdir}/usr/bin/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfindex ${pkgdir}/usr/bin/bfindex
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfstat ${pkgdir}/usr/bin/bfstat
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/nlookup ${pkgdir}/usr/bin/nlookup
/usr/bin/install -c ${srcdir}/${pkgname}/man/*.1 ${pkgdir}/usr/share/man/man1/
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.conf ${pkgdir}/etc/bforce.conf.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.subst ${pkgdir}/etc/bforce.subst.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.passwd ${pkgdir}/etc/bforce.passwd.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.aliases ${pkgdir}/etc/freq.aliases.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.dirs ${pkgdir}/etc/freq.dirs.sample
/usr/bin/install -c ${srcdir}/${pkgname}/contrib/outman ${pkgdir}/usr/local/bin/outman
echo "Please, edit /usr/local/bin/outman"
cp ${srcdir}/${pkgname}/docs/* ${pkgdir}/usr/share/doc/bforce/
}
sha256sums=('SKIP')
+64
View File
@@ -0,0 +1,64 @@
pkgname=bforce
pkgver=r235.a1c93b8
pkgrel=1
pkgdesc="binkleyforce FTN mailer"
arch=('i686' 'x86_64' 'aarch64')
url="https://prj.zxalexis.ru/gitea/zx/bforce/"
license=('GPL2')
source=(
"${pkgname}::git+https://prj.zxalexis.ru/gitea/zx/bforce.git"
)
makedepends=('git' 'gcc' 'make' 'glibc')
provides=('bforce')
build() {
cd "${srcdir}/${pkgname}/source"
./configure --prefix=/ --disable-syslog --with-owner=fido --with-group=uucp
make
}
prepare() {
cd "${pkgname}"
git checkout "${GITHUB_SHA}"
printf "$( pwd )\n"
}
pkgver() {
cd "$pkgname"
if [ "${GITHUB_REF_TYPE}" = "tags" ]; then
printf "v%s" "${GITHUB_REF_NAME}"
else
printf "r%s.%s.%s" "$(git rev-list --count ${GITHUB_SHA})" "$(git rev-parse --short ${GITHUB_SHA})" "${GITHUB_REF_NAME}"
fi
}
package() {
cd ${pkgdir}
mkdir -p ${pkgdir}/etc
mkdir -p ${pkgdir}/usr/bin
mkdir -p ${pkgdir}/usr/local/bin
mkdir -p ${pkgdir}/usr/share/doc/bforce
mkdir -p ${pkgdir}/usr/share/man/man1
mkdir -p ${pkgdir}/var/log/bforce
mkdir -p ${pkgdir}/var/spool/bforce
mkdir -p ${pkgdir}/var/spool/bforce/bt/in
mkdir -p ${pkgdir}/var/spool/bforce/bt/pin
mkdir -p ${pkgdir}/var/spool/bforce/bt/out
mkdir -p ${pkgdir}/var/spool/bforce/ndl
mkdir -p ${pkgdir}/var/spool/bforce/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bforce ${pkgdir}/usr/bin/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfindex ${pkgdir}/usr/bin/bfindex
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfstat ${pkgdir}/usr/bin/bfstat
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/nlookup ${pkgdir}/usr/bin/nlookup
/usr/bin/install -c ${srcdir}/${pkgname}/man/*.1 ${pkgdir}/usr/share/man/man1/
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.conf ${pkgdir}/etc/bforce.conf.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.subst ${pkgdir}/etc/bforce.subst.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.passwd ${pkgdir}/etc/bforce.passwd.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.aliases ${pkgdir}/etc/freq.aliases.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.dirs ${pkgdir}/etc/freq.dirs.sample
/usr/bin/install -c ${srcdir}/${pkgname}/contrib/outman ${pkgdir}/usr/local/bin/outman
echo "Please, edit /usr/local/bin/outman"
cp ${srcdir}/${pkgname}/docs/* ${pkgdir}/usr/share/doc/bforce/
}
sha256sums=('SKIP')
+7
View File
@@ -0,0 +1,7 @@
post_install() {
chmod
}
post_upgrade() {
post_install
}
+25
View File
@@ -0,0 +1,25 @@
# Fail2Ban filter for bforce bf-log.tcpip log file
# Detecting unauthorized access
# Typically logged in /var/log/bforce/bf-debug
# Apr 10 17:34:20 [944134] TCP/IP connect from 72.138.46.4 on port 5590
# Apr 10 17:34:21 [944134] Session ended up, rc=21, inetd=1
# Apr 10 17:34:21 [944134] session rc = 21 ("Cannot handshake with remote")
# Apr 10 17:34:21 [944135] Answering TCPIP call...
# Apr 10 17:34:21 [944135] TCP/IP connect from 72.138.46.4 on port 7714
# Apr 10 17:34:21 [944135] Session ended up, rc=21, inetd=1
# Apr 10 17:34:21 [944135] session rc = 21 ("Cannot handshake with remote")
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
[Init]
maxlines = 5
[Definition]
prefregex = \[<F-MLFID>\d+</F-MLFID>\] TCP/IP connect from <HOST> on port \d+$
failregex = session rc \= 21
ignoreregex =
+8
View File
@@ -0,0 +1,8 @@
[bforce]
enabled = true
port = 24554,60179
filter = bforce
logpath = /opt/fidonms/logs/bf-log.tcpip
maxretry = 5
findtime = 60
bantime = 600
+19
View File
@@ -0,0 +1,19 @@
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# These files are considered legacy and are unnecessary on legacy-free
# systems.
z /run/lock 0777 root lock -
z /var/lock 0777 root lock - ../run/lock
# /run/lock/subsys is used for serializing SysV service execution, and
# hence without use on SysV-less systems.
z /run/lock/subsys 0775 root lock -
+92
View File
@@ -0,0 +1,92 @@
#!/bin/sh
# Directories and static values
DEFZONE=2
# Default outbound
# OUTBOUND="."
# Our AKA
# AKA="2:5030/723@fidonet"
# FLO Extension
FLOEXT="dlo"
# BFCONFIG=/opt/fidonms/etc/bforce.conf
if [ "${BFCONFIG}" == "" ]; then
BFCONF="/etc/bforce/bforce.conf"
else
BFCONF=${BFCONFIG}
fi
if [ "$1" == "" ]; then
echo "No FTN provided. Usage: mkpoll <address>"
exit 1
fi
# Address to create poll
FTNA=$1
# Outbound address
OUTB=""
if [ -f "${BFCONF}" ]; then
# We have config!
OUTB=$(grep -E "^outbound_directory" ${BFCONF} | awk '{print $2}')
else
OUTB=${OUTBOUND}
fi
#echo "FTNA: ${FTNA} OUTB: ${OUTB}"
FZONE=$(echo -n ${FTNA}| awk -F':' '{print $1}')
FNET=$(echo -n ${FTNA} | awk -F':' '{print $2}' | awk -F'/' '{ print $1 }')
FNODE=$(echo -n ${FTNA}| awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $1 }')
FPNT=$(echo -n ${FTNA} | awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $2 }')
FDOM=$(echo -n ${FTNA} | awk -F'@' '{print $2}')
# echo "Dest ZONE: ${FZONE}, NET: ${FNET}, NODE: ${FNODE}, PNT: ${FPNT} DOM: ${FDOM}"
# Our AKA
FAKA=""
if [ -f "${BFCONF}" ]; then
# We have config!
FAKA=$(grep -E "^address" ${BFCONF} | awk '{print $2}')
else
FAKA=${AKA}
fi
AZONE=$(echo -n ${FAKA}| awk -F':' '{print $1}')
ANET=$(echo -n ${FAKA} | awk -F':' '{print $2}' | awk -F'/' '{ print $1 }')
ANODE=$(echo -n ${FAKA}| awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $1 }')
APNT=$(echo -n ${FAKA} | awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $2 }')
ADOM=$(echo -n ${FAKA} | awk -F'@' '{print $2}')
# echo "Our ZONE: ${AZONE}, NET: ${ANET}, NODE: ${ANODE}, PNT: ${APNT} DOM: ${ADOM}"
FTNB=$( printf "%04x%04x" ${FNET} ${FNODE} )
if [ "${FPNT}" == "" ]; then
FPNT="0"
fi
FFLO=""
if [ "${AZONE}" == "${FZONE}" ] && [ "${FNET}" == "${ANET}" ] && [ "${FNODE}" == "${ANODE}" ] && [ ! "${FPNT}" == "0" ]; then
# echo "Point operations!"
FLOFIL=$( printf "%08x.${FLOEXT}" ${FPNT} )
PNTDIR=$( echo -n "${OUTB}/${FTNB}.pnt")
FFLO=$( echo -n "${PNTDIR}/${FLOFIL}" )
elif [ ! "${DEFZONE}" == "${FZONE}" ]; then
# Interzonal poll
FLOFIL=$( echo -n "${FTNB}.${FLOEXT}" )
FDIR=$( printf "%03x" ${FZONE} )
FFLO=$( echo -n "${OUTB}.${FDIR}/${FLOFIL}" )
else
# Normal in-zone poll
FLOFIL=$( echo -n "${FTNB}.${FLOEXT}" )
FFLO=$( echo -n "${OUTB}/${FLOFIL}" )
fi
# echo "FloFile: ${FFLO}"
if [ ! -f "${FFLO}" ]; then
touch "${FFLO}"
fi
+13
View File
@@ -0,0 +1,13 @@
[Unit]
Description=Binkleyforce Outbound server
[Service]
Type=forking
PIDFile=/tmp/bforce.pid
User=fido
Group=fido
ExecStart=/usr/bin/bforce -d -C /etc/bforce/bforce.conf
ExecStop=/usr/bin/bforce -q
[Install]
WantedBy=multi-user.target
+13
View File
@@ -0,0 +1,13 @@
#binkleyforce ifc (port 60179) EMSI-over-ip
service binkp
{
disable = no
socket_type = stream
# flags = IPv4
protocol = tcp
port = 24554
wait = no
user = fido
server = /usr/bin/bforce
server_args = -C /etc/bforce/bforce.conf -i binkp
}
+13
View File
@@ -0,0 +1,13 @@
#binkleyforce ifc (port 60179) EMSI-over-ip
service ifc
{
disable = no
socket_type = stream
# flags = IPv4
protocol = tcp
port = 60179
wait = no
user = fido
server = /usr/bin/bforce
server_args = -C /etc/bforce/bforce.conf -i auto
}
-263
View File
@@ -1,263 +0,0 @@
# Makefile.in generated by automake 1.8.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = ../debian
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES)
mkinstalldirs = $(mkdir_p)
CONFIG_HEADER = $(top_builddir)/include/config.h
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
CC = @CC@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
DEFS = @DEFS@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
GROUP = @GROUP@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LTLIBOBJS = @LTLIBOBJS@
OBJEXT = @OBJEXT@
OWNER = @OWNER@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
SHELL = @SHELL@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
# $Id$
EXTRA_DIST = copyright changelog rules conffiles \
control dirs init.d
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ../debian/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu ../debian/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
uninstall-info-am:
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am:
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: all all-am check check-am clean clean-generic distclean \
distclean-generic distdir dvi dvi-am html html-am info info-am \
install install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am install-man \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-generic mostlyclean \
mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
-6
View File
@@ -1,6 +0,0 @@
bforce for Debian
-----------------
See CHANGES.ugenk
-- Evgeniy Kozhuhovskiy <e.kozhuhovskiy@gmail.com>, Thu Feb 10 23:54:48 2005
+19
View File
@@ -1,3 +1,22 @@
bforce (0.26.2) UNRELEASED; urgency=medium
* Added tests to CI actions
* Fixed nodelist indexing for points handling
-- Alexey Khromov <zx@zxalexis.ru> Sat, 19 Apr 2025 07:43:54 +0300
bforce (0.26.1) UNRELEASED; urgency=medium
* Fixed for ubuntu/debian builds and CI actions
-- Alexey Khromov <zx@zxalexis.ru> Sun, 13 Apr 2025 20:06:54 +0300
bforce (0.26) UNRELEASED; urgency=medium
* Fixed for IPv6 and build on amd64 and aarch64 platforms
-- Alexey Khromov <zx@zxalexis.ru> Sun, 13 Apr 2025 12:53:54 +0000
bforce (0.22.9-3) unstable; urgency=low bforce (0.22.9-3) unstable; urgency=low
* fixes in init.d script * fixes in init.d script
+1 -1
View File
@@ -1 +1 @@
4 3
-6
View File
@@ -1,6 +0,0 @@
/etc/bforce/bforce.conf
/etc/bforce/bforce.subst
/etc/bforce/bforce.passwd
/etc/bforce/freq.dirs
/etc/bforce/freq.aliases
+2 -2
View File
@@ -1,13 +1,13 @@
Source: bforce Source: bforce
Section: net Section: net
Priority: optional Priority: optional
Maintainer: Evgeniy Kozhuhovskiy <e.kozhuhovskiy@gmail.com> Maintainer: Alexey Khromov <zx@zxalexis.ru>
Build-Depends: debhelper (>> 3.0.0), bison (>> 1.0.0) Build-Depends: debhelper (>> 3.0.0), bison (>> 1.0.0)
Standards-Version: 3.5.10 Standards-Version: 3.5.10
Package: bforce Package: bforce
Architecture: any Architecture: any
Depends: ${shlibs:Depends} Depends: ${shlibs:Depends}, tclsh:any
Description: Binkey Force FTN mailer Description: Binkey Force FTN mailer
FTN mailer is a program that transmit files (netmail and echomail) FTN mailer is a program that transmit files (netmail and echomail)
between your FTN node and other. between your FTN node and other.
Vendored
+1
View File
@@ -1,5 +1,6 @@
usr/bin usr/bin
usr/lib/bforce usr/lib/bforce
usr/lib/systemd/system
etc/bforce etc/bforce
etc/default etc/default
etc/default/bforce etc/default/bforce
Vendored
+3 -7
View File
@@ -1,9 +1,5 @@
README README.md
README.kst
README.ugenk
TODO TODO
CHANGES
CHANGES.kst
CHANGES.ugenk
INSTALL INSTALL
INSTALL.ru INSTALL.ru
SYSLOG
+9 -9
View File
@@ -26,15 +26,15 @@ set -e
case "$1" in case "$1" in
configure) configure)
if ! grep -s news /etc/group >/dev/null 2>&1; then # if ! grep -s news /etc/group >/dev/null 2>&1; then
addgroup --system news # addgroup --system news
fi # fi
#
if ! id uucp >/dev/null 2>&1; then # if ! id uucp >/dev/null 2>&1; then
adduser --system --disabled-password uucp # adduser --system --disabled-password uucp
chsh -s /bin/sh uucp # chsh -s /bin/sh uucp
adduser uucp dialout # adduser uucp dialout
fi # fi
;; ;;
abort-upgrade|abort-remove|abort-deconfigure) abort-upgrade|abort-remove|abort-deconfigure)
+6 -7
View File
@@ -6,8 +6,7 @@
#export DH_VERBOSE=1 #export DH_VERBOSE=1
# This is the debhelper compatibility version to use. # This is the debhelper compatibility version to use.
export DH_COMPAT=3 export DH_COMPAT=11
PACKAGE = bforce PACKAGE = bforce
@@ -49,7 +48,7 @@ clean:
rm -f build-stamp configure-stamp rm -f build-stamp configure-stamp
# Add here commands to clean up after the build process. # Add here commands to clean up after the build process.
-$(MAKE) -C source clean # -$(MAKE) -C source clean
dh_clean dh_clean
rm -f source/config.cache source/include/config.h source/config.log\ rm -f source/config.cache source/include/config.h source/config.log\
source/config.status source/Makefile source/config.status source/Makefile
@@ -57,7 +56,7 @@ clean:
install: build install: build
dh_testdir dh_testdir
dh_testroot dh_testroot
dh_clean -k dh_prep
dh_installdirs dh_installdirs
# Add here commands to install the package into debian/bforce. # Add here commands to install the package into debian/bforce.
@@ -74,7 +73,7 @@ install: build
/usr/bin/install -c -m 600 -o $(USER) -g $(GROUP) examples/bforce.passwd $(CURDIR)/debian/bforce/etc/bforce/bforce.passwd /usr/bin/install -c -m 600 -o $(USER) -g $(GROUP) examples/bforce.passwd $(CURDIR)/debian/bforce/etc/bforce/bforce.passwd
/usr/bin/install -c -m 644 -o $(USER) -g $(GROUP) examples/freq.aliases $(CURDIR)/debian/bforce/etc/bforce/freq.aliases /usr/bin/install -c -m 644 -o $(USER) -g $(GROUP) examples/freq.aliases $(CURDIR)/debian/bforce/etc/bforce/freq.aliases
/usr/bin/install -c -m 644 -o $(USER) -g $(GROUP) examples/freq.dirs $(CURDIR)/debian/bforce/etc/bforce/freq.dirs /usr/bin/install -c -m 644 -o $(USER) -g $(GROUP) examples/freq.dirs $(CURDIR)/debian/bforce/etc/bforce/freq.dirs
/usr/bin/install -c -m 660 contrib/systemd/bforce.service $(CURDIR)/debian/bforce/usr/lib/systemd/system/bforce.service
/usr/bin/install $(CURDIR)/debian/bfha.def $(CURDIR)/debian/bforce/etc/default/bforce/bfha /usr/bin/install $(CURDIR)/debian/bfha.def $(CURDIR)/debian/bforce/etc/default/bforce/bfha
/usr/bin/install $(CURDIR)/contrib/bfha/bfha-debian.pl $(CURDIR)/debian/bforce/usr/lib/bforce/bfha.pl /usr/bin/install $(CURDIR)/contrib/bfha/bfha-debian.pl $(CURDIR)/debian/bforce/usr/lib/bforce/bfha.pl
@@ -92,8 +91,8 @@ binary-arch: build install
# dh_installlogrotate # dh_installlogrotate
dh_installinit dh_installinit
# dh_installcron # dh_installcron
dh_installman $(CURDIR)/debian/bfindex.1 $(CURDIR)/debian/bforce.1 \ dh_installman $(CURDIR)/man/bfindex.1 $(CURDIR)/man/bforce.1 \
$(CURDIR)/debian/bfstat.1 $(CURDIR)/debian/nlookup.1 $(CURDIR)/man/bfstat.1 $(CURDIR)/man/nlookup.1 $(CURDIR)/man/outman.1
# dh_installinfo # dh_installinfo
dh_installchangelogs CHANGES dh_installchangelogs CHANGES
dh_link dh_link
+37 -2
View File
@@ -63,6 +63,12 @@ address 20:26/100.0@easynet
# #
options NoDirZap NoJanus NoChat options NoDirZap NoJanus NoChat
# Protocol order for outgoing EMSI calls
# Tolerant to Options (i.e. you can order all kind of protos
# as of TZA,KER,JAN and SLK are not supported at all
# Default: HYD,JAN,DZA,ZAP,ZMO,TZA,SLK,KER
proto_order HYD,ZMO,ZAP,DZA,JAN,TZA,KER,SLK
# #
# Domain outbounds # Domain outbounds
# Domain <domain_name> <outbound_dir> <zone> # Domain <domain_name> <outbound_dir> <zone>
@@ -97,6 +103,11 @@ nodial_flag /etc/nodial
#incnet_flag /var/spool/fido/flags/mail #incnet_flag /var/spool/fido/flags/mail
# Arcmail: # Arcmail:
#incarc_flag /var/spool/fido/flags/echo #incarc_flag /var/spool/fido/flags/echo
# FileEcho TIC
#inctic_flag /var/spool/fido/flags/tick
# Regular file recieve
#incfile_flag /var/spool/fido/flags/alert
# #
# Inbound directories # Inbound directories
@@ -109,13 +120,13 @@ split_inbound yes
# #
# Path to your 4D outbound (use zone as extension) # Path to your 4D outbound (use zone as extension)
# #
#outbound_directory /var/spool/fido/bt/out outbound_directory /var/spool/fido/bt/out
# #
# Path to your AmigaDos style 4D outbound. # Path to your AmigaDos style 4D outbound.
# (You can use all outbound styles at the same time) # (You can use all outbound styles at the same time)
# #
amiga_outbound_directory /var/spool/fido/bt/out #amiga_outbound_directory /var/spool/fido/bt/out
# #
# Directory with your nodelists (for nodelist without full path) # Directory with your nodelists (for nodelist without full path)
@@ -253,6 +264,10 @@ mode_request 100660
# '~' 1 second delay # '~' 1 second delay
# '`' 1/4 second delay # '`' 1/4 second delay
# Modem lock directory (/var/lock as in FHS-3.0
# if you have it on tmpfs by systemd - read INSTALL.ru)
# uucp_lock_directory /var/lock
# #
# Yor modem devices names (will use first not locked one) # Yor modem devices names (will use first not locked one)
# ModemDev <device>[<:lock_speed>] # ModemDev <device>[<:lock_speed>]
@@ -342,6 +357,9 @@ max_speed 57600
flags XW,V34B,IDC,LMD flags XW,V34B,IDC,LMD
emsi_OH_time 22:00-07:30 emsi_OH_time 22:00-07:30
emsi_FR_time 22:30-05:30 emsi_FR_time 22:30-05:30
#emsi_send_tz no
#emsi_send_time no
# #
# Our receiver buffer size [bytes] # Our receiver buffer size [bytes]
@@ -442,6 +460,23 @@ skip_files_recv *.pif *.swp
# setsid - run command in a new session # setsid - run command in a new session
# useshell - run command by calling a shell (/bin/sh) # useshell - run command by calling a shell (/bin/sh)
# #
# Bforce will make environment for external programs
# which include these variables:
# $REM_ADDR_FTN - remote ftn address
# $REM_ADDR_INET - remote inet address
# $LOC_ADDR_FTN - local ftn address
# $LOC_ADDR_INET - local inet address
# $PASSWORD - session password
# $MAILER - remote mailer
# $LOCATION - remote location
# $SYSOP - remote SysOp name
# $SYSTEM_NAME - remote station name
# $PHONE - remote phone
# $FLAGS - remote flags
# $PROTECTED - password protected on both sides
# $LISTED - present in nodelist
# $INBOUND - current inbound path for this remote
#
#run_after_handshake [logout]/bin/echo "Hello, world!" #run_after_handshake [logout]/bin/echo "Hello, world!"
#run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in #run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in
# #
+1 -1
View File
@@ -2,7 +2,7 @@
.SH NAME .SH NAME
bfindex \- nodelist compiler for bforce bfindex \- nodelist compiler for bforce
.SH SYNOPSYS .SH SYNOPSYS
\fBbfindex [-fh]\fR \fBbfindex [-fh] [-C\fIconfig\fB]\fR
.SH DESCRIPTION .SH DESCRIPTION
\fBbfindex\fP is a nodelist compiler for BinkleyForce FTN mailer. \fBbfindex\fP is a nodelist compiler for BinkleyForce FTN mailer.
View File
+1 -1
View File
@@ -2,7 +2,7 @@
.SH NAME .SH NAME
bfstat \- binkley style outbound statistic bfstat \- binkley style outbound statistic
.SH SYNOPSYS .SH SYNOPSYS
\fBbfstat [-afhprst] [-n \fInumber\fB]\fR \fBbfstat [-afhprst] [-n \fInumber\fB] [-C\fIconfig\fB]\fR
.SH DESCRIPTION .SH DESCRIPTION
\fBbfstat\fP help you to see your outbound statistic in human readable \fBbfstat\fP help you to see your outbound statistic in human readable
form. form.
+1 -1
View File
@@ -2,7 +2,7 @@
.SH NAME .SH NAME
Bnlookup \- Nodelist search tool for bforce Bnlookup \- Nodelist search tool for bforce
.SH SYNOPSYS .SH SYNOPSYS
\fBnlookup [-rh]\fR \fBnlookup [-rh] [-C\fIconfig\fB]\fR
.SH DESCRIPTION .SH DESCRIPTION
\fBnlookup\fP is a nodelist search tool for BinkleyForce FTN mailer. \fBnlookup\fP is a nodelist search tool for BinkleyForce FTN mailer.
View File
+34 -20
View File
@@ -1,54 +1,68 @@
Summary: Bforce, Fidonet mailer Summary: Bforce, Fidonet mailer
Name: bforce Name: bforce
Version: 0.22.8 Version: 0.26.2
Release: ugenk4 Release: %{_vendor}.1
Copyright: GPL Copyright: GPL
Group: Fidonet/mailer Group: Fidonet/mailer
Source0: bforce-%{version}.%{release}.tar.gz Source0: bforce-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-root BuildRoot: %{_tmppath}/%{name}-root
%description %description
BFORCE is a FTN mailer. Supports PSTN and binkp sessions. BFORCE is a FTN mailer. Supports PSTN and binkp sessions.
%prep %prep
#%setup -q -n %{name}-%{version}.%{release} # uncomment this to build from tarball
cd source # %setup -q -n %{name}
./configure --prefix=/usr --disable-log-passwd --sysconfdir=/etc/bforce --bindir=/usr/bin --with-owner=uucp --with-group=news echo "------------ PREPARING RPM BUILD IN $(pwd) ------------"
export RPM_PACKAGE_VERSION=$(cat %{_builddir}/%{name}/source/.version)
cd %{_builddir}/%{name}/source
%{_builddir}/%{name}/source/configure --prefix=/usr --disable-log-passwd --sysconfdir=/etc/bforce --bindir=/usr/bin --with-owner=uucp --with-group=news CFLAGS='-g1'
%build %build
cd source echo "------------ BUILDING RPM IN $(pwd) ------------"
cd %{_builddir}/%{name}/source
make make
%install %install
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/etc/bforce mkdir -p $RPM_BUILD_ROOT/etc/bforce
mkdir -p $RPM_BUILD_ROOT/usr/bin mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/sbin mkdir -p $RPM_BUILD_ROOT/usr/sbin
mkdir -p $RPM_BUILD_ROOT/usr/share/man/man1
mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/system/
mkdir -p $RPM_BUILD_ROOT/var/log/bforce mkdir -p $RPM_BUILD_ROOT/var/log/bforce
mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bt/pin mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bt/pin
mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bt/in mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bt/in
mkdir -p $RPM_BUILD_ROOT/var/spool/fido/ndl mkdir -p $RPM_BUILD_ROOT/var/spool/fido/ndl
mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bforce mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bforce
mkdir -p $RPM_BUILD_ROOT/$RPM_DOC_DIR/$RPM_PACKAGE_NAME-$RPM_PACKAGE_VERSION
install -o uucp -g news source/bin/bforce $RPM_BUILD_ROOT/usr/bin/bforce install %{_builddir}/%{name}/source/bin/bforce $RPM_BUILD_ROOT/usr/bin/bforce
install -o uucp -g news source/bin/bfindex $RPM_BUILD_ROOT/usr/bin/bfindex install %{_builddir}/%{name}/source/bin/bfindex $RPM_BUILD_ROOT/usr/bin/bfindex
install -o uucp -g news source/bin/bfstat $RPM_BUILD_ROOT/usr/bin/bfstat install %{_builddir}/%{name}/source/bin/bfstat $RPM_BUILD_ROOT/usr/bin/bfstat
install -o uucp -g news source/bin/nlookup $RPM_BUILD_ROOT/usr/bin/nlookup install %{_builddir}/%{name}/source/bin/nlookup $RPM_BUILD_ROOT/usr/bin/nlookup
install -o uucp -g news examples/bforce.conf $RPM_BUILD_ROOT/etc/bforce/bforce.conf.sample install %{_builddir}/%{name}/examples/bforce.conf $RPM_BUILD_ROOT/etc/bforce/bforce.conf.sample
install -o uucp -g news examples/bforce.passwd $RPM_BUILD_ROOT/etc/bforce/bforce.passwd.sample install %{_builddir}/%{name}/examples/bforce.passwd $RPM_BUILD_ROOT/etc/bforce/bforce.passwd.sample
install -o uucp -g news examples/bforce.subst $RPM_BUILD_ROOT/etc/bforce/bforce.subst.sample install %{_builddir}/%{name}/examples/bforce.subst $RPM_BUILD_ROOT/etc/bforce/bforce.subst.sample
install -o uucp -g news examples/freq.aliases $RPM_BUILD_ROOT/etc/bforce/freq.aliases.sample install %{_builddir}/%{name}/examples/freq.aliases $RPM_BUILD_ROOT/etc/bforce/freq.aliases.sample
install -o uucp -g news examples/freq.dirs $RPM_BUILD_ROOT/etc/bforce/freq.dirs.sample install %{_builddir}/%{name}/examples/freq.dirs $RPM_BUILD_ROOT/etc/bforce/freq.dirs.sample
install -m755 -o uucp -g news contrib/outman $RPM_BUILD_ROOT/usr/bin/outman install %{_builddir}/%{name}/contrib/outman $RPM_BUILD_ROOT/usr/bin/outman
install %{_builddir}/%{name}/contrib/systemd/bforce.service $RPM_BUILD_ROOT/usr/lib/systemd/system/bforce.service
cp %{_builddir}/%{name}/man/*.1 $RPM_BUILD_ROOT/usr/share/man/man1/
cp %{_builddir}/%{name}/{README.md,CHANGES,COPYING,INSTALL,INSTALL.ru,SYSLOG,TODO} $RPM_BUILD_ROOT/$RPM_DOC_DIR/$RPM_PACKAGE_NAME-$RPM_PACKAGE_VERSION/
%clean %clean
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
%files %files
%doc README README.kst CHANGES CHANGES.kst CHANGES.ugenk COPYING INSTALL.ru README.ugenk SYSLOG TODO %{_mandir}/man1/bforce.1.xz
%{_mandir}/man1/bfindex.1.xz
%{_mandir}/man1/bfstat.1.xz
%{_mandir}/man1/nlookup.1.xz
%{_mandir}/man1/outman.1.xz
%defattr(-, root, root) %defattr(-, root, root)
%attr(550,uucp,news) /usr/bin/bforce %attr(550,uucp,news) /usr/bin/bforce
@@ -56,7 +70,7 @@ rm -rf $RPM_BUILD_ROOT
%attr(550,uucp,news) /usr/bin/bfstat %attr(550,uucp,news) /usr/bin/bfstat
%attr(550,uucp,news) /usr/bin/nlookup %attr(550,uucp,news) /usr/bin/nlookup
%attr(550,uucp,news) /usr/bin/outman %attr(550,uucp,news) /usr/bin/outman
%attr(644,root,root) /usr/share/doc/bforce-0.22.8/* %attr(644,root,root) /usr/share/doc/bforce-%{version}/*
%dir %attr(770,uucp,news) /var/log/bforce %dir %attr(770,uucp,news) /var/log/bforce
%dir %attr(770,uucp,news) /var/spool/fido/ndl %dir %attr(770,uucp,news) /var/spool/fido/ndl
%attr(775,uucp,news) /var/spool/fido/bt %attr(775,uucp,news) /var/spool/fido/bt
+1 -1
View File
@@ -1 +1 @@
0.24.2 0.26.2
+14 -2
View File
@@ -13,13 +13,14 @@ CC = @CC@
INCLUDES = -I./include INCLUDES = -I./include
CFLAGS = @CFLAGS@ -fno-builtin CFLAGS = @CFLAGS@ -fno-builtin
LIBS = @LIBS@ @CLOCK_LIB@ LIBS = @LIBS@ @CLOCK_LIB@
YACC = @YACC@ YACC = @YACC@ -l
INSTALL = @INSTALL@ INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@ INSTALL_DATA = @INSTALL_DATA@
SRCDIR = @srcdir@ SRCDIR = @srcdir@
SRCDIRCONF = $(SRCDIR)/../examples SRCDIRCONF = $(SRCDIR)/../examples
CONTRIBDIR = $(SRCDIR)/../contrib CONTRIBDIR = $(SRCDIR)/../contrib
CONTRIBMAN = $(SRCDIR)/../man
OWNER = @OWNER@ OWNER = @OWNER@
GROUP = @GROUP@ GROUP = @GROUP@
@@ -27,6 +28,8 @@ CONFDIR = @sysconfdir@
BINDIR = @bindir@ BINDIR = @bindir@
LOGDIR = @LOGDIR@ LOGDIR = @LOGDIR@
SPOOLDIR = @SPOOLDIR@ SPOOLDIR = @SPOOLDIR@
MANDIR = /usr/share/man/man1
SYSTEMDDIR = /var/lib/systemd/system
DAEMON_LOGFILE = $(LOGDIR)/bf-daemon DAEMON_LOGFILE = $(LOGDIR)/bf-daemon
BFORCE_LOGFILE = $(LOGDIR)/bf-log BFORCE_LOGFILE = $(LOGDIR)/bf-log
@@ -175,6 +178,7 @@ installdirs:
if [ ! -d $(SPOOLDIR)/bt/out ]; then mkdir -p $(SPOOLDIR)/bt/out; fi if [ ! -d $(SPOOLDIR)/bt/out ]; then mkdir -p $(SPOOLDIR)/bt/out; fi
if [ ! -d $(SPOOLDIR)/ndl ]; then mkdir -p $(SPOOLDIR)/ndl; fi if [ ! -d $(SPOOLDIR)/ndl ]; then mkdir -p $(SPOOLDIR)/ndl; fi
if [ ! -d $(SPOOLDIR)/bforce ]; then mkdir -p $(SPOOLDIR); fi if [ ! -d $(SPOOLDIR)/bforce ]; then mkdir -p $(SPOOLDIR); fi
if [ ! -d $(MANDIR)/man1 ]; then mkdir -p $(MANDIR)/man1; fi
chown $(OWNER):$(GROUP) $(CONFDIR) chown $(OWNER):$(GROUP) $(CONFDIR)
chown $(OWNER):$(GROUP) $(LOGDIR) chown $(OWNER):$(GROUP) $(LOGDIR)
chown $(OWNER):$(GROUP) $(SPOOLDIR)/bt/in chown $(OWNER):$(GROUP) $(SPOOLDIR)/bt/in
@@ -195,10 +199,18 @@ install-config:
$(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/bforce.passwd $(CONFDIR)/bforce.passwd.sample $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/bforce.passwd $(CONFDIR)/bforce.passwd.sample
$(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.aliases $(CONFDIR)/freq.aliases.sample $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.aliases $(CONFDIR)/freq.aliases.sample
$(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.dirs $(CONFDIR)/freq.dirs.sample $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.dirs $(CONFDIR)/freq.dirs.sample
install-man:
$(INSTALL) $(CONTRIBMAN)/bforce.1 $(MANDIR)/man1/bforce.1
$(INSTALL) $(CONTRIBMAN)/bfindex.1 $(MANDIR)/man1/bfindex.1
$(INSTALL) $(CONTRIBMAN)/bfstat.1 $(MANDIR)/man1/bforce.1
$(INSTALL) $(CONTRIBMAN)/nlookup.1 $(MANDIR)/man1/bforce.1
$(INSTALL) $(CONTRIBMAN)/outman.1 $(MANDIR)/man1/bforce.1
install-contrib: install-contrib:
$(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(CONTRIBDIR)/outman $(BINDIR)/outman $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(CONTRIBDIR)/outman $(BINDIR)/outman
$(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(CONTRIBDIR)/systemd/bforce.service $(SYSTEMDDIR)/bforce.service
@echo "Please, edit $(BINDIR)/outman" @echo "Please, edit $(BINDIR)/outman"
install: install-bin install-config install: install-bin install-config install-man
+18 -22
View File
@@ -23,6 +23,8 @@
/* PID of our child process (if use fork) */ /* PID of our child process (if use fork) */
pid_t child_pid = 0; pid_t child_pid = 0;
char * mainenv[EXEC_MAX_NUM_ENVS+1];
const char *BFERR[] = { const char *BFERR[] = {
/* 00 */ "Successfull", /* 00 */ "Successfull",
/* 01 */ "Fatal error occured", /* 01 */ "Fatal error occured",
@@ -54,9 +56,6 @@ const char *BFERR[] = {
/* 27 */ "Unused entry" /* 27 */ "Unused entry"
}; };
/* Main environment on startup (copied) for external processes */
char ** mainenv;
static void deinit_opts(s_bforce_opts *opts); static void deinit_opts(s_bforce_opts *opts);
/* /*
@@ -257,24 +256,22 @@ int main(int argc, char *argv[], char *envp[])
int ch = 0; int ch = 0;
opts.runmode = MODE_UNDEFINED; opts.runmode = MODE_UNDEFINED;
int i = 0; int i = 0;
int argsz = 0;
mainenv[0] = NULL;
i=0;
if ( envp[0] ) {
while (envp[i]) {
mainenv[i] = malloc(strlen(envp[i])+2);
if ( mainenv[i] ) {
strcpy(mainenv[i], envp[i]);
mainenv[++i] = NULL;
DEB((D_FREE, "Program ENV: %s\n", mainenv[(i-1)]));
}
}
}
memset(&opts, '\0', sizeof(s_bforce_opts)); memset(&opts, '\0', sizeof(s_bforce_opts));
// Copying environment
argsz = 4096;
//argsz = sysconf(_SC_ARG_MAX);
DEB((D_CONFIG, "Limits: %d\n",argsz));
mainenv = malloc(sizeof(mainenv)*argsz);
mainenv[0] = NULL;
i=0;
while (envp[i]) {
mainenv[i] = malloc(strlen(envp[i])+2);
strcpy(mainenv[i], envp[i]);
mainenv[++i] = NULL;
//fprintf(stderr,"BF-DEBUG: ENV: %s\n", mainenv[(i-1)]);
}
// parsing // parsing
while( (ch=getopt(argc, argv, "hfI:p:n:l:a:u:oivC:S:dq")) != (int)-1 ) while( (ch=getopt(argc, argv, "hfI:p:n:l:a:u:oivC:S:dq")) != (int)-1 )
@@ -507,6 +504,9 @@ default:
exit: exit:
deinit_conf();
deinit_opts(&opts);
/* de-init sessenv */ /* de-init sessenv */
i=0; i=0;
while(mainenv[i]) { while(mainenv[i]) {
@@ -514,10 +514,6 @@ exit:
free(mainenv[i++]); free(mainenv[i++]);
} }
deinit_conf();
deinit_opts(&opts);
/* Shutdown logging services */ /* Shutdown logging services */
if( log_isopened() ) log_close(); if( log_isopened() ) log_close();
DEB((D_FREE, "good exit")); DEB((D_FREE, "good exit"));
+11 -5
View File
@@ -19,11 +19,15 @@
s_cval_entry *conf_first(bforce_config_keyword keyword) s_cval_entry *conf_first(bforce_config_keyword keyword)
{ {
s_cval_entry *ptrl; s_cval_entry *ptrl;
DEB((D_CONFIG, "conf_first entry nr %d",(int16_t)keyword));
for( ptrl = bforce_config[keyword].data; ptrl; ptrl = ptrl->next ) for( ptrl = bforce_config[keyword].data; ptrl; ptrl = ptrl->next )
if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) {
DEB((D_CONFIG, "conf_first ptrl found"));
return ptrl; return ptrl;
}
DEB((D_CONFIG, "conf_first ptrl not found"));
return NULL; return NULL;
} }
@@ -32,9 +36,11 @@ s_cval_entry *conf_next(s_cval_entry *ptrl)
ASSERT(ptrl); ASSERT(ptrl);
for( ptrl = ptrl->next; ptrl; ptrl = ptrl->next ) for( ptrl = ptrl->next; ptrl; ptrl = ptrl->next )
if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) {
DEB((D_CONFIG, "conf_next ptrl found"));
return ptrl; return ptrl;
}
DEB((D_CONFIG, "conf_next ptrl not found"));
return NULL; return NULL;
} }
@@ -91,7 +97,7 @@ long conf_number(bforce_config_keyword keyword)
s_override *conf_override(bforce_config_keyword keyword, s_faddr addr) s_override *conf_override(bforce_config_keyword keyword, s_faddr addr)
{ {
s_cval_entry *ptrl; s_cval_entry *ptrl;
DEB((D_CONFIG, "conf_override entry"));
for( ptrl = conf_first(keyword); ptrl; ptrl = conf_next(ptrl) ) for( ptrl = conf_first(keyword); ptrl; ptrl = conf_next(ptrl) )
if( !ftn_addrcomp(ptrl->d.override.addr, addr) ) if( !ftn_addrcomp(ptrl->d.override.addr, addr) )
return &ptrl->d.override; return &ptrl->d.override;
+8 -3
View File
@@ -84,6 +84,8 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(emsi_FR_time, CT_STRING), CONF_KEY(emsi_FR_time, CT_STRING),
CONF_KEY(emsi_OH_time, CT_STRING), CONF_KEY(emsi_OH_time, CT_STRING),
CONF_KEY(emsi_slave_sends_nak, CT_BOOLEAN), CONF_KEY(emsi_slave_sends_nak, CT_BOOLEAN),
CONF_KEY(emsi_send_tz, CT_BOOLEAN),
CONF_KEY(emsi_send_time, CT_BOOLEAN),
CONF_KEY(filebox, CT_FILEBOX), CONF_KEY(filebox, CT_FILEBOX),
CONF_KEY(filebox_directory, CT_PATH), CONF_KEY(filebox_directory, CT_PATH),
CONF_KEY(flags, CT_STRING), CONF_KEY(flags, CT_STRING),
@@ -98,6 +100,8 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(freq_srif_command, CT_STRING), CONF_KEY(freq_srif_command, CT_STRING),
CONF_KEY(incnet_flag, CT_STRING), CONF_KEY(incnet_flag, CT_STRING),
CONF_KEY(incarc_flag, CT_STRING), CONF_KEY(incarc_flag, CT_STRING),
CONF_KEY(inctic_flag, CT_STRING),
CONF_KEY(incfile_flag, CT_STRING),
CONF_KEY(hide_our_aka, CT_ADDRESS), CONF_KEY(hide_our_aka, CT_ADDRESS),
CONF_KEY(history_file, CT_STRING), CONF_KEY(history_file, CT_STRING),
CONF_KEY(hydra_options, CT_OPTIONS), CONF_KEY(hydra_options, CT_OPTIONS),
@@ -144,6 +148,7 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(password, CT_PASSWORD), CONF_KEY(password, CT_PASSWORD),
CONF_KEY(phone, CT_STRING), CONF_KEY(phone, CT_STRING),
CONF_KEY(phone_translate, CT_TRANSLATE), CONF_KEY(phone_translate, CT_TRANSLATE),
CONF_KEY(proto_order, CT_STRING),
CONF_KEY(recode_file_in, CT_STRING), CONF_KEY(recode_file_in, CT_STRING),
CONF_KEY(recode_file_out, CT_STRING), CONF_KEY(recode_file_out, CT_STRING),
CONF_KEY(recode_intro_in, CT_STRING), CONF_KEY(recode_intro_in, CT_STRING),
@@ -657,7 +662,7 @@ static int proc_domain(s_domain *dest, char *value)
if( p_path[strlen(p_path)-1] == DIRSEPCHR ) if( p_path[strlen(p_path)-1] == DIRSEPCHR )
dest->path = xstrcpy(p_path); dest->path = xstrcpy(p_path);
else else
dest->path = string_concat(p_path, DIRSEPSTR, NULL); dest->path = string_concat(p_path, DIRSEPSTR, '\0');
return(PROC_RC_OK); return(PROC_RC_OK);
} }
else else
@@ -746,7 +751,7 @@ static int proc_path(s_string *dest, char *value)
if( value[strlen(value)-1] == DIRSEPCHR ) if( value[strlen(value)-1] == DIRSEPCHR )
dest->str = xstrcpy(value); dest->str = xstrcpy(value);
else else
dest->str = string_concat(value, DIRSEPSTR, NULL); dest->str = string_concat(value, DIRSEPSTR, '\0');
return(PROC_RC_OK); return(PROC_RC_OK);
} }
@@ -999,7 +1004,7 @@ static int proc_filebox(s_filebox *dest, char *value)
if( p_path[strlen(p_path)-1] == DIRSEPCHR ) if( p_path[strlen(p_path)-1] == DIRSEPCHR )
dest->path = xstrcpy(p_path); dest->path = xstrcpy(p_path);
else else
dest->path = string_concat(p_path, DIRSEPSTR, NULL); dest->path = string_concat(p_path, DIRSEPSTR, '\0');
dest->flavor = flavor; dest->flavor = flavor;
return rc; return rc;
} }
+57 -9
View File
@@ -161,7 +161,7 @@ static int daemon_sysentry_init(s_sysentry *sysent)
strcpy(msg, "freqs holded"); strcpy(msg, "freqs holded");
} }
if( msg && *msg ) if( *msg )
log("QUEUE: add %s (%s)", ftn_addrstr(abuf, sysent->node.addr), msg); log("QUEUE: add %s (%s)", ftn_addrstr(abuf, sysent->node.addr), msg);
else else
log("QUEUE: add %s", ftn_addrstr(abuf, sysent->node.addr)); log("QUEUE: add %s", ftn_addrstr(abuf, sysent->node.addr));
@@ -178,7 +178,7 @@ static int daemon_sysentry_deinit(s_sysentry *sysent)
return 0; return 0;
} }
static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd) static int daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
{ {
bool good_phone = FALSE; bool good_phone = FALSE;
bool good_host = FALSE; bool good_host = FALSE;
@@ -194,7 +194,7 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
if( modem_isgood_phone(ovrd->sPhone) ) if( modem_isgood_phone(ovrd->sPhone) )
good_phone = TRUE; good_phone = TRUE;
} }
else if( node && node->phone && *node->phone ) else if( node && *node->phone )
{ {
if( modem_isgood_phone(node->phone) ) if( modem_isgood_phone(node->phone) )
good_phone = TRUE; good_phone = TRUE;
@@ -208,6 +208,11 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
if( tcpip_isgood_host(ovrd->sIpaddr) ) if( tcpip_isgood_host(ovrd->sIpaddr) )
good_host = TRUE; good_host = TRUE;
} }
else if ( node && *node->host )
{
if( tcpip_isgood_host(node->host) )
good_host = TRUE;
}
/* /*
* Check work time * Check work time
@@ -231,6 +236,16 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
good_time = TRUE; good_time = TRUE;
} }
// Must be more complicated, i.e. call to IP even if modem is not good time
if ( good_host )
{
good_time = TRUE;
}
DEB((D_DAEMON, "daemon: node_cancall_line good_phone: %d, good_time:%d, good_host:%d",
good_phone, good_time, good_host));
if( good_time ) if( good_time )
{ {
if( good_host ) if( good_host )
@@ -323,9 +338,23 @@ static bool daemon_node_cancall(s_sysentry *syst, bool ign_wtime, bool tcpip)
return FALSE; return FALSE;
} }
/* Make check for tcpip out */
if ( tcpip )
{
rc = daemon_node_cancall_line(&syst->node, NULL);
DEB((D_DAEMON, "daemon tcpip: node_cancall rc=%d", rc));
if ( rc == 2 )
{
syst->tcpip = TRUE;
return TRUE;
}
}
/* Make checks for all lines */ /* Make checks for all lines */
if( syst->overrides ) if( syst->overrides )
{ {
DEB((D_DAEMON, "daemon: node_cancall OVR-IN"));
if( syst->lineptr && syst->lineptr->hidden ) if( syst->lineptr && syst->lineptr->hidden )
{ {
line = syst->line + 1; line = syst->line + 1;
@@ -363,11 +392,18 @@ static bool daemon_node_cancall(s_sysentry *syst, bool ign_wtime, bool tcpip)
} }
line++; line++;
} }
} }
else /* Node without overriden parameters */ else /* Node without overriden parameters */
{ {
syst->line = line = 0; syst->line = line = 0;
return daemon_node_cancall_line(&syst->node, NULL); rc = daemon_node_cancall_line(&syst->node, NULL);
DEB((D_DAEMON, "daemon: node_cancall rc=%d", rc));
if ( rc )
{
syst->tcpip = (rc == 2) ? TRUE : FALSE;
return TRUE;
}
} }
return FALSE; return FALSE;
@@ -687,6 +723,8 @@ int daemon_rescan_sysqueue(s_sysqueue *q, s_daemon_queue dqs[])
#ifdef DEBUG #ifdef DEBUG
log_sysqueue(q); log_sysqueue(q);
DEB((D_DAEMON, "daemon rescan_sysqueue daemon queue: MODEM: %d, %d; TCPIP: %d, %d",
dqs[MODEM_QUEUE].circle, dqs[MODEM_QUEUE].current, dqs[TCPIP_QUEUE].circle, dqs[TCPIP_QUEUE].current));
#endif #endif
return 0; return 0;
@@ -772,6 +810,7 @@ int daemon_pidfile(int cmd)
res = fscanf(pf, "%d", &hispid); res = fscanf(pf, "%d", &hispid);
if (res != 1) { if (res != 1) {
log("daemon pidfile: not readable"); log("daemon pidfile: not readable");
fclose(pf);
return -1; return -1;
} }
@@ -816,6 +855,7 @@ int daemon_pidfile(int cmd)
res = fscanf(pf, "%d", &hispid); res = fscanf(pf, "%d", &hispid);
if (res != 1) { if (res != 1) {
log("daemon pidfile: not readable"); log("daemon pidfile: not readable");
fclose(pf);
return -1; return -1;
} }
@@ -845,6 +885,7 @@ int daemon_pidfile(int cmd)
res = fscanf(pf, "%d", &hispid); res = fscanf(pf, "%d", &hispid);
if (res != 1) { if (res != 1) {
log("daemon pidfile: not readable"); log("daemon pidfile: not readable");
fclose(pf);
return -1; return -1;
} }
@@ -994,7 +1035,7 @@ int daemon_run(const char *confname, const char *incname, bool quit)
/* /*
* Check rescan timer * Check rescan timer
*/ */
if( !timer_running(timer_rescan) || timer_expired(timer_rescan) ) if( timer_expired(timer_rescan) )
{ {
(void)daemon_rescan_sysqueue(&daemon_sys_queue, (void)daemon_rescan_sysqueue(&daemon_sys_queue,
daemon_queues); daemon_queues);
@@ -1004,16 +1045,23 @@ int daemon_run(const char *confname, const char *incname, bool quit)
/* /*
* Check alive timer * Check alive timer
*/ */
if( !timer_running(timer_alive) || timer_expired(timer_alive) ) if( timer_expired(timer_alive) )
{ {
daemon_alive_message(&daemon_sys_queue); daemon_alive_message(&daemon_sys_queue);
timer_set(&timer_alive, DAEMON_ALIVE_TIMER); timer_set(&timer_alive, DAEMON_ALIVE_TIMER);
} }
if( max_modem > 0 ) if( max_tcpip > 0 )
daemon_queue_do(&daemon_queues[MODEM_QUEUE]); {
if( max_tcpip > 0 ) DEB((D_DAEMON,"daemon: daemon_tcpip_queue"));
daemon_queue_do(&daemon_queues[TCPIP_QUEUE]); daemon_queue_do(&daemon_queues[TCPIP_QUEUE]);
}
if( max_modem > 0 )
{
DEB((D_DAEMON,"daemon: daemon_modem_queue"));
daemon_queue_do(&daemon_queues[MODEM_QUEUE]);
}
(void)sleep(DAEMON_IDLE_SLEEP); (void)sleep(DAEMON_IDLE_SLEEP);
break; break;
+20 -8
View File
@@ -39,8 +39,8 @@ static s_modemport *daemon_getfree_port(const char *lockdir)
static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport *port) static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport *port)
{ {
int rc = BFERR_NOERROR; //int rc = BFERR_NOERROR;
char abuf[BF_MAXADDRSTR+1]; //char abuf[BF_MAXADDRSTR+1];
/* /*
* First of all restore the default signal handlers * First of all restore the default signal handlers
@@ -54,15 +54,20 @@ static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport
s_bforce_opts opts; s_bforce_opts opts;
// TODO: add hiddenline round-robin // TODO: add hiddenline round-robin
opts.hiddline=0; memset(&opts, '\0', sizeof(s_bforce_opts));
opts.runmode = MODE_CALL_DEFAULT;
opts.hiddline = 0;
if ( syst->tcpip )
opts.runmode = MODE_CALL_IP;
else
opts.runmode = MODE_CALL_DEFAULT;
opts.ipproto = NULL; opts.ipproto = NULL;
opts.phone = NULL; opts.phone = NULL;
opts.force = 0; opts.force = 0;
opts.inetd = 0; opts.inetd = 0;
opts.connect = NULL; opts.connect = NULL;
opts.device = NULL; opts.device = NULL;
DEB((D_DAEMON, "daemon_call: calling call_system from branch"));
// log("doing call_system"); // log("doing call_system");
return call_system(syst->node.addr, &opts); return call_system(syst->node.addr, &opts);
} }
@@ -87,8 +92,11 @@ int daemon_call(s_sysentry *syst)
/* /*
* Check whether this node is allready locked * Check whether this node is allready locked
*/ */
if( out_bsy_check(syst->node.addr) ) if( out_bsy_check(syst->node.addr) )
{
DEB((D_DAEMON, "daemon_call: node locked by .bsy file"));
return 0; return 0;
}
/* /*
* Set state structure to make expressions works properly now * Set state structure to make expressions works properly now
@@ -101,6 +109,7 @@ int daemon_call(s_sysentry *syst)
if( syst->tcpip == FALSE ) if( syst->tcpip == FALSE )
{ {
DEB((D_DAEMON, "daemon_call: tcpip false - prep modem line"));
if( (p_lockdir = conf_string(cf_uucp_lock_directory)) == NULL ) if( (p_lockdir = conf_string(cf_uucp_lock_directory)) == NULL )
p_lockdir = BFORCE_LOCK_DIR; p_lockdir = BFORCE_LOCK_DIR;
@@ -110,7 +119,10 @@ int daemon_call(s_sysentry *syst)
return 1; return 1;
} }
} }
DEB((D_DAEMON, "call %s line %d via %s",
ftn_addrstr(abuf, syst->node.addr), syst->line,
syst->tcpip ? "TCP/IP" : modemport->name));
log("call %s line %d via %s", log("call %s line %d via %s",
ftn_addrstr(abuf, syst->node.addr), syst->line, ftn_addrstr(abuf, syst->node.addr), syst->line,
syst->tcpip ? "TCP/IP" : modemport->name); syst->tcpip ? "TCP/IP" : modemport->name);
@@ -138,7 +150,7 @@ int daemon_call(s_sysentry *syst)
} }
/* Now we are in child process */ /* Now we are in child process */
DEB((D_DAEMON, "daemon_call: fork success - calling..."));
exit(daemon_call_branch(syst, p_lockdir, modemport)); exit(daemon_call_branch(syst, p_lockdir, modemport));
} }
+6 -7
View File
@@ -32,7 +32,7 @@ int daemon_line_add(const char *name, int type)
int i; int i;
for( i = 0; i < lines_num; i++ ) for( i = 0; i < lines_num; i++ )
if( !strcmp(lines_tab[i].name, name) ) if( (lines_tab) && !strcmp(lines_tab[i].name, name) )
return i; return i;
log("register new line \"%s\"", name); log("register new line \"%s\"", name);
@@ -90,13 +90,12 @@ bool daemon_line_isready(const char *name)
void daemon_lines_deinit(void) void daemon_lines_deinit(void)
{ {
int i; int i;
if( lines_tab )
for( i = 0; i < lines_num; i++ )
if( lines_tab[i].name )
free(lines_tab[i].name);
if( lines_tab )
{ {
for( i = 0; i < lines_num; i++ )
if( lines_tab[i].name )
free(lines_tab[i].name);
free(lines_tab); free(lines_tab);
lines_tab = NULL; lines_tab = NULL;
} }
+68 -57
View File
@@ -67,7 +67,7 @@
/* First part of user prologue. */ /* First part of user prologue. */
#line 49 "expression.y"
#include "includes.h" #include "includes.h"
#include "confread.h" #include "confread.h"
@@ -110,7 +110,7 @@ static int yyparse(void);
static int yyerror(const char *s); static int yyerror(const char *s);
#line 114 "expression.tab.c"
# ifndef YY_CAST # ifndef YY_CAST
# ifdef __cplusplus # ifdef __cplusplus
@@ -950,12 +950,12 @@ int yydebug;
`-----------------------------------------------*/ `-----------------------------------------------*/
static void static void
yydestruct (const char *yymsg, yydestruct (char *yymsg,
yysymbol_kind_t yykind, YYSTYPE *yyvaluep) yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
{ {
YY_USE (yyvaluep); YY_USE (yyvaluep);
if (!yymsg) if (!yymsg)
yymsg = "Deleting"; yymsg = "Deleting"; // cppcheck_suppress uselessAssignmentPtrArg
YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
@@ -1059,6 +1059,7 @@ yysetstate:
/* Give user a chance to reallocate the stack. Use copies of /* Give user a chance to reallocate the stack. Use copies of
these so that the &'s don't force the real ones into these so that the &'s don't force the real ones into
memory. */ memory. */
YYSTYPE *yyls1 = yyls;
yy_state_t *yyss1 = yyss; yy_state_t *yyss1 = yyss;
YYSTYPE *yyvs1 = yyvs; YYSTYPE *yyvs1 = yyvs;
@@ -1066,10 +1067,13 @@ yysetstate:
data in use in that stack, in bytes. This used to be a data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might conditional around just the two extra args, but that might
be undefined if yyoverflow is a macro. */ be undefined if yyoverflow is a macro. */
yyoverflow (YY_("memory exhausted"), yyoverflow (YY_("memory exhausted"),
&yyss1, yysize * YYSIZEOF (*yyssp), &yyss1, yysize * YYSIZEOF (*yyssp), // cppcheck_suppress syntaxError
&yyvs1, yysize * YYSIZEOF (*yyvsp), &yyvs1, yysize * YYSIZEOF (*yyvsp),
&yyls1, yysize * YYSIZEOF (*yylsp),
&yystacksize); &yystacksize);
yyls = yyls1;
yyss = yyss1; yyss = yyss1;
yyvs = yyvs1; yyvs = yyvs1;
} }
@@ -1085,7 +1089,7 @@ yysetstate:
yy_state_t *yyss1 = yyss; yy_state_t *yyss1 = yyss;
union yyalloc *yyptr = union yyalloc *yyptr =
YY_CAST (union yyalloc *, YY_CAST (union yyalloc *,
YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); // cppcheck_suppress sizeofwithnumericparameter
if (! yyptr) if (! yyptr)
YYNOMEM; YYNOMEM;
YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyss_alloc, yyss);
@@ -1222,25 +1226,25 @@ yyreduce:
switch (yyn) switch (yyn)
{ {
case 2: /* fullline: expression */ case 2: /* fullline: expression */
#line 94 "expression.y"
{ {
DEB((D_EVENT, "[yacc] expression return %d", yyvsp[0])); DEB((D_EVENT, "[yacc] expression return %d", yyvsp[0]));
expr_result = yyvsp[0]; expr_result = yyvsp[0];
} }
#line 1231 "expression.tab.c"
break; break;
case 3: /* expression: elemexp */ case 3: /* expression: elemexp */
#line 100 "expression.y"
{ {
DEB((D_EVENT, "[yacc] elemexp return %d", yyvsp[0])); DEB((D_EVENT, "[yacc] elemexp return %d", yyvsp[0]));
yyval = yyvsp[0]; yyval = yyvsp[0];
} }
#line 1240 "expression.tab.c"
break; break;
case 4: /* expression: NOT expression */ case 4: /* expression: NOT expression */
#line 105 "expression.y"
{ {
DEB((D_EVENT, "[yacc] not exprression %d", yyvsp[0])); DEB((D_EVENT, "[yacc] not exprression %d", yyvsp[0]));
if( (yyvsp[0]) < 0 ) if( (yyvsp[0]) < 0 )
@@ -1248,190 +1252,190 @@ yyreduce:
else else
yyval = !(yyvsp[0]); yyval = !(yyvsp[0]);
} }
#line 1252 "expression.tab.c"
break; break;
case 5: /* expression: expression LOGOP expression */ case 5: /* expression: expression LOGOP expression */
#line 113 "expression.y"
{ {
yyval = expr_check_logic(yyvsp[-2], yyvsp[-1], yyvsp[0]); yyval = expr_check_logic(yyvsp[-2], yyvsp[-1], yyvsp[0]);
} }
#line 1260 "expression.tab.c"
break; break;
case 6: /* expression: OPENB expression CLOSEB */ case 6: /* expression: OPENB expression CLOSEB */
#line 117 "expression.y"
{ {
DEB((D_EVENT, "eventexp: [yacc] backeted.expr %d", yyvsp[-1])); DEB((D_EVENT, "eventexp: [yacc] backeted.expr %d", yyvsp[-1]));
yyval = yyvsp[-1]; yyval = yyvsp[-1];
} }
#line 1269 "expression.tab.c"
break; break;
case 7: /* elemexp: INCOMING */ case 7: /* elemexp: INCOMING */
#line 123 "expression.y"
{ {
yyval = expr_check_incoming(); yyval = expr_check_incoming();
} }
#line 1277 "expression.tab.c"
break; break;
case 8: /* elemexp: OUTGOING */ case 8: /* elemexp: OUTGOING */
#line 127 "expression.y"
{ {
yyval = expr_check_outgoing(); yyval = expr_check_outgoing();
} }
#line 1285 "expression.tab.c"
break; break;
case 9: /* elemexp: LISTED */ case 9: /* elemexp: LISTED */
#line 131 "expression.y"
{ {
yyval = expr_check_listed(); yyval = expr_check_listed();
} }
#line 1293 "expression.tab.c"
break; break;
case 10: /* elemexp: PROTECTED */ case 10: /* elemexp: PROTECTED */
#line 135 "expression.y"
{ {
yyval = expr_check_protected(); yyval = expr_check_protected();
} }
#line 1301 "expression.tab.c"
break; break;
case 11: /* elemexp: FLAG flagstring */ case 11: /* elemexp: FLAG flagstring */
#line 139 "expression.y"
{ {
yyval = yyvsp[0]; yyval = yyvsp[0];
} }
#line 1309 "expression.tab.c"
break; break;
case 12: /* elemexp: CONNSPEED AROP NUMBER */ case 12: /* elemexp: CONNSPEED AROP NUMBER */
#line 143 "expression.y"
{ {
if( state.valid && state.connspeed > 0 ) if( state.valid && state.connspeed > 0 )
yyval = expr_check_arop(state.connspeed, yyvsp[-1], yyvsp[0]); yyval = expr_check_arop(state.connspeed, yyvsp[-1], yyvsp[0]);
else else
yyval = -1; yyval = -1;
} }
#line 1320 "expression.tab.c"
break; break;
case 13: /* elemexp: SPEED AROP NUMBER */ case 13: /* elemexp: SPEED AROP NUMBER */
#line 150 "expression.y"
{ {
if( state.valid && state.node.speed > 0 ) if( state.valid && state.node.speed > 0 )
yyval = expr_check_arop(state.node.speed, yyvsp[-1], yyvsp[0]); yyval = expr_check_arop(state.node.speed, yyvsp[-1], yyvsp[0]);
else else
yyval = -1; yyval = -1;
} }
#line 1331 "expression.tab.c"
break; break;
case 14: /* elemexp: TZ AROP NUMBER */ case 14: /* elemexp: TZ AROP NUMBER */
#line 157 "expression.y"
{ {
yyval = expr_check_arop(time_gmtoffset(), yyvsp[-1], yyvsp[0]); yyval = expr_check_arop(time_gmtoffset(), yyvsp[-1], yyvsp[0]);
} }
#line 1339 "expression.tab.c"
break; break;
case 15: /* elemexp: PHONE TEXT */ case 15: /* elemexp: PHONE TEXT */
#line 161 "expression.y"
{ {
yyval = expr_check_phone(expr_p_text); yyval = expr_check_phone(expr_p_text);
} }
#line 1347 "expression.tab.c"
break; break;
case 16: /* elemexp: TIME timestring */ case 16: /* elemexp: TIME timestring */
#line 165 "expression.y"
{ {
yyval = yyvsp[0]; yyval = yyvsp[0];
} }
#line 1355 "expression.tab.c"
break; break;
case 17: /* elemexp: EXEC TEXT */ case 17: /* elemexp: EXEC TEXT */
#line 169 "expression.y"
{ {
yyval = expr_check_exec(expr_p_text); yyval = expr_check_exec(expr_p_text);
} }
#line 1363 "expression.tab.c"
break; break;
case 18: /* elemexp: EXIST TEXT */ case 18: /* elemexp: EXIST TEXT */
#line 173 "expression.y"
{ {
yyval = expr_check_exist(expr_p_text); yyval = expr_check_exist(expr_p_text);
} }
#line 1371 "expression.tab.c"
break; break;
case 19: /* elemexp: PORT TEXT */ case 19: /* elemexp: PORT TEXT */
#line 177 "expression.y"
{ {
yyval = expr_check_port(expr_p_text); yyval = expr_check_port(expr_p_text);
} }
#line 1379 "expression.tab.c"
break; break;
case 20: /* elemexp: MAILER TEXT */ case 20: /* elemexp: MAILER TEXT */
#line 181 "expression.y"
{ {
yyval = expr_check_mailer(expr_p_text); yyval = expr_check_mailer(expr_p_text);
} }
#line 1387 "expression.tab.c"
break; break;
case 21: /* elemexp: TEXT */ case 21: /* elemexp: TEXT */
#line 185 "expression.y"
{ {
yyval = expr_check_addr(expr_p_text); yyval = expr_check_addr(expr_p_text);
if( yyval == -2 ) if( yyval == -2 )
YYABORT; YYABORT;
} }
#line 1397 "expression.tab.c"
break; break;
case 22: /* flagstring: TEXT */ case 22: /* flagstring: TEXT */
#line 192 "expression.y"
{ {
yyval = expr_check_flag(expr_p_text); yyval = expr_check_flag(expr_p_text);
} }
#line 1405 "expression.tab.c"
break; break;
case 23: /* flagstring: TEXT COMMA flagstring */ case 23: /* flagstring: TEXT COMMA flagstring */
#line 196 "expression.y"
{ {
yyval = expr_check_logic(yyvsp[-2], OR, yyvsp[0]); yyval = expr_check_logic(yyvsp[-2], OR, yyvsp[0]);
} }
#line 1413 "expression.tab.c"
break; break;
case 24: /* timestring: TEXT */ case 24: /* timestring: TEXT */
#line 201 "expression.y"
{ {
yyval = expr_check_time(expr_p_text); yyval = expr_check_time(expr_p_text);
if( yyval == -2 ) if( yyval == -2 )
YYABORT; YYABORT;
} }
#line 1423 "expression.tab.c"
break; break;
case 25: /* timestring: TEXT COMMA timestring */ case 25: /* timestring: TEXT COMMA timestring */
#line 207 "expression.y"
{ {
yyval = expr_check_logic(yyvsp[-2], OR, yyvsp[0]); yyval = expr_check_logic(yyvsp[-2], OR, yyvsp[0]);
} }
#line 1431 "expression.tab.c"
break; break;
#line 1435 "expression.tab.c"
default: break; default: break;
} }
@@ -1624,7 +1628,7 @@ yyreturnlab:
return yyresult; return yyresult;
} }
#line 211 "expression.y"
#include "expression_lex.c" #include "expression_lex.c"
@@ -1777,7 +1781,14 @@ static int expr_check_mailer(const char *str)
static int expr_check_addr(const char *str) static int expr_check_addr(const char *str)
{ {
s_faddr addr; s_faddr addr = {
.inetform = false,
.zone = 0,
.net = 0,
.node = 0,
.point = 0,
.domain = '\0' };
#ifdef DEBUG #ifdef DEBUG
char abuf1[BF_MAXADDRSTR+1]; char abuf1[BF_MAXADDRSTR+1];
char abuf2[BF_MAXADDRSTR+1]; char abuf2[BF_MAXADDRSTR+1];
+9 -1
View File
@@ -360,7 +360,14 @@ static int expr_check_mailer(const char *str)
static int expr_check_addr(const char *str) static int expr_check_addr(const char *str)
{ {
s_faddr addr; s_faddr addr = {
.inetform = false,
.zone = 0,
.net = 0,
.node = 0,
.point = 0,
.domain = '\0' };
#ifdef DEBUG #ifdef DEBUG
char abuf1[BF_MAXADDRSTR+1]; char abuf1[BF_MAXADDRSTR+1];
char abuf2[BF_MAXADDRSTR+1]; char abuf2[BF_MAXADDRSTR+1];
@@ -368,6 +375,7 @@ static int expr_check_addr(const char *str)
DEB((D_EVENT, "[yacc] addr: \"%s\" (session with \"%s\")", DEB((D_EVENT, "[yacc] addr: \"%s\" (session with \"%s\")",
ftn_addrstr(abuf1, addr), ftn_addrstr(abuf1, addr),
ftn_addrstr(abuf2, state.node.addr))); ftn_addrstr(abuf2, state.node.addr)));
#endif #endif
if( !state.valid ) if( !state.valid )
+11 -2
View File
@@ -115,7 +115,7 @@ static void req_readfrlist(char *fname, s_frlist **frlist, int magic)
(*ptrl) = (s_frlist*)xmalloc(sizeof(s_frlist)); (*ptrl) = (s_frlist*)xmalloc(sizeof(s_frlist));
memset(*ptrl, '\0', sizeof(s_frlist)); memset(*ptrl, '\0', sizeof(s_frlist));
if( path && *path ) (*ptrl)->path = xstrcpy(path); if( *path ) (*ptrl)->path = xstrcpy(path);
if( !magic && *(path + strlen(path) - 1) != DIRSEPCHR ) if( !magic && *(path + strlen(path) - 1) != DIRSEPCHR )
{ {
/* add trailing DIRSEP ('/' or ..) to paths */ /* add trailing DIRSEP ('/' or ..) to paths */
@@ -200,9 +200,18 @@ static void req_proc_ext(s_freq *freq, char *reqname)
char srfname[L_tmpnam+5]; char srfname[L_tmpnam+5];
char rspname[L_tmpnam+5]; char rspname[L_tmpnam+5];
char *comline = NULL; char *comline = NULL;
char *chunk;
if( tmpnam(srfname) ) chunk = xmalloc(L_tmpnam+1);
if ( chunk )
{ {
getrandname(chunk, L_tmpnam);
chunk[L_tmpnam]='\0';
strnxcpy(srfname, chunk, L_tmpnam);
free(chunk);
//if( tmpnam(srfname) )
//{
strncpy(rspname, srfname, L_tmpnam+4); strncpy(rspname, srfname, L_tmpnam+4);
rspname[L_tmpnam+4] = '\0'; rspname[L_tmpnam+4] = '\0';
strcat(srfname, ".srf"); strcat(srfname, ".srf");
+3 -2
View File
@@ -67,8 +67,9 @@ int req_createsrif(char *sname, char *req, char *rsp)
fprintf(fp, "Sysop %s\n", cptr); fprintf(fp, "Sysop %s\n", cptr);
else else
fprintf(fp, "Sysop SysOp\n"); fprintf(fp, "Sysop SysOp\n");
if( aptr = session_1remote_address() ) aptr = session_1remote_address();
if( aptr )
fprintf(fp, "AKA %s\n", ftn_addrstr(abuf, *aptr)); fprintf(fp, "AKA %s\n", ftn_addrstr(abuf, *aptr));
else else
return -1; return -1;
+77 -26
View File
@@ -19,29 +19,49 @@
#define DEFAULT_PORT 60179 /* Birthday .. mother fucker :) */ #define DEFAULT_PORT 60179 /* Birthday .. mother fucker :) */
struct addrinfo *paddrinfo = NULL;
static RETSIGTYPE tcpip_interrupt(int sig) static RETSIGTYPE tcpip_interrupt(int sig)
{ {
tty_abort = TRUE; tty_abort = TRUE;
log("terminating on signal %d", sig); (void)log("terminating on signal %d", sig);
} }
static RETSIGTYPE tcpip_brokenpipe(int sig) static RETSIGTYPE tcpip_brokenpipe(int sig)
{ {
tty_abort = TRUE; tty_abort = TRUE;
if( tty_online ) if( tty_online )
log("connection closed"); (void)log("connection closed");
else else
log("terminating on signal %d", sig); (void)log("terminating on signal %d", sig);
} }
static int tcpip_connect2(struct sockaddr_in server) static int tcpip_connect2(struct addrinfo *ai)
{ {
int fd; int fd = -1;
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
DEB((D_INFO, "tcpip_connect2: trying \"%s\" at port %d",
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port))); struct addrinfo *rai;
if( (fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) for (rai = ai; rai != NULL; rai = rai->ai_next)
{
if (getnameinfo(rai->ai_addr, rai->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0)
DEB((D_INFO, "tcpip_connect2: trying host=%s, serv=%s", hbuf, sbuf));
fd = socket (rai->ai_family, rai->ai_socktype, rai->ai_protocol);
if ( fd == -1 )
{
DEB((D_INFO, "tcpip_connect2: socket error"));
}
else break;
hbuf[0]='\0';
sbuf[0]='\0';
}
DEB((D_INFO, "tcpip_connect2: socket success: %d", fd));
if (fd < 0 )
{ {
logerr("can't create socket"); logerr("can't create socket");
return(1); return(1);
@@ -84,9 +104,9 @@ static int tcpip_connect2(struct sockaddr_in server)
clearerr(stdout); clearerr(stdout);
clearerr(stderr); clearerr(stderr);
if( connect(0, (struct sockaddr*)&server, sizeof(server)) == -1 ) if( connect(0, rai->ai_addr, rai->ai_addrlen) == -1 )
{ {
logerr("can't connect to %s", inet_ntoa(server.sin_addr)); logerr("can't connect to %s", hbuf);
close(0); close(0);
close(1); close(1);
close(2); close(2);
@@ -99,8 +119,7 @@ static int tcpip_connect2(struct sockaddr_in server)
return 1; return 1;
} }
log("TCP/IP connect to %s on port %d", (void)log("TCP/IP connect success to %s on service %s", hbuf, sbuf);
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port));
return(0); return(0);
} }
@@ -108,14 +127,23 @@ static int tcpip_connect2(struct sockaddr_in server)
int tcpip_connect(const char *hostname, e_tcpmode tcpmode) int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
{ {
int rc = 0; int rc = 0;
struct hostent *he = NULL; //struct hostent *he = NULL;
struct servent *se = NULL; //struct servent *se = NULL;
struct sockaddr_in server; //struct sockaddr_in server;
//struct sockaddr_storage server;
struct addrinfo *aisave = NULL;
struct addrinfo aihints;
int nameres = 0;
char *host = xstrcpy(hostname); char *host = xstrcpy(hostname);
char *p = strrchr(host, ':'); char *p = strrchr(host, ':');
const char *port = NULL; const char *port = NULL;
server.sin_family = AF_INET;
// AF_INET - only IPv4
//server.sin_family = AF_INET;
if( p ) if( p )
{ *p++ = '\0'; port = p; } { *p++ = '\0'; port = p; }
@@ -123,18 +151,34 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
port = "binkp"; port = "binkp";
else if( tcpmode == TCPMODE_TELNET ) else if( tcpmode == TCPMODE_TELNET )
port = "telnet"; port = "telnet";
else /* Default service name is "fido" */ else /* Can not rely on /etc/services - it is not well-known port */
port = "fido"; port = "60179";
// Do not need it
/*
if( ISDEC(port) ) if( ISDEC(port) )
server.sin_port = htons(atoi(port)); server.sin_port = htons(atoi(port));
else if( (se = getservbyname(port, "tcp")) ) else if( (se = getservbyname(port, "tcp")) )
server.sin_port = se->s_port; server.sin_port = se->s_port;
else else
{ log("invalid port or service name \"%s\"", port); rc = 1; } { log("invalid port or service name \"%s\"", port); rc = 1; }
*/
//if( rc == 0 )
//{
DEB((D_INFO, "tcpip_connect: port is %s", port));
memset( &aihints, 0, sizeof( aihints) );
aihints.ai_family = AF_UNSPEC;
//aihints.ai_socktype = SOCK_STREAM;
aihints.ai_protocol = IPPROTO_TCP;
if( rc == 0 ) nameres = getaddrinfo ( host, port, &aihints, &paddrinfo );
if ( nameres != 0 )
{ {
rc = 1;
log("Resolver error for host %s, port %s: \"%s\".", host, port, gai_strerror(nameres));
}
// GetHostByName works with IPv4 only and *deprecated*
/*
if( (he = gethostbyname(host)) ) if( (he = gethostbyname(host)) )
{ {
memcpy(&server.sin_addr, he->h_addr, he->h_length); memcpy(&server.sin_addr, he->h_addr, he->h_length);
@@ -159,12 +203,19 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
log("unknown error while resolving host \"%s\"", host); log("unknown error while resolving host \"%s\"", host);
break; break;
} }
} } */
} //}
if( host ) { free(host); host = NULL; } if( host ) { free(host); host = NULL; }
DEB((D_INFO, "tcpip_connect: resolver got result!"));
aisave = paddrinfo;
return rc ? rc : tcpip_connect2(server); if (rc == 0 )
rc = tcpip_connect2(paddrinfo);
freeaddrinfo( aisave );
return rc;
} }
int tcpip_init(void) int tcpip_init(void)
+19 -14
View File
@@ -77,7 +77,7 @@ static char *lock_getname(const char *lockdir, const s_modemport *modemport)
ASSERT(modemport != NULL); ASSERT(modemport != NULL);
if( lockdir && *lockdir ) if( *lockdir )
lckname = (char *)xstrcpy(lockdir); lckname = (char *)xstrcpy(lockdir);
else else
lckname = (char *)xstrcpy(BFORCE_LOCK_DIR); lckname = (char *)xstrcpy(BFORCE_LOCK_DIR);
@@ -116,7 +116,7 @@ static pid_t lock_read_pid(const char *lckname)
if( len == sizeof(pid) || sscanf(buf, "%d", &pid) != 1 || pid == 0 ) if( len == sizeof(pid) || sscanf(buf, "%d", &pid) != 1 || pid == 0 )
{ {
/* We found binary lock file? */ /* We found binary lock file? */
pid = *((int *)buf); pid = *((u_int *)buf);
#ifndef LOCK_BINARY #ifndef LOCK_BINARY
log("warning: found binary lock file %s", lckname); log("warning: found binary lock file %s", lckname);
#endif #endif
@@ -197,12 +197,15 @@ static int lock_create(const char *lckname, const char *tmpname)
int rc, fd; int rc, fd;
int tries; int tries;
#ifdef LOCK_BINARY #ifdef LOCK_BINARY
pid_t pid; pid_t pid;
#else #else
char buf[32]; char buf[32];
#endif #endif
ASSERT(lckname != NULL && tmpname != NULL); ASSERT(lckname != NULL && tmpname != NULL);
if( (fd = open(tmpname, O_CREAT | O_RDWR, 0644)) < 0 ) if( (fd = open(tmpname, O_CREAT | O_RDWR, 0644)) < 0 )
@@ -299,8 +302,7 @@ int port_checklock(const char *lockdir, const s_modemport *modemport)
rc = lock_check(lckname); rc = lock_check(lckname);
if( lckname ) free(lckname);
free(lckname);
return rc; return rc;
} }
@@ -312,20 +314,24 @@ int port_lock(const char *lockdir, const s_modemport *modemport)
{ {
int rc; int rc;
char *lckname; char *lckname;
char *tmpname, *p_tmpname; char *tmpname, *p_tmpname, *chunk;
if( lockdir && *lockdir ) if( *lockdir )
tmpname = xstrcpy(lockdir); tmpname = xstrcpy(lockdir);
else else
tmpname = xstrcpy(BFORCE_LOCK_DIR); tmpname = xstrcpy(BFORCE_LOCK_DIR);
tmpname = xstrcat(tmpname, "bfXXXXXX"); //tmpname = xstrcat(tmpname, "bfXXXXXX");
if( (p_tmpname = mktemp(tmpname)) == NULL ) chunk = xmalloc(7);
{ getrandname(chunk,6);
logerr("can't generate unique file name from \"%s\"", tmpname); p_tmpname = string_concat(tmpname, "bf", chunk, '\0');
free(tmpname); return 1;
} //if( (p_tmpname = mktemp(tmpname)) == NULL )
//{
// logerr("can't generate unique file name from \"%s\"", tmpname);
// free(tmpname); return 1;
//}
if( (lckname = lock_getname(lockdir, modemport)) == NULL ) if( (lckname = lock_getname(lockdir, modemport)) == NULL )
{ {
@@ -340,8 +346,7 @@ int port_lock(const char *lockdir, const s_modemport *modemport)
if( tmpname ) if( tmpname )
free(tmpname); free(tmpname);
if( lckname ) free(lckname);
free(lckname);
return rc; return rc;
} }
+7 -1
View File
@@ -118,6 +118,9 @@ int tio_get(int fd, TIO *tio)
{ {
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
return tcgetattr(fd, tio); return tcgetattr(fd, tio);
#else
DEB(("io_unix_tio: TERMIOS not supported!"));
return -1;
#endif #endif
} }
@@ -127,6 +130,9 @@ int tio_set(int fd, TIO *tio)
{ {
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
return tcsetattr(fd, TCSANOW, tio); return tcsetattr(fd, TCSANOW, tio);
#else
DEB(("io_unix_tio: TERMIOS not supported!"));
return -1;
#endif #endif
} }
@@ -177,7 +183,7 @@ int tio_get_speed(TIO *tio)
return speedtab[i].nspeed; return speedtab[i].nspeed;
} }
return-1; return -1;
} }
int tio_set_flow_control(int fd, TIO *tio, int flow) int tio_set_flow_control(int fd, TIO *tio, int flow)
+1 -1
View File
@@ -307,7 +307,7 @@ int tty_putc(unsigned char ch, int timeout)
int tty_puts(const unsigned char *s, int timeout) int tty_puts(const unsigned char *s, int timeout)
{ {
return tty_write_timeout(s, strlen(s), timeout); return tty_write_timeout(s, strlen((char *)s), timeout);
} }
int tty_getc(int timeout) int tty_getc(int timeout)
+31 -21
View File
@@ -26,7 +26,6 @@ static char log_name[BF_MAXPATH+1] = BFORCE_LOGFILE;
static char log_extension[32] = ""; static char log_extension[32] = "";
static char log_ident[32] = ""; static char log_ident[32] = "";
static char log_ttyname[32] = ""; static char log_ttyname[32] = "";
static int log_sl_opened = FALSE;
#ifdef DEBUG #ifdef DEBUG
/* /*
@@ -59,6 +58,7 @@ struct debuglevel {
{ "Daemon", D_DAEMON }, { "Daemon", D_DAEMON },
{ "Free", D_FREE }, { "Free", D_FREE },
{ "24554", D_24554 }, { "24554", D_24554 },
{ "Index", D_INDEX },
// { "Daemon", D_DAEMON }, // { "Daemon", D_DAEMON },
{ "Full", D_FULL }, { "Full", D_FULL },
{ NULL, 0 } { NULL, 0 }
@@ -107,11 +107,15 @@ int log_open(const char *logname, const char *ext, const char *tty)
if( logname ) if( logname )
{ {
DEB((D_INFO,"log_open: Opening log file %s", logname));
strnxcpy(log_name, logname, sizeof(log_name)); strnxcpy(log_name, logname, sizeof(log_name));
// May be NULL, so check both
if( tty && *tty ) if( tty && *tty )
strnxcpy(log_ttyname, tty, sizeof(log_ttyname)); strnxcpy(log_ttyname, tty, sizeof(log_ttyname));
// May be NULL, so check both
if( ext && *ext ) if( ext && *ext )
{ {
strnxcpy(log_extension, ext, sizeof(log_extension)); strnxcpy(log_extension, ext, sizeof(log_extension));
@@ -141,9 +145,11 @@ int log_close(void)
ASSERT(log_fp); ASSERT(log_fp);
if( log_fp ) if( log_fp != NULL )
{ {
rc = fclose(log_fp); log_fp = NULL; rc = fclose(log_fp);
DEB((D_INFO,"Closing log file."));
log_fp = NULL;
} }
return rc; return rc;
@@ -167,7 +173,7 @@ int log_reopen(const char *logname, const char *ext, const char *tty)
} }
int log(const char *s, ...) void log(const char *s, ...)
{ {
char timestr[40]; char timestr[40];
@@ -207,10 +213,10 @@ int log(const char *s, ...)
va_end(args); va_end(args);
return 0; //return 0;
} }
int logerr(const char *s, ...) void logerr(const char *s, ...)
{ {
char timestr[40]; char timestr[40];
va_list args; va_list args;
@@ -276,7 +282,7 @@ int logerr(const char *s, ...)
va_end(args); va_end(args);
return 0; //return 0;
} }
#endif /* USE_SYSLOG */ #endif /* USE_SYSLOG */
@@ -284,6 +290,8 @@ int logerr(const char *s, ...)
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
bool slog_active = FALSE;
const char *log_getfilename(int whatfor) const char *log_getfilename(int whatfor)
{ {
const char *p = "/dev/null"; const char *p = "/dev/null";
@@ -292,25 +300,27 @@ const char *log_getfilename(int whatfor)
bool log_isopened(void) bool log_isopened(void)
{ {
return log_sl_opened; return slog_active;
} }
int log_open(const char *logname, const char *ext, const char *tty) int log_open(const char *logname, const char *ext, const char *tty)
{ {
char *p = "bforce"; char *p = "bforce ";
p = xstrcat(p, BF_VERSION);
int fac = conf_number(cf_syslog_facility); int fac = conf_number(cf_syslog_facility);
if( tty && *tty ) if( tty && *tty )
strncpy(tty, p, sizeof(p)); strncpy(p, tty, strlen(p));
openlog(p, LOG_PID, fac); openlog(p, LOG_PID, fac);
log_sl_opened = TRUE; slog_active = TRUE;
return 0; return 0;
} }
int log_reopen(const char *logname, const char *ext, const char *tty) int log_reopen(const char *logname, const char *ext, const char *tty)
{ {
if (!log_sl_opened) { if ( !slog_active ) {
return log_open(logname, ext, tty); return (log_reopen(logname, ext, tty));
} else return 0; } else
return 0;
} }
int log_close(void) int log_close(void)
@@ -321,7 +331,7 @@ int log_close(void)
} }
int log(const char *s, ...) void log(const char *s, ...)
{ {
char timestr[40]; char timestr[40];
@@ -348,10 +358,10 @@ int log(const char *s, ...)
va_end(args); va_end(args);
return 0; //return 0;
} }
int logerr(const char *s, ...) void logerr(const char *s, ...)
{ {
char timestr[40]; char timestr[40];
@@ -370,7 +380,7 @@ int logerr(const char *s, ...)
va_end(args); va_end(args);
return 0; // return 0;
} }
#endif /* USE_SYSLOG */ #endif /* USE_SYSLOG */
@@ -521,7 +531,7 @@ int debug_close(void)
return rc; return rc;
} }
int debug(unsigned long what, const char *str, ...) void debug(unsigned long what, const char *str, ...)
{ {
char buf[40]; char buf[40];
va_list args; va_list args;
@@ -534,7 +544,7 @@ int debug(unsigned long what, const char *str, ...)
debug_open(); debug_open();
} }
if( debug_fp ) if( debug_fp != NULL )
{ {
fprintf(debug_fp, "%s ", time_string_log(buf, sizeof(buf), 0)); fprintf(debug_fp, "%s ", time_string_log(buf, sizeof(buf), 0));
va_start(args, str); va_start(args, str);
@@ -545,7 +555,7 @@ int debug(unsigned long what, const char *str, ...)
} }
} }
return 0; //return 0;
} }
#endif /* DEBUG */ #endif /* DEBUG */
+2 -1
View File
@@ -243,7 +243,8 @@ void netspool_acknowledge(s_netspool_state *state)
void netspool_end(s_netspool_state *state) void netspool_end(s_netspool_state *state)
{ {
sendstr(state->socket, "END satisfied"); int i;
i = sendstr(state->socket, "END satisfied");
close(state->socket); close(state->socket);
state->state = NS_NOTINIT; state->state = NS_NOTINIT;
} }
+87 -14
View File
@@ -56,17 +56,24 @@ int nodelist_checkflag(const char *nodeflags, const char *flag)
const char *searchbase = nodeflags; const char *searchbase = nodeflags;
char *q; char *q;
while( p = strstr(searchbase, flag) ) DEB((D_NODELIST, "nodelist: checking flag \"%s\" in flags \"%s\"", flag, nodeflags));
{ if ( nodeflags ) {
if( p == searchbase || *(p-1) == ',' ) while( p = strcasestr(searchbase, flag) ) // p - found flag
{ {
if( (q = strchr(p, ',')) == NULL || (q - p) == strlen(flag) ) if( (p == searchbase) || (p != searchbase && *(p-1) == ',') )
return 0; {
if( (strchrnul(p, ':') - p) == strlen(flag) ) if( (q = strchr(p, ',')) == NULL || (q - p) == strlen(flag) ) {
return 0; DEB((D_NODELIST, "nodelist: found flag %s", flag));
} return 0;
}
if( (strchrnul(p, ':') - p) == strlen(flag) ) {
DEB((D_NODELIST, "nodelist: found flag %s", flag));
return 0;
}
}
searchbase = p + 1; // avoid finding again the same searchbase = p + 1; // avoid finding again the same
}
} }
return 1; return 1;
@@ -191,6 +198,54 @@ int nodelist_parse_Txy(s_node *node, const char *xy)
return 0; return 0;
} }
/*****************************************************************************
* Pointlist string parser
*
* Arguments:
* node put here all obtained information
* str pointer to the nodelist string
*
* Return value:
* zero value if string was parsed successfuly, and non-zero if wasn't
*/
int nodelist_parsepoint(s_node *node, char *str)
{
char *argv[NODELIST_POSFLAGS+1];
char *p;
int cnt;
DEB((D_NODELIST,"nodelist: parsepoint %s", str));
cnt = string_parse(argv, NODELIST_POSFLAGS+1, str, ',');
if( cnt < NODELIST_POSFLAGS-1 )
return -1;
DEB((D_NODELIST,"nodelist: parsepoint OK: %d", cnt));
strnxcpy(node->name, argv[NODELIST_POSNAME], sizeof(node->name));
DEB((D_NODELIST,"nodelist: parsepoint sys: %s", node->name));
strnxcpy(node->location, argv[NODELIST_POSLOCATION], sizeof(node->location));
DEB((D_NODELIST,"nodelist: parsepoint loc: %s", node->location));
strnxcpy(node->sysop, argv[NODELIST_POSSYSOP], sizeof(node->sysop));
DEB((D_NODELIST,"nodelist: parsepoint zyz: %s", node->sysop));
strnxcpy(node->phone, argv[NODELIST_POSPHONE], sizeof(node->phone));
DEB((D_NODELIST,"nodelist: parsepoint pho: %s", node->phone));
if (argv[NODELIST_POSFLAGS])
strnxcpy(node->flags, argv[NODELIST_POSFLAGS], sizeof(node->flags));
DEB((D_NODELIST,"nodelist: parsepoint fl: %s", node->flags));
if (argv[NODELIST_POSSPEED])
node->speed = atoi(argv[NODELIST_POSSPEED]);
DEB((D_NODELIST, "nodelist: Parsed common values SYS: %s, ZYZ: %s, LOC: %s, PHONE: %s", node->name, node->sysop, node->location, node->phone));
/*
* Replace all '_' by space character
*/
string_replchar(node->name, '_', ' ');
string_replchar(node->location, '_', ' ');
string_replchar(node->sysop, '_', ' ');
node->keyword = KEYWORD_POINT;
return 0;
}
/***************************************************************************** /*****************************************************************************
* Nodelist string parser * Nodelist string parser
* *
@@ -205,7 +260,7 @@ int nodelist_parsestring(s_node *node, char *str)
{ {
char *argv[NODELIST_POSFLAGS+1]; char *argv[NODELIST_POSFLAGS+1];
char *p; char *p;
DEB((D_NODELIST,"nodelist: parsestring %s", str));
if( string_parse(argv, NODELIST_POSFLAGS+1, str, ',') != NODELIST_POSFLAGS+1 ) if( string_parse(argv, NODELIST_POSFLAGS+1, str, ',') != NODELIST_POSFLAGS+1 )
return -1; return -1;
@@ -243,7 +298,7 @@ int nodelist_parsestring(s_node *node, char *str)
strnxcpy(node->phone, argv[NODELIST_POSPHONE], sizeof(node->phone)); strnxcpy(node->phone, argv[NODELIST_POSPHONE], sizeof(node->phone));
strnxcpy(node->flags, argv[NODELIST_POSFLAGS], sizeof(node->flags)); strnxcpy(node->flags, argv[NODELIST_POSFLAGS], sizeof(node->flags));
node->speed = atoi(argv[NODELIST_POSSPEED]); node->speed = atoi(argv[NODELIST_POSSPEED]);
DEB((D_NODELIST, "nodelist: Parsed common values SYS: %s, ZYZ: %s, LOC: %s, PHONE: %s", node->name, node->sysop, node->location, node->phone));
/* /*
* Replace all '_' by space character * Replace all '_' by space character
*/ */
@@ -291,8 +346,11 @@ int nodelist_parsestring(s_node *node, char *str)
node->do_ifcico = nodelist_checkflag(node->flags, "IFC") == 0; node->do_ifcico = nodelist_checkflag(node->flags, "IFC") == 0;
node->do_telnet = nodelist_checkflag(node->flags, "ITN") == 0; node->do_telnet = nodelist_checkflag(node->flags, "ITN") == 0;
//TODO: Add more INA flags to array
nodelist_flagvalue(node->flags, "INA", node->host); nodelist_flagvalue(node->flags, "INA", node->host);
DEB((D_NODELIST, "nodelist: Parsed inet values IBN: %d, IFC: %d, ITN: %d, INA: %s", node->do_binkp, node->do_ifcico, node->do_telnet, node->host));
return 0; return 0;
} }
@@ -661,6 +719,7 @@ int nodelist_lookup_string(char *buffer, size_t buflen, s_faddr addr)
*/ */
for( ptrl = conf_first(cf_nodelist); ptrl; ptrl = conf_next(ptrl) ) for( ptrl = conf_first(cf_nodelist); ptrl; ptrl = conf_next(ptrl) )
{ {
DEB((D_NODELIST,"nl_lookup_string: using %s",ptrl->d.falist.what));
if( ftn_addrcomp_mask(addr, ptrl->d.falist.addr) == 0 ) if( ftn_addrcomp_mask(addr, ptrl->d.falist.addr) == 0 )
{ {
if( (nlp = nodelist_open(ndldir, ptrl->d.falist.what, NODELIST_READ)) ) if( (nlp = nodelist_open(ndldir, ptrl->d.falist.what, NODELIST_READ)) )
@@ -691,10 +750,24 @@ int nodelist_lookup(s_node *node, s_faddr addr)
if( nodelist_lookup_string(buf, sizeof(buf), addr) == 0 ) if( nodelist_lookup_string(buf, sizeof(buf), addr) == 0 )
{ {
node->listed = TRUE; node->listed = TRUE;
if( nodelist_parsestring(node, buf) == -1 ) if (addr.point == 0)
{ {
log("invalid nodelist string for address %s", if( nodelist_parsestring(node, buf) == -1 )
ftn_addrstr(abuf, addr)); {
DEB((D_NODELIST,"invalid nodelist string for address %s",
ftn_addrstr(abuf, addr)));
log("invalid nodelist string for address %s",
ftn_addrstr(abuf, addr));
}
} else {
if ( nodelist_parsepoint(node, buf) == -1 )
{
DEB((D_NODELIST,"invalid nodelist string for address %s",
ftn_addrstr(abuf, addr)));
log("invalid nodelist string for address %s",
ftn_addrstr(abuf, addr));
}
node->addr = addr;
} }
return 0; return 0;
} }
+20 -12
View File
@@ -74,16 +74,17 @@ int exec_options_parse(char *str)
void exec_options_init(s_exec_options *eopt) void exec_options_init(s_exec_options *eopt)
{ {
int i = 0; int i = 0;
memset(eopt, '\0', sizeof(s_exec_options)); memset(eopt, '\0', sizeof(s_exec_options));
eopt->umask = EXEC_DEFAULT_UMASK; eopt->umask = EXEC_DEFAULT_UMASK;
eopt->envp[0] = NULL; eopt->envp[0] = NULL;
i = 0;
while(mainenv[i]) { while(mainenv[i]) {
DEB((D_FREE, "EXEC: Added ENV variable: %s\n", mainenv[i])); DEB((D_FREE,"EXEC: Added ENV variable: %s\n", mainenv[i]));
eopt->envp[i] = xmalloc(strlen(mainenv[i]) + 2); eopt->envp[i] = xmalloc(strlen(mainenv[i]) + 2);
sprintf(eopt->envp[i], mainenv[i]); strcpy(eopt->envp[i],mainenv[i]);
eopt->envp[++i] = NULL; eopt->envp[++i] = NULL;
} }
} }
void exec_options_deinit(s_exec_options *eopt) void exec_options_deinit(s_exec_options *eopt)
@@ -109,7 +110,6 @@ void exec_env_add(s_exec_options *eopt, const char *name, const char *value)
{ {
eopt->envp[i] = xmalloc(strlen(name) + strlen(value) + 2); eopt->envp[i] = xmalloc(strlen(name) + strlen(value) + 2);
sprintf(eopt->envp[i], "%s=%s", name, value); sprintf(eopt->envp[i], "%s=%s", name, value);
DEB((D_FREE, "EXEC: Added ENV variable: %s=%s\n", name, value));
eopt->envp[i+1] = NULL; eopt->envp[i+1] = NULL;
} }
} }
@@ -152,10 +152,11 @@ int exec_redirect_descriptor(int desc, const char *fname, int flags)
{ {
log("exec error: cannot open \"%s\" <--> %d (got %d)", log("exec error: cannot open \"%s\" <--> %d (got %d)",
fname, desc, fd); fname, desc, fd);
close(fd);
return -1; return -1;
} }
return 0; return 0; //cppcheck-suppress resourceLeak
} }
int exec_command(s_exec_options *eopt) int exec_command(s_exec_options *eopt)
@@ -329,7 +330,8 @@ int xsystem(const char *command, const char *p_input, const char *p_output)
{ {
pid_t pid; pid_t pid;
int status; int status;
int fd;
ASSERT(command != NULL); ASSERT(command != NULL);
DEB((D_INFO, "xsystem: command \"%s\", input \"%s\", output \"%s\"", DEB((D_INFO, "xsystem: command \"%s\", input \"%s\", output \"%s\"",
@@ -342,27 +344,33 @@ int xsystem(const char *command, const char *p_input, const char *p_output)
if( p_input ) if( p_input )
{ {
close(0); close(0);
if( open(p_input, O_RDONLY) != 0 ) fd = open(p_input, O_RDONLY);
if( fd != 0 )
{ {
logerr("can't open stdin \"%s\"", p_input); logerr("can't open stdin \"%s\"", p_input);
close(fd);
exit(-1); exit(-1);
} }
} }
if( p_output ) if( p_output )
{ {
close(1); close(1);
if( open(p_output, O_WRONLY|O_APPEND|O_CREAT, 0600) != 1 ) fd = open(p_output, O_WRONLY|O_APPEND|O_CREAT, 0600);
if( fd != 1 )
{ {
logerr("can't open stdout \"%s\"", p_output); logerr("can't open stdout \"%s\"", p_output);
close(fd);
exit(-1); exit(-1);
} }
} }
if( p_output ) if( p_output )
{ {
close(2); close(2);
if( open(p_output, O_WRONLY|O_APPEND|O_CREAT, 0600) != 2 ) fd = open(p_output, O_WRONLY|O_APPEND|O_CREAT, 0600);
if( fd != 2 )
{ {
logerr("can't open stderr \"%s\"", p_output); logerr("can't open stderr \"%s\"", p_output);
close(fd);
exit(-1); exit(-1);
} }
} }
+8
View File
@@ -31,6 +31,7 @@ int out_filetype(const char *fname)
else else
p_nam = fname; p_nam = fname;
DEB((D_EVENT, "outb_fsqueue: getting type of file %s", p_nam));
/* /*
* Get file name extension * Get file name extension
*/ */
@@ -39,12 +40,19 @@ int out_filetype(const char *fname)
for( i = 0; outtab[i].ext; i++ ) for( i = 0; outtab[i].ext; i++ )
if( strcasemask(p_ext, outtab[i].ext) == 0 ) if( strcasemask(p_ext, outtab[i].ext) == 0 )
{
DEB((D_EVENT, "outb_fsqueue: got type %d from outtab ext %s", outtab[i].type, p_ext ));
return outtab[i].type; return outtab[i].type;
}
for( i = 0; exttab[i].ext; i++ ) for( i = 0; exttab[i].ext; i++ )
if( strcasemask(p_ext, exttab[i].ext) == 0 ) if( strcasemask(p_ext, exttab[i].ext) == 0 )
{
DEB((D_EVENT, "outb_fsqueue: got type %d from exttab ext %s", exttab[i].type, p_ext ));
return exttab[i].type; return exttab[i].type;
}
DEB((D_EVENT, "outb_fsqueue: got type UNKNOWN", exttab[i].type, p_ext ));
return TYPE_UNKNOWN; return TYPE_UNKNOWN;
} }
+4 -4
View File
@@ -46,7 +46,7 @@ char *out_getname_4d(s_faddr addr)
else else
sprintf(buf, "%04x%04x.pnt/%08x", addr.net, addr.node, addr.point); sprintf(buf, "%04x%04x.pnt/%08x", addr.net, addr.node, addr.point);
dest = string_concat(p_outbound, buf, NULL); dest = string_concat(p_outbound, buf, '\0');
} }
else else
{ {
@@ -55,7 +55,7 @@ char *out_getname_4d(s_faddr addr)
else else
sprintf(buf, ".%03x/%04x%04x.pnt/%08x", addr.zone, addr.net, addr.node, addr.point); sprintf(buf, ".%03x/%04x%04x.pnt/%08x", addr.zone, addr.net, addr.node, addr.point);
dest = string_concat(out_root, out_main, buf, NULL); dest = string_concat(out_root, out_main, buf, '\0');
} }
} }
@@ -83,7 +83,7 @@ char *out_getname_domain(s_faddr addr)
else else
sprintf(buf, "%04x%04x.pnt/%08x", addr.net, addr.node, addr.point); sprintf(buf, "%04x%04x.pnt/%08x", addr.net, addr.node, addr.point);
dest = string_concat(cfptr->d.domain.path, buf, NULL); dest = string_concat(cfptr->d.domain.path, buf, '\0');
break; break;
} }
} }
@@ -102,7 +102,7 @@ char *out_getname_amiga(s_faddr addr)
if( p_amigaoutbound && *p_amigaoutbound ) if( p_amigaoutbound && *p_amigaoutbound )
{ {
sprintf(buf, "%d.%d.%d.%d", addr.zone, addr.net, addr.node, addr.point); sprintf(buf, "%d.%d.%d.%d", addr.zone, addr.net, addr.node, addr.point);
dest = string_concat(p_amigaoutbound, buf, NULL); dest = string_concat(p_amigaoutbound, buf, '\0');
} }
return dest; return dest;
+7 -7
View File
@@ -155,7 +155,7 @@ static int out_scan_bso_dir(s_outbound_callback_data *callback,
if( alst || !fa_list ) if( alst || !fa_list )
{ {
p = string_concat(path, dirent->d_name, "/", NULL); p = string_concat(path, dirent->d_name, "/", '\0');
out_scan_bso_dir(callback, fa_list, addr, p, 1); out_scan_bso_dir(callback, fa_list, addr, p, 1);
if( p ) { free(p); p = NULL; } if( p ) { free(p); p = NULL; }
} }
@@ -178,7 +178,7 @@ static int out_scan_bso_dir(s_outbound_callback_data *callback,
if( alst || !fa_list ) if( alst || !fa_list )
{ {
callback->path = string_concat(path, dirent->d_name, NULL); callback->path = string_concat(path, dirent->d_name, '\0');
callback->addr = *addr; callback->addr = *addr;
callback->type = OUTB_TYPE_BSO; callback->type = OUTB_TYPE_BSO;
callback->flavor = -1; callback->flavor = -1;
@@ -250,7 +250,7 @@ static int out_scan_bso(s_outbound_callback_data *callback,
if( alst || mailfor == NULL ) if( alst || mailfor == NULL )
{ {
newpath = string_concat(out_root, dirent->d_name, "/", NULL); newpath = string_concat(out_root, dirent->d_name, "/", '\0');
out_scan_bso_dir(callback, mailfor, &addr, newpath, 0); out_scan_bso_dir(callback, mailfor, &addr, newpath, 0);
free(newpath); free(newpath);
} }
@@ -296,7 +296,7 @@ static int out_scan_fbox_dir(s_outbound_callback_data *callback,
while( (dirent = readdir(dir)) ) while( (dirent = readdir(dir)) )
{ {
callback->path = string_concat(path, dirent->d_name, NULL); callback->path = string_concat(path, dirent->d_name, '\0');
if( is_regfile(callback->path) ) if( is_regfile(callback->path) )
{ {
callback->addr = addr; callback->addr = addr;
@@ -340,7 +340,7 @@ static int out_scan_lbox(s_outbound_callback_data *callback,
alst = alst->next ); alst = alst->next );
if( alst ) if( alst )
{ {
newpath = string_concat(path, dirent->d_name, "/", NULL); newpath = string_concat(path, dirent->d_name, "/", '\0');
(void)out_scan_fbox_dir(callback, newpath, addr, FLAVOR_HOLD); (void)out_scan_fbox_dir(callback, newpath, addr, FLAVOR_HOLD);
free(newpath); free(newpath);
} }
@@ -348,7 +348,7 @@ static int out_scan_lbox(s_outbound_callback_data *callback,
else else
{ {
/* Scan all fileboxes */ /* Scan all fileboxes */
newpath = string_concat(path, dirent->d_name, "/", NULL); newpath = string_concat(path, dirent->d_name, "/", '\0');
(void)out_scan_fbox_dir(callback, newpath, addr, FLAVOR_HOLD); (void)out_scan_fbox_dir(callback, newpath, addr, FLAVOR_HOLD);
free(newpath); free(newpath);
} }
@@ -424,7 +424,7 @@ static int out_scan_aso(s_outbound_callback_data *callback,
if( alst || !mailfor ) if( alst || !mailfor )
{ {
callback->path = string_concat(path, dirent->d_name, NULL); callback->path = string_concat(path, dirent->d_name, '\0');
callback->addr = addr; callback->addr = addr;
callback->type = OUTB_TYPE_ASO; callback->type = OUTB_TYPE_ASO;
callback->flavor = -1; callback->flavor = -1;
+159 -102
View File
@@ -95,18 +95,18 @@ int binkp_loop(s_binkp_state *bstate) {
bstate->emptyloop = 0; bstate->emptyloop = 0;
bstate->continuesend = false; bstate->continuesend = false;
unsigned short read_pos=0; uint16_t read_pos=0;
unsigned short read_blklen=0; uint16_t read_blklen=0;
unsigned short want_read=BINKP_HEADER; uint16_t want_read=BINKP_HEADER;
unsigned short write_pos=0; uint16_t write_pos=0;
unsigned short have_to_write=0; uint16_t have_to_write=0;
int n, m; int n, m;
bool no_more_to_send = false; bool no_more_to_send = false;
bool no_more_read = false; bool no_more_read = false;
bool canread, canwrite; bool canread, canwrite;
int timeout = conf_number(cf_binkp_timeout); int timeout = conf_number(cf_binkp_timeout);
if( timeout==0 ) if( timeout==0 )
timeout = 60; timeout = 60;
@@ -117,13 +117,14 @@ int binkp_loop(s_binkp_state *bstate) {
// session criterium handshake criterium // session criterium handshake criterium
while (!bstate->complete || bstate->waiting_got) { while (!bstate->complete || bstate->waiting_got) {
DEB((D_24554, "loop s: %d r: %d p: %d sp: %d", bstate->batchsendcomplete, bstate->batchreceivecomplete, DEB((D_24554, ">>> BinkP loop sendcpl: %d recvcpl: %d phase: %d subphase: %d", bstate->batchsendcomplete, bstate->batchreceivecomplete,
bstate->phase, bstate->subphase)); bstate->phase, bstate->subphase));
if (bstate->continuesend) { if (bstate->continuesend) {
no_more_to_send = false; no_more_to_send = false;
bstate->continuesend = false; bstate->continuesend = false;
} }
if (have_to_write==0 && (!no_more_to_send || bstate->extracmd[0]!=-1)) {
if (have_to_write==0 && (!no_more_to_send || bstate->extracmd[0]!=(char)-1)) {
m = binkp_getforsend(bstate, writebuf+BINKP_HEADER, &block_type, &block_length); m = binkp_getforsend(bstate, writebuf+BINKP_HEADER, &block_type, &block_length);
if(m==1 || m==3) { if(m==1 || m==3) {
//DEB((D_24554, "got block for sending %d %hu", block_type, block_length)); //DEB((D_24554, "got block for sending %d %hu", block_type, block_length));
@@ -139,6 +140,7 @@ int binkp_loop(s_binkp_state *bstate) {
return PRC_ERROR; return PRC_ERROR;
} }
writebuf[1] = block_length&0xff; writebuf[1] = block_length&0xff;
// TODO: FIX unprotected mode
if (bstate->mode==bmode_transfer && bstate->remote_data->options&BINKP_OPT_CRYPT) if (bstate->mode==bmode_transfer && bstate->remote_data->options&BINKP_OPT_CRYPT)
encrypt_buf(writebuf, have_to_write, bstate->remote_data->keys_out); encrypt_buf(writebuf, have_to_write, bstate->remote_data->keys_out);
} }
@@ -208,15 +210,19 @@ int binkp_loop(s_binkp_state *bstate) {
log("read: remote socket shutdown"); log("read: remote socket shutdown");
return PRC_REMOTEABORTED; return PRC_REMOTEABORTED;
} }
if (bstate->mode==bmode_transfer && bstate->remote_data->options & BINKP_OPT_CRYPT) // TODO: FIX unprotected mode
if (bstate->mode==bmode_transfer && bstate->remote_data->options & BINKP_OPT_CRYPT) {
decrypt_buf(readbuf+read_pos, n, bstate->remote_data->keys_in); decrypt_buf(readbuf+read_pos, n, bstate->remote_data->keys_in);
} else {
DEB((D_24554,"binkp: not encripted transfer"));
};
DEB((D_24554, "got %d bytes", n)); DEB((D_24554, "got %d bytes", n));
want_read -= n; want_read -= n;
read_pos += n; read_pos += n;
if (read_pos == BINKP_HEADER) { if (read_pos == BINKP_HEADER) {
// have read header, want read body // have read header, want read body
DEB((D_24554, "it should be 0: %d", want_read)); DEB((D_24554, "it should be 0: %d", want_read));
want_read = ((unsigned short)(readbuf[0]&0x7F)<<8) | readbuf[1]; want_read = ((uint16_t)(readbuf[0]&0x7F)<<8) | (uint16_t)readbuf[1];
DEB((D_24554, "got block header, block length %u", want_read)); DEB((D_24554, "got block header, block length %u", want_read));
} // no else here: if want_read may be zero here for zero length block } // no else here: if want_read may be zero here for zero length block
} }
@@ -227,6 +233,7 @@ int binkp_loop(s_binkp_state *bstate) {
block_length = read_pos - BINKP_HEADER; block_length = read_pos - BINKP_HEADER;
DEB((D_24554, "binkp: complete block is received %d %hu", block_type, block_length)); DEB((D_24554, "binkp: complete block is received %d %hu", block_type, block_length));
m = binkp_doreceiveblock(bstate, readbuf+BINKP_HEADER, block_type, block_length); m = binkp_doreceiveblock(bstate, readbuf+BINKP_HEADER, block_type, block_length);
DEB((D_24554, "binkp: dorecieveblock result is %d", m));
if(m==1) { if(m==1) {
DEB((D_24554, "block is successfully accepted")); DEB((D_24554, "block is successfully accepted"));
read_pos = 0; read_pos = 0;
@@ -267,6 +274,7 @@ int binkp_loop(s_binkp_state *bstate) {
have_to_write -= n; have_to_write -= n;
} }
} }
DEB((D_24554,"+++ BinkP Loop ended with rc=%d", bstate->rc));
return bstate->rc; return bstate->rc;
} }
@@ -338,8 +346,8 @@ int binkp_getforsend(s_binkp_state *bstate, char *buf, int *block_type, unsigned
{ {
int my_sf, wr_pos; int my_sf, wr_pos;
int n; // read file int n; // read file
if (bstate->extracmd[0]!=-1) { if (bstate->extracmd[0]!=(char)-1) {
DEB((D_24554, "send command from receiver %d %s", bstate->extracmd[0], bstate->extracmd+1)); DEB((D_24554, "Send cmd to remote %d %s", bstate->extracmd[0], bstate->extracmd+1));
buf[0] = bstate->extracmd[0]; buf[0] = bstate->extracmd[0];
strcpy(buf+1, bstate->extracmd+1); strcpy(buf+1, bstate->extracmd+1);
*block_type = BINKP_BLK_CMD; *block_type = BINKP_BLK_CMD;
@@ -417,6 +425,7 @@ case 7:
// seems not to remove files from inbound until successful session end is enough to eliminate dupes // seems not to remove files from inbound until successful session end is enough to eliminate dupes
// if (!nodelist_checkflag (state.node.flags, "ND")) // if (!nodelist_checkflag (state.node.flags, "ND"))
// strcat(buf+1, " ND"); // strcat(buf+1, " ND");
// TODO: add GZ BZ2 and maybe EXTCMD
*block_length = 1 + strlen(buf+1); *block_length = 1 + strlen(buf+1);
DEB((D_24554, "send M_NUL %s", buf+1)); DEB((D_24554, "send M_NUL %s", buf+1));
return 1; return 1;
@@ -460,8 +469,10 @@ case 2:
case 3: // send password on outgoing or pw confirmation on incoming case 3: // send password on outgoing or pw confirmation on incoming
// special empty password is sent if there is no password for the remote addr // special empty password is sent if there is no password for the remote addr
if (bstate->mode==bmode_incoming_handshake) { if (bstate->mode==bmode_incoming_handshake)
if (bstate->password_received) { {
if (bstate->password_received)
{
DEB((D_24554, "send OK, password verified")); DEB((D_24554, "send OK, password verified"));
buf[0] = BPMSG_OK; buf[0] = BPMSG_OK;
*block_type = BINKP_BLK_CMD; *block_type = BINKP_BLK_CMD;
@@ -472,69 +483,99 @@ case 3: // send password on outgoing or pw confirmation on incoming
DEB((D_24554, "waiting for password from remote")); DEB((D_24554, "waiting for password from remote"));
return 0; // nothing to send return 0; // nothing to send
} }
else if (bstate->mode==bmode_outgoing_handshake) { else
if (!bstate->address_established) { {
DEB((D_24554, "address not received still")); if (!bstate->address_established)
return 0; {
} DEB((D_24554, "address not received still"));
DEB((D_24554, "send password")); return 0;
}
DEB((D_24554, "send password"));
buf[0] = BPMSG_PWD; buf[0] = BPMSG_PWD;
*block_type = BINKP_BLK_CMD; *block_type = BINKP_BLK_CMD;
if( bstate->local_data->passwd[0] == '\0' ) { if( bstate->local_data->passwd[0] == '\0' )
*block_length = 1 + sprintf(buf+1, "-"); {
} *block_length = 1 + sprintf(buf+1, "-");
else if( bstate->remote_data->options & BINKP_OPT_MD5 ) { }
char digest_bin[16]; else
char digest_hex[33]; if( bstate->remote_data->options & BINKP_OPT_MD5 )
{
if(bstate->remote_data->challenge_length==0) { char digest_bin[16];
DEB((D_24554, "waiting for challenge")); char digest_hex[33];
return 0;
if(bstate->remote_data->challenge_length==0)
{
DEB((D_24554, "waiting for challenge"));
return 0;
}
md5_cram_get(bstate->local_data->passwd,
bstate->remote_data->challenge,
bstate->remote_data->challenge_length,
digest_bin);
/* Encode digest to the hex string */
string_bin_to_hex(digest_hex, digest_bin, 16);
*block_length = 1 + sprintf(buf+1,
"CRAM-MD5-%s", digest_hex);
}
else
{
*block_length = 1 + sprintf(buf+1, "%s", bstate->local_data->passwd);
}
bstate->phase += 1;
return 1;
} }
md5_cram_get(bstate->local_data->passwd, bstate->remote_data->challenge, return -1;
bstate->remote_data->challenge_length, digest_bin);
/* Encode digest to the hex string */
string_bin_to_hex(digest_hex, digest_bin, 16);
*block_length = 1 + sprintf(buf+1, "CRAM-MD5-%s", digest_hex);
}
else {
*block_length = 1 + sprintf(buf+1, "%s", bstate->local_data->passwd);
}
bstate->phase += 1;
return 1;
}
else {
log("impossible mode");
return -1;
}
case 4: case 4:
;
char pbuf[32];
int pwset = 0;
if (bstate->mode==bmode_incoming_handshake) { if (bstate->mode==bmode_incoming_handshake) {
char * p;
DEB((D_24554, "incoming handshake is complete")); DEB((D_24554, "incoming handshake is complete"));
bstate->complete = true; bstate->complete = true;
char *p;
char pbuf[32];
for (i=0;i<state.n_remoteaddr;i++) for (i=0;i<state.n_remoteaddr;i++)
if( !session_get_password(state.remoteaddrs[i].addr, pbuf, sizeof(pbuf)) ){ if( !session_get_password(state.remoteaddrs[i].addr, pbuf, sizeof(pbuf)) ){
init_keys(bstate->remote_data->keys_in, pbuf?pbuf:"-"); pwset = 1;
init_keys(bstate->remote_data->keys_in, pbuf[0]?pbuf:"-");
init_keys(bstate->remote_data->keys_out, "-"); init_keys(bstate->remote_data->keys_out, "-");
for (p=pbuf?pbuf:"-"; *p; p++) for (p=pbuf[0]?pbuf:"-"; *p; p++)
update_keys(bstate->remote_data->keys_out, (int)*p); update_keys(bstate->remote_data->keys_out, (int)*p);
} }
//TODO: FIX incoming options
} }
else { else {
//TODO: Fix outgoing options
DEB((D_24554, "outgoing handshake: everything is sent")); DEB((D_24554, "outgoing handshake: everything is sent"));
for (i=0;i<state.n_remoteaddr;i++)
if( !session_get_password(state.remoteaddrs[i].addr, pbuf, sizeof(pbuf)) ){
pwset = 1;
}
} }
// We have password-protected link. Remote options are already set,
// Now we determine how to CRYPT or not to CRYPT our file transfer
// Our CRYPT flag is always sent, so if the other side have CRYPT
// and link is password is set - The CRYPT must be
// Literally: if we have no pass -> drop the CRYPT flag
if ( !pwset ) {
DEB((D_24554, "binkp handshake: password NOT set, dropping CRYPT"));
bstate->remote_data->options &= !BINKP_OPT_CRYPT;
}
return 2; return 2;
} }
} }
else if (bstate->mode == bmode_transfer) { else if (bstate->mode == bmode_transfer) {
switch (bstate->phase) { switch (bstate->phase) {
send_next_file: send_next_file:
@@ -563,7 +604,7 @@ case 4:
case 1: //send M_FILE - M_GET forcibly sets this phase. M_GET must open needed file case 1: //send M_FILE - M_GET forcibly sets this phase. M_GET must open needed file
DEB((D_24554, "send M_FILE")); DEB((D_24554, "send M_FILE"));
buf[0] = BPMSG_FILE; buf[0] = BPMSG_FILE;
*block_length = 1+sprintf(buf+1, "%s %ld %ld 0", bstate->pi->send->net_name, *block_length = 1+sprintf(buf+1, "%s %zu %lu 0", bstate->pi->send->net_name,
bstate->pi->send->bytes_total, bstate->pi->send->mod_time); bstate->pi->send->bytes_total, bstate->pi->send->mod_time);
DEB((D_24554, "M_FILE: %s", buf+1)); DEB((D_24554, "M_FILE: %s", buf+1));
*block_type = BINKP_BLK_CMD; *block_type = BINKP_BLK_CMD;
@@ -625,7 +666,7 @@ case 4:
return 1; return 1;
case 5: case 5:
DEB((D_24554, "nothing to send")); DEB((D_24554, "BinkP_GetForSend: nothing to send"));
return 2; return 2;
@@ -649,7 +690,10 @@ bstate->extracmd[0] = BPMSG_ERR; strcpy(bstate->extracmd+1, msg); bstate->extrai
int binkp_doreceiveblock(s_binkp_state *bstate, char *buf, int block_type, unsigned short block_length) int binkp_doreceiveblock(s_binkp_state *bstate, char *buf, int block_type, unsigned short block_length)
{ {
DEB((D_24554, "dorecieveblock_type: %d", block_type));
DEB((D_24554, "dorecieveblock_bytes: %x %x %x %x", buf[0], buf[1], buf[2], buf[3]));
switch (block_type) { switch (block_type) {
case BINKP_BLK_CMD: case BINKP_BLK_CMD:
if (block_length<1) { if (block_length<1) {
PROTO_ERROR("Zero length command received") PROTO_ERROR("Zero length command received")
@@ -666,12 +710,11 @@ case BPMSG_ADR: /* List of addresses */
if (bstate->address_established) { if (bstate->address_established) {
PROTO_ERROR("remote tries to change address"); PROTO_ERROR("remote tries to change address");
} }
if( bstate->extracmd[0] !=-1 ) return 0; // suspend !!! if( bstate->extracmd[0] != (char)0xFF ) return 0; // suspend !!!
binkp_process_ADR(buf+1); binkp_process_ADR(buf+1);
if( !state.n_remoteaddr ) { if( !state.n_remoteaddr ) {
log("error: remote did not supplied any addresses"); log("error: remote did not supplied any addresses");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "No addresses was presented"); strcpy(bstate->extracmd+1, "No addresses was presented");
bstate->extraislast = true; bstate->extraislast = true;
@@ -685,14 +728,17 @@ case BPMSG_ADR: /* List of addresses */
bstate->extraislast = false; bstate->extraislast = false;
sprintf(bstate->extracmd+1,"OPT MB CRYPT"); sprintf(bstate->extracmd+1,"OPT MB CRYPT");
s_override ovr; s_override ovr;
DEB((D_24554, "process adr overrides"));
for(i = 0; i < state.n_remoteaddr; i++) { for(i = 0; i < state.n_remoteaddr; i++) {
ovr.sFlags = ""; ovr.sFlags = "";
override_get (&ovr, state.remoteaddrs[i].addr, 0); override_get (&ovr, state.remoteaddrs[i].addr, 0);
DEB((D_24554, "got adr overrides"));
if (nodelist_checkflag (ovr.sFlags, "NR")==0) { if (nodelist_checkflag (ovr.sFlags, "NR")==0) {
strcat (bstate->extracmd+1, " NR"); strcat (bstate->extracmd+1, " NR");
break; break;
} }
} }
DEB((D_24554, "process adr overrides"));
} }
// further use extracmd only for errors // further use extracmd only for errors
@@ -738,7 +784,7 @@ case BPMSG_PWD: /* Session password */
/* Do authorization */ /* Do authorization */
if( binkp_auth_incoming(bstate->remote_data) ) { if( binkp_auth_incoming(bstate->remote_data) ) {
log("error: invalid password"); log("error: invalid password");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if extra is occupied if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend if extra is occupied
bstate->extracmd[0] = BPMSG_ERR; bstate->extracmd[0] = BPMSG_ERR;
strcpy(bstate->extracmd+1, "Security violation"); strcpy(bstate->extracmd+1, "Security violation");
bstate->extraislast = true; bstate->extraislast = true;
@@ -747,7 +793,7 @@ case BPMSG_PWD: /* Session password */
// lock addresses // lock addresses
if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) ) { if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) ) {
log("error locking addresses of the remote"); log("error locking addresses of the remote");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if extra is occupied if( bstate->extracmd[0] != (char)0xFF ) return 0; // suspend if extra is occupied
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "All addresses are busy"); strcpy(bstate->extracmd+1, "All addresses are busy");
bstate->extraislast = true; bstate->extraislast = true;
@@ -768,6 +814,7 @@ case BPMSG_FILE: /* File information */
s_bpfinfo recvfi; s_bpfinfo recvfi;
if( binkp_parsfinfo(buf+1, &recvfi, true) ) { if( binkp_parsfinfo(buf+1, &recvfi, true) ) {
log ("M_FILE parse error: %s", buf + 1); log ("M_FILE parse error: %s", buf + 1);
DEB((D_24554, "M_FILE parse error: %s", buf + 1 ));
PROTO_ERROR("invalid M_FILE"); PROTO_ERROR("invalid M_FILE");
} }
bstate->batch_recv_count += 1; bstate->batch_recv_count += 1;
@@ -784,9 +831,9 @@ case BPMSG_FILE: /* File information */
return 1; return 1;
} }
DEB((D_24554, "no, skipping; TODO: accept it")); DEB((D_24554, "no, skipping; TODO: accept it"));
if( bstate->extracmd[0] != -1 ) return 0; if( bstate->extracmd[0] != (char)-1 ) return 0;
bstate->extracmd[0] = BPMSG_SKIP; bstate->extracmd[0] = BPMSG_SKIP;
sprintf(bstate->extracmd+1, "%s %ld %ld %ld", recvfi.fn, recvfi.sz, recvfi.tm); sprintf(bstate->extracmd+1, "%s %zu %lu %zu", recvfi.fn, recvfi.sz, recvfi.tm, recvfi.offs);
bstate->extraislast = false; bstate->extraislast = false;
return 1; return 1;
} }
@@ -796,7 +843,7 @@ case BPMSG_FILE: /* File information */
PROTO_ERROR("invalid mode for M_FILE"); PROTO_ERROR("invalid mode for M_FILE");
} }
if( bstate->extracmd[0] != -1 ) return 0; if( bstate->extracmd[0] != (char)-1 ) return 0;
switch(p_rx_fopen(bstate->pi, recvfi.fn, recvfi.sz, recvfi.tm, 0)) { switch(p_rx_fopen(bstate->pi, recvfi.fn, recvfi.sz, recvfi.tm, 0)) {
case 0: case 0:
if (bstate->pi->recv->bytes_skipped == recvfi.offs) { if (bstate->pi->recv->bytes_skipped == recvfi.offs) {
@@ -804,7 +851,7 @@ case 0:
bstate->frs = frs_data; bstate->frs = frs_data;
return 1; return 1;
} }
DEB((D_24554, "making M_GET to skip downloaded part")); DEB((D_24554, "making M_GET to skip downloaded part, file: %s, size %ld, time %ld, mode 0",recvfi.fn,recvfi.sz, recvfi.tm ));
bstate->extracmd[0] = BPMSG_GET; bstate->extracmd[0] = BPMSG_GET;
sprintf(bstate->extracmd+1, "%s %ld %ld %ld", sprintf(bstate->extracmd+1, "%s %ld %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
@@ -833,7 +880,7 @@ case 2:
default: default:
PROTO_ERROR("p_rx_fopen_error"); PROTO_ERROR("p_rx_fopen_error");
} }
PROTO_ERROR("never should get here"); // PROTO_ERROR("never should get here");
case BPMSG_OK: /* Password was acknowleged (data ignored) */ case BPMSG_OK: /* Password was acknowleged (data ignored) */
DEB((D_24554, "received M_OK len=%d", block_length)); DEB((D_24554, "received M_OK len=%d", block_length));
@@ -842,7 +889,7 @@ case BPMSG_OK: /* Password was acknowleged (data ignored) */
} }
if (session_addrs_lock(state.remoteaddrs, state.n_remoteaddr)) { if (session_addrs_lock(state.remoteaddrs, state.n_remoteaddr)) {
log("error: unable to lock"); log("error: unable to lock");
if (bstate->extracmd[0]!=-1) return 0; if (bstate->extracmd[0]!= (char)0xFF) return 0;
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "All addresses are busy"); strcpy(bstate->extracmd+1, "All addresses are busy");
bstate->extraislast = true; bstate->extraislast = true;
@@ -918,10 +965,10 @@ got_skip:
check_that_all_files_are_confirmed: check_that_all_files_are_confirmed:
{ {
int i; int j;
for (i = 0; i < bstate->pi->n_sentfiles; i++) { for (j = 0; j < bstate->pi->n_sentfiles; j++) {
if (bstate->pi->sentfiles[i].status == FSTAT_WAITACK) { if (bstate->pi->sentfiles[i].status == FSTAT_WAITACK) {
DEB((D_24554, "sent file %d waits for acknowlede", i)); DEB((D_24554, "sent file %d waits for acknowlede", j));
return 1; return 1;
} }
} }
@@ -952,7 +999,7 @@ case BPMSG_GET: /* Get a file from offset */
} }
DEB((D_24554, "M_GET file %s size %d time %d offset %d", getfi.fn, getfi.sz, getfi.tm, getfi.offs)); DEB((D_24554, "M_GET file %s size %d time %d offset %d", getfi.fn, getfi.sz, getfi.tm, getfi.offs));
if (bstate->extracmd[0] != -1) return 0; if (bstate->extracmd[0] != (char)0xFF) return 0;
if (bstate->pi->send) if (p_compfinfo(bstate->pi->send, getfi.fn, getfi.sz, getfi.tm)==0) { if (bstate->pi->send) if (p_compfinfo(bstate->pi->send, getfi.fn, getfi.sz, getfi.tm)==0) {
DEB((D_24554, "M_GET for currently transmitted file")); DEB((D_24554, "M_GET for currently transmitted file"));
@@ -1042,14 +1089,14 @@ case BINKP_BLK_DATA:
return 1; return 1;
} }
if (bstate->extracmd[0] != -1) return 0; if (bstate->extracmd[0] != (char)0xFF) return 0;
long int n; long int n;
n = p_rx_writefile(buf, block_length, bstate->pi); n = p_rx_writefile(buf, block_length, bstate->pi);
if( n < 0 ) { if( n < 0 ) {
log("error writing local file"); log("error writing local file");
if( n == -2 ) { if( n == (long int)-2 ) {
bstate->extracmd[0] = BPMSG_GOT; bstate->extracmd[0] = BPMSG_GOT;
sprintf(bstate->extracmd+1, "%s %ld %ld", bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, sprintf(bstate->extracmd+1, "%s %ld %ld", bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time); (long)bstate->pi->recv->mod_time);
@@ -1078,28 +1125,33 @@ case BINKP_BLK_DATA:
p_rx_fclose(bstate->pi); p_rx_fclose(bstate->pi);
PROTO_ERROR("extra data for file") PROTO_ERROR("extra data for file")
} }
else if( bstate->pi->recv->bytes_received == bstate->pi->recv->bytes_total ) { else if( bstate->pi->recv->bytes_received == bstate->pi->recv->bytes_total )
DEB((D_24554, "receive completed")); {
bstate->frs = frs_nothing; DEB((D_24554, "receive completed"));
bstate->pi->recv->status = FSTAT_SUCCESS; bstate->frs = frs_nothing;
if( !p_rx_fclose(bstate->pi) ) { bstate->pi->recv->status = FSTAT_SUCCESS;
bstate->extracmd[0] = BPMSG_GOT; if( !p_rx_fclose(bstate->pi) )
sprintf(bstate->extracmd+1, "%s %ld %ld", {
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, bstate->extracmd[0] = BPMSG_GOT;
(long)bstate->pi->recv->mod_time); sprintf(bstate->extracmd+1, "%s %ld %ld",
bstate->extraislast = false; bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
return 1; (long)bstate->pi->recv->mod_time);
} bstate->extraislast = false;
else { return 1;
DEB((D_24554, "some error committing file")); }
bstate->extracmd[0] = BPMSG_SKIP; else
sprintf(bstate->extracmd+1, "%s %ld %ld", {
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, DEB((D_24554, "some error committing file"));
(long)bstate->pi->recv->mod_time); bstate->extracmd[0] = BPMSG_SKIP;
bstate->extraislast = false; sprintf(bstate->extracmd+1, "%s %ld %ld",
return 1; bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
} (long)bstate->pi->recv->mod_time);
} else { bstate->extraislast = false;
return 1;
}
}
else
{
DEB((D_24554, "data block accepted")); DEB((D_24554, "data block accepted"));
return 1; return 1;
} }
@@ -1115,7 +1167,7 @@ default:
void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer) void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer)
{ {
char *p, *q;
if( strncmp(buffer, "SYS ", 4) == 0 ) if( strncmp(buffer, "SYS ", 4) == 0 )
strnxcpy(remote_data->systname, buffer+4, sizeof(remote_data->systname)); strnxcpy(remote_data->systname, buffer+4, sizeof(remote_data->systname));
@@ -1138,14 +1190,16 @@ void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer)
} }
else else
strnxcpy(remote_data->opt, buffer+4, sizeof(remote_data->opt)); strnxcpy(remote_data->opt, buffer+4, sizeof(remote_data->opt));
DEB((D_24554,"Process OPT"));
binkp_parse_options(remote_data, buffer+4); binkp_parse_options(remote_data, buffer+4);
} }
else if( strncmp(buffer, "VER ", 4) == 0 ) else if( strncmp(buffer, "VER ", 4) == 0 )
{ {
char *p;
/* <mailer> [<protocol>/<vermaj>.<vermin>] */ /* <mailer> [<protocol>/<vermaj>.<vermin>] */
if( (p = strchr(buffer+4, ' ')) ) if( (p = strchr(buffer+4, ' ')) )
{ {
char *q;
strnxcpy(remote_data->progname, buffer+4, strnxcpy(remote_data->progname, buffer+4,
MIN(sizeof(remote_data->progname), p - (buffer+4) + 1)); MIN(sizeof(remote_data->progname), p - (buffer+4) + 1));
++p; ++p;
@@ -1179,13 +1233,16 @@ void binkp_process_ADR(char *buffer)
{ {
s_faddr addr; s_faddr addr;
char *p, *q; char *p, *q;
DEB((D_24554, "process ADR: %s", buffer));
for( p = string_token(buffer, &q, NULL, 0); p; p = string_token(NULL, &q, NULL, 0) ) for( p = string_token(buffer, &q, NULL, 0); p; p = string_token(NULL, &q, NULL, 0) )
{ {
DEB((D_24554, "binkp_process_ADR got token \"%s\" ",p ));
if( ftn_addrparse(&addr, p, FALSE) ) if( ftn_addrparse(&addr, p, FALSE) )
log("BinkP got unparsable address \"%s\"", string_printable(p)); log("BinkP got unparsable address \"%s\"", string_printable(p));
else else {
session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr); session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr);
DEB((D_24554, "process ADR complete"));
}
} }
} }
+2 -2
View File
@@ -45,7 +45,7 @@ int binkp_parsfinfo(const char *str, s_bpfinfo *fi, bool with_offset)
return -1; return -1;
} }
DEB((D_24554, "info to parse: %s", str)); DEB((D_24554, "info to parse: %s", str));
r = sscanf(str, with_offset? "%s %d %d %d": "%s %d %d", &fi->fn, &fi->sz, &fi->tm, &fi->offs); r = sscanf(str, with_offset? "%s %ld %ld %ld": "%s %ld %ld", &fi->fn, &fi->sz, &fi->tm, &fi->offs);
chkslash = fi->fn; chkslash = fi->fn;
while (1) { while (1) {
chkslash = strchr(chkslash, '/'); chkslash = strchr(chkslash, '/');
@@ -304,7 +304,7 @@ void binkp_set_sysinfo(s_binkp_sysinfo *binkp, s_faddr *remote_addr, bool caller
void binkp_parse_options(s_binkp_sysinfo *binkp, char *options) void binkp_parse_options(s_binkp_sysinfo *binkp, char *options)
{ {
char *p, *n; char *p, *n;
DEB((D_24554,"binkp: parse_options: %s", options));
for( p = string_token(options, &n, NULL, 0); p; for( p = string_token(options, &n, NULL, 0); p;
p = string_token(NULL, &n, NULL, 0) ) p = string_token(NULL, &n, NULL, 0) )
{ {
+13 -6
View File
@@ -43,11 +43,11 @@ const char *Protocols[] =
static int prot_get_next_file(s_filelist **dest, s_protinfo *pi) static int prot_get_next_file(s_filelist **dest, s_protinfo *pi)
{ {
DEB((D_OUTBOUND, "prot_get_next_file")); // %s %d", hint->fn, hint->sz); DEB((D_OUTBOUND, "prot_get_next_file")); // %s %d", hint->fn, hint->sz);
s_filelist *ptrl = NULL; s_filelist *ptrl = NULL;
s_filelist *best = NULL; s_filelist *best = NULL;
s_fsqueue *q = &state.queue; s_fsqueue *q = &state.queue;
s_filehint *hint = NULL; // M_GET hinting does not work good here as it spec net_name and it is unknown here (especially for PKTs) s_filehint *hint = NULL; // M_GET hinting does not work good here as it spec net_name and it is unknown here (especially for PKTs)
*dest = NULL; *dest = NULL;
@@ -296,10 +296,10 @@ get_next_file:
pi->send_left_num -= 1; pi->send_left_num -= 1;
pi->send_left_size -= ptrl->size; pi->send_left_size -= ptrl->size;
if( pi->send_left_size < 0 ) //if( pi->send_left_size < 0 )
pi->send_left_size = 0; // pi->send_left_size = 0;
if( pi->send_left_num < 0 ) if( pi->send_left_num < 0 )
pi->send_left_num = 0; pi->send_left_num = 0;
DEB((D_PROT, "p_tx_fopen: now opening \"%s\"", ptrl->fname)); DEB((D_PROT, "p_tx_fopen: now opening \"%s\"", ptrl->fname));
@@ -415,6 +415,7 @@ int p_tx_rewind(s_protinfo *pi, size_t pos)
void prot_traffic_update(s_traffic *traf, size_t size, int xtime, int type) void prot_traffic_update(s_traffic *traf, size_t size, int xtime, int type)
{ {
DEB((D_EVENT, "prot_common: Adding type %d with size %ld to stats", type, size));
if( type & TYPE_REQANSW ) if( type & TYPE_REQANSW )
{ {
traf->freqed_size += size; traf->freqed_size += size;
@@ -433,6 +434,10 @@ void prot_traffic_update(s_traffic *traf, size_t size, int xtime, int type)
traf->arcmail_time += xtime; traf->arcmail_time += xtime;
traf->arcmail_num++; traf->arcmail_num++;
} }
else if( type & TYPE_TICFILE )
{
traf->ticfile_num++;
}
else else
{ {
traf->files_size += size; traf->files_size += size;
@@ -860,6 +865,8 @@ int p_rx_fopen(s_protinfo *pi, char *fn, size_t sz, time_t tm, mode_t mode)
size_t minfree = 0; size_t minfree = 0;
size_t needed_bytes_total = 0; size_t needed_bytes_total = 0;
DEB((D_FREE, "P_RX_FOPEN: File: %s, Size: %ld", fn, sz));
/* /*
* Check. May be we are receiving this file allready * Check. May be we are receiving this file allready
*/ */
@@ -1046,7 +1053,7 @@ int p_rx_fopen(s_protinfo *pi, char *fn, size_t sz, time_t tm, mode_t mode)
/* /*
* Check, there is enough space in our inbound * Check, there is enough space in our inbound
*/ */
if (openmode == "a") needed_bytes_total = minfree + pi->recv->bytes_total - pi->recv->bytes_skipped; if ( strcmp(openmode, "a") == 0 ) needed_bytes_total = minfree + pi->recv->bytes_total - pi->recv->bytes_skipped;
else needed_bytes_total = minfree + pi->recv->bytes_total; else needed_bytes_total = minfree + pi->recv->bytes_total;
if( minfree > 0 && getfreespace(state.inbound) < needed_bytes_total ) if( minfree > 0 && getfreespace(state.inbound) < needed_bytes_total )
+24 -2
View File
@@ -449,8 +449,8 @@ static int sm_rx_waitseq(s_rx_emsidat *d)
static int sm_rx_getdat(s_rx_emsidat *d) static int sm_rx_getdat(s_rx_emsidat *d)
{ {
int rc = 0; int rc = 0;
int pos = 0; u_int pos = 0;
int emsi_len = 0; u_int emsi_len = 0;
short unsigned ourcrc; short unsigned ourcrc;
short unsigned remcrc; short unsigned remcrc;
char *emsi_dat = NULL; char *emsi_dat = NULL;
@@ -598,6 +598,8 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
s_cval_entry *addr_ptr; s_cval_entry *addr_ptr;
s_cval_entry *hide_ptr; s_cval_entry *hide_ptr;
s_faddr *primary = NULL; s_faddr *primary = NULL;
char xdt[EMSI_MAXXDATETIME+1];
time_t xtm = 0;
const long options = conf_options(cf_options); const long options = conf_options(cf_options);
const long speed = conf_number(cf_max_speed); const long speed = conf_number(cf_max_speed);
@@ -737,6 +739,10 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
{ emsi->compcodes.JAN = 1; } { emsi->compcodes.JAN = 1; }
if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA ) if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA )
{ emsi->compcodes.HYD = 1; } { emsi->compcodes.HYD = 1; }
DEB((D_HSHAKE,"Generated compcodes for caller: NCP:%x.ZMO:%x.ZAP:%x.DZA:%x.JAN:%x.HYD:%x.KER:%x.SLK:%x.TZA:%x",
emsi->compcodes.NCP, emsi->compcodes.ZMO, emsi->compcodes.ZAP,
emsi->compcodes.DZA, emsi->compcodes.JAN, emsi->compcodes.HYD,
emsi->compcodes.KER, emsi->compcodes.SLK, emsi->compcodes.TZA));
} }
else else
{ {
@@ -813,6 +819,22 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags)); strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags));
} }
/* ----------------------------------------------------------------- */
/* Data for {TZUTC} and {XDATETIME} field */
/* ----------------------------------------------------------------- */
if ( conf_boolean(cf_emsi_send_tz) ) {
emsi->have_tzutc = 1;
emsi->tzutc = (int)(time_gmtoffset());
}
if ( conf_boolean(cf_emsi_send_time) ) {
emsi->have_xdatetime = 1;
strnxcpy(xdt,time_string_format(xdt, EMSI_MAXXDATETIME, "%d.%m.%Y %H:%M:%S %z", xtm),EMSI_MAXXDATETIME);
strnxcpy(emsi->xdatetime, xdt, sizeof(emsi->xdatetime));
}
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/* Data for {OHFR} field */ /* Data for {OHFR} field */
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
+38 -9
View File
@@ -134,6 +134,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
int rc = HRC_OK; int rc = HRC_OK;
s_emsi *remote_emsi = NULL; s_emsi *remote_emsi = NULL;
s_emsi *local_emsi = NULL; s_emsi *local_emsi = NULL;
char *p = NULL;
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->remote_data); ASSERT(THIS->remote_data);
@@ -198,18 +199,46 @@ int emsi_incoming(s_handshake_protocol *THIS)
/* /*
* Set protocol that we will use * Set protocol that we will use
* EMSI-II compatible as of v0.25
*/ */
if( remote_emsi->compcodes.HYD && !(options & OPTIONS_NO_HYDRA) ) if ( remote_emsi->compcodes.EII ) {
THIS->protocol = PROT_HYDRA; /* EMSI-II relies on protocol order sent by CALLER
else if( remote_emsi->compcodes.ZAP && !(options & OPTIONS_NO_ZEDZAP) ) * we must agree on first matching protocol
THIS->protocol = PROT_ZEDZAP; */
else if( remote_emsi->compcodes.ZMO && !(options & OPTIONS_NO_ZMODEM) ) p = xstrcpy( remote_emsi->proto_order );
THIS->protocol = PROT_ZMODEM;
else /* NCP */
{
THIS->protocol = PROT_NOPROT; THIS->protocol = PROT_NOPROT;
rc = HRC_NO_PROTOS; for ( p = strtok( p, "," ); p ; p=strtok( NULL, "," ) ) {
if ( !strcmp(p, "ZMO") && !(options & OPTIONS_NO_ZMODEM)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_ZMODEM;
}
if ( !strcmp(p, "HYD") && !(options & OPTIONS_NO_HYDRA)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_HYDRA;
}
if ( !strcmp(p, "ZAP") && !(options & OPTIONS_NO_ZEDZAP)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_ZEDZAP;
}
if ( !strcmp(p, "DZA") && !(options & OPTIONS_NO_DIRZAP)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_DIRZAP;
}
/* if ( !strcmp(p, "JAN") && !(options & OPTIONS_NO_JANUS)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_JANUS;
} */
}
} else {
/* EMSI-I relies on our self order, not the CALLER's */
if( remote_emsi->compcodes.HYD && !(options & OPTIONS_NO_HYDRA) )
THIS->protocol = PROT_HYDRA;
else if( remote_emsi->compcodes.ZAP && !(options & OPTIONS_NO_ZEDZAP) )
THIS->protocol = PROT_ZEDZAP;
else if( remote_emsi->compcodes.ZMO && !(options & OPTIONS_NO_ZMODEM) )
THIS->protocol = PROT_ZMODEM;
else /* NCP */
{
THIS->protocol = PROT_NOPROT;
}
} }
if ( THIS->protocol == PROT_NOPROT ) rc = HRC_NO_PROTOS;
/* /*
* Check EMSI flags and set corresponding local HOLD flags * Check EMSI flags and set corresponding local HOLD flags
+183 -32
View File
@@ -65,7 +65,7 @@ static char *add_str(char *source, const char *add)
{ {
len += 2; len += 2;
dest = (char *)xrealloc(dest, len); dest = (char *)xrealloc(dest, len);
sprintf(&dest[pos], "\\%02hd", *(unsigned char*)add); sprintf(&dest[pos], "\\%02hhu", *(unsigned char*)add);
add += 1; add += 1;
pos += 3; pos += 3;
} }
@@ -103,6 +103,10 @@ char *emsi_createdat(s_emsi *emsi)
char *tmp = NULL; char *tmp = NULL;
char buf[100]; char buf[100];
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
char *p_order = NULL;
char *ord = NULL;
tmp = (char *)xstrcpy("**EMSI_DAT0000"); tmp = (char *)xstrcpy("**EMSI_DAT0000");
@@ -179,14 +183,78 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
} }
/* compatibility_codes */ /* compatibility_codes (EMSI behavior as FTS-0088) */
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,"); p_order = conf_string(cf_proto_order);
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,"); if ( !p_order ) {
if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,"); if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,");
if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,"); if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,");
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,");
if( emsi->compcodes.TZA ) tmp = add_str(tmp, "TZA,");
if( emsi->compcodes.SLK ) tmp = add_str(tmp, "SLK,");
if( emsi->compcodes.KER ) tmp = add_str(tmp, "KER,");
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
} else {
ord = xmalloc(4);
if (ord)
{
DEB((D_HSHAKE,"Protocol order found: %s", p_order));
ord = strncpy(ord, p_order,3);
ord[3] = '\0';
DEB((D_HSHAKE,"Protocol order chunk: %s", ord));
if ( !strcmp(ord,"HYD") )
if ( emsi->compcodes.HYD) tmp = add_str(tmp, "HYD,");
if ( !strcmp(ord,"JAN") )
if ( emsi->compcodes.JAN) tmp = add_str(tmp, "JAN,");
if ( !strcmp(ord,"DZA") )
if ( emsi->compcodes.DZA) tmp = add_str(tmp, "DZA,");
if ( !strcmp(ord,"ZAP") )
if ( emsi->compcodes.ZAP) tmp = add_str(tmp, "ZAP,");
if ( !strcmp(ord,"ZMO") )
if ( emsi->compcodes.ZMO) tmp = add_str(tmp, "ZMO,");
if ( !strcmp(ord,"TZA") )
if ( emsi->compcodes.TZA) tmp = add_str(tmp, "TZA,");
if ( !strcmp(ord,"SLK") )
if ( emsi->compcodes.SLK) tmp = add_str(tmp, "SLK,");
if ( !strcmp(ord,"KER") )
if ( emsi->compcodes.KER) tmp = add_str(tmp, "KER,");
if ( !strcmp(ord,"NCP") )
if ( emsi->compcodes.NCP) tmp = add_str(tmp, "NCP,");
p_order = strchr(p_order, ',');
if ( p_order ) p_order = p_order+1; /* skip ',' */
while ( p_order ) {
ord = strncpy(ord, p_order,3);
ord[3] = '\0';
DEB((D_HSHAKE,"Protocol order chunk: %s", ord));
if ( !strcmp(ord,"HYD") )
if ( emsi->compcodes.HYD) tmp = add_str(tmp, "HYD,");
if ( !strcmp(ord,"JAN") )
if ( emsi->compcodes.JAN) tmp = add_str(tmp, "JAN,");
if ( !strcmp(ord,"DZA") )
if ( emsi->compcodes.DZA) tmp = add_str(tmp, "DZA,");
if ( !strcmp(ord,"ZAP") )
if ( emsi->compcodes.ZAP) tmp = add_str(tmp, "ZAP,");
if ( !strcmp(ord,"ZMO") )
if ( emsi->compcodes.ZMO) tmp = add_str(tmp, "ZMO,");
if ( !strcmp(ord,"TZA") )
if ( emsi->compcodes.TZA) tmp = add_str(tmp, "TZA,");
if ( !strcmp(ord,"SLK") )
if ( emsi->compcodes.SLK) tmp = add_str(tmp, "SLK,");
if ( !strcmp(ord,"KER") )
if ( emsi->compcodes.KER) tmp = add_str(tmp, "KER,");
if ( !strcmp(ord,"NCP") )
if ( emsi->compcodes.NCP) tmp = add_str(tmp, "NCP,");
p_order = strchr(p_order, ',');
if ( p_order ) p_order = p_order+1; /* skip ',' */
}
free(ord);
}
}
if( emsi->compcodes.FRQ ) tmp = add_str(tmp, "FRQ,"); if( emsi->compcodes.FRQ ) tmp = add_str(tmp, "FRQ,");
if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,"); if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,");
if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,"); if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,");
@@ -325,10 +393,15 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
tmp = add_char(tmp, '['); tmp = add_char(tmp, '[');
sprintf(buf, "+%04d", emsi->tzutc); /* BUGGY */
tmp = add_str(tmp, buf); // sprintf(buf, "+%04d", emsi->tzutc);
ord = xmalloc(6);
ord = xstrcpy(time_string_gmtoffset(ord));
ord[5] = '\0';
tmp = add_str(tmp, ord);
tmp = add_char(tmp, ']'); tmp = add_char(tmp, ']');
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
free(ord);
} }
/* {XDATE} indentifier.. What's the fucking invention :-/ /* {XDATE} indentifier.. What's the fucking invention :-/
@@ -378,7 +451,7 @@ char *emsi_createdat(s_emsi *emsi)
static char *get_field(char **str, char from, char to) static char *get_field(char **str, char from, char to)
{ {
char *dst, *src, *dest = NULL; char *dst, *src, *dest = NULL;
int ch; u_int ch;
src = *str; src = *str;
@@ -450,6 +523,8 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
{ {
int i; int i;
char *tmp, *p, *q, *n; char *tmp, *p, *q, *n;
unsigned int tzh, tzm,tzn ;
char *tzc, *otmp;
while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL ) while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL )
{ {
@@ -479,7 +554,7 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
/* password */ /* password */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->passwd, p, sizeof(emsi->passwd)); if( *p ) strnxcpy(emsi->passwd, p, sizeof(emsi->passwd));
/* link codes */ /* link codes */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
@@ -525,13 +600,64 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
/* compatibility codes */ /* compatibility codes */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p)); DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p));
emsi->proto_order[0] = '\0';
for( p = strtok(p, ","); p; p=strtok(NULL, ",") ) for( p = strtok(p, ","); p; p=strtok(NULL, ",") )
{ {
if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1; /* if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1;
else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1; else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1;
else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1; else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1;
else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1; else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1;
else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1; else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1;
*/
if ( !strcmp(p, "ZMO") ) {
emsi->compcodes.ZMO = 1;
otmp = strcat(emsi->proto_order,"ZMO,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "ZAP") ) {
emsi->compcodes.ZAP = 1;
otmp = strcat(emsi->proto_order,"ZAP,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "DZA") ) {
emsi->compcodes.DZA = 1;
otmp = strcat(emsi->proto_order,"DZA,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "JAN") ) {
emsi->compcodes.JAN = 1;
otmp = strcat(emsi->proto_order,"JAN,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "HYD") ) {
emsi->compcodes.HYD = 1;
otmp = strcat(emsi->proto_order,"HYD,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "KER") ) {
emsi->compcodes.KER = 1;
otmp = strcat(emsi->proto_order,"KER,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "TZA") ) {
emsi->compcodes.TZA = 1;
otmp = strcat(emsi->proto_order,"TZA,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "SLK") ) {
emsi->compcodes.SLK = 1;
otmp = strcat(emsi->proto_order,"SLK,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1; else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1;
else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1; else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1;
else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1; else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1;
@@ -542,19 +668,23 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
else if( !strcmp(p, "BBS") ) emsi->compcodes.BBS = 1; else if( !strcmp(p, "BBS") ) emsi->compcodes.BBS = 1;
else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1; else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1;
} }
/* Delete last comma from order list */
if (strlen(emsi->proto_order) > 0)
emsi->proto_order[strlen(emsi->proto_order)-1] = '\0';
DEB((D_HSHAKE,"Ordered compcodes: %s",emsi->proto_order));
/* mailer information */ /* mailer information */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->m_pid, p, sizeof(emsi->m_pid)); if( *p ) strnxcpy(emsi->m_pid, p, sizeof(emsi->m_pid));
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->m_name, p, sizeof(emsi->m_name)); if( *p ) strnxcpy(emsi->m_name, p, sizeof(emsi->m_name));
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->m_ver, p, sizeof(emsi->m_ver)); if( *p ) strnxcpy(emsi->m_ver, p, sizeof(emsi->m_ver));
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->m_reg, p, sizeof(emsi->m_reg));; if( *p ) strnxcpy(emsi->m_reg, p, sizeof(emsi->m_reg));;
} }
else if( strcmp(tmp, "IDENT") == 0 ) else if( strcmp(tmp, "IDENT") == 0 )
{ {
@@ -562,17 +692,17 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
if( (tmp=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (tmp=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1); if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->sname, p, sizeof(emsi->sname)); if( *p ) strnxcpy(emsi->sname, p, sizeof(emsi->sname));
if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1); if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->location, p, sizeof(emsi->location)); if( *p ) strnxcpy(emsi->location, p, sizeof(emsi->location));
if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1); if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->sysop, p, sizeof(emsi->sysop)); if( *p ) strnxcpy(emsi->sysop, p, sizeof(emsi->sysop));
if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1); if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->phone, p, sizeof(emsi->phone));; if( *p ) strnxcpy(emsi->phone, p, sizeof(emsi->phone));;
if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1); if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1);
if( p && *p ) sscanf(p, "%d", &emsi->speed); if( *p ) sscanf(p, "%d", &emsi->speed);
if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1); if( (p=get_field(&tmp, '[', ']')) == NULL ) return(1);
if( p && *p ) strnxcpy(emsi->flags, p, sizeof(emsi->flags)); if( *p ) strnxcpy(emsi->flags, p, sizeof(emsi->flags));
} }
else if( strcmp(tmp, "TRX#") == 0 ) else if( strcmp(tmp, "TRX#") == 0 )
{ {
@@ -590,9 +720,9 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
else if( strcmp(tmp, "TRAF") == 0 ) else if( strcmp(tmp, "TRAF") == 0 )
{ {
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( p && *p ) if( *p )
{ {
if( sscanf(p, "%08X %08X", &emsi->netmail_size, &emsi->arcmail_size) == 2 ) if( sscanf(p, "%08zX %08zX", &emsi->netmail_size, &emsi->arcmail_size) == 2 )
{ {
emsi->have_traf = 1; emsi->have_traf = 1;
} }
@@ -606,9 +736,9 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
{ {
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( (p=get_field(&p, '[', ']')) == NULL ) return(1); if( (p=get_field(&p, '[', ']')) == NULL ) return(1);
if( p && *p ) if( *p )
{ {
if( sscanf(p, "%08X", &emsi->files_size) == 1 ) if( sscanf(p, "%08zX", &emsi->files_size) == 1 )
{ {
emsi->have_moh = 1; emsi->have_moh = 1;
} }
@@ -645,14 +775,35 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
if( *p ) strnxcpy(emsi->xdatetime, p, sizeof(emsi->xdatetime)); if( *p ) strnxcpy(emsi->xdatetime, p, sizeof(emsi->xdatetime));
} }
else if( strcmp(tmp, "TZUTC") == 0 ) else if( strcmp(tmp, "TZUTC") == 0 )
{ {
emsi->have_tzutc = 1;
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( (p=get_field(&p, '[', ']')) == NULL ) return(1); if( (p=get_field(&p, '[', ']')) == NULL ) return(1);
/* Parse EMSI TZUTC in fmt (+|-)HHMM */
if( *p ) {
tzc = malloc(2);
if (tzc)
{
DEB((D_HSHAKE, "Got TZUTC=%s for parsing", p));
tzn = sscanf( p, "%1c%02u%02u", tzc, &tzh, &tzm);
tzc[1] = '\0';
if ( tzn == 3) {
DEB((D_HSHAKE, "Got TZC=%s , H=%u, M=%u", tzc, tzh,tzm));
emsi->have_tzutc = 1;
if ( strcmp(tzc, "-") == 0 ) {
emsi->tzutc = -(tzh*60 + tzm);
} else {
emsi->tzutc = tzh*60 + tzm;
}
} else {
DEB((D_HSHAKE,"TZUTC value not parsed!"));
}
free(tzc);
}
}
} }
else else
{ {
DEB((D_HSHAKE, "Step - no known EMSI-part - got %s", tmp));
strnxcat(emsi->addons, "{", sizeof(emsi->addons)); strnxcat(emsi->addons, "{", sizeof(emsi->addons));
strnxcat(emsi->addons, tmp, sizeof(emsi->addons)); strnxcat(emsi->addons, tmp, sizeof(emsi->addons));
strnxcat(emsi->addons, "}", sizeof(emsi->addons)); strnxcat(emsi->addons, "}", sizeof(emsi->addons));
@@ -730,7 +881,7 @@ void emsi_logdat(s_emsi *emsi)
if( emsi->compcodes.HFR ) if( emsi->compcodes.HFR )
strcat(flags, "HFR,"); strcat(flags, "HFR,");
if( *flags ) if( *flags && (strlen(flags) > 0) )
{ {
flags[strlen(flags)-1] = '\0'; flags[strlen(flags)-1] = '\0';
log(" Options : %s", flags); log(" Options : %s", flags);
@@ -771,7 +922,7 @@ void emsi_logdat(s_emsi *emsi)
if( emsi->have_emsi ) if( emsi->have_emsi )
{ {
if( emsi->m_name[0] || emsi->m_pid[0] if( emsi->m_name[0] || emsi->m_pid[0]
|| emsi->m_ver[0] || emsi->m_reg ) || emsi->m_ver[0] || emsi->m_reg[0] )
{ {
log(" Mailer : %s [%s] %s/%s", log(" Mailer : %s [%s] %s/%s",
emsi->m_name[0] ? string_printable(emsi->m_name) : "?", emsi->m_name[0] ? string_printable(emsi->m_name) : "?",
+8 -5
View File
@@ -100,7 +100,8 @@ char *hydra_pkttype_names[] =
"HPKT_EOFACK", "HPKT_EOFACK",
"HPKT_END", "HPKT_END",
"HPKT_IDLE", "HPKT_IDLE",
"HPKT_DEVDATA" "HPKT_DEVDATA",
"HPKT_DEVDACK"
}; };
char *hydra_char_names[] = char *hydra_char_names[] =
@@ -1049,8 +1050,8 @@ static int hydra_parse_init(s_hydrainfo *hi, char *pkt, size_t pktlen)
if( appinf && canopt && desopt && window && prefix ) if( appinf && canopt && desopt && window && prefix )
{ {
char buf[256]; char buf[256];
long txwindow = 0L; unsigned long txwindow = 0UL;
long rxwindow = 0L; unsigned long rxwindow = 0UL;
DEB((D_PROT, "hydra: revtime = \"%s\"", time_string_long(buf, sizeof(buf), revtime))); DEB((D_PROT, "hydra: revtime = \"%s\"", time_string_long(buf, sizeof(buf), revtime)));
DEB((D_PROT, "hydra: appinf = \"%s\"", appinf)); DEB((D_PROT, "hydra: appinf = \"%s\"", appinf));
@@ -1548,7 +1549,9 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
/* /*
* Check current CPS, session time limits, etc. * Check current CPS, session time limits, etc.
*/ */
if( (rc = p_info(pi, 1)) ) gotoexit(rc); rc = p_info(pi, 1);
if( rc != PRC_NOERROR ) gotoexit(rc);
/* /*
* Send/receive as much data as possible, but without delays * Send/receive as much data as possible, but without delays
@@ -1637,7 +1640,7 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
char *p; char *p;
/* Get file modification time and size */ /* Get file modification time and size */
sscanf(hi->ibuf, "%08lx%08x%*08x%*08x%*08x", sscanf(hi->ibuf, "%08lx%08zx%*08zx%*08zx%*08zx",
(unsigned long *)&modtime, &filesize); (unsigned long *)&modtime, &filesize);
/* Convert local time -> UTC */ /* Convert local time -> UTC */
+2 -3
View File
@@ -85,13 +85,12 @@ static void yoohoo_put_hello(char *buffer, s_yoohoo_sysinfo *myhello)
* Add domain after the end of 'Node name' * Add domain after the end of 'Node name'
* TODO: check it for buffer overflows %-I * TODO: check it for buffer overflows %-I
*/ */
if( state.n_localaddr > 0 && state.localaddrs[0].addr.domain if( state.n_localaddr > 0 && *state.localaddrs[0].addr.domain )
&& *state.localaddrs[0].addr.domain )
{ {
char *q; char *q;
if( strlen(myhello->system) + strlen(state.localaddrs[0].addr.domain) > 57 ) if( strlen(myhello->system) + strlen(state.localaddrs[0].addr.domain) > 57 )
{ {
if( strlen(state.localaddrs[0].addr.domain) < 60 ) if( strlen(state.localaddrs[0].addr.domain) < 60 ) //PVS-Suppress V547
q = p + (60 - strlen(state.localaddrs[0].addr.domain)); q = p + (60 - strlen(state.localaddrs[0].addr.domain));
else else
q = p; q = p;
+1 -1
View File
@@ -67,7 +67,7 @@ static const char *FrameTypes[] =
"ZCOMMAND", "ZCOMMAND",
"ZSTDERR", "ZSTDERR",
"Unused" "Unused"
#define FRTYPES 22 /* Total number of frame types in this array */ #define FRTYPES 20 /* Total number of frame types in this array */
/* not including psuedo negative entries */ /* not including psuedo negative entries */
}; };
#endif #endif
+1 -1
View File
@@ -548,7 +548,7 @@ static int zmodem_proc_ZFILE(s_protinfo *pi, char *blkptr, size_t blklen)
fileiptr = blkptr + strlen(blkptr) + 1; fileiptr = blkptr + strlen(blkptr) + 1;
if( fileiptr >= (blkptr + blklen) || if( fileiptr >= (blkptr + blklen) ||
sscanf(fileiptr, "%d%lo", &filesize, (unsigned long *)&filetime) < 1 ) sscanf(fileiptr, "%zu%lo", &filesize, (unsigned long *)&filetime) < 1 )
{ {
log("zmodem: got invalid ZFILE packet"); log("zmodem: got invalid ZFILE packet");
return 1; return 1;
+8 -4
View File
@@ -47,14 +47,18 @@ static void zmodem_add_empty_packet(s_protinfo *pi)
s_filelist **ptrl; s_filelist **ptrl;
s_packet pkt; s_packet pkt;
char tmpname[] = "/tmp/bfXXXXXX"; char tmpname[] = "/tmp/bfXXXXXX";
char *chunk;
char *p_tmpname; char *p_tmpname;
if( (p_tmpname = mktemp(tmpname)) == NULL ) chunk = xmalloc(7);
{ if (!chunk) {
logerr("cannot generate temp. file name for packet from \"%s\"", tmpname); logerr("cannot generate temp. file name for packet");
return; return;
} }
getrandname(chunk, 6);
p_tmpname = string_concat("/tmp/bf", chunk, '\0');
free(chunk);
memset(&pkt, '\0', sizeof(s_packet)); memset(&pkt, '\0', sizeof(s_packet));
pkt.dest = state.node.addr; pkt.dest = state.node.addr;
+26 -14
View File
@@ -22,8 +22,16 @@
int answ_system(e_session type, char *connstr, int inetd) int answ_system(e_session type, char *connstr, int inetd)
{ {
TIO oldtio; TIO oldtio;
struct sockaddr_in client; union {
struct sockaddr a;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} client;
//struct sockaddr_storage client;
int clientlen = sizeof(client); int clientlen = sizeof(client);
char clienthost[NI_MAXHOST];
char clientport[NI_MAXSERV];
int clientres = 0;
int rc = 0; int rc = 0;
char *p; char *p;
@@ -71,20 +79,23 @@ int answ_system(e_session type, char *connstr, int inetd)
if( inetd ) if( inetd )
{ {
log("Answering TCPIP call...");
if( connstr && *connstr ) if( connstr && *connstr )
state.connstr = (char*)xstrcpy(connstr); state.connstr = (char*)xstrcpy(connstr);
else if( getpeername(0, (struct sockaddr*)&client, &clientlen) == -1 ) else
logerr("can't get client address");
else
{ {
#ifdef IPV6 if(getpeername(0, &client.a, &clientlen))
>char addr_str[INET6_ADDRSTRLEN+1]; log("sess_answ: can't detrmine socket client");
state.peername = (char*)xstrcpy(inet_ntop(AF_INET6, client.sin6_addr, addr_str, INET6_ADDRSTRLEN)); clientres = getnameinfo( &client.a, clientlen,
state.peerport = (long)ntohs(client.sin6_port); clienthost, sizeof(clienthost), clientport,
#else sizeof(clientport), NI_NUMERICHOST | NI_NUMERICSERV);
state.peername = (char*)xstrcpy(inet_ntoa(client.sin_addr)); if ( clientres == 0 )
state.peerport = (long)ntohs(client.sin_port); {
#endif state.peername = (char*)xstrcpy(clienthost);
state.peerport = (long)atol(clientport);
}
else
log("sess_answ: can't get client address: ", gai_strerror(clientres));
} }
} }
@@ -116,9 +127,10 @@ int answ_system(e_session type, char *connstr, int inetd)
port_carrier(0, TRUE); port_carrier(0, TRUE);
rc = session(); rc = session();
log("Session ended up, rc=%d, inetd=%d", rc, inetd);
if( (inetd != 0) && (state.inet = FALSE) ) if( ( !inetd ) )
{ {
log("Deactivating modem port");
port_deinit(0, &oldtio); port_deinit(0, &oldtio);
port_close(); port_close();
} }
+110 -40
View File
@@ -210,7 +210,7 @@ int call_system_quiet(const char *connstr, bool inet)
if( (exec_cmd = conf_string(cf_run_before_session)) != NULL ) if( (exec_cmd = conf_string(cf_run_before_session)) != NULL )
{ {
exec_result = system(exec_cmd); exec_result = system(exec_cmd);
if( exec_result = 0 ) if( exec_result == 0 )
log("external application %s executed with zero return code (%i)", exec_cmd, exec_result); log("external application %s executed with zero return code (%i)", exec_cmd, exec_result);
else else
logerr("external application %s executed with non-zero return code %i", exec_cmd, exec_result); logerr("external application %s executed with non-zero return code %i", exec_cmd, exec_result);
@@ -378,7 +378,7 @@ int call_system_modem(void)
log("calling with modem %s (%s, %s)", log("calling with modem %s (%s, %s)",
ftn_addrstr(abuf, state.node.addr), ftn_addrstr(abuf, state.node.addr),
(state.node.name && *state.node.name) ? state.node.name : "<none>", ( *state.node.name) ? state.node.name : "<none>",
string_printable(dialstring)); string_printable(dialstring));
/* /*
@@ -480,10 +480,15 @@ int call_system_tcpip(int callwith) // only TCPIP values
{ {
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
int rc = BFERR_NOERROR; int rc = BFERR_NOERROR;
char * pbuf;
char * target = 0;
int resflg;
/* /*
* Set verbal line name to "tcpip" value * Set verbal line name to "tcpip" value
*/ */
memset(abuf, '\0', BF_MAXADDRSTR+1);
target = xmalloc(1024);
memset(target, '\0', 1024);
state.linename = xstrcpy("tcpip"); state.linename = xstrcpy("tcpip");
state.inet = TRUE; state.inet = TRUE;
@@ -502,27 +507,68 @@ int call_system_tcpip(int callwith) // only TCPIP values
case CALL_TCPIP_BINKP: case CALL_TCPIP_BINKP:
state.tcpmode = TCPMODE_BINKP; state.tcpmode = TCPMODE_BINKP;
state.session = SESSION_BINKP; state.session = SESSION_BINKP;
target = xstrcpy("IBN");
break; break;
case CALL_TCPIP_IFCICO: case CALL_TCPIP_IFCICO:
state.tcpmode = TCPMODE_RAW; state.tcpmode = TCPMODE_RAW;
state.session = SESSION_UNKNOWN; state.session = SESSION_UNKNOWN;
target = xstrcpy("IFC");
break; break;
case CALL_TCPIP_TELNET: case CALL_TCPIP_TELNET:
state.tcpmode = TCPMODE_TELNET; state.tcpmode = TCPMODE_TELNET;
state.session = SESSION_UNKNOWN; state.session = SESSION_UNKNOWN;
target = xstrcpy("ITN");
break; break;
defalt: default:
log("invalid protocol for TCP/IP module"); log("invalid protocol for TCP/IP module");
return BFERR_FATALERROR; return BFERR_FATALERROR;
} }
log("calling with internet %s (%s, %s)", log("calling with internet %s (%s, %s)",
ftn_addrstr(abuf, state.node.addr), ftn_addrstr(abuf, state.node.addr),
(state.node.name && *state.node.name ) ? state.node.name : "<none>", (*state.node.name ) ? state.node.name : "<none>",
(state.node.host && *state.node.host) ? state.node.host : "<none>"); ( *state.node.host) ? state.node.host : "<none>");
memset(abuf, '\0', BF_MAXADDRSTR+1);
pbuf = xmalloc(1024);
resflg = nodelist_lookup_string(pbuf, 1024, state.node.addr);
if ( ! resflg )
{
if( (rc = tcpip_connect(state.node.host, state.tcpmode)) == 0 const char *p = string_casestr(pbuf, target);
&& (rc = tcpip_init() == 0) )
if ( p )
{
target = strchr(p, ',');
if ( target ) target[0] = '\0';
target = 0;
target = strrchr(p, ':');
if ( target ) {
target++;
strcpy(abuf,target);
}
}
}
free(pbuf);
pbuf = xstrcpy(state.node.host);
if ( ! resflg )
{
if ( abuf[0] != '\0' )
{
// port not empty
DEB((D_EVENT, "Modifying host address %s with port %s", pbuf, abuf));
pbuf = xstrcat(pbuf, ":");
pbuf = xstrcat(pbuf, abuf);
}
}
if( (rc = tcpip_connect(pbuf, state.tcpmode)) == 0
&& ( (rc = tcpip_init()) == 0) )
{ {
TTYSTATUS(1); TTYSTATUS(1);
rc = session(); rc = session();
@@ -532,7 +578,7 @@ defalt:
{ {
rc = BFERR_CANT_CONNECT10; rc = BFERR_CANT_CONNECT10;
} }
free(pbuf);
return rc; return rc;
} }
@@ -543,7 +589,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
char s[300]; char s[300];
snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point ); snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point );
log(s); log(s);
DEB((D_EVENT, s));
// find suitable way of connection and try to make session // find suitable way of connection and try to make session
int rc = 0; int rc = 0;
@@ -568,12 +614,13 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
state.listed = state.node.listed; state.listed = state.node.listed;
//DEB((D_EVENT, "Calling init, listed=%d", state.listed));
state.node.addr.domain[0] = '\0'; /* Discard domain for node address */ state.node.addr.domain[0] = '\0'; /* Discard domain for node address */
// 1. If call method specified in cmdline, do use it // 1. If call method specified in cmdline, do use it
// 2. If not, use nodelist data and overrides and call all available methods // 2. If not, use nodelist data and overrides and call all available methods
// If override contains Phone or IP flags, ignore nodelist connect methods (but save INA if not overrided) // If override contains Phone or IP flags, ignore nodelist connect methods (but save INA if not overrided)
DEB((D_EVENT, "Calling init, runmode=%d", opts->runmode));
// 1st - get all allowed call ways // 1st - get all allowed call ways
// 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support) // 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support)
@@ -581,7 +628,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( opts->runmode == MODE_CALL_DEFAULT ) if( opts->runmode == MODE_CALL_DEFAULT )
{ {
call_mayuse = CALL_MODEM | CALL_TCPIP_ANY; call_mustuse = CALL_MODEM | CALL_TCPIP_ANY;
} }
else if( opts->runmode == MODE_CALL_STDIO ) else if( opts->runmode == MODE_CALL_STDIO )
{ {
@@ -593,7 +640,14 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
else if( opts->runmode == MODE_CALL_IP ) else if( opts->runmode == MODE_CALL_IP )
{ {
if( strcasecmp(opts->ipproto, "binkp") == 0 ) DEB((D_EVENT, "Calling init, MODE_CALL_IP"));
if( !(opts->ipproto) ) // determine from nodelist/override
{
DEB((D_EVENT, "ipproto not set"));
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else if( strcasecmp(opts->ipproto, "binkp") == 0 )
{ {
call_mustuse = CALL_TCPIP_BINKP; call_mustuse = CALL_TCPIP_BINKP;
} }
@@ -605,20 +659,17 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
call_mustuse = CALL_TCPIP_TELNET; call_mustuse = CALL_TCPIP_TELNET;
} }
else if( opts->ipproto == NULL ) // determine from nodelist/override
{
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else else
{ {
DEB((D_EVENT, "Unknown protocol %s", opts->ipproto));
log("Unknown protocol"); log("Unknown protocol");
return -1; return -1;
} }
} }
else else
{ {
log("Unknown protocol"); DEB((D_EVENT, "Unknown runmode %d", opts->runmode));
log("Unknown runmode");
return -1; return -1;
} }
@@ -627,9 +678,10 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
//char s[300]; //char s[300];
//snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse); //snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse);
//log(s); //log(s);
//DEB((D_EVENT, s));
if( call_mayuse & CALL_MODEM ) if( (call_mayuse & CALL_MODEM) )
{ {
// 1. use phone from opts // 1. use phone from opts
// 2. use overrides // 2. use overrides
@@ -650,7 +702,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
log("bad phone, excluding modem"); log("bad phone, excluding modem");
call_mayuse &= ~CALL_MODEM; call_mayuse &= ~CALL_MODEM;
if( call_mustuse & CALL_MODEM ) if( !(call_mayuse) )
{ {
errmsg = "don't know phone number"; errmsg = "don't know phone number";
gotoexit(BFERR_PHONE_UNKNOWN); gotoexit(BFERR_PHONE_UNKNOWN);
@@ -684,7 +736,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
call_mayuse &= ~CALL_MODEM; call_mayuse &= ~CALL_MODEM;
log("bad worktime, excluding modem"); log("bad worktime, excluding modem");
if( call_mustuse & CALL_MODEM ) if( !(call_mayuse) )
{ {
errmsg = "not works now, try later"; errmsg = "not works now, try later";
gotoexit(BFERR_NOTWORKING); gotoexit(BFERR_NOTWORKING);
@@ -693,9 +745,9 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
} }
// snprintf(s, 299, "after phone check: may use %d must use %d", call_mayuse, call_mustuse); //snprintf(s, 299, "after phone check: may use %d must use %d", call_mayuse, call_mustuse);
// log(s); //log(s);
//DEB((D_EVENT, s));
/* /*
* Apply overrides to the node information * Apply overrides to the node information
*/ */
@@ -714,7 +766,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( !(call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) ) if( !(call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) )
{ {
if( nodelist_checkflag(state.node.flags, "BINKP") != 0 && nodelist_checkflag(state.node.flags, "IBN") != 0 ) //if( nodelist_checkflag(state.node.flags, "BINKP") != 0 && nodelist_checkflag(state.node.flags, "IBN") != 0 )
if( state.node.do_binkp == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_BINKP; call_mayuse &= ~CALL_TCPIP_BINKP;
} }
@@ -722,7 +775,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( !(call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) ) if( !(call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) )
{ {
if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 ) //if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 )
if( state.node.do_ifcico == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_IFCICO; call_mayuse &= ~CALL_TCPIP_IFCICO;
} }
@@ -730,7 +784,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( !(call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) ) if( !(call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) )
{ {
if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 ) //if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 )
if( state.node.do_telnet == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_TELNET; call_mayuse &= ~CALL_TCPIP_TELNET;
} }
@@ -746,7 +801,12 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
state.override.sIpaddr, sizeof(state.node.host)); state.override.sIpaddr, sizeof(state.node.host));
} }
if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(state.node.host) ) { //DEB((D_EVENT, "Calling init, IPHOST", state.node.host));
// We have at least one protocol and not valid address - try to
// find INA with through Fidonet DNS
if( (call_mayuse & CALL_TCPIP_ANY) && !tcpip_isgood_host(state.node.host) )
{
char *fidodnszone = conf_string(cf_fidodnszone); char *fidodnszone = conf_string(cf_fidodnszone);
if (fidodnszone) { if (fidodnszone) {
if (addr.point) { if (addr.point) {
@@ -761,17 +821,21 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
} }
if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(state.node.host) ) // We have no valid tcpip protocols OR not valid address
if( !(call_mayuse & CALL_TCPIP_ANY) || !tcpip_isgood_host(state.node.host) )
{ {
call_mayuse &= ~CALL_TCPIP_ANY; call_mayuse &= ~CALL_TCPIP_ANY;
log("bad host, exclude IP"); log("bad host, exclude IP");
if( call_mustuse & CALL_TCPIP_ANY ) DEB((D_EVENT, "bad host or proto -> exclude IP, mayuse=%d", call_mayuse));
// If we had ONLY tcpip command - go out with error
if( !(call_mayuse) )
{ {
errmsg = "don't know host name"; errmsg = "Aborting, don't know host name";
gotoexit(BFERR_PHONE_UNKNOWN); gotoexit(BFERR_PHONE_UNKNOWN);
} }
} }
DEB((D_EVENT,"sess_call: may use %d must use %d", call_mayuse, call_mustuse));
// snprintf(s, 299, "after IP check: may use %d must use %d", call_mayuse, call_mustuse); // snprintf(s, 299, "after IP check: may use %d must use %d", call_mayuse, call_mustuse);
// log(s); // log(s);
@@ -798,7 +862,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
if( NULL != state.override.run && strlen(state.override.run) > 0 ) if( NULL != state.override.run && strlen(state.override.run) > 0 )
{ {
if ( (runrc = system(state.override.run) != 0 )) if ( (runrc = system(state.override.run)) != 0 )
{ {
logerr("run script \"%s\" executed with non-zero return value", state.override.run); logerr("run script \"%s\" executed with non-zero return value", state.override.run);
} }
@@ -807,29 +871,34 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
// try allowed methods and break if rc == 0 // try allowed methods and break if rc == 0
rc = -1; rc = -1;
if( rc && call_mayuse & CALL_STDIO ) if( call_mayuse & CALL_STDIO )
{ {
DEB((D_EVENT,"sess_call: calling stdio"));
rc = call_system_quiet(opts->connect, opts->inetd); rc = call_system_quiet(opts->connect, opts->inetd);
} }
if( rc && call_mayuse & CALL_TCPIP_BINKP ) if( rc && (call_mayuse & CALL_TCPIP_BINKP) )
{ {
DEB((D_EVENT,"sess_call: calling binkp"));
rc = call_system_tcpip(CALL_TCPIP_BINKP); rc = call_system_tcpip(CALL_TCPIP_BINKP);
} }
if( rc && call_mayuse & CALL_TCPIP_IFCICO ) if( rc && (call_mayuse & CALL_TCPIP_IFCICO) )
{ {
DEB((D_EVENT,"sess_call: calling ifcico"));
rc = call_system_tcpip(CALL_TCPIP_IFCICO); rc = call_system_tcpip(CALL_TCPIP_IFCICO);
} }
if( rc && call_mayuse & CALL_TCPIP_TELNET ) if( rc && (call_mayuse & CALL_TCPIP_TELNET) )
{ {
DEB((D_EVENT,"sess_call: calling telnet"));
rc = call_system_tcpip(CALL_TCPIP_TELNET); rc = call_system_tcpip(CALL_TCPIP_TELNET);
} }
if( rc && call_mayuse & CALL_MODEM ) if( rc && (call_mayuse & CALL_MODEM) )
{ {
DEB((D_EVENT,"sess_call: calling MODEM"));
setproctitle("bforce calling %.32s, %.32s", setproctitle("bforce calling %.32s, %.32s",
ftn_addrstr(abuf, state.node.addr), state.node.phone); ftn_addrstr(abuf, state.node.addr), state.node.phone);
rc = -1; rc = -1;
@@ -850,6 +919,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */ if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */
{ {
DEB((D_EVENT,"sess_call: call_system_modem running"));
rc = call_system_modem(); rc = call_system_modem();
port_unlock(p_lockdir, state.modemport); port_unlock(p_lockdir, state.modemport);
} }
+7 -5
View File
@@ -135,14 +135,16 @@ int override_get(s_override *dest, s_faddr addr, int line)
{ {
s_override *p; s_override *p;
int curline = 0; int curline = 0;
p = conf_override(cf_override, addr); p = conf_override(cf_override, addr);
curline = 0; curline = 0;
while( p && curline < line ) if (line > 0)
{ {
p = p->hidden; while( p && curline < line )
++curline; {
p = p->hidden;
++curline;
}
} }
if( p && curline == line ) if( p && curline == line )
@@ -152,7 +154,7 @@ int override_get(s_override *dest, s_faddr addr, int line)
} }
else if( line == 0 ) else if( line == 0 )
return 0; return 0;
else else
return 1; return 1;
} }
+41 -5
View File
@@ -264,7 +264,7 @@ int session_check_addr(s_faddr addr)
int session_get_password(s_faddr addr, char *buffer, size_t buflen) int session_get_password(s_faddr addr, char *buffer, size_t buflen)
{ {
s_cval_entry *pwd_ptr; s_cval_entry *pwd_ptr;
buffer[0]='\0';
for( pwd_ptr = conf_first(cf_password); pwd_ptr; for( pwd_ptr = conf_first(cf_password); pwd_ptr;
pwd_ptr = conf_next(pwd_ptr) ) pwd_ptr = conf_next(pwd_ptr) )
{ {
@@ -895,13 +895,22 @@ int session(void)
* Write total amount of received/sent bytes, files, etc. * Write total amount of received/sent bytes, files, etc.
*/ */
p_log_txrxstat(&pi); p_log_txrxstat(&pi);
// Protocol info - real info from protocol
DEB((D_EVENT,"sess_main: Pi stats> Net: %d, Arc: %d, Fil: %d, Tic: %d",
pi.traffic_rcvd.netmail_num, pi.traffic_rcvd.arcmail_num,
pi.traffic_rcvd.files_num, pi.traffic_rcvd.ticfile_num));
// Session info - HANDSHAKE info for traffic
DEB((D_EVENT,"sess_main: Sess stats> Net: %d, Arc: %d, Fil: %d, Tic: %d",
state.traff_recv.netmail_num, state.traff_recv.arcmail_num,
state.traff_recv.files_num, state.traff_recv.ticfile_num));
/* /*
* Raise flags if session incoming traffic was not empty * Raise flags if session incoming traffic was not empty
*/ */
if ( (p = conf_string(cf_incnet_flag)) ) if ( (p = conf_string(cf_incnet_flag)) )
if (state.traff_recv.netmail_size > 0) { if (pi.traffic_rcvd.netmail_size > 0) {
DEB((D_EVENT, "Incoming netmail > 0, raising flag")); DEB((D_EVENT, "Incoming netmail > 0, raising flag"));
log("Raising flag for netmail in %s", p); log("Raising flag for netmail in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ); fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
@@ -915,7 +924,7 @@ int session(void)
} }
if ( (p = conf_string(cf_incarc_flag)) ) if ( (p = conf_string(cf_incarc_flag)) )
if (state.traff_recv.arcmail_size > 0) { if (pi.traffic_rcvd.arcmail_size > 0) {
DEB((D_EVENT, "Incoming arcmail > 0, raising flag")); DEB((D_EVENT, "Incoming arcmail > 0, raising flag"));
log("Raising flag for arcmail in %s", p); log("Raising flag for arcmail in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
@@ -928,6 +937,33 @@ int session(void)
} }
} }
if ( (p = conf_string(cf_inctic_flag)) )
if (pi.traffic_rcvd.ticfile_num > 0) {
DEB((D_EVENT, "Incoming TIC files > 0, raising flag"));
log("Raising flag for TIC in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (fd == -1) {
DEB((D_EVENT, "Error raising ticfiles flag"));
log("Error creating flag for ticfiles in %s", p);
} else {
/* all ok - closing file */
close(fd);
}
}
if ( (p = conf_string(cf_incfile_flag)) )
if (pi.traffic_rcvd.files_size > 0) {
DEB((D_EVENT, "Incoming FILES > 0, raising flag"));
log("Raising flag for files in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (fd == -1) {
DEB((D_EVENT, "Error raising files flag"));
log("Error creating flag for files in %s", p);
} else {
/* all ok - closing file */
close(fd);
}
}
/* /*
* Save session traffic before deiniting * Save session traffic before deiniting
*/ */
+2 -2
View File
@@ -58,11 +58,11 @@ static char *session_stat_get_stsfile(s_faddr *addr, int linenum)
addr->zone, addr->net, addr->zone, addr->net,
addr->node, addr->point); addr->node, addr->point);
else else
sprintf(buf, "%u.%u.%u.%u-%u.sts", sprintf(buf, "%u.%u.%u.%u-%d.sts",
addr->zone, addr->net, addr->zone, addr->net,
addr->node, addr->point, linenum); addr->node, addr->point, linenum);
yield = string_concat(p_stsdir, buf, NULL); yield = string_concat(p_stsdir, buf, '\0');
} }
return yield; return yield;
+33 -6
View File
@@ -109,6 +109,22 @@ int file_lock_wait(FILE *fp, bool exclusive)
return -1; return -1;
} }
void getrandname(char * buf, u_int size)
{
srand((unsigned int)time(NULL));
char c;
int i;
for (i = 0; i<size; i++)
{
c = rand();
// Only ASCII 0..9A..Z
while ( (c > 90) || (c < 48) || ( ( c > 57) && ( c < 65 ) ) )
c = rand();
buf[i] = c;
}
buf[size]='\0';
}
bool file_name_issafe(int ch) bool file_name_issafe(int ch)
{ {
if( ch == '!' ) return TRUE; if( ch == '!' ) return TRUE;
@@ -145,17 +161,28 @@ char *file_name_makesafe(char *filename)
char *file_getname(char *filename) char *file_getname(char *filename)
{ {
char *p = strrchr(filename, '/'); char *p = strrchr(filename, '/');
DEB((D_FREE, "File_getname: %s", (p ? p + 1 : filename) ));
return p ? p + 1 : filename; return p ? p + 1 : filename;
} }
char *file_gettmp(void) char *file_gettmp(void)
{ {
char *tmp = xstrcpy("/tmp/bforce-XXXXXX"); char *chunk = xmalloc(7);
char *res = mktemp(tmp); char *res = NULL;
if (chunk)
if( !res ) {
free(tmp); getrandname(chunk,6);
chunk[6] = '\0';
char *tmp = xstrcpy("/tmp/bforce-");
res = string_concat(tmp, chunk, '\0');
if( chunk )
free(chunk);
if( !res )
free(tmp);
}
return res; return res;
} }
+4 -2
View File
@@ -189,7 +189,8 @@ static int ftn_addrparse_fido(s_faddr *addr, const char *s, bool wildcard)
{ {
strnxcpy(addr->domain, string_printable(p), sizeof(addr->domain)); strnxcpy(addr->domain, string_printable(p), sizeof(addr->domain));
} }
DEB((D_INFO,"u_ftn: Parsed ftn address z:%d, net:%d, node:%d, point:%d",
addr->zone, addr->net, addr->node, addr->point));
return badaddr; return badaddr;
} }
@@ -325,7 +326,8 @@ int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard)
addr->net = DEFAULT_NET; addr->net = DEFAULT_NET;
addr->node = DEFAULT_NODE; addr->node = DEFAULT_NODE;
addr->point = 0; addr->point = 0;
DEB((D_INFO, "u_ftn: parsing ftnaddr %s", s));
if( addr->inetform ) if( addr->inetform )
badaddr = ftn_addrparse_inet(addr, s, wildcard); badaddr = ftn_addrparse_inet(addr, s, wildcard);
else else
+1
View File
@@ -81,6 +81,7 @@ void *xrealloc(void *buf, size_t size)
else if( (tmp = (char*)(buf ? realloc(buf, size) : malloc(size))) == NULL ) else if( (tmp = (char*)(buf ? realloc(buf, size) : malloc(size))) == NULL )
{ {
log("failed to reallocate %ld bytes -> abort", size); log("failed to reallocate %ld bytes -> abort", size);
if( buf ) free(buf);
abort(); abort();
} }
+11 -11
View File
@@ -152,7 +152,13 @@ int plock_link(const char *lockname, const char *tmpname)
int plock_create(const char *lockname) int plock_create(const char *lockname)
{ {
int rc; int rc;
char *tmpname, *p; char *tmpname, *p, *chunk;
chunk = xmalloc(7);
if (!chunk) {
logerr("can't generate unique file name from \"%s\"", tmpname);
DEB((D_FREE, "plock freed"));
return PLOCK_ERROR;
}
ASSERT(lockname != NULL); ASSERT(lockname != NULL);
@@ -166,16 +172,10 @@ int plock_create(const char *lockname)
DEB((D_FREE, "plock freed")); DEB((D_FREE, "plock freed"));
return PLOCK_ERROR; return PLOCK_ERROR;
} }
tmpname = xstrcat(tmpname, "bforce-XXXXXX"); tmpname = xstrcat(tmpname, "bforce-");
if( (p = mktemp(tmpname)) == NULL ) getrandname(chunk,6);
{ p = string_concat(tmpname,chunk,'\0');
logerr("can't generate unique file name from \"%s\"", tmpname);
DEB((D_FREE, "plock free"));
free(tmpname);
DEB((D_FREE, "plock freed"));
return PLOCK_ERROR;
}
if( (rc = plock_write(p)) == PLOCK_OK ) if( (rc = plock_write(p)) == PLOCK_OK )
rc = plock_link(lockname, p); rc = plock_link(lockname, p);
+3
View File
@@ -598,6 +598,8 @@ int string_parse(char **dest, int items, char *str, int separator)
{ {
int count = 0; int count = 0;
char *p = str; char *p = str;
//if ( *((unsigned char *)p) == separator )
// p++;
dest[count++] = str; dest[count++] = str;
@@ -606,6 +608,7 @@ int string_parse(char **dest, int items, char *str, int separator)
if( *((unsigned char *)p) == separator ) if( *((unsigned char *)p) == separator )
{ {
*p++ = '\0'; *p++ = '\0';
// DEB((D_INDEX,"Parsed string: %s", dest[count]));
dest[count++] = p; dest[count++] = p;
} else } else
++p; ++p;
+12 -9
View File
@@ -173,18 +173,20 @@ long time_gmtoffset(void)
time_t tt = time(NULL); time_t tt = time(NULL);
struct tm local = *localtime(&tt); struct tm local = *localtime(&tt);
struct tm gmt = *gmtime(&tt); struct tm gmt = *gmtime(&tt);
long tz = gmt.tm_yday - local.tm_yday; long tz = 0; /* = local.tm_yday - gmt.tm_yday;
if( tz > 1 ) if( tz > 1 )
tz = -24; tz = -24;
else if( tz < -1 ) else if( tz < -1 )
tz = 24; tz = +24;
else else
tz *= 24; tz *= 24; */
tz += gmt.tm_hour - local.tm_hour; /*tz += gmt.tm_hour - local.tm_hour;
tz *= 60; tz *= 60;
tz += gmt.tm_min - local.tm_min; tz += gmt.tm_min - local.tm_min;*/
tz = (gmt.tm_hour*60+gmt.tm_min) - (local.tm_hour*60+local.tm_min);
return tz; return tz;
} }
@@ -200,12 +202,13 @@ long time_gmtoffset(void)
*/ */
char *time_string_gmtoffset(char *buffer) char *time_string_gmtoffset(char *buffer)
{ {
long tz = time_gmtoffset(); long tz = -time_gmtoffset();
char sign = (tz > 0)?'+':'-'; char sign = (tz > 0)?'+':'-';
int hour = tz/60; tz = abs(tz);
int mint = tz%60; unsigned int hour = tz/60;
unsigned int mint = tz%60;
sprintf(buffer, "%c%02d%02d", sign, hour, mint); sprintf(buffer, "%c%02u%02u", sign, hour, mint);
return buffer; return buffer;
} }
+47 -6
View File
@@ -29,11 +29,12 @@ bool eventexpr(s_expr *expr)
static void usage(void) static void usage(void)
{ {
printf_usage("nodelist compiler", printf_usage("nodelist compiler",
"usage: bfindex [-fh]\n" "usage: bfindex [-fh] [-C config]\n"
"\n" "\n"
"options:\n" "options:\n"
" -f force nodelist compiling\n" " -f force nodelist compiling\n"
" -h show this help message\n" " -h show this help message\n"
" -C config use config\n"
"\n" "\n"
); );
} }
@@ -42,6 +43,7 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
{ {
s_bni bni; s_bni bni;
char buf[1024]; char buf[1024];
bool modepoint = FALSE;
long countnodes = 0L; long countnodes = 0L;
long countlines = 0L; long countlines = 0L;
enum nodelist_keyword keyword; enum nodelist_keyword keyword;
@@ -52,6 +54,9 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
bni.node = addr.node; bni.node = addr.node;
bni.point = addr.point; bni.point = addr.point;
DEB((D_INDEX, "Start create index for addr: %u:%u/%u.%u", bni.zone,
bni.net, bni.node, bni.point));
if( nodelist_createheader(nlp) == -1 ) if( nodelist_createheader(nlp) == -1 )
{ {
log("cannot create nodelist index header"); log("cannot create nodelist index header");
@@ -80,13 +85,16 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
if( (p = strchr(buf, ',')) ) if( (p = strchr(buf, ',')) )
{ {
//DEB((D_INDEX, "index: parse comma: %s", p ));
*p++ = '\0'; *p++ = '\0';
if( (q = strchr(p, ',')) ) *q = '\0'; if( (q = strchr(p, ',')) ) *q = '\0';
} }
if( p == NULL || *p == '\0' ) if( p == NULL || *p == '\0' )
{ {
log("incorrect nodelist line %ld: Short line", countlines); log("incorrect nodelist line %ld: Short line", countlines);
DEB((D_INDEX,"incorrect nodelist line %ld: Short line", countlines));
continue; continue;
} }
@@ -94,20 +102,28 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
{ {
log("incorrect nodelist line %d: Bad keyword \"%s\"", log("incorrect nodelist line %d: Bad keyword \"%s\"",
countlines, buf); countlines, buf);
DEB((D_INDEX,"incorrect nodelist line %d: Bad keyword \"%s\"",
countlines, buf));
continue; continue;
} }
//DEB((D_INDEX,"index: keyword=%d", keyword));
if( keyword == KEYWORD_BOSS ) if( keyword == KEYWORD_BOSS )
{ {
s_faddr tmpaddr; s_faddr tmpaddr;
if( ftn_addrparse(&tmpaddr, p, FALSE) ) if( ftn_addrparse(&tmpaddr, p, FALSE) )
{ {
DEB((D_INDEX,"incorrect nodelist line %ld: Bad boss address \"%s\"",
countlines, p));
log("incorrect nodelist line %ld: Bad boss address \"%s\"", log("incorrect nodelist line %ld: Bad boss address \"%s\"",
countlines, p); countlines, p);
} }
else else
{ {
DEB((D_INDEX,"index: parsing Boss %u:%u/%u.0",
tmpaddr.zone, tmpaddr.net, tmpaddr.node));
if (addr.point == -1 )
modepoint = true;
bni.zone = tmpaddr.zone; bni.zone = tmpaddr.zone;
bni.net = tmpaddr.net; bni.net = tmpaddr.net;
bni.node = tmpaddr.node; bni.node = tmpaddr.node;
@@ -127,40 +143,53 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
switch(keyword) { switch(keyword) {
case KEYWORD_ZONE: case KEYWORD_ZONE:
bni.zone = value; bni.zone = value;
bni.net = 0; bni.net = value; // zxalexis
bni.node = 0; bni.node = 0;
bni.point = 0; bni.point = 0;
bni.hub = 0; bni.hub = 0;
modepoint = false;
break; break;
case KEYWORD_REGION: case KEYWORD_REGION:
bni.net = value; bni.net = value;
bni.node = 0; bni.node = 0;
bni.point = 0; bni.point = 0;
bni.hub = 0; bni.hub = 0;
modepoint = false;
break; break;
case KEYWORD_HOST: case KEYWORD_HOST:
bni.net = value; bni.net = value;
bni.node = 0; bni.node = 0;
bni.point = 0; bni.point = 0;
bni.hub = 0; bni.hub = 0;
modepoint = false;
break; break;
case KEYWORD_HUB: case KEYWORD_HUB:
bni.node = value; bni.node = value;
bni.point = 0; bni.point = 0;
bni.hub = value; bni.hub = value;
modepoint = false;
break; break;
case KEYWORD_EMPTY: case KEYWORD_EMPTY:
if (modepoint)
{
//DEB((D_INDEX,"found empty value=%u",value ));
bni.point = value;
break;
}
case KEYWORD_PVT: case KEYWORD_PVT:
case KEYWORD_HOLD: case KEYWORD_HOLD:
case KEYWORD_DOWN: case KEYWORD_DOWN:
bni.node = value; bni.node = value;
bni.point = 0; bni.point = 0;
modepoint = false;
break; break;
case KEYWORD_POINT: case KEYWORD_POINT:
DEB((D_INDEX,"index: kw point"));
bni.point = value; bni.point = value;
break; break;
default: default:
ASSERT_MSG(); ASSERT_MSG();
DEB((D_INDEX,"index: default assert"));
} }
if( nodelist_putindex(nlp, &bni) == -1 ) if( nodelist_putindex(nlp, &bni) == -1 )
@@ -182,10 +211,12 @@ int main(int argc, char *argv[])
{ {
s_cval_entry *cfptr; s_cval_entry *cfptr;
char *nodelistdir = NULL; char *nodelistdir = NULL;
char *confname = NULL;
time_t starttime = 0L; time_t starttime = 0L;
bool forcecompile = FALSE; bool forcecompile = FALSE;
long countnodes = 0L; long countnodes = 0L;
char c; char c;
int rc = 0;
/* Initialise random number generation */ /* Initialise random number generation */
(void)srand((unsigned)time(0)); (void)srand((unsigned)time(0));
@@ -193,7 +224,7 @@ int main(int argc, char *argv[])
(void)setlocale(LC_ALL, ""); (void)setlocale(LC_ALL, "");
/* Set our name (for logging only) */ /* Set our name (for logging only) */
while( (c = getopt(argc, argv, "hf")) != (char)-1 ) while( (c = getopt(argc, argv, "hfC:")) != (char)-1 )
{ {
switch( c ) { switch( c ) {
case 'f': case 'f':
@@ -202,15 +233,25 @@ int main(int argc, char *argv[])
case 'h': case 'h':
usage(); usage();
exit(0); exit(0);
case 'C':
if( confname || !optarg ) { usage(); exit(5); }
confname = (char *)xstrcpy(optarg);
break;
default: default:
usage(); usage();
exit(5); exit(5);
} }
} }
if( conf_readconf(conf_getconfname(), 0, false) ) if( confname && *confname )
rc = conf_readconf(confname, 0, false);
else
rc = conf_readconf(conf_getconfname(), 0, false);
if( rc )
{ {
log("Can not find config");
exit(1); exit(1);
} }
+18 -3
View File
@@ -44,7 +44,7 @@ bool eventexpr(s_expr *expr)
static void usage(void) static void usage(void)
{ {
printf_usage("outbound viewer", printf_usage("outbound viewer",
"usage: bfstat [-afhprst] [-n<number>]\n" "usage: bfstat [-C config] [-afhprst] [-n<number>]\n"
"\n" "\n"
"options:\n" "options:\n"
" -a sort by FTN address (default)\n" " -a sort by FTN address (default)\n"
@@ -56,6 +56,7 @@ static void usage(void)
" -r reverse order while sorting\n" " -r reverse order while sorting\n"
" -s sort by total files size\n" " -s sort by total files size\n"
" -t disable total sizes printing\n" " -t disable total sizes printing\n"
" -C config use config file\n"
"\n" "\n"
); );
} }
@@ -248,8 +249,10 @@ int main(int argc, char *argv[])
s_opts opts; s_opts opts;
s_sysqueue queue; s_sysqueue queue;
s_outbound_callback_data ocb; s_outbound_callback_data ocb;
char *confname = NULL;
char c; char c;
int i; int i;
int rc = 0;
bfstat_opts_default(&opts); bfstat_opts_default(&opts);
@@ -288,6 +291,10 @@ int main(int argc, char *argv[])
if( ISDEC(optarg) ) if( ISDEC(optarg) )
opts.nodeslimit = atoi(optarg); opts.nodeslimit = atoi(optarg);
break; break;
case 'C':
if( confname || !optarg ) { usage(); exit(BFERR_FATALERROR); }
confname = (char *)xstrcpy(optarg);
break;
default: default:
usage(); usage();
exit(1); exit(1);
@@ -301,8 +308,16 @@ int main(int argc, char *argv[])
/* Initialise current locale */ /* Initialise current locale */
(void)setlocale(LC_ALL, ""); (void)setlocale(LC_ALL, "");
if( conf_readconf(conf_getconfname(), 0, false) ) if( confname && *confname )
exit(1); rc = conf_readconf(confname, 0, false);
else
rc = conf_readconf(conf_getconfname(), 0, false);
if( rc )
{
log("Can not find config");
exit(BFERR_FATALERROR);
}
memset(&ocb, '\0', sizeof(s_outbound_callback_data)); memset(&ocb, '\0', sizeof(s_outbound_callback_data));
ocb.callback = out_handle_sysqueue; ocb.callback = out_handle_sysqueue;
+31 -8
View File
@@ -28,12 +28,13 @@ bool eventexpr(s_expr *expr)
static void usage(void) static void usage(void)
{ {
printf_usage("nodelist lookup utility", printf_usage("nodelist lookup utility",
"usage: nlookup [-rmh] <address>\n" "usage: nlookup [-C config] [-rmh] <address>\n"
"\n" "\n"
"options:\n" "options:\n"
" -r show nodelist string\n" " -r show nodelist string\n"
" -m show email address\n" " -m show email address\n"
" -h show this help message\n" " -h show this help message\n"
" -C config use config file\n"
"\n" "\n"
); );
} }
@@ -82,7 +83,7 @@ void print_nodeinfo(const s_node *node)
timevec_check(&node->worktime, now) ? "false" : "true"); timevec_check(&node->worktime, now) ? "false" : "true");
} }
if( node->sysop && *node->sysop && strcmp(node->sysop, "<none>") ) if( (node->keyword != KEYWORD_POINT) && node->sysop && *node->sysop && strcmp(node->sysop, "<none>") )
{ {
char username[BNI_MAXSYSOP+1]; char username[BNI_MAXSYSOP+1];
@@ -127,6 +128,8 @@ int main(int argc, char *argv[])
s_node node; s_node node;
s_faddr addr; s_faddr addr;
char ch; char ch;
int rc = 0;
char *confname = NULL;
bool rawstring = FALSE; bool rawstring = FALSE;
bool emailaddr = FALSE; bool emailaddr = FALSE;
@@ -135,7 +138,7 @@ int main(int argc, char *argv[])
/* Initialise current locale */ /* Initialise current locale */
(void)setlocale(LC_ALL, ""); (void)setlocale(LC_ALL, "");
while( (ch=getopt(argc, argv, "hrm")) != (char)-1 ) while( (ch=getopt(argc, argv, "hdrmC:")) != (char)-1 )
{ {
switch( ch ) { switch( ch ) {
case 'h': case 'h':
@@ -147,6 +150,10 @@ int main(int argc, char *argv[])
case 'm': case 'm':
emailaddr = TRUE; emailaddr = TRUE;
break; break;
case 'C':
if( confname || !optarg ) { usage(); exit(BFERR_FATALERROR); }
confname = (char *)xstrcpy(optarg);
break;
default: default:
usage(); usage();
exit(BFERR_FATALERROR); exit(BFERR_FATALERROR);
@@ -159,8 +166,18 @@ int main(int argc, char *argv[])
exit(BFERR_FATALERROR); exit(BFERR_FATALERROR);
} }
if( conf_readconf(conf_getconfname(), 0, false) ) if( confname && *confname )
rc = conf_readconf(confname, 0, false);
else
rc = conf_readconf(conf_getconfname(), 0, false);
if( rc )
{
DEB((D_NODELIST,"nlookup: Can not find config"));
exit(BFERR_FATALERROR); exit(BFERR_FATALERROR);
}
DEB((D_NODELIST,"Starting nlookup"));
if( rawstring ) if( rawstring )
{ {
@@ -171,10 +188,16 @@ int main(int argc, char *argv[])
} }
else if( nodelist_lookup(&node, addr) == 0 ) else if( nodelist_lookup(&node, addr) == 0 )
{ {
if( emailaddr ) if (addr.point == 0) {
print_nodemail(&node); if( emailaddr )
else print_nodemail(&node);
print_nodeinfo(&node); else
print_nodeinfo(&node);
}
else
{
print_nodeinfo(&node);
}
} }
deinit_conf(); deinit_conf();
+5 -6
View File
@@ -580,12 +580,12 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='bforce' PACKAGE_NAME='bforce'
PACKAGE_TARNAME='bforce' PACKAGE_TARNAME='bforce'
PACKAGE_VERSION='0.24.1' PACKAGE_VERSION='0.26.2'
PACKAGE_STRING='bforce 0.24.1' PACKAGE_STRING='bforce 0.26.2'
PACKAGE_BUGREPORT='zx@zxalexis.ru' PACKAGE_BUGREPORT='zx@zxalexis.ru'
PACKAGE_URL='https://prj.zxalexis.ru/gitea/zx/bforce.git' PACKAGE_URL='https://prj.zxalexis.ru/gitea/zx/bforce.git'
ac_default_prefix=/usr/local/fido ac_default_prefix=/usr
# Factoring default headers for most tests. # Factoring default headers for most tests.
ac_includes_default="\ ac_includes_default="\
#include <stdio.h> #include <stdio.h>
@@ -1436,7 +1436,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
bforce configure 0.24 bforce configure 0.26
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -5792,7 +5792,7 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi fi
ac_config_files="$ac_config_files ../debian/Makefile" ac_config_files="$ac_config_files"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure
@@ -6486,7 +6486,6 @@ do
case $ac_config_target in case $ac_config_target in
"include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"../debian/Makefile") CONFIG_FILES="$CONFIG_FILES ../debian/Makefile" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac esac
+1 -1
View File
@@ -3,7 +3,7 @@ dnl
dnl $Id$ dnl $Id$
dnl dnl
#AC_INIT(bforce/bforce.c) #AC_INIT(bforce/bforce.c)
AC_INIT([bforce],[0.24.1],[zx@zxalexis.ru]) AC_INIT([bforce],[0.26.2],[zx@zxalexis.ru])
AC_CONFIG_HEADER(include/config.h) AC_CONFIG_HEADER(include/config.h)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
dnl # Minimum Autoconf version required. dnl # Minimum Autoconf version required.
+2 -2
View File
@@ -181,8 +181,8 @@ typedef struct {
*/ */
extern const char *BFERR[]; extern const char *BFERR[];
extern char * mainenv[];
int daemon_run(const char *confname, const char *incname, bool quit); int daemon_run(const char *confname, const char *incname, bool quit);
extern char ** mainenv;
#endif #endif
+117 -112
View File
@@ -141,8 +141,8 @@ typedef struct override {
char *sPhone; char *sPhone;
char *sFlags; char *sFlags;
s_timevec worktime; s_timevec worktime;
s_timevec freqtime; s_timevec freqtime;
char *run; char *run;
struct override *hidden; /* Hidden lines list */ struct override *hidden; /* Hidden lines list */
} s_override; } s_override;
@@ -159,125 +159,130 @@ typedef struct filebox {
} s_filebox; } s_filebox;
typedef enum { typedef enum {
cf_address, cf_address, // 0
cf_amiga_outbound_directory, cf_amiga_outbound_directory, // 1
cf_binkp_timeout, cf_binkp_timeout, // 2
cf_daemon_circle, cf_daemon_circle, // 3
cf_daemon_circle_crash, cf_daemon_circle_crash, // 4
cf_daemon_circle_direct, cf_daemon_circle_direct, // 5
cf_daemon_circle_immed, cf_daemon_circle_immed, // 6
cf_daemon_circle_modem, cf_daemon_circle_modem, // 7
cf_daemon_circle_normal, cf_daemon_circle_normal, // 8
cf_daemon_circle_rescan, cf_daemon_circle_rescan, // 9
cf_daemon_maxclients_modem, cf_daemon_maxclients_modem, // 10
cf_daemon_maxclients_tcpip, cf_daemon_maxclients_tcpip, // 11
cf_daemon_pid_file, cf_daemon_pid_file, // 12
cf_delay_files_recv, cf_delay_files_recv, // 13
cf_delay_files_send, cf_delay_files_send, // 14
cf_disable_aka_matching, cf_disable_aka_matching, // 15
cf_domain, cf_domain, // 16
cf_emsi_FR_time, cf_emsi_FR_time, // 17
cf_emsi_OH_time, cf_emsi_OH_time, // 18
cf_emsi_slave_sends_nak, cf_emsi_slave_sends_nak, // 19
cf_filebox, cf_emsi_send_tz, // 20
cf_filebox_directory, cf_emsi_send_time, // 21
cf_flags, cf_filebox, // 22
cf_flo_translate, cf_filebox_directory, // 23
cf_freq_alias_list, cf_flags, // 24
cf_freq_dir_list, cf_flo_translate, // 25
cf_freq_ignore_masks, cf_freq_alias_list, // 26
cf_freq_limit_number, cf_freq_dir_list, // 27
cf_freq_limit_size, cf_freq_ignore_masks, // 28
cf_freq_limit_time, cf_freq_limit_number, // 29
cf_freq_min_speed, cf_freq_limit_size, // 30
cf_freq_srif_command, cf_freq_limit_time, // 31
cf_incnet_flag, cf_freq_min_speed, // 32
cf_incarc_flag, cf_freq_srif_command, // 33
cf_hide_our_aka, cf_incnet_flag, // 34
cf_history_file, cf_incarc_flag, // 35
cf_hydra_options, cf_inctic_flag, // 36
cf_hydra_mincps_recv, cf_incfile_flag, // 37
cf_hydra_mincps_send, cf_hide_our_aka, // 38
cf_hydra_tx_window, cf_history_file, // 39
cf_hydra_rx_window, cf_hydra_options, // 40
cf_inbound_directory, cf_hydra_mincps_recv, // 41
cf_location, cf_hydra_mincps_send, // 42
cf_log_file, cf_hydra_tx_window, // 43
cf_log_file_daemon, cf_hydra_rx_window, // 44
cf_max_speed, cf_inbound_directory, // 45
cf_maxtries, cf_location, // 46
cf_maxtries_nodial, cf_log_file, // 47
cf_maxtries_noansw, cf_log_file_daemon, // 48
cf_maxtries_noconn, cf_max_speed, // 49
cf_maxtries_hshake, cf_maxtries, // 50
cf_maxtries_sessions, cf_maxtries_nodial, // 51
cf_min_cps_recv, cf_maxtries_noansw, // 52
cf_min_cps_send, cf_maxtries_noconn, // 53
cf_min_cps_time, cf_maxtries_hshake, // 54
cf_min_free_space, cf_maxtries_sessions, // 55
cf_min_speed_in, cf_min_cps_recv, // 56
cf_min_speed_out, cf_min_cps_send, // 57
cf_mode_netmail, cf_min_cps_time, // 58
cf_mode_arcmail, cf_min_free_space, // 59
cf_mode_request, cf_min_speed_in, // 60
cf_mode_ticfile, cf_min_speed_out, // 61
cf_mode_default, cf_mode_netmail, // 62
cf_modem_can_send_break, cf_mode_arcmail, // 63
cf_modem_dial_prefix, cf_mode_request, // 64
cf_modem_dial_suffix, cf_mode_ticfile, // 65
cf_modem_dial_response, cf_mode_default, // 66
cf_modem_hangup_command, cf_modem_can_send_break, // 67
cf_modem_port, cf_modem_dial_prefix, // 68
cf_modem_reset_command, cf_modem_dial_suffix, // 69
cf_modem_stat_command, cf_modem_dial_response, // 70
cf_nodelist, cf_modem_hangup_command, // 71
cf_nodelist_directory, cf_modem_port, // 72
cf_nodial_flag, cf_modem_reset_command, // 73
cf_override, cf_modem_stat_command, // 74
cf_options, cf_nodelist, // 75
cf_outbound_directory, cf_nodelist_directory, // 76
cf_password, cf_nodial_flag, // 77
cf_phone, cf_override, // 78
cf_phone_translate, cf_options, // 79
cf_recode_file_in, cf_outbound_directory, // 80
cf_recode_file_out, cf_password, // 81
cf_recode_intro_in, cf_phone, // 82
cf_recv_buffer_size, cf_phone_translate, // 83
cf_rescan_delay, cf_proto_order, // 84
cf_run_after_handshake, cf_recode_file_in, // 85
cf_run_after_session, cf_recode_file_out, // 86
cf_run_before_session, cf_recode_intro_in, // 87
cf_session_limit_in, cf_recv_buffer_size, // 88
cf_session_limit_out, cf_rescan_delay, // 89
cf_skip_files_recv, cf_run_after_handshake, // 90
cf_status_directory, cf_run_after_session, // 91
cf_system_name, cf_run_before_session, // 92
cf_sysop_name, cf_session_limit_in, // 93
cf_uucp_lock_directory, cf_session_limit_out, // 94
cf_wait_carrier_in, cf_skip_files_recv, // 95
cf_wait_carrier_out, cf_status_directory, // 96
cf_zmodem_mincps_recv, cf_system_name, // 97
cf_zmodem_mincps_send, cf_sysop_name, // 98
cf_zmodem_send_dummy_pkt, cf_uucp_lock_directory, // 99
cf_zmodem_skip_by_pos, cf_wait_carrier_in, // 100
cf_zmodem_start_block_size, cf_wait_carrier_out, // 101
cf_zmodem_tx_window, cf_zmodem_mincps_recv, // 102
cf_nomail_flag, cf_zmodem_mincps_send, // 103
cf_bind_ip, cf_zmodem_send_dummy_pkt, // 104
cf_recieved_to_lower, cf_zmodem_skip_by_pos, // 105
cf_zmodem_start_block_size, // 106
cf_zmodem_tx_window, // 107
cf_nomail_flag, // 108
cf_bind_ip, // 109
cf_recieved_to_lower, // 110
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
cf_syslog_facility, cf_syslog_facility,
#endif #endif
#ifdef DEBUG #ifdef DEBUG
cf_debug_file, cf_debug_file, // 111
cf_debug_level, cf_debug_level, // 112
#endif #endif
cf_split_inbound, cf_split_inbound, // 113
#ifdef NETSPOOL #ifdef NETSPOOL
cf_netspool_host, cf_netspool_host,
cf_netspool_port, cf_netspool_port,
#endif #endif
cf_fidodnszone, cf_fidodnszone, // 114
BFORCE_NUMBER_OF_KEYWORDS BFORCE_NUMBER_OF_KEYWORDS
} bforce_config_keyword; } bforce_config_keyword;
+4 -3
View File
@@ -48,6 +48,7 @@ enum { LOG_FILE_DAEMON, LOG_FILE_SESSION, LOG_FILE_DEBUG, LOG_FILE_HISTORY };
#define D_DAEMON 0x0001000L #define D_DAEMON 0x0001000L
#define D_24554 0x0002000L #define D_24554 0x0002000L
#define D_FREE 0x0004000L #define D_FREE 0x0004000L
#define D_INDEX 0x0008000L
#define D_FULL 0xfffffffL #define D_FULL 0xfffffffL
#endif #endif
@@ -65,8 +66,8 @@ void log_setident(const char *ident);
int log_open(const char *logname, const char *ext, const char *tty); int log_open(const char *logname, const char *ext, const char *tty);
int log_close(void); int log_close(void);
int log_reopen(const char *logname, const char *ext, const char *tty); int log_reopen(const char *logname, const char *ext, const char *tty);
int log(const char *s, ...); void log(const char *s, ...);
int logerr(const char *s, ...); void logerr(const char *s, ...);
#ifdef DEBUG #ifdef DEBUG
//void debug_setlevel(long newlevel, bool logit); //void debug_setlevel(long newlevel, bool logit);
@@ -75,7 +76,7 @@ bool debug_isopened(void);
//int debug_parsestring(char *str, unsigned long *deblevel); //int debug_parsestring(char *str, unsigned long *deblevel);
int debug_open(); int debug_open();
int debug_close(); int debug_close();
int debug(unsigned long what, const char *str, ...); void debug(unsigned long what, const char *str, ...);
void debug_configure(); void debug_configure();
#endif #endif
+1
View File
@@ -159,6 +159,7 @@ s_node;
int nodelist_checkflag(const char *nodeflags, const char *flag); int nodelist_checkflag(const char *nodeflags, const char *flag);
int nodelist_keywordval(const char *keyword); int nodelist_keywordval(const char *keyword);
int nodelist_parsepoint(s_node *node, char *str);
int nodelist_parsestring(s_node *node, char *str); int nodelist_parsestring(s_node *node, char *str);
s_nodelist *nodelist_open(const char *dir, char *name, int mode); s_nodelist *nodelist_open(const char *dir, char *name, int mode);
int nodelist_checkheader(s_nodelist *nlp); int nodelist_checkheader(s_nodelist *nlp);
+1 -1
View File
@@ -19,7 +19,7 @@
#define EXEC_OPT_LOGOUT 0x04 #define EXEC_OPT_LOGOUT 0x04
#define EXEC_OPT_USESHELL 0x08 #define EXEC_OPT_USESHELL 0x08
#define EXEC_MAX_NUM_ENVS 4096 #define EXEC_MAX_NUM_ENVS 4095
#define EXEC_MAX_NUM_ARGS 20 #define EXEC_MAX_NUM_ARGS 20
#define EXEC_DEFAULT_UMASK ~(S_IRUSR|S_IWUSR); #define EXEC_DEFAULT_UMASK ~(S_IRUSR|S_IWUSR);
+1
View File
@@ -44,6 +44,7 @@ typedef struct traffic {
int freqed_num; int freqed_num;
int freqed_time; int freqed_time;
size_t freqed_size; size_t freqed_size;
int ticfile_num;
} s_traffic; } s_traffic;
/* /*
+5 -1
View File
@@ -116,7 +116,10 @@ struct compcodes
ZAP:1, /* ZedZap (Zmodem variant) */ ZAP:1, /* ZedZap (Zmodem variant) */
DZA:1, /* DirectZAP (Zmodem variant) */ DZA:1, /* DirectZAP (Zmodem variant) */
JAN:1, /* Janus */ JAN:1, /* Janus */
HYD:1; /* Hydra */ HYD:1, /* Hydra */
KER:1, /* Kermit, not supported */
SLK:1, /* SEALink, not supported */
TZA:1; /* TrapDoor DirectZAP, not supported */
UINT16 FRQ:1, /* The system will accept and process FREQs */ UINT16 FRQ:1, /* The system will accept and process FREQs */
NRQ:1, /* No file requests accepted by this system */ NRQ:1, /* No file requests accepted by this system */
@@ -148,6 +151,7 @@ struct emsi
char passwd[EMSI_MAXPASSWD+1]; char passwd[EMSI_MAXPASSWD+1];
s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */ s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */
s_compcodes compcodes; s_compcodes compcodes;
char proto_order[EMSI_MAXADDONS+1];
char m_pid[EMSI_MAXMPID+1]; char m_pid[EMSI_MAXMPID+1];
char m_name[EMSI_MAXMNAME+1]; char m_name[EMSI_MAXMNAME+1];
char m_ver[EMSI_MAXMVER+1]; char m_ver[EMSI_MAXMVER+1];
+7 -7
View File
@@ -78,13 +78,13 @@ typedef struct {
} s_session_passwd; } s_session_passwd;
typedef struct sendopts { typedef struct sendopts {
int fnc:1, /* Convert outgoing file names to 8+3 format */ unsigned int fnc:1, /* Convert outgoing file names to 8+3 format */
holdreq:1, /* Hold .REQ files? (file requests) */ holdreq:1, /* Hold .REQ files? (file requests) */
holdhold:1, /* Hold files with HOLD flavor? */ holdhold:1, /* Hold files with HOLD flavor? */
holdfiles:1, /* Hold all files except netmail + arcmail */ holdfiles:1, /* Hold all files except netmail + arcmail */
holdxt:1, /* Hold all except netmail? */ holdxt:1, /* Hold all except netmail? */
holdall:1, /* Hold ALL trafic!? */ holdall:1, /* Hold ALL trafic!? */
hydraRH1; /* Hydra RH1 mode (EMSI only) */ hydraRH1; /* Hydra RH1 mode (EMSI only) */
} s_sendopts; } s_sendopts;
/* /*
+6 -5
View File
@@ -46,10 +46,10 @@ enum day
typedef struct faddr { typedef struct faddr {
bool inetform; /* Is address in domain form? */ bool inetform; /* Is address in domain form? */
int zone; /* -1 value means any?! */ u_int zone; /* -1 value means any?! */
int net; u_int net;
int node; u_int node;
int point; u_int point;
char domain[BF_MAXDOMAIN+1]; char domain[BF_MAXDOMAIN+1];
} s_faddr; } s_faddr;
@@ -83,7 +83,7 @@ typedef struct message {
typedef struct packet { typedef struct packet {
s_faddr orig; s_faddr orig;
s_faddr dest; s_faddr dest;
int baud; u_int baud;
char password[8+1]; char password[8+1];
s_message *msgs; s_message *msgs;
int n_msgs; int n_msgs;
@@ -161,6 +161,7 @@ bool is_regfile(const char *filename);
int directory_create(const char *dirname, mode_t access_mode); int directory_create(const char *dirname, mode_t access_mode);
FILE *file_open(const char *path, const char *mode); FILE *file_open(const char *path, const char *mode);
int file_close(FILE *stream); int file_close(FILE *stream);
void getrandname(char * buf, u_int size);
/* u_ftn.c */ /* u_ftn.c */
int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard); int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard);
+1 -1
View File
@@ -21,7 +21,7 @@
#define BF_VERSION RELEASE_VERSION #define BF_VERSION RELEASE_VERSION
#define BF_CDATE __DATE__ __TIME__ #define BF_CDATE __DATE__ __TIME__
#define BF_REG "free software" #define BF_REG "free software"
#define BF_COPYRIGHT "(c) 1997-2000 by Alexander Belkin" #define BF_COPYRIGHT "(c) 1997-2000 by Alexander Belkin, 2004-2025 fidonet members"
#define BF_BANNERVER BF_NAME" "BF_VERSION"/"BF_OS #define BF_BANNERVER BF_NAME" "BF_VERSION"/"BF_OS
Binary file not shown.
Binary file not shown.
Binary file not shown.

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