62 Commits
Author SHA1 Message Date
zx 7733d5d663 fx workflow 17
Archlinux build / build (push) Successful in 3m13s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 22:13:05 +03:00
zx 6a2320d922 fx workflow 16 2025-04-12 22:12:42 +03:00
zx 5f10b52c77 fx workflow 15
Archlinux build / build (push) Successful in 3m18s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:49:23 +03:00
zx 55fc94a95b fx workflow 14
Archlinux build / build (push) Failing after 24s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:40:39 +03:00
zx 1667d8a800 fx workflow 13
Archlinux build / build (push) Failing after 8s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:35:56 +03:00
zx 5eced105c8 fx workflow 12
Archlinux build / build (push) Failing after 38s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 19s
2025-04-12 21:32:20 +03:00
zx 7486b9c141 fx workflow 11
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 30s
2025-04-12 21:22:49 +03:00
zx 2fbe1d3e54 fx workflow 10
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 21:16:51 +03:00
zx fa8e081584 fx workflow 9
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17s
2025-04-12 21:09:10 +03:00
zx 981d4f00b3 fx workflow 8 2025-04-12 21:07:19 +03:00
zx 26ecb8b64c fx actions 7
Archlinux build / build (push) Failing after 1m17s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 15:49:58 +03:00
zx 526338f720 fx actions 6
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 23s
Archlinux build / build (push) Failing after 42s
2025-04-12 15:45:35 +03:00
zx 06f48fe1c1 fx actions 5
Archlinux build / build (push) Failing after 15s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 18s
2025-04-12 15:37:10 +03:00
zx 4767b57ec9 fx actions 4
Archlinux build / build (push) Failing after 16s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 21s
2025-04-12 15:32:47 +03:00
zx 8892e3f740 fx actions 3
Archlinux build / build (push) Failing after 9s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 20s
2025-04-12 15:30:13 +03:00
zx 21eeae69cc fx actions 2
Archlinux build / build (push) Failing after 7s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 0s
2025-04-12 15:26:21 +03:00
zx 9799f977b9 fx actions
Archlinux build / build (push) Failing after 4m46s
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s
2025-04-12 15:13:29 +03:00
zx 727f7cfdf3 Testing arch workflow 2
Archlinux build / build (push) Failing after 2s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m58s
2025-04-12 15:01:26 +03:00
zx 36747d9071 Testing arch workflow 2025-04-12 15:00:46 +03:00
zx 9fa59cacca fx demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 23s
2025-04-12 11:16:47 +03:00
zx b66dd2156c fx demo workflow 2025-04-12 11:14:05 +03:00
zx 80275d30d3 fx demo workflow 2025-04-12 11:11:51 +03:00
zx a62ae3afca fx demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3s
2025-04-12 11:08:28 +03:00
zx a9f98cdee9 fx demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m28s
2025-04-12 10:44:21 +03:00
zx 10d30223d1 Added demo workflow
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m51s
2025-04-12 10:25:35 +03:00
zx c5fc6e9245 added .gitea folder 2025-04-11 12:28:15 +03:00
zx 29000cfdd7 Fixes 2025-04-08 20:45:32 +03:00
zx de6ef3936b small fix checknodefalgs 2025-03-23 20:36:07 +03:00
zx 8db2ee4260 confread diag 2025-03-23 20:21:50 +03:00
zx 25081b1bae . 2025-03-22 22:50:53 +03:00
zx deaa8140f5 Fix binkp overrides 2025-03-22 21:52:08 +03:00
zx 7fb8e32a9b Ver 0.26 changelog 2025-03-20 21:28:39 +03:00
zx 235a6a3072 Ver 0.26 2025-03-20 18:40:08 +03:00
zx 4da486264b Fix unprotected handshake options 2025-03-20 18:37:19 +03:00
zx 25cfb143dc fix typo 2025-03-20 12:32:11 +03:00
zx 4e86852c41 Debug for decryption in passwordless transfer 2025-03-20 12:28:07 +03:00
zx 324b11aad7 test fix for binkp sz and call entry 2025-03-19 21:17:28 +03:00
zx 7fd0d85557 Larger debug of binkp state 2025-03-19 18:56:32 +03:00
zx 0cb9a2b2cf Added Archlinux PKGBUILD 2025-03-18 23:53:39 +03:00
zx 9bc3a14dd0 Version 0.25.3 Fixes for daemon mode, flags, nodelist index 2024-07-05 11:13:12 +03:00
zx abb1153cf3 small fix 2024-07-05 09:16:24 +03:00
zx 3f9d10e467 Fixed nodelist index for root zone nodes, added support for IBN:port 2024-07-04 23:05:23 +03:00
zx 46312ebc1b Fixed flag creation, added flags inctic_flag incfile_flag 2024-07-03 22:42:20 +03:00
zx 5ef2b09861 Added systemd and xinetd service files 2024-07-02 23:28:00 +03:00
zx f72259cfe3 mFix aarch64 binkp FSM 2024-07-02 23:17:07 +03:00
zx 73a3376a3d Fixed outgoing proto detection and order - as Direct, BinkP, Ifcico, Telnet, Modem first allowed to connect. You may change this order individually by override flags 2024-07-02 21:51:58 +03:00
zx 983440fc29 Changed version up to 0.25.3 2024-07-01 00:11:18 +03:00
zx 5a7bac039a Changed daemon mode tcpip priority (to be first in outbound calls), fixed daemon_call creating opts record, fixed working time for tcp nodes 2024-07-01 00:10:20 +03:00
zx bba77edecd mFix ipv6 2024-06-25 23:42:52 +03:00
zx 9aed37b92e IPv6 fixes for incoming inetd calls, minors from lint 2024-06-25 23:05:07 +03:00
zx 3526bc5ece Minor debug improvement 2024-06-24 23:23:24 +03:00
zx a1c93b8016 Fixed binkp read deadlock #2 on some arches (aarch64) 2024-06-22 22:56:49 +03:00
zx e6266e8eab Fixed another annoying binkp errors on aarch64 2024-06-22 21:59:22 +03:00
zx 34daba8a0e Fixed binkp deadlock on some arches (aarch64) 2024-06-22 21:28:07 +03:00
zx ea4e8c806f Fixes for binkp on aarch64 platform 2024-06-22 21:18:01 +03:00
zx 51034e6e59 Version 0.25.2: IPv6 outgoing added 2024-06-21 23:01:58 +03:00
zx 6235b78239 IPv6 outgoing connections added - initially 2024-06-21 23:00:29 +03:00
zx b3f2e1bfc6 Added tests for PSTN protocols, minor fixes, version 0.25.1 2024-06-09 15:29:39 +03:00
zx 75aececd6b Added test script for PSTN protocols 2024-06-09 15:27:55 +03:00
zx 7ad43e1e40 Timezone fix (calculation one-liner) 2024-06-08 17:03:33 +03:00
zx 0663d62be8 minor fixes of warnings and misspellings 2024-06-07 23:08:49 +03:00
zx ccf473515d minor timezone fix +/- 2024-05-29 23:18:56 +03:00
59 changed files with 1911 additions and 301 deletions
View File
+28
View File
@@ -0,0 +1,28 @@
name: Archlinux build
run-name: ${{ github.event.name}} building 🚀
on: [push]
jobs:
build:
runs-on: arch-latest
if: github.ref == 'refs/heads/zx'
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event.name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: Checking environment
continue-on-error: true
run: printenv
- name: Installing prerequisites - update pacman
run: pacman -Sy
- name: Installing prerequisites - install git
run: pacman --disable-sandbox --noconfirm -v -S git
- name: Downloading
continue-on-error: true
run: useradd -d ${{ gitea.basedir }}/builder -g users -m builder
- run: su - builder -c pwd
- run: su - builder -c "curl -O http://zxprj:3001/zx/bforce/raw/branch/${GITHUB_REF_NAME}/archlinux/bforce.install"
- run: su - builder -c "curl -o PKGBUILD http://zxprj:3001/zx/bforce/raw/branch/${GITHUB_REF_NAME}/archlinux/PKGBUILD.ci"
- run: su --w GITHUB_SHA,GITHUB_REF_NAME,GITHUB_REF_TYPE - builder -c makepkg
- run: echo "🍏 This job's status is ${{ github.state }}."
+20
View File
@@ -0,0 +1,20 @@
name: Gitea Actions Demo
run-name: $ is testing out Gitea Actions 🚀
on: [push]
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ gitea.event.name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ gitea.basedir }} && pwd
- run: printenv
- run: echo "🍏 This job's status is ${{ gitea.job.status }}."
-3
View File
@@ -7,6 +7,3 @@ source/config.log
source/config.status source/config.status
source/include/config.h source/include/config.h
bforce.geany bforce.geany
+25
View File
@@ -250,3 +250,28 @@ Alexey Khromov (zx@zxalexis.ru)
/etc/services line (as of abscence of latter) /etc/services line (as of abscence of latter)
+ Config example reworked to include new options + Config example reworked to include new options
+ New option: emsi_send_tz - to send TZUTC EMSI-handshake part. + New option: emsi_send_tz - to send TZUTC EMSI-handshake part.
0.25.1
+ Added testing script for PSTN comms (tests folder).
0.25.2
+ Adopted for outgoing IPv6 communication
0.25.3
+ Fixed IPv6 address logging in inetd connections
+ Fixed outgoing proto detection and order - as Direct, BinkP, Ifcico,
Telnet, Modem first allowed to connect. You may change this order
individually by override flags.
+ Daemon mode now tries to make outgoing tcp calls prior to modem
+ Daemon mode - fixed working time for tcp nodes (CM)
+ Fixed some x64 errors in comparisons to integers
+ Added systemd and xinetd service files to contrib folder
+ Fixed flag files creation
+ Added flags for TIC files (inctic_flag) and files (incfile_flag)
+ Fixed nodelist index creation
+ Added support for TCP port description in IBN/IFC/ITN flags
0.26
+ Fixed incorrect binkp protocol realization in unprotected sessions.
+ Fixed binkp override appliance in incoming handshake
+1 -1
View File
@@ -46,7 +46,7 @@ The simplest way to compile this package is:
Compilers and Options Compilers and Options
===================== =====================
Some systems require unusual options for compilation or linking that Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure' the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using initial values for variables by setting them in the environment. Using
+20 -3
View File
@@ -1,10 +1,26 @@
BinkleyForce FTN mailer BinkleyForce FTN mailer
----------------------- -----------------------
BinkleyForce is a simple ifcico like FTN mailer. It can works via BinkleyForce is a simple ifcico like FTN mailer. It can work via
TCP/IP as well as on modem links. Look sample configs for more TCP/IP as well as on modem links. Look sample configs for more
information. information.
Supported Features
------------------
- PSTN dial-out with EMSI-II/EMSI/YooHoo handshake
- PSTN protocols: Hydra, ZedZap, ZModem
- PSTN dial-in through mgetty
- TCP/IP dial-out through IPv4 and IPv6 networks
- TCP/IP protocols - ifcico / BinkP 1.1
- TCP/IP dial-in through xinetd/inetd
- Daemon mode for outbound queue managing
Linux 2.4.11+, FreeBSD (6+ AFAIR) compatible.
Licence
-------
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option) the Free Software Foundation; either version 2, or (at your option)
@@ -12,8 +28,9 @@ any later version. See the COPYING file for further information.
Known Bugs Known Bugs
---------- ----------
- BinkD use and expect local file time at BinkP sessions, but - BinkleyForce has no support (yet) for multiple INA: addresses
BinkleyForce always use UTC time (?) - Can not rotate hidden lines
- Can not rotate supported IP protocols in case of failure
Bug Reports Bug Reports
----------- -----------
+57
View File
@@ -0,0 +1,57 @@
pkgname=bforce
pkgver=r235.a1c93b8
pkgrel=1
pkgdesc="binkleyforce FTN mailer"
arch=('i686' 'x86_64' 'aarch64')
url="https://prj.zxalexis.ru/gitea/zx/bforce/"
license=('GPL2')
source=(
"${pkgname}::git+https://prj.zxalexis.ru/gitea/zx/bforce.git"
)
makedepends=('git' 'gcc' 'make' 'glibc')
provides=('bforce')
build() {
cd "${srcdir}/${pkgname}/source"
./configure --prefix=/ --disable-syslog --with-owner=fido --with-group=uucp
make
}
prepare() {
cd "${pkgname}"
printf "$( pwd )\n"
}
pkgver() {
cd "$pkgname"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
package() {
cd ${pkgdir}
mkdir -p ${pkgdir}/etc
mkdir -p ${pkgdir}/usr/bin
mkdir -p ${pkgdir}/usr/local/bin
mkdir -p ${pkgdir}/usr/share/doc/bforce
mkdir -p ${pkgdir}/var/log/bforce
mkdir -p ${pkgdir}/var/spool/bforce
mkdir -p ${pkgdir}/var/spool/bforce/bt/in
mkdir -p ${pkgdir}/var/spool/bforce/bt/pin
mkdir -p ${pkgdir}/var/spool/bforce/bt/out
mkdir -p ${pkgdir}/var/spool/bforce/ndl
mkdir -p ${pkgdir}/var/spool/bforce/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bforce ${pkgdir}/usr/bin/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfindex ${pkgdir}/usr/bin/bfindex
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfstat ${pkgdir}/usr/bin/bfstat
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/nlookup ${pkgdir}/usr/bin/nlookup
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.conf ${pkgdir}/etc/bforce.conf.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.subst ${pkgdir}/etc/bforce.subst.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.passwd ${pkgdir}/etc/bforce.passwd.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.aliases ${pkgdir}/etc/freq.aliases.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.dirs ${pkgdir}/etc/freq.dirs.sample
/usr/bin/install -c ${srcdir}/${pkgname}/contrib/outman ${pkgdir}/usr/local/bin/outman
echo "Please, edit /usr/local/bin/outman"
cp ${srcdir}/${pkgname}/docs/* ${pkgdir}/usr/share/doc/bforce/
}
sha256sums=('SKIP')
+58
View File
@@ -0,0 +1,58 @@
pkgname=bforce
pkgver=r235.a1c93b8
pkgrel=1
pkgdesc="binkleyforce FTN mailer"
arch=('i686' 'x86_64' 'aarch64')
url="https://prj.zxalexis.ru/gitea/zx/bforce/"
license=('GPL2')
source=(
"${pkgname}::git+https://prj.zxalexis.ru/gitea/${GITHUB_REF_NAME}/bforce.git"
)
makedepends=('git' 'gcc' 'make' 'glibc')
provides=('bforce')
build() {
cd "${srcdir}/${pkgname}/source"
./configure --prefix=/ --disable-syslog --with-owner=fido --with-group=uucp
make
}
prepare() {
cd "${pkgname}"
git checkout "${GITHUB_SHA}"
printf "$( pwd )\n"
}
pkgver() {
cd "$pkgname"
printf "r%s.%s.%s" "$(git rev-list --count ${GITHUB_SHA})" "$(git rev-parse --short ${GITHUB_SHA})" "${GITHUB_REF_NAME}"
}
package() {
cd ${pkgdir}
mkdir -p ${pkgdir}/etc
mkdir -p ${pkgdir}/usr/bin
mkdir -p ${pkgdir}/usr/local/bin
mkdir -p ${pkgdir}/usr/share/doc/bforce
mkdir -p ${pkgdir}/var/log/bforce
mkdir -p ${pkgdir}/var/spool/bforce
mkdir -p ${pkgdir}/var/spool/bforce/bt/in
mkdir -p ${pkgdir}/var/spool/bforce/bt/pin
mkdir -p ${pkgdir}/var/spool/bforce/bt/out
mkdir -p ${pkgdir}/var/spool/bforce/ndl
mkdir -p ${pkgdir}/var/spool/bforce/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bforce ${pkgdir}/usr/bin/bforce
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfindex ${pkgdir}/usr/bin/bfindex
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/bfstat ${pkgdir}/usr/bin/bfstat
/usr/bin/install -c ${srcdir}/${pkgname}/source/bin/nlookup ${pkgdir}/usr/bin/nlookup
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.conf ${pkgdir}/etc/bforce.conf.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.subst ${pkgdir}/etc/bforce.subst.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/bforce.passwd ${pkgdir}/etc/bforce.passwd.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.aliases ${pkgdir}/etc/freq.aliases.sample
/usr/bin/install -c -m 644 ${srcdir}/${pkgname}/examples/freq.dirs ${pkgdir}/etc/freq.dirs.sample
/usr/bin/install -c ${srcdir}/${pkgname}/contrib/outman ${pkgdir}/usr/local/bin/outman
echo "Please, edit /usr/local/bin/outman"
cp ${srcdir}/${pkgname}/docs/* ${pkgdir}/usr/share/doc/bforce/
}
sha256sums=('SKIP')
+7
View File
@@ -0,0 +1,7 @@
post_install() {
chmod
}
post_upgrade() {
post_install
}
+3 -3
View File
@@ -10,10 +10,10 @@
# These files are considered legacy and are unnecessary on legacy-free # These files are considered legacy and are unnecessary on legacy-free
# systems. # systems.
d /run/lock 0777 root lock - z /run/lock 0777 root lock -
L /var/lock - - - - ../run/lock z /var/lock 0777 root lock - ../run/lock
# /run/lock/subsys is used for serializing SysV service execution, and # /run/lock/subsys is used for serializing SysV service execution, and
# hence without use on SysV-less systems. # hence without use on SysV-less systems.
d /run/lock/subsys 0775 root lock - z /run/lock/subsys 0775 root lock -
+92
View File
@@ -0,0 +1,92 @@
#!/bin/sh
# Directories and static values
DEFZONE=2
# Default outbound
# OUTBOUND="."
# Our AKA
# AKA="2:5030/723@fidonet"
# FLO Extension
FLOEXT="dlo"
# BFCONFIG=/opt/fidonms/etc/bforce.conf
if [ "${BFCONFIG}" == "" ]; then
BFCONF="/etc/bforce/bforce.conf"
else
BFCONF=${BFCONFIG}
fi
if [ "$1" == "" ]; then
echo "No FTN provided. Usage: mkpoll <address>"
exit 1
fi
# Address to create poll
FTNA=$1
# Outbound address
OUTB=""
if [ -f "${BFCONF}" ]; then
# We have config!
OUTB=$(grep -E "^outbound_directory" ${BFCONF} | awk '{print $2}')
else
OUTB=${OUTBOUND}
fi
#echo "FTNA: ${FTNA} OUTB: ${OUTB}"
FZONE=$(echo -n ${FTNA}| awk -F':' '{print $1}')
FNET=$(echo -n ${FTNA} | awk -F':' '{print $2}' | awk -F'/' '{ print $1 }')
FNODE=$(echo -n ${FTNA}| awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $1 }')
FPNT=$(echo -n ${FTNA} | awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $2 }')
FDOM=$(echo -n ${FTNA} | awk -F'@' '{print $2}')
# echo "Dest ZONE: ${FZONE}, NET: ${FNET}, NODE: ${FNODE}, PNT: ${FPNT} DOM: ${FDOM}"
# Our AKA
FAKA=""
if [ -f "${BFCONF}" ]; then
# We have config!
FAKA=$(grep -E "^address" ${BFCONF} | awk '{print $2}')
else
FAKA=${AKA}
fi
AZONE=$(echo -n ${FAKA}| awk -F':' '{print $1}')
ANET=$(echo -n ${FAKA} | awk -F':' '{print $2}' | awk -F'/' '{ print $1 }')
ANODE=$(echo -n ${FAKA}| awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $1 }')
APNT=$(echo -n ${FAKA} | awk -F'/' '{print $2}' | awk -F'@' '{ print $1 }'| awk -F'.' '{ print $2 }')
ADOM=$(echo -n ${FAKA} | awk -F'@' '{print $2}')
# echo "Our ZONE: ${AZONE}, NET: ${ANET}, NODE: ${ANODE}, PNT: ${APNT} DOM: ${ADOM}"
FTNB=$( printf "%04x%04x" ${FNET} ${FNODE} )
if [ "${FPNT}" == "" ]; then
FPNT="0"
fi
FFLO=""
if [ "${AZONE}" == "${FZONE}" ] && [ "${FNET}" == "${ANET}" ] && [ "${FNODE}" == "${ANODE}" ] && [ ! "${FPNT}" == "0" ]; then
# echo "Point operations!"
FLOFIL=$( printf "%08x.${FLOEXT}" ${FPNT} )
PNTDIR=$( echo -n "${OUTB}/${FTNB}.pnt")
FFLO=$( echo -n "${PNTDIR}/${FLOFIL}" )
elif [ ! "${DEFZONE}" == "${FZONE}" ]; then
# Interzonal poll
FLOFIL=$( echo -n "${FTNB}.${FLOEXT}" )
FDIR=$( printf "%03x" ${FZONE} )
FFLO=$( echo -n "${OUTB}.${FDIR}/${FLOFIL}" )
else
# Normal in-zone poll
FLOFIL=$( echo -n "${FTNB}.${FLOEXT}" )
FFLO=$( echo -n "${OUTB}/${FLOFIL}" )
fi
# echo "FloFile: ${FFLO}"
if [ ! -f "${FFLO}" ]; then
touch "${FFLO}"
fi
+13
View File
@@ -0,0 +1,13 @@
[Unit]
Description=Binkleyforce Outbound server
[Service]
Type=forking
PIDFile=/tmp/bforce.pid
User=fido
Group=fido
ExecStart=/usr/bin/bforce -d -C /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
}
+5
View File
@@ -103,6 +103,11 @@ nodial_flag /etc/nodial
#incnet_flag /var/spool/fido/flags/mail #incnet_flag /var/spool/fido/flags/mail
# Arcmail: # Arcmail:
#incarc_flag /var/spool/fido/flags/echo #incarc_flag /var/spool/fido/flags/echo
# FileEcho TIC
#inctic_flag /var/spool/fido/flags/tick
# Regular file recieve
#incfile_flag /var/spool/fido/flags/alert
# #
# Inbound directories # Inbound directories
View File
View File
View File
View File
View File
+1 -1
View File
@@ -1 +1 @@
0.25 0.26
+11 -5
View File
@@ -19,11 +19,15 @@
s_cval_entry *conf_first(bforce_config_keyword keyword) s_cval_entry *conf_first(bforce_config_keyword keyword)
{ {
s_cval_entry *ptrl; s_cval_entry *ptrl;
DEB((D_CONFIG, "conf_first entry nr %d",(int16_t)keyword));
for( ptrl = bforce_config[keyword].data; ptrl; ptrl = ptrl->next ) for( ptrl = bforce_config[keyword].data; ptrl; ptrl = ptrl->next )
if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) {
DEB((D_CONFIG, "conf_first ptrl found"));
return ptrl; return ptrl;
}
DEB((D_CONFIG, "conf_first ptrl not found"));
return NULL; return NULL;
} }
@@ -32,9 +36,11 @@ s_cval_entry *conf_next(s_cval_entry *ptrl)
ASSERT(ptrl); ASSERT(ptrl);
for( ptrl = ptrl->next; ptrl; ptrl = ptrl->next ) for( ptrl = ptrl->next; ptrl; ptrl = ptrl->next )
if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) if( !ptrl->expr.expr || eventexpr(&ptrl->expr) ) {
DEB((D_CONFIG, "conf_next ptrl found"));
return ptrl; return ptrl;
}
DEB((D_CONFIG, "conf_next ptrl not found"));
return NULL; return NULL;
} }
@@ -91,7 +97,7 @@ long conf_number(bforce_config_keyword keyword)
s_override *conf_override(bforce_config_keyword keyword, s_faddr addr) s_override *conf_override(bforce_config_keyword keyword, s_faddr addr)
{ {
s_cval_entry *ptrl; s_cval_entry *ptrl;
DEB((D_CONFIG, "conf_override entry"));
for( ptrl = conf_first(keyword); ptrl; ptrl = conf_next(ptrl) ) for( ptrl = conf_first(keyword); ptrl; ptrl = conf_next(ptrl) )
if( !ftn_addrcomp(ptrl->d.override.addr, addr) ) if( !ftn_addrcomp(ptrl->d.override.addr, addr) )
return &ptrl->d.override; return &ptrl->d.override;
+2
View File
@@ -100,6 +100,8 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(freq_srif_command, CT_STRING), CONF_KEY(freq_srif_command, CT_STRING),
CONF_KEY(incnet_flag, CT_STRING), CONF_KEY(incnet_flag, CT_STRING),
CONF_KEY(incarc_flag, CT_STRING), CONF_KEY(incarc_flag, CT_STRING),
CONF_KEY(inctic_flag, CT_STRING),
CONF_KEY(incfile_flag, CT_STRING),
CONF_KEY(hide_our_aka, CT_ADDRESS), CONF_KEY(hide_our_aka, CT_ADDRESS),
CONF_KEY(history_file, CT_STRING), CONF_KEY(history_file, CT_STRING),
CONF_KEY(hydra_options, CT_OPTIONS), CONF_KEY(hydra_options, CT_OPTIONS),
+52 -7
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;
@@ -1010,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));
} }
+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;
+75 -24
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; }
@@ -125,16 +153,32 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
port = "telnet"; port = "telnet";
else /* Can not rely on /etc/services - it is not well-known port */ else /* Can not rely on /etc/services - it is not well-known port */
port = "60179"; 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)
+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)
+7 -1
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;
+20 -10
View File
@@ -56,17 +56,24 @@ int nodelist_checkflag(const char *nodeflags, const char *flag)
const char *searchbase = nodeflags; const char *searchbase = nodeflags;
char *q; char *q;
while( p = strstr(searchbase, flag) ) DEB((D_NODELIST, "nodelist: checking flag \"%s\" in flags \"%s\"", flag, nodeflags));
{ if ( nodeflags ) {
if( p == searchbase || *(p-1) == ',' ) while( p = strcasestr(searchbase, flag) ) // p - found flag
{ {
if( (q = strchr(p, ',')) == NULL || (q - p) == strlen(flag) ) if( (p == searchbase) || (p != searchbase && *(p-1) == ',') )
return 0; {
if( (strchrnul(p, ':') - p) == strlen(flag) ) if( (q = strchr(p, ',')) == NULL || (q - p) == strlen(flag) ) {
return 0; DEB((D_NODELIST, "nodelist: found flag %s", flag));
} return 0;
}
if( (strchrnul(p, ':') - p) == strlen(flag) ) {
DEB((D_NODELIST, "nodelist: found flag %s", flag));
return 0;
}
}
searchbase = p + 1; // avoid finding again the same searchbase = p + 1; // avoid finding again the same
}
} }
return 1; return 1;
@@ -243,7 +250,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 +298,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;
} }
+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;
} }
+93 -51
View File
@@ -95,12 +95,12 @@ int binkp_loop(s_binkp_state *bstate) {
bstate->emptyloop = 0; bstate->emptyloop = 0;
bstate->continuesend = false; bstate->continuesend = false;
unsigned short read_pos=0; uint16_t read_pos=0;
unsigned short read_blklen=0; uint16_t read_blklen=0;
unsigned short want_read=BINKP_HEADER; uint16_t want_read=BINKP_HEADER;
unsigned short write_pos=0; uint16_t write_pos=0;
unsigned short have_to_write=0; uint16_t have_to_write=0;
int n, m; int n, m;
bool no_more_to_send = false; bool no_more_to_send = false;
@@ -124,7 +124,7 @@ int binkp_loop(s_binkp_state *bstate) {
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));
@@ -140,6 +140,7 @@ int binkp_loop(s_binkp_state *bstate) {
return PRC_ERROR; return PRC_ERROR;
} }
writebuf[1] = block_length&0xff; writebuf[1] = block_length&0xff;
// TODO: FIX unprotected mode
if (bstate->mode==bmode_transfer && bstate->remote_data->options&BINKP_OPT_CRYPT) if (bstate->mode==bmode_transfer && bstate->remote_data->options&BINKP_OPT_CRYPT)
encrypt_buf(writebuf, have_to_write, bstate->remote_data->keys_out); encrypt_buf(writebuf, have_to_write, bstate->remote_data->keys_out);
} }
@@ -209,15 +210,19 @@ int binkp_loop(s_binkp_state *bstate) {
log("read: remote socket shutdown"); log("read: remote socket shutdown");
return PRC_REMOTEABORTED; return PRC_REMOTEABORTED;
} }
if (bstate->mode==bmode_transfer && bstate->remote_data->options & BINKP_OPT_CRYPT) // TODO: FIX unprotected mode
if (bstate->mode==bmode_transfer && bstate->remote_data->options & BINKP_OPT_CRYPT) {
decrypt_buf(readbuf+read_pos, n, bstate->remote_data->keys_in); decrypt_buf(readbuf+read_pos, n, bstate->remote_data->keys_in);
} else {
DEB((D_24554,"binkp: not encripted transfer"));
};
DEB((D_24554, "got %d bytes", n)); DEB((D_24554, "got %d bytes", n));
want_read -= n; want_read -= n;
read_pos += n; read_pos += n;
if (read_pos == BINKP_HEADER) { if (read_pos == BINKP_HEADER) {
// have read header, want read body // have read header, want read body
DEB((D_24554, "it should be 0: %d", want_read)); DEB((D_24554, "it should be 0: %d", want_read));
want_read = ((unsigned short)(readbuf[0]&0x7F)<<8) | readbuf[1]; want_read = ((uint16_t)(readbuf[0]&0x7F)<<8) | (uint16_t)readbuf[1];
DEB((D_24554, "got block header, block length %u", want_read)); DEB((D_24554, "got block header, block length %u", want_read));
} // no else here: if want_read may be zero here for zero length block } // no else here: if want_read may be zero here for zero length block
} }
@@ -228,6 +233,7 @@ int binkp_loop(s_binkp_state *bstate) {
block_length = read_pos - BINKP_HEADER; block_length = read_pos - BINKP_HEADER;
DEB((D_24554, "binkp: complete block is received %d %hu", block_type, block_length)); DEB((D_24554, "binkp: complete block is received %d %hu", block_type, block_length));
m = binkp_doreceiveblock(bstate, readbuf+BINKP_HEADER, block_type, block_length); m = binkp_doreceiveblock(bstate, readbuf+BINKP_HEADER, block_type, block_length);
DEB((D_24554, "binkp: dorecieveblock result is %d", m));
if(m==1) { if(m==1) {
DEB((D_24554, "block is successfully accepted")); DEB((D_24554, "block is successfully accepted"));
read_pos = 0; read_pos = 0;
@@ -340,7 +346,7 @@ 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 cmd to remote %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);
@@ -419,6 +425,7 @@ case 7:
// seems not to remove files from inbound until successful session end is enough to eliminate dupes // seems not to remove files from inbound until successful session end is enough to eliminate dupes
// if (!nodelist_checkflag (state.node.flags, "ND")) // if (!nodelist_checkflag (state.node.flags, "ND"))
// strcat(buf+1, " ND"); // strcat(buf+1, " ND");
// TODO: add GZ BZ2 and maybe EXTCMD
*block_length = 1 + strlen(buf+1); *block_length = 1 + strlen(buf+1);
DEB((D_24554, "send M_NUL %s", buf+1)); DEB((D_24554, "send M_NUL %s", buf+1));
return 1; return 1;
@@ -516,27 +523,47 @@ case 3: // send password on outgoing or pw confirmation on incoming
case 4: case 4:
char *p;
char pbuf[32];
int pwset = 0;
if (bstate->mode==bmode_incoming_handshake) { if (bstate->mode==bmode_incoming_handshake) {
DEB((D_24554, "incoming handshake is complete")); DEB((D_24554, "incoming handshake is complete"));
bstate->complete = true; bstate->complete = true;
char *p;
char pbuf[32];
for (i=0;i<state.n_remoteaddr;i++) for (i=0;i<state.n_remoteaddr;i++)
if( !session_get_password(state.remoteaddrs[i].addr, pbuf, sizeof(pbuf)) ){ if( !session_get_password(state.remoteaddrs[i].addr, pbuf, sizeof(pbuf)) ){
pwset = 1;
init_keys(bstate->remote_data->keys_in, pbuf?pbuf:"-"); init_keys(bstate->remote_data->keys_in, pbuf?pbuf:"-");
init_keys(bstate->remote_data->keys_out, "-"); init_keys(bstate->remote_data->keys_out, "-");
for (p=pbuf?pbuf:"-"; *p; p++) for (p=pbuf?pbuf:"-"; *p; p++)
update_keys(bstate->remote_data->keys_out, (int)*p); update_keys(bstate->remote_data->keys_out, (int)*p);
} }
//TODO: FIX incoming options
} }
else { else {
//TODO: Fix outgoing options
DEB((D_24554, "outgoing handshake: everything is sent")); DEB((D_24554, "outgoing handshake: everything is sent"));
for (i=0;i<state.n_remoteaddr;i++)
if( !session_get_password(state.remoteaddrs[i].addr, pbuf, sizeof(pbuf)) ){
pwset = 1;
}
} }
// We have password-protected link. Remote options are already set,
// Now we determine how to CRYPT or not to CRYPT our file transfer
// Our CRYPT flag is always sent, so if the other side have CRYPT
// and link is password is set - The CRYPT must be
// Literally: if we have no pass -> drop the CRYPT flag
if ( !pwset ) {
DEB((D_24554, "binkp handshake: password NOT set, dropping CRYPT"));
bstate->remote_data->options &= !BINKP_OPT_CRYPT;
}
return 2; return 2;
} }
} }
else if (bstate->mode == bmode_transfer) { else if (bstate->mode == bmode_transfer) {
switch (bstate->phase) { switch (bstate->phase) {
send_next_file: send_next_file:
@@ -651,7 +678,10 @@ bstate->extracmd[0] = BPMSG_ERR; strcpy(bstate->extracmd+1, msg); bstate->extrai
int binkp_doreceiveblock(s_binkp_state *bstate, char *buf, int block_type, unsigned short block_length) int binkp_doreceiveblock(s_binkp_state *bstate, char *buf, int block_type, unsigned short block_length)
{ {
DEB((D_24554, "dorecieveblock_type: %d", block_type));
DEB((D_24554, "dorecieveblock_bytes: %x %x %x %x", buf[0], buf[1], buf[2], buf[3]));
switch (block_type) { switch (block_type) {
case BINKP_BLK_CMD: case BINKP_BLK_CMD:
if (block_length<1) { if (block_length<1) {
PROTO_ERROR("Zero length command received") PROTO_ERROR("Zero length command received")
@@ -668,12 +698,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;
@@ -687,14 +717,17 @@ case BPMSG_ADR: /* List of addresses */
bstate->extraislast = false; bstate->extraislast = false;
sprintf(bstate->extracmd+1,"OPT MB CRYPT"); sprintf(bstate->extracmd+1,"OPT MB CRYPT");
s_override ovr; s_override ovr;
DEB((D_24554, "process adr overrides"));
for(i = 0; i < state.n_remoteaddr; i++) { for(i = 0; i < state.n_remoteaddr; i++) {
ovr.sFlags = ""; ovr.sFlags = "";
override_get (&ovr, state.remoteaddrs[i].addr, 0); override_get (&ovr, state.remoteaddrs[i].addr, 0);
DEB((D_24554, "got adr overrides"));
if (nodelist_checkflag (ovr.sFlags, "NR")==0) { if (nodelist_checkflag (ovr.sFlags, "NR")==0) {
strcat (bstate->extracmd+1, " NR"); strcat (bstate->extracmd+1, " NR");
break; break;
} }
} }
DEB((D_24554, "process adr overrides"));
} }
// further use extracmd only for errors // further use extracmd only for errors
@@ -740,7 +773,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;
@@ -749,7 +782,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;
@@ -770,6 +803,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;
@@ -786,9 +820,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;
} }
@@ -798,7 +832,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) {
@@ -844,7 +878,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;
@@ -954,7 +988,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"));
@@ -1044,14 +1078,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);
@@ -1080,28 +1114,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;
} }
@@ -1140,7 +1179,7 @@ void binkp_process_NUL(s_binkp_sysinfo *remote_data, char *buffer)
} }
else else
strnxcpy(remote_data->opt, buffer+4, sizeof(remote_data->opt)); strnxcpy(remote_data->opt, buffer+4, sizeof(remote_data->opt));
DEB((D_24554,"Process OPT"));
binkp_parse_options(remote_data, buffer+4); binkp_parse_options(remote_data, buffer+4);
} }
else if( strncmp(buffer, "VER ", 4) == 0 ) else if( strncmp(buffer, "VER ", 4) == 0 )
@@ -1181,13 +1220,16 @@ void binkp_process_ADR(char *buffer)
{ {
s_faddr addr; s_faddr addr;
char *p, *q; char *p, *q;
DEB((D_24554, "process ADR: %s", buffer));
for( p = string_token(buffer, &q, NULL, 0); p; p = string_token(NULL, &q, NULL, 0) ) for( p = string_token(buffer, &q, NULL, 0); p; p = string_token(NULL, &q, NULL, 0) )
{ {
DEB((D_24554, "binkp_process_ADR got token \"%s\" ",p ));
if( ftn_addrparse(&addr, p, FALSE) ) if( ftn_addrparse(&addr, p, FALSE) )
log("BinkP got unparsable address \"%s\"", string_printable(p)); log("BinkP got unparsable address \"%s\"", string_printable(p));
else else {
session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr); session_addrs_add(&state.remoteaddrs, &state.n_remoteaddr, addr);
DEB((D_24554, "process ADR complete"));
}
} }
} }
+1 -1
View File
@@ -304,7 +304,7 @@ void binkp_set_sysinfo(s_binkp_sysinfo *binkp, s_faddr *remote_addr, bool caller
void binkp_parse_options(s_binkp_sysinfo *binkp, char *options) void binkp_parse_options(s_binkp_sysinfo *binkp, char *options)
{ {
char *p, *n; char *p, *n;
DEB((D_24554,"binkp: parse_options: %s", options));
for( p = string_token(options, &n, NULL, 0); p; for( p = string_token(options, &n, NULL, 0); p;
p = string_token(NULL, &n, NULL, 0) ) p = string_token(NULL, &n, NULL, 0) )
{ {
+5
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;
+22 -12
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;
@@ -74,18 +82,20 @@ int answ_system(e_session type, char *connstr, int inetd)
log("Answering TCPIP call..."); 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));
} }
} }
+103 -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 = 0;
int resflg;
/* /*
* Set verbal line name to "tcpip" value * Set verbal line name to "tcpip" value
*/ */
memset(abuf, '\0', BF_MAXADDRSTR+1);
target = xmalloc(1024);
memset(target, '\0', 1024);
state.linename = xstrcpy("tcpip"); state.linename = xstrcpy("tcpip");
state.inet = TRUE; state.inet = TRUE;
@@ -502,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,46 @@ 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 = 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 +578,7 @@ defalt:
{ {
rc = BFERR_CANT_CONNECT10; rc = BFERR_CANT_CONNECT10;
} }
free(pbuf);
return rc; return rc;
} }
@@ -543,7 +589,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
char s[300]; char s[300];
snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point ); snprintf(s, 299, "bforce calling system %d:%d/%d.%d", addr.zone, addr.net, addr.node, addr.point );
log(s); log(s);
DEB((D_EVENT, s));
// find suitable way of connection and try to make session // find suitable way of connection and try to make session
int rc = 0; int rc = 0;
@@ -568,12 +614,13 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
state.listed = state.node.listed; state.listed = state.node.listed;
//DEB((D_EVENT, "Calling init, listed=%d", state.listed));
state.node.addr.domain[0] = '\0'; /* Discard domain for node address */ state.node.addr.domain[0] = '\0'; /* Discard domain for node address */
// 1. If call method specified in cmdline, do use it // 1. If call method specified in cmdline, do use it
// 2. If not, use nodelist data and overrides and call all available methods // 2. If not, use nodelist data and overrides and call all available methods
// If override contains Phone or IP flags, ignore nodelist connect methods (but save INA if not overrided) // If override contains Phone or IP flags, ignore nodelist connect methods (but save INA if not overrided)
DEB((D_EVENT, "Calling init, runmode=%d", opts->runmode));
// 1st - get all allowed call ways // 1st - get all allowed call ways
// 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support) // 2nd - gather information reqired to call and remove unavailable ways (no info, node does not support)
@@ -581,7 +628,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( opts->runmode == MODE_CALL_DEFAULT ) if( opts->runmode == MODE_CALL_DEFAULT )
{ {
call_mayuse = CALL_MODEM | CALL_TCPIP_ANY; call_mustuse = CALL_MODEM | CALL_TCPIP_ANY;
} }
else if( opts->runmode == MODE_CALL_STDIO ) else if( opts->runmode == MODE_CALL_STDIO )
{ {
@@ -593,7 +640,14 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
else if( opts->runmode == MODE_CALL_IP ) else if( opts->runmode == MODE_CALL_IP )
{ {
if( strcasecmp(opts->ipproto, "binkp") == 0 ) DEB((D_EVENT, "Calling init, MODE_CALL_IP"));
if( !(opts->ipproto) ) // determine from nodelist/override
{
DEB((D_EVENT, "ipproto not set"));
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else if( strcasecmp(opts->ipproto, "binkp") == 0 )
{ {
call_mustuse = CALL_TCPIP_BINKP; call_mustuse = CALL_TCPIP_BINKP;
} }
@@ -605,20 +659,17 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
call_mustuse = CALL_TCPIP_TELNET; call_mustuse = CALL_TCPIP_TELNET;
} }
else if( opts->ipproto == NULL ) // determine from nodelist/override
{
call_mayuse = CALL_TCPIP_ANY;
call_mustuse = 0;
}
else else
{ {
DEB((D_EVENT, "Unknown protocol %s", opts->ipproto));
log("Unknown protocol"); log("Unknown protocol");
return -1; return -1;
} }
} }
else else
{ {
log("Unknown protocol"); DEB((D_EVENT, "Unknown runmode %d", opts->runmode));
log("Unknown runmode");
return -1; return -1;
} }
@@ -627,9 +678,10 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
//char s[300]; //char s[300];
//snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse); //snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse);
//log(s); //log(s);
//DEB((D_EVENT, s));
if( call_mayuse & CALL_MODEM ) if( (call_mayuse & CALL_MODEM) )
{ {
// 1. use phone from opts // 1. use phone from opts
// 2. use overrides // 2. use overrides
@@ -650,7 +702,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
log("bad phone, excluding modem"); log("bad phone, excluding modem");
call_mayuse &= ~CALL_MODEM; call_mayuse &= ~CALL_MODEM;
if( call_mustuse & CALL_MODEM ) if( !(call_mayuse) )
{ {
errmsg = "don't know phone number"; errmsg = "don't know phone number";
gotoexit(BFERR_PHONE_UNKNOWN); gotoexit(BFERR_PHONE_UNKNOWN);
@@ -684,7 +736,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
{ {
call_mayuse &= ~CALL_MODEM; call_mayuse &= ~CALL_MODEM;
log("bad worktime, excluding modem"); log("bad worktime, excluding modem");
if( call_mustuse & CALL_MODEM ) if( !(call_mayuse) )
{ {
errmsg = "not works now, try later"; errmsg = "not works now, try later";
gotoexit(BFERR_NOTWORKING); gotoexit(BFERR_NOTWORKING);
@@ -693,9 +745,9 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
} }
// snprintf(s, 299, "after phone check: may use %d must use %d", call_mayuse, call_mustuse); //snprintf(s, 299, "after phone check: may use %d must use %d", call_mayuse, call_mustuse);
// log(s); //log(s);
//DEB((D_EVENT, s));
/* /*
* Apply overrides to the node information * Apply overrides to the node information
*/ */
@@ -714,7 +766,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( !(call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) ) if( !(call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) )
{ {
if( nodelist_checkflag(state.node.flags, "BINKP") != 0 && nodelist_checkflag(state.node.flags, "IBN") != 0 ) //if( nodelist_checkflag(state.node.flags, "BINKP") != 0 && nodelist_checkflag(state.node.flags, "IBN") != 0 )
if( state.node.do_binkp == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_BINKP; call_mayuse &= ~CALL_TCPIP_BINKP;
} }
@@ -722,7 +775,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( !(call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) ) if( !(call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) )
{ {
if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 ) //if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 )
if( state.node.do_ifcico == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_IFCICO; call_mayuse &= ~CALL_TCPIP_IFCICO;
} }
@@ -730,7 +784,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( !(call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) ) if( !(call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) )
{ {
if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 ) //if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 )
if( state.node.do_telnet == 0 )
{ {
call_mayuse &= ~CALL_TCPIP_TELNET; call_mayuse &= ~CALL_TCPIP_TELNET;
} }
@@ -746,7 +801,12 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
state.override.sIpaddr, sizeof(state.node.host)); state.override.sIpaddr, sizeof(state.node.host));
} }
if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(state.node.host) ) { //DEB((D_EVENT, "Calling init, IPHOST", state.node.host));
// We have at least one protocol and not valid address - try to
// find INA with through Fidonet DNS
if( (call_mayuse & CALL_TCPIP_ANY) && !tcpip_isgood_host(state.node.host) )
{
char *fidodnszone = conf_string(cf_fidodnszone); char *fidodnszone = conf_string(cf_fidodnszone);
if (fidodnszone) { if (fidodnszone) {
if (addr.point) { if (addr.point) {
@@ -761,17 +821,21 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
} }
} }
if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(state.node.host) ) // We have no valid tcpip protocols OR not valid address
if( !(call_mayuse & CALL_TCPIP_ANY) || !tcpip_isgood_host(state.node.host) )
{ {
call_mayuse &= ~CALL_TCPIP_ANY; call_mayuse &= ~CALL_TCPIP_ANY;
log("bad host, exclude IP"); log("bad host, exclude IP");
if( call_mustuse & CALL_TCPIP_ANY ) DEB((D_EVENT, "bad host or proto -> exclude IP, mayuse=%d", call_mayuse));
// If we had ONLY tcpip command - go out with error
if( !(call_mayuse) )
{ {
errmsg = "don't know host name"; errmsg = "Aborting, don't know host name";
gotoexit(BFERR_PHONE_UNKNOWN); gotoexit(BFERR_PHONE_UNKNOWN);
} }
} }
DEB((D_EVENT,"sess_call: may use %d must use %d", call_mayuse, call_mustuse));
// snprintf(s, 299, "after IP check: may use %d must use %d", call_mayuse, call_mustuse); // snprintf(s, 299, "after IP check: may use %d must use %d", call_mayuse, call_mustuse);
// log(s); // log(s);
@@ -807,29 +871,34 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
// try allowed methods and break if rc == 0 // try allowed methods and break if rc == 0
rc = -1; rc = -1;
if( rc && call_mayuse & CALL_STDIO ) if( 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 +919,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */ if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */
{ {
DEB((D_EVENT,"sess_call: call_system_modem running"));
rc = call_system_modem(); rc = call_system_modem();
port_unlock(p_lockdir, state.modemport); port_unlock(p_lockdir, state.modemport);
} }
+7 -5
View File
@@ -135,14 +135,16 @@ int override_get(s_override *dest, s_faddr addr, int line)
{ {
s_override *p; s_override *p;
int curline = 0; int curline = 0;
p = conf_override(cf_override, addr); p = conf_override(cf_override, addr);
curline = 0; curline = 0;
while( p && curline < line ) if (line > 0)
{ {
p = p->hidden; while( p && curline < line )
++curline; {
p = p->hidden;
++curline;
}
} }
if( p && curline == line ) if( p && curline == line )
@@ -152,7 +154,7 @@ int override_get(s_override *dest, s_faddr addr, int line)
} }
else if( line == 0 ) else if( line == 0 )
return 0; return 0;
else else
return 1; return 1;
} }
+40 -4
View File
@@ -895,13 +895,22 @@ int session(void)
* Write total amount of received/sent bytes, files, etc. * Write total amount of received/sent bytes, files, etc.
*/ */
p_log_txrxstat(&pi); p_log_txrxstat(&pi);
// Protocol info - real info from protocol
DEB((D_EVENT,"sess_main: Pi stats> Net: %d, Arc: %d, Fil: %d, Tic: %d",
pi.traffic_rcvd.netmail_num, pi.traffic_rcvd.arcmail_num,
pi.traffic_rcvd.files_num, pi.traffic_rcvd.ticfile_num));
// Session info - HANDSHAKE info for traffic
DEB((D_EVENT,"sess_main: Sess stats> Net: %d, Arc: %d, Fil: %d, Tic: %d",
state.traff_recv.netmail_num, state.traff_recv.arcmail_num,
state.traff_recv.files_num, state.traff_recv.ticfile_num));
/* /*
* Raise flags if session incoming traffic was not empty * Raise flags if session incoming traffic was not empty
*/ */
if ( (p = conf_string(cf_incnet_flag)) ) if ( (p = conf_string(cf_incnet_flag)) )
if (state.traff_recv.netmail_size > 0) { if (pi.traffic_rcvd.netmail_size > 0) {
DEB((D_EVENT, "Incoming netmail > 0, raising flag")); DEB((D_EVENT, "Incoming netmail > 0, raising flag"));
log("Raising flag for netmail in %s", p); log("Raising flag for netmail in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ); fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
@@ -915,7 +924,7 @@ int session(void)
} }
if ( (p = conf_string(cf_incarc_flag)) ) if ( (p = conf_string(cf_incarc_flag)) )
if (state.traff_recv.arcmail_size > 0) { if (pi.traffic_rcvd.arcmail_size > 0) {
DEB((D_EVENT, "Incoming arcmail > 0, raising flag")); DEB((D_EVENT, "Incoming arcmail > 0, raising flag"));
log("Raising flag for arcmail in %s", p); log("Raising flag for arcmail in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
@@ -928,6 +937,33 @@ int session(void)
} }
} }
if ( (p = conf_string(cf_inctic_flag)) )
if (pi.traffic_rcvd.ticfile_num > 0) {
DEB((D_EVENT, "Incoming TIC files > 0, raising flag"));
log("Raising flag for TIC in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (fd == -1) {
DEB((D_EVENT, "Error raising ticfiles flag"));
log("Error creating flag for ticfiles in %s", p);
} else {
/* all ok - closing file */
close(fd);
}
}
if ( (p = conf_string(cf_incfile_flag)) )
if (pi.traffic_rcvd.files_size > 0) {
DEB((D_EVENT, "Incoming FILES > 0, raising flag"));
log("Raising flag for files in %s", p);
fd = open(p, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (fd == -1) {
DEB((D_EVENT, "Error raising files flag"));
log("Error creating flag for files in %s", p);
} else {
/* all ok - closing file */
close(fd);
}
}
/* /*
* Save session traffic before deiniting * Save session traffic before deiniting
*/ */
+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();
} }
+9 -7
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 = local.tm_yday - gmt.tm_yday; long tz = 0; /* = local.tm_yday - gmt.tm_yday;
if( tz > 1 ) if( tz > 1 )
tz = 24;
else if( tz < -1 )
tz = -24; tz = -24;
else if( tz < -1 )
tz = +24;
else else
tz *= 24; tz *= 24; */
tz += local.tm_hour - gmt.tm_hour; /*tz += gmt.tm_hour - local.tm_hour;
tz *= 60; tz *= 60;
tz += local.tm_min - gmt.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,7 +202,7 @@ 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)?'+':'-';
tz = abs(tz); tz = abs(tz);
unsigned int hour = tz/60; unsigned int hour = tz/60;
+1 -1
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;
+117 -115
View File
@@ -141,8 +141,8 @@ typedef struct override {
char *sPhone; char *sPhone;
char *sFlags; char *sFlags;
s_timevec worktime; s_timevec worktime;
s_timevec freqtime; s_timevec freqtime;
char *run; char *run;
struct override *hidden; /* Hidden lines list */ struct override *hidden; /* Hidden lines list */
} s_override; } s_override;
@@ -159,128 +159,130 @@ typedef struct filebox {
} s_filebox; } s_filebox;
typedef enum { typedef enum {
cf_address, cf_address, // 0
cf_amiga_outbound_directory, cf_amiga_outbound_directory, // 1
cf_binkp_timeout, cf_binkp_timeout, // 2
cf_daemon_circle, cf_daemon_circle, // 3
cf_daemon_circle_crash, cf_daemon_circle_crash, // 4
cf_daemon_circle_direct, cf_daemon_circle_direct, // 5
cf_daemon_circle_immed, cf_daemon_circle_immed, // 6
cf_daemon_circle_modem, cf_daemon_circle_modem, // 7
cf_daemon_circle_normal, cf_daemon_circle_normal, // 8
cf_daemon_circle_rescan, cf_daemon_circle_rescan, // 9
cf_daemon_maxclients_modem, cf_daemon_maxclients_modem, // 10
cf_daemon_maxclients_tcpip, cf_daemon_maxclients_tcpip, // 11
cf_daemon_pid_file, cf_daemon_pid_file, // 12
cf_delay_files_recv, cf_delay_files_recv, // 13
cf_delay_files_send, cf_delay_files_send, // 14
cf_disable_aka_matching, cf_disable_aka_matching, // 15
cf_domain, cf_domain, // 16
cf_emsi_FR_time, cf_emsi_FR_time, // 17
cf_emsi_OH_time, cf_emsi_OH_time, // 18
cf_emsi_slave_sends_nak, cf_emsi_slave_sends_nak, // 19
cf_emsi_send_tz, cf_emsi_send_tz, // 20
cf_emsi_send_time, cf_emsi_send_time, // 21
cf_filebox, cf_filebox, // 22
cf_filebox_directory, cf_filebox_directory, // 23
cf_flags, cf_flags, // 24
cf_flo_translate, cf_flo_translate, // 25
cf_freq_alias_list, cf_freq_alias_list, // 26
cf_freq_dir_list, cf_freq_dir_list, // 27
cf_freq_ignore_masks, cf_freq_ignore_masks, // 28
cf_freq_limit_number, cf_freq_limit_number, // 29
cf_freq_limit_size, cf_freq_limit_size, // 30
cf_freq_limit_time, cf_freq_limit_time, // 31
cf_freq_min_speed, cf_freq_min_speed, // 32
cf_freq_srif_command, cf_freq_srif_command, // 33
cf_incnet_flag, cf_incnet_flag, // 34
cf_incarc_flag, cf_incarc_flag, // 35
cf_hide_our_aka, cf_inctic_flag, // 36
cf_history_file, cf_incfile_flag, // 37
cf_hydra_options, cf_hide_our_aka, // 38
cf_hydra_mincps_recv, cf_history_file, // 39
cf_hydra_mincps_send, cf_hydra_options, // 40
cf_hydra_tx_window, cf_hydra_mincps_recv, // 41
cf_hydra_rx_window, cf_hydra_mincps_send, // 42
cf_inbound_directory, cf_hydra_tx_window, // 43
cf_location, cf_hydra_rx_window, // 44
cf_log_file, cf_inbound_directory, // 45
cf_log_file_daemon, cf_location, // 46
cf_max_speed, cf_log_file, // 47
cf_maxtries, cf_log_file_daemon, // 48
cf_maxtries_nodial, cf_max_speed, // 49
cf_maxtries_noansw, cf_maxtries, // 50
cf_maxtries_noconn, cf_maxtries_nodial, // 51
cf_maxtries_hshake, cf_maxtries_noansw, // 52
cf_maxtries_sessions, cf_maxtries_noconn, // 53
cf_min_cps_recv, cf_maxtries_hshake, // 54
cf_min_cps_send, cf_maxtries_sessions, // 55
cf_min_cps_time, cf_min_cps_recv, // 56
cf_min_free_space, cf_min_cps_send, // 57
cf_min_speed_in, cf_min_cps_time, // 58
cf_min_speed_out, cf_min_free_space, // 59
cf_mode_netmail, cf_min_speed_in, // 60
cf_mode_arcmail, cf_min_speed_out, // 61
cf_mode_request, cf_mode_netmail, // 62
cf_mode_ticfile, cf_mode_arcmail, // 63
cf_mode_default, cf_mode_request, // 64
cf_modem_can_send_break, cf_mode_ticfile, // 65
cf_modem_dial_prefix, cf_mode_default, // 66
cf_modem_dial_suffix, cf_modem_can_send_break, // 67
cf_modem_dial_response, cf_modem_dial_prefix, // 68
cf_modem_hangup_command, cf_modem_dial_suffix, // 69
cf_modem_port, cf_modem_dial_response, // 70
cf_modem_reset_command, cf_modem_hangup_command, // 71
cf_modem_stat_command, cf_modem_port, // 72
cf_nodelist, cf_modem_reset_command, // 73
cf_nodelist_directory, cf_modem_stat_command, // 74
cf_nodial_flag, cf_nodelist, // 75
cf_override, cf_nodelist_directory, // 76
cf_options, cf_nodial_flag, // 77
cf_outbound_directory, cf_override, // 78
cf_password, cf_options, // 79
cf_phone, cf_outbound_directory, // 80
cf_phone_translate, cf_password, // 81
cf_proto_order, cf_phone, // 82
cf_recode_file_in, cf_phone_translate, // 83
cf_recode_file_out, cf_proto_order, // 84
cf_recode_intro_in, cf_recode_file_in, // 85
cf_recv_buffer_size, cf_recode_file_out, // 86
cf_rescan_delay, cf_recode_intro_in, // 87
cf_run_after_handshake, cf_recv_buffer_size, // 88
cf_run_after_session, cf_rescan_delay, // 89
cf_run_before_session, cf_run_after_handshake, // 90
cf_session_limit_in, cf_run_after_session, // 91
cf_session_limit_out, cf_run_before_session, // 92
cf_skip_files_recv, cf_session_limit_in, // 93
cf_status_directory, cf_session_limit_out, // 94
cf_system_name, cf_skip_files_recv, // 95
cf_sysop_name, cf_status_directory, // 96
cf_uucp_lock_directory, cf_system_name, // 97
cf_wait_carrier_in, cf_sysop_name, // 98
cf_wait_carrier_out, cf_uucp_lock_directory, // 99
cf_zmodem_mincps_recv, cf_wait_carrier_in, // 100
cf_zmodem_mincps_send, cf_wait_carrier_out, // 101
cf_zmodem_send_dummy_pkt, cf_zmodem_mincps_recv, // 102
cf_zmodem_skip_by_pos, cf_zmodem_mincps_send, // 103
cf_zmodem_start_block_size, cf_zmodem_send_dummy_pkt, // 104
cf_zmodem_tx_window, cf_zmodem_skip_by_pos, // 105
cf_nomail_flag, cf_zmodem_start_block_size, // 106
cf_bind_ip, cf_zmodem_tx_window, // 107
cf_recieved_to_lower, cf_nomail_flag, // 108
cf_bind_ip, // 109
cf_recieved_to_lower, // 110
#ifdef USE_SYSLOG #ifdef USE_SYSLOG
cf_syslog_facility, cf_syslog_facility,
#endif #endif
#ifdef DEBUG #ifdef DEBUG
cf_debug_file, cf_debug_file, // 111
cf_debug_level, cf_debug_level, // 112
#endif #endif
cf_split_inbound, cf_split_inbound, // 113
#ifdef NETSPOOL #ifdef NETSPOOL
cf_netspool_host, cf_netspool_host,
cf_netspool_port, cf_netspool_port,
#endif #endif
cf_fidodnszone, cf_fidodnszone, // 114
BFORCE_NUMBER_OF_KEYWORDS BFORCE_NUMBER_OF_KEYWORDS
} bforce_config_keyword; } bforce_config_keyword;
+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;
/* /*
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}