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 then sending/receiving. Recode tables are compartible with HPT. New
config keywords: "Recode_file_in", "Recode_file_out", "Recode_intro_in" 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/ A: /All/
ugenkXX. Брать на http://sourceforge.net/projects/binkforce, ugenkXX. Брать на http://sourceforge.net/projects/binkforce,
или с cvs там же. или с cvs там же.
A: /AK/
Переехало оттуда в гит, но лучше искать в профильных эхах.
Q: Как подключать нодлисты с цифровыми расширениями? Маски в конфиге bforce не Q: Как подключать нодлисты с цифровыми расширениями? Маски в конфиге bforce не
задаются. задаются.
A: /MR/ A: /MR/
@@ -81,7 +83,7 @@ A: /KAS/
/GM/ /GM/
Это мое и лежит оно тyт Это мое и лежит оно тyт
http://btrieve.virtualave.net/files/bf0224-filebox.diff.rar http://btrieve.virtualave.net/files/bf0224-filebox.diff.rar
в моем патче, в отличие от пpедыдyщего, не все подpд имеют тип в моем патче, в отличие от пpедыдyщего, не все подpяд имеют тип
TYPE_FILEBOX. TYPE_FILEBOX.
мыло - это TYPE_NETMAIL, эхи - TYPE_ARCMAIL и т.д. мыло - это TYPE_NETMAIL, эхи - TYPE_ARCMAIL и т.д.
Это yдобно дл пpосмотpа статистики поинтy - что на него лежит. Это yдобно дл пpосмотpа статистики поинтy - что на него лежит.
@@ -223,6 +225,7 @@ MR = Maxi Rovnich, 2:5030/872
PVC = Peter V. Chernikoff, 2:5020/2091 PVC = Peter V. Chernikoff, 2:5020/2091
SNP = Serge N. Pokhodyaev, 2:5020/1838 SNP = Serge N. Pokhodyaev, 2:5020/1838
VS = Valery Shishkov, 2:5040/9 VS = Valery Shishkov, 2:5040/9
AK = Alexey Khromov, 2:5030/723
Исправления и добавления в виде пар вопрос/ответ будут с благодарностью приняты Исправления и добавления в виде пар вопрос/ответ будут с благодарностью приняты
в netmail. в netmail.
+26 -7
View File
@@ -1,10 +1,10 @@
В этом файле описывается процесс установки и настройки В этом файле описывается процесс установки и настройки
фидонет-совместимого мейлера bforce 0.22.8.ugenk1. фидонет-совместимого мейлера bforce 0.xx.
В данном документе приняты следующие обозначения: В данном документе приняты следующие обозначения:
<SRCDIR> - путь, куда вы распаковали тарболл с исходными <SRCDIR> - путь, куда вы распаковали тарболл с исходными
текстами bforce 0.22.8.ugenk1 (далее bforce) текстами bforce 0.xx (далее bforce)
Тарболл - файл с расширением tar.gz, или tar.bz2 Тарболл - файл с расширением tar.gz, или tar.bz2
@@ -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: Перейдите в директорию bforce/source:
cd <SRCDIR>/bforce-0.22.8.ugenk1/source cd <SRCDIR>/bforce/source
Для создания Makefile, который наиболее подходит к вашей Для создания Makefile, который наиболее подходит к вашей
системе, наберите: системе, наберите:
@@ -76,6 +76,11 @@ gmake install
Настройка Настройка
========= =========
Рекомендуется установить системную переменную BFCONFIG,
указывающую на местоположение конфигурации bforce.
Проще всего через /etc/environment для общесистемной или
.profile для переменной пользователя.
Для нормальной работы вам нужно отредактировать конфигурационные файлы Для нормальной работы вам нужно отредактировать конфигурационные файлы
bforce. По умолчанию они находятся в /usr/local/fido/etc и называются bforce. По умолчанию они находятся в /usr/local/fido/etc и называются
bforce.conf - основной конфигурационный файл bforce bforce.conf - основной конфигурационный файл bforce
@@ -125,6 +130,19 @@ cat `which mgetty` |strings |grep FIDO |wc -l
где news - это пользователь, из-под которого у вас работает ftn-подсистема. где news - это пользователь, из-под которого у вас работает ftn-подсистема.
Bforce при ИСХОДЯЩИХ звонках использует файлы блокировки порта модема,
при несовпадении каталога или невозможности создания файла
mgetty сбросит модем во время звонка.
Поэтому настоятельно рекомендуется проверить права на папку /var/lock
и то, на какой ФС она расположенв.
Современные системы имеют тенденцию к применению /var/lock как ссылки
на /run/lock, а ФС /run монтируется и создается на tmpfs при каждой
загрузке с помощью systemd-tempfiles.
Для изменения поведения необходимо создать файл в /etc/tempfiles.d/,
совпадающим (за исключением части имени -part) c именем файла в
/usr/lib/systemd/systemd-tempfiles.d.
Рабочий пример legacy-part.conf в папке contrib.
Совместная работа с inetd/xinetd Совместная работа с inetd/xinetd
================================ ================================
К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие
@@ -150,6 +168,7 @@ init.d/bforce - init-
bfha - bforce history analyzer (bfha) bfha - bforce history analyzer (bfha)
bfha/README - bfha README bfha/README - bfha README
bfha/bfha.pl - собственно, bfha bfha/bfha.pl - собственно, bfha
legacy-part.conf - файл для донастройки прав на /run/lock в systemd
u-srif - продвинутый freq-процессор u-srif - продвинутый freq-процессор
u-srif/u-srif-index.py \ с поддержой отчетов, u-srif/u-srif-index.py \ с поддержой отчетов,
u-srif/u-srif-lookup.py \ ограничений, u-srif/u-srif-lookup.py \ ограничений,
-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 FTN mailer
----------------------- -----------------------
BinkleyForce is a simple ifcico like FTN mailer. It can works via BinkleyForce is a simple ifcico like FTN mailer. It can work via
TCP/IP as well as on modem links. Look sample configs for more TCP/IP as well as on modem links. Look sample configs for more
information. information.
Supported Features
------------------
- PSTN dial-out with EMSI-II/EMSI/YooHoo handshake
- PSTN protocols: Hydra, ZedZap, ZModem
- PSTN dial-in through mgetty
- TCP/IP dial-out through IPv4 and IPv6 networks
- TCP/IP protocols - ifcico / BinkP 1.1
- TCP/IP dial-in through xinetd/inetd
- Daemon mode for outbound queue managing
Linux 2.4.11+, FreeBSD (6+ AFAIR) compatible.
Licence
-------
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
@@ -14,19 +28,32 @@ any later version. See the COPYING file for further information.
Known Bugs Known Bugs
---------- ----------
- BinkD use and expect local file time at BinkP sessions, but - BinkleyForce has no support (yet) for multiple INA: addresses
BinkleyForce allways use UTC time (?) - Can not rotate hidden lines
- Can not rotate supported IP protocols in case of failure
Bug Reports Bug Reports
----------- -----------
E-Mail : adb@newmail.ru E-Mail : zx@zxalexis.ru
FidoNet : Alexander Belkin, 2:5020/1398.11 FidoNet : Alexey Khromov, 2:5030/723
New Versions 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 options NoDirZap NoJanus NoChat
# Protocol order for outgoing EMSI calls
# Tolerant to Options (i.e. you can order all kind of protos
# as of TZA,KER,JAN and SLK are not supported at all
# Default: HYD,JAN,DZA,ZAP,ZMO,TZA,SLK,KER
proto_order HYD,ZMO,ZAP,DZA,JAN,TZA,KER,SLK
# #
# Domain outbounds # Domain outbounds
# Domain <domain_name> <outbound_dir> <zone> # Domain <domain_name> <outbound_dir> <zone>
@@ -78,8 +84,8 @@ options NoDirZap NoJanus NoChat
#log_file /var/log/bforce/bf-log #log_file /var/log/bforce/bf-log
# Debugging information completness level. Debugging is disabled by # Debugging information completness level. Debugging is disabled by
# default. Allowed debug levels: config, nodelist, outbound, info, hshake, # default. Allowed debug levels: config, override, event, nodelist, outbound,
# ttyio, modem, prot, freq, daemon, full # info, hshake, ttyio, modem, prot, freq, statem, daemon, 24554, free, full
#debug_file /var/log/bforce/bf-debug #debug_file /var/log/bforce/bf-debug
#debug_level info hshake prot #debug_level info hshake prot
@@ -91,6 +97,18 @@ options NoDirZap NoJanus NoChat
# #
nodial_flag /etc/nodial 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 # Inbound directories
# #
@@ -102,13 +120,13 @@ split_inbound yes
# #
# Path to your 4D outbound (use zone as extension) # Path to your 4D outbound (use zone as extension)
# #
#outbound_directory /var/spool/fido/bt/out outbound_directory /var/spool/fido/bt/out
# #
# Path to your AmigaDos style 4D outbound. # Path to your AmigaDos style 4D outbound.
# (You can use all outbound styles at the same time) # (You can use all outbound styles at the same time)
# #
amiga_outbound_directory /var/spool/fido/bt/out #amiga_outbound_directory /var/spool/fido/bt/out
# #
# Directory with your nodelists (for nodelist without full path) # Directory with your nodelists (for nodelist without full path)
@@ -246,6 +264,10 @@ mode_request 100660
# '~' 1 second delay # '~' 1 second delay
# '`' 1/4 second delay # '`' 1/4 second delay
# Modem lock directory (/var/lock as in FHS-3.0
# if you have it on tmpfs by systemd - read INSTALL.ru)
# uucp_lock_directory /var/lock
# #
# Yor modem devices names (will use first not locked one) # Yor modem devices names (will use first not locked one)
# ModemDev <device>[<:lock_speed>] # ModemDev <device>[<:lock_speed>]
@@ -335,6 +357,9 @@ max_speed 57600
flags XW,V34B,IDC,LMD flags XW,V34B,IDC,LMD
emsi_OH_time 22:00-07:30 emsi_OH_time 22:00-07:30
emsi_FR_time 22:30-05:30 emsi_FR_time 22:30-05:30
#emsi_send_tz no
#emsi_send_time no
# #
# Our receiver buffer size [bytes] # Our receiver buffer size [bytes]
@@ -435,6 +460,23 @@ skip_files_recv *.pif *.swp
# setsid - run command in a new session # setsid - run command in a new session
# useshell - run command by calling a shell (/bin/sh) # useshell - run command by calling a shell (/bin/sh)
# #
# Bforce will make environment for external programs
# which include these variables:
# $REM_ADDR_FTN - remote ftn address
# $REM_ADDR_INET - remote inet address
# $LOC_ADDR_FTN - local ftn address
# $LOC_ADDR_INET - local inet address
# $PASSWORD - session password
# $MAILER - remote mailer
# $LOCATION - remote location
# $SYSOP - remote SysOp name
# $SYSTEM_NAME - remote station name
# $PHONE - remote phone
# $FLAGS - remote flags
# $PROTECTED - password protected on both sides
# $LISTED - present in nodelist
# $INBOUND - current inbound path for this remote
#
#run_after_handshake [logout]/bin/echo "Hello, world!" #run_after_handshake [logout]/bin/echo "Hello, world!"
#run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in #run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in
# #
+1 -1
View File
@@ -1 +1 @@
0.23 0.25.3
+1
View File
@@ -146,6 +146,7 @@ clean:
rm -f ./bin/core rm -f ./bin/core
clean-am: clean-am:
rm -f ./Makefile rm -f ./Makefile
rm -f ../debian/Makefile
rm -f ./include/config.h rm -f ./include/config.h
rm -f ./config.log rm -f ./config.log
rm -f ./config.status rm -f ./config.status
+33 -5
View File
@@ -23,6 +23,8 @@
/* PID of our child process (if use fork) */ /* PID of our child process (if use fork) */
pid_t child_pid = 0; pid_t child_pid = 0;
char * mainenv[EXEC_MAX_NUM_ENVS+1];
const char *BFERR[] = { const char *BFERR[] = {
/* 00 */ "Successfull", /* 00 */ "Successfull",
/* 01 */ "Fatal error occured", /* 01 */ "Fatal error occured",
@@ -102,6 +104,7 @@ static void usage(void)
" -S <connect_str> connect string (for slave mode only)\n" " -S <connect_str> connect string (for slave mode only)\n"
" -p <port> override modem port (must be defined in config)\n" " -p <port> override modem port (must be defined in config)\n"
" -u binkp|ifcico|telnet protocol to use over TCP/IP\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" " -h show this help message\n"
"\n", "\n",
conf_getconfname() conf_getconfname()
@@ -252,12 +255,22 @@ int main(int argc, char *argv[], char *envp[])
int rc = 0; int rc = 0;
int ch = 0; int ch = 0;
opts.runmode = MODE_UNDEFINED; 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)); memset(&opts, '\0', sizeof(s_bforce_opts));
// parsing // 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 ) { switch( ch ) {
case 'h': 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); } //if( opts.runmode != MODE_ANSWER || opts.inetd ) { usage(); exit(BFERR_FATALERROR); }
opts.inetd = 1; opts.inetd = 1;
break; break;
case 'v':
opts.earlydbg = TRUE;
break;
case 'C': case 'C':
if( opts.confname || !optarg ) { usage(); exit(BFERR_FATALERROR); } if( opts.confname || !optarg ) { usage(); exit(BFERR_FATALERROR); }
opts.confname = (char *)xstrcpy(optarg); opts.confname = (char *)xstrcpy(optarg);
@@ -435,20 +451,21 @@ int main(int argc, char *argv[], char *envp[])
/* Process primary config file */ /* Process primary config file */
if( opts.confname && *opts.confname ) if( opts.confname && *opts.confname )
rc = conf_readconf(opts.confname, 0); rc = conf_readconf(opts.confname, 0, opts.earlydbg);
else else
rc = conf_readconf(conf_getconfname(), 0); rc = conf_readconf(conf_getconfname(), 0, opts.earlydbg);
if( rc ) gotoexit(BFERR_FATALERROR); if( rc ) gotoexit(BFERR_FATALERROR);
/* Process additional config file, ignore errors */ /* Process additional config file, ignore errors */
if( opts.incname && *opts.incname ) 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 */ /* Reopen log file if it was defined in config */
if( log_reopen(log_getfilename(LOG_FILE_SESSION), NULL, NULL) ) 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); gotoexit(BFERR_FATALERROR);
} }
@@ -459,6 +476,7 @@ int main(int argc, char *argv[], char *envp[])
switch( opts.runmode ) switch( opts.runmode )
{ {
case MODE_DAEMON: case MODE_DAEMON:
DEB((D_STATEM, "Daemon mode"));
log("Daemon mode"); log("Daemon mode");
rc = bforce_daemon(&opts); rc = bforce_daemon(&opts);
break; break;
@@ -466,14 +484,17 @@ case MODE_CALL_DEFAULT:
case MODE_CALL_IP: case MODE_CALL_IP:
case MODE_CALL_MODEM: case MODE_CALL_MODEM:
case MODE_CALL_STDIO: case MODE_CALL_STDIO:
DEB((D_STATEM, "Outgoing call"));
log("Outgoing call"); log("Outgoing call");
rc = bforce_master(&opts); rc = bforce_master(&opts);
break; break;
case MODE_ANSWER: case MODE_ANSWER:
DEB((D_STATEM, "Start answer"));
log("Start answer"); log("Start answer");
rc = bforce_slave(&opts); rc = bforce_slave(&opts);
break; break;
default: default:
DEB((D_STATEM, "Could not determine run mode"));
log("Could not determine run mode"); log("Could not determine run mode");
} }
@@ -482,6 +503,13 @@ exit:
deinit_conf(); deinit_conf();
deinit_opts(&opts); 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 */ /* Shutdown logging services */
if( log_isopened() ) log_close(); if( log_isopened() ) log_close();
DEB((D_FREE, "good exit")); 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); deinit_translate(&dest->d.translate);
break; break;
default: default:
DEB((D_CONFIG, "deinit_cval_entry: type %d doesn't use dynamic memory", //DEB((D_CONFIG, "deinit_cval_entry: type %d doesn't use dynamic memory",
type)); // 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_FR_time, CT_STRING),
CONF_KEY(emsi_OH_time, CT_STRING), CONF_KEY(emsi_OH_time, CT_STRING),
CONF_KEY(emsi_slave_sends_nak, CT_BOOLEAN), CONF_KEY(emsi_slave_sends_nak, CT_BOOLEAN),
CONF_KEY(emsi_send_tz, CT_BOOLEAN),
CONF_KEY(emsi_send_time, CT_BOOLEAN),
CONF_KEY(filebox, CT_FILEBOX), CONF_KEY(filebox, CT_FILEBOX),
CONF_KEY(filebox_directory, CT_PATH), CONF_KEY(filebox_directory, CT_PATH),
CONF_KEY(flags, CT_STRING), CONF_KEY(flags, CT_STRING),
@@ -96,6 +98,10 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(freq_limit_time, CT_NUMBER), CONF_KEY(freq_limit_time, CT_NUMBER),
CONF_KEY(freq_min_speed, CT_NUMBER), CONF_KEY(freq_min_speed, CT_NUMBER),
CONF_KEY(freq_srif_command, CT_STRING), 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(hide_our_aka, CT_ADDRESS),
CONF_KEY(history_file, CT_STRING), CONF_KEY(history_file, CT_STRING),
CONF_KEY(hydra_options, CT_OPTIONS), CONF_KEY(hydra_options, CT_OPTIONS),
@@ -142,6 +148,7 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(password, CT_PASSWORD), CONF_KEY(password, CT_PASSWORD),
CONF_KEY(phone, CT_STRING), CONF_KEY(phone, CT_STRING),
CONF_KEY(phone_translate, CT_TRANSLATE), CONF_KEY(phone_translate, CT_TRANSLATE),
CONF_KEY(proto_order, CT_STRING),
CONF_KEY(recode_file_in, CT_STRING), CONF_KEY(recode_file_in, CT_STRING),
CONF_KEY(recode_file_out, CT_STRING), CONF_KEY(recode_file_out, CT_STRING),
CONF_KEY(recode_intro_in, CT_STRING), CONF_KEY(recode_intro_in, CT_STRING),
+42 -72
View File
@@ -129,11 +129,11 @@ static void conf_parsestr(char *str, char **key, char **expr, char **value)
return; 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); fprintf(stderr,"BF-DEBUG: Parsing config file: %s %d\n", confname, inclevel);
#endif
FILE *fp = NULL; FILE *fp = NULL;
char tmp[BF_MAXCFGLINE + 1]; char tmp[BF_MAXCFGLINE + 1];
int rc, maxrc = 0; int rc, maxrc = 0;
@@ -158,10 +158,9 @@ int conf_readconf(const char *confname, int inclevel)
{ {
if( i != (int)bforce_config[i].real_key ) 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", fprintf(stderr,"BF-DEBUG: invalid config table: found %d instead of %d\n",
bforce_config[i].real_key, i); bforce_config[i].real_key, i);
#endif
return -1; return -1;
} }
} }
@@ -169,14 +168,12 @@ int conf_readconf(const char *confname, int inclevel)
if( (fp = file_open(confname,"r")) == NULL ) if( (fp = file_open(confname,"r")) == NULL )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr,"BF-DEBUG: can't open config file \"%s\"\n", confname); fprintf(stderr,"BF-DEBUG: can't open config file \"%s\"\n", confname);
#endif return(PROC_RC_ABORT);
return(PROC_RC_IGNORE);
} }
#ifdef DEBUG if (earlydbg)
fprintf(stderr,"BF-DEBUG: start reading config \"%s\"\n", confname); fprintf(stderr,"BF-DEBUG: start reading config \"%s\"\n", confname);
#endif
while( fgets(tmp, sizeof(tmp), fp) ) while( fgets(tmp, sizeof(tmp), fp) )
{ {
@@ -187,9 +184,9 @@ int conf_readconf(const char *confname, int inclevel)
{ {
if( isifexpr ) if( isifexpr )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr,"BF-DEBUG: warning: automatically close expression at empty line %d\n", line); fprintf(stderr,"BF-DEBUG: warning: automatically close expression at empty line %d\n", line);
#endif
if( ifexpr ) { free(ifexpr); ifexpr = NULL; } if( ifexpr ) { free(ifexpr); ifexpr = NULL; }
isifexpr = FALSE; isifexpr = FALSE;
} }
@@ -197,9 +194,9 @@ int conf_readconf(const char *confname, int inclevel)
if( !isappend ) if( !isappend )
continue; continue;
#ifdef DEBUG if (earlydbg)
fprintf(stderr,"BF-DEBUG: warning: appending empty or comment line %d\n", line); fprintf(stderr,"BF-DEBUG: warning: appending empty or comment line %d\n", line);
#endif
isappend = FALSE; isappend = FALSE;
} }
@@ -242,10 +239,10 @@ int conf_readconf(const char *confname, int inclevel)
p_value = NULL; p_value = NULL;
conf_parsestr(fullstr ? fullstr : tmp, &p_key, &p_expr, &p_value); 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", fprintf(stderr, "BF-DEBUG: conf_readconf: [%d] key \"%s\" expr \"%s\" value \"%s\"\n",
line, p_key, p_expr, p_value); line, p_key, p_expr, p_value);
#endif
if( p_value ) if( p_value )
{ {
@@ -269,24 +266,24 @@ int conf_readconf(const char *confname, int inclevel)
{ {
if( value == NULL || expr ) if( value == NULL || expr )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key); fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key);
#endif
rc = PROC_RC_IGNORE; rc = PROC_RC_IGNORE;
} }
else if( inclevel < MAXINCLUDELEVEL ) else if( inclevel < MAXINCLUDELEVEL )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: conf_readconf: process inlude file \"%s\"\n", value); 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; if( rc ) rc = PROC_RC_IGNORE;
} }
else else
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: conf_readconf: too deep include\n"); fprintf(stderr, "BF-DEBUG: conf_readconf: too deep include\n");
#endif
rc = PROC_RC_IGNORE; rc = PROC_RC_IGNORE;
} }
} }
@@ -294,9 +291,9 @@ int conf_readconf(const char *confname, int inclevel)
{ {
if( value || isifexpr ) if( value || isifexpr )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key); fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key);
#endif
rc = PROC_RC_ABORT; rc = PROC_RC_ABORT;
} }
else else
@@ -312,9 +309,9 @@ int conf_readconf(const char *confname, int inclevel)
{ {
if( value || expr || !isifexpr ) if( value || expr || !isifexpr )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key); fprintf(stderr, "BF-DEBUG: incorrect usage of `%s' directive\n", p_key);
#endif
rc = PROC_RC_IGNORE; rc = PROC_RC_IGNORE;
} }
else else
@@ -326,9 +323,9 @@ int conf_readconf(const char *confname, int inclevel)
else else
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: unknown directive `%s'\n", p_key); fprintf(stderr, "BF-DEBUG: unknown directive `%s'\n", p_key);
#endif
rc = PROC_RC_IGNORE; rc = PROC_RC_IGNORE;
} }
} }
@@ -336,9 +333,9 @@ int conf_readconf(const char *confname, int inclevel)
{ {
if( isifexpr && expr ) if( isifexpr && expr )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: can't use expressions inside $ifexpr block\n"); fprintf(stderr, "BF-DEBUG: can't use expressions inside $ifexpr block\n");
#endif
rc = PROC_RC_IGNORE; rc = PROC_RC_IGNORE;
} }
else if( isifexpr ) else if( isifexpr )
@@ -352,9 +349,9 @@ int conf_readconf(const char *confname, int inclevel)
} }
else else
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: incorrect config string %s\n", fullstr); fprintf(stderr, "BF-DEBUG: incorrect config string %s\n", fullstr);
#endif
rc = PROC_RC_IGNORE; rc = PROC_RC_IGNORE;
} }
@@ -369,19 +366,19 @@ int conf_readconf(const char *confname, int inclevel)
case PROC_RC_OK: case PROC_RC_OK:
break; break;
case PROC_RC_WARN: case PROC_RC_WARN:
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: warning in config \"%s\" line %d\n", confname, line); fprintf(stderr, "BF-DEBUG: warning in config \"%s\" line %d\n", confname, line);
#endif
break; break;
case PROC_RC_IGNORE: case PROC_RC_IGNORE:
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: ignore line %d in config \"%s\"\n", line, confname); fprintf(stderr, "BF-DEBUG: ignore line %d in config \"%s\"\n", line, confname);
#endif
break; break;
case PROC_RC_ABORT: case PROC_RC_ABORT:
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: fatal error in config \"%s\" in line %d\n", confname, line); fprintf(stderr, "BF-DEBUG: fatal error in config \"%s\" in line %d\n", confname, line);
#endif
break; break;
default: default:
ASSERT_MSG(); ASSERT_MSG();
@@ -395,9 +392,9 @@ int conf_readconf(const char *confname, int inclevel)
if( isifexpr ) if( isifexpr )
{ {
maxrc = 1; maxrc = 1;
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: unterminated directive `#ifexp'\n"); fprintf(stderr, "BF-DEBUG: unterminated directive `#ifexp'\n");
#endif
} }
if( fullstr ) if( fullstr )
@@ -405,51 +402,24 @@ int conf_readconf(const char *confname, int inclevel)
if( ifexpr ) if( ifexpr )
free(ifexpr); free(ifexpr);
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: readconfig: exit with maxrc = %d\n", maxrc); fprintf(stderr, "BF-DEBUG: readconfig: exit with maxrc = %d\n", maxrc);
#endif
/* update subsystems */ /* update subsystems */
if (inclevel==0) { // end of main config if (inclevel==0) { // end of main config
if( log_reopen(log_getfilename(LOG_FILE_SESSION), NULL, NULL) ) if( log_reopen(log_getfilename(LOG_FILE_SESSION), NULL, NULL) )
{ {
#ifdef DEBUG if (earlydbg)
fprintf(stderr, "BF-DEBUG: can't continue without logging\n"); fprintf(stderr, "BF-DEBUG: can't continue without logging\n");
#endif
exit(-1); exit(-1);
} }
#ifdef DEBUG #ifdef DEBUG
debug_configure(); debug_configure();
#endif #endif
} }
return maxrc; 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"); strcpy(msg, "freqs holded");
} }
if( msg && *msg ) if( *msg )
log("QUEUE: add %s (%s)", ftn_addrstr(abuf, sysent->node.addr), msg); log("QUEUE: add %s (%s)", ftn_addrstr(abuf, sysent->node.addr), msg);
else else
log("QUEUE: add %s", ftn_addrstr(abuf, sysent->node.addr)); log("QUEUE: add %s", ftn_addrstr(abuf, sysent->node.addr));
@@ -178,7 +178,7 @@ static int daemon_sysentry_deinit(s_sysentry *sysent)
return 0; return 0;
} }
static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd) static int daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
{ {
bool good_phone = FALSE; bool good_phone = FALSE;
bool good_host = FALSE; bool good_host = FALSE;
@@ -194,7 +194,7 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
if( modem_isgood_phone(ovrd->sPhone) ) if( modem_isgood_phone(ovrd->sPhone) )
good_phone = TRUE; good_phone = TRUE;
} }
else if( node && node->phone && *node->phone ) else if( node && *node->phone )
{ {
if( modem_isgood_phone(node->phone) ) if( modem_isgood_phone(node->phone) )
good_phone = TRUE; good_phone = TRUE;
@@ -208,6 +208,11 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
if( tcpip_isgood_host(ovrd->sIpaddr) ) if( tcpip_isgood_host(ovrd->sIpaddr) )
good_host = TRUE; good_host = TRUE;
} }
else if ( node && *node->host )
{
if( tcpip_isgood_host(node->host) )
good_host = TRUE;
}
/* /*
* Check work time * Check work time
@@ -231,6 +236,16 @@ static bool daemon_node_cancall_line(const s_node *node, const s_override *ovrd)
good_time = TRUE; good_time = TRUE;
} }
// Must be more complicated, i.e. call to IP even if modem is not good time
if ( good_host )
{
good_time = TRUE;
}
DEB((D_DAEMON, "daemon: node_cancall_line good_phone: %d, good_time:%d, good_host:%d",
good_phone, good_time, good_host));
if( good_time ) if( good_time )
{ {
if( good_host ) if( good_host )
@@ -323,9 +338,23 @@ static bool daemon_node_cancall(s_sysentry *syst, bool ign_wtime, bool tcpip)
return FALSE; return FALSE;
} }
/* Make check for tcpip out */
if ( tcpip )
{
rc = daemon_node_cancall_line(&syst->node, NULL);
DEB((D_DAEMON, "daemon tcpip: node_cancall rc=%d", rc));
if ( rc == 2 )
{
syst->tcpip = TRUE;
return TRUE;
}
}
/* Make checks for all lines */ /* Make checks for all lines */
if( syst->overrides ) if( syst->overrides )
{ {
DEB((D_DAEMON, "daemon: node_cancall OVR-IN"));
if( syst->lineptr && syst->lineptr->hidden ) if( syst->lineptr && syst->lineptr->hidden )
{ {
line = syst->line + 1; line = syst->line + 1;
@@ -363,11 +392,18 @@ static bool daemon_node_cancall(s_sysentry *syst, bool ign_wtime, bool tcpip)
} }
line++; line++;
} }
} }
else /* Node without overriden parameters */ else /* Node without overriden parameters */
{ {
syst->line = line = 0; syst->line = line = 0;
return daemon_node_cancall_line(&syst->node, NULL); rc = daemon_node_cancall_line(&syst->node, NULL);
DEB((D_DAEMON, "daemon: node_cancall rc=%d", rc));
if ( rc )
{
syst->tcpip = (rc == 2) ? TRUE : FALSE;
return TRUE;
}
} }
return FALSE; return FALSE;
@@ -687,6 +723,8 @@ int daemon_rescan_sysqueue(s_sysqueue *q, s_daemon_queue dqs[])
#ifdef DEBUG #ifdef DEBUG
log_sysqueue(q); log_sysqueue(q);
DEB((D_DAEMON, "daemon rescan_sysqueue daemon queue: MODEM: %d, %d; TCPIP: %d, %d",
dqs[MODEM_QUEUE].circle, dqs[MODEM_QUEUE].current, dqs[TCPIP_QUEUE].circle, dqs[TCPIP_QUEUE].current));
#endif #endif
return 0; return 0;
@@ -755,6 +793,7 @@ int daemon_pidfile(int cmd)
pid_t hispid, mypid = getpid(); pid_t hispid, mypid = getpid();
FILE *pf; FILE *pf;
struct stat sb; struct stat sb;
int res;
if( !pidfile ) if( !pidfile )
return 0; return 0;
@@ -768,7 +807,12 @@ int daemon_pidfile(int cmd)
return -1; return -1;
} }
fscanf(pf, "%d", &hispid); res = fscanf(pf, "%d", &hispid);
if (res != 1) {
log("daemon pidfile: not readable");
return -1;
}
fclose(pf); fclose(pf);
if( hispid ) { if( hispid ) {
@@ -807,7 +851,12 @@ int daemon_pidfile(int cmd)
return -1; return -1;
} }
fscanf(pf, "%d", &hispid); res = fscanf(pf, "%d", &hispid);
if (res != 1) {
log("daemon pidfile: not readable");
return -1;
}
fclose(pf); fclose(pf);
if( !hispid || (hispid == mypid) ) { if( !hispid || (hispid == mypid) ) {
@@ -831,7 +880,12 @@ int daemon_pidfile(int cmd)
return -1; return -1;
} }
fscanf(pf, "%d", &hispid); res = fscanf(pf, "%d", &hispid);
if (res != 1) {
log("daemon pidfile: not readable");
return -1;
}
fclose(pf); fclose(pf);
unlink(pidfile); unlink(pidfile);
@@ -938,15 +992,15 @@ int daemon_run(const char *confname, const char *incname, bool quit)
/* Read primary config file */ /* Read primary config file */
if( confname && *confname ) if( confname && *confname )
rc = conf_readconf(confname, 0); rc = conf_readconf(confname, 0, false);
else else
rc = conf_readconf(conf_getconfname(), 0); rc = conf_readconf(conf_getconfname(), 0, false);
if( rc ) if( rc )
return(BFERR_FATALERROR); return(BFERR_FATALERROR);
/* Read additional config file (manual include) */ /* 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)"); log("cannot read additional config (ignore)");
dmstate = DM_Start; 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); timer_set(&timer_alive, DAEMON_ALIVE_TIMER);
} }
if( max_modem > 0 ) if( max_tcpip > 0 )
daemon_queue_do(&daemon_queues[MODEM_QUEUE]); {
if( max_tcpip > 0 ) DEB((D_DAEMON,"daemon: daemon_tcpip_queue"));
daemon_queue_do(&daemon_queues[TCPIP_QUEUE]); daemon_queue_do(&daemon_queues[TCPIP_QUEUE]);
}
if( max_modem > 0 )
{
DEB((D_DAEMON,"daemon: daemon_modem_queue"));
daemon_queue_do(&daemon_queues[MODEM_QUEUE]);
}
(void)sleep(DAEMON_IDLE_SLEEP); (void)sleep(DAEMON_IDLE_SLEEP);
break; break;
+20 -8
View File
@@ -39,8 +39,8 @@ static s_modemport *daemon_getfree_port(const char *lockdir)
static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport *port) static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport *port)
{ {
int rc = BFERR_NOERROR; //int rc = BFERR_NOERROR;
char abuf[BF_MAXADDRSTR+1]; //char abuf[BF_MAXADDRSTR+1];
/* /*
* First of all restore the default signal handlers * First of all restore the default signal handlers
@@ -54,15 +54,20 @@ static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport
s_bforce_opts opts; s_bforce_opts opts;
// TODO: add hiddenline round-robin // TODO: add hiddenline round-robin
opts.hiddline=0; memset(&opts, '\0', sizeof(s_bforce_opts));
opts.runmode = MODE_CALL_DEFAULT;
opts.hiddline = 0;
if ( syst->tcpip )
opts.runmode = MODE_CALL_IP;
else
opts.runmode = MODE_CALL_DEFAULT;
opts.ipproto = NULL; opts.ipproto = NULL;
opts.phone = NULL; opts.phone = NULL;
opts.force = 0; opts.force = 0;
opts.inetd = 0; opts.inetd = 0;
opts.connect = NULL; opts.connect = NULL;
opts.device = NULL; opts.device = NULL;
DEB((D_DAEMON, "daemon_call: calling call_system from branch"));
// log("doing call_system"); // log("doing call_system");
return call_system(syst->node.addr, &opts); return call_system(syst->node.addr, &opts);
} }
@@ -87,8 +92,11 @@ int daemon_call(s_sysentry *syst)
/* /*
* Check whether this node is allready locked * Check whether this node is allready locked
*/ */
if( out_bsy_check(syst->node.addr) ) if( out_bsy_check(syst->node.addr) )
{
DEB((D_DAEMON, "daemon_call: node locked by .bsy file"));
return 0; return 0;
}
/* /*
* Set state structure to make expressions works properly now * Set state structure to make expressions works properly now
@@ -101,6 +109,7 @@ int daemon_call(s_sysentry *syst)
if( syst->tcpip == FALSE ) if( syst->tcpip == FALSE )
{ {
DEB((D_DAEMON, "daemon_call: tcpip false - prep modem line"));
if( (p_lockdir = conf_string(cf_uucp_lock_directory)) == NULL ) if( (p_lockdir = conf_string(cf_uucp_lock_directory)) == NULL )
p_lockdir = BFORCE_LOCK_DIR; p_lockdir = BFORCE_LOCK_DIR;
@@ -110,7 +119,10 @@ int daemon_call(s_sysentry *syst)
return 1; return 1;
} }
} }
DEB((D_DAEMON, "call %s line %d via %s",
ftn_addrstr(abuf, syst->node.addr), syst->line,
syst->tcpip ? "TCP/IP" : modemport->name));
log("call %s line %d via %s", log("call %s line %d via %s",
ftn_addrstr(abuf, syst->node.addr), syst->line, ftn_addrstr(abuf, syst->node.addr), syst->line,
syst->tcpip ? "TCP/IP" : modemport->name); syst->tcpip ? "TCP/IP" : modemport->name);
@@ -138,7 +150,7 @@ int daemon_call(s_sysentry *syst)
} }
/* Now we are in child process */ /* Now we are in child process */
DEB((D_DAEMON, "daemon_call: fork success - calling..."));
exit(daemon_call_branch(syst, p_lockdir, modemport)); exit(daemon_call_branch(syst, p_lockdir, modemport));
} }
File diff suppressed because it is too large Load Diff
+1
View File
@@ -45,6 +45,7 @@
%token LOGOP %token LOGOP
%expect 2 %expect 2
%{ %{
#include "includes.h" #include "includes.h"
#include "confread.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); fprintf(fp, "Sysop %s\n", cptr);
else else
fprintf(fp, "Sysop SysOp\n"); fprintf(fp, "Sysop SysOp\n");
if( aptr = session_1remote_address() ) aptr = session_1remote_address();
if( aptr )
fprintf(fp, "AKA %s\n", ftn_addrstr(abuf, *aptr)); fprintf(fp, "AKA %s\n", ftn_addrstr(abuf, *aptr));
else else
return -1; return -1;
+77 -26
View File
@@ -19,29 +19,49 @@
#define DEFAULT_PORT 60179 /* Birthday .. mother fucker :) */ #define DEFAULT_PORT 60179 /* Birthday .. mother fucker :) */
struct addrinfo *ai = NULL;
static RETSIGTYPE tcpip_interrupt(int sig) static RETSIGTYPE tcpip_interrupt(int sig)
{ {
tty_abort = TRUE; tty_abort = TRUE;
log("terminating on signal %d", sig); (void)log("terminating on signal %d", sig);
} }
static RETSIGTYPE tcpip_brokenpipe(int sig) static RETSIGTYPE tcpip_brokenpipe(int sig)
{ {
tty_abort = TRUE; tty_abort = TRUE;
if( tty_online ) if( tty_online )
log("connection closed"); (void)log("connection closed");
else else
log("terminating on signal %d", sig); (void)log("terminating on signal %d", sig);
} }
static int tcpip_connect2(struct sockaddr_in server) static int tcpip_connect2(struct addrinfo *ai)
{ {
int fd; int fd = -1;
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
DEB((D_INFO, "tcpip_connect2: trying \"%s\" at port %d",
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port))); struct addrinfo *rai;
if( (fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) for (rai = ai; rai != NULL; rai = rai->ai_next)
{
if (getnameinfo(rai->ai_addr, rai->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0)
DEB((D_INFO, "tcpip_connect2: trying host=%s, serv=%s", hbuf, sbuf));
fd = socket (rai->ai_family, rai->ai_socktype, rai->ai_protocol);
if ( fd == -1 )
{
DEB((D_INFO, "tcpip_connect2: socket error"));
}
else break;
hbuf[0]='\0';
sbuf[0]='\0';
}
DEB((D_INFO, "tcpip_connect2: socket success: %d", fd));
if (fd < 0 )
{ {
logerr("can't create socket"); logerr("can't create socket");
return(1); return(1);
@@ -84,9 +104,9 @@ static int tcpip_connect2(struct sockaddr_in server)
clearerr(stdout); clearerr(stdout);
clearerr(stderr); clearerr(stderr);
if( connect(0, (struct sockaddr*)&server, sizeof(server)) == -1 ) if( connect(0, rai->ai_addr, rai->ai_addrlen) == -1 )
{ {
logerr("can't connect to %s", inet_ntoa(server.sin_addr)); logerr("can't connect to %s", hbuf);
close(0); close(0);
close(1); close(1);
close(2); close(2);
@@ -99,8 +119,7 @@ static int tcpip_connect2(struct sockaddr_in server)
return 1; return 1;
} }
log("TCP/IP connect to %s on port %d", (void)log("TCP/IP connect success to %s on service %s", hbuf, sbuf);
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port));
return(0); return(0);
} }
@@ -108,14 +127,23 @@ static int tcpip_connect2(struct sockaddr_in server)
int tcpip_connect(const char *hostname, e_tcpmode tcpmode) int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
{ {
int rc = 0; int rc = 0;
struct hostent *he = NULL; //struct hostent *he = NULL;
struct servent *se = NULL; //struct servent *se = NULL;
struct sockaddr_in server; //struct sockaddr_in server;
//struct sockaddr_storage server;
struct addrinfo *aisave = NULL;
struct addrinfo aihints;
int nameres = 0;
char *host = xstrcpy(hostname); char *host = xstrcpy(hostname);
char *p = strrchr(host, ':'); char *p = strrchr(host, ':');
const char *port = NULL; const char *port = NULL;
server.sin_family = AF_INET;
// AF_INET - only IPv4
//server.sin_family = AF_INET;
if( p ) if( p )
{ *p++ = '\0'; port = p; } { *p++ = '\0'; port = p; }
@@ -123,18 +151,34 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
port = "binkp"; port = "binkp";
else if( tcpmode == TCPMODE_TELNET ) else if( tcpmode == TCPMODE_TELNET )
port = "telnet"; port = "telnet";
else /* Default service name is "fido" */ else /* Can not rely on /etc/services - it is not well-known port */
port = "fido"; port = "60179";
// Do not need it
/*
if( ISDEC(port) ) if( ISDEC(port) )
server.sin_port = htons(atoi(port)); server.sin_port = htons(atoi(port));
else if( (se = getservbyname(port, "tcp")) ) else if( (se = getservbyname(port, "tcp")) )
server.sin_port = se->s_port; server.sin_port = se->s_port;
else else
{ log("invalid port or service name \"%s\"", port); rc = 1; } { log("invalid port or service name \"%s\"", port); rc = 1; }
*/
//if( rc == 0 )
//{
DEB((D_INFO, "tcpip_connect: port is %s", port));
memset( &aihints, 0, sizeof( aihints) );
aihints.ai_family = AF_UNSPEC;
//aihints.ai_socktype = SOCK_STREAM;
aihints.ai_protocol = IPPROTO_TCP;
if( rc == 0 ) nameres = getaddrinfo ( host, port, &aihints, &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)) ) if( (he = gethostbyname(host)) )
{ {
memcpy(&server.sin_addr, he->h_addr, he->h_length); memcpy(&server.sin_addr, he->h_addr, he->h_length);
@@ -159,12 +203,19 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
log("unknown error while resolving host \"%s\"", host); log("unknown error while resolving host \"%s\"", host);
break; break;
} }
} } */
} //}
if( host ) { free(host); host = NULL; } if( host ) { free(host); host = NULL; }
DEB((D_INFO, "tcpip_connect: resolver got result!"));
aisave = ai;
return rc ? rc : tcpip_connect2(server); if (rc == 0 )
rc = tcpip_connect2(ai);
freeaddrinfo( aisave );
return rc;
} }
int tcpip_init(void) 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); ASSERT(modemport != NULL);
if( lockdir && *lockdir ) if( *lockdir )
lckname = (char *)xstrcpy(lockdir); lckname = (char *)xstrcpy(lockdir);
else else
lckname = (char *)xstrcpy(BFORCE_LOCK_DIR); lckname = (char *)xstrcpy(BFORCE_LOCK_DIR);
@@ -314,7 +314,7 @@ int port_lock(const char *lockdir, const s_modemport *modemport)
char *lckname; char *lckname;
char *tmpname, *p_tmpname; char *tmpname, *p_tmpname;
if( lockdir && *lockdir ) if( *lockdir )
tmpname = xstrcpy(lockdir); tmpname = xstrcpy(lockdir);
else else
tmpname = xstrcpy(BFORCE_LOCK_DIR); tmpname = xstrcpy(BFORCE_LOCK_DIR);
+7 -1
View File
@@ -118,6 +118,9 @@ int tio_get(int fd, TIO *tio)
{ {
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
return tcgetattr(fd, tio); return tcgetattr(fd, tio);
#else
DEB(("io_unix_tio: TERMIOS not supported!"));
return -1;
#endif #endif
} }
@@ -127,6 +130,9 @@ int tio_set(int fd, TIO *tio)
{ {
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
return tcsetattr(fd, TCSANOW, tio); return tcsetattr(fd, TCSANOW, tio);
#else
DEB(("io_unix_tio: TERMIOS not supported!"));
return -1;
#endif #endif
} }
@@ -177,7 +183,7 @@ int tio_get_speed(TIO *tio)
return speedtab[i].nspeed; return speedtab[i].nspeed;
} }
return-1; return -1;
} }
int tio_set_flow_control(int fd, TIO *tio, int flow) int tio_set_flow_control(int fd, TIO *tio, int flow)
+1 -1
View File
@@ -307,7 +307,7 @@ int tty_putc(unsigned char ch, int timeout)
int tty_puts(const unsigned char *s, int timeout) int tty_puts(const unsigned char *s, int timeout)
{ {
return tty_write_timeout(s, strlen(s), timeout); return tty_write_timeout(s, strlen((char *)s), timeout);
} }
int tty_getc(int timeout) int tty_getc(int timeout)
+17 -4
View File
@@ -106,11 +106,15 @@ int log_open(const char *logname, const char *ext, const char *tty)
if( logname ) if( logname )
{ {
DEB((D_INFO,"log_open: Opening log file %s", logname));
strnxcpy(log_name, logname, sizeof(log_name)); strnxcpy(log_name, logname, sizeof(log_name));
// May be NULL, so check both
if( tty && *tty ) if( tty && *tty )
strnxcpy(log_ttyname, tty, sizeof(log_ttyname)); strnxcpy(log_ttyname, tty, sizeof(log_ttyname));
// May be NULL, so check both
if( ext && *ext ) if( ext && *ext )
{ {
strnxcpy(log_extension, ext, sizeof(log_extension)); strnxcpy(log_extension, ext, sizeof(log_extension));
@@ -142,7 +146,9 @@ int log_close(void)
if( log_fp ) 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; return rc;
@@ -283,6 +289,8 @@ int logerr(const char *s, ...)
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
bool slog_active = FALSE;
const char *log_getfilename(int whatfor) const char *log_getfilename(int whatfor)
{ {
const char *p = "/dev/null"; const char *p = "/dev/null";
@@ -291,22 +299,27 @@ const char *log_getfilename(int whatfor)
bool log_isopened(void) bool log_isopened(void)
{ {
return TRUE; return slog_active;
} }
int log_open(const char *logname, const char *ext, const char *tty) int log_open(const char *logname, const char *ext, const char *tty)
{ {
char *p = "bforce"; char *p = "bforce ";
p = xstrcat(p, BF_VERSION);
int fac = conf_number(cf_syslog_facility); int fac = conf_number(cf_syslog_facility);
if( tty && *tty ) if( tty && *tty )
strncpy(p, tty, sizeof(p)); strncpy(p, tty, sizeof(p));
openlog(p, LOG_PID, fac); openlog(p, LOG_PID, fac);
slog_active = TRUE;
return 0; return 0;
} }
int log_reopen(const char *logname, const char *ext, const char *tty) int log_reopen(const char *logname, const char *ext, const char *tty)
{ {
return 0; if ( !slog_active ) {
return (log_reopen(logname, ext, tty));
} else
return 0;
} }
int log_close(void) 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->phone, argv[NODELIST_POSPHONE], sizeof(node->phone));
strnxcpy(node->flags, argv[NODELIST_POSFLAGS], sizeof(node->flags)); strnxcpy(node->flags, argv[NODELIST_POSFLAGS], sizeof(node->flags));
node->speed = atoi(argv[NODELIST_POSSPEED]); node->speed = atoi(argv[NODELIST_POSSPEED]);
DEB((D_NODELIST, "nodelist: Parsed common values SYS: %s, ZYZ: %s, LOC: %s, PHONE: %s", node->name, node->sysop, node->location, node->phone));
/* /*
* Replace all '_' by space character * Replace all '_' by space character
*/ */
@@ -291,8 +291,11 @@ int nodelist_parsestring(s_node *node, char *str)
node->do_ifcico = nodelist_checkflag(node->flags, "IFC") == 0; node->do_ifcico = nodelist_checkflag(node->flags, "IFC") == 0;
node->do_telnet = nodelist_checkflag(node->flags, "ITN") == 0; node->do_telnet = nodelist_checkflag(node->flags, "ITN") == 0;
//TODO: Add more INA flags to array
nodelist_flagvalue(node->flags, "INA", node->host); nodelist_flagvalue(node->flags, "INA", node->host);
DEB((D_NODELIST, "nodelist: Parsed inet values IBN: %d, IFC: %d, ITN: %d, INA: %s", node->do_binkp, node->do_ifcico, node->do_telnet, node->host));
return 0; return 0;
} }
+9
View File
@@ -73,9 +73,18 @@ int exec_options_parse(char *str)
void exec_options_init(s_exec_options *eopt) void exec_options_init(s_exec_options *eopt)
{ {
int i = 0;
memset(eopt, '\0', sizeof(s_exec_options)); memset(eopt, '\0', sizeof(s_exec_options));
eopt->umask = EXEC_DEFAULT_UMASK; eopt->umask = EXEC_DEFAULT_UMASK;
eopt->envp[0] = NULL; eopt->envp[0] = NULL;
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) void exec_options_deinit(s_exec_options *eopt)
+8
View File
@@ -31,6 +31,7 @@ int out_filetype(const char *fname)
else else
p_nam = fname; p_nam = fname;
DEB((D_EVENT, "outb_fsqueue: getting type of file %s", p_nam));
/* /*
* Get file name extension * Get file name extension
*/ */
@@ -39,12 +40,19 @@ int out_filetype(const char *fname)
for( i = 0; outtab[i].ext; i++ ) for( i = 0; outtab[i].ext; i++ )
if( strcasemask(p_ext, outtab[i].ext) == 0 ) if( strcasemask(p_ext, outtab[i].ext) == 0 )
{
DEB((D_EVENT, "outb_fsqueue: got type %d from outtab ext %s", outtab[i].type, p_ext ));
return outtab[i].type; return outtab[i].type;
}
for( i = 0; exttab[i].ext; i++ ) for( i = 0; exttab[i].ext; i++ )
if( strcasemask(p_ext, exttab[i].ext) == 0 ) if( strcasemask(p_ext, exttab[i].ext) == 0 )
{
DEB((D_EVENT, "outb_fsqueue: got type %d from exttab ext %s", exttab[i].type, p_ext ));
return exttab[i].type; return exttab[i].type;
}
DEB((D_EVENT, "outb_fsqueue: got type UNKNOWN", exttab[i].type, p_ext ));
return TYPE_UNKNOWN; return TYPE_UNKNOWN;
} }
+48 -40
View File
@@ -106,7 +106,7 @@ int binkp_loop(s_binkp_state *bstate) {
bool no_more_to_send = false; bool no_more_to_send = false;
bool no_more_read = false; bool no_more_read = false;
bool canread, canwrite; bool canread, canwrite;
int timeout = conf_number(cf_binkp_timeout); int timeout = conf_number(cf_binkp_timeout);
if( timeout==0 ) if( timeout==0 )
timeout = 60; timeout = 60;
@@ -117,13 +117,14 @@ int binkp_loop(s_binkp_state *bstate) {
// session criterium handshake criterium // session criterium handshake criterium
while (!bstate->complete || bstate->waiting_got) { while (!bstate->complete || bstate->waiting_got) {
DEB((D_24554, "loop s: %d r: %d p: %d sp: %d", bstate->batchsendcomplete, bstate->batchreceivecomplete, DEB((D_24554, ">>> BinkP loop sendcpl: %d recvcpl: %d phase: %d subphase: %d", bstate->batchsendcomplete, bstate->batchreceivecomplete,
bstate->phase, bstate->subphase)); bstate->phase, bstate->subphase));
if (bstate->continuesend) { if (bstate->continuesend) {
no_more_to_send = false; no_more_to_send = false;
bstate->continuesend = false; bstate->continuesend = false;
} }
if (have_to_write==0 && (!no_more_to_send || bstate->extracmd[0]!=-1)) {
if (have_to_write==0 && (!no_more_to_send || bstate->extracmd[0]!=(char)-1)) {
m = binkp_getforsend(bstate, writebuf+BINKP_HEADER, &block_type, &block_length); m = binkp_getforsend(bstate, writebuf+BINKP_HEADER, &block_type, &block_length);
if(m==1 || m==3) { if(m==1 || m==3) {
//DEB((D_24554, "got block for sending %d %hu", block_type, block_length)); //DEB((D_24554, "got block for sending %d %hu", block_type, block_length));
@@ -267,6 +268,7 @@ int binkp_loop(s_binkp_state *bstate) {
have_to_write -= n; have_to_write -= n;
} }
} }
DEB((D_24554,"+++ BinkP Loop ended with rc=%d", bstate->rc));
return bstate->rc; return bstate->rc;
} }
@@ -338,8 +340,8 @@ int binkp_getforsend(s_binkp_state *bstate, char *buf, int *block_type, unsigned
{ {
int my_sf, wr_pos; int my_sf, wr_pos;
int n; // read file int n; // read file
if (bstate->extracmd[0]!=-1) { if (bstate->extracmd[0]!=(char)-1) {
DEB((D_24554, "send command from receiver %d %s", bstate->extracmd[0], bstate->extracmd+1)); DEB((D_24554, "Send cmd to remote %d %s", bstate->extracmd[0], bstate->extracmd+1));
buf[0] = bstate->extracmd[0]; buf[0] = bstate->extracmd[0];
strcpy(buf+1, bstate->extracmd+1); strcpy(buf+1, bstate->extracmd+1);
*block_type = BINKP_BLK_CMD; *block_type = BINKP_BLK_CMD;
@@ -625,7 +627,7 @@ case 4:
return 1; return 1;
case 5: case 5:
DEB((D_24554, "nothing to send")); DEB((D_24554, "BinkP_GetForSend: nothing to send"));
return 2; return 2;
@@ -666,12 +668,12 @@ case BPMSG_ADR: /* List of addresses */
if (bstate->address_established) { if (bstate->address_established) {
PROTO_ERROR("remote tries to change address"); PROTO_ERROR("remote tries to change address");
} }
if( bstate->extracmd[0] !=-1 ) return 0; // suspend !!! if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend !!!
binkp_process_ADR(buf+1); binkp_process_ADR(buf+1);
if( !state.n_remoteaddr ) { if( !state.n_remoteaddr ) {
log("error: remote did not supplied any addresses"); log("error: remote did not supplied any addresses");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "No addresses was presented"); strcpy(bstate->extracmd+1, "No addresses was presented");
bstate->extraislast = true; bstate->extraislast = true;
@@ -738,7 +740,7 @@ case BPMSG_PWD: /* Session password */
/* Do authorization */ /* Do authorization */
if( binkp_auth_incoming(bstate->remote_data) ) { if( binkp_auth_incoming(bstate->remote_data) ) {
log("error: invalid password"); log("error: invalid password");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if extra is occupied if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend if extra is occupied
bstate->extracmd[0] = BPMSG_ERR; bstate->extracmd[0] = BPMSG_ERR;
strcpy(bstate->extracmd+1, "Security violation"); strcpy(bstate->extracmd+1, "Security violation");
bstate->extraislast = true; bstate->extraislast = true;
@@ -747,7 +749,7 @@ case BPMSG_PWD: /* Session password */
// lock addresses // lock addresses
if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) ) { if( session_addrs_lock(state.remoteaddrs, state.n_remoteaddr) ) {
log("error locking addresses of the remote"); log("error locking addresses of the remote");
if( bstate->extracmd[0] !=-1 ) return 0; // suspend if extra is occupied if( bstate->extracmd[0] != (char)-1 ) return 0; // suspend if extra is occupied
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "All addresses are busy"); strcpy(bstate->extracmd+1, "All addresses are busy");
bstate->extraislast = true; bstate->extraislast = true;
@@ -768,6 +770,7 @@ case BPMSG_FILE: /* File information */
s_bpfinfo recvfi; s_bpfinfo recvfi;
if( binkp_parsfinfo(buf+1, &recvfi, true) ) { if( binkp_parsfinfo(buf+1, &recvfi, true) ) {
log ("M_FILE parse error: %s", buf + 1); log ("M_FILE parse error: %s", buf + 1);
DEB((D_24554, "M_FILE parse error: %s", buf + 1 ));
PROTO_ERROR("invalid M_FILE"); PROTO_ERROR("invalid M_FILE");
} }
bstate->batch_recv_count += 1; bstate->batch_recv_count += 1;
@@ -784,9 +787,9 @@ case BPMSG_FILE: /* File information */
return 1; return 1;
} }
DEB((D_24554, "no, skipping; TODO: accept it")); DEB((D_24554, "no, skipping; TODO: accept it"));
if( bstate->extracmd[0] != -1 ) return 0; if( bstate->extracmd[0] != (char)-1 ) return 0;
bstate->extracmd[0] = BPMSG_SKIP; bstate->extracmd[0] = BPMSG_SKIP;
sprintf(bstate->extracmd+1, "%s %ld %ld %ld", recvfi.fn, recvfi.sz, recvfi.tm); sprintf(bstate->extracmd+1, "%s %ld %ld %ld", recvfi.fn, recvfi.sz, recvfi.tm, recvfi.offs);
bstate->extraislast = false; bstate->extraislast = false;
return 1; return 1;
} }
@@ -796,7 +799,7 @@ case BPMSG_FILE: /* File information */
PROTO_ERROR("invalid mode for M_FILE"); PROTO_ERROR("invalid mode for M_FILE");
} }
if( bstate->extracmd[0] != -1 ) return 0; if( bstate->extracmd[0] != (char)-1 ) return 0;
switch(p_rx_fopen(bstate->pi, recvfi.fn, recvfi.sz, recvfi.tm, 0)) { switch(p_rx_fopen(bstate->pi, recvfi.fn, recvfi.sz, recvfi.tm, 0)) {
case 0: case 0:
if (bstate->pi->recv->bytes_skipped == recvfi.offs) { if (bstate->pi->recv->bytes_skipped == recvfi.offs) {
@@ -804,7 +807,7 @@ case 0:
bstate->frs = frs_data; bstate->frs = frs_data;
return 1; return 1;
} }
DEB((D_24554, "making M_GET to skip downloaded part")); DEB((D_24554, "making M_GET to skip downloaded part, file: %s, size %ld, time %ld, mode 0",recvfi.fn,recvfi.sz, recvfi.tm ));
bstate->extracmd[0] = BPMSG_GET; bstate->extracmd[0] = BPMSG_GET;
sprintf(bstate->extracmd+1, "%s %ld %ld %ld", sprintf(bstate->extracmd+1, "%s %ld %ld %ld",
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
@@ -842,7 +845,7 @@ case BPMSG_OK: /* Password was acknowleged (data ignored) */
} }
if (session_addrs_lock(state.remoteaddrs, state.n_remoteaddr)) { if (session_addrs_lock(state.remoteaddrs, state.n_remoteaddr)) {
log("error: unable to lock"); log("error: unable to lock");
if (bstate->extracmd[0]!=-1) return 0; if (bstate->extracmd[0]!= (char)-1) return 0;
bstate->extracmd[0] = BPMSG_BSY; bstate->extracmd[0] = BPMSG_BSY;
strcpy(bstate->extracmd+1, "All addresses are busy"); strcpy(bstate->extracmd+1, "All addresses are busy");
bstate->extraislast = true; bstate->extraislast = true;
@@ -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)); 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) { if (bstate->pi->send) if (p_compfinfo(bstate->pi->send, getfi.fn, getfi.sz, getfi.tm)==0) {
DEB((D_24554, "M_GET for currently transmitted file")); DEB((D_24554, "M_GET for currently transmitted file"));
@@ -1042,14 +1045,14 @@ case BINKP_BLK_DATA:
return 1; return 1;
} }
if (bstate->extracmd[0] != -1) return 0; if (bstate->extracmd[0] != (char)-1) return 0;
long int n; long int n;
n = p_rx_writefile(buf, block_length, bstate->pi); n = p_rx_writefile(buf, block_length, bstate->pi);
if( n < 0 ) { if( n < 0 ) {
log("error writing local file"); log("error writing local file");
if( n == -2 ) { if( n == (long int)-2 ) {
bstate->extracmd[0] = BPMSG_GOT; bstate->extracmd[0] = BPMSG_GOT;
sprintf(bstate->extracmd+1, "%s %ld %ld", bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, sprintf(bstate->extracmd+1, "%s %ld %ld", bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
(long)bstate->pi->recv->mod_time); (long)bstate->pi->recv->mod_time);
@@ -1078,28 +1081,33 @@ case BINKP_BLK_DATA:
p_rx_fclose(bstate->pi); p_rx_fclose(bstate->pi);
PROTO_ERROR("extra data for file") PROTO_ERROR("extra data for file")
} }
else if( bstate->pi->recv->bytes_received == bstate->pi->recv->bytes_total ) { else if( bstate->pi->recv->bytes_received == bstate->pi->recv->bytes_total )
DEB((D_24554, "receive completed")); {
bstate->frs = frs_nothing; DEB((D_24554, "receive completed"));
bstate->pi->recv->status = FSTAT_SUCCESS; bstate->frs = frs_nothing;
if( !p_rx_fclose(bstate->pi) ) { bstate->pi->recv->status = FSTAT_SUCCESS;
bstate->extracmd[0] = BPMSG_GOT; if( !p_rx_fclose(bstate->pi) )
sprintf(bstate->extracmd+1, "%s %ld %ld", {
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, bstate->extracmd[0] = BPMSG_GOT;
(long)bstate->pi->recv->mod_time); sprintf(bstate->extracmd+1, "%s %ld %ld",
bstate->extraislast = false; bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
return 1; (long)bstate->pi->recv->mod_time);
} bstate->extraislast = false;
else { return 1;
DEB((D_24554, "some error committing file")); }
bstate->extracmd[0] = BPMSG_SKIP; else
sprintf(bstate->extracmd+1, "%s %ld %ld", {
bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total, DEB((D_24554, "some error committing file"));
(long)bstate->pi->recv->mod_time); bstate->extracmd[0] = BPMSG_SKIP;
bstate->extraislast = false; sprintf(bstate->extracmd+1, "%s %ld %ld",
return 1; bstate->pi->recv->net_name, (long)bstate->pi->recv->bytes_total,
} (long)bstate->pi->recv->mod_time);
} else { bstate->extraislast = false;
return 1;
}
}
else
{
DEB((D_24554, "data block accepted")); DEB((D_24554, "data block accepted"));
return 1; return 1;
} }
+1 -1
View File
@@ -45,7 +45,7 @@ int binkp_parsfinfo(const char *str, s_bpfinfo *fi, bool with_offset)
return -1; return -1;
} }
DEB((D_24554, "info to parse: %s", str)); DEB((D_24554, "info to parse: %s", str));
r = sscanf(str, with_offset? "%s %d %d %d": "%s %d %d", &fi->fn, &fi->sz, &fi->tm, &fi->offs); r = sscanf(str, with_offset? "%s %ld %ld %ld": "%s %ld %ld", &fi->fn, &fi->sz, &fi->tm, &fi->offs);
chkslash = fi->fn; chkslash = fi->fn;
while (1) { while (1) {
chkslash = strchr(chkslash, '/'); chkslash = strchr(chkslash, '/');
+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) void prot_traffic_update(s_traffic *traf, size_t size, int xtime, int type)
{ {
DEB((D_EVENT, "prot_common: Adding type %d with size %ld to stats", type, size));
if( type & TYPE_REQANSW ) if( type & TYPE_REQANSW )
{ {
traf->freqed_size += size; traf->freqed_size += size;
@@ -433,6 +434,10 @@ void prot_traffic_update(s_traffic *traf, size_t size, int xtime, int type)
traf->arcmail_time += xtime; traf->arcmail_time += xtime;
traf->arcmail_num++; traf->arcmail_num++;
} }
else if( type & TYPE_TICFILE )
{
traf->ticfile_num++;
}
else else
{ {
traf->files_size += size; traf->files_size += size;
@@ -860,6 +865,8 @@ int p_rx_fopen(s_protinfo *pi, char *fn, size_t sz, time_t tm, mode_t mode)
size_t minfree = 0; size_t minfree = 0;
size_t needed_bytes_total = 0; size_t needed_bytes_total = 0;
DEB((D_FREE, "P_RX_FOPEN: File: %s, Size: %ld", fn, sz));
/* /*
* Check. May be we are receiving this file allready * Check. May be we are receiving this file allready
*/ */
+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 *addr_ptr;
s_cval_entry *hide_ptr; s_cval_entry *hide_ptr;
s_faddr *primary = NULL; s_faddr *primary = NULL;
char xdt[EMSI_MAXXDATETIME+1];
time_t xtm;
const long options = conf_options(cf_options); const long options = conf_options(cf_options);
const long speed = conf_number(cf_max_speed); const long speed = conf_number(cf_max_speed);
@@ -737,6 +739,10 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
{ emsi->compcodes.JAN = 1; } { emsi->compcodes.JAN = 1; }
if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA ) if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA )
{ emsi->compcodes.HYD = 1; } { emsi->compcodes.HYD = 1; }
DEB((D_HSHAKE,"Generated compcodes for caller: NCP:%x.ZMO:%x.ZAP:%x.DZA:%x.JAN:%x.HYD:%x.KER:%x.SLK:%x.TZA:%x",
emsi->compcodes.NCP, emsi->compcodes.ZMO, emsi->compcodes.ZAP,
emsi->compcodes.DZA, emsi->compcodes.JAN, emsi->compcodes.HYD,
emsi->compcodes.KER, emsi->compcodes.SLK, emsi->compcodes.TZA));
} }
else else
{ {
@@ -813,6 +819,22 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags)); strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags));
} }
/* ----------------------------------------------------------------- */
/* Data for {TZUTC} and {XDATETIME} field */
/* ----------------------------------------------------------------- */
if ( conf_boolean(cf_emsi_send_tz) ) {
emsi->have_tzutc = 1;
emsi->tzutc = (int)(time_gmtoffset());
}
if ( conf_boolean(cf_emsi_send_time) ) {
emsi->have_xdatetime = 1;
strnxcpy(xdt,time_string_format(xdt, EMSI_MAXXDATETIME, "%d.%m.%Y %H:%M:%S %z", xtm),EMSI_MAXXDATETIME);
strnxcpy(emsi->xdatetime, xdt, sizeof(emsi->xdatetime));
}
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/* Data for {OHFR} field */ /* Data for {OHFR} field */
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
+38 -9
View File
@@ -134,6 +134,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
int rc = HRC_OK; int rc = HRC_OK;
s_emsi *remote_emsi = NULL; s_emsi *remote_emsi = NULL;
s_emsi *local_emsi = NULL; s_emsi *local_emsi = NULL;
char *p = NULL;
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->remote_data); ASSERT(THIS->remote_data);
@@ -198,18 +199,46 @@ int emsi_incoming(s_handshake_protocol *THIS)
/* /*
* Set protocol that we will use * Set protocol that we will use
* EMSI-II compatible as of v0.25
*/ */
if( remote_emsi->compcodes.HYD && !(options & OPTIONS_NO_HYDRA) ) if ( remote_emsi->compcodes.EII ) {
THIS->protocol = PROT_HYDRA; /* EMSI-II relies on protocol order sent by CALLER
else if( remote_emsi->compcodes.ZAP && !(options & OPTIONS_NO_ZEDZAP) ) * we must agree on first matching protocol
THIS->protocol = PROT_ZEDZAP; */
else if( remote_emsi->compcodes.ZMO && !(options & OPTIONS_NO_ZMODEM) ) p = xstrcpy( remote_emsi->proto_order );
THIS->protocol = PROT_ZMODEM;
else /* NCP */
{
THIS->protocol = PROT_NOPROT; THIS->protocol = PROT_NOPROT;
rc = HRC_NO_PROTOS; for ( p = strtok( p, "," ); p ; p=strtok( NULL, "," ) ) {
if ( !strcmp(p, "ZMO") && !(options & OPTIONS_NO_ZMODEM)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_ZMODEM;
}
if ( !strcmp(p, "HYD") && !(options & OPTIONS_NO_HYDRA)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_HYDRA;
}
if ( !strcmp(p, "ZAP") && !(options & OPTIONS_NO_ZEDZAP)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_ZEDZAP;
}
if ( !strcmp(p, "DZA") && !(options & OPTIONS_NO_DIRZAP)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_DIRZAP;
}
/* if ( !strcmp(p, "JAN") && !(options & OPTIONS_NO_JANUS)) {
if ( THIS->protocol == PROT_NOPROT ) THIS->protocol = PROT_JANUS;
} */
}
} else {
/* EMSI-I relies on our self order, not the CALLER's */
if( remote_emsi->compcodes.HYD && !(options & OPTIONS_NO_HYDRA) )
THIS->protocol = PROT_HYDRA;
else if( remote_emsi->compcodes.ZAP && !(options & OPTIONS_NO_ZEDZAP) )
THIS->protocol = PROT_ZEDZAP;
else if( remote_emsi->compcodes.ZMO && !(options & OPTIONS_NO_ZMODEM) )
THIS->protocol = PROT_ZMODEM;
else /* NCP */
{
THIS->protocol = PROT_NOPROT;
}
} }
if ( THIS->protocol == PROT_NOPROT ) rc = HRC_NO_PROTOS;
/* /*
* Check EMSI flags and set corresponding local HOLD flags * Check EMSI flags and set corresponding local HOLD flags
+161 -13
View File
@@ -103,6 +103,10 @@ char *emsi_createdat(s_emsi *emsi)
char *tmp = NULL; char *tmp = NULL;
char buf[100]; char buf[100];
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
char *p_order = NULL;
char *ord = NULL;
tmp = (char *)xstrcpy("**EMSI_DAT0000"); tmp = (char *)xstrcpy("**EMSI_DAT0000");
@@ -179,14 +183,79 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
} }
/* compatibility_codes */ /* compatibility_codes (EMSI behavior as FTS-0088) */
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,"); p_order = conf_string(cf_proto_order);
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,"); if ( !p_order ) {
if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,"); if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,");
if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,"); if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,");
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,");
if( emsi->compcodes.TZA ) tmp = add_str(tmp, "TZA,");
if( emsi->compcodes.SLK ) tmp = add_str(tmp, "SLK,");
if( emsi->compcodes.KER ) tmp = add_str(tmp, "KER,");
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
} else {
ord = xmalloc(4);
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.FRQ ) tmp = add_str(tmp, "FRQ,");
if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,"); if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,");
if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,"); if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,");
@@ -325,10 +394,15 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
tmp = add_char(tmp, '['); tmp = add_char(tmp, '[');
sprintf(buf, "+%04d", emsi->tzutc); /* BUGGY */
tmp = add_str(tmp, buf); // sprintf(buf, "+%04d", emsi->tzutc);
ord = xmalloc(6);
ord = xstrcpy(time_string_gmtoffset(ord));
ord[5] = '\0';
tmp = add_str(tmp, ord);
tmp = add_char(tmp, ']'); tmp = add_char(tmp, ']');
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
free(ord);
} }
/* {XDATE} indentifier.. What's the fucking invention :-/ /* {XDATE} indentifier.. What's the fucking invention :-/
@@ -450,6 +524,8 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
{ {
int i; int i;
char *tmp, *p, *q, *n; char *tmp, *p, *q, *n;
unsigned int tzh, tzm,tzn ;
char *tzc, *otmp;
while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL ) while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL )
{ {
@@ -525,13 +601,64 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
/* compatibility codes */ /* compatibility codes */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p)); DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p));
emsi->proto_order[0] = '\0';
for( p = strtok(p, ","); p; p=strtok(NULL, ",") ) for( p = strtok(p, ","); p; p=strtok(NULL, ",") )
{ {
if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1; /* if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1;
else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1; else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1;
else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1; else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1;
else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1; else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1;
else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1; else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1;
*/
if ( !strcmp(p, "ZMO") ) {
emsi->compcodes.ZMO = 1;
otmp = strcat(emsi->proto_order,"ZMO,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "ZAP") ) {
emsi->compcodes.ZAP = 1;
otmp = strcat(emsi->proto_order,"ZAP,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "DZA") ) {
emsi->compcodes.DZA = 1;
otmp = strcat(emsi->proto_order,"DZA,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "JAN") ) {
emsi->compcodes.JAN = 1;
otmp = strcat(emsi->proto_order,"JAN,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "HYD") ) {
emsi->compcodes.HYD = 1;
otmp = strcat(emsi->proto_order,"HYD,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "KER") ) {
emsi->compcodes.KER = 1;
otmp = strcat(emsi->proto_order,"KER,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "TZA") ) {
emsi->compcodes.TZA = 1;
otmp = strcat(emsi->proto_order,"TZA,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "SLK") ) {
emsi->compcodes.SLK = 1;
otmp = strcat(emsi->proto_order,"SLK,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1; else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1;
else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1; else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1;
else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1; else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1;
@@ -542,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, "BBS") ) emsi->compcodes.BBS = 1;
else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1; else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1;
} }
/* Delete last comma from order list */
emsi->proto_order[strlen(emsi->proto_order)-1] = '\0';
DEB((D_HSHAKE,"Ordered compcodes: %s",emsi->proto_order));
/* mailer information */ /* mailer information */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
@@ -645,14 +775,32 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
if( *p ) strnxcpy(emsi->xdatetime, p, sizeof(emsi->xdatetime)); if( *p ) strnxcpy(emsi->xdatetime, p, sizeof(emsi->xdatetime));
} }
else if( strcmp(tmp, "TZUTC") == 0 ) else if( strcmp(tmp, "TZUTC") == 0 )
{ {
emsi->have_tzutc = 1;
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( (p=get_field(&p, '[', ']')) == NULL ) return(1); if( (p=get_field(&p, '[', ']')) == NULL ) return(1);
/* Parse EMSI TZUTC in fmt (+|-)HHMM */
if( *p ) {
tzc = malloc(2);
DEB((D_HSHAKE, "Got TZUTC=%s for parsing", p));
tzn = sscanf( p, "%1c%02u%02u", tzc, &tzh, &tzm);
tzc[1] = '\0';
if ( tzn == 3) {
DEB((D_HSHAKE, "Got TZC=%s , H=%u, M=%u", tzc, tzh,tzm));
emsi->have_tzutc = 1;
if ( strcmp(tzc, "-") == 0 ) {
emsi->tzutc = -(tzh*60 + tzm);
} else {
emsi->tzutc = tzh*60 + tzm;
}
} else {
DEB((D_HSHAKE,"TZUTC value not parsed!"));
}
free(tzc);
}
} }
else else
{ {
DEB((D_HSHAKE, "Step - no known EMSI-part - got %s", tmp));
strnxcat(emsi->addons, "{", sizeof(emsi->addons)); strnxcat(emsi->addons, "{", sizeof(emsi->addons));
strnxcat(emsi->addons, tmp, sizeof(emsi->addons)); strnxcat(emsi->addons, tmp, sizeof(emsi->addons));
strnxcat(emsi->addons, "}", sizeof(emsi->addons)); strnxcat(emsi->addons, "}", sizeof(emsi->addons));
+26 -14
View File
@@ -22,8 +22,16 @@
int answ_system(e_session type, char *connstr, int inetd) int answ_system(e_session type, char *connstr, int inetd)
{ {
TIO oldtio; TIO oldtio;
struct sockaddr_in client; union {
struct sockaddr a;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} client;
//struct sockaddr_storage client;
int clientlen = sizeof(client); int clientlen = sizeof(client);
char clienthost[NI_MAXHOST];
char clientport[NI_MAXSERV];
int clientres = 0;
int rc = 0; int rc = 0;
char *p; char *p;
@@ -71,20 +79,23 @@ int answ_system(e_session type, char *connstr, int inetd)
if( inetd ) if( inetd )
{ {
log("Answering TCPIP call...");
if( connstr && *connstr ) if( connstr && *connstr )
state.connstr = (char*)xstrcpy(connstr); state.connstr = (char*)xstrcpy(connstr);
else if( getpeername(0, (struct sockaddr*)&client, &clientlen) == -1 ) else
logerr("can't get client address");
else
{ {
#ifdef IPV6 if(getpeername(0, &client.a, &clientlen))
>char addr_str[INET6_ADDRSTRLEN+1]; log("sess_answ: can't detrmine socket client");
state.peername = (char*)xstrcpy(inet_ntop(AF_INET6, client.sin6_addr, addr_str, INET6_ADDRSTRLEN)); clientres = getnameinfo( &client.a, clientlen,
state.peerport = (long)ntohs(client.sin6_port); clienthost, sizeof(clienthost), clientport,
#else sizeof(clientport), NI_NUMERICHOST | NI_NUMERICSERV);
state.peername = (char*)xstrcpy(inet_ntoa(client.sin_addr)); if ( clientres == 0 )
state.peerport = (long)ntohs(client.sin_port); {
#endif state.peername = (char*)xstrcpy(clienthost);
state.peerport = (long)atol(clientport);
}
else
log("sess_answ: can't get client address: ", gai_strerror(clientres));
} }
} }
@@ -116,9 +127,10 @@ int answ_system(e_session type, char *connstr, int inetd)
port_carrier(0, TRUE); port_carrier(0, TRUE);
rc = session(); rc = session();
log("Session ended up, rc=%d, inetd=%d", rc, inetd);
if( (inetd != 0) && (state.inet = FALSE) ) if( ( !inetd ) )
{ {
log("Deactivating modem port");
port_deinit(0, &oldtio); port_deinit(0, &oldtio);
port_close(); port_close();
} }
+102 -33
View File
@@ -480,10 +480,15 @@ int call_system_tcpip(int callwith) // only TCPIP values
{ {
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
int rc = BFERR_NOERROR; int rc = BFERR_NOERROR;
char * pbuf;
char * target;
int resflg;
/* /*
* Set verbal line name to "tcpip" value * Set verbal line name to "tcpip" value
*/ */
memset(abuf, '\0', BF_MAXADDRSTR+1);
target = xmalloc(1024);
memset(target, '\0', 1024);
state.linename = xstrcpy("tcpip"); state.linename = xstrcpy("tcpip");
state.inet = TRUE; state.inet = TRUE;
@@ -502,14 +507,17 @@ int call_system_tcpip(int callwith) // only TCPIP values
case CALL_TCPIP_BINKP: case CALL_TCPIP_BINKP:
state.tcpmode = TCPMODE_BINKP; state.tcpmode = TCPMODE_BINKP;
state.session = SESSION_BINKP; state.session = SESSION_BINKP;
target = xstrcpy("IBN");
break; break;
case CALL_TCPIP_IFCICO: case CALL_TCPIP_IFCICO:
state.tcpmode = TCPMODE_RAW; state.tcpmode = TCPMODE_RAW;
state.session = SESSION_UNKNOWN; state.session = SESSION_UNKNOWN;
target = xstrcpy("IFC");
break; break;
case CALL_TCPIP_TELNET: case CALL_TCPIP_TELNET:
state.tcpmode = TCPMODE_TELNET; state.tcpmode = TCPMODE_TELNET;
state.session = SESSION_UNKNOWN; state.session = SESSION_UNKNOWN;
target = xstrcpy("ITN");
break; break;
defalt: defalt:
log("invalid protocol for TCP/IP module"); log("invalid protocol for TCP/IP module");
@@ -520,8 +528,45 @@ defalt:
ftn_addrstr(abuf, state.node.addr), ftn_addrstr(abuf, state.node.addr),
(state.node.name && *state.node.name ) ? state.node.name : "<none>", (state.node.name && *state.node.name ) ? state.node.name : "<none>",
(state.node.host && *state.node.host) ? state.node.host : "<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) ) && (rc = tcpip_init() == 0) )
{ {
TTYSTATUS(1); TTYSTATUS(1);
@@ -532,7 +577,7 @@ defalt:
{ {
rc = BFERR_CANT_CONNECT10; rc = BFERR_CANT_CONNECT10;
} }
free(pbuf);
return rc; return rc;
} }
@@ -543,7 +588,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
char s[300]; char s[300];
snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point ); snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point );
log(s); log(s);
DEB((D_EVENT, s));
// find suitable way of connection and try to make session // find suitable way of connection and try to make session
int rc = 0; int rc = 0;
@@ -568,12 +613,13 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
state.listed = state.node.listed; state.listed = state.node.listed;
//DEB((D_EVENT, "Calling init, listed=%d", state.listed));
state.node.addr.domain[0] = '\0'; /* Discard domain for node address */ state.node.addr.domain[0] = '\0'; /* Discard domain for node address */
// 1. If call method specified in cmdline, do use it // 1. If call method specified in cmdline, do use it
// 2. If not, use nodelist data and overrides and call all available methods // 2. If not, use nodelist data and overrides and call all available methods
// If override contains Phone or IP flags, ignore nodelist connect methods (but save INA if not overrided) // If override contains Phone or IP flags, ignore nodelist connect methods (but save INA if not overrided)
DEB((D_EVENT, "Calling init, runmode=%d", opts->runmode));
// 1st - get all allowed call ways // 1st - get all allowed call ways
// 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support) // 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support)
@@ -581,7 +627,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( opts->runmode == MODE_CALL_DEFAULT ) if( opts->runmode == MODE_CALL_DEFAULT )
{ {
call_mayuse = CALL_MODEM | CALL_TCPIP_ANY; call_mustuse = CALL_MODEM | CALL_TCPIP_ANY;
} }
else if( opts->runmode == MODE_CALL_STDIO ) else if( opts->runmode == MODE_CALL_STDIO )
{ {
@@ -593,7 +639,14 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
else if( opts->runmode == MODE_CALL_IP ) else if( opts->runmode == MODE_CALL_IP )
{ {
if( strcasecmp(opts->ipproto, "binkp") == 0 ) DEB((D_EVENT, "Calling init, MODE_CALL_IP"));
if( !(opts->ipproto) ) // determine from nodelist/override
{
DEB((D_EVENT, "ipproto not set"));
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else if( strcasecmp(opts->ipproto, "binkp") == 0 )
{ {
call_mustuse = CALL_TCPIP_BINKP; call_mustuse = CALL_TCPIP_BINKP;
} }
@@ -605,20 +658,17 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
call_mustuse = CALL_TCPIP_TELNET; call_mustuse = CALL_TCPIP_TELNET;
} }
else if( opts->ipproto == NULL ) // determine from nodelist/override
{
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else else
{ {
DEB((D_EVENT, "Unknown protocol %s", opts->ipproto));
log("Unknown protocol"); log("Unknown protocol");
return -1; return -1;
} }
} }
else else
{ {
log("Unknown protocol"); DEB((D_EVENT, "Unknown runmode %d", opts->runmode));
log("Unknown runmode");
return -1; return -1;
} }
@@ -627,9 +677,10 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
//char s[300]; //char s[300];
//snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse); //snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse);
//log(s); //log(s);
//DEB((D_EVENT, s));
if( call_mayuse & CALL_MODEM ) if( (call_mayuse & CALL_MODEM) )
{ {
// 1. use phone from opts // 1. use phone from opts
// 2. use overrides // 2. use overrides
@@ -650,7 +701,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
log("bad phone, excluding modem"); log("bad phone, excluding modem");
call_mayuse &= ~CALL_MODEM; call_mayuse &= ~CALL_MODEM;
if( call_mustuse & CALL_MODEM ) if( !(call_mayuse) )
{ {
errmsg = "don't know phone number"; errmsg = "don't know phone number";
gotoexit(BFERR_PHONE_UNKNOWN); gotoexit(BFERR_PHONE_UNKNOWN);
@@ -684,7 +735,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
call_mayuse &= ~CALL_MODEM; call_mayuse &= ~CALL_MODEM;
log("bad worktime, excluding modem"); log("bad worktime, excluding modem");
if( call_mustuse & CALL_MODEM ) if( !(call_mayuse) )
{ {
errmsg = "not works now, try later"; errmsg = "not works now, try later";
gotoexit(BFERR_NOTWORKING); gotoexit(BFERR_NOTWORKING);
@@ -693,9 +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); //snprintf(s, 299, "after phone check: may use %d must use %d", call_mayuse, call_mustuse);
// log(s); //log(s);
//DEB((D_EVENT, s));
/* /*
* Apply overrides to the node information * Apply overrides to the node information
*/ */
@@ -714,7 +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( !(call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) )
{ {
if( nodelist_checkflag(state.node.flags, "BINKP") != 0 && nodelist_checkflag(state.node.flags, "IBN") != 0 ) //if( nodelist_checkflag(state.node.flags, "BINKP") != 0 && nodelist_checkflag(state.node.flags, "IBN") != 0 )
if( state.node.do_binkp == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_BINKP; call_mayuse &= ~CALL_TCPIP_BINKP;
} }
@@ -722,7 +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( !(call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) )
{ {
if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 ) //if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 )
if( state.node.do_ifcico == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_IFCICO; call_mayuse &= ~CALL_TCPIP_IFCICO;
} }
@@ -730,7 +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( !(call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) )
{ {
if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 ) //if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 )
if( state.node.do_telnet == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_TELNET; call_mayuse &= ~CALL_TCPIP_TELNET;
} }
@@ -746,7 +800,12 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
state.override.sIpaddr, sizeof(state.node.host)); state.override.sIpaddr, sizeof(state.node.host));
} }
if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(state.node.host) ) { //DEB((D_EVENT, "Calling init, IPHOST", state.node.host));
// We have at least one protocol and not valid address - try to
// find INA with through Fidonet DNS
if( (call_mayuse & CALL_TCPIP_ANY) && !tcpip_isgood_host(state.node.host) )
{
char *fidodnszone = conf_string(cf_fidodnszone); char *fidodnszone = conf_string(cf_fidodnszone);
if (fidodnszone) { if (fidodnszone) {
if (addr.point) { if (addr.point) {
@@ -761,17 +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; call_mayuse &= ~CALL_TCPIP_ANY;
log("bad host, exclude IP"); log("bad host, exclude IP");
if( call_mustuse & CALL_TCPIP_ANY ) DEB((D_EVENT, "bad host or proto -> exclude IP, mayuse=%d", call_mayuse));
// If we had ONLY tcpip command - go out with error
if( !(call_mayuse) )
{ {
errmsg = "don't know host name"; errmsg = "Aborting, don't know host name";
gotoexit(BFERR_PHONE_UNKNOWN); gotoexit(BFERR_PHONE_UNKNOWN);
} }
} }
DEB((D_EVENT,"sess_call: may use %d must use %d", call_mayuse, call_mustuse));
// snprintf(s, 299, "after IP check: may use %d must use %d", call_mayuse, call_mustuse); // snprintf(s, 299, "after IP check: may use %d must use %d", call_mayuse, call_mustuse);
// log(s); // log(s);
@@ -807,29 +870,34 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
// try allowed methods and break if rc == 0 // try allowed methods and break if rc == 0
rc = -1; rc = -1;
if( rc && call_mayuse & CALL_STDIO ) if( rc && (call_mayuse & CALL_STDIO) )
{ {
DEB((D_EVENT,"sess_call: calling stdio"));
rc = call_system_quiet(opts->connect, opts->inetd); rc = call_system_quiet(opts->connect, opts->inetd);
} }
if( rc && call_mayuse & CALL_TCPIP_BINKP ) if( rc && (call_mayuse & CALL_TCPIP_BINKP) )
{ {
DEB((D_EVENT,"sess_call: calling binkp"));
rc = call_system_tcpip(CALL_TCPIP_BINKP); rc = call_system_tcpip(CALL_TCPIP_BINKP);
} }
if( rc && call_mayuse & CALL_TCPIP_IFCICO ) if( rc && (call_mayuse & CALL_TCPIP_IFCICO) )
{ {
DEB((D_EVENT,"sess_call: calling ifcico"));
rc = call_system_tcpip(CALL_TCPIP_IFCICO); rc = call_system_tcpip(CALL_TCPIP_IFCICO);
} }
if( rc && call_mayuse & CALL_TCPIP_TELNET ) if( rc && (call_mayuse & CALL_TCPIP_TELNET) )
{ {
DEB((D_EVENT,"sess_call: calling telnet"));
rc = call_system_tcpip(CALL_TCPIP_TELNET); rc = call_system_tcpip(CALL_TCPIP_TELNET);
} }
if( rc && call_mayuse & CALL_MODEM ) if( rc && (call_mayuse & CALL_MODEM) )
{ {
DEB((D_EVENT,"sess_call: calling MODEM"));
setproctitle("bforce calling %.32s, %.32s", setproctitle("bforce calling %.32s, %.32s",
ftn_addrstr(abuf, state.node.addr), state.node.phone); ftn_addrstr(abuf, state.node.addr), state.node.phone);
rc = -1; rc = -1;
@@ -850,6 +918,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */ if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */
{ {
DEB((D_EVENT,"sess_call: call_system_modem running"));
rc = call_system_modem(); rc = call_system_modem();
port_unlock(p_lockdir, state.modemport); port_unlock(p_lockdir, state.modemport);
} }
+76 -2
View File
@@ -311,6 +311,7 @@ int session_set_inbound(void)
{ {
struct stat st; struct stat st;
char *p_inb; char *p_inb;
int res;
p_inb = conf_string(cf_inbound_directory); p_inb = conf_string(cf_inbound_directory);
if( !p_inb ) { if( !p_inb ) {
@@ -342,7 +343,11 @@ int session_set_inbound(void)
log("inbound: %s", buf); log("inbound: %s", buf);
state.inbound = (char*)xstrcpy(buf); state.inbound = (char*)xstrcpy(buf);
snprintf( buf, PATH_MAX+30, "/bin/mkdir -p -m 700 %s", state.inbound ); /* 30 additional chars allowed */ 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 else
{ {
@@ -695,6 +700,7 @@ int session(void)
s_traffic traff_send; s_traffic traff_send;
s_traffic traff_recv; s_traffic traff_recv;
char *p; char *p;
int fd = -1;
memset(&traff_send, '\0', sizeof(s_traffic)); memset(&traff_send, '\0', sizeof(s_traffic));
memset(&traff_recv, '\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. * Write total amount of received/sent bytes, files, etc.
*/ */
p_log_txrxstat(&pi); p_log_txrxstat(&pi);
// Protocol info - real info from protocol
DEB((D_EVENT,"sess_main: Pi stats> Net: %d, Arc: %d, Fil: %d, Tic: %d",
pi.traffic_rcvd.netmail_num, pi.traffic_rcvd.arcmail_num,
pi.traffic_rcvd.files_num, pi.traffic_rcvd.ticfile_num));
// Session info - HANDSHAKE info for traffic
DEB((D_EVENT,"sess_main: Sess stats> Net: %d, Arc: %d, Fil: %d, Tic: %d",
state.traff_recv.netmail_num, state.traff_recv.arcmail_num,
state.traff_recv.files_num, state.traff_recv.ticfile_num));
/*
* Raise flags if session incoming traffic was not empty
*/
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 * 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) static int session_stat_read_stsfile(FILE *fp, s_sess_stat *stat)
{ {
int res;
if( fseek(fp, 0, SEEK_SET) == -1 ) if( fseek(fp, 0, SEEK_SET) == -1 )
return -1; return -1;
memset(stat, '\0', sizeof(s_sess_stat)); 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,
(unsigned int *) &stat->tries_noconn, (unsigned int *) &stat->tries_noconn,
(unsigned int *) &stat->tries_noansw, (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->hold_freqs,
(unsigned long *) &stat->last_success_out, (unsigned long *) &stat->last_success_out,
(unsigned long *) &stat->last_success_in); (unsigned long *) &stat->last_success_in);
if (res == 0) {
log("Read STS unsuccessfull...");
return -1;
}
/* Set last successfull session time */ /* Set last successfull session time */
stat->last_success = MAX(stat->last_success_out, stat->last_success_in); 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 *file_getname(char *filename)
{ {
char *p = strrchr(filename, '/'); char *p = strrchr(filename, '/');
DEB((D_FREE, "File_getname: %s", (p ? p + 1 : filename) ));
return p ? p + 1 : filename; return p ? p + 1 : filename;
} }
+4 -2
View File
@@ -189,7 +189,8 @@ static int ftn_addrparse_fido(s_faddr *addr, const char *s, bool wildcard)
{ {
strnxcpy(addr->domain, string_printable(p), sizeof(addr->domain)); strnxcpy(addr->domain, string_printable(p), sizeof(addr->domain));
} }
DEB((D_INFO,"u_ftn: Parsed ftn address z:%d, net:%d, node:%d, point:%d",
addr->zone, addr->net, addr->node, addr->point));
return badaddr; return badaddr;
} }
@@ -325,7 +326,8 @@ int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard)
addr->net = DEFAULT_NET; addr->net = DEFAULT_NET;
addr->node = DEFAULT_NODE; addr->node = DEFAULT_NODE;
addr->point = 0; addr->point = 0;
DEB((D_INFO, "u_ftn: parsing ftnaddr %s", s));
if( addr->inetform ) if( addr->inetform )
badaddr = ftn_addrparse_inet(addr, s, wildcard); badaddr = ftn_addrparse_inet(addr, s, wildcard);
else else
+1
View File
@@ -81,6 +81,7 @@ void *xrealloc(void *buf, size_t size)
else if( (tmp = (char*)(buf ? realloc(buf, size) : malloc(size))) == NULL ) else if( (tmp = (char*)(buf ? realloc(buf, size) : malloc(size))) == NULL )
{ {
log("failed to reallocate %ld bytes -> abort", size); log("failed to reallocate %ld bytes -> abort", size);
if( buf ) free(buf);
abort(); abort();
} }
+12 -9
View File
@@ -173,18 +173,20 @@ long time_gmtoffset(void)
time_t tt = time(NULL); time_t tt = time(NULL);
struct tm local = *localtime(&tt); struct tm local = *localtime(&tt);
struct tm gmt = *gmtime(&tt); struct tm gmt = *gmtime(&tt);
long tz = gmt.tm_yday - local.tm_yday; long tz = 0; /* = local.tm_yday - gmt.tm_yday;
if( tz > 1 ) if( tz > 1 )
tz = -24; tz = -24;
else if( tz < -1 ) else if( tz < -1 )
tz = 24; tz = +24;
else else
tz *= 24; tz *= 24; */
tz += gmt.tm_hour - local.tm_hour; /*tz += gmt.tm_hour - local.tm_hour;
tz *= 60; tz *= 60;
tz += gmt.tm_min - local.tm_min; tz += gmt.tm_min - local.tm_min;*/
tz = (gmt.tm_hour*60+gmt.tm_min) - (local.tm_hour*60+local.tm_min);
return tz; return tz;
} }
@@ -200,12 +202,13 @@ long time_gmtoffset(void)
*/ */
char *time_string_gmtoffset(char *buffer) char *time_string_gmtoffset(char *buffer)
{ {
long tz = time_gmtoffset(); long tz = -time_gmtoffset();
char sign = (tz > 0)?'+':'-'; char sign = (tz > 0)?'+':'-';
int hour = tz/60; tz = abs(tz);
int mint = tz%60; unsigned int hour = tz/60;
unsigned int mint = tz%60;
sprintf(buffer, "%c%02d%02d", sign, hour, mint); sprintf(buffer, "%c%02u%02u", sign, hour, mint);
return buffer; return buffer;
} }
+2 -2
View File
@@ -127,7 +127,7 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
switch(keyword) { switch(keyword) {
case KEYWORD_ZONE: case KEYWORD_ZONE:
bni.zone = value; bni.zone = value;
bni.net = 0; bni.net = value; // zxalexis
bni.node = 0; bni.node = 0;
bni.point = 0; bni.point = 0;
bni.hub = 0; bni.hub = 0;
@@ -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); exit(1);
} }
+1 -1
View File
@@ -301,7 +301,7 @@ int main(int argc, char *argv[])
/* Initialise current locale */ /* Initialise current locale */
(void)setlocale(LC_ALL, ""); (void)setlocale(LC_ALL, "");
if( conf_readconf(conf_getconfname(), 0) ) if( conf_readconf(conf_getconfname(), 0, false) )
exit(1); exit(1);
memset(&ocb, '\0', sizeof(s_outbound_callback_data)); 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); exit(BFERR_FATALERROR);
} }
if( conf_readconf(conf_getconfname(), 0) ) if( conf_readconf(conf_getconfname(), 0, false) )
exit(BFERR_FATALERROR); exit(BFERR_FATALERROR);
if( rawstring ) if( rawstring )
+4 -4
View File
@@ -580,10 +580,10 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='bforce' PACKAGE_NAME='bforce'
PACKAGE_TARNAME='bforce' PACKAGE_TARNAME='bforce'
PACKAGE_VERSION='0.24' PACKAGE_VERSION='0.24.1'
PACKAGE_STRING='bforce 0.24' PACKAGE_STRING='bforce 0.24.1'
PACKAGE_BUGREPORT='sergey@fidoman.ru' PACKAGE_BUGREPORT='zx@zxalexis.ru'
PACKAGE_URL='' PACKAGE_URL='https://prj.zxalexis.ru/gitea/zx/bforce.git'
ac_default_prefix=/usr/local/fido ac_default_prefix=/usr/local/fido
# Factoring default headers for most tests. # Factoring default headers for most tests.
+2 -2
View File
@@ -3,7 +3,7 @@ dnl
dnl $Id$ dnl $Id$
dnl dnl
#AC_INIT(bforce/bforce.c) #AC_INIT(bforce/bforce.c)
AC_INIT([bforce],[0.24.1],[sergey@fidoman.ru]) AC_INIT([bforce],[0.24.1],[zx@zxalexis.ru])
AC_CONFIG_HEADER(include/config.h) AC_CONFIG_HEADER(include/config.h)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
dnl # Minimum Autoconf version required. dnl # Minimum Autoconf version required.
@@ -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_CHECK_FUNCS([clock_gettime], [CLOCK_LIB=],[AC_CHECK_LIB([rt], [clock_gettime], [CLOCK_LIB=-lrt])])
AC_SUBST([CLOCK_LIB]) AC_SUBST([CLOCK_LIB])
AC_OUTPUT(Makefile) 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 daemon; /* Run as daemon? */
bool quit; /* Quit from daemon */ bool quit; /* Quit from daemon */
bool usestdio; /* Session on stdin and stdout */ bool usestdio; /* Session on stdin and stdout */
bool earlydbg; /* Early debug on stderr */
int inetd; /* Called from inetd? */ int inetd; /* Called from inetd? */
int force; /* Force call? */ int force; /* Force call? */
int hiddline; /* Hidden line number (0,1..) */ int hiddline; /* Hidden line number (0,1..) */
@@ -180,6 +181,8 @@ typedef struct {
*/ */
extern const char *BFERR[]; extern const char *BFERR[];
extern char * mainenv[];
int daemon_run(const char *confname, const char *incname, bool quit); int daemon_run(const char *confname, const char *incname, bool quit);
#endif #endif
+8 -1
View File
@@ -179,6 +179,8 @@ typedef enum {
cf_emsi_FR_time, cf_emsi_FR_time,
cf_emsi_OH_time, cf_emsi_OH_time,
cf_emsi_slave_sends_nak, cf_emsi_slave_sends_nak,
cf_emsi_send_tz,
cf_emsi_send_time,
cf_filebox, cf_filebox,
cf_filebox_directory, cf_filebox_directory,
cf_flags, cf_flags,
@@ -191,6 +193,10 @@ typedef enum {
cf_freq_limit_time, cf_freq_limit_time,
cf_freq_min_speed, cf_freq_min_speed,
cf_freq_srif_command, cf_freq_srif_command,
cf_incnet_flag,
cf_incarc_flag,
cf_inctic_flag,
cf_incfile_flag,
cf_hide_our_aka, cf_hide_our_aka,
cf_history_file, cf_history_file,
cf_hydra_options, cf_hydra_options,
@@ -237,6 +243,7 @@ typedef enum {
cf_password, cf_password,
cf_phone, cf_phone,
cf_phone_translate, cf_phone_translate,
cf_proto_order,
cf_recode_file_in, cf_recode_file_in,
cf_recode_file_out, cf_recode_file_out,
cf_recode_intro_in, cf_recode_intro_in,
@@ -347,7 +354,7 @@ void deinit_translate(s_translate *dest);
const char *conf_getconfname(void); const char *conf_getconfname(void);
int conf_postreadcheck(void); int conf_postreadcheck(void);
int conf_readpasswdlist(s_falist **pwdlist, char *fname); 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 #ifdef DEBUG
void log_overridelist(s_override *subst); void log_overridelist(s_override *subst);
void log_options(s_options *opt); 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 #ifdef DEBUG
# define D_CONFIG 0x0000001L #define D_CONFIG 0x0000001L
# define D_OVERRIDE 0x0000002L #define D_OVERRIDE 0x0000002L
# define D_EVENT 0x0000004L #define D_EVENT 0x0000004L
# define D_NODELIST 0x0000008L #define D_NODELIST 0x0000008L
# define D_OUTBOUND 0x0000010L #define D_OUTBOUND 0x0000010L
# define D_INFO 0x0000020L #define D_INFO 0x0000020L
# define D_HSHAKE 0x0000040L #define D_HSHAKE 0x0000040L
# define D_TTYIO 0x0000080L #define D_TTYIO 0x0000080L
# define D_MODEM 0x0000100L #define D_MODEM 0x0000100L
# define D_PROT 0x0000200L #define D_PROT 0x0000200L
# define D_FREQ 0x0000400L #define D_FREQ 0x0000400L
# define D_STATEM 0x0000800L #define D_STATEM 0x0000800L
# define D_DAEMON 0x0001000L #define D_DAEMON 0x0001000L
# define D_24554 0x0002000L #define D_24554 0x0002000L
# define D_FREE 0x0004000L #define D_FREE 0x0004000L
# define D_FULL 0xfffffffL #define D_FULL 0xfffffffL
#endif #endif
#ifdef DEBUG #ifdef DEBUG
# define DEB(what) debug what #define DEB(what) debug what
#else #else
# define DEB(what) #define DEB(what)
#endif #endif
const char *log_getfilename(int whatfor); const char *log_getfilename(int whatfor);
+1 -1
View File
@@ -19,7 +19,7 @@
#define EXEC_OPT_LOGOUT 0x04 #define EXEC_OPT_LOGOUT 0x04
#define EXEC_OPT_USESHELL 0x08 #define EXEC_OPT_USESHELL 0x08
#define EXEC_MAX_NUM_ENVS 40 #define EXEC_MAX_NUM_ENVS 4095
#define EXEC_MAX_NUM_ARGS 20 #define EXEC_MAX_NUM_ARGS 20
#define EXEC_DEFAULT_UMASK ~(S_IRUSR|S_IWUSR); #define EXEC_DEFAULT_UMASK ~(S_IRUSR|S_IWUSR);
+1
View File
@@ -44,6 +44,7 @@ typedef struct traffic {
int freqed_num; int freqed_num;
int freqed_time; int freqed_time;
size_t freqed_size; size_t freqed_size;
int ticfile_num;
} s_traffic; } s_traffic;
/* /*
+5 -1
View File
@@ -116,7 +116,10 @@ struct compcodes
ZAP:1, /* ZedZap (Zmodem variant) */ ZAP:1, /* ZedZap (Zmodem variant) */
DZA:1, /* DirectZAP (Zmodem variant) */ DZA:1, /* DirectZAP (Zmodem variant) */
JAN:1, /* Janus */ JAN:1, /* Janus */
HYD:1; /* Hydra */ HYD:1, /* Hydra */
KER:1, /* Kermit, not supported */
SLK:1, /* SEALink, not supported */
TZA:1; /* TrapDoor DirectZAP, not supported */
UINT16 FRQ:1, /* The system will accept and process FREQs */ UINT16 FRQ:1, /* The system will accept and process FREQs */
NRQ:1, /* No file requests accepted by this system */ NRQ:1, /* No file requests accepted by this system */
@@ -148,6 +151,7 @@ struct emsi
char passwd[EMSI_MAXPASSWD+1]; char passwd[EMSI_MAXPASSWD+1];
s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */ s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */
s_compcodes compcodes; s_compcodes compcodes;
char proto_order[EMSI_MAXADDONS+1];
char m_pid[EMSI_MAXMPID+1]; char m_pid[EMSI_MAXMPID+1];
char m_name[EMSI_MAXMNAME+1]; char m_name[EMSI_MAXMNAME+1];
char m_ver[EMSI_MAXMVER+1]; char m_ver[EMSI_MAXMVER+1];
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}