Compare commits
140
Commits
0678eaaefc
..
0.26.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22fa90589b | ||
|
|
ccd0e13c05 | ||
|
|
3a9ee4727a | ||
|
|
ff329a7602 | ||
|
|
5a036bb150 | ||
|
|
245f11724d | ||
|
|
4d14e01c68 | ||
|
|
df0c511487 | ||
|
|
f8dd598312 | ||
|
|
c695876504 | ||
|
|
0db3aee60f | ||
|
|
f4d89f2fb2 | ||
|
|
9ac18a21a6 | ||
|
|
537daec883 | ||
|
|
ee9c78d129 | ||
|
|
14d2f2992d | ||
|
|
78aac4f18c | ||
|
|
df5a915287 | ||
|
|
b95128f87a | ||
|
|
6d042318d5 | ||
|
|
cf7208408c | ||
|
|
aae6656a4a | ||
|
|
4297b51dca | ||
|
|
b9e68f295e | ||
|
|
c665ce0aaf | ||
|
|
2807cd61ff | ||
|
|
330da47169 | ||
|
|
1d696c0ba0 | ||
|
|
5a49ebdfe5 | ||
|
|
42246c136f | ||
|
|
d8d953b0b3 | ||
|
|
c91ca40037 | ||
|
|
81bbffb312 | ||
|
|
46dc91c446 | ||
|
|
be3fcc0b5e | ||
|
|
416c79b637 | ||
|
|
6612f8fc89 | ||
|
|
2b63aa8cd7 | ||
|
|
b14e52133d | ||
|
|
07edf66b72 | ||
|
|
8261016c7e | ||
|
|
4d48c2abe9 | ||
|
|
7f7e420b13 | ||
|
|
52b3b230b9 | ||
|
|
416795159f | ||
|
|
04f62c7725 | ||
|
|
ddf8f3f9e0 | ||
|
|
6245ad3e10 | ||
|
|
e3a1f7e52e | ||
|
|
e94fffb110 | ||
|
|
a7cda5b70f | ||
|
|
0d4a4945fe | ||
|
|
c658e03af5 | ||
|
|
57e5e00ca3 | ||
|
|
1f7d70b755 | ||
|
|
3c60f8de01 | ||
|
|
c47397c800 | ||
|
|
224115fffe | ||
|
|
875ea3505f | ||
|
|
d581b113c8 | ||
|
|
a296d43987 | ||
|
|
aa32dac10e | ||
|
|
6a1a0a6838 | ||
|
|
83ce06579c | ||
|
|
8339af8eac | ||
|
|
2477709da4 | ||
|
|
136eca95f1 | ||
|
|
030322225f | ||
|
|
92bd4cae56 | ||
|
|
1837ebd57c | ||
|
|
2eb30b7644 | ||
|
|
7733d5d663 | ||
|
|
6a2320d922 | ||
|
|
5f10b52c77 | ||
|
|
55fc94a95b | ||
|
|
1667d8a800 | ||
|
|
5eced105c8 | ||
|
|
7486b9c141 | ||
|
|
2fbe1d3e54 | ||
|
|
fa8e081584 | ||
|
|
981d4f00b3 | ||
|
|
26ecb8b64c | ||
|
|
526338f720 | ||
|
|
06f48fe1c1 | ||
|
|
4767b57ec9 | ||
|
|
8892e3f740 | ||
|
|
21eeae69cc | ||
|
|
9799f977b9 | ||
|
|
727f7cfdf3 | ||
|
|
36747d9071 | ||
|
|
9fa59cacca | ||
|
|
b66dd2156c | ||
|
|
80275d30d3 | ||
|
|
a62ae3afca | ||
|
|
a9f98cdee9 | ||
|
|
10d30223d1 | ||
|
|
c5fc6e9245 | ||
|
|
29000cfdd7 | ||
|
|
de6ef3936b | ||
|
|
8db2ee4260 | ||
|
|
25081b1bae | ||
|
|
deaa8140f5 | ||
|
|
7fb8e32a9b | ||
|
|
235a6a3072 | ||
|
|
4da486264b | ||
|
|
25cfb143dc | ||
|
|
4e86852c41 | ||
|
|
324b11aad7 | ||
|
|
7fd0d85557 | ||
|
|
0cb9a2b2cf | ||
|
|
9bc3a14dd0 | ||
|
|
abb1153cf3 | ||
|
|
3f9d10e467 | ||
|
|
46312ebc1b | ||
|
|
5ef2b09861 | ||
|
|
f72259cfe3 | ||
|
|
73a3376a3d | ||
|
|
983440fc29 | ||
|
|
5a7bac039a | ||
|
|
bba77edecd | ||
|
|
9aed37b92e | ||
|
|
3526bc5ece | ||
|
|
a1c93b8016 | ||
|
|
e6266e8eab | ||
|
|
34daba8a0e | ||
|
|
ea4e8c806f | ||
|
|
51034e6e59 | ||
|
|
6235b78239 | ||
|
|
b3f2e1bfc6 | ||
|
|
75aececd6b | ||
|
|
7ad43e1e40 | ||
|
|
0663d62be8 | ||
|
|
ccf473515d | ||
|
|
de81a82f43 | ||
|
|
6ebf2fc7a3 | ||
|
|
2c58629de4 | ||
|
|
721fa8fdf1 | ||
|
|
fdbeb83ab6 | ||
|
|
deafdc34c7 | ||
|
|
7879eb0cdc |
@@ -0,0 +1,66 @@
|
||||
name: Altlinux build
|
||||
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀
|
||||
on:
|
||||
- push
|
||||
- workflow_dispatch
|
||||
if: ${{ github.ref }} == 'refs/head/master'
|
||||
jobs:
|
||||
build-alt:
|
||||
## runs-on: alt-latest
|
||||
container:
|
||||
image: prj.zxalexis.ru/zx/alt-rpmbuild
|
||||
branches:
|
||||
- 'master'
|
||||
|
||||
steps:
|
||||
- name: Checking environment
|
||||
continue-on-error: true
|
||||
run: printenv
|
||||
- name: Installing prerequisites - update apt
|
||||
run: apt-get update
|
||||
## - name: Installing prerequisites - install nodejs for actions & git
|
||||
## run: apt-get install -y git nodejs su
|
||||
## - name: Installing build environment
|
||||
## continue-on-error: true
|
||||
## run: |
|
||||
## apt-get install -y gcc rpm-build rpmlint make python gear hasher fakeroot patch rpmdevtools
|
||||
- name: Installing needed software
|
||||
run: apt-get install -y bison tcl
|
||||
- name: Adding build user
|
||||
run: useradd -d /builder -g users -m builder
|
||||
- name: Fetching sources
|
||||
uses: actions/checkout@v4
|
||||
- name: Getting version info
|
||||
run: |
|
||||
echo "BFORCE_VER=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)" >> $GITHUB_ENV
|
||||
- name: Compressing source to tar.gz archive
|
||||
run: |
|
||||
tar -cvzf ../bforce-${{ env.BFORCE_VER }}.tar.gz -C ${{ env.GITHUB_WORKSPACE }}/.. bforce
|
||||
cp -v ${{ env.GITHUB_WORKSPACE }}/rpm/bforce.spec /builder/
|
||||
chown builder /builder/bforce.spec
|
||||
echo '-------------------------------------------------------'
|
||||
pwd
|
||||
ls /builder
|
||||
sed -i 's/^# %setup/%setup/' /builder/bforce.spec
|
||||
- name: Building buildtree
|
||||
run: |
|
||||
su - builder -c "cd /builder && mkdir -pv rpmbuild/{RPMS,SRPMS,SOURCES,BUILD,SPECS}"
|
||||
ls /builder -l
|
||||
mkdir -pv /builder/rpmbuild/SOURCES
|
||||
mv ${{ env.GITHUB_WORKSPACE }}/../bforce-${{ env.BFORCE_VER }}.tar.gz /builder/rpmbuild/SOURCES/
|
||||
chown -R builder /builder/*
|
||||
- name: Building binary and source RPM
|
||||
run: |
|
||||
su - builder -c 'rpmbuild -bb /builder/bforce.spec --define "_topdir /builder/rpmbuild"'
|
||||
- name: Constructing artifact name and version
|
||||
run: |
|
||||
echo "BFORCE_VERLONG=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
|
||||
- name: Retrieving artifact files
|
||||
run: mkdir bforce && cp /builder/rpmbuild/RPMS/x86_64/bforce-*.rpm bforce
|
||||
- name: Try to upload artifacts bin
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: bforce-${{ env.BFORCE_VERLONG }}-Alt
|
||||
path: /builder/rpmbuild/RPMS/x86_64
|
||||
- name: Echo OK
|
||||
run: echo "All OK"
|
||||
@@ -0,0 +1,79 @@
|
||||
name: Archlinux build
|
||||
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀
|
||||
on:
|
||||
- push
|
||||
- workflow_dispatch
|
||||
if: ${{ github.ref }} == 'refs/head/master'
|
||||
jobs:
|
||||
build-arch:
|
||||
runs-on: arch-latest
|
||||
|
||||
branches:
|
||||
- 'master'
|
||||
|
||||
steps:
|
||||
- name: Checking environment
|
||||
continue-on-error: true
|
||||
run: printenv
|
||||
- name: Installing prerequisites - update pacman
|
||||
run: pacman -Sy
|
||||
- name: Installing prerequisites - install nodejs for actions & git
|
||||
run: pacman --disable-sandbox --noconfirm -v -S git nodejs
|
||||
- name: Adding user builder
|
||||
continue-on-error: true
|
||||
run: useradd -d /builder -g users -m builder
|
||||
- name: Downloading PKGBUILD
|
||||
run: |
|
||||
su - builder -c "curl -O http://zxprj:3001/zx/bforce/raw/branch/master/archlinux/bforce.install"
|
||||
su - builder -c "curl -o PKGBUILD http://zxprj:3001/zx/bforce/raw/branch/master/archlinux/PKGBUILD.ci"
|
||||
- name: Building archlinux package
|
||||
run: |
|
||||
su -w GITHUB_SHA,GITHUB_REF_NAME,GITHUB_REF_TYPE - builder -c makepkg
|
||||
su - builder -c "ls -la"
|
||||
- name: Constructing artifact name and version
|
||||
run: |
|
||||
echo "BFORCE_VER=$(cat /builder/src/bforce/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
|
||||
- name: Retrieving artifact files
|
||||
run: mkdir bforce && cp /builder/bforce-*.pkg.tar.zst bforce
|
||||
- name: Try to upload artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: bforce-${{ env.BFORCE_VER }}-Arch
|
||||
path: bforce
|
||||
make-test:
|
||||
runs-on: arch-latest
|
||||
|
||||
branches:
|
||||
- 'master'
|
||||
|
||||
steps:
|
||||
- name: Checking environment
|
||||
continue-on-error: true
|
||||
run: printenv
|
||||
- name: Installing prerequisites - update pacman
|
||||
run: pacman -Sy
|
||||
- name: Installing prerequisites - install nodejs for actions & git
|
||||
run: pacman --disable-sandbox --noconfirm -v -S git nodejs socat
|
||||
- name: Downloading source tree
|
||||
continue-on-error: false
|
||||
uses: actions/checkout@v3
|
||||
- name: Constructing artifact name and version
|
||||
run: |
|
||||
echo "BFORCE_VER=$(cat ${{ github.workspace }}/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: bforce-${{ env.BFORCE_VER }}-Arch
|
||||
- name: Display structure of downloaded files
|
||||
run: ls -R
|
||||
- name: Installing archlinux package
|
||||
run: |
|
||||
ls -la
|
||||
pacman --noconfirm -v -U bforce-*.pkg.tar.zst
|
||||
cd ${{ github.workspace }}/tests
|
||||
echo '-----------------------------------------'
|
||||
ls -la
|
||||
- name: Testing package in clean environment
|
||||
run: |
|
||||
cd ${{ github.workspace }}/tests
|
||||
echo '------------>>> TESTING <<<--------------'
|
||||
BFBIN=/usr/bin/bforce ./mktests.sh
|
||||
@@ -0,0 +1,52 @@
|
||||
name: Debian build
|
||||
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀
|
||||
on:
|
||||
- push
|
||||
- workflow_dispatch
|
||||
jobs:
|
||||
build-ubuntu:
|
||||
runs-on: ubuntu-latest
|
||||
branches:
|
||||
- 'master'
|
||||
- 'zx'
|
||||
steps:
|
||||
- name: Checking environment
|
||||
continue-on-error: true
|
||||
run: printenv
|
||||
- name: Installing build-essentials
|
||||
continue-on-error: false
|
||||
run: |
|
||||
apt update
|
||||
apt install -y build-essential fakeroot devscripts debhelper pkg-config --no-install-recommends
|
||||
- name: Installing dependencies
|
||||
continue-on-error: false
|
||||
run: |
|
||||
echo '---- bison ----'
|
||||
apt install -y bison
|
||||
echo '---- tcl ------'
|
||||
apt install -y tcl
|
||||
- name: Cloning source
|
||||
uses: actions/checkout@v4
|
||||
- name: Getting version info
|
||||
run: |
|
||||
echo "BFORCE_VER=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)-$(date +%Y%m%d)" >> $GITHUB_ENV
|
||||
- name: Building package
|
||||
continue-on-error: false
|
||||
run: |
|
||||
pwd
|
||||
echo '---------------------'
|
||||
cd ${GITHUB_WORKSPACE}/debian
|
||||
ls -l
|
||||
debuild -us -uc -b
|
||||
echo '---build complete---'
|
||||
ls -l ${{ env.GITHUB_WORKSPACE }}/../
|
||||
- name: Collecting artifacts
|
||||
run: |
|
||||
mkdir -pv ${{ env.GITHUB_WORKSPACE }}/artifacts
|
||||
mv -v ${{ env.GITHUB_WORKSPACE }}/../*.deb ${{ env.GITHUB_WORKSPACE }}/artifacts/
|
||||
- name: Try to upload artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: bforce-${{ env.BFORCE_VER }}-Ubuntu
|
||||
path: ${{ env.GITHUB_WORKSPACE }}/artifacts/bforce*.deb
|
||||
- run: echo "This job's over"
|
||||
@@ -0,0 +1,9 @@
|
||||
*.o
|
||||
debian/Makefile
|
||||
source/Makefile
|
||||
source/bin/
|
||||
source/bforce/expression.c
|
||||
source/config.log
|
||||
source/config.status
|
||||
source/include/config.h
|
||||
bforce.geany
|
||||
@@ -228,9 +228,61 @@ Alexey Khromov (zx@zxalexis.ru)
|
||||
+ Added pre-init debugging (primarily of config readout) to stderr by -v
|
||||
option. Vanished out errorful calls to "log" and "debug" before log and
|
||||
debug files initialization.
|
||||
+ As of bison is default yacc for (almost) every foss system - fix
|
||||
warning of yacc compliance (delete -y flag in Makefile.in)
|
||||
+ Fixed build on 64-bit systems (amd64 and aarch64)
|
||||
+ Initially added config options incpkt_flag and incbdl_flag to raise
|
||||
up flag-driven tosser manipulation
|
||||
|
||||
0.24.2
|
||||
+ Fixed environment variables while executing external programs
|
||||
on handshake or session end
|
||||
+ Fixed flags working on arcmail/netmail recieve
|
||||
|
||||
0.25
|
||||
+ EMSI handshake logic reworked to comply with EMSI-II std (FTSC-0088)
|
||||
+ New option: proto_order - dezired protocol order for outgoing calls
|
||||
in EMSI session handshake
|
||||
EMSI-II-compliance works as follows:
|
||||
* if both (caller and callee) expose EII flag - selected proto
|
||||
will be first in caller compat.options compatible with callee
|
||||
* if caller is EMSI-I-compliant and does not show EII flad -
|
||||
selection by callee internal order from compatible with caller
|
||||
+ Changed ifcico protocol port hardcoded to num and not name from
|
||||
/etc/services line (as of abscence of latter)
|
||||
+ Config example reworked to include new options
|
||||
+ New option: emsi_send_tz - to send TZUTC EMSI-handshake part.
|
||||
|
||||
0.25.1
|
||||
+ Added testing script for PSTN comms (tests folder).
|
||||
|
||||
0.25.2
|
||||
+ Adopted for outgoing IPv6 communication
|
||||
|
||||
0.25.3
|
||||
+ Fixed IPv6 address logging in inetd connections
|
||||
+ Fixed outgoing proto detection and order - as Direct, BinkP, Ifcico,
|
||||
Telnet, Modem first allowed to connect. You may change this order
|
||||
individually by override flags.
|
||||
+ Daemon mode now tries to make outgoing tcp calls prior to modem
|
||||
+ Daemon mode - fixed working time for tcp nodes (CM)
|
||||
+ Fixed some x64 errors in comparisons to integers
|
||||
+ Added systemd and xinetd service files to contrib folder
|
||||
+ Fixed flag files creation
|
||||
+ Added flags for TIC files (inctic_flag) and files (incfile_flag)
|
||||
+ Fixed nodelist index creation
|
||||
+ Added support for TCP port description in IBN/IFC/ITN flags
|
||||
|
||||
0.26
|
||||
+ Fixed incorrect binkp protocol realization in unprotected sessions.
|
||||
+ Fixed binkp override appliance in incoming handshake
|
||||
|
||||
0.26.1
|
||||
+ Fixed binkp stuck on overrides in config
|
||||
+ ReDebianized
|
||||
+ Added CI automation: builds for Archlinux and Ubuntu
|
||||
|
||||
0.26.2
|
||||
+ Added tests with socat and integrate it with CI
|
||||
+ Fixed some minor lint errors by PVS-Studio
|
||||
+ Fixed RPM spec-file to make builds for AltLinux
|
||||
+ Added fail2ban filter to contrib
|
||||
+ Fixed node/point-lists indexing and parsing for points listed
|
||||
|
||||
@@ -1,4 +1,35 @@
|
||||
Basic Installation
|
||||
Prerequisites
|
||||
====================
|
||||
|
||||
C compiler (GCC in linux and clang in BSD will work well)
|
||||
make
|
||||
yacc or it's GNU's recreation named bison
|
||||
Tcl optional for a couple of scripts
|
||||
|
||||
Installing with packages
|
||||
=
|
||||
|
||||
Debian-based systesms (Debian, *buntu, Mint, Astra)
|
||||
====================
|
||||
|
||||
Install build system for packaging:
|
||||
|
||||
apt install build-essential fakeroot devscripts debhelper pkg-config
|
||||
apt install bison tcl
|
||||
|
||||
Use debuild to make deb-s:
|
||||
|
||||
cd <SRCDIR>/debian
|
||||
debuild -us -uc -b
|
||||
|
||||
RPM-based systems (RHEL, CentOS, Altlinux, SimplyLinux, RedOS)
|
||||
=====================
|
||||
|
||||
mkdir -p ./rpmbuild/{RPMS,BUILD}
|
||||
rpmbuild -bb <SRCDIR>/rpm/bforce.spec --define "_topdir $( pwd )/rpmbuild" --define "_builddir <SRCDIR>/source"
|
||||
|
||||
|
||||
Manual Installation
|
||||
==================
|
||||
|
||||
These are generic installation instructions.
|
||||
|
||||
+74
-34
@@ -1,37 +1,58 @@
|
||||
В этом файле описывается процесс установки и настройки
|
||||
фидонет-совместимого мейлера bforce 0.22.8.ugenk1.
|
||||
фидонет-совместимого мейлера bforce 0.xx.
|
||||
|
||||
В данном документе приняты следующие обозначения:
|
||||
|
||||
<SRCDIR> - путь, куда вы распаковали тарболл с исходными
|
||||
текстами bforce 0.22.8.ugenk1 (далее bforce)
|
||||
<SRCDIR> - путь, куда вы распаковали тарболл с исходными текстами
|
||||
bforce 0.xx (далее bforce)
|
||||
Тарболл - файл с расширением tar.gz, или tar.bz2
|
||||
|
||||
|
||||
Требования к системе
|
||||
====================
|
||||
|
||||
Для компиляции bforce вам потребуется компилятор (для
|
||||
gnu/bsd-систем gcc), так же GNU make (make для линукс,
|
||||
gmake для bsd).
|
||||
Для компиляции bforce вам потребуется компилятор с языка С,
|
||||
так же GNU make (make для линукс, gmake для bsd) и yacc (в linux -
|
||||
bison). Опционально - tcl
|
||||
|
||||
Обратитесь к документации по вашей системе того, что бы
|
||||
узнать как установить вышеперечисленное программное обеспечение.
|
||||
Создание пакета
|
||||
=
|
||||
|
||||
Debian-based системы (Debian, *buntu, Mint, Astra)
|
||||
====================
|
||||
|
||||
Установка программ и набора скриптов для сборки пакетов:
|
||||
|
||||
apt install build-essential fakeroot devscripts debhelper pkg-config
|
||||
apt install bison tcl
|
||||
|
||||
Для создания пакета из скачанных исходников достаточно воспользоваться
|
||||
командой debuild:
|
||||
|
||||
cd <SRCDIR>/debian
|
||||
debuild -us -uc -b
|
||||
|
||||
RPM-based системы (RHEL, CentOS, Altlinux, SimplyLinux, RedOS)
|
||||
=====================
|
||||
|
||||
mkdir -p ./rpmbuild/{RPMS,BUILD}
|
||||
rpmbuild -bb <SRCDIR>/rpm/bforce.spec --define "_topdir $( pwd )/rpmbuild" --define "_builddir <SRCDIR>/source"
|
||||
|
||||
Установка вручную
|
||||
=
|
||||
|
||||
Процесс компиляции
|
||||
==================
|
||||
|
||||
Распакуйте тарболл следующими командами:
|
||||
|
||||
gzip -d bforce-0.22.8.ugenk1.tar.gz
|
||||
gzip -d bforce-master.tar.gz
|
||||
или
|
||||
bzip2 -d bforce-0.22.8.ugenk1.tar.bz2
|
||||
bzip2 -d bforce-master.tar.bz2
|
||||
|
||||
tar -xvf bforce-0.22.8.ugenk1.tar
|
||||
tar -xvf bforce-master.tar
|
||||
|
||||
Перейдите в директорию bforce-0.22.8.ugenk1/source:
|
||||
cd <SRCDIR>/bforce-0.22.8.ugenk1/source
|
||||
Перейдите в директорию bforce/source:
|
||||
cd <SRCDIR>/bforce/source
|
||||
|
||||
Для создания Makefile, который наиболее подходит к вашей
|
||||
системе, наберите:
|
||||
@@ -76,6 +97,11 @@ gmake install
|
||||
Настройка
|
||||
=========
|
||||
|
||||
Рекомендуется установить системную переменную BFCONFIG,
|
||||
указывающую на местоположение конфигурации bforce.
|
||||
Проще всего через /etc/environment для общесистемной или
|
||||
.profile для переменной пользователя.
|
||||
|
||||
Для нормальной работы вам нужно отредактировать конфигурационные файлы
|
||||
bforce. По умолчанию они находятся в /usr/local/fido/etc и называются
|
||||
bforce.conf - основной конфигурационный файл bforce
|
||||
@@ -125,6 +151,19 @@ cat `which mgetty` |strings |grep FIDO |wc -l
|
||||
|
||||
где news - это пользователь, из-под которого у вас работает ftn-подсистема.
|
||||
|
||||
Bforce при ИСХОДЯЩИХ звонках использует файлы блокировки порта модема,
|
||||
при несовпадении каталога или невозможности создания файла
|
||||
mgetty сбросит модем во время звонка.
|
||||
Поэтому настоятельно рекомендуется проверить права на папку /var/lock
|
||||
и то, на какой ФС она расположенв.
|
||||
Современные системы имеют тенденцию к применению /var/lock как ссылки
|
||||
на /run/lock, а ФС /run монтируется и создается на tmpfs при каждой
|
||||
загрузке с помощью systemd-tempfiles.
|
||||
Для изменения поведения необходимо создать файл в /etc/tempfiles.d/,
|
||||
совпадающим (за исключением части имени -part) c именем файла в
|
||||
/usr/lib/systemd/systemd-tempfiles.d.
|
||||
Рабочий пример legacy-part.conf в папке contrib.
|
||||
|
||||
Совместная работа с inetd/xinetd
|
||||
================================
|
||||
К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие
|
||||
@@ -142,28 +181,29 @@ ifc 60179/tcp # fidonet EMSI over TCP
|
||||
======================
|
||||
|
||||
Дополнительные утилиты для bforce находятся в <SRCDIR>/contrib:
|
||||
bflan - bforce log analyzer
|
||||
callout.sh - скрипт для отзвонки на аплинков
|
||||
outman - скрипт outman
|
||||
timesync.tcl - скрипт для синхорнизации времени с узлами ftn.
|
||||
init.d/bforce - init-скрипт для RedHat
|
||||
bfha - bforce history analyzer (bfha)
|
||||
bfha/README - bfha README
|
||||
bfha/bfha.pl - собственно, bfha
|
||||
u-srif - продвинутый freq-процессор
|
||||
bflan - bforce log analyzer
|
||||
callout.sh - скрипт для отзвонки на аплинков
|
||||
outman - скрипт outman
|
||||
timesync.tcl - скрипт для синхорнизации времени с узлами ftn.
|
||||
init.d/bforce - init-скрипт для RedHat
|
||||
bfha - bforce history analyzer (bfha)
|
||||
bfha/README - bfha README
|
||||
bfha/bfha.pl - собственно, bfha
|
||||
legacy-part.conf - файл для донастройки прав на /run/lock в systemd
|
||||
u-srif - продвинутый freq-процессор
|
||||
u-srif/u-srif-index.py \ с поддержой отчетов,
|
||||
u-srif/u-srif-lookup.py \ ограничений,
|
||||
u-srif/u-srif.py \ индексации файловой базы,
|
||||
u-srif/conf \ что значительно ускоряет
|
||||
u-srif/u-srif.py \ индексации файловой базы,
|
||||
u-srif/conf \ что значительно ускоряет
|
||||
u-srif/conf/report.footer \ работу.
|
||||
u-srif/conf/report.header \ Написан на python.
|
||||
u-srif/conf/u-srif.aliases \ --------------------
|
||||
u-srif/conf/u-srif.conf \ -------------------
|
||||
u-srif/conf/u-srif.dirs \ ------------------
|
||||
u-srif/lib / ------------------
|
||||
u-srif/lib/uconfig.py / -------------------
|
||||
u-srif/lib/udbase.py / --------------------
|
||||
u-srif/lib/ufido.py / ---------------------
|
||||
u-srif/conf/u-srif.aliases \ --------------------
|
||||
u-srif/conf/u-srif.conf \ -------------------
|
||||
u-srif/conf/u-srif.dirs \ ------------------
|
||||
u-srif/lib / ------------------
|
||||
u-srif/lib/uconfig.py / -------------------
|
||||
u-srif/lib/udbase.py / --------------------
|
||||
u-srif/lib/ufido.py / ---------------------
|
||||
u-srif/lib/unodestat.py / ----------------------
|
||||
u-srif/lib/utmpl.py / -----------------------
|
||||
u-srif/lib/uutil.py / ------------------------
|
||||
u-srif/lib/utmpl.py / -----------------------
|
||||
u-srif/lib/uutil.py / ------------------------
|
||||
|
||||
@@ -1,10 +1,30 @@
|
||||

|
||||

|
||||

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