43 Commits
Author SHA1 Message Date
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
zx bcf0d456ee Revert all except warning fixes 2024-05-14 23:45:29 +03:00
zx 39dd885dd0 fx README 2024-05-14 22:33:51 +03:00
zx 8b10d9f48a fx README 2024-05-14 22:33:05 +03:00
zx 27b4c624b3 env init probe 2024-05-14 21:30:43 +03:00
zx c2e418676b minor fix README.md 2024-05-14 18:45:35 +03:00
zx 0b2630f624 . 2024-05-14 00:52:05 +03:00
zx 097b39faa7 Minor fixes of Wunused_var, environment copy on subprocess creation 2024-05-14 00:00:37 +03:00
zx 30e860885f Fixed build on FreeBSD - autotools investigation req for proper bison/byacc switch 2024-05-13 10:24:37 +03:00
zx 132a6641f4 Flags renamed to incnet_flag and incarc_flag, fixed typos, READMEs and CHANGES files 2024-05-12 18:47:07 +03:00
zx f80d94413f Hide bison posix warning 2024-05-11 21:32:15 +03:00
zx ae156c4689 initial cfg change for flags incpkt_flag and incbdl_flag 2024-05-11 21:05:54 +03:00
zx 2827504df4 minor code style fixes 2024-05-11 19:47:40 +03:00
zx c2f9843291 Earlydbg as new -v option for main prog 2024-05-11 19:28:03 +03:00
73 changed files with 3317 additions and 1390 deletions
+12
View File
@@ -0,0 +1,12 @@
*.o
debian/Makefile
source/Makefile
source/bin/
source/bforce/expression.c
source/config.log
source/config.status
source/include/config.h
bforce.geany
+212
View File
@@ -58,3 +58,215 @@
then sending/receiving. Recode tables are compartible with HPT. New
config keywords: "Recode_file_in", "Recode_file_out", "Recode_intro_in"
Konstantin Stepanenkov, 2:5030/1251
0.22.7.kst1
===========
* Attempt to fix warnings, when compiling with -Wall.
+ make update -- install only binaries.
* Better EMSI handling, when calling to cisco.
+ Correct ZMH support in daemon.
* Some fixes in contributed perl scripts.
0.22.7.kst2
===========
+ Added option --with-uucp-lockdir=... to configure.
* Using strncpy(3) instead of strcpy(3) if possible.
Added patches by Maxi Rovnich @ 2:5030/872:
+ Support for maximum 'no dialtone' count.
+ Support for download resyncing, while checking for free space.
+ Ignore all files, but *.pnt, *.req, *.?lo and *.?ut in BSO.
0.22.7.kst3
===========
* Compilation failed with --disable-hangup-watch-cd. Fixed.
+ Ability to write daemon pid in file.
* -f option had reverse meaning. Thanks to Eugene Korovin @ 2:5080/196.72
+ -q option terminates daemon process (only if pidfile is used).
0.22.7.kst4
===========
* Hydra was broken in kst2. Fixed.
+ Bidirectional session drops only if rxcps and txcps are less than
mincps at the same time.
0.22.7.kst5
===========
+ port tcpip patch by Serge N. Pokhodyaev @ 2:5020/1838
* lock fix, when outbound on not lockable filesystem.
Patch by Andrew Dolgov @ 2:5030/394.41
0.22.7.kst6
===========
* traffic wasn't shown if no files in boxes.
Patch by Alexander Shiyan @ 2:5030/39.2
* bfstat now correctly shows age of files.
Patch by Alexander Shiyan @ 2:5030/39.2
* logging 'undefined cmd' fixed.
Thanks to Pavel I.Osipov @ 2:5020/770.50
0.22.8.kst7
===========
Some changes taken from 0.22.8 by Alexander Belkin:
* some bugfixes
+ new environment variable $RC (session return code)
+ sending of EMSI_ACK every time after recving of EMSI_DAT
+ support for nodelist IBN flag
0.22.8.kst8
===========
* fixed bug with flags CM in override
* fixed bug with sending HUP to daemon
Andrey Slusar <anray@users.sourceforge.net>
Evgeniy Kozhuhovskiy <e.kozhuhovskiy@gmail.com>
Sergey Babitch <vpooh@users.sourceforge.net>
0.22.8.ugenk1
=============
+ initial release, based on bforce 0.22.8.kst8
* fixed problem with worktime detecting
+ makefiles fixed (removed make update, now make install installs config files with extension .sample)
+ added --with-user and --with-group options to ``configure'' script.
+ installation directories by default are compliance with default fidogate installation
0.22.8.ugenk2
=============
* pathes by Andrey Slusar @ 2:467/126
(total 12: patch-bforce.c, patch-bfstat.c, patch-daemon.c, patch-expression.y,
patch-nlookup.c, patch-prot_binkp.c, patch-prot_emsi.c, patch-prot_yoohoo.c, patch-prot_zmrecv.c,
patch-prot_zmsend.c, patch-sess_call.c, patch-sess_stat.c)
+ added syslog support (see SYSLOG)
+ fixed nlookup (broken in ugenk1)
+ spec file now goes with bforce
0.22.8.ugenk3
=============
+ fixed working with syslog (not tested yet, any volonteers?)
* some bugfixes
0.22.8.ugenk4
=============
+ fixed problems with license (thnx to Jonathan Gonzales V. from gnu.org)
+ added nomail flag
- project moved to sourceforge.net (projectname - binkforce)
+ now --enable-syslog is by default! Read SYSLOG for details
+ nodelist mask detection (see sample config for details)
+ contrib/outman now supports bso (thnx to Andrew Leonov @ 2:4641/500.119)
0.22.8.ugenk5
=============
+ fixed ``got unexpected emsi sequence "EMSI_INQC816"''
+ added some features to INSTALL.ru
* added documentation about incoming sessions over ip/pstn by Igor Mitichev
0.22.8.ugenk6
=============
+ some changes in autoconf
* added Type to nlookup
* fixed 'Ñ' in FAQ
* added buggy-emsi option in configure. use it in case of problems with stupid mailers
* fixed hydra
0.22.9
======
+ Changed version for compliance with *BSD ports
+ Added possibility to run external program for each override and
hidden. See bforce.subst.sample for examples and
docs/readme.txt for details.
+ Implement binkp/1.1 (Multiple Batch Mode and Non-reliable Mode).
+ Turn on FREQ at binkp sessions.
fidoman (Sergey Dorofeev)
=== 2012-03 ===
$DEBUGLEVEL, $DEBUGFILE removed - please use configuration options
DNS zone support
=== 2012-02 ===
Netspool support
24554 protocol remake
=== 2011-12-25 ===
Cmdline processing code is partially rewritten.
New key -u for selection proto for IP session.
Added code to get node IP address from nodelist (INA flag).
Some maybe noisy messages in log added.
Some code rearrangements in session_call.
Added feature to try all available connection ways if not specified one
on calls from command line (IP methods then modem).
=== 2011-12-15 ===
Patch io_unix_tio.diff for OpenBSD systems running telnetted serial modem.
=== 2011-12-13 ===
Split inbound feature have added.
Received files from different links are placed in separate folders in inbound.
Use option "split_inbound" to enable this feature.
Alexander Skovpen <a.n.skovpen@gmail.com>
Max N. Boyarov <zotrix@users.noreply.github.com>
Alexey Khromov (zx@zxalexis.ru)
======
0.24.1
+ Added pre-init debugging (primarily of config readout) to stderr by -v
option. Vanished out errorful calls to "log" and "debug" before log and
debug files initialization.
+ Fixed build on 64-bit systems (amd64 and aarch64)
+ Initially added config options incpkt_flag and incbdl_flag to raise
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
-30
View File
@@ -1,30 +0,0 @@
=== 2012-03 ===
$DEBUGLEVEL, $DEBUGFILE removed - please use configuration options
DNS zone support
=== 2012-02 ===
Netspool support
24554 protocol remake
=== 2011-12-25 ===
Cmdline processing code is partially rewritten.
New key -u for selection proto for IP session.
Added code to get node IP address from nodelist (INA flag).
Some maybe noisy messages in log added.
Some code rearrangements in session_call.
Added feature to try all available connection ways if not specified one
on calls from command line (IP methods then modem).
=== 2011-12-15 ===
Patch io_unix_tio.diff for OpenBSD systems running telnetted serial modem.
=== 2011-12-13 ===
Split inbound feature have added.
Received files from different links are placed in separate folders in inbound.
Use option "split_inbound" to enable this feature.
-67
View File
@@ -1,67 +0,0 @@
0.22.7.kst1
===========
* Attempt to fix warnings, when compiling with -Wall.
+ make update -- install only binaries.
* Better EMSI handling, when calling to cisco.
+ Correct ZMH support in daemon.
* Some fixes in contributed perl scripts.
0.22.7.kst2
===========
+ Added option --with-uucp-lockdir=... to configure.
* Using strncpy(3) instead of strcpy(3) if possible.
Added patches by Maxi Rovnich @ 2:5030/872:
+ Support for maximum 'no dialtone' count.
+ Support for download resyncing, while checking for free space.
+ Ignore all files, but *.pnt, *.req, *.?lo and *.?ut in BSO.
0.22.7.kst3
===========
* Compilation failed with --disable-hangup-watch-cd. Fixed.
+ Ability to write daemon pid in file.
* -f option had reverse meaning. Thanks to Eugene Korovin @ 2:5080/196.72
+ -q option terminates daemon process (only if pidfile is used).
0.22.7.kst4
===========
* Hydra was broken in kst2. Fixed.
+ Bidirectional session drops only if rxcps and txcps are less than
mincps at the same time.
0.22.7.kst5
===========
+ port tcpip patch by Serge N. Pokhodyaev @ 2:5020/1838
* lock fix, when outbound on not lockable filesystem.
Patch by Andrew Dolgov @ 2:5030/394.41
0.22.7.kst6
===========
* traffic wasn't shown if no files in boxes.
Patch by Alexander Shiyan @ 2:5030/39.2
* bfstat now correctly shows age of files.
Patch by Alexander Shiyan @ 2:5030/39.2
* logging 'undefined cmd' fixed.
Thanks to Pavel I.Osipov @ 2:5020/770.50
0.22.8.kst7
===========
Some changes taken from 0.22.8 by Alexander Belkin:
* some bugfixes
+ new environment variable $RC (session return code)
+ sending of EMSI_ACK every time after recving of EMSI_DAT
+ support for nodelist IBN flag
0.22.8.kst8
===========
* fixed bug with flags CM in override
* fixed bug with sending HUP to daemon
-54
View File
@@ -1,54 +0,0 @@
0.22.8.ugenk1
=============
+ initial release, based on bforce 0.22.8.kst8
* fixed problem with worktime detecting
+ makefiles fixed (removed make update, now make install installs config files with extension .sample)
+ added --with-user and --with-group options to ``configure'' script.
+ installation directories by default are compliance with default fidogate installation
0.22.8.ugenk2
=============
* pathes by Andrey Slusar @ 2:467/126
(total 12: patch-bforce.c, patch-bfstat.c, patch-daemon.c, patch-expression.y,
patch-nlookup.c, patch-prot_binkp.c, patch-prot_emsi.c, patch-prot_yoohoo.c, patch-prot_zmrecv.c,
patch-prot_zmsend.c, patch-sess_call.c, patch-sess_stat.c)
+ added syslog support (see SYSLOG)
+ fixed nlookup (broken in ugenk1)
+ spec file now goes with bforce
0.22.8.ugenk3
=============
+ fixed working with syslog (not tested yet, any volonteers?)
* some bugfixes
0.22.8.ugenk4
=============
+ fixed problems with license (thnx to Jonathan Gonzales V. from gnu.org)
+ added nomail flag
- project moved to sourceforge.net (projectname - binkforce)
+ now --enable-syslog is by default! Read SYSLOG for details
+ nodelist mask detection (see sample config for details)
+ contrib/outman now supports bso (thnx to Andrew Leonov @ 2:4641/500.119)
0.22.8.ugenk5
=============
+ fixed ``got unexpected emsi sequence "EMSI_INQC816"''
+ added some features to INSTALL.ru
* added documentation about incoming sessions over ip/pstn by Igor Mitichev
0.22.8.ugenk6
=============
+ some changes in autoconf
* added Type to nlookup
* fixed 'Ñ' in FAQ
* added buggy-emsi option in configure. use it in case of problems with stupid mailers
* fixed hydra
0.22.9
======
+ Changed version for compliance with *BSD ports
+ Added possibility to run external program for each override and
hidden. See bforce.subst.sample for examples and
docs/readme.txt for details.
+ Implement binkp/1.1 (Multiple Batch Mode and Non-reliable Mode).
+ Turn on FREQ at binkp sessions.
+5 -2
View File
@@ -43,7 +43,9 @@ Q:
A: /All/
ugenkXX. Брать на http://sourceforge.net/projects/binkforce,
или с cvs там же.
A: /AK/
Переехало оттуда в гит, но лучше искать в профильных эхах.
Q: Как подключать нодлисты с цифровыми расширениями? Маски в конфиге bforce не
задаются.
A: /MR/
@@ -81,7 +83,7 @@ A: /KAS/
/GM/
Это мое и лежит оно тyт
http://btrieve.virtualave.net/files/bf0224-filebox.diff.rar
в моем патче, в отличие от пpедыдyщего, не все подpд имеют тип
в моем патче, в отличие от пpедыдyщего, не все подpяд имеют тип
TYPE_FILEBOX.
мыло - это TYPE_NETMAIL, эхи - TYPE_ARCMAIL и т.д.
Это yдобно дл пpосмотpа статистики поинтy - что на него лежит.
@@ -223,6 +225,7 @@ MR = Maxi Rovnich, 2:5030/872
PVC = Peter V. Chernikoff, 2:5020/2091
SNP = Serge N. Pokhodyaev, 2:5020/1838
VS = Valery Shishkov, 2:5040/9
AK = Alexey Khromov, 2:5030/723
Исправления и добавления в виде пар вопрос/ответ будут с благодарностью приняты
в netmail.
+26 -7
View File
@@ -1,10 +1,10 @@
В этом файле описывается процесс установки и настройки
фидонет-совместимого мейлера bforce 0.22.8.ugenk1.
фидонет-совместимого мейлера bforce 0.xx.
В данном документе приняты следующие обозначения:
<SRCDIR> - путь, куда вы распаковали тарболл с исходными
текстами bforce 0.22.8.ugenk1 (далее bforce)
текстами bforce 0.xx (далее bforce)
Тарболл - файл с расширением tar.gz, или tar.bz2
@@ -24,14 +24,14 @@ gmake
Распакуйте тарболл следующими командами:
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:
cd <SRCDIR>/bforce-0.22.8.ugenk1/source
Перейдите в директорию bforce/source:
cd <SRCDIR>/bforce/source
Для создания Makefile, который наиболее подходит к вашей
системе, наберите:
@@ -76,6 +76,11 @@ gmake install
Настройка
=========
Рекомендуется установить системную переменную BFCONFIG,
указывающую на местоположение конфигурации bforce.
Проще всего через /etc/environment для общесистемной или
.profile для переменной пользователя.
Для нормальной работы вам нужно отредактировать конфигурационные файлы
bforce. По умолчанию они находятся в /usr/local/fido/etc и называются
bforce.conf - основной конфигурационный файл bforce
@@ -125,6 +130,19 @@ cat `which mgetty` |strings |grep FIDO |wc -l
где 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
================================
К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие
@@ -150,6 +168,7 @@ init.d/bforce - init-
bfha - bforce history analyzer (bfha)
bfha/README - bfha README
bfha/bfha.pl - собственно, bfha
legacy-part.conf - файл для донастройки прав на /run/lock в systemd
u-srif - продвинутый freq-процессор
u-srif/u-srif-index.py \ с поддержой отчетов,
u-srif/u-srif-lookup.py \ ограничений,
-14
View File
@@ -1,14 +0,0 @@
BinkleyForce FTN mailer (Branch KST)
------------------------------------
Bug Reports
-----------
E-Mail : kst@moecho.org
FidoNet : Konstantin Stepanenkov, 2:5030/1251
New Versions
------------
http://kst.spb.ru/bforce/
+37 -10
View File
@@ -1,12 +1,26 @@
[![Build Status](https://travis-ci.org/askovpen/binkleyforce.svg?branch=master)](https://travis-ci.org/askovpen/binkleyforce)
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
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
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
@@ -14,19 +28,32 @@ any later version. See the COPYING file for further information.
Known Bugs
----------
- BinkD use and expect local file time at BinkP sessions, but
BinkleyForce allways use UTC time (?)
- BinkleyForce has no support (yet) for multiple INA: addresses
- Can not rotate hidden lines
- Can not rotate supported IP protocols in case of failure
Bug Reports
-----------
E-Mail : adb@newmail.ru
FidoNet : Alexander Belkin, 2:5020/1398.11
E-Mail : zx@zxalexis.ru
FidoNet : Alexey Khromov, 2:5030/723
New Versions
------------
http://adb.newmail.ru
https://prj.zxalexis.ru/gitea/zx/bforce
Copyright (c) 1998-2000 Alexander Belkin, Moscow, Russia.
Older Sources
-------------
https://github.com/zotrix/binkleyforce/
https://sourceforge.net/projects/binkforce/
Copyright <br>
> (c) 1998-2000 Alexander Belkin, Moscow, Russia.<br>
> (c) 2004-2007 Evgeniy Kozhuhovskiy 2:450/256, 2:450/267<br>
> (c) 2005 Andrey Slusar<br>
> (c) 2006-2016 Max N. Boyarov<br>
> (c) 2007-2008 Sergey Babitch<br>
> (c) 2011-2014 Sergey Dorofeev<br>
> (c) 2014 Alexander Skovpen<br>
> (c) 2024 Alexey Khromov<br>
-14
View File
@@ -1,14 +0,0 @@
BinkleyForce FTN mailer (Branch ugenk)
------------------------------------
Bug Reports
-----------
E-Mail : e.kozhuhovskiy@gmail.com
FidoNet : Evgeniy Kozhuhovskiy, 2:450/256, 2:450/267
New Versions
------------
http://ugenk.bas-net.by/
+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.
d /run/lock 0777 root lock -
L /var/lock - - - - ../run/lock
# /run/lock/subsys is used for serializing SysV service execution, and
# hence without use on SysV-less systems.
d /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 /opt/fidonms/etc/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 /opt/fidonms/etc/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 /opt/fidonms/etc/bforce.conf -i auto
}
+46 -4
View File
@@ -63,6 +63,12 @@ address 20:26/100.0@easynet
#
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 <domain_name> <outbound_dir> <zone>
@@ -78,8 +84,8 @@ options NoDirZap NoJanus NoChat
#log_file /var/log/bforce/bf-log
# Debugging information completness level. Debugging is disabled by
# default. Allowed debug levels: config, nodelist, outbound, info, hshake,
# ttyio, modem, prot, freq, daemon, full
# default. Allowed debug levels: config, override, event, nodelist, outbound,
# info, hshake, ttyio, modem, prot, freq, statem, daemon, 24554, free, full
#debug_file /var/log/bforce/bf-debug
#debug_level info hshake prot
@@ -91,6 +97,18 @@ options NoDirZap NoJanus NoChat
#
nodial_flag /etc/nodial
#
# Incoming flags
# Netmail:
#incnet_flag /var/spool/fido/flags/mail
# Arcmail:
#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
#
@@ -102,13 +120,13 @@ split_inbound yes
#
# 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.
# (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)
@@ -246,6 +264,10 @@ mode_request 100660
# '~' 1 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)
# ModemDev <device>[<:lock_speed>]
@@ -335,6 +357,9 @@ max_speed 57600
flags XW,V34B,IDC,LMD
emsi_OH_time 22:00-07:30
emsi_FR_time 22:30-05:30
#emsi_send_tz no
#emsi_send_time no
#
# Our receiver buffer size [bytes]
@@ -435,6 +460,23 @@ skip_files_recv *.pif *.swp
# setsid - run command in a new session
# 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_session [nowait,setsid]/usr/local/lib/ftp/run-in
#
+1 -1
View File
@@ -1 +1 @@
0.23
0.25.3
+1
View File
@@ -146,6 +146,7 @@ clean:
rm -f ./bin/core
clean-am:
rm -f ./Makefile
rm -f ../debian/Makefile
rm -f ./include/config.h
rm -f ./config.log
rm -f ./config.status
+33 -5
View File
@@ -23,6 +23,8 @@
/* PID of our child process (if use fork) */
pid_t child_pid = 0;
char * mainenv[EXEC_MAX_NUM_ENVS+1];
const char *BFERR[] = {
/* 00 */ "Successfull",
/* 01 */ "Fatal error occured",
@@ -102,6 +104,7 @@ static void usage(void)
" -S <connect_str> connect string (for slave mode only)\n"
" -p <port> override modem port (must be defined in config)\n"
" -u binkp|ifcico|telnet protocol to use over TCP/IP\n"
" -v display early debug info on stderr\n"
" -h show this help message\n"
"\n",
conf_getconfname()
@@ -252,12 +255,22 @@ int main(int argc, char *argv[], char *envp[])
int rc = 0;
int ch = 0;
opts.runmode = MODE_UNDEFINED;
int i = 0;
mainenv[0] = NULL;
i=0;
while (envp[i]) {
mainenv[i] = malloc(strlen(envp[i])+2);
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));
// parsing
while( (ch=getopt(argc, argv, "hfI:p:n:l:a:u:oiC:S:dq")) != (int)-1 )
while( (ch=getopt(argc, argv, "hfI:p:n:l:a:u:oivC:S:dq")) != (int)-1 )
{
switch( ch ) {
case 'h':
@@ -308,6 +321,9 @@ int main(int argc, char *argv[], char *envp[])
//if( opts.runmode != MODE_ANSWER || opts.inetd ) { usage(); exit(BFERR_FATALERROR); }
opts.inetd = 1;
break;
case 'v':
opts.earlydbg = TRUE;
break;
case 'C':
if( opts.confname || !optarg ) { usage(); exit(BFERR_FATALERROR); }
opts.confname = (char *)xstrcpy(optarg);
@@ -435,20 +451,21 @@ int main(int argc, char *argv[], char *envp[])
/* Process primary config file */
if( opts.confname && *opts.confname )
rc = conf_readconf(opts.confname, 0);
rc = conf_readconf(opts.confname, 0, opts.earlydbg);
else
rc = conf_readconf(conf_getconfname(), 0);
rc = conf_readconf(conf_getconfname(), 0, opts.earlydbg);
if( rc ) gotoexit(BFERR_FATALERROR);
/* Process additional config file, ignore errors */
if( opts.incname && *opts.incname )
(void)conf_readconf(opts.incname, 1);
if (conf_readconf(opts.incname, 1, opts.earlydbg))
gotoexit(BFERR_FATALERROR);
/* Reopen log file if it was defined in config */
if( log_reopen(log_getfilename(LOG_FILE_SESSION), NULL, NULL) )
{
log("can't continue without logging");
DEB((D_CONFIG, "can't continue without logging"));
gotoexit(BFERR_FATALERROR);
}
@@ -459,6 +476,7 @@ int main(int argc, char *argv[], char *envp[])
switch( opts.runmode )
{
case MODE_DAEMON:
DEB((D_STATEM, "Daemon mode"));
log("Daemon mode");
rc = bforce_daemon(&opts);
break;
@@ -466,14 +484,17 @@ case MODE_CALL_DEFAULT:
case MODE_CALL_IP:
case MODE_CALL_MODEM:
case MODE_CALL_STDIO:
DEB((D_STATEM, "Outgoing call"));
log("Outgoing call");
rc = bforce_master(&opts);
break;
case MODE_ANSWER:
DEB((D_STATEM, "Start answer"));
log("Start answer");
rc = bforce_slave(&opts);
break;
default:
DEB((D_STATEM, "Could not determine run mode"));
log("Could not determine run mode");
}
@@ -482,6 +503,13 @@ exit:
deinit_conf();
deinit_opts(&opts);
/* de-init sessenv */
i=0;
while(mainenv[i]) {
DEB((D_FREE, "De-init session ENV: %s\n", mainenv[(i)]));
free(mainenv[i++]);
}
/* Shutdown logging services */
if( log_isopened() ) log_close();
DEB((D_FREE, "good exit"));
+3 -2
View File
@@ -67,8 +67,9 @@ void deinit_cval_entry(s_cval_entry *dest, bforce_config_keyword type)
deinit_translate(&dest->d.translate);
break;
default:
DEB((D_CONFIG, "deinit_cval_entry: type %d doesn't use dynamic memory",
type));
//DEB((D_CONFIG, "deinit_cval_entry: type %d doesn't use dynamic memory",
// type));
;
}
}
+7
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_OH_time, CT_STRING),
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_directory, CT_PATH),
CONF_KEY(flags, CT_STRING),
@@ -96,6 +98,10 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(freq_limit_time, CT_NUMBER),
CONF_KEY(freq_min_speed, CT_NUMBER),
CONF_KEY(freq_srif_command, CT_STRING),
CONF_KEY(incnet_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(history_file, CT_STRING),
CONF_KEY(hydra_options, CT_OPTIONS),
@@ -142,6 +148,7 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(password, CT_PASSWORD),
CONF_KEY(phone, CT_STRING),
CONF_KEY(phone_translate, CT_TRANSLATE),
CONF_KEY(proto_order, CT_STRING),
CONF_KEY(recode_file_in, CT_STRING),
CONF_KEY(recode_file_out, CT_STRING),
CONF_KEY(recode_intro_in, CT_STRING),
+42 -72
View File
@@ -129,11 +129,11 @@ static void conf_parsestr(char *str, char **key, char **expr, char **value)
return;
}
int conf_readconf(const char *confname, int inclevel)
int conf_readconf(const char *confname, int inclevel, bool earlydbg)
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr,"BF-DEBUG: Parsing config file: %s %d\n", confname, inclevel);
#endif
FILE *fp = NULL;
char tmp[BF_MAXCFGLINE + 1];
int rc, maxrc = 0;
@@ -158,10 +158,9 @@ int conf_readconf(const char *confname, int inclevel)
{
if( i != (int)bforce_config[i].real_key )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr,"BF-DEBUG: invalid config table: found %d instead of %d\n",
bforce_config[i].real_key, i);
#endif
return -1;
}
}
@@ -169,14 +168,12 @@ int conf_readconf(const char *confname, int inclevel)
if( (fp = file_open(confname,"r")) == NULL )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr,"BF-DEBUG: can't open config file \"%s\"\n", confname);
#endif
return(PROC_RC_IGNORE);
return(PROC_RC_ABORT);
}
#ifdef DEBUG
if (earlydbg)
fprintf(stderr,"BF-DEBUG: start reading config \"%s\"\n", confname);
#endif
while( fgets(tmp, sizeof(tmp), fp) )
{
@@ -187,9 +184,9 @@ int conf_readconf(const char *confname, int inclevel)
{
if( isifexpr )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr,"BF-DEBUG: warning: automatically close expression at empty line %d\n", line);
#endif
if( ifexpr ) { free(ifexpr); ifexpr = NULL; }
isifexpr = FALSE;
}
@@ -197,9 +194,9 @@ int conf_readconf(const char *confname, int inclevel)
if( !isappend )
continue;
#ifdef DEBUG
if (earlydbg)
fprintf(stderr,"BF-DEBUG: warning: appending empty or comment line %d\n", line);
#endif
isappend = FALSE;
}
@@ -242,10 +239,10 @@ int conf_readconf(const char *confname, int inclevel)
p_value = NULL;
conf_parsestr(fullstr ? fullstr : tmp, &p_key, &p_expr, &p_value);
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: conf_readconf: [%d] key \"%s\" expr \"%s\" value \"%s\"\n",
line, p_key, p_expr, p_value);
#endif
if( p_value )
{
@@ -269,24 +266,24 @@ int conf_readconf(const char *confname, int inclevel)
{
if( value == NULL || expr )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key);
#endif
rc = PROC_RC_IGNORE;
}
else if( inclevel < MAXINCLUDELEVEL )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: conf_readconf: process inlude file \"%s\"\n", value);
#endif
rc = conf_readconf(value, inclevel + 1);
rc = conf_readconf(value, inclevel + 1, earlydbg);
if( rc ) rc = PROC_RC_IGNORE;
}
else
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: conf_readconf: too deep include\n");
#endif
rc = PROC_RC_IGNORE;
}
}
@@ -294,9 +291,9 @@ int conf_readconf(const char *confname, int inclevel)
{
if( value || isifexpr )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key);
#endif
rc = PROC_RC_ABORT;
}
else
@@ -312,9 +309,9 @@ int conf_readconf(const char *confname, int inclevel)
{
if( value || expr || !isifexpr )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key);
#endif
rc = PROC_RC_IGNORE;
}
else
@@ -326,9 +323,9 @@ int conf_readconf(const char *confname, int inclevel)
else
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: unknown directive `%s'\n", p_key);
#endif
rc = PROC_RC_IGNORE;
}
}
@@ -336,9 +333,9 @@ int conf_readconf(const char *confname, int inclevel)
{
if( isifexpr && expr )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: can't use expressions inside $ifexpr block\n");
#endif
rc = PROC_RC_IGNORE;
}
else if( isifexpr )
@@ -352,9 +349,9 @@ int conf_readconf(const char *confname, int inclevel)
}
else
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect config string %s\n", fullstr);
#endif
rc = PROC_RC_IGNORE;
}
@@ -369,19 +366,19 @@ int conf_readconf(const char *confname, int inclevel)
case PROC_RC_OK:
break;
case PROC_RC_WARN:
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: warning in config \"%s\" line %d\n", confname, line);
#endif
break;
case PROC_RC_IGNORE:
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: ignore line %d in config \"%s\"\n", line, confname);
#endif
break;
case PROC_RC_ABORT:
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: fatal error in config \"%s\" in line %d\n", confname, line);
#endif
break;
default:
ASSERT_MSG();
@@ -395,9 +392,9 @@ int conf_readconf(const char *confname, int inclevel)
if( isifexpr )
{
maxrc = 1;
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: unterminated directive `#ifexp'\n");
#endif
}
if( fullstr )
@@ -405,51 +402,24 @@ int conf_readconf(const char *confname, int inclevel)
if( ifexpr )
free(ifexpr);
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: readconfig: exit with maxrc = %d\n", maxrc);
#endif
/* update subsystems */
if (inclevel==0) { // end of main config
if( log_reopen(log_getfilename(LOG_FILE_SESSION), NULL, NULL) )
{
#ifdef DEBUG
if (earlydbg)
fprintf(stderr, "BF-DEBUG: can't continue without logging\n");
#endif
exit(-1);
}
#ifdef DEBUG
debug_configure();
#endif
}
return maxrc;
}
#ifdef DEBUG
/*void debug_override(void)
{
s_cval_entry *ptrl;
char abuf[BF_MAXADDRSTR+1];
DEB((D_CONFIG, "debug_override: BEGIN"));
for( ptrl = bforce_config[cf_override].data; ptrl; ptrl = ptrl->next )
{
DEB((D_CONFIG, "log_overridelist: address %s",
ftn_addrstr(abuf, ptrl->d.override.addr)));
DEB((D_CONFIG, "log_overridelist: \tIpaddr = \"%s\"",
ptrl->d.override.sIpaddr));
DEB((D_CONFIG, "log_overridelist: \tPhone = \"%s\"",
ptrl->d.override.sPhone));
DEB((D_CONFIG, "log_overridelist: \tWorktime = \"%s\"",
timevec_string(abuf, &ptrl->d.override.worktime, sizeof(abuf))));
DEB((D_CONFIG, "log_overridelist: \tFlags = \"%s\"",
ptrl->d.override.sFlags));
}
DEB((D_CONFIG, "debug_override: END"));
}*/
#endif /* DEBUG */
+74 -13
View File
@@ -161,7 +161,7 @@ static int daemon_sysentry_init(s_sysentry *sysent)
strcpy(msg, "freqs holded");
}
if( msg && *msg )
if( *msg )
log("QUEUE: add %s (%s)", ftn_addrstr(abuf, sysent->node.addr), msg);
else
log("QUEUE: add %s", ftn_addrstr(abuf, sysent->node.addr));
@@ -178,7 +178,7 @@ static int daemon_sysentry_deinit(s_sysentry *sysent)
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_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) )
good_phone = TRUE;
}
else if( node && node->phone && *node->phone )
else if( node && *node->phone )
{
if( modem_isgood_phone(node->phone) )
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) )
good_host = TRUE;
}
else if ( node && *node->host )
{
if( tcpip_isgood_host(node->host) )
good_host = TRUE;
}
/*
* Check work time
@@ -231,6 +236,16 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
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_host )
@@ -323,9 +338,23 @@ static bool daemon_node_cancall(s_sysentry *syst, bool ign_wtime, bool tcpip)
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 */
if( syst->overrides )
{
DEB((D_DAEMON, "daemon: node_cancall OVR-IN"));
if( syst->lineptr && syst->lineptr->hidden )
{
line = syst->line + 1;
@@ -363,11 +392,18 @@ static bool daemon_node_cancall(s_sysentry *syst, bool ign_wtime, bool tcpip)
}
line++;
}
}
else /* Node without overriden parameters */
{
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;
@@ -687,6 +723,8 @@ int daemon_rescan_sysqueue(s_sysqueue *q, s_daemon_queue dqs[])
#ifdef DEBUG
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
return 0;
@@ -755,6 +793,7 @@ int daemon_pidfile(int cmd)
pid_t hispid, mypid = getpid();
FILE *pf;
struct stat sb;
int res;
if( !pidfile )
return 0;
@@ -768,7 +807,12 @@ int daemon_pidfile(int cmd)
return -1;
}
fscanf(pf, "%d", &hispid);
res = fscanf(pf, "%d", &hispid);
if (res != 1) {
log("daemon pidfile: not readable");
return -1;
}
fclose(pf);
if( hispid ) {
@@ -807,7 +851,12 @@ int daemon_pidfile(int cmd)
return -1;
}
fscanf(pf, "%d", &hispid);
res = fscanf(pf, "%d", &hispid);
if (res != 1) {
log("daemon pidfile: not readable");
return -1;
}
fclose(pf);
if( !hispid || (hispid == mypid) ) {
@@ -831,7 +880,12 @@ int daemon_pidfile(int cmd)
return -1;
}
fscanf(pf, "%d", &hispid);
res = fscanf(pf, "%d", &hispid);
if (res != 1) {
log("daemon pidfile: not readable");
return -1;
}
fclose(pf);
unlink(pidfile);
@@ -938,15 +992,15 @@ int daemon_run(const char *confname, const char *incname, bool quit)
/* Read primary config file */
if( confname && *confname )
rc = conf_readconf(confname, 0);
rc = conf_readconf(confname, 0, false);
else
rc = conf_readconf(conf_getconfname(), 0);
rc = conf_readconf(conf_getconfname(), 0, false);
if( rc )
return(BFERR_FATALERROR);
/* Read additional config file (manual include) */
if( incname && *incname && conf_readconf(incname, 1) )
if( incname && *incname && conf_readconf(incname, 1, false) )
log("cannot read additional config (ignore)");
dmstate = DM_Start;
@@ -994,10 +1048,17 @@ int daemon_run(const char *confname, const char *incname, bool quit)
timer_set(&timer_alive, DAEMON_ALIVE_TIMER);
}
if( max_modem > 0 )
daemon_queue_do(&daemon_queues[MODEM_QUEUE]);
if( max_tcpip > 0 )
if( max_tcpip > 0 )
{
DEB((D_DAEMON,"daemon: daemon_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);
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)
{
int rc = BFERR_NOERROR;
char abuf[BF_MAXADDRSTR+1];
//int rc = BFERR_NOERROR;
//char abuf[BF_MAXADDRSTR+1];
/*
* 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;
// TODO: add hiddenline round-robin
opts.hiddline=0;
opts.runmode = MODE_CALL_DEFAULT;
memset(&opts, '\0', sizeof(s_bforce_opts));
opts.hiddline = 0;
if ( syst->tcpip )
opts.runmode = MODE_CALL_IP;
else
opts.runmode = MODE_CALL_DEFAULT;
opts.ipproto = NULL;
opts.phone = NULL;
opts.force = 0;
opts.inetd = 0;
opts.connect = NULL;
opts.device = NULL;
DEB((D_DAEMON, "daemon_call: calling call_system from branch"));
// log("doing call_system");
return call_system(syst->node.addr, &opts);
}
@@ -87,8 +92,11 @@ int daemon_call(s_sysentry *syst)
/*
* 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;
}
/*
* Set state structure to make expressions works properly now
@@ -101,6 +109,7 @@ int daemon_call(s_sysentry *syst)
if( syst->tcpip == FALSE )
{
DEB((D_DAEMON, "daemon_call: tcpip false - prep modem line"));
if( (p_lockdir = conf_string(cf_uucp_lock_directory)) == NULL )
p_lockdir = BFORCE_LOCK_DIR;
@@ -110,7 +119,10 @@ int daemon_call(s_sysentry *syst)
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",
ftn_addrstr(abuf, syst->node.addr), syst->line,
syst->tcpip ? "TCP/IP" : modemport->name);
@@ -138,7 +150,7 @@ int daemon_call(s_sysentry *syst)
}
/* Now we are in child process */
DEB((D_DAEMON, "daemon_call: fork success - calling..."));
exit(daemon_call_branch(syst, p_lockdir, modemport));
}
File diff suppressed because it is too large Load Diff
+1
View File
@@ -45,6 +45,7 @@
%token LOGOP
%expect 2
%{
#include "includes.h"
#include "confread.h"
+3 -2
View File
@@ -67,8 +67,9 @@ int req_createsrif(char *sname, char *req, char *rsp)
fprintf(fp, "Sysop %s\n", cptr);
else
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));
else
return -1;
+77 -26
View File
@@ -19,29 +19,49 @@
#define DEFAULT_PORT 60179 /* Birthday .. mother fucker :) */
struct addrinfo *ai = NULL;
static RETSIGTYPE tcpip_interrupt(int sig)
{
tty_abort = TRUE;
log("terminating on signal %d", sig);
(void)log("terminating on signal %d", sig);
}
static RETSIGTYPE tcpip_brokenpipe(int sig)
{
tty_abort = TRUE;
if( tty_online )
log("connection closed");
(void)log("connection closed");
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;
DEB((D_INFO, "tcpip_connect2: trying \"%s\" at port %d",
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port)));
if( (fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
int fd = -1;
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
struct addrinfo *rai;
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");
return(1);
@@ -84,9 +104,9 @@ static int tcpip_connect2(struct sockaddr_in server)
clearerr(stdout);
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(1);
close(2);
@@ -99,8 +119,7 @@ static int tcpip_connect2(struct sockaddr_in server)
return 1;
}
log("TCP/IP connect to %s on port %d",
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port));
(void)log("TCP/IP connect success to %s on service %s", hbuf, sbuf);
return(0);
}
@@ -108,14 +127,23 @@ static int tcpip_connect2(struct sockaddr_in server)
int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
{
int rc = 0;
struct hostent *he = NULL;
struct servent *se = NULL;
struct sockaddr_in server;
//struct hostent *he = NULL;
//struct servent *se = NULL;
//struct sockaddr_in server;
//struct sockaddr_storage server;
struct addrinfo *aisave = NULL;
struct addrinfo aihints;
int nameres = 0;
char *host = xstrcpy(hostname);
char *p = strrchr(host, ':');
const char *port = NULL;
server.sin_family = AF_INET;
// AF_INET - only IPv4
//server.sin_family = AF_INET;
if( p )
{ *p++ = '\0'; port = p; }
@@ -123,18 +151,34 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
port = "binkp";
else if( tcpmode == TCPMODE_TELNET )
port = "telnet";
else /* Default service name is "fido" */
port = "fido";
else /* Can not rely on /etc/services - it is not well-known port */
port = "60179";
// Do not need it
/*
if( ISDEC(port) )
server.sin_port = htons(atoi(port));
else if( (se = getservbyname(port, "tcp")) )
server.sin_port = se->s_port;
else
{ 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, &ai );
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)) )
{
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);
break;
}
}
}
} */
//}
if( host ) { free(host); host = NULL; }
DEB((D_INFO, "tcpip_connect: resolver got result!"));
aisave = ai;
return rc ? rc : tcpip_connect2(server);
if (rc == 0 )
rc = tcpip_connect2(ai);
freeaddrinfo( aisave );
return rc;
}
int tcpip_init(void)
+2 -2
View File
@@ -77,7 +77,7 @@ static char *lock_getname(const char *lockdir, const s_modemport *modemport)
ASSERT(modemport != NULL);
if( lockdir && *lockdir )
if( *lockdir )
lckname = (char *)xstrcpy(lockdir);
else
lckname = (char *)xstrcpy(BFORCE_LOCK_DIR);
@@ -314,7 +314,7 @@ int port_lock(const char *lockdir, const s_modemport *modemport)
char *lckname;
char *tmpname, *p_tmpname;
if( lockdir && *lockdir )
if( *lockdir )
tmpname = xstrcpy(lockdir);
else
tmpname = xstrcpy(BFORCE_LOCK_DIR);
+7 -1
View File
@@ -118,6 +118,9 @@ int tio_get(int fd, TIO *tio)
{
#ifdef HAVE_TERMIOS_H
return tcgetattr(fd, tio);
#else
DEB(("io_unix_tio: TERMIOS not supported!"));
return -1;
#endif
}
@@ -127,6 +130,9 @@ int tio_set(int fd, TIO *tio)
{
#ifdef HAVE_TERMIOS_H
return tcsetattr(fd, TCSANOW, tio);
#else
DEB(("io_unix_tio: TERMIOS not supported!"));
return -1;
#endif
}
@@ -177,7 +183,7 @@ int tio_get_speed(TIO *tio)
return speedtab[i].nspeed;
}
return-1;
return -1;
}
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)
{
return tty_write_timeout(s, strlen(s), timeout);
return tty_write_timeout(s, strlen((char *)s), timeout);
}
int tty_getc(int timeout)
+17 -4
View File
@@ -106,11 +106,15 @@ int log_open(const char *logname, const char *ext, const char *tty)
if( logname )
{
DEB((D_INFO,"log_open: Opening log file %s", logname));
strnxcpy(log_name, logname, sizeof(log_name));
// May be NULL, so check both
if( tty && *tty )
strnxcpy(log_ttyname, tty, sizeof(log_ttyname));
// May be NULL, so check both
if( ext && *ext )
{
strnxcpy(log_extension, ext, sizeof(log_extension));
@@ -142,7 +146,9 @@ int log_close(void)
if( log_fp )
{
rc = fclose(log_fp); log_fp = NULL;
rc = fclose(log_fp);
DEB((D_INFO,"Closing log file."));
log_fp = NULL;
}
return rc;
@@ -283,6 +289,8 @@ int logerr(const char *s, ...)
#ifdef USE_SYSLOG
bool slog_active = FALSE;
const char *log_getfilename(int whatfor)
{
const char *p = "/dev/null";
@@ -291,22 +299,27 @@ const char *log_getfilename(int whatfor)
bool log_isopened(void)
{
return TRUE;
return slog_active;
}
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);
if( tty && *tty )
strncpy(p, tty, sizeof(p));
openlog(p, LOG_PID, fac);
slog_active = TRUE;
return 0;
}
int log_reopen(const char *logname, const char *ext, const char *tty)
{
return 0;
if ( !slog_active ) {
return (log_reopen(logname, ext, tty));
} else
return 0;
}
int log_close(void)
+4 -1
View File
@@ -243,7 +243,7 @@ int nodelist_parsestring(s_node *node, char *str)
strnxcpy(node->phone, argv[NODELIST_POSPHONE], sizeof(node->phone));
strnxcpy(node->flags, argv[NODELIST_POSFLAGS], sizeof(node->flags));
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
*/
@@ -291,8 +291,11 @@ int nodelist_parsestring(s_node *node, char *str)
node->do_ifcico = nodelist_checkflag(node->flags, "IFC") == 0;
node->do_telnet = nodelist_checkflag(node->flags, "ITN") == 0;
//TODO: Add more INA flags to array
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;
}
+9
View File
@@ -73,9 +73,18 @@ int exec_options_parse(char *str)
void exec_options_init(s_exec_options *eopt)
{
int i = 0;
memset(eopt, '\0', sizeof(s_exec_options));
eopt->umask = EXEC_DEFAULT_UMASK;
eopt->envp[0] = NULL;
while(mainenv[i]) {
DEB((D_FREE,"EXEC: Added ENV variable: %s\n", mainenv[i]));
eopt->envp[i] = xmalloc(strlen(mainenv[i]) + 2);
strcpy(eopt->envp[i],mainenv[i]);
eopt->envp[++i] = NULL;
}
}
void exec_options_deinit(s_exec_options *eopt)
+8
View File
@@ -31,6 +31,7 @@ int out_filetype(const char *fname)
else
p_nam = fname;
DEB((D_EVENT, "outb_fsqueue: getting type of file %s", p_nam));
/*
* Get file name extension
*/
@@ -39,12 +40,19 @@ int out_filetype(const char *fname)
for( i = 0; outtab[i].ext; i++ )
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;
}
for( i = 0; exttab[i].ext; i++ )
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;
}
DEB((D_EVENT, "outb_fsqueue: got type UNKNOWN", exttab[i].type, p_ext ));
return TYPE_UNKNOWN;
}
+48 -40
View File
@@ -106,7 +106,7 @@ int binkp_loop(s_binkp_state *bstate) {
bool no_more_to_send = false;
bool no_more_read = false;
bool canread, canwrite;
int timeout = conf_number(cf_binkp_timeout);
if( timeout==0 )
timeout = 60;
@@ -117,13 +117,14 @@ int binkp_loop(s_binkp_state *bstate) {
// session criterium handshake criterium
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));
if (bstate->continuesend) {
no_more_to_send = 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);
if(m==1 || m==3) {
//DEB((D_24554, "got block for sending %d %hu", block_type, block_length));
@@ -267,6 +268,7 @@ int binkp_loop(s_binkp_state *bstate) {
have_to_write -= n;
}
}
DEB((D_24554,"+++ BinkP Loop ended with rc=%d", bstate->rc));
return bstate->rc;
}
@@ -338,8 +340,8 @@ int binkp_getforsend(s_binkp_state *bstate, char *buf, int *block_type, unsigned
{
int my_sf, wr_pos;
int n; // read file
if (bstate->extracmd[0]!=-1) {
DEB((D_24554, "send command from receiver %d %s", bstate->extracmd[0], bstate->extracmd+1));
if (bstate->extracmd[0]!=(char)-1) {
DEB((D_24554, "Send cmd to remote %d %s", bstate->extracmd[0], bstate->extracmd+1));
buf[0] = bstate->extracmd[0];
strcpy(buf+1, bstate->extracmd+1);
*block_type = BINKP_BLK_CMD;
@@ -625,7 +627,7 @@ case 4:
return 1;
case 5:
DEB((D_24554, "nothing to send"));
DEB((D_24554, "BinkP_GetForSend: nothing to send"));
return 2;
@@ -666,12 +668,12 @@ case BPMSG_ADR: /* List of addresses */
if (bstate->address_established) {
PROTO_ERROR("remote tries to change address");
}
if( bstate->extracmd[0] !=-1 ) return 0; // suspend !!!
if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend !!!
binkp_process_ADR(buf+1);
if( !state.n_remoteaddr ) {
log("error: remote did not supplied any addresses");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend
if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend
bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "No addresses was presented");
bstate->extraislast = true;
@@ -738,7 +740,7 @@ case BPMSG_PWD: /* Session password */
/* Do authorization */
if( binkp_auth_incoming(bstate->remote_data) ) {
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;
strcpy(bstate->extracmd+1, "Security violation");
bstate->extraislast = true;
@@ -747,7 +749,7 @@ case BPMSG_PWD: /* Session password */
// lock addresses
if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) ) {
log("error locking addresses of the remote");
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_BSY;
strcpy(bstate->extracmd+1, "All addresses are busy");
bstate->extraislast = true;
@@ -768,6 +770,7 @@ case BPMSG_FILE: /* File information */
s_bpfinfo recvfi;
if( binkp_parsfinfo(buf+1, &recvfi, true) ) {
log ("M_FILE parse error: %s", buf + 1);
DEB((D_24554, "M_FILE parse error: %s", buf + 1 ));
PROTO_ERROR("invalid M_FILE");
}
bstate->batch_recv_count += 1;
@@ -784,9 +787,9 @@ case BPMSG_FILE: /* File information */
return 1;
}
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;
sprintf(bstate->extracmd+1, "%s %ld %ld %ld", recvfi.fn, recvfi.sz, recvfi.tm);
sprintf(bstate->extracmd+1, "%s %ld %ld %ld", recvfi.fn, recvfi.sz, recvfi.tm, recvfi.offs);
bstate->extraislast = false;
return 1;
}
@@ -796,7 +799,7 @@ case BPMSG_FILE: /* File information */
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)) {
case 0:
if (bstate->pi->recv->bytes_skipped == recvfi.offs) {
@@ -804,7 +807,7 @@ case 0:
bstate->frs = frs_data;
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;
sprintf(bstate->extracmd+1, "%s %ld %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
@@ -842,7 +845,7 @@ case BPMSG_OK: /* Password was acknowleged (data ignored) */
}
if (session_addrs_lock(state.remoteaddrs, state.n_remoteaddr)) {
log("error: unable to lock");
if (bstate->extracmd[0]!=-1) return 0;
if (bstate->extracmd[0]!= (char)-1) return 0;
bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "All addresses are busy");
bstate->extraislast = true;
@@ -952,7 +955,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));
if (bstate->extracmd[0] != -1) return 0;
if (bstate->extracmd[0] != (char)-1) return 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"));
@@ -1042,14 +1045,14 @@ case BINKP_BLK_DATA:
return 1;
}
if (bstate->extracmd[0] != -1) return 0;
if (bstate->extracmd[0] != (char)-1) return 0;
long int n;
n = p_rx_writefile(buf, block_length, bstate->pi);
if( n < 0 ) {
log("error writing local file");
if( n == -2 ) {
if( n == (long int)-2 ) {
bstate->extracmd[0] = BPMSG_GOT;
sprintf(bstate->extracmd+1, "%s %ld %ld", bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time);
@@ -1078,28 +1081,33 @@ case BINKP_BLK_DATA:
p_rx_fclose(bstate->pi);
PROTO_ERROR("extra data for file")
}
else if( bstate->pi->recv->bytes_received == bstate->pi->recv->bytes_total ) {
DEB((D_24554, "receive completed"));
bstate->frs = frs_nothing;
bstate->pi->recv->status = FSTAT_SUCCESS;
if( !p_rx_fclose(bstate->pi) ) {
bstate->extracmd[0] = BPMSG_GOT;
sprintf(bstate->extracmd+1, "%s %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time);
bstate->extraislast = false;
return 1;
}
else {
DEB((D_24554, "some error committing file"));
bstate->extracmd[0] = BPMSG_SKIP;
sprintf(bstate->extracmd+1, "%s %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time);
bstate->extraislast = false;
return 1;
}
} else {
else if( bstate->pi->recv->bytes_received == bstate->pi->recv->bytes_total )
{
DEB((D_24554, "receive completed"));
bstate->frs = frs_nothing;
bstate->pi->recv->status = FSTAT_SUCCESS;
if( !p_rx_fclose(bstate->pi) )
{
bstate->extracmd[0] = BPMSG_GOT;
sprintf(bstate->extracmd+1, "%s %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time);
bstate->extraislast = false;
return 1;
}
else
{
DEB((D_24554, "some error committing file"));
bstate->extracmd[0] = BPMSG_SKIP;
sprintf(bstate->extracmd+1, "%s %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time);
bstate->extraislast = false;
return 1;
}
}
else
{
DEB((D_24554, "data block accepted"));
return 1;
}
+1 -1
View File
@@ -45,7 +45,7 @@ int binkp_parsfinfo(const char *str, s_bpfinfo *fi, bool with_offset)
return -1;
}
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;
while (1) {
chkslash = strchr(chkslash, '/');
+7
View File
@@ -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)
{
DEB((D_EVENT, "prot_common: Adding type %d with size %ld to stats", type, size));
if( type & TYPE_REQANSW )
{
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_num++;
}
else if( type & TYPE_TICFILE )
{
traf->ticfile_num++;
}
else
{
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 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
*/
+22
View File
@@ -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 *hide_ptr;
s_faddr *primary = NULL;
char xdt[EMSI_MAXXDATETIME+1];
time_t xtm;
const long options = conf_options(cf_options);
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; }
if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA )
{ 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
{
@@ -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));
}
/* ----------------------------------------------------------------- */
/* 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 */
/* ----------------------------------------------------------------- */
+38 -9
View File
@@ -134,6 +134,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
int rc = HRC_OK;
s_emsi *remote_emsi = NULL;
s_emsi *local_emsi = NULL;
char *p = NULL;
ASSERT(THIS);
ASSERT(THIS->remote_data);
@@ -198,18 +199,46 @@ int emsi_incoming(s_handshake_protocol *THIS)
/*
* Set protocol that we will use
* EMSI-II compatible as of v0.25
*/
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 */
{
if ( remote_emsi->compcodes.EII ) {
/* EMSI-II relies on protocol order sent by CALLER
* we must agree on first matching protocol
*/
p = xstrcpy( remote_emsi->proto_order );
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
+161 -13
View File
@@ -103,6 +103,10 @@ char *emsi_createdat(s_emsi *emsi)
char *tmp = NULL;
char buf[100];
char abuf[BF_MAXADDRSTR+1];
char *p_order = NULL;
char *ord = NULL;
tmp = (char *)xstrcpy("**EMSI_DAT0000");
@@ -179,14 +183,79 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '}');
}
/* compatibility_codes */
/* compatibility_codes (EMSI behavior as FTS-0088) */
tmp = add_char(tmp, '{');
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,");
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,");
if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,");
if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,");
p_order = conf_string(cf_proto_order);
if ( !p_order ) {
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);
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 ( ord == NULL )
DEB((D_HSHAKE,"EMSI create order error"));
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 ( ord == NULL )
DEB((D_HSHAKE,"EMSI create order error"));
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.NRQ ) tmp = add_str(tmp, "NRQ,");
if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,");
@@ -325,10 +394,15 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '{');
tmp = add_char(tmp, '[');
sprintf(buf, "+%04d", emsi->tzutc);
tmp = add_str(tmp, buf);
/* BUGGY */
// 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, '}');
free(ord);
}
/* {XDATE} indentifier.. What's the fucking invention :-/
@@ -450,6 +524,8 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
{
int i;
char *tmp, *p, *q, *n;
unsigned int tzh, tzm,tzn ;
char *tzc, *otmp;
while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL )
{
@@ -525,13 +601,64 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
/* compatibility codes */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p));
emsi->proto_order[0] = '\0';
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, "DZA") ) emsi->compcodes.DZA = 1;
else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 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, "NRQ") ) emsi->compcodes.NRQ = 1;
else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1;
@@ -542,6 +669,9 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
else if( !strcmp(p, "BBS") ) emsi->compcodes.BBS = 1;
else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1;
}
/* Delete last comma from order list */
emsi->proto_order[strlen(emsi->proto_order)-1] = '\0';
DEB((D_HSHAKE,"Ordered compcodes: %s",emsi->proto_order));
/* mailer information */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
@@ -645,14 +775,32 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
if( *p ) strnxcpy(emsi->xdatetime, p, sizeof(emsi->xdatetime));
}
else if( strcmp(tmp, "TZUTC") == 0 )
{
emsi->have_tzutc = 1;
{
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( (p=get_field(&p, '[', ']')) == NULL ) return(1);
/* Parse EMSI TZUTC in fmt (+|-)HHMM */
if( *p ) {
tzc = malloc(2);
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
{
DEB((D_HSHAKE, "Step - no known EMSI-part - got %s", tmp));
strnxcat(emsi->addons, "{", sizeof(emsi->addons));
strnxcat(emsi->addons, tmp, sizeof(emsi->addons));
strnxcat(emsi->addons, "}", sizeof(emsi->addons));
+26 -14
View File
@@ -22,8 +22,16 @@
int answ_system(e_session type, char *connstr, int inetd)
{
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);
char clienthost[NI_MAXHOST];
char clientport[NI_MAXSERV];
int clientres = 0;
int rc = 0;
char *p;
@@ -71,20 +79,23 @@ int answ_system(e_session type, char *connstr, int inetd)
if( inetd )
{
log("Answering TCPIP call...");
if( connstr && *connstr )
state.connstr = (char*)xstrcpy(connstr);
else if( getpeername(0, (struct sockaddr*)&client, &clientlen) == -1 )
logerr("can't get client address");
else
else
{
#ifdef IPV6
>char addr_str[INET6_ADDRSTRLEN+1];
state.peername = (char*)xstrcpy(inet_ntop(AF_INET6, client.sin6_addr, addr_str, INET6_ADDRSTRLEN));
state.peerport = (long)ntohs(client.sin6_port);
#else
state.peername = (char*)xstrcpy(inet_ntoa(client.sin_addr));
state.peerport = (long)ntohs(client.sin_port);
#endif
if(getpeername(0, &client.a, &clientlen))
log("sess_answ: can't detrmine socket client");
clientres = getnameinfo( &client.a, clientlen,
clienthost, sizeof(clienthost), clientport,
sizeof(clientport), NI_NUMERICHOST | NI_NUMERICSERV);
if ( clientres == 0 )
{
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);
rc = session();
if( (inetd != 0) && (state.inet = FALSE) )
log("Session ended up, rc=%d, inetd=%d", rc, inetd);
if( ( !inetd ) )
{
log("Deactivating modem port");
port_deinit(0, &oldtio);
port_close();
}
+102 -33
View File
@@ -480,10 +480,15 @@ int call_system_tcpip(int callwith) // only TCPIP values
{
char abuf[BF_MAXADDRSTR+1];
int rc = BFERR_NOERROR;
char * pbuf;
char * target;
int resflg;
/*
* 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.inet = TRUE;
@@ -502,14 +507,17 @@ int call_system_tcpip(int callwith) // only TCPIP values
case CALL_TCPIP_BINKP:
state.tcpmode = TCPMODE_BINKP;
state.session = SESSION_BINKP;
target = xstrcpy("IBN");
break;
case CALL_TCPIP_IFCICO:
state.tcpmode = TCPMODE_RAW;
state.session = SESSION_UNKNOWN;
target = xstrcpy("IFC");
break;
case CALL_TCPIP_TELNET:
state.tcpmode = TCPMODE_TELNET;
state.session = SESSION_UNKNOWN;
target = xstrcpy("ITN");
break;
defalt:
log("invalid protocol for TCP/IP module");
@@ -520,8 +528,45 @@ defalt:
ftn_addrstr(abuf, state.node.addr),
(state.node.name && *state.node.name ) ? state.node.name : "<none>",
(state.node.host && *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
char *p = strcasestr(pbuf, target);
if ( p )
{
target = strchr(p, ',');
if ( target ) target[0] = '\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);
@@ -532,7 +577,7 @@ defalt:
{
rc = BFERR_CANT_CONNECT10;
}
free(pbuf);
return rc;
}
@@ -543,7 +588,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
char s[300];
snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point );
log(s);
DEB((D_EVENT, s));
// find suitable way of connection and try to make session
int rc = 0;
@@ -568,12 +613,13 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
}
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 */
// 1. If call method specified in cmdline, do use it
// 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)
DEB((D_EVENT, "Calling init, runmode=%d", opts->runmode));
// 1st - get all allowed call ways
// 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support)
@@ -581,7 +627,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
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 )
{
@@ -593,7 +639,14 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
}
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;
}
@@ -605,20 +658,17 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{
call_mustuse = CALL_TCPIP_TELNET;
}
else if( opts->ipproto == NULL ) // determine from nodelist/override
{
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else
{
DEB((D_EVENT, "Unknown protocol %s", opts->ipproto));
log("Unknown protocol");
return -1;
}
}
else
{
log("Unknown protocol");
DEB((D_EVENT, "Unknown runmode %d", opts->runmode));
log("Unknown runmode");
return -1;
}
@@ -627,9 +677,10 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
//char s[300];
//snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse);
//log(s);
//DEB((D_EVENT, s));
if( call_mayuse & CALL_MODEM )
if( (call_mayuse & CALL_MODEM) )
{
// 1. use phone from opts
// 2. use overrides
@@ -650,7 +701,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{
log("bad phone, excluding modem");
call_mayuse &= ~CALL_MODEM;
if( call_mustuse & CALL_MODEM )
if( !(call_mayuse) )
{
errmsg = "don't know phone number";
gotoexit(BFERR_PHONE_UNKNOWN);
@@ -684,7 +735,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{
call_mayuse &= ~CALL_MODEM;
log("bad worktime, excluding modem");
if( call_mustuse & CALL_MODEM )
if( !(call_mayuse) )
{
errmsg = "not works now, try later";
gotoexit(BFERR_NOTWORKING);
@@ -693,9 +744,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);
// log(s);
//snprintf(s, 299, "after phone check: may use %d must use %d", call_mayuse, call_mustuse);
//log(s);
//DEB((D_EVENT, s));
/*
* Apply overrides to the node information
*/
@@ -714,7 +765,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
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;
}
@@ -722,7 +774,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
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;
}
@@ -730,7 +783,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
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;
}
@@ -746,7 +800,12 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
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);
if (fidodnszone) {
if (addr.point) {
@@ -761,17 +820,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;
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);
}
}
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);
// log(s);
@@ -807,29 +870,34 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
// try allowed methods and break if rc == 0
rc = -1;
if( rc && call_mayuse & CALL_STDIO )
if( rc && (call_mayuse & CALL_STDIO) )
{
DEB((D_EVENT,"sess_call: calling stdio"));
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);
}
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);
}
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);
}
if( rc && call_mayuse & CALL_MODEM )
if( rc && (call_mayuse & CALL_MODEM) )
{
DEB((D_EVENT,"sess_call: calling MODEM"));
setproctitle("bforce calling %.32s, %.32s",
ftn_addrstr(abuf, state.node.addr), state.node.phone);
rc = -1;
@@ -850,6 +918,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */
{
DEB((D_EVENT,"sess_call: call_system_modem running"));
rc = call_system_modem();
port_unlock(p_lockdir, state.modemport);
}
+76 -2
View File
@@ -311,6 +311,7 @@ int session_set_inbound(void)
{
struct stat st;
char *p_inb;
int res;
p_inb = conf_string(cf_inbound_directory);
if( !p_inb ) {
@@ -342,7 +343,11 @@ int session_set_inbound(void)
log("inbound: %s", buf);
state.inbound = (char*)xstrcpy(buf);
snprintf( buf, PATH_MAX+30, "/bin/mkdir -p -m 700 %s", state.inbound ); /* 30 additional chars allowed */
system( buf );
res = system( buf );
if (res != 0) {
log("Inbound create error: %d", res);
return -1;
}
}
else
{
@@ -695,6 +700,7 @@ int session(void)
s_traffic traff_send;
s_traffic traff_recv;
char *p;
int fd = -1;
memset(&traff_send, '\0', sizeof(s_traffic));
memset(&traff_recv, '\0', sizeof(s_traffic));
@@ -889,7 +895,75 @@ int session(void)
* Write total amount of received/sent bytes, files, etc.
*/
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
*/
if ( (p = conf_string(cf_incnet_flag)) )
if (pi.traffic_rcvd.netmail_size > 0) {
DEB((D_EVENT, "Incoming netmail > 0, raising flag"));
log("Raising flag for netmail 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 netmail flag"));
log("Error creating flag for netmail in %s", p);
} else {
/* all ok - closing file */
close(fd);
}
}
if ( (p = conf_string(cf_incarc_flag)) )
if (pi.traffic_rcvd.arcmail_size > 0) {
DEB((D_EVENT, "Incoming arcmail > 0, raising flag"));
log("Raising flag for arcmail 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 arcmail flag"));
log("Error creating flag for arcmail in %s", p);
} else {
/* all ok - closing file */
close(fd);
}
}
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
*/
+7 -2
View File
@@ -70,12 +70,14 @@ static char *session_stat_get_stsfile(s_faddr *addr, int linenum)
static int session_stat_read_stsfile(FILE *fp, s_sess_stat *stat)
{
int res;
if( fseek(fp, 0, SEEK_SET) == -1 )
return -1;
memset(stat, '\0', sizeof(s_sess_stat));
fscanf(fp, "%u %u %u %u %u %u %lu %lu %lu %lu",
res = fscanf(fp, "%u %u %u %u %u %u %lu %lu %lu %lu",
(unsigned int *) &stat->tries,
(unsigned int *) &stat->tries_noconn,
(unsigned int *) &stat->tries_noansw,
@@ -86,7 +88,10 @@ static int session_stat_read_stsfile(FILE *fp, s_sess_stat *stat)
(unsigned long *) &stat->hold_freqs,
(unsigned long *) &stat->last_success_out,
(unsigned long *) &stat->last_success_in);
if (res == 0) {
log("Read STS unsuccessfull...");
return -1;
}
/* Set last successfull session time */
stat->last_success = MAX(stat->last_success_out, stat->last_success_in);
+1
View File
@@ -145,6 +145,7 @@ char *file_name_makesafe(char *filename)
char *file_getname(char *filename)
{
char *p = strrchr(filename, '/');
DEB((D_FREE, "File_getname: %s", (p ? p + 1 : filename) ));
return p ? p + 1 : filename;
}
+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));
}
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;
}
@@ -325,7 +326,8 @@ int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard)
addr->net = DEFAULT_NET;
addr->node = DEFAULT_NODE;
addr->point = 0;
DEB((D_INFO, "u_ftn: parsing ftnaddr %s", s));
if( addr->inetform )
badaddr = ftn_addrparse_inet(addr, s, wildcard);
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 )
{
log("failed to reallocate %ld bytes -> abort", size);
if( buf ) free(buf);
abort();
}
+12 -9
View File
@@ -173,18 +173,20 @@ long time_gmtoffset(void)
time_t tt = time(NULL);
struct tm local = *localtime(&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 )
tz = -24;
else if( tz < -1 )
tz = 24;
tz = +24;
else
tz *= 24;
tz *= 24; */
tz += gmt.tm_hour - local.tm_hour;
/*tz += gmt.tm_hour - local.tm_hour;
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;
}
@@ -200,12 +202,13 @@ long time_gmtoffset(void)
*/
char *time_string_gmtoffset(char *buffer)
{
long tz = time_gmtoffset();
long tz = -time_gmtoffset();
char sign = (tz > 0)?'+':'-';
int hour = tz/60;
int mint = tz%60;
tz = abs(tz);
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;
}
+2 -2
View File
@@ -127,7 +127,7 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
switch(keyword) {
case KEYWORD_ZONE:
bni.zone = value;
bni.net = 0;
bni.net = value; // zxalexis
bni.node = 0;
bni.point = 0;
bni.hub = 0;
@@ -209,7 +209,7 @@ int main(int argc, char *argv[])
}
if( conf_readconf(conf_getconfname(), 0) )
if( conf_readconf(conf_getconfname(), 0, false) )
{
exit(1);
}
+1 -1
View File
@@ -301,7 +301,7 @@ int main(int argc, char *argv[])
/* Initialise current locale */
(void)setlocale(LC_ALL, "");
if( conf_readconf(conf_getconfname(), 0) )
if( conf_readconf(conf_getconfname(), 0, false) )
exit(1);
memset(&ocb, '\0', sizeof(s_outbound_callback_data));
+1 -1
View File
@@ -159,7 +159,7 @@ int main(int argc, char *argv[])
exit(BFERR_FATALERROR);
}
if( conf_readconf(conf_getconfname(), 0) )
if( conf_readconf(conf_getconfname(), 0, false) )
exit(BFERR_FATALERROR);
if( rawstring )
+4 -4
View File
@@ -580,10 +580,10 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='bforce'
PACKAGE_TARNAME='bforce'
PACKAGE_VERSION='0.24'
PACKAGE_STRING='bforce 0.24'
PACKAGE_BUGREPORT='sergey@fidoman.ru'
PACKAGE_URL=''
PACKAGE_VERSION='0.24.1'
PACKAGE_STRING='bforce 0.24.1'
PACKAGE_BUGREPORT='zx@zxalexis.ru'
PACKAGE_URL='https://prj.zxalexis.ru/gitea/zx/bforce.git'
ac_default_prefix=/usr/local/fido
# Factoring default headers for most tests.
+2 -2
View File
@@ -3,7 +3,7 @@ dnl
dnl $Id$
dnl
#AC_INIT(bforce/bforce.c)
AC_INIT([bforce],[0.24.1],[sergey@fidoman.ru])
AC_INIT([bforce],[0.24.1],[zx@zxalexis.ru])
AC_CONFIG_HEADER(include/config.h)
AC_CANONICAL_SYSTEM
dnl # Minimum Autoconf version required.
@@ -143,4 +143,4 @@ AC_CHECK_FUNCS(rename statfs statvfs setproctitle)
AC_CHECK_FUNCS([clock_gettime], [CLOCK_LIB=],[AC_CHECK_LIB([rt], [clock_gettime], [CLOCK_LIB=-lrt])])
AC_SUBST([CLOCK_LIB])
AC_OUTPUT(Makefile)
AC_OUTPUT(../debian/Makefile)
dnl AC_OUTPUT(../debian/Makefile)
+3
View File
@@ -151,6 +151,7 @@ typedef struct {
bool daemon; /* Run as daemon? */
bool quit; /* Quit from daemon */
bool usestdio; /* Session on stdin and stdout */
bool earlydbg; /* Early debug on stderr */
int inetd; /* Called from inetd? */
int force; /* Force call? */
int hiddline; /* Hidden line number (0,1..) */
@@ -180,6 +181,8 @@ typedef struct {
*/
extern const char *BFERR[];
extern char * mainenv[];
int daemon_run(const char *confname, const char *incname, bool quit);
#endif
+8 -1
View File
@@ -179,6 +179,8 @@ typedef enum {
cf_emsi_FR_time,
cf_emsi_OH_time,
cf_emsi_slave_sends_nak,
cf_emsi_send_tz,
cf_emsi_send_time,
cf_filebox,
cf_filebox_directory,
cf_flags,
@@ -191,6 +193,10 @@ typedef enum {
cf_freq_limit_time,
cf_freq_min_speed,
cf_freq_srif_command,
cf_incnet_flag,
cf_incarc_flag,
cf_inctic_flag,
cf_incfile_flag,
cf_hide_our_aka,
cf_history_file,
cf_hydra_options,
@@ -237,6 +243,7 @@ typedef enum {
cf_password,
cf_phone,
cf_phone_translate,
cf_proto_order,
cf_recode_file_in,
cf_recode_file_out,
cf_recode_intro_in,
@@ -347,7 +354,7 @@ void deinit_translate(s_translate *dest);
const char *conf_getconfname(void);
int conf_postreadcheck(void);
int conf_readpasswdlist(s_falist **pwdlist, char *fname);
int conf_readconf(const char *confname, int inclevel);
int conf_readconf(const char *confname, int inclevel, bool earlydbg);
#ifdef DEBUG
void log_overridelist(s_override *subst);
void log_options(s_options *opt);
+18 -18
View File
@@ -33,28 +33,28 @@ enum { LOG_FILE_DAEMON, LOG_FILE_SESSION, LOG_FILE_DEBUG, LOG_FILE_HISTORY };
#ifdef DEBUG
# define D_CONFIG 0x0000001L
# define D_OVERRIDE 0x0000002L
# define D_EVENT 0x0000004L
# define D_NODELIST 0x0000008L
# define D_OUTBOUND 0x0000010L
# define D_INFO 0x0000020L
# define D_HSHAKE 0x0000040L
# define D_TTYIO 0x0000080L
# define D_MODEM 0x0000100L
# define D_PROT 0x0000200L
# define D_FREQ 0x0000400L
# define D_STATEM 0x0000800L
# define D_DAEMON 0x0001000L
# define D_24554 0x0002000L
# define D_FREE 0x0004000L
# define D_FULL 0xfffffffL
#define D_CONFIG 0x0000001L
#define D_OVERRIDE 0x0000002L
#define D_EVENT 0x0000004L
#define D_NODELIST 0x0000008L
#define D_OUTBOUND 0x0000010L
#define D_INFO 0x0000020L
#define D_HSHAKE 0x0000040L
#define D_TTYIO 0x0000080L
#define D_MODEM 0x0000100L
#define D_PROT 0x0000200L
#define D_FREQ 0x0000400L
#define D_STATEM 0x0000800L
#define D_DAEMON 0x0001000L
#define D_24554 0x0002000L
#define D_FREE 0x0004000L
#define D_FULL 0xfffffffL
#endif
#ifdef DEBUG
# define DEB(what) debug what
#define DEB(what) debug what
#else
# define DEB(what)
#define DEB(what)
#endif
const char *log_getfilename(int whatfor);
+1 -1
View File
@@ -19,7 +19,7 @@
#define EXEC_OPT_LOGOUT 0x04
#define EXEC_OPT_USESHELL 0x08
#define EXEC_MAX_NUM_ENVS 40
#define EXEC_MAX_NUM_ENVS 4095
#define EXEC_MAX_NUM_ARGS 20
#define EXEC_DEFAULT_UMASK ~(S_IRUSR|S_IWUSR);
+1
View File
@@ -44,6 +44,7 @@ typedef struct traffic {
int freqed_num;
int freqed_time;
size_t freqed_size;
int ticfile_num;
} s_traffic;
/*
+5 -1
View File
@@ -116,7 +116,10 @@ struct compcodes
ZAP:1, /* ZedZap (Zmodem variant) */
DZA:1, /* DirectZAP (Zmodem variant) */
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 */
NRQ:1, /* No file requests accepted by this system */
@@ -148,6 +151,7 @@ struct emsi
char passwd[EMSI_MAXPASSWD+1];
s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */
s_compcodes compcodes;
char proto_order[EMSI_MAXADDONS+1];
char m_pid[EMSI_MAXMPID+1];
char m_name[EMSI_MAXMNAME+1];
char m_ver[EMSI_MAXMVER+1];
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+199
View File
@@ -0,0 +1,199 @@
address 99:1/1@testzone
options NoDirZap NoJanus NoChat
proto_order ZMO,ZAP,HYD,SLK,KER,DZA,JAN,TZA
#domain medianet /var/spool/ftn/medianet/ 776
#domain schoolnet /var/spool/ftn/schoolnet/ 461
log_file %TESTZONE%/logsA/bf-log
debug_file %TESTZONE%/logsA/bf-debug
debug_level modem hshake event freq prot
nodial_flag %TESTZONE%/etc/nodial
inbound_directory (Protected) %TESTZONE%/inboundA
inbound_directory %TESTZONE%/inbound-unsecureA
# incnet_flag %TESTZONE%/flags/toss
# incarc_flag %TESTZONE%/flags/toss
outbound_directory %TESTZONE%/outboundA
#amiga_outbound_directory /var/spool/fido/bt/out
nodelist_directory %TESTZONE%/nodelist
status_directory %TESTZONE%/logsA
history_file %TESTZONE%/historyA
#min_speed_in 1200
#min_speed_out 1200
#session_limit_in 1800
#session_limit_out 1800
#min_cps_time 120
# min_cps_recv (2:5020/1398) 2100
# min_cps_recv (2:5020/1682) 3000
# min_cps_recv (2:5020/1811) 1400
zmodem_mincps_recv 300 15
zmodem_mincps_recv 1200 90
zmodem_mincps_recv 2400 120
zmodem_mincps_recv 4800 240
zmodem_mincps_recv 7200 360
zmodem_mincps_recv 9600 480
zmodem_mincps_recv 12000 600
zmodem_mincps_recv 14400 720
zmodem_mincps_recv 16800 840
zmodem_mincps_recv 19200 960
zmodem_mincps_recv 21600 1080
zmodem_mincps_recv 23600 1180
zmodem_mincps_recv 24000 1200
zmodem_mincps_recv 26400 1320
zmodem_mincps_recv 28800 1440
zmodem_mincps_recv 31200 1600
zmodem_mincps_recv 33600 1700
zmodem_mincps_send 300 15
zmodem_mincps_send 1200 90
zmodem_mincps_send 2400 120
zmodem_mincps_send 4800 240
zmodem_mincps_send 7200 360
zmodem_mincps_send 9600 480
zmodem_mincps_send 12000 600
zmodem_mincps_send 14400 720
zmodem_mincps_send 16800 840
zmodem_mincps_send 19200 960
zmodem_mincps_send 21600 1080
zmodem_mincps_send 23600 1180
zmodem_mincps_send 24000 1200
zmodem_mincps_send 26400 1320
zmodem_mincps_send 28800 1440
zmodem_mincps_send 31200 1600
zmodem_mincps_send 33600 1700
hydra_mincps_recv 300 15
hydra_mincps_recv 1200 90
hydra_mincps_recv 2400 120
hydra_mincps_recv 4800 240
hydra_mincps_recv 7200 360
hydra_mincps_recv 9600 480
hydra_mincps_recv 12000 600
hydra_mincps_recv 14400 720
hydra_mincps_recv 16800 840
hydra_mincps_recv 19200 960
hydra_mincps_recv 21600 1080
hydra_mincps_recv 23600 1180
hydra_mincps_recv 24000 1200
hydra_mincps_recv 26400 1320
hydra_mincps_recv 28800 1440
hydra_mincps_recv 31200 1600
hydra_mincps_recv 33600 1700
hydra_mincps_send 300 15
hydra_mincps_send 1200 90
hydra_mincps_send 2400 120
hydra_mincps_send 4800 240
hydra_mincps_send 7200 360
hydra_mincps_send 9600 480
hydra_mincps_send 12000 600
hydra_mincps_send 14400 720
hydra_mincps_send 16800 840
hydra_mincps_send 19200 960
hydra_mincps_send 21600 1080
hydra_mincps_send 23600 1180
hydra_mincps_send 24000 1200
hydra_mincps_send 26400 1320
hydra_mincps_send 28800 1440
hydra_mincps_send 31200 1600
hydra_mincps_send 33600 1700
#
mode_default 100666
mode_arcmail 100666
mode_netmail 100666
mode_request 100666
#modem_port /dev/ttyUSB0:57600
modem_reset_command ATE0M0|
modem_dial_prefix ATDT
modem_dial_suffix |
modem_hangup_command v~^~ATH0|
#modem_stat_command AT%S|
#modem_stat_command AT|
modem_stat_command AT&V1|
modem_dial_response "CONNECT" connect
modem_dial_response "BUSY" busy
modem_dial_response "NO CARRIER" nocarrier
modem_dial_response "NO DIAL" nodialTone
modem_dial_response "NO ANSWER" noanswer
modem_dial_response "VOICE" noanswer
modem_dial_response "ERROR" error
nodelist NODELIST.999 *:*/*.0
#nodelist 450_256.pnt 2:450/256.*
#nodelist easynet.ndl 20:26/*.0
#nodelist *:*/*.*
phone_translate 7-813-78
phone_translate 7- 8
#phone_translate 375- 8
system_name TestZoneA
location TestZone
sysop_name TestZoneA User
phone -Unpublished-
max_speed 9600
emsi_OH_time 00:00-24:00
emsi_FR_time 00:00-24:00
emsi_send_tz yes
emsi_send_time yes
recv_buffer_size 65536
wait_carrier_out 120
#freq_srif_command /usr/local/lib/u-srif/u-srif
freq_alias_list %TESTZONE%/freq.aliases
freq_dir_list %TESTZONE%/freq.dirs
freq_limit_number 10
freq_limit_size 6000000
freq_limit_time 1200
freq_ignore_masks \\* \\*.\\* \\*.zip \\*.rar \\*.exe \\*.mp3 \\*.avi \\*.mp4 \\*.tgz
#zmodem_skip_by_pos yes
zmodem_send_dummy_pkt no
#zmodem_start_block_size 512
#zmodem_tx_window 32768
skip_files_recv *.pif *.swp
#delay_files_recv !%arcmail !%netmail # We will refuse all except mail
#delay_files_send !%netmail # We will send only netmail
#delay_files_recv (2:450/102) !%netmail
#min_free_space 20000
#recode_file_out /usr/local/fido/etc/koi82alt.tbl
#recode_file_in /usr/local/fido/etc/alt2koi8.tbl
#run_after_handshake [logout]/bin/echo "Hello, world!"
#run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in
#run_after_handshake [setsid,useshell,logout]/usr/bin/nlookup $REM_ADDR_FTN
#run_after_session [logout,useshell]/usr/bin/hpt toss && /usr/bin/hpt link && /usr/bin/htick toss
#run_after_handshake [setsid,useshell,logout]/usr/bin/nlookup $REM_ADDR_FTN
#filebox_directory /var/spool/fido/bt/fbox
#filebox /var/spool/ftn/fbox/adb 2:5020/2120.1 hold
#filebox /var/spool/ftn/fbox/pvc 2:5020/2091 normal
#flo_translate C:\\fido\\spool\\outbound /var/spool/ftn/out
#flo_translate \\ /
maxtries 200 Undialable # Be carefull.. =)
maxtries_noansw 5 Hold 7200 # Call two hours later
maxtries_noconn 40 Hold 10800 # Don't call 3 hours
maxtries_hshake 10 Hold 86400 # 1 day delay
maxtries_sessions 10 Hold 3600 # Don't annoy uplinks
maxtries_nodial 1 Hold 1200 # Call 20 min later
daemon_circle_modem 40
daemon_circle_rescan 60
daemon_circle_normal 80
daemon_circle_direct 40
daemon_circle_crash 20
daemon_circle_immed 10
daemon_maxclients_tcpip 2
daemon_maxclients_modem 1
daemon_pid_file /var/run/bforce.pid
#syslog_facility 64
#nomail_flag /home/zx/fido/ftnroot/flags/nomail
#run_before_session /usr/local/bin/call_inet.sh
recieved_to_lower yes
# That's all!
+202
View File
@@ -0,0 +1,202 @@
address 99:1/1@testzone
options NoDirZap NoJanus NoChat
#proto_order ZMO,ZAP,HYD,SLK,KER,DZA,JAN,TZA
proto_order %PROTO%
#domain medianet /var/spool/ftn/medianet/ 776
#domain schoolnet /var/spool/ftn/schoolnet/ 461
log_file %TESTZONE%/logsA/bf-log
debug_file %TESTZONE%/logsA/bf-debug
debug_level modem hshake event freq
nodial_flag %TESTZONE%/etc/nodial
inbound_directory (Protected) %TESTZONE%/inboundA
inbound_directory %TESTZONE%/inbound-unsecureA
# incnet_flag %TESTZONE%/flags/toss
# incarc_flag %TESTZONE%/flags/toss
outbound_directory %TESTZONE%/outboundA
#amiga_outbound_directory /var/spool/fido/bt/out
nodelist_directory %TESTZONE%/nodelist
status_directory %TESTZONE%/logsA
history_file %TESTZONE%/logsA/history
password 99:1/2 testpwd1
#min_speed_in 1200
#min_speed_out 1200
#session_limit_in 1800
#session_limit_out 1800
#min_cps_time 120
# min_cps_recv (2:5020/1398) 2100
# min_cps_recv (2:5020/1682) 3000
# min_cps_recv (2:5020/1811) 1400
zmodem_mincps_recv 300 15
zmodem_mincps_recv 1200 90
zmodem_mincps_recv 2400 120
zmodem_mincps_recv 4800 240
zmodem_mincps_recv 7200 360
zmodem_mincps_recv 9600 480
zmodem_mincps_recv 12000 600
zmodem_mincps_recv 14400 720
zmodem_mincps_recv 16800 840
zmodem_mincps_recv 19200 960
zmodem_mincps_recv 21600 1080
zmodem_mincps_recv 23600 1180
zmodem_mincps_recv 24000 1200
zmodem_mincps_recv 26400 1320
zmodem_mincps_recv 28800 1440
zmodem_mincps_recv 31200 1600
zmodem_mincps_recv 33600 1700
zmodem_mincps_send 300 15
zmodem_mincps_send 1200 90
zmodem_mincps_send 2400 120
zmodem_mincps_send 4800 240
zmodem_mincps_send 7200 360
zmodem_mincps_send 9600 480
zmodem_mincps_send 12000 600
zmodem_mincps_send 14400 720
zmodem_mincps_send 16800 840
zmodem_mincps_send 19200 960
zmodem_mincps_send 21600 1080
zmodem_mincps_send 23600 1180
zmodem_mincps_send 24000 1200
zmodem_mincps_send 26400 1320
zmodem_mincps_send 28800 1440
zmodem_mincps_send 31200 1600
zmodem_mincps_send 33600 1700
hydra_mincps_recv 300 15
hydra_mincps_recv 1200 90
hydra_mincps_recv 2400 120
hydra_mincps_recv 4800 240
hydra_mincps_recv 7200 360
hydra_mincps_recv 9600 480
hydra_mincps_recv 12000 600
hydra_mincps_recv 14400 720
hydra_mincps_recv 16800 840
hydra_mincps_recv 19200 960
hydra_mincps_recv 21600 1080
hydra_mincps_recv 23600 1180
hydra_mincps_recv 24000 1200
hydra_mincps_recv 26400 1320
hydra_mincps_recv 28800 1440
hydra_mincps_recv 31200 1600
hydra_mincps_recv 33600 1700
hydra_mincps_send 300 15
hydra_mincps_send 1200 90
hydra_mincps_send 2400 120
hydra_mincps_send 4800 240
hydra_mincps_send 7200 360
hydra_mincps_send 9600 480
hydra_mincps_send 12000 600
hydra_mincps_send 14400 720
hydra_mincps_send 16800 840
hydra_mincps_send 19200 960
hydra_mincps_send 21600 1080
hydra_mincps_send 23600 1180
hydra_mincps_send 24000 1200
hydra_mincps_send 26400 1320
hydra_mincps_send 28800 1440
hydra_mincps_send 31200 1600
hydra_mincps_send 33600 1700
#
mode_default 100666
mode_arcmail 100666
mode_netmail 100666
mode_request 100666
#modem_port /dev/ttyUSB0:57600
modem_reset_command ATE0M0|
modem_dial_prefix ATDT
modem_dial_suffix |
modem_hangup_command v~^~ATH0|
#modem_stat_command AT%S|
#modem_stat_command AT|
modem_stat_command AT&V1|
modem_dial_response "CONNECT" connect
modem_dial_response "BUSY" busy
modem_dial_response "NO CARRIER" nocarrier
modem_dial_response "NO DIAL" nodialTone
modem_dial_response "NO ANSWER" noanswer
modem_dial_response "VOICE" noanswer
modem_dial_response "ERROR" error
nodelist NODELIST.999 *:*/*.0
#nodelist 450_256.pnt 2:450/256.*
#nodelist easynet.ndl 20:26/*.0
#nodelist *:*/*.*
phone_translate 7-813-78
phone_translate 7- 8
#phone_translate 375- 8
system_name TestZoneA
location TestZone
sysop_name TestZoneA User
phone -Unpublished-
max_speed 9600
emsi_OH_time 00:00-24:00
emsi_FR_time 00:00-24:00
emsi_send_tz yes
emsi_send_time yes
recv_buffer_size 65536
wait_carrier_out 120
#freq_srif_command /usr/local/lib/u-srif/u-srif
freq_alias_list %TESTZONE%/etc/freq.aliases
freq_dir_list %TESTZONE%/etc/freq.dirs
freq_limit_number 10
freq_limit_size 6000000
freq_limit_time 1200
freq_ignore_masks \\* \\*.\\* \\*.zip \\*.rar \\*.exe \\*.mp3 \\*.avi \\*.mp4 \\*.tgz
#zmodem_skip_by_pos yes
zmodem_send_dummy_pkt no
#zmodem_start_block_size 512
#zmodem_tx_window 32768
skip_files_recv *.pif *.swp
#delay_files_recv !%arcmail !%netmail # We will refuse all except mail
#delay_files_send !%netmail # We will send only netmail
#delay_files_recv (2:450/102) !%netmail
#min_free_space 20000
#recode_file_out /usr/local/fido/etc/koi82alt.tbl
#recode_file_in /usr/local/fido/etc/alt2koi8.tbl
#run_after_handshake [logout]/bin/echo "Hello, world!"
#run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in
#run_after_handshake [setsid,useshell,logout]/usr/bin/nlookup $REM_ADDR_FTN
#run_after_session [logout,useshell]/usr/bin/hpt toss && /usr/bin/hpt link && /usr/bin/htick toss
#run_after_handshake [setsid,useshell,logout]/usr/bin/nlookup $REM_ADDR_FTN
#filebox_directory /var/spool/fido/bt/fbox
#filebox /var/spool/ftn/fbox/adb 2:5020/2120.1 hold
#filebox /var/spool/ftn/fbox/pvc 2:5020/2091 normal
#flo_translate C:\\fido\\spool\\outbound /var/spool/ftn/out
#flo_translate \\ /
maxtries 200 Undialable # Be carefull.. =)
maxtries_noansw 5 Hold 7200 # Call two hours later
maxtries_noconn 40 Hold 10800 # Don't call 3 hours
maxtries_hshake 10 Hold 86400 # 1 day delay
maxtries_sessions 10 Hold 3600 # Don't annoy uplinks
maxtries_nodial 1 Hold 1200 # Call 20 min later
daemon_circle_modem 40
daemon_circle_rescan 60
daemon_circle_normal 80
daemon_circle_direct 40
daemon_circle_crash 20
daemon_circle_immed 10
daemon_maxclients_tcpip 2
daemon_maxclients_modem 1
daemon_pid_file %TESTZONE%/run/bforceA.pid
#syslog_facility 64
#nomail_flag /home/zx/fido/ftnroot/flags/nomail
#run_before_session /usr/local/bin/call_inet.sh
recieved_to_lower yes
# That's all!
+202
View File
@@ -0,0 +1,202 @@
address 99:1/2@testzone
options NoDirZap NoJanus NoChat
#proto_order ZMO,ZAP,HYD,SLK,KER,DZA,JAN,TZA
proto_order %PROTO%
#domain medianet /var/spool/ftn/medianet/ 776
#domain schoolnet /var/spool/ftn/schoolnet/ 461
log_file %TESTZONE%/logsB/bf-log
debug_file %TESTZONE%/logsB/bf-debug
debug_level modem hshake event freq
nodial_flag %TESTZONE%/etc/nodial
inbound_directory (Protected) %TESTZONE%/inboundB
inbound_directory %TESTZONE%/inbound-unsecureB
# incnet_flag %TESTZONE%/flags/toss
# incarc_flag %TESTZONE%/flags/toss
outbound_directory %TESTZONE%/outboundB
#amiga_outbound_directory /var/spool/fido/bt/out
nodelist_directory %TESTZONE%/nodelist
status_directory %TESTZONE%/logsB
history_file %TESTZONE%/logsB/history
password 99:1/1 testpwd1
#min_speed_in 1200
#min_speed_out 1200
#session_limit_in 1800
#session_limit_out 1800
#min_cps_time 120
# min_cps_recv (2:5020/1398) 2100
# min_cps_recv (2:5020/1682) 3000
# min_cps_recv (2:5020/1811) 1400
zmodem_mincps_recv 300 15
zmodem_mincps_recv 1200 90
zmodem_mincps_recv 2400 120
zmodem_mincps_recv 4800 240
zmodem_mincps_recv 7200 360
zmodem_mincps_recv 9600 480
zmodem_mincps_recv 12000 600
zmodem_mincps_recv 14400 720
zmodem_mincps_recv 16800 840
zmodem_mincps_recv 19200 960
zmodem_mincps_recv 21600 1080
zmodem_mincps_recv 23600 1180
zmodem_mincps_recv 24000 1200
zmodem_mincps_recv 26400 1320
zmodem_mincps_recv 28800 1440
zmodem_mincps_recv 31200 1600
zmodem_mincps_recv 33600 1700
zmodem_mincps_send 300 15
zmodem_mincps_send 1200 90
zmodem_mincps_send 2400 120
zmodem_mincps_send 4800 240
zmodem_mincps_send 7200 360
zmodem_mincps_send 9600 480
zmodem_mincps_send 12000 600
zmodem_mincps_send 14400 720
zmodem_mincps_send 16800 840
zmodem_mincps_send 19200 960
zmodem_mincps_send 21600 1080
zmodem_mincps_send 23600 1180
zmodem_mincps_send 24000 1200
zmodem_mincps_send 26400 1320
zmodem_mincps_send 28800 1440
zmodem_mincps_send 31200 1600
zmodem_mincps_send 33600 1700
hydra_mincps_recv 300 15
hydra_mincps_recv 1200 90
hydra_mincps_recv 2400 120
hydra_mincps_recv 4800 240
hydra_mincps_recv 7200 360
hydra_mincps_recv 9600 480
hydra_mincps_recv 12000 600
hydra_mincps_recv 14400 720
hydra_mincps_recv 16800 840
hydra_mincps_recv 19200 960
hydra_mincps_recv 21600 1080
hydra_mincps_recv 23600 1180
hydra_mincps_recv 24000 1200
hydra_mincps_recv 26400 1320
hydra_mincps_recv 28800 1440
hydra_mincps_recv 31200 1600
hydra_mincps_recv 33600 1700
hydra_mincps_send 300 15
hydra_mincps_send 1200 90
hydra_mincps_send 2400 120
hydra_mincps_send 4800 240
hydra_mincps_send 7200 360
hydra_mincps_send 9600 480
hydra_mincps_send 12000 600
hydra_mincps_send 14400 720
hydra_mincps_send 16800 840
hydra_mincps_send 19200 960
hydra_mincps_send 21600 1080
hydra_mincps_send 23600 1180
hydra_mincps_send 24000 1200
hydra_mincps_send 26400 1320
hydra_mincps_send 28800 1440
hydra_mincps_send 31200 1600
hydra_mincps_send 33600 1700
#
mode_default 100666
mode_arcmail 100666
mode_netmail 100666
mode_request 100666
#modem_port /dev/ttyUSB0:57600
modem_reset_command ATE0M0|
modem_dial_prefix ATDT
modem_dial_suffix |
modem_hangup_command v~^~ATH0|
#modem_stat_command AT%S|
#modem_stat_command AT|
modem_stat_command AT&V1|
modem_dial_response "CONNECT" connect
modem_dial_response "BUSY" busy
modem_dial_response "NO CARRIER" nocarrier
modem_dial_response "NO DIAL" nodialTone
modem_dial_response "NO ANSWER" noanswer
modem_dial_response "VOICE" noanswer
modem_dial_response "ERROR" error
nodelist NODELIST.999 *:*/*.0
#nodelist 450_256.pnt 2:450/256.*
#nodelist easynet.ndl 20:26/*.0
#nodelist *:*/*.*
phone_translate 7-813-78
phone_translate 7- 8
#phone_translate 375- 8
system_name TestZoneB
location TestZone
sysop_name TestZoneB User
phone -Unpublished-
max_speed 9600
emsi_OH_time 00:00-24:00
emsi_FR_time 00:00-24:00
emsi_send_tz yes
emsi_send_time yes
recv_buffer_size 65536
wait_carrier_out 120
#freq_srif_command /usr/local/lib/u-srif/u-srif
freq_alias_list %TESTZONE%/etc/freq.aliases
freq_dir_list %TESTZONE%/etc/freq.dirs
freq_limit_number 10
freq_limit_size 6000000
freq_limit_time 1200
freq_ignore_masks \\* \\*.\\* \\*.zip \\*.rar \\*.exe \\*.mp3 \\*.avi \\*.mp4 \\*.tgz
#zmodem_skip_by_pos yes
zmodem_send_dummy_pkt no
#zmodem_start_block_size 512
#zmodem_tx_window 32768
skip_files_recv *.pif *.swp
#delay_files_recv !%arcmail !%netmail # We will refuse all except mail
#delay_files_send !%netmail # We will send only netmail
#delay_files_recv (2:450/102) !%netmail
#min_free_space 20000
#recode_file_out /usr/local/fido/etc/koi82alt.tbl
#recode_file_in /usr/local/fido/etc/alt2koi8.tbl
#run_after_handshake [logout]/bin/echo "Hello, world!"
#run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in
#run_after_handshake [setsid,useshell,logout]/usr/bin/nlookup $REM_ADDR_FTN
#run_after_session [logout,useshell]/usr/bin/hpt toss && /usr/bin/hpt link && /usr/bin/htick toss
#run_after_handshake [setsid,useshell,logout]/usr/bin/nlookup $REM_ADDR_FTN
#filebox_directory /var/spool/fido/bt/fbox
#filebox /var/spool/ftn/fbox/adb 2:5020/2120.1 hold
#filebox /var/spool/ftn/fbox/pvc 2:5020/2091 normal
#flo_translate C:\\fido\\spool\\outbound /var/spool/ftn/out
#flo_translate \\ /
maxtries 200 Undialable # Be carefull.. =)
maxtries_noansw 5 Hold 7200 # Call two hours later
maxtries_noconn 40 Hold 10800 # Don't call 3 hours
maxtries_hshake 10 Hold 86400 # 1 day delay
maxtries_sessions 10 Hold 3600 # Don't annoy uplinks
maxtries_nodial 1 Hold 1200 # Call 20 min later
daemon_circle_modem 40
daemon_circle_rescan 60
daemon_circle_normal 80
daemon_circle_direct 40
daemon_circle_crash 20
daemon_circle_immed 10
daemon_maxclients_tcpip 2
daemon_maxclients_modem 1
daemon_pid_file %TESTZONE%/run/bforceB.pid
#syslog_facility 64
#nomail_flag /home/zx/fido/ftnroot/flags/nomail
#run_before_session /usr/local/bin/call_inet.sh
recieved_to_lower yes
# That's all!
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
txt2pkt -nf "TestZone UserB" -xf "99:1/1" -xt "99:1/2" -t "Binkleyforce testzone" -o "fido.zxalexis.ru" -s "Test Message from TestNodeA to TestNodeB" -d ./msgAtoB ./testtextA.cp866
txt2pkt -nf "TestZone UserA" -xf "99:1/2" -xt "99:1/1" -t "Binkleyforce testzone" -o "fido.zxalexis.ru" -s "Test Message from TestNodeB to TestNodeA" -d ./msgBtoA ./testtextB.cp866
Binary file not shown.
Binary file not shown.
+50
View File
@@ -0,0 +1,50 @@
‚®â, ­ ¢¥ï«®:
‡¢¥§¤ë ®âà ¦ «¨áì ¢ ¥ñ £« § å.  ­ìè¥, ¥é¥ ¬¥áïæ ­ § ¤ ¨å ­¥ ¡ë«® ¢¨¤­® ¢ ç¥à⥠£®à®¤ . ‘¢¥â ä®­ à¥© ¨ ᬮ£ § £«ãè «¨ ¨å á« ¡®¥ ¬¥àæ ­¨¥. ‚ᥠ¨§¬¥­¨«®áì. ˆ ®¤­¨¬ ¨§ ­¥¬­®£¨å ¯«îᮢ á«®¦¨¢è¥©áï á¨âã æ¨¨ ¡ë«® ¬¥àæ ­¨¥ §¢¥§¤ ¢ ¥ñ £« § å, ¨ ¢®§¤ãå, ª ¦¥âáï áâ « ç¨é¥. “ ¢á¥å ã ­ á ª®£¤  â® ¡ë«  à ¡®â , ¨ ¡ë« ¤®¬. “ ­¥ª®â®àëå ¡ë«¨ ¤¥â¨. “ ‹¥­ë ¡ë«  ¤®çª . Ž­  à ¡®â «  ¡ à¬¥­è®©,   ¯® ¢¥ç¥à ¬ ¯®¤à ¡ â뢠«  ¢ "ª«ã¡¥ §­ ª®¬áâ¢". ®¯à®áâã £®¢®àï - ¡ë«  ¯à®áâ¨âã⪮©. ’¥¯¥àì ¥© 㦥 ­¥ ¯à¨å®¤¨âáï ¥§¤¨âì ¯® ­¥§­ ª®¬ë¬ ª«¨¥­â ¬, ª ¦¤ë© à § ¯¥à¥¤ ¤¢¥àìî ª¢ àâ¨àë ªà¥áâ¨âìáï, ¨ ¬®«¨âìáï, çâ® ¡ë ¢á¥ ¯à®è«® ª ª ­ ¤®. ⮠⮦¥ ¯«îá. ® ⥯¥àì ã ­¥ñ ­¥â ¤®çª¨. Ž­  ¯®â¥àï« áì ¢ ¯¥à¢ë¥ ¤­¨, ª ª ⮫쪮 ¢á¥ íâ® ­ ç¨­ «®áì.
‹¥­  ¡ë«  "­  ¢ë§®¢¥", ª®£¤  ¨á祧«® í«¥ªâà¨ç¥á⢮. ¨ªâ® ¥é¥ ­¥ §­ «, çâ® íâ® á¥à쥧­®. Œ®¡¨«ì­ ï á¢ï§ì ­¥ à ¡®â « , £®à®¤ ¯®£à㧨«áï ¢® âì¬ã §  ®ª­ ¬¨ ®¤­ ª®¬­ â­®© ª¢ àâ¨àë, ¢ ª®â®à®© ¢®§¡ã¦¤¥­­ë© ¬ã¦ç¨­  ª®­ç « ¢ ¯à¥§¥à¢ â¨¢,   ‹¥­  áç¨â «  á¥ªã­¤ë ¤® ®ç¥à¥¤­®£® ¢ë§®¢ . Ž­  ­¥ ¬®£«  ª ª ®¡ëç­® ¯à¨­ïâì ¤ãè, ¨ ¢ë§¢ âì â ªá¨, ¨ ¯®á«¥ ®á®§­ ­¨ï í⮣®, ¯à®áâ® ­ ç «  ®¤¥¢ âìáï. ¥«ì¥ ¯® ¯à¨¢ë窥 ¡ë«® á«®¦¥­® ®¤­®© ªã窮© à冷¬ á ªà®¢ âìî. Œã¦ç¨­ , ¨¬ï ª®â®à®£® ®­  ­¥ § å®â¥«  § ¯®¬¨­ âì ᪠§ « ¥© ᯠᨡ® ¨ ®âªàë« ¤¢¥àì, çâ® â® ¯à®¢®àç ¢ ­ ¯®á«¥¤®ª ­  "¤®«¡ ­­ëå í«¥ªâਪ®¢"...
‹¥­¥ ¡ë«® ®ç¥­ì ¯à¨ïâ­® ¢ë©â¨ ­  ᢥ¦¨© ¢®§¤ãå, ¯®á«¥ ¯à®¯ å襩 ¯¥à¥£ à®¬ ª®¬­ âã誨. Ž­  è«  ¯® ⥬­ë¬ 㫨栬 £®à®¤ , è«  ­  "¡ §ã" ¯¥èª®¬, ¨ íâ  ­¥¯à®£«ï¤­ ï â쬠 ¢®ªà㣠¤«ï ­¥ñ ᥩç á ¡ë«  ®âà ¦¥­¨¥¬ ¢­ãâ७­¥£® á®áâ®ï­¨ï, ¨ ¯®í⮬㠮­  ­ á« ¦¤ « áì í⮩ ¯à®£ã«ª®©. Ž­  ¥é¥ ­¥ §­ « , çâ® í«¥ªâà¨ç¥á⢮ ¨ ¢®¤®á­ ¡¦¥­¨¥ 㦥 ­¥ ¢®ááâ ­®¢ïâ. Ž­  ­¥ ¬®£«  ¯®¤ã¬ âì, çâ® ç¥à¥§ âਠç á  ¥ñ ¯ï⨫¥â­ïï ¤®çª , ¨á¯ã£ ¢è¨áì ⥬­®âë ¨ ®¤¨­®ç¥á⢠, ¢ë©¤¥â ¨§ ª¢ àâ¨àë, ¨ ¯à®¯ ¤¥â ­ ¢á¥£¤ . Ž­  ¥é¥ ­¥ §­ « , çâ® ¥ñ ¯®¨áª¨ ¡ã¤ãâ ¡¥á¯®«¥§­ë ¨ ®¯ á­ë... Ž­  ¯à®áâ® è«  ¯® 㫨æ¥.
‘¥©ç á ¬ë á⮨¬ ª®«ì殬, à¥è ¥¬ çâ® ¤¥« âì. „¬¨â਩ ˆ¢ ­®¢¨ç á«¥¢  ®â ¬¥­ï, ¤¯«¥¥ ‘ è®ª, ‹¥­  ¨ „¨¬ .   ᪠¬¥©ª¥ ­¥¤ «¥ª® ᨤïâ ‹¥à  ¨ Ž«ï. ‹¨æ  ¢® â쬥 ¥«¥ à §«¨ç¨¬ë. “ ¬ã¦ç¨­ - ¯®ªàëâë é¥â¨­®©, ã ¤¥¢ã襪 ®áã­ã«¨áì ¨ ãáâ «¨..
-   Š¨à®¢  ï á«ëè « ¢ëáâ५ë. ’㤠 ¨¤â¨ ¡¥á¯®«¥§­®. - „¬¨â਩ ˆ¢ ­®¢¨ç ¡ë« ® ­ ¯ã£ ­.
- „  ­¨ªâ® ⥡ï â㤠 ­¥ § áâ ¢«ï¥â ¨¤â¨! - ᪠§ « ‘ è®ª.
- „ , ­® ­ ¬ ­ã¦­® ¤®áâ âì ¥é¥ ¥¤ë. - ®â¢¥â¨« ï.
“«¨æë £®à®¤  ¡ë«¨ ¯ãáâë ⮫쪮 á ¢¨¤ã.   á ¬®¬ ¤¥«¥ - ¢ ç¥à­ëå £« §­¨æ å §¤ ­¨© î⨫¨áì ãæ¥«¥¢è¨¥. €£à¥áᨢ­ë¥, ®§«®¡«¥­­ë¥, £®â®¢ë¥ ­  ¢á¥. ‹î¤¨ ªã窮¢ «¨áì ¯® á«ãç ©­®¬ã ¯à¨§­ ªã. ’ ª ¨ ­ è  £à㯯  ®¡à §®¢ « áì á«ãç ©­®. ޤ­®¬ã ᥩç á ­¥ ¢ë¦¨âì. ® ¯à®¡«¥¬  ¢ ⮬, çâ® ¬ë ­¥ ¤®¢¥à﫨 ¤à㣨¬. Š ª ¢¯à®ç¥¬ ¨ ®­¨ ­ ¬. “ ­ á ¥é¥ ¡ë«  ¥¤ , ¥ñ 墠⨫® ¡ë ­  ­¥¤¥«î ¬ ªá¨¬ã¬.
- Šâ® ­¨¡ãâì á«¥¤¨« §  í⨬ ¤®¬®¬? - ï 㪠§ « ­  ¤®¬ 20, ª®à¯ãá 1 ¯® ‹¥­¨­£à ¤áª®© ­ ¡¥à¥¦­®©. â® ¡ë«  ¯ïâ¨íâ ¦ª , ¨ ®­  £®à¥« . ƒ®à¥«  㦥 ¤ ¢­®. ˆ§ ®¤­®£® ¯®¤ê¥§¤  ¯®áâ®ï­­® ¢ «¨« ¤ë¬. —¥à­ë©, £ãá⮩. ® ¢á¯®«®å®¢ ¯« ¬¥­¨ ­¥ ¡ë«® ¢¨¤­®.
- Ÿ á«¥¤¨« , ­¨ªâ® ­¥ ¢å®¤¨«. Š®¬ã ­ã¦¥­ íâ® £®àï饥 ¯¥ª«®? - ‹¥à  ¯®¤ «  £®«®á ᮠ᪠¬¥©ª¨.
- ®©¤¥¬ â㤠. - ‘ è®ª ­¥ á¯à è¨¢ «, ®­ ¯à®áâ® ª®­áâ â¨à®¢ « ä ªâ.
¨ªâ® ­¥ ᯮਫ. ‚ᥠ®ç¥­ì ãáâ «¨. ˆ ¨¤¥ï ®¡è à¨âì £®àï騩 ¤®¬ ¢á¥¬ ¯®ª § « áì ¯à ¢¨«ì­®©. Œë ¯¥à¥¤¥à­ã«¨ § â¢®àë, ¯à®¢¥à¨«¨ £à ­ âë, ¨ ¯®è«¨.
„¬¨â਩ ˆ¢ ­®¢¨ç ¡ë« ãç¨â¥«¥¬ ¢ â¥å­¨ªã¬¥. ‚ â®â ¤¥­ì ®­ ¯à¨è¥« ¤®¬®©,  ªªãà â­® à ááâ ¢¨« ¢á¥ ¯à®¤ãªâë ¢ 宫®¤¨«ì­¨ª, ª®â®àë¥ ¯à¨­¥á ¢ á㬪¥.  áá⥫¨« ᪠â¥àâì ­  á⮫¥. „®áâ « äã¦¥à ¨§ á⥭­®£® 誠ä . 冷¬ ¯®«®¦¨« ¡«î¤æ¥ á ­ à¥§ ­­ë¬ áë஬. ãâ뫪㠢¨­  "Œ¥à«®", ªà¥¯ª®¥ ¯®«ãá« ¤ª®¥. ‚›ª«î稫 ᢥâ. ‚ª«î稫 ⥫¥¢¨§®à.  «¨« ¯®«­ë© ä㦥à. Ž­ ¯à¨£®â®¢¨«áï ¯à®¢¥á⨠®ç¥à¥¤­®© ¯à¨ïâ­ë© ¢¥ç¥à ¢ ¯®«­®¬ ®¤¨­®ç¥á⢥.
—¥à¥§ ­¥¤¥«î ¯®á«¥ ⮣® ª ª á«ã稫 áì ª â áâà®ä  ®­ 㦥 «¥£ª® १ « «î¤¥© ­®¦®¬, ª®â®àë¬ ª®£¤  ⮠१ « áëà. Ž­ 㦥 «¥£ª® ¯¨« ¢®¤ªã, ¨ § ¡ë« ­ §¢ ­¨¥ «î¡¨¬®© ⥫¥¯¥à¥¤ ç¨. € ª®¬ ­¤  "‡¥­¨â", §  ª®â®àãî ®­ ª®£¤  â® ¡®«¥« - ¤«ï ­¥£® áâ «  祬 â® ¬¨ä¨ç¥áª¨¬, ¨§ ¤à㣮£® ¬¨à . ˆ â¥å «î¤¥©, ª®â®àë¬ ®­ áâ ¢¨« ª®£¤  â® ®æ¥­ª¨ ¢ ª« áá¥, ®­ 㡨¢ « ­¥ § ¤ã¬ë¢ ïáì. ˆ ¤ ¦¥ á ª ª¨¬ ⮠㤮¢®«ìá⢨¥¬ ¨ á ­¥ª®â®à®© ¤®«¥© á ¬®®â¤ ç¨ ¨ ᬥª «ª¨...
ˆ ª®­¥ç­® ¦¥ ¨à®­¨¨. ¥§ ­¥ñ ᥩç á ­¥ ¯à®¦¨âì. ‚ ¯®¤ê¥§¤¥ ¯ïâ¨íâ ¦ª¨ ­¥á«® á¬à ¤®¬. Œë ¡ëáâà® ®¤¥«¨ ¬ à«¥¢ë¥ ¯®¢ï§ª¨. ‘¯ã᪠¢­¨§, ¯®¤¢ «, ¯à¥¢à é¥­­ë© ¢ ᪫ ¤ ¯à®¤ãªâ®¢®£® ¬ £ §¨­ . â® ¨ ¥áâì ­ è  楫ì. „¨¬ , ¤¥à¦  ¯¨á⮫¥â ­ £®â®¢¥ ¢áâ « ®â ¤¢¥à¨ á«¥¢ . ‘ è®ª á¯à ¢ . ã   ¬­¥ ­ã¦­® ¡ë«® ¢§«®¬ âì ¦¥«¥§­ãî ¤¢¥àì. Š ¦¤ë© ¨§ ­ á ⥯¥àì áâ « ¢ í⮬ ᯥ樠«¨á⮬. Ÿ ­¥ áâ « ¯®¤¡¨à âì ª«îç. Ÿ à §à廊« ®¡®©¬ã ᢮¥£® "¬ ª à®¢ " ¢®ªà㣠§ ¬ª . „¬¨â਩ ˆ¢ ­®¢¨ç, ¨­â¥««¨£¥­â­® ¯à¨«®¦¨«áï ­®£®© ¯® ¤¢¥à¨ ¨ ¯¥à¢ë© ¢®à¢ «áï ¢ ¯®¬¥é¥­¨¥. ®ª  ï ¯¥à¥§ à裂« ®¡®©¬ã, ï 㦥 ãá«ëè « ¢ëáâ५ë. Œë ¤¥©á⢮¢ «¨ ¡ëáâà® ¨ ¡¥§¦ «®áâ­®. „¥¢ã誨 áâ®ï«¨ á­ à㦨. ˆ¬ ®â¤ «¨ áâ àë© ª « è­¨ª®¢, ­  ¢á直© á«ãç ©.
‹¥à  •®â¥«  ¯à®áâ® ¯®¤®£à¥âì ¢®¤ã, çâ® ¡ë ¢ë¯¨âì £®àï祣® ç î. ‚¯¥à¢ë¥, á¯ãáâï ¤¢  ¤­ï ª ª ®âª«î稫¨ í«¥ªâà¨ç¥á⢮, ®­  ®áâ®à®¦­® ¢ëè«  ­  㫨æã. ‚ ®ª­® ®­  ¢¨¤¥« , ª ª ¢® ¤¢®à¥ ¤®¬  «î¤¨ à §®¦£«¨ ª®áâ¥à. ë«  ®á¥­ì, ¯®£®¤  ­¥ à ¤®¢ «  ⥯«®¬, ¨ à ááç¨â뢠âì ¡ë«® ®á®¡® ­¥ ­  çâ®. …ñ áã¯à㣠¡ë« ¢ ª®¬ ­¤¨à®¢ª¥ ¢ ¨â¥à¥, ¨ ®­  ­¥ å®â¥«  ­¨ç¥£® ¡¥§ ­¥£® ¯à¥¤¯à¨­¨¬ âì, ¯®ª  ®­ ­¥ ¢¥à­¥âáï. ‘®á¥¤ª , ¯®¦¨« ï ¦¥­é¨­ , ¡ë«  ¥¤¨­á⢥­­ë¬ 祫®¢¥ª®¬, á ª¥¬ ®­  ®¡é « áì ¢ íâ® ¢à¥¬ï. Ž­  à á᪠§ «  ¥©, çâ® í«¥ªâà¨ç¥á⢮ ¯®ç¨­¨âì ¯®ª  ­¥ 㤠¥âáï. —â® ¯® ­¥¯®­ïâ­ë¬ ¯à¨ç¨­ ¬ ­¥ à ¡®â îâ ¤ ¦¥ £¥­¥à â®àë ¢  ¢â®¬®¡¨«ïå. ˆ çâ® ¢à®¤¥ ¡ë íâ® ¯à®¡«¥¬  ­¥ ⮫쪮 ¢ Œ®­ç¥£®à᪥, ­® ¨ ¢® ¢á¥© ¬ãଠ­áª®© ®¡« áâ¨.
‚ ¯¥à¢ë© ¤¥­ì, ¯® 㫨栬 室¨«¨ ¬¨«¨æ¥©áª¨¥ ¯ âà㫨, £à®¬ª® £®¢®à¨«¨ çâ® ¡ë ¢á¥ ᮡ«î¤ «¨ ᯮª®©á⢨¥. —â® ¯¨â ­¨¥ ¡ã¤¥â ᪮஠¢®ááâ ­®¢«¥­® ¨ ­¥â ¯à¨ç¨­ ¤«ï ¯ ­¨ª¨. “â஬ ¯à®è¥« ¥é¥ ®¤¨­ ¯ âàã«ì, ®­ ®£« á¨« ¨­ä®à¬ æ¨î ® ­¥áª®«ìª¨å ¯ã­ªâ å ᪮ன ¯®¬®é¨, à §¢¥à­ãâëå ¢ £®à®¤¥.   業âà «ì­®© ¯«®é ¤¨, ­  ã«¨æ¥ Š«¨¬¥­â쥢 , ‹¥­¨­£à ¤áª®© ­ ¡¥à¥¦­®©, Œ®­ç¥, ¨ ã«¨æ¥ à¥¤®¢ . ’ ¬ ¬®¦­® ¯®«ãç¨âì ¥¤ã ¨ ¢®¤ã. ¥ª®â®àë¥ «î¤¨ ¢á¥ â ª¨ ¯®¤¤ «¨áì ¯ ­¨ª¥. Žá®¡¥­­® â¥, ª®â®àë¥ å®¤¨«¨ á ¬ «®«¥â­¨¬¨ ¤¥â쬨. Ž­¨ âॡ®¢ «¨ ®â ¯ âàã«¥© ¯®«­®© ¨­ä®¬ æ¨¨ ¨ ¢¥«¨ á¥¡ï ®ç¥­ì ­¥á¯®ª®©­®. ‚á«¥¤á⢨¨ 祣® ­¥ª®â®àë¥ ¡ë«¨  à¥á⮢ ­ë ¨ ¯®¬¥é¥­ë ¯®¤  à¥áâ.
‹¥à  ¢ëè«  á ª áâàî«¥© ¢®¤ë ¢® ¤¢®à. ‘®á¥¤¨ ¡¥§ ¯à®¬¥¤«¥­¨ï 㪠§ «¨ ­  áâ àë¥ ª ç¥«¨, ¯®¤ ª®â®à묨 £®à¥« ®£®­ì, ¨ ¢¨á¥«® ¥é¥ ­¥áª®«ìª® ª®â¥«ª®¢. ‹¥à  ¯®¢¥á¨«  ᢮©.
‹¨æ  㠫© ¢®ªà㣠ª®áâà ,   ¨å ¡ë«® ®ª®«® 50-⨠祫®¢¥ª. 뫨 ­ ¯à殮­ë. ƒ« §  ã ¬­®£¨å ¢®§¡ã¦¤¥­­® £®à¥«¨. Šâ® â® ¤ ¦¥ èã⨫. ’¨è¨­ã ¨ ¬¥à­ë© £®¬®­ £®«®á®¢ ¨­®£¤  ¯à¥à뢠« £à®¬ª¨© ᬥå.
‹¥à  ¯®£®¢®à¨«  ­¥¬­®£® á á®á¥¤ï¬¨. ¨ªâ® ­¥ §­ «, çâ® á«ã稫®áì...
¥¯«®å®. Ž­¨ ¢á¥ ᯠ«¨. Ž¡®è«®áì ¡¥§ ®á«®¦­¥­¨©. ’®«ìª® ®¤¨­ ¨§ ­¨å ¯ëâ «áï ®¡®à®­ïâìáï. Œ «ì稪, «¥â 15-â¨, ­¥ ¡®«ìè¥... ¯®¤­ï«  ¢â®¬ â ­  „¨¬ã. €¢â®¬ â ¡ë« ­  ¯à¥¤®åà ­¨â¥«¥, ¨ ¯®ª  ¬ «ì稪 ¤¥« « ¯®¯ë⪨ ¯®­ïâì, ¯®ç¥¬ã ­¥ à ¡®â ¥â á¯ã᪮¢®© ªàî箪 - „¨¬  ¢ë­¥á ¥¬ã ¬®§£¨ ­  ¯à®â¨¢®¯®«®¦­ãî á⥭ªã. ë«® ¥é¥ ¯ïâì 祫®¢¥ª ¢ ¯®¤¢ «¥. ’ਠ¤¥¢ã誨 ¨ ¤¢®¥ ¬ã¦ç¨­. ‚á¥å § áâ५«¨«¨ ¡¥§ ®á®¡ëå ¯à®¡«¥¬. Œë ¯®§¢ «¨ ¤¥¢ã襪. ‹¥­  ¨ ‹¥à  ­ ç «¨ 㡨à âì âàã¯ë ¢ ®¤­ã ª®¬­ âã. Ž«ï ®áâ « áì 㠢室 , á ª « è®¬ ­ £®â®¢¥. ‚ᥠ®áâ «ì­ë¥ ®æ¥­¨¢ «¨ § ¯ áë ¯à®¢¨ ­â . Š®­á¥à¢ë. ‘ã娥 ¯ ª¥âë á « ¯è®©. Ÿé¨ª¨ á «¨¬®­ ¤®¬, ¬¨­¥à «ª . ’ãâ ¡ë«® ¯à¨£®¤­®© ¥¤ë ­  ¤¢  ¬¥áïæ , ¥á«¨ à ááç¨â뢠âì ­  è¥áâ¥àëå. ஡«¥¬  ¡ë«  ⮫쪮 ¢ ⮬, £¤¥ ¢á¥ íâ® á¯àïâ âì.
- «ïâì! - ‹¥à  ¯®¤áª®«ì§­ã« áì ¨ 㯠«  ­  âà㯠¬ «ì稪  á ¯à®áâ५¥­­®© ¡ èª®©.
- ’ ¬ ¬®§£¨ ­  ¯®«ã, âë ç¥ ­¥ ¢¨¤¥« ? - ‹¥­  ᬥ﫠áì...
- ’ë à ­ìè¥ ­¥ ¬®£«  ᪠§ âì? - ¨ ‹¥à  ⮦¥ à áᬥ﫠áì...
- ’ ª, ¯®¤à㣨 è ¡ è ¢¥á¥«ìî, ¡«ïâì, ¥á«¨ ¢ ¬ § ­ïâìáï ­¥ç¥¬ - ¯¨§¤ã©â¥ á, ï ¢ ¬ ᥩç á § £àã¦ã ï騪 ¬¨!!! - Ÿ ¡ë« ­¥ ¢ ­ áâ஥­¨¨ èãâ¨âì.
- ã ¨ á㪠 âë Œ ªá...
- „  ¯®è¥« ®­ ­  åã©! - ¯®¤¤¥à¦ «  ‹¥à ...
- ¥ ¯¨§¤¥âì! ‚ᥬ á ­ åã©!!!!
‹¥­  ᨤ¥«  ­   ¢â®¡ãá­®© ®áâ ­®¢ª¥ ­ ¯à®â¨¢ ¬®¥£® ¤®¬ . Ž­  â¨å® ¯« ª « , ®¡å¢ â¨¢ à㪠¬¨ £®«®¢ã. “¦¥ ­¥¤¥«î ï ­¨ç¥£® £®àï祣® ­¥ ¥«. ‡ ¯ áë ¯à®¤ãªâ®¢ ª®­ç¨«¨áì, 㫨æë ®¯ãá⥫¨. ˆ «¨èì ­¥¬­®£¨¥ ¯à®å®¦¨¥ è â «¨áì ¯® £®à®¤ã ª ª §®¬¡¨, á«®¢­® ­¨ç¥£® ¯¥à¥¤ ᮡ®© ­¥ ¢¨¤¥«¨. Ž­¨ 諨 ª à §¤ â®ç­ë¬ ¯ã­ªâ ¬. ® á«ãå ¬ - â ¬ 㦥 ­ ç «¨áì ¡¥á¯®à浪¨. ¥ª®â®àë¥ ¤®¬  £®à¥«¨.
Œ­¥ ­ ¤®¥«® 室¨âì, ¬­¥ ¡ë«® ®¤¨­®ª®. Ÿ ᥫ à冷¬ á ­¥©.
- Š ª ¤¥« ?
- Ÿ ­¥ ¬®£ã ­ ©â¨ á¢®î ¤®çì. - ‹¥­  £®¢®à¨«  ¢ ¯ãáâ®âã ¯¥à¥¤ ᮡ®©.
- Š ª ¥ñ §®¢ãâ? - ï ¯®¯ëâ «áï § ¯®«­¨âì íâã ¯ãáâ®âã.
- „ è .
- —â® âë ᮡ¨à ¥èìáï ¤¥« âì?
- Ÿ å®çã ã©â¨ ¢á«¥¤ §  ­¥©.. - ¥ñ á«®¢  ¯à¥à뢠«¨áì áâ®­ ¬¨ ¨ ¯« ç¥¬.
- ®è«¨ §  ¬­®©.
Œë ­¥¯«®å® ¯®¦¨¢¨«¨áì. ‚áî ¯à¨£®¤­ãî ¥¤ã 㭥᫨ á ᮡ®©. ¥áª®«ìª®  ¢â®¬ â®¢ ¨ ¡®¥¯à¨¯ á®¢. “¤ ç . Žâªã¤  ¢ £®à®¤¥ ®ª § «®áì á⮫쪮 ®à㦨ï? ®ç¥¬ã ⥯¥àì ¬ë ¡®¨¬áï ᮫­¥ç­®£® ᢥâ ? •®«¥à  ª®á¨â «î¤¥© ¨ ¦¨¢®â­ëå.   㫨æ å, ¢® ¤¢®à å ¢¨¤­ë âàã¯ë «î¤¥©, ¤¥â¥©... Ž­¨ ¯®ªãá ­ë ᮡ ª ¬¨. Ž­¨ à á¯à®áâà ­ïîâ ­¥¢ë­®á¨¬ãî ¢®­ì. ‹î¤¨ 㬨à îâ ¢­¥§ ¯­®. Žâ ¡®«¥§­¥©. ®â ¯ã«¨, ¢ë¯ã饭­®© ¢ ᯨ­ã. Žâ ­®¦ , ª®â®àë© ª®£¤  ⮠१ « áëà,   ⥯¥àì ०¥â 祫®¢¥ç¥áªãî ¯«®âì. ƒ®á¯®¤ì § ¤ã¬ « £«®¡ «ì­ãî ç¨áâªã. â® ­¥  à¬ £¥¤¤®­. ‚릨¢è¨¥ ¨ ãá⠢訥. ‹î¤¨, ¯®å®¦¨¥ ¡®«ìè¥ ­  §¢¥à¥©. —¥«®¢¥ç¥á⢮ ¢ í⮬ £®à®¤¥ ¯¥à¥áâ «® áãé¥á⢮¢ âì. ‚ë¡à âìáï ¨§ ­¥£® ­¥à¥ «­® - â¥, ªâ® ¯ëâ «áï § ¬¥à§«¨ ¢ ¤®à®£¥. ˆ«¨ ¡ë«¨ 㡨âë. …¤¨­á⢥­­ë© ¢ë室 - 㡨¢ âì, £à ¡¨âì, ¢ë¦¨¢ âì. „¥à¦ âìáï £à㯯 ¬¨. „®¢¥àïâì «î¤ï¬, ª®â®àë¥ à冷¬, ­® ⮫쪮 ª®£¤  âë ®á®§­ ¥èì, çâ® ®­¨ ­ã¦¤ îâáï ¢ ⥡¥. ’®â, ªâ® ­¥ ­ã¦¥­ - ¡ã¤¥â 㡨â. ¥¤¥«î ­ § ¤, ­ è ⮢ à¨éì, ¬®© ¤à㣠¤¥âá⢠, ‚®¢ ... ®­ § ¡®«¥« 宫¥à®©. Š ª ⮫쪮 ¬ë íâ® ¯®­ï«¨ - ¬ë á¢ï§ «¨ ¥ã à㪨 ¨ ­®£¨, ®â­¥á«¨ ­  ®¡®ç¨­ã, ¨ ï ¯ãá⨫ ¥¬ã ¯ã«î ¢ «®¡.
Ž­  ¢á¯®¬¨­ «  ¤­¨, ª®£¤  §¢¥§¤ ­¥ ¡ë«® ¢¨¤­®. € §¢¥§¤ë ®âà ¦ «¨áì ¢ ¥ñ £« § å. Œë ¢á¥ ¡ë«¨ ¤à㣨¬¨. ’¥¯¥àì ï ¢¨¦ã çâ® ®­  áç á⫨¢ . Ž­  ¯®â¥àï«  ॡ¥­ª . Ž­  㡨¢ « , ¡ë«  ᢨ¤¥â¥«¥¬ ⮣®, ª ª 㡨¢ «¨ ¥ñ ¤àã§¥©. Ž­  ᬨਫ áì á ⥬, ç⮠㦥 ­¨ª®£¤  ­¥ ¡ã¤¥â ¢ ¥ñ ¦¨§­¨ ⥯«®£® ¤ãè , ª®ä¥, £®àï祩 ¬ ¬¨­®© ¯®å«¥¡ª¨. ‹¥­ . ˆ ï å®çã à §¤¥«¨âì ⢮¥ áç áâì¥. ’ë ¯®§¢®«ï¥èì ¬­¥ â¥¡ï ®¡­ïâì. ’ë 㦥 ­¥ ¤ã¬ ¥èì ® ¦¥á⮪®á⨠¦¨§­¨, § áâ ¢¨¢è¥© ¨¤â¨ â¥¡ï ­  ¯ ­¥«ì. ’ë ¤®¢®«ì­ . ’¢®ï ¬¥áâì ᢥà訫 áì. ’®à¦¥á⢮ ¡ëâ¨ï á⮨«® ¯®â¥à¨ ¤¥¢®çª¨, ª®â®àãî âë «î¡¨« . ’¥¯¥àì ¬ë á« ¢¨¬ ¡®£  §  â®, çâ® ®­ ¤ « ­ ¬ íâ®â ¬®¬¥­â áç áâìï. ’¥¯¥àì ¬ë ¢¥à¨¬ ¢ ­¥£®. ’¥¯¥àì ¬ë ­¥ áãé¥áâ¢ã¥¬. Œë ¦¨¢¥¬. Œë ¢á¥ ¯®â¥à﫨 ¤¥¢á⢥­­®áâì. Œë ¯®«ã稫¨ ®¯ëâ.  á ¨§­®á¨«®¢ « £®á¯®¤ì ¡®£! ® ¯®ç¥¬ã ¦¥ ¬ë ᥩç á â ª áç á⫨¢ë????
+184
View File
@@ -0,0 +1,184 @@
— ª €‹€ˆŠ
Šˆ˜Šˆ
‚¤®å­¨â¥.
 ¡¥à¨â¥ ª ª ¬®¦­® ¡®«ìè¥ ¢®§¤ãå .
â  ¨áâ®à¨ï § ­¨¬ ¥â ஢­® á⮫쪮 ¢à¥¬¥­¨, ­ áª®«ìª® ¢ë ¬®¦¥â¥ § ¤¥à¦ âì ¤ëå ­¨¥, ¨ ¥é¥ çãâì-çãâì. ’ ª çâ® á«ã蠩⥠ª ª ¬®¦­® ᪮॥.
ޤ¨­ ¬®© ¤àã£, ª®£¤  ¥¬ã ¡ë«® 13 «¥â, ãá«ëè « ® ¯¥££¨­£¥ . ¥££¨­£ íâ® ¯ à­ï âà å îâ ¢ § ¤­¨æã ¨áªãá⢥­­ë¬ ç«¥­®¬. ® á«ãå ¬, ¥á«¨ á⨬㫨஢ âì ¯à®áâ âã ¤®áâ â®ç­® ᨫ쭮, ¬®¦­® ¤®¡¨âìáï ¬­®¦¥á⢠ ïàª¨å ®à£ §¬®¢ ¡¥§ ¯®¬®é¨ àãª. ‚ ¢®§à á⥠13 «¥â íâ®â ¤à㣠¡ë« ¬ «¥­ìª¨¬ ᥪáã «ì­ë¬ ¬ ­ì类¬. Ž­ ¢¥ç­® ­®¢ë¥ ¯ã⨠¯®«ã祭¨ï ®ç¥à¥¤­®£® ®à£ §¬ . Ž­ ¨¤¥â ¢ á㯥ଠથâ, çâ®¡ë ªã¯¨âì ¬®àª®¢ì ¨ ¢ §¥«¨­. —â®¡ë ¯à®¢¥á⨠­¥¡®«ì讥 ­¥§ ¢¨á¨¬®¥ à áá«¥¤®¢ ­¨¥. ’®£¤  ®­ ¢¤à㣠¯à¥¤áâ ¢«ï¥â ᥡ¥, ª ª ¢á¥ íâ® ¡ã¤¥â ¢ë£«ï¤¥âì ã ª ááë ¢ á㯥ଠથâ¥, ®¤¨­®ª ï ¬®àª®¢ì ¨ ¡ ­®çª  ¢ §¥«¨­  ­  ¯®¤¢¨¦­®© «¥­â¥ ª ááë. ˆ ¢á¥ ᬮâàïâ. ‚ᥠ¯®­¨¬ îâ, çâ® ¯ à¥­ì à¥è¨« ¯®¤ à¨âì ᥡ¥ § ¬¥ç â¥«ì­ë© ¢¥ç¥à.
ˆâ ª, ¬®© ¤à㣠¯®ªã¯ ¥â ¬®«®ª® ¨ ï©æ  ¨ á å à ¨ ¬®àª®¢ì, ¢á¥ ¨­£à¥¤¨¥­âë ¤«ï ¬®àª®¢­®£® ¯¨à®£ . ˆ ¢ §¥«¨­.
Š ª ¡ã¤â® ¤®¬  ®­ ᮡࠫáï § áã­ãâì ᥡ¥ ¢ § ¤­¨æã ¬®àª®¢­ë© ¯¨à®£.
„®¬  ®­ ¢ë१ ¥â £àã¡®¢ âë© ¬®àª®¢­ë© ç«¥­. Ž­ ®¡¬ §ë¢ ¥â ¥£® ¢ §¥«¨­®¬ ¨ ãá¥à¤­® § á®¢ë¢ ¥â ¥£® ᥡ¥ ¢ § ¤­¨æã. ¨ç¥£® ­¥ ¯à®¨á室¨â. ¨ª ª®£® ®à£ §¬ . ¨ç¥£® ­¥ ¯à®¨á室¨â ªà®¬¥ ⮣®, çâ® § ¤­¨æ  ¡®«¨â.
’ãâ ¥£® ¬ âì §®¢¥â ¥£® 㦨­ âì. ˆ¤¨ á, ¯®à  ¥áâì, £®¢®à¨â ®­ .
Ž­ ¢ëâ áª¨¢ ¥â ¬®àª®¢ì ¨§ § ¤­¨æë ¨ ¯àïç¥â ᪮«ì§ªãî, £àï§­ãî ¬®àª®¢ì ¯®¤ ªà®¢ âìî á।¨ £àï§­®£® ¡¥«ìï.
®ã¦¨­ ¢, ®­ ¨¤¥â §  ¬®àª®¢ìî, ­® ¥¥ â ¬ ­¥â. ®ª  ®­ 㦨­ «, ¬ âì § ¡à «  ¥£® £àï§­®¥ ¡¥«ì¥, çâ®¡ë ¯®áâ¨à âì. Ž­  ­¥ ¬®£«  ­¥ § ¬¥â¨âì ¬®àª®¢ì, âé â¥«ì­® ®áâà㣠­­ãî ªãå®­­ë¬ ­®¦®¬, ¡¥«áâïéãî ®â ᬠ§ª¨, ¢®­îçãî.
‘«¥¤ãî騥 ¬¥áïæë íâ®â ¬®© ¤à㣠¦¨¢¥â ª ª ¯®¤ ç¥à­®© âã祩. Ž­ ®¦¨¤ ¥â ¢ëïá­¥­¨ï ®â­®è¥­¨©. ® í⮣® ­¥ ¯à®¨á室¨â. ¨ª®£¤ . „ ¦¥ ª®£¤  ®­ ¢ëà®á, íâ  ¬®àª®¢ì ­¥§à¨¬® ­ ¢¨á «  ­ ¤ ª ¦¤ë¬ ஦¤¥­á⢥­áª¨¬ 㦨­®¬, ­ ¤ ª ¦¤ë¬ ᥬ¥©­ë¬ ¯à §¤­¨ª®¬. Š ¦¤ ï ¯ áå , ª®£¤  ¥£® ᮡá⢥­­ë¥ ¤¥â¨, ¢­ãª¨ ¥£® த¨â¥«¥©, ¨éãâ á¯àïâ ­­ë¥ ¯ áå «ì­ë¥ ï©æ , íâ  ¬®àª®¢ì ­ ¢¨á ¥â ­¤ ­¨¬¨ ¢á¥¬¨.
‘«¨èª®¬ ®â¢à â¨â¥«ì­®, çâ®¡ë ¨¬¥âì ­ §¢ ­¨¥.
“ äà ­æã§®¢ ¥áâì ¢ëà ¦¥­¨¥: íä䥪⠫¥áâ­¨æë . ®-äà ­æã§áª¨ Esprit d Escalier, íá¯à¨ ¤ í᪠«ì¥. Ž­® ®â­®á¨âáï ª ¬®¬¥­âã, ª®£¤  âë ­ å®¤¨èì ¯à ¢¨«ì­ë© ®â¢¥â, ­® 㦥 ¯®§¤­®.  ¯à¨¬¥à, ­  ¢¥ç¥à¨­ª¥ â¥¡ï ªâ®-â® ®áª®à¡«ï¥â. ’ë ¤®«¦¥­ ª ª-â® ®â¢¥â¨âì. Š®£¤  ­  â¥¡ï ¢á¥ á¬®âà¨â, ª®£¤  ­  ⥡ï íâ® ¤ ¢¨â, âë £®¢®à¨èì çâ®-â® ­¥ã¡¥¤¨â¥«ì­®¥. ® ¢¥¤ì ¯®â®¬ âë ã室¨èì á ¢¥ç¥à¨­ª¨.
ˆ ¨¬¥­­® ¢ â®â ¬®¬¥­â, ª®£¤  ­ ç¨­ ¥èì á¯ã᪠âìáï ¯® «¥áâ­¨æ¥ ¢¤à㣠®, ç㤮. ’¥¡¥ ¯à¨å®¤¨â ¢ £®«®¢ã ¨¤¥ «ì­ë© ®â¢¥â. ˆ íâ® ®ª®­ç â¥«ì­®¥ ã­¨¦¥­¨¥.
‚®â çâ® â ª®¥ íä䥪⠫¥áâ­¨æë
஡«¥¬  ¢ ⮬, çâ® ¤ ¦¥ ã äà ­æã§®¢ ­¥â ­ §¢ ­¨© ¤«ï ­¥ª®â®àëå £«ã¯®á⥩, ª®â®àë¥ ¬ë ¤¥« ¥¬ ¯®¤ ¢«¨ï­¨¥¬ ¬®¬¥­â . ‚ᥠí⨠­ è¨ £«ã¯ë¥, ®âç ï­­ë¥ ¤¥©áâ¢¨ï ¨ ¯®áâ㯪¨.
¥ª®â®àë¥ ¯®áâ㯪¨ ᫨誮¬ ­¨§ª¨, çâ®¡ë ¨¬¥âì ­ §¢ ­¨¥. ‘«¨¦ª®¬ ­¨§ª¨, çâ®¡ë ¨å ®¡á㦤 âì.
‘¥©ç á ¬­®£¨¥ ¤¥â᪨¥ ¯á¨å®«®£¨ ¨ ¯¥¤ £®£¨ £®¢®àïâ, ¡®«ìè ï ç áâì ¯®¤à®á⪮¢ëå á ¬®ã¡¨©á⢠¯à®¨á室¨â ¢ १ã«ìâ â¥ ®­ ­¨§¬ , ª®£¤  ¯®¤à®á⮪ ¯à¨¤ã訢 ¥â á¥¡ï ¤«ï ®áâà®âë ®éã饭¨©. à¨å®¤ïâ த¨â¥«¨ ¨ ­ å®¤ïâ ॡ¥­ª  ¢ á⥭­®¬ èª ä¥ ¢ ᢮¥© ᯠ«ì­¥ á ¯®«®â¥­æ¥¬, ¯à¨¢ï§ ­­ë¬ ª ¯¥à¥ª« ¤¨­¥ ¤«ï ¢¥è «®ª. Œ¥à⢮£®. ‘ ¬¥à⢮© ᯥମ© ¯®¢áî¤ã. Š®­¥ç­®, த¨â¥«¨ ¯à¨¡¨à îâáï.  ¤¥¢ îâ ­  âà㯠èâ ­ë. ‘â à îâáï ᤥ« âì â ª, ç⮡ë íâ® ¢ë£«ï¤¥«® «ãçè¥. ‘â à îâáï, ¯® ªà ©­¥© ¬¥à¥. Ž¡ëç­®¥ ­¥áç áâ­®¥ ¯®¤à®á⪮¢®¥ á ¬®ã¡¨©á⢮.
„à㣮© ¬®© 誮«ì­ë© ¤àã£, ã ­¥£® ¡à â á«ã¦¨« ¢ ¢®¥­­®¬ ä«®â¥, íâ®â ¡à â à á᪠§ «, çâ® ¯ à­¨ ­  «¨¦­¥¬ ‚®á⮪¥ § ­¨¬ îâáï ®­ ­¨§¬®¬ ᮢᥬ ­¥ â ª, ª ª ¬ë. à â á«ã¦¨« ¢ ª ª®©-â® ¢¥à¡«î¦ì¥© áâà ­¥, £¤¥ ­  àë­ª å ¯à®¤ ¢ «®áì ­¥çâ®, ¯®å®¦¥¥ ­  ¯à¨ç㤫¨¢ë© ­®¦ ¤«ï ®âªà뢠­¨ï ¯¨á¥¬. ’®­ª¨© áâ¥à¦¥­ì ¨§ ¡à®­§ë ¨«¨ á¥à¥¡à , ¤«¨­®© ¯à¨¬¥à­® á « ¤®­ì á è à¨ª®¬ ­  ª®­æ¥ ¨ ªà á¨¢®© १­®© à㪮ï⪮©, ª ª ã ª¨­¦ « . â®â ¡à â-¬®àïª à á᪠§ «, ª ª ¯®á«¥ ⮣®, ª ª ç«¥­ ¢áâ ­¥â,  à ¡ë ¢â몠îâ íâ®â áâ¥à¦¥­ì ᥡ¥ ¢ ç«¥­ ­  ¢áî ¤«¨­ã. ®â®¬ ®­¨ ¤à®ç â, ¯®ª  áâ¥à¦¥­ì ¢­ãâà¨, ¨ ®â í⮣® «¤ãçè¥ ª®­ç îâ. ‘¨«ì­¥¥.
€ ¥é¥ íâ®â ¡à â ¥§¤¨â ¯® ¢á¥¬ã ¬¨àã, ¨ ¯à¨áë« ¥â äà ­æã§áª¨¥ äà §ë. ãá᪨¥ äà §ë. ®«¥§­ë¥ ¯®¤áª §ª¨.
®á«¥ í⮣® ¢ ®¤¨­ ¯à¥ªà á­ë© ¤¥­ì ¬®© ¤à㣠­¥ ¯à¨å®¤¨â ¢ 誮«ã. ‚¥ç¥à®¬ ®­ §¢®­¨â ¨ ¯à®á¨â ¬¥­ï ¯®«ãç âì ¥£® ¤®¬ è­¨¨ à ¡®âë, ¯ àã ­¥¤¥«ì. ®â®¬ã çâ® ®­ ¢ ¡®«ì­¨æ¥.
Ž­ ¢ ®¤­®© ª®¬­ â¥ á® áâ à¨ª ¬¨, ª®â®àë¬ à¥¦ãâ ª¨èª¨. Ž­ à á᪠§ë¢ ¥â, çâ® ¢ ¯ « â¥ ⮫쪮 ®¤¨­ ⥫¥¢¨§®à. —â® ¥£® «¨ç­®¥ ¯à®áâà ­á⢮ ®£®à®¦¥­® ¢á¥£® «¨èì § ­ ¢¥áª®©. —⮠த¨â¥«¨ ª ­¥¬ã ­¥ ¯à¨å®¤ïâ. ® ⥫¥ä®­ã ®­ à á᪠§ë¢ ¥â, ç⮠த¨â¥«¨ £®â®¢ë 㡨âì áâ à襣® ¡à â , ª®â®àë© á«ã¦¨â ¢ ¢®¥­­®¬ ä«®â¥.
® ⥫¥ä®­ã íâ®â ¯ æ ­ ¬­¥ à á᪠§ë¢ ¥â, çâ® ­ ª ­ã­¥ ®­ «¨èì ­¥¬­®£® ¢ë¯¨«. —â® ¢ «ï«áï ­  ªà®¢ â¨ ¢ ᢮¥© ª®¬­ â¥. —â® ®­ § ¦¥£ ᢥçªã ¨ «¥­¨¢® ¯à®á¬ âਢ « áâ àë¥ ¯®à­®¦ãà­ «ë, ᮡ¨à ïáì ¯®¤à®ç¨âì. â® ¯®á«¥ ⮣®, ª ª ®­ ¯à®ç¨â « ¯¨á쬮 ¡à â . ‘ ⥬ ¯®«¥§­ë¬ á¯®á®¡ë¬ ¯à¨¥¬®¬ ®­ ­¨§¬ .  æ ­ ®£«ï¤ë¢ ¥âáï ¢ ¯®¨áª å 祣®-­¨¡ã¤ì, çâ® ¬®¦­® ¨á¯®«ì§®¢ âì ¤«ï í⮩ 楫¨. ˜ à¨ª®¢ ï àã窠 ᫨誮¬ ⮫áâ ï. Š à ­¤ è ⮦¥ ᫨誮¬ ⮫áâë© ª ⮬㠦¥ £àã¡ë©.   ᢥ窥 ¯®â¥ª ¢®áª  â®­ª¨©, £« ¤¨© áâ¥à¦¥­ì ¨§ ¢®áª , ª®â®àë© ¢¯®«­¥ ¬®£ ¡ë ¯®¤®©â¨.  æ ­ ­®£â¥¬ ®âª®¢ëਢ ¥â ¤«¨­­ë© â®­ª¨© á⮫¡¨ª ¢®áª ¨ âà¥â ¬¥¦¤ã « ¤®­ï¬¨. „«¨­­ë© ¨ â®­ª¨© ¨ £« ¤ª¨©.
ìï­ë© ¨ ¢®§¡ã¦¤¥­­ë©, ®­ ¢áâ ¢«ï¥â ¢®áª®¢ë© áâ¥à¦¥­ì ᥡ¥ ¢ ¯¥à¥æ, ¢á¥ £«ã¡¦¥ ¨ £«ã¡¦¥ ¢ ª ­ «. — áâì áâ¥à¦­ï ®áâ ¥âáï â®àç âì á­ à㦨, ¨ ®­ ­ ç¨­ ¥â.
„ ¦¥ ᥩç á ®­ £®¢®à¨â, çâ®  à ¡ë ç¥à⮢᪨ ã¬­ë¥ à¥¡ïâ . Ž­¨ ¯à¨¤ã¬ «¨ ᮢᥬ ¤à㣮© ®­ ­¨§¬.  à¥­ì «¥¦¨â ­  ᯨ­¥, ¨ ¢á¥ ¯®«ãç ¥âáï â ª ªàãâ®, çâ® ®­ § ¡ë¢ ¥â ¯à® ¢®áª. …¬ã ®áâ ¥âáï ¤¥à­ãâì ¢á¥£® ®¤¨­ à §, çâ®¡ë ª®­ç¨âì, ª®£¤  ®ª §ë¢ ¥âáï, çâ® ¢®áª ¡®«ìè¥ ­¥ â®àç¨â ­ àã¦ã.
â®â â®­ª¨© ¢®áª®¢ë© á¥à¦¥­ì, ®­ ¯à®¢ «¨«áï ¢­ãâàì. ‘®¢á¥¬ ¢­ãâàì, ¤® ª®­æ . ’ ª £«ã¡®ª®, çâ® ®­ ­¥ ¬®¦¥â ¥£® ­ é㯠âì ¤ ¦¥ ¢ á ¬®¬ ­ ç «¥ ª ­ « .
ˆ§ ªãå­¨ ¬ âì §®¢¥â ¥£® 㦨­ âì. ˆ¤¨ á, ᥩç á ¦¥ £®¢®à¨â ®­ . â®â ¯ à¥­ì á ¢®áª®¬ ¨ ¯ à¥­ì á ¬®àª®¢ìî ᮢᥬ ­¥ ¯®å®¦¨ ¤à㣠­  ¤à㣠, ­® ¬ë ¢á¥ ¦¨¢¥¬ ¯à¨¬¥à­® ®¤¨­ ª®¢®.
ˆ ¯®á«¥ 㦨­  ã ¯ à­ï ­ ç¨­ ¥â ¡®«¥âì ¦¨¢®â. â® ¢®áª, ¨ ®­ à¥è ¥â, çâ® ¢®áª ¢á¥ à ¢­® à á⠥⠨ ¢ë©¤¥â ¢¬¥áâ¥ á ¬®ç®©. ’¥¯¥àì ã ­¥£® ¡®«¨â ¥é¥ ¨ ᯨ­ . ®«ïâ ¯®çª¨. Ž­ ­¥ ¬®¦¥â à á¯àﬨâìáï.
‚ᥠíâ® ®­ à á᪠§ë¢ ¥â ¯® ⥫¥ä®­ã á ¡®«ì­¨ç­®© ª®©ª¨, ¢¤ «¥ª¥ á«ëè¨âáï §¢ãª £®­£  ¨ ॢ ⮫¯ë. ‘¯®à⨢­ë© ¬ âç.
¥­â£¥­ ¯®ª §ë¢ ¥â ¯à ¢¤ã, çâ®-â® â®­ª®¥ ¨ ¤«¨­­®¥, ᮣ­ã⮥ ¢¤¢®¥ ¢ ¥£® ¬®ç¥¢®¬ ¯ã§ëà¥. â  ¤«¨­­ ï, â®­ª ï ¡ãª¢  V ᮡ¨à ¥â ­  ᥡ¥ ¢á¥ ¬¨­¥à «ë ¨§ ¥£® ¬®ç¨. Ž­  áâ ­®¢¨âáï â®«é¥ ¨ £àã¡¥¥, ¯®ªà뢠¥âáï ªà¨áâ «« ¬¨ ª «ìæ¨ï, ¡®«â ¥âáï â㤠-á, æ à ¯ ï ­¥¦­ãî ®¡®«®çªã ¬®ç¥¢®£® ¯ã§ëàï, ­¥ ¤ ¢ ï ¬®ç¥ ¢ë©â¨ ­ àã¦ã. …£® ¯®çª¨ ¯¥à¥£à㦥­ë. ’® ­¥¬­®£®¥, çâ® ¢ë⥪ ¥â ¨§ ¥£® ç«¥­  ªà á­®¥ ®â ªà®¢¨.
‘⮨⠯ à¥­ì ï ¥£® ᥬìï, ¨ ᬮâàïâ ­  ç¥à­®-¡¥«ë© á­¨¬®ª, à冷¬ ¤®ªâ®à ¨ ¬¥¤á¥áâàë, ¨ ¡ãª¢  V á¨ï¥â ¡¥«ë¬ ᢥ⮬ ã ¢á¥å ­  ¢¨¤ã, ¨ ¥¬ã ¯à¨å®¤¨âáï ᪠§ âì ¯à ¢¤ã. Ž â®¬, ª ª ª®­ç îâ  à ¡ë. Ž ç¥¬ ¥¬ã ­ ¯¨á « áâ à訩 ¡à â, ª®â®àë© á«ã¦¨â ­  ¢®¥­­®¬ ä«®â¥.
àאַ ᥩç á, ¯® ⥫¥ä®­ã, ®­ ­ ç¨­ ¥â ¯« ª âì.
®¤¨â¥«¨ § ¯« â¨«¨ §  ®¯¥à æ¨î ¤¥­ì£ ¬¨, ®â«®¦¥­­ë¬¨ ­  ¥£® ®¡à §®¢ ­¨¥ ¢ ª®««¥¤¦¥. ޤ­  £«ã¯®áâì, ¨ ®­ 㦥 ­¨ª®£¤  ­¥ áâ ­¥â îà¨á⮬.
‚¥é¨ ¢­ãâਠ⥡ï. ’ë ¢­ãâਠ¢¥é¥©. ‘¢¥çª  ¢ ç«¥­¥ ¨«¨ â¢®ï £®«®¢  ¢ ¯¥â«¥ ¬ë §­ «¨, çâ® ¢¥à­ë© ᯮᮡ ­ ¦¨âì ᥡ¥ £¥¬®àë.
Œ®¨ £¥¬®àë ­ ç «¨áì ¨§-§  ¦¥¬ç㦭®£® ­ëàï­¨ï , ª ª ï íâ® ­ §ë¢ « ï ¤à®ç¨« ¯®¤ ¢®¤®©, ­  ®¤­®¬ ¤ëå ­¨¨, á¨¤ï ­  ¤­¥ த¨â¥«ì᪮£® ¡ áᥩ­  ¢ á ¬®© £«ã¡®ª®© ¥£® ç áâ¨. ‚¤®å­ã¢ ¢®§¤ãå , ï ¡ëáâà® ­ëàï« ¨ áâ¢ « á ¥¡ï ¯« ¢ª¨. Ž¡ëç­® ï ᨤ¥« ­  ¤­¥ ¢ â¥ç¥­¨¥ ¤¢ãå, âà¥å, ç¥âëà¥å ¬¨­ãâ.
’®«ìª® ¨§-§  ᢮¥£® ®­ ­¨§¬  ï 㤨¢¨â¥«ì­ë¬ ®¡à §®¬ à §¢¨« ᯮᮡ­®á⨠᢮¨å «¥£ª¨å. …᫨ ï ®áâ ¢ «áï ®¤¨­, ª®£¤  ¢¥áì ¤®¬ ®áâ ¢ «áï ¢ ¬®¥¬ à á¯®à殮­¨¨, ï ®¡ëç­® § ­¨¬ «áï í⨬ ¢¥áì ¤¥­ì. ˆ ¯®á«¥ ⮣®, ª ª ï ¢ëª ç¨¢ « ¨§ ᥡï íâã èâãªã, ᯥà¬ã ®­  ¡®«â « áì ¢ ¢®¤¥ ¡®«ì訬¨ ¦¨à­ë¬¨, ¬®«®ç­®-¡¥«ë¬¨ ª®¬ª ¬¨.
®á«¥ í⮣® á­®¢  ¡ë«® ­ëàï­¨¥, ç⮡ë ᮡà âì í⨠ª®¬ª¨ ¨ ¢ëâ¥à¥âì ¨å ® ¯®«®â¥­æ¥. ®í⮬ã ï ¨ ­ §ë¢ « íâ® ¦¥¬çã¦­ë¬ ­ëàï­¨¥¬. „ ¦¥ å®âï ¢®¤  ¡ë«  å«®à¨à®¢ ­­ ï, ï ­¥ ¬®£ ­¥ ¡¥á¯®ª®¨âìáï ® á¥áâà¥. ˆ«¨, 㯠ᨠ¡®¦¥, ® ¬ ¬¥.
â® ¡ë« ¬®© á ¬ë© ¡®«ì让 ¢ ¦¨§­¨ áâà å: ¬®ï á¥áâà -¤¥¢âᢥ­­¨æ  ¤ã¬ ¥â çâ® ®­  ¯à®á⮠⮫á⥥â,   ¯®â®¬ ஦ ¥â ¤¢ã壮«®¢®£® ॡ¥­ª -®«¨£®ä७ . ˆ ®¡¥ £®«®¢ë ¢ë«¨âë© ï. Ÿ, ®â¥æ ¨ ®¤­®¢à¥¬¥­­® ¤ï¤ï.
® ®¡ëç­® á ⮡© á«ãç ¥âáï ᮢᥬ ­¥ â®, ® 祬 âë ¡¥á¯®ª®¨èìáï.
‹ãç訬 ¬®¬¥­â®¬ ¦¥¬ç㦭®£® ­ëàï­¨ï ¡ë«® ᫨¢­®¥ ®â¢¥àá⨥ ¡ áᥩ­  á 䨫ìâ஬ ¨ ­ á®á®¬ ¤«ï ®âª ç¨¢ ­¨ï ¢®¤ë. ‘ ¬ë© ª ©ä ¡ë« ¢ ⮬, ç⮡ë áâ é¨âì á ᥡï âàãáë ¨ á¥áâì ­  ­¥£®.
Š ª £®¢®àïâ äà ­æã§ë à §¢¥ å®âì ª®¬ã-â® ­¥ ­à ¢¨âáï, ª®£¤  ¥£® § ¤­¨æã ¢ë«¨§ë¢ îâ? ޤ­ ª® ¨­®£¤  âë ¯à®áâ® ®­ ­¨àãî騩 ¯®¤à®á⮪ ¨ ¢¤à㣠宯! ¨ ⥡¥ 㦥 ­¨ª®£¤  ­¥ áâ âì îà¨á⮬.
ޤ­ ¦¤ë ï ᨦ㠭  ¤­¥ ¡ áᥩ­ , ¨ ­ ¤® ¬­®© ¢®«­¨á⮥ ¢®¤ï­®¥ ­¥¡®, ¢®á¥¬ì äã⮢ ᢥ⫮-£®«ã¡®© ¢®¤ë ­ ¤ ¬®¥© £®«®¢®©. ‚ ¬¨à¥ æ à¨â â¨è¨­ , §  ¨áª«î祭¨¥¬ ¯ã«ìá  ¢ ¬®¨å ãè å. Œ®¨ ¦¥«âë¥ ¯®«®á âë¥ ¯« ¢ª¨ ®¡¬®â ­ë ¢®ªà㣠襨 ­  ¢á直© á«ãç ©: ¢¤ã࣠§ £«ï­¥â á®á¥¤, §­ ª®¬ë© ¨«¨, ­ ¯à¨¬¥à, 䨧àãª, ¦¥« î騩 ¯®¨­â¥à¥á®¢ âìáï ¯®ç¥¬ã ï ¯à®¯ãá⨫ äãâ¡®«ì­ãî â७¨à®¢ªã. ‘â ¡¨«ì­®¥ á®áã饥 â¥ç¥­¨¥ ᫨¢­®£® ®â¢¥àáâ¨ï « áª ¥â ¬®î ª®¦ã ¨ ï ¢¥àçã ᢮¥© ª®áâ«ï¢®© ¡«¥¤­®© § ¤­¨æ¥©, çâ®¡ë ¯®©¬ âì íâ® ®éã饭¨¥.
“ ¬¥­ï ¥é¥ ¤®áâ â®ç­® ¢®§¤ãå  ¢ «¥£ª¨å, ¨ à㪠 ᦨ¬ ¥â ç«¥­. ®¤¨â¥«¨ ­  à ¡®â¥,   á¥áâà  ­  § ­ïâ¨ïå ¡ «¥â­®© 誮«ë. „® ¯à¨å®¤  ¯à¥¤ª®¢ ®áâ ¥âáï ¥é¥ ­¥áª®«ìª® ç á®¢. Œ®ï à㪠 ¯à¨¡«¨¦ ¥â ¨ ¯à¨¡«¨¦ ¥â ®à£ §¬. Ÿ ®áâ ­ ¢«¨¢ îáì, ¢ë­¨à¨¢ î, çâ®¡ë ¢¤®å­ãâì ¢®§¤ãå , ¨ ­ëàïî ®¡à â­®, çâ®¡ë ¯à®¤®«¦¨âì.
Ÿ ¤¥« î íâ® á­®¢  ¨ á­®¢ .
‚®§¬®¦­®, ¯®í⮬㠤¥¢ã誨 â ª «î¡ïâ ᨤ¥âì ã â¥¡ï ­  «¨æ¥. Žéã饭¨¥ ¢á á뢠­¨ï ª ª ¬¨­¥â, ª®â®àë© ¨­ª®£¤  ­¥ ª®­ç ¥âáï. Š®£¤  ¬®© ç«¥­ á⮨â,   ¢®¤  ®¡«¨§ë¢ îâ ¬®î § ¤­¨æã, ¬­¥ ­¥ ­ã¦¥­ ¢®§¤ãå. ‘ ®£«ãè î騬 á¥à¤æ¥¡¨¥­¨¥¬ ¢ ãè å, ï ®áâ îáì ¯®¤ ¢®¤®© ¤® â¥å ¯®à, ¯®ª  ¯¥à¥¤ £« § ¬¨ ­¥ ¯®ï¢«ï¥âï ன ¬ «¥­ìª¨å ïàª¨å §¢¥§¤®ç¥ª. Ÿ ¢ë¯àשׂïî ­®£¨, ®¡à â­®© áâ®à®© ª®«¥­¥© ª á îáì ¡¥ââ®­®£® ¤­  ¡ áᥩ­ .  «ìæë ­  àãª å ¨ ­®£ å 㦥 ¯®á¨­¥«¨ ¨ ᬮà騫¨áì ®â ¤®«£®£® ¯à¥¡ë¢ ­¨ï ¢ ¢®¤¥.
ˆ âãâ ï ¯®§¢®«ïî í⮬ã á«ãç¨âìáï. ‚ ¢®¤¥ ¯®ï¢«ïîâáï ¡®«ì訥 ¡¥«ë¥ ª®¬ª¨. †¥¬ç㦨­ë.
’¥¯¥àì ¬­¥ ­ã¦¥­ ¢®§¤ãå. ® ª®£¤  ï ¯ëâ îáì ®â⮫ª­ãâìáï ®â ¤­ , ï ­¥ ¬®£ã. Ÿ ­¥ ¬®£ã ¯®¤®£­ãâì ¯®¤ á¥¡ï ­®£¨. Œ®ï § ¤­¨æ  § áâàï« .
‚à ç¨ ᪮ன ¯®¬®é¨ ¬®£ãâ à á᪠§ âì, çâ® ª ¦¤ë© £®¤ ®ª®«® 150 祫®¢¥ª § áâॢ ¥â ¯®¤®¡­ë¬ ®¡à §®¬, ¯à¨á®á ¢è¨áì ª ­ á®áã, ®âª ç¨¢ î饬㠢®¤ã ¨§ ¡ áᥩ­ . ˆ«¨ ­ á®á ­¥ ®â¯ã᪠¥â ¨å § ¤­¨æë ¨«¨ § â¢ ¥â ¨å ¤«¨­­ë¥ ¢®«®áë, ¨ ®­¨ § å«¥¡ë¢ îâáï. ®«ì設á⢮ íâ¨å á«ãç ¥¢ ¯à®¨á室¨â ¢ ”«®à¨¤¥.
¨ªâ® ®¡ í⮬ ­¥ £®¢®à¨â. „ ¦¥ äà ­æã§ë ­¥ £®¢®àïâ ® ­¥ª®â®àëå ¢¥é å.
ˆ§¢¥à­ã¢ ­®£¨, ¬­¥ 㤠¥âáï ᮣ­ãâì ¥¥ ¢ ª®«¥­¥ ¨ ®¯¥à¥âìáï ¢ ¤­®, ï ­ ¯®«®¢¨­ã ¢áâ î ¨ çã¢áâ¢ãî, ª ª çâ®-â® âﭥ⠬¥­ï §   ­ãá. ®¤áã­ã¢ ¯® á¥¡ï ¢â®àãî ­®£ã, ï ®ââ «ª¨¢ îáì ®â ¤­ . Ÿ ᢮¡®¤­® ¡®«â îáì ¨ «ï£ îáì ¢ ¢®¤¥, ­¥ § ¤¥¢ ï ¡¥â®­ , ­® ¨ ­¥ ¢á¯«ë¢ î.
à몠ïáì ¨§® ¢á¥å ᨫ, £à¥¡ï ®¡®¨¬¨ à㪠¬¨, ï ­  ¯®«¯ã⨠ª ¢®§¤ãåã, ­® ¡®«â îáì ­  ®¤­®¬ ¨ ⮬ ¦¥ ¬¥áâ¥. ‘â㪠á¥à¤æ  ¢ ãè å áâ ­®¢¨âáï £à®¬ç¥ ¨ ç é¥.
Ÿ ¨§¢®à ç¨¢ îáì ¨ ®£«ï¤ë¢ îáì, ᪢®§ì ¬¨à¨ ¤ë ïàª¨å §¢¥§¤®ç¥ª ¢ £« § å, ­® â® çâ® ï ¢¨¦ã, ­¥ ¯®¤¤ ¥âáï ¯®­¨¬ ­¨î. Š ª ï-⮠⮫áâ ï ¢¥à¥¢ª , ᨭ¥¢ â® ¡«¥¤­ ï, á ¯à®¦¨«ª ¬¨, âï­¥âáï ®â ᫨¢­®£® ®â¢¥àáâ¨ï ª ¬®¥© § ¤­¨æ¥ ¨ ­¥ ®â¯ã᪠¥â ¬¥­ï. ˆ§ ­¥ª®â®àëå ¯à®¦¨«®ª á®ç¨âáï ªà®¢ì,  « ï ªà®¢ì, ª®â®à ï ­  £«ã¡¨­¥ ª ¦¥âáï ç¥à­®©, ®­  áâà㪠¬¨ ¯®ï¢«ï¥âáï ¨§ ¬ «¥­ìª¨å à §à뢮¢ ¢ ¡«¥¤­®© ª®¦¥ í⮩ §¬¥¨. ⨠áâà㪨 ¯®á⥯¥­­® à áâ®àïîâáï ¢ ¢®¤¥;   ¢­ãâਠ§¬¥¨, ¯®¤ ¥¥ â®­ª®© ¡¥«¥á®© ª®¦¥©, ¢¨¤­¥îâáï ª®¬ª¨ ­ ¯®«®¢¨­ã ¯¥à¥¢ à¥­­®© ¥¤ë.
’®£¤  ï ­ ç¨­ î ¯®­¨¬ âì. Š ª®¥-â® ¦ã⪮¥ ¬®à᪮¥ ç㤮¢¨é¥, ¬®àáª ï §¬¥ï, ⢠àì, ­¨ à §ã ­¥ ¢¨¤¥¢è ï ᮫­¥ç­®£® ᢥâ , ¯àïâ « áì ¢ ª ­ «¨§ æ¨¨ ¨ ¯®¤¦¨¤ «  ¬®¬¥­â , çâ®¡ë ¢æ¥¯¨âìáï ¬­¥ ¢ § ¤­¨æã.
Ÿ ­ ç¨­ î «ï£ âì ¨ ¯¨­ âì íâã §¬¥î, ¥¥ ᪮«ì§ªãî १¨­®¢ãî ª®¦ã á í⨬¨ ¢¥­ ¬¨, ¨ ¬­¥ ª ¦¥âáï, çâ® ï á㬥« ¢ëâï­ãâì ¥¥ ¨§ ᫨¢­®£® ®â¢¥àáâ¨ï ¥é¥ ­¥¬­®£®. ’¥¯¥àì ®­  ¤«¨­®© ¯à¨¬¥à­® á ¬®î ­®£ã, ­® ¢á¥ à ¢­® ªà¥¯ª® ¤¥à¦¨âáï §  ¬®©  ­ãá. Ÿ ¯¨­ î ¥é¥, ¨ ¯®¤­¨¬ îáì ­  ¤î©¬, ­  ¤î©¬ ¡«¨¦¥ ª ¯®¢¥àå­®áâ¨. •®âï ï çã¢áâ¢ãî, çâ® §¬¥ï ¢á¥ ¥é¥ ¤¥à¦¨âáï §  ¬®î ¤ëàªã, ï ¥é¥ ­  ¤î©¬ ¡«¨¦¥ ª ᯠᥭ¨î.
‚­ãâਠ§¬¥¨ ¢¨¤­¥îâáï ªãá®çª¨ ªãªãàã§ë ¨ ®à¥å®¢. ‚¨¤­¥¥âáï ¯à®¤®«£®¢ â ï ®à ­¦¥¢ ï ª ¯áã« . â® ª ª®©-â® ¬ã«ì⨢¨â ¬¨­, ¨§ â¥å, çâ® ¤ ¥â ¬­¥ ¯ ¯ , ç⮡ë ï ­ ¡à « ¬ëè¥ç­ãî ¬ ááã. —⮡ë ï ¯®¯ « ¢ äãâ¡®«ì­ãî ª®¬ ­¤ã ¨ ¯®«ãç « ¤®¯®«­¨â¥«ì­ãî á⨯¥­¤¨î. Š ¯áã«  á ®¡®£ é¥­­ë¬ ¦¥«¥§®¬ ¨  ¬¨­®ª¨á«®â ¬¨.
Ÿ ¢¨¦ã íâã â ¡«¥âªã, ª®â®à ï ¤®«¦­  ᯠá⨠¬®î ¦¨§­ì.
â® ­¥ §¬¥ï. â® ¬®© ª¨è¥ç­¨ª, ¬®ï ¯àï¬ ï ª¨èª , ª®â®à ï ¢ë¢ «¨« áì ¨§ ¬¥­ï. ’®, çâ® ¢à ç¨ ­ §ë¢ î⠢믠¤¥­¨¥¬ ¯àאַ© ª¨èª¨ . Œ®¨ ª¨èª¨ § âï­ã«® ¢ ᫨¢­®¥ ®â¢¥àá⨥.
‚à ç¨ ᪮ன ¯®¬®é¨ ¬®£ãâ à á᪠§ âì ¢ ¬, çâ® ­ á®á ¤«ï ®âª çª¨ ¢®¤ë ¨§ ¡ áᥩ­  ¯à®¯ã᪠¥â ç¥à¥§ ᥡï 80 £ ««®­®¢ ¢®¤ë ¢ ¬¨­ãâã. —â® ¯® ¢¥áã à ¢­ï¥âáï 400 äã­â ¬. ®«ìè ï ¯à®¡«¥¬  ªà®¥âáï ¢ ⮬, çâ® ª®­æë ¢­ãâਠ­ á ᮥ¤¨­¥­ë, ¨ ⢮©  ­ãá íâ® ¤ «ì­¨© ª®­¥æ ⢮¥£® àâ . …᫨ ï ¯®§¢®«î, ¨ ­ á®á ¡ã¤¥â ¯à®¤®«¦ âì ®âª ç¨¢ âì ¢®¤ã ¢ëâ¢ âì ¨§ ¬¥­ï ¢­ãâ७­®á⨠®­ ¢ ª®­æ¥ ª®­æ®¢ § á®á¥â ¨ ¬®© ï§ëª. ।áâ ¢ì⥠ᥡ¥, çâ® ¢ë ¢ëáà «¨ ¨§ ᥡï 400 äã­â®¢, ¨ ¢ë ¯®©¬¥â¥, çâ® íâ® ¢á¥ à ¢­® çâ® â¥¡ï ¢ë¢¥à­ã«¨ ­ ¨§­ ­ªã.
Œ®£ã ¢ á ®¡à ¤®¢ âì ⥬, çâ® ª¨èª¨ ­¥ çã¢áâ¢ãîâ ¡®«¨. ® ªà ©­¥© ¬¥à¥ ­¥ â ª, ª ª ­ è  ª®¦ . ’®, çâ® ¬ë ¯¥à¥¢ à¨¢ ¥¬, ¢à ç¨ ­ §ë¢ îâ 䥪 «ì­ë¬¨ ¬ áá ¬¨. ‚ ¢¥àå­¥© ç á⨠ª¨èª¨ ï ¢¨¦ã ¦¨¤ªãî ¬ ááã, ¢ ª®â®à®© ¯« ¢ îâ §¥à­  ªãªãàã§ë,  à å¨§ ¨ ªà㣫ïè¨ §¥«¥­®£® £®à®èª .
ˆ ¢®â ¢®ªà㣠¬¥­ï ¯« ¢ ¥â ¢¥áì íâ®â á㯠¨§ ªà®¢¨ ¨ ªãªãàã§ë, ¤¥à쬠 ¨ ᯥà¬ë ¨  à å¨á . à¨ç¥¬ ¤ ¦¥ ª®£¤  ¨§ ¬¥­ï ¢ëâ¢ îâáï ¬®¨ ª¨èª¨, ¨ ï ¤¥à¦ãáì §  â®, çâ® ®áâ «®áì, ¤ ¦¥ ⮣¤  ¬®¥ £« ¢­®¥ ¦¥« ­¨¥ å®âì ª ª-­¨¡ã¤ì ­ âï­ãâì ¯« ¢ª¨.
¥ ¤ © ®£ ¯à¥¤ª¨ 㢨¤ïâ ¬®© ç«¥­.
ޤ­®© à㪮© ï ᦨ¬ î á¢®î ª¨èªã ¢ ªã« ª¥, ¤à㣮© ᤥࣨ¢ î ᢮¨ ¦¥«âë¥ ¯®«®á âë¥ ¯« ¢ª¨ á 襨. ® ­ âï­ãâì ¨å ¢á¥ à ¢­® ­¥¢®§¬®¦­®.
…᫨ ¢ë å®â¨â¥ §­ âì, ª ª ¢ è¨ ª¨èª¨ ¢ë£«ï¤ïâ ­  ®éã¯ì, ªã¯¨â¥ ¯à¥§¥à¢ â¨¢, ᤥ« ­­ë© ¨§ ¡ à ­ì¨å ª¨è®ª [1 - ‚ ‘˜€ ¯à®¤ îâáï ¯à¥§¥à¢ â¨¢ë, ᤥ« ­­ë¥ ¨§ ª¨è®ª ¦¨¢®â­ëå, å®âï ¨å ­ ¤¥¦­®áâì áç¨â ¥âáï £®à §¤® ­¨¦¥ ®¡ëç­ëå. (ਬ¥ç ­¨¥ ¯¥à¥¢®¤ç¨ª )]. ‚®§ì¬¨â¥ ¥£®, à áª â ©â¥.  ¯®«­¨â¥ ¥£®  à å¨á®¢ë¬ ¬ á«®¬. Ž¡¬ ¦ì⥠¥£® ¢ §¥«¨­®¬ ¨ ¯®â¨áª ©â¥ ¯®¤ ¢®¤®©. ®â®¬, ¯®¯ëâ ©â¥áì à §®à¢ âì ¥£®.  ¯®¯®« ¬. Ž­ ᫨誮¬ ¯à®ç­ë© ¨ í« áâ¨ç­ë©. Ž­ â ª®© ᪮«ì§ª¨©, çâ® §  ­¥£® ­¥¢®§¬®¦­® ª ª á«¥¤ã¥â ã墠â¨âìáï.
१¥à¢ â¨¢ ¨§ ¡ à ­ì¨å ª¨è®ª íâ® â®â ¦¥ áâ àë© ¤®¡àë© ª¨è¥ç­¨ª 祫®¢¥ª .
‚ë ¢¨¤¨â¥, ª 祬ã ï ¢¥¤ã.
‘⮨⠮â¯ãáâ¨âì ­  ᥪ㭤㠨 ã ¬¥­ï ¡®«ìè¥ ­¥â ª¨è®ª.
‘⮨⠯®¯«ëâì ­ ¢¥àå, ª ¢®§¤ãåã ¨ ã ¬¥­ï ¡®«ìè¥ ­¥â ª¨è®ª.
‘⮨⠮⪠§ âìáï ¯«ëâì ­ ¢¥àå ¨ ï ã⮯«¥­­¨ª.
â® ¢ë¡®à 㬥à¥âì ᥩç á ¨«¨ ­  ¬¨­ãâã ¯®§¦¥, 祬 ᥩç á.
Œ®¨ ¯à¥¤ª¨ ¢¥à­ãâáï á à ¡®âë ¨ ­ ©¤ãâ ¡®«ì让 £®«ë© í¬¡à¨®­, áªàî祭­ë© ¨ á¤ã¢è¨©áï. « ¢ î騩 ¢ ¬ãâ­®© ¢®¤¥ ¡ áᥩ­  ­  § ¤­¥¬ ¤¢®à¥. ‘த­¨¢è¨©áï á ¡ áᥩ­®¬ ç¥à¥§ ¯ã¯®¢¨­ã § ¯ãâ ­­ëå ª¨è®ª ¨ ¢¥­. ®«­ ï ¯à®â¨¢®¯®«®¦­®áâì ¯ à­î, á«ãç ©­® 㤠¢¨¢è¥¬ãáï ¢® ¢à¥¬ï ®­ ­¨§¬  ¢ á⥭­®¬ 誠äã. ˆ íâ® ¨å ॡ¥­®ª, ª®â®à®£® ®­¨ ¯à¨¢¥§«¨ ¨§ த¤®¬  13 «¥â ­ § ¤. ¥¡¥­®ª, ª®â®àë©, ª ª ®­¨ ­ ¤¥ï¤¨áì, ¤®«¦¥­ ¡ë« ¯®¯ áâì ¢ äãâ¡®«ì­ãî ª®¬ ­¤ã ¨ ¯®«ãç âì ¤®¯®«­¨â¥«ì­ãî á⨯¥­¤¨î ¨ ¯®«ãç¨âì á⥯¥­ì ¬ £¨áâà . ¥¡¥­®ª, ª®â®àë© § ¡®â¨«áï ¡ë ® ­¨å, ª®£¤  ®­¨ á®áâ àïâáï. ‚ᥠ¨å ­ ¤¥¦¤ë ¨ ¬¥çâë. ‚ ¡ áᥩ­¥, £®«ë© ¨ ¬¥àâ¢ë©. ˆ ¢®ªà㣠­¥£® ¡®«ì訥 ¬®«®ç­®-¡¥«ë¥ ª®¬ìï ᯥà¬ë.
Œ®¦¥â, â ª. € ¬®¦¥â, ¬®¨ ¯à¥¤ª¨ ­ ©¤ãâ ¬¥­ï, § ¢¥à­ã⮣® ¢ ®ªà®¢ ¢«¥­­®¥ ¯®«®â¥­æ¥, ᢠ«¨¢è¥£®áï ¡¥§ á®§­ ­¨ï ­  ¯ã⨠ª ⥫¥ä®­ã á ࢠ­ë¬¨ ®è¬¥âª ¬¨ ª¨è®ª, ¡®«â î騬¨áï ¨§-¯®¤ ¦¥«âëå ¯®«®á âëå ¯« ¢®ª.
’®, ® 祬 ­¥ £®¢®àïâ ¤ ¦¥ äà ­æã§ë.
‘â à訩 ¡à â ¢ ¢®¥­­®-¬®à᪮¬ 䫮⥠­ ã稫 ­ á ®¤­®© å®à®è¥© ¯®á«®¢¨æ¥. ãá᪮© ¯®á«®¢¨æ¥. ®á«®¢¨æ  ® ⮬, çâ® ¬ë,  ¬¥à¨ª ­æë, ­ §ë¢ ¥¬ íâ® ¬­¥ ­ã¦­®, ª ª ¤ëઠ ¢ £®«®¢¥ . ãá᪨¥ £®¢®àïâ: Œ­¥ íâ® ­ã¦­®, ª ª §ã¡ë ¢ § ¤­¨æ¥ .
Mnye etoh nadoh kahk zoobee v zadnetze. [2 - ãááª ï ¯®á«®¢¨æ  ¯¥à¥¤ ­  « â¨­¨æ¥© ¢ â®ç­®á⨠⠪, ª ª ¢ ®à¨£¨­ «¥. (ਬ¥ç ­¨¥ ¯¥à¥¢®¤ç¨ª )]
⨠¨áâ®à¨¨ ¯à® â®, ª ª ¯®¯ ¢è¨¥ ¢ ª ¯ª ­ §¢¥à¨ ®â£àë§ îâ ᥡ¥ ­®£ã. —â® ¦¥, «î¡®© ª®©®â à á᪠¦¥â ¢ ¬, çâ® ¯ à  ¬¨­ãâ ¡®«¨ ç¥à⮢᪨ ªàãç¥ á¬¥àâ¨.
—¥àâ, ¤ ¦¥ ¥á«¨ âë àãá᪨©, ¨­®£¤  ¬®¦¥â ­ áâ㯨âì ¬®¬¥­â, ª®£¤  âë § å®ç¥èì ¨¬¥âì §ã¡ë ¢ ⮬ á ¬®¬ ¬¥áâ¥.
€ ¥á«¨ ¨å ­¥â, ⥡¥ ¯à¨å®¤¨âáï ᤥ« âì ¢®â çâ® ¨§¢¥à­ãâìáï. ’ë æ¥¯«ï¥èì «®ªâ¥¬ á¥¡ï §  ª®«¥­ªã ¨ âï­¥èì á¢®î ­®£ã ª «¨æã. ’ë £àë§¥èì ¨ ªãá ¥èì ᮡá⢥­­ãî § ¤­¨æã. “ â¥¡ï ª®­ç¨«áï ¢®§¤ãå, ¨ âë ®â£àë§¥èì ¢á¥, ç⮠㣮¤­®, çâ®¡ë ¢¤®å­ãâì ¥£® ¥é¥ à §.
Ž¡ í⮬ ­¥ à §£®¢ à¨¢ îâ á ¤¥¢ã誮© ­  ¯¥à¢®¬ ᢨ¤ ­¨¨. ® ªà ©­¥© ¬¥à¥, ¥á«¨ ­  ¯à®é ­¨¥ âë ­ ¤¥¥èìáï ¥¥ ¯®æ¥«®¢ âì.
…᫨ ï ᪠¦ã ¢ ¬, ª ª®¢® íâ® ¡ë«® ­  ¢ªãá, ¢ë ¡ë ­¨ª®£¤  ¡®«ìè¥ ­¥ áâ «¨ ¡ë ¥áâì ª «ì¬ à®¢ ¨ ®á쬨­®£®¢, ­¨ª®£¤ .
’à㤭® ᪠§ âì, çâ® ¯®ª § «®áì ¬®¨ ¯à¥¤ª ¬ ¡®«¥¥ ®¬¥à§¨â¥«ì­ë¬ ª ª ï ¯®¯ « ¢ «®¢ãèªã ¨«¨ ª ª ï ¨§ ­¥¥ ¢ëࢠ«áï. Š®£¤  ¬¥­ï ¢ë¯¨á «¨ ¨§ ¡®«ì­¨æë, ¬ ¬  ᪠§ « : ‘ë­®ª, âë ­¥ §­ «, ç⮠⢮ਫ. ’ë ¡ë« ¢ 讪¥ . € ¯®â®¬ ®­  ­ ã稫 áì ¢ à¨âì ï©æ  ¡¥§ ᪮à«ã¯ë ï©æ® à §¡¨¢ ¥âáï ¢ ª¨¯ïéãî ᮫¥­ãî ¢®¤ã. [3 - ‚ à¥­®¥ ï©æ® ¡¥§ ᪮à«ã¯ë (poached egg, ¯®-àãá᪨ ï©æ®-¯ è®â ) ¨§¢¥áâ­® ¢ ¥¢à®¯¥©áª®© ªãå­¥, ­® ¯®ç⨠­¥¨§¢¥áâ­® ¢ àãá᪮© ªãå­¥, ¯®í⮬ã ï ªà âª® ãâ®ç­¨« ¢ ⥪áâ¥, çâ® íâ® â ª®¥. ‘®«¥­ ï ¢®¤  ¤®¢®¤¨âáï ¤® ª¨¯¥­¨ï ¨ à §¬¥è¨¢ ¥âáï â ª, çâ®¡ë ¯®«ã稫áï ¢®¤®¢®à®â. ’㤠 à §¡¨¢ ¥âáï ï©æ® (¬®¦­® ¤¢  ¨«¨ âà¨), ª ª ­  ᪮¢®à®¤ªã, ª®£¤  ¤¥« ¥âáï £« §ã­ìï. —¥à¥§ ¬¨­ãâã ¢®¤  ᫨¢ ¥âáï ç¥à¥§ á¨â®. ‚ १ã«ìâ â¥ ¯®«ãç ¥âï ®ç¥­ì ­¥¦­®¥, «¥£ª® ¯¥à¥¢ à¨¢ ¥¬®¥ ¡«î¤ . (ਬ¥ç ­¨¥ ¯¥à¥¢®¤ç¨ª )]
ˆ­â¥à¥á­®, ¢á¥ í⨠«î¤¨ ®­¨ ¬¥­ï ¦ «¥«¨ ¨«¨ ¨á¯ëâ뢠«¨ ®â¢à é¥­¨¥?
Ÿ å®çã íâ® §­ âì â ª ¦¥, ª ª ï å®çã ¨¬¥âì §ã¡ë ¢ ᢮¥© § ¤­¨æ¥.
‘¥©ç á «î¤¨ ¯®áâ®ï­­® £®¢®àïâ ¬­¥, çâ® ï ᫨誮¬ å㤮©. Š®£¤  ¬¥­ï ¯à¨£« è îâ ­  㦨­ ï ®âª §ë¢ îáì ¯à¨£®â®¢«¥­­®¥ ¨¬¨ ¦ àª®¥, ®­¨ 㤨¢«ïîâáï ¨ ­ ç¨­ îâ ­¥à¢­¨ç âì. † à¥­®¥ ¬ïá® ¬¥­ï 㡨¢ ¥â. ‡ ¯¥ç¥­­ ï ¢¥â稭 . ‹î¡ ï ¥¤ , ª®â®àãî ­¥«ì§ï ¯¥à¥¢ à¨âì §  ¯ àã ç á®¢, ¢ë室¨â ¨§ ¬¥­ï ª ª ¥¤ . ’ã襭 ï ä á®«ì, ªãá®çª¨ àë¡ë. Ÿ ¢áâ î á 㭨⠧  ¨ â ¬ ®­¨ ¢ «ïîâáï. Š ª ¡ë«¨.
®á«¥ à ¤¨ª «ì­®© ®¯¥à æ¨¨ ¯® 㪮à ç¨¢ ­¨î ª¨è¥ç­¨ª , ¯¥à¥¢ à¨¢ âì ¬ïá® áâ ­®¢¨âáï ­¥¬­®£® âà㤭®. “ ¡®«ì設á⢠ ¨§ ¢ á ¯ïâì äã⮢ ª¨è¥ç­¨ª . Ÿ áç á⫨¢ ¨¬¥âì ᢮¨ è¥áâì ¤î©¬®¢. ’ ª çâ® ï â ª ¨ ­¥ ¯®«ã稫 äãâ¡®«ì­ãî á⨯¥­¤¨î. ¨ª®£¤  ­¥ áâ « ¬ £¨áâ஬ ª ª¨å-«¨¡® ­ ãª. Ž¡  ¬®¨å ¤à㣠 ¯ æ ­ ᮠᢥ窮© ¨ ¯ æ ­ á ¬®àª®¢ìî ®­¨ ®¡  ¢ëà®á«¨, ¢ë諨 ¢ «î¤¨, ­® ï â ª ¨ ­¥ ¯à¨¡ ¢¨« ­¨ ®¤­®£® äã­â  á â¥å ¯®à, ª ª ¬­¥ ¨á¯®«­¨«®áì 13.
„àã£ ï ¯à®¡«¥¬  ¡ë«  ¢ ⮬, çâ® ¯à¥¤ª ¬ ¯à¨è«®áì ¢ë«®¦¨âì ®£à®¬­ë¥ ¤¥­ì£¨ §  â®â á ¬ë© ¡ áᥩ­. ‚ ª®­æ¥ ª®­æ®¢ ¯ ¯  ᪠§ « ¢®¤®¯à®¢®¤ç¨ªã, çâ® íâ® ¡ë«  ᮡ ª .  è  ᮡ ª  ᢠ«¨« áì ¢ ¡ áᥩ­ ¨ ãâ®­ã« . ’à㯠§ âï­ã«® ¢ ᫨¢­®¥ ®â¢¥àá⨥. „ ¦¥ ª®£¤  ¢®¤®¯à®¢®¤ç¨ª à §®¡à « ­ á®á ¨ ¢ë㤨« ¨§ ­¥£® ¡«¥¤­ãî १¨­®¯®¤®¡­ãî ª¨èªã, ¢®¤ï­¨áâë© ªã᮪ ª¨è¥ç­¨ª  á ¡®«ì让 ®à ­¦¥¢®© ¢¨â ¬¨­­®© â ¡«¥âª®© ¢­ãâà¨, ¤ ¦¥ ⮣¤  ¬®© ¯ ¯  ᪠§ « íâ  ç¥à⮢  ¡¥§¬®§£« ï ᮡ ª  .
„ ¦¥ ¨§ ®ª­  ᢮¥© ª®¬­ âë ï á«ëè «, ª ª ¯ ¯  ᪠§ «: âã ᮡ ªã ­¥«ì§ï ¡ë«® ®áâ ¢¨âì ¡¥§ ¯à¨á¬®âà  ­¨ ­  ᥪ㭤ã .
€ ¯®â®¬ ã á¥áâàë ¡ë«  § ¤¥à¦ª  ¬¥áïç­ëå.
„ ¦¥ ¯®á«¥ ⮣®, ª ª ¢ ¡ áᥩ­¥ ᬥ­¨«¨ ¢®¤ã, ¤ ¦¥ ¯®á«¥ ⮣®, ¬ë ¯à®¤ «¨ ¤®¬ ¨ ¯¥à¥¥å «¨, ¯®á«¥  ¡®àâ  á¥áâàë, ¤ ¦¥ ⮣¤  ¬®¨ ¯à¥¤ª¨ ­¨ à §ã í⮣® ­¥ 㯮¬¨­ «¨.
¨ª®£¤ . â® ­ è  ­¥¢¨¤¨¬ ï ¬®àª®¢ì.
€ ¢ë. ‚ë ¬®¦¥â¥ ⥯¥àì ᤥ« âì ¯®«­ë© ¢¤®å.
Ÿ ¨ ¤® á¨å ¯®à ­¥ ¬®£ã.
+102
View File
@@ -0,0 +1,102 @@
#!/bin/bash
# Making tests of BForce
CURDIR=$(pwd)
BFBIN=$(pwd)/../source/bin/bforce
function prepconfig() {
echo "Preparing configs with $1 as protocol..."
cp ${CURDIR}/configs/bforceA.conf ${CURDIR}/etc/bforceA.conf
sed -i -e "s/%PROTO%/$1/" ${CURDIR}/etc/bforceA.conf
sed -i -e "s#%TESTZONE%#${CURDIR}#" ${CURDIR}/etc/bforceA.conf
cp ${CURDIR}/configs/bforceB.conf ${CURDIR}/etc/bforceB.conf
sed -i -e "s/%PROTO%/$1/" ${CURDIR}/etc/bforceB.conf
sed -i -e "s#%TESTZONE%#${CURDIR}#" ${CURDIR}/etc/bforceB.conf
cp ${CURDIR}/configs/00010002.cut ${CURDIR}/outboundA/00010002.cut
cp ${CURDIR}/configs/00010001.cut ${CURDIR}/outboundB/00010001.cut
}
function testcomm() {
rm -rf ${CURDIR}/inboundA/*
rm -rf ${CURDIR}/inboundB/*
mkfifo ${CURDIR}/bforceAtoB
mkfifo ${CURDIR}/bforceBtoA
BFCFGA=${CURDIR}/etc/bforceA.conf
BFCFGB=${CURDIR}/etc/bforceB.conf
# Works for Linux
BFCONFIG=${BFCFGA}
BFCONFIG=${BFCFGA} ${BFBIN} -o 99:1/2 > ${CURDIR}/bforceAtoB < ${CURDIR}/bforceBtoA &
#
BFCONFIG=${BFCFGB}
BFCONFIG=${BFCFGB} ${BFBIN} -S"CONNECT 9600" auto < ${CURDIR}/bforceAtoB > ${CURDIR}/bforceBtoA
# For [Free]BSD it need to be replaced - pipes are bidirectional:
# ./ping <&1 | ./pong >&0
rm ${CURDIR}/{bforceAtoB,bforceBtoA}
## WE MUST CHECK THAT INBOUND ARE FULL!!! ##
FCNTA=$( find ${CURDIR}/inboundA -name *.pkt | wc -l )
FCNTB=$( find ${CURDIR}/inboundB -name *.pkt | wc -l )
DIFFA=$( diff ${CURDIR}/inboundA/*.pkt ${CURDIR}/configs/00010001.cut && echo $? )
DIFFB=$( diff ${CURDIR}/inboundB/*.pkt ${CURDIR}/configs/00010002.cut && echo $? )
if [[ "${DIFFA}" -eq "0" ]] && [[ "${FCNTA}" -eq "1" ]]
then
if [[ "${DIFFB}" -eq "0" ]] && [[ "${FCNTB}" -eq "1" ]]
then
echo "....Result: OK"
else
echo "....Failed DiffB"
fi
else
echo "....Failed DiffA"
fi
cat ${CURDIR}/logsA/bf-debug >> ${CURDIR}/debugA.log
cat ${CURDIR}/logsB/bf-debug >> ${CURDIR}/debugB.log
}
if [[ ! -d "${CURDIR}/inboundA" ]]
then
echo "All clear to begin"
else
echo "Dir exists!"
rm -rf {etc,inboundA,inboundB,inbound-unsecureA,inbound-unsecureB,logsA,logsB,outboundA,outboundB}
fi
mkdir -p "${CURDIR}"/{etc,inbound-unsecureA,inbound-unsecureB,inboundA,inboundB,logsA,logsB,outboundA,outboundB}
if [[ ! -f "${BFBIN}" ]]
then
# No executable to test!
echo "No executable to run! Aborting..."
else
# All doing here
echo "Bforce executable found"
prepconfig "ZMO"
echo -n "--> Running ZMO test..."
testcomm
prepconfig "ZAP"
echo -n "--> Running ZAP test..."
testcomm
prepconfig "HYD"
echo -n "--> Running Hydra test..."
testcomm
# TODO: make binkd test over netcat possibly
fi
rm -rf {etc,inboundA,inboundB,inbound-unsecureA,inbound-unsecureB,logsA,logsB,outboundA,outboundB}