Version 0.25. EMSI-II compliant, TZUTC fixed, protocol order for outgoing

master 0.25
Alexey Khromov 6 months ago
commit de81a82f43

@ -228,9 +228,25 @@ Alexey Khromov (zx@zxalexis.ru)
+ Added pre-init debugging (primarily of config readout) to stderr by -v + Added pre-init debugging (primarily of config readout) to stderr by -v
option. Vanished out errorful calls to "log" and "debug" before log and option. Vanished out errorful calls to "log" and "debug" before log and
debug files initialization. debug files initialization.
+ As of bison is default yacc for (almost) every foss system - fix
warning of yacc compliance (delete -y flag in Makefile.in)
+ Fixed build on 64-bit systems (amd64 and aarch64) + Fixed build on 64-bit systems (amd64 and aarch64)
+ Initially added config options incpkt_flag and incbdl_flag to raise + Initially added config options incpkt_flag and incbdl_flag to raise
up flag-driven tosser manipulation up flag-driven tosser manipulation
0.24.2
+ Fixed environment variables while executing external programs
on handshake or session end
+ Fixed flags working on arcmail/netmail recieve
0.25
+ EMSI handshake logic reworked to comply with EMSI-II std (FTSC-0088)
+ New option: proto_order - dezired protocol order for outgoing calls
in EMSI session handshake
EMSI-II-compliance works as follows:
* if both (caller and callee) expose EII flag - selected proto
will be first in caller compat.options compatible with callee
* if caller is EMSI-I-compliant and does not show EII flad -
selection by callee internal order from compatible with caller
+ Changed ifcico protocol port hardcoded to num and not name from
/etc/services line (as of abscence of latter)
+ Config example reworked to include new options
+ New option: emsi_send_tz - to send TZUTC EMSI-handshake part.

@ -1,10 +1,10 @@
В этом файле описывается процесс установки и настройки В этом файле описывается процесс установки и настройки
ÆÉÄÏÎÅÔ-ÓÏ×ÍÅÓÔÉÍÏÇÏ ÍÅÊÌÅÒÁ bforce 0.22.8.ugenk1. фидонет-совместимого мейлера bforce 0.xx.
В данном документе приняты следующие обозначения: В данном документе приняты следующие обозначения:
<SRCDIR> - путь, куда вы распаковали тарболл с исходными <SRCDIR> - путь, куда вы распаковали тарболл с исходными
ÔÅËÓÔÁÍÉ bforce 0.22.8.ugenk1 (ÄÁÌÅÅ bforce) текстами bforce 0.xx (далее bforce)
Тарболл - файл с расширением tar.gz, или tar.bz2 Тарболл - файл с расширением tar.gz, или tar.bz2
@ -24,14 +24,14 @@ gmake
Распакуйте тарболл следующими командами: Распакуйте тарболл следующими командами:
gzip -d bforce-0.22.8.ugenk1.tar.gz gzip -d bforce-master.tar.gz
или или
bzip2 -d bforce-0.22.8.ugenk1.tar.bz2 bzip2 -d bforce-master.tar.bz2
tar -xvf bforce-0.22.8.ugenk1.tar tar -xvf bforce-master.tar
ðÅÒÅÊÄÉÔÅ × ÄÉÒÅËÔÏÒÉÀ bforce-0.22.8.ugenk1/source: Перейдите в директорию bforce/source:
cd <SRCDIR>/bforce-0.22.8.ugenk1/source cd <SRCDIR>/bforce/source
Для создания Makefile, который наиболее подходит к вашей Для создания Makefile, который наиболее подходит к вашей
системе, наберите: системе, наберите:
@ -76,6 +76,11 @@ gmake install
Настройка Настройка
========= =========
Рекомендуется установить системную переменную BFCONFIG,
указывающую на местоположение конфигурации bforce.
Проще всего через /etc/environment для общесистемной или
.profile для переменной пользователя.
Для нормальной работы вам нужно отредактировать конфигурационные файлы Для нормальной работы вам нужно отредактировать конфигурационные файлы
bforce. По умолчанию они находятся в /usr/local/fido/etc и называются bforce. По умолчанию они находятся в /usr/local/fido/etc и называются
bforce.conf - основной конфигурационный файл bforce bforce.conf - основной конфигурационный файл bforce
@ -125,6 +130,19 @@ cat `which mgetty` |strings |grep FIDO |wc -l
где news - это пользователь, из-под которого у вас работает ftn-подсистема. где news - это пользователь, из-под которого у вас работает ftn-подсистема.
Bforce при ИСХОДЯЩИХ звонках использует файлы блокировки порта модема,
при несовпадении каталога или невозможности создания файла
mgetty сбросит модем во время звонка.
Поэтому настоятельно рекомендуется проверить права на папку /var/lock
и то, на какой ФС она расположенв.
Современные системы имеют тенденцию к применению /var/lock как ссылки
на /run/lock, а ФС /run монтируется и создается на tmpfs при каждой
загрузке с помощью systemd-tempfiles.
Для изменения поведения необходимо создать файл в /etc/tempfiles.d/,
совпадающим (за исключением части имени -part) c именем файла в
/usr/lib/systemd/systemd-tempfiles.d.
Рабочий пример legacy-part.conf в папке contrib.
Совместная работа с inetd/xinetd Совместная работа с inetd/xinetd
================================ ================================
К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие
@ -150,6 +168,7 @@ init.d/bforce - init-
bfha - bforce history analyzer (bfha) bfha - bforce history analyzer (bfha)
bfha/README - bfha README bfha/README - bfha README
bfha/bfha.pl - собственно, bfha bfha/bfha.pl - собственно, bfha
legacy-part.conf - файл для донастройки прав на /run/lock в systemd
u-srif - продвинутый freq-процессор u-srif - продвинутый freq-процессор
u-srif/u-srif-index.py \ с поддержой отчетов, u-srif/u-srif-index.py \ с поддержой отчетов,
u-srif/u-srif-lookup.py \ ограничений, u-srif/u-srif-lookup.py \ ограничений,

@ -0,0 +1,19 @@
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# These files are considered legacy and are unnecessary on legacy-free
# systems.
d /run/lock 0777 root lock -
L /var/lock - - - - ../run/lock
# /run/lock/subsys is used for serializing SysV service execution, and
# hence without use on SysV-less systems.
d /run/lock/subsys 0775 root lock -

@ -63,6 +63,12 @@ address 20:26/100.0@easynet
# #
options NoDirZap NoJanus NoChat options NoDirZap NoJanus NoChat
# Protocol order for outgoing EMSI calls
# Tolerant to Options (i.e. you can order all kind of protos
# as of TZA,KER,JAN and SLK are not supported at all
# Default: HYD,JAN,DZA,ZAP,ZMO,TZA,SLK,KER
proto_order HYD,ZMO,ZAP,DZA,JAN,TZA,KER,SLK
# #
# Domain outbounds # Domain outbounds
# Domain <domain_name> <outbound_dir> <zone> # Domain <domain_name> <outbound_dir> <zone>
@ -109,13 +115,13 @@ split_inbound yes
# #
# Path to your 4D outbound (use zone as extension) # Path to your 4D outbound (use zone as extension)
# #
#outbound_directory /var/spool/fido/bt/out outbound_directory /var/spool/fido/bt/out
# #
# Path to your AmigaDos style 4D outbound. # Path to your AmigaDos style 4D outbound.
# (You can use all outbound styles at the same time) # (You can use all outbound styles at the same time)
# #
amiga_outbound_directory /var/spool/fido/bt/out #amiga_outbound_directory /var/spool/fido/bt/out
# #
# Directory with your nodelists (for nodelist without full path) # Directory with your nodelists (for nodelist without full path)
@ -253,6 +259,10 @@ mode_request 100660
# '~' 1 second delay # '~' 1 second delay
# '`' 1/4 second delay # '`' 1/4 second delay
# Modem lock directory (/var/lock as in FHS-3.0
# if you have it on tmpfs by systemd - read INSTALL.ru)
# uucp_lock_directory /var/lock
# #
# Yor modem devices names (will use first not locked one) # Yor modem devices names (will use first not locked one)
# ModemDev <device>[<:lock_speed>] # ModemDev <device>[<:lock_speed>]
@ -342,6 +352,9 @@ max_speed 57600
flags XW,V34B,IDC,LMD flags XW,V34B,IDC,LMD
emsi_OH_time 22:00-07:30 emsi_OH_time 22:00-07:30
emsi_FR_time 22:30-05:30 emsi_FR_time 22:30-05:30
#emsi_send_tz no
#emsi_send_time no
# #
# Our receiver buffer size [bytes] # Our receiver buffer size [bytes]
@ -442,6 +455,23 @@ skip_files_recv *.pif *.swp
# setsid - run command in a new session # setsid - run command in a new session
# useshell - run command by calling a shell (/bin/sh) # useshell - run command by calling a shell (/bin/sh)
# #
# Bforce will make environment for external programs
# which include these variables:
# $REM_ADDR_FTN - remote ftn address
# $REM_ADDR_INET - remote inet address
# $LOC_ADDR_FTN - local ftn address
# $LOC_ADDR_INET - local inet address
# $PASSWORD - session password
# $MAILER - remote mailer
# $LOCATION - remote location
# $SYSOP - remote SysOp name
# $SYSTEM_NAME - remote station name
# $PHONE - remote phone
# $FLAGS - remote flags
# $PROTECTED - password protected on both sides
# $LISTED - present in nodelist
# $INBOUND - current inbound path for this remote
#
#run_after_handshake [logout]/bin/echo "Hello, world!" #run_after_handshake [logout]/bin/echo "Hello, world!"
#run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in #run_after_session [nowait,setsid]/usr/local/lib/ftp/run-in
# #

@ -1 +1 @@
0.24.2 0.25

@ -84,6 +84,8 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(emsi_FR_time, CT_STRING), CONF_KEY(emsi_FR_time, CT_STRING),
CONF_KEY(emsi_OH_time, CT_STRING), CONF_KEY(emsi_OH_time, CT_STRING),
CONF_KEY(emsi_slave_sends_nak, CT_BOOLEAN), CONF_KEY(emsi_slave_sends_nak, CT_BOOLEAN),
CONF_KEY(emsi_send_tz, CT_BOOLEAN),
CONF_KEY(emsi_send_time, CT_BOOLEAN),
CONF_KEY(filebox, CT_FILEBOX), CONF_KEY(filebox, CT_FILEBOX),
CONF_KEY(filebox_directory, CT_PATH), CONF_KEY(filebox_directory, CT_PATH),
CONF_KEY(flags, CT_STRING), CONF_KEY(flags, CT_STRING),
@ -144,6 +146,7 @@ s_conf_entry bforce_config[BFORCE_NUMBER_OF_KEYWORDS+1] = {
CONF_KEY(password, CT_PASSWORD), CONF_KEY(password, CT_PASSWORD),
CONF_KEY(phone, CT_STRING), CONF_KEY(phone, CT_STRING),
CONF_KEY(phone_translate, CT_TRANSLATE), CONF_KEY(phone_translate, CT_TRANSLATE),
CONF_KEY(proto_order, CT_STRING),
CONF_KEY(recode_file_in, CT_STRING), CONF_KEY(recode_file_in, CT_STRING),
CONF_KEY(recode_file_out, CT_STRING), CONF_KEY(recode_file_out, CT_STRING),
CONF_KEY(recode_intro_in, CT_STRING), CONF_KEY(recode_intro_in, CT_STRING),

@ -123,8 +123,8 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode)
port = "binkp"; port = "binkp";
else if( tcpmode == TCPMODE_TELNET ) else if( tcpmode == TCPMODE_TELNET )
port = "telnet"; port = "telnet";
else /* Default service name is "fido" */ else /* Can not rely on /etc/services - it is not well-known port */
port = "fido"; port = "60179";
if( ISDEC(port) ) if( ISDEC(port) )
server.sin_port = htons(atoi(port)); server.sin_port = htons(atoi(port));

@ -77,7 +77,7 @@ static char *lock_getname(const char *lockdir, const s_modemport *modemport)
ASSERT(modemport != NULL); ASSERT(modemport != NULL);
if( lockdir && *lockdir ) if( *lockdir )
lckname = (char *)xstrcpy(lockdir); lckname = (char *)xstrcpy(lockdir);
else else
lckname = (char *)xstrcpy(BFORCE_LOCK_DIR); lckname = (char *)xstrcpy(BFORCE_LOCK_DIR);
@ -314,7 +314,7 @@ int port_lock(const char *lockdir, const s_modemport *modemport)
char *lckname; char *lckname;
char *tmpname, *p_tmpname; char *tmpname, *p_tmpname;
if( lockdir && *lockdir ) if( *lockdir )
tmpname = xstrcpy(lockdir); tmpname = xstrcpy(lockdir);
else else
tmpname = xstrcpy(BFORCE_LOCK_DIR); tmpname = xstrcpy(BFORCE_LOCK_DIR);

@ -598,6 +598,8 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
s_cval_entry *addr_ptr; s_cval_entry *addr_ptr;
s_cval_entry *hide_ptr; s_cval_entry *hide_ptr;
s_faddr *primary = NULL; s_faddr *primary = NULL;
char xdt[EMSI_MAXXDATETIME+1];
time_t xtm;
const long options = conf_options(cf_options); const long options = conf_options(cf_options);
const long speed = conf_number(cf_max_speed); const long speed = conf_number(cf_max_speed);
@ -737,6 +739,10 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
{ emsi->compcodes.JAN = 1; } { emsi->compcodes.JAN = 1; }
if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA ) if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA )
{ emsi->compcodes.HYD = 1; } { emsi->compcodes.HYD = 1; }
DEB((D_HSHAKE,"Generated compcodes for caller: NCP:%x.ZMO:%x.ZAP:%x.DZA:%x.JAN:%x.HYD:%x.KER:%x.SLK:%x.TZA:%x",
emsi->compcodes.NCP, emsi->compcodes.ZMO, emsi->compcodes.ZAP,
emsi->compcodes.DZA, emsi->compcodes.JAN, emsi->compcodes.HYD,
emsi->compcodes.KER, emsi->compcodes.SLK, emsi->compcodes.TZA));
} }
else else
{ {
@ -813,6 +819,22 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc,
strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags)); strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags));
} }
/* ----------------------------------------------------------------- */
/* Data for {TZUTC} and {XDATETIME} field */
/* ----------------------------------------------------------------- */
if ( conf_boolean(cf_emsi_send_tz) ) {
emsi->have_tzutc = 1;
emsi->tzutc = (int)(time_gmtoffset());
}
if ( conf_boolean(cf_emsi_send_time) ) {
emsi->have_xdatetime = 1;
strnxcpy(xdt,time_string_format(xdt, EMSI_MAXXDATETIME, "%d.%m.%Y %H:%M:%S %z", xtm),EMSI_MAXXDATETIME);
strnxcpy(emsi->xdatetime, xdt, sizeof(emsi->xdatetime));
}
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/* Data for {OHFR} field */ /* Data for {OHFR} field */
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */

@ -134,6 +134,7 @@ int emsi_incoming(s_handshake_protocol *THIS)
int rc = HRC_OK; int rc = HRC_OK;
s_emsi *remote_emsi = NULL; s_emsi *remote_emsi = NULL;
s_emsi *local_emsi = NULL; s_emsi *local_emsi = NULL;
char *p = NULL;
ASSERT(THIS); ASSERT(THIS);
ASSERT(THIS->remote_data); ASSERT(THIS->remote_data);
@ -198,7 +199,34 @@ int emsi_incoming(s_handshake_protocol *THIS)
/* /*
* Set protocol that we will use * Set protocol that we will use
* EMSI-II compatible as of v0.25
*/ */
if ( remote_emsi->compcodes.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;
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) ) if( remote_emsi->compcodes.HYD && !(options & OPTIONS_NO_HYDRA) )
THIS->protocol = PROT_HYDRA; THIS->protocol = PROT_HYDRA;
else if( remote_emsi->compcodes.ZAP && !(options & OPTIONS_NO_ZEDZAP) ) else if( remote_emsi->compcodes.ZAP && !(options & OPTIONS_NO_ZEDZAP) )
@ -208,8 +236,9 @@ int emsi_incoming(s_handshake_protocol *THIS)
else /* NCP */ else /* NCP */
{ {
THIS->protocol = PROT_NOPROT; THIS->protocol = PROT_NOPROT;
rc = HRC_NO_PROTOS;
} }
}
if ( THIS->protocol == PROT_NOPROT ) rc = HRC_NO_PROTOS;
/* /*
* Check EMSI flags and set corresponding local HOLD flags * Check EMSI flags and set corresponding local HOLD flags

@ -103,6 +103,10 @@ char *emsi_createdat(s_emsi *emsi)
char *tmp = NULL; char *tmp = NULL;
char buf[100]; char buf[100];
char abuf[BF_MAXADDRSTR+1]; char abuf[BF_MAXADDRSTR+1];
char *p_order = NULL;
char *ord = NULL;
tmp = (char *)xstrcpy("**EMSI_DAT0000"); tmp = (char *)xstrcpy("**EMSI_DAT0000");
@ -179,14 +183,79 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
} }
/* compatibility_codes */ /* compatibility_codes (EMSI behavior as FTS-0088) */
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,"); p_order = conf_string(cf_proto_order);
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,"); if ( !p_order ) {
if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,");
if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,"); if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,");
if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,");
if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,");
if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,");
if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,");
if( emsi->compcodes.TZA ) tmp = add_str(tmp, "TZA,");
if( emsi->compcodes.SLK ) tmp = add_str(tmp, "SLK,");
if( emsi->compcodes.KER ) tmp = add_str(tmp, "KER,");
if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,");
} else {
ord = xmalloc(4);
DEB((D_HSHAKE,"Protocol order found: %s", p_order));
ord = strncpy(ord, p_order,3);
ord[3] = '\0';
DEB((D_HSHAKE,"Protocol order chunk: %s", ord));
if ( ord == NULL )
DEB((D_HSHAKE,"EMSI create order error"));
if ( !strcmp(ord,"HYD") )
if ( emsi->compcodes.HYD) tmp = add_str(tmp, "HYD,");
if ( !strcmp(ord,"JAN") )
if ( emsi->compcodes.JAN) tmp = add_str(tmp, "JAN,");
if ( !strcmp(ord,"DZA") )
if ( emsi->compcodes.DZA) tmp = add_str(tmp, "DZA,");
if ( !strcmp(ord,"ZAP") )
if ( emsi->compcodes.ZAP) tmp = add_str(tmp, "ZAP,");
if ( !strcmp(ord,"ZMO") )
if ( emsi->compcodes.ZMO) tmp = add_str(tmp, "ZMO,");
if ( !strcmp(ord,"TZA") )
if ( emsi->compcodes.TZA) tmp = add_str(tmp, "TZA,");
if ( !strcmp(ord,"SLK") )
if ( emsi->compcodes.SLK) tmp = add_str(tmp, "SLK,");
if ( !strcmp(ord,"KER") )
if ( emsi->compcodes.KER) tmp = add_str(tmp, "KER,");
if ( !strcmp(ord,"NCP") )
if ( emsi->compcodes.NCP) tmp = add_str(tmp, "NCP,");
p_order = strchr(p_order, ',');
if ( p_order ) p_order = p_order+1; /* skip ',' */
while ( p_order ) {
ord = strncpy(ord, p_order,3);
ord[3] = '\0';
DEB((D_HSHAKE,"Protocol order chunk: %s", ord));
if ( ord == NULL )
DEB((D_HSHAKE,"EMSI create order error"));
if ( !strcmp(ord,"HYD") )
if ( emsi->compcodes.HYD) tmp = add_str(tmp, "HYD,");
if ( !strcmp(ord,"JAN") )
if ( emsi->compcodes.JAN) tmp = add_str(tmp, "JAN,");
if ( !strcmp(ord,"DZA") )
if ( emsi->compcodes.DZA) tmp = add_str(tmp, "DZA,");
if ( !strcmp(ord,"ZAP") )
if ( emsi->compcodes.ZAP) tmp = add_str(tmp, "ZAP,");
if ( !strcmp(ord,"ZMO") )
if ( emsi->compcodes.ZMO) tmp = add_str(tmp, "ZMO,");
if ( !strcmp(ord,"TZA") )
if ( emsi->compcodes.TZA) tmp = add_str(tmp, "TZA,");
if ( !strcmp(ord,"SLK") )
if ( emsi->compcodes.SLK) tmp = add_str(tmp, "SLK,");
if ( !strcmp(ord,"KER") )
if ( emsi->compcodes.KER) tmp = add_str(tmp, "KER,");
if ( !strcmp(ord,"NCP") )
if ( emsi->compcodes.NCP) tmp = add_str(tmp, "NCP,");
p_order = strchr(p_order, ',');
if ( p_order ) p_order = p_order+1; /* skip ',' */
}
free(ord);
}
if( emsi->compcodes.FRQ ) tmp = add_str(tmp, "FRQ,"); if( emsi->compcodes.FRQ ) tmp = add_str(tmp, "FRQ,");
if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,"); if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,");
if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,"); if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,");
@ -325,10 +394,15 @@ char *emsi_createdat(s_emsi *emsi)
tmp = add_char(tmp, '{'); tmp = add_char(tmp, '{');
tmp = add_char(tmp, '['); tmp = add_char(tmp, '[');
sprintf(buf, "+%04d", emsi->tzutc); /* BUGGY */
tmp = add_str(tmp, buf); // sprintf(buf, "+%04d", emsi->tzutc);
ord = xmalloc(6);
ord = xstrcpy(time_string_gmtoffset(ord));
ord[5] = '\0';
tmp = add_str(tmp, ord);
tmp = add_char(tmp, ']'); tmp = add_char(tmp, ']');
tmp = add_char(tmp, '}'); tmp = add_char(tmp, '}');
free(ord);
} }
/* {XDATE} indentifier.. What's the fucking invention :-/ /* {XDATE} indentifier.. What's the fucking invention :-/
@ -450,6 +524,8 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
{ {
int i; int i;
char *tmp, *p, *q, *n; char *tmp, *p, *q, *n;
unsigned int tzh, tzm,tzn ;
char *tzc, *otmp;
while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL ) while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL )
{ {
@ -525,13 +601,64 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
/* compatibility codes */ /* compatibility codes */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p)); DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p));
emsi->proto_order[0] = '\0';
for( p = strtok(p, ","); p; p=strtok(NULL, ",") ) for( p = strtok(p, ","); p; p=strtok(NULL, ",") )
{ {
if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1; /* if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1;
else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1; else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1;
else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1; else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1;
else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1; else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1;
else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1; else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1;
*/
if ( !strcmp(p, "ZMO") ) {
emsi->compcodes.ZMO = 1;
otmp = strcat(emsi->proto_order,"ZMO,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "ZAP") ) {
emsi->compcodes.ZAP = 1;
otmp = strcat(emsi->proto_order,"ZAP,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "DZA") ) {
emsi->compcodes.DZA = 1;
otmp = strcat(emsi->proto_order,"DZA,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "JAN") ) {
emsi->compcodes.JAN = 1;
otmp = strcat(emsi->proto_order,"JAN,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "HYD") ) {
emsi->compcodes.HYD = 1;
otmp = strcat(emsi->proto_order,"HYD,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "KER") ) {
emsi->compcodes.KER = 1;
otmp = strcat(emsi->proto_order,"KER,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "TZA") ) {
emsi->compcodes.TZA = 1;
otmp = strcat(emsi->proto_order,"TZA,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if ( !strcmp(p, "SLK") ) {
emsi->compcodes.SLK = 1;
otmp = strcat(emsi->proto_order,"SLK,");
strcpy(emsi->proto_order, otmp);
DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp));
}
else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1; else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1;
else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1; else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1;
else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1; else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1;
@ -542,6 +669,9 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
else if( !strcmp(p, "BBS") ) emsi->compcodes.BBS = 1; else if( !strcmp(p, "BBS") ) emsi->compcodes.BBS = 1;
else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1; else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1;
} }
/* Delete last comma from order list */
emsi->proto_order[strlen(emsi->proto_order)-1] = '\0';
DEB((D_HSHAKE,"Ordered compcodes: %s",emsi->proto_order));
/* mailer information */ /* mailer information */
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
@ -646,13 +776,31 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi)
} }
else if( strcmp(tmp, "TZUTC") == 0 ) else if( strcmp(tmp, "TZUTC") == 0 )
{ {
emsi->have_tzutc = 1;
if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1);
if( (p=get_field(&p, '[', ']')) == NULL ) return(1); if( (p=get_field(&p, '[', ']')) == NULL ) return(1);
/* Parse EMSI TZUTC in fmt (+|-)HHMM */
if( *p ) {
tzc = malloc(2);
DEB((D_HSHAKE, "Got TZUTC=%s for parsing", p));
tzn = sscanf( p, "%1c%02u%02u", tzc, &tzh, &tzm);
tzc[1] = '\0';
if ( tzn == 3) {
DEB((D_HSHAKE, "Got TZC=%s , H=%u, M=%u", tzc, tzh,tzm));
emsi->have_tzutc = 1;
if ( strcmp(tzc, "-") == 0 ) {
emsi->tzutc = -(tzh*60 + tzm);
} else {
emsi->tzutc = tzh*60 + tzm;
}
} else {
DEB((D_HSHAKE,"TZUTC value not parsed!"));
}
free(tzc);
}
} }
else else
{ {
DEB((D_HSHAKE, "Step - no known EMSI-part - got %s", tmp));
strnxcat(emsi->addons, "{", sizeof(emsi->addons)); strnxcat(emsi->addons, "{", sizeof(emsi->addons));
strnxcat(emsi->addons, tmp, sizeof(emsi->addons)); strnxcat(emsi->addons, tmp, sizeof(emsi->addons));
strnxcat(emsi->addons, "}", sizeof(emsi->addons)); strnxcat(emsi->addons, "}", sizeof(emsi->addons));

@ -71,6 +71,7 @@ int answ_system(e_session type, char *connstr, int inetd)
if( inetd ) if( inetd )
{ {
log("Answering TCPIP call...");
if( connstr && *connstr ) if( connstr && *connstr )
state.connstr = (char*)xstrcpy(connstr); state.connstr = (char*)xstrcpy(connstr);
else if( getpeername(0, (struct sockaddr*)&client, &clientlen) == -1 ) else if( getpeername(0, (struct sockaddr*)&client, &clientlen) == -1 )
@ -116,9 +117,10 @@ int answ_system(e_session type, char *connstr, int inetd)
port_carrier(0, TRUE); port_carrier(0, TRUE);
rc = session(); rc = session();
log("Session ended up, rc=%d, inetd=%d", rc, inetd);
if( (inetd == 0) && (state.inet == FALSE) ) if( ( !inetd ) )
{ {
log("Deactivating modem port");
port_deinit(0, &oldtio); port_deinit(0, &oldtio);
port_close(); port_close();
} }

@ -173,18 +173,18 @@ long time_gmtoffset(void)
time_t tt = time(NULL); time_t tt = time(NULL);
struct tm local = *localtime(&tt); struct tm local = *localtime(&tt);
struct tm gmt = *gmtime(&tt); struct tm gmt = *gmtime(&tt);
long tz = gmt.tm_yday - local.tm_yday; long tz = local.tm_yday - gmt.tm_yday;
if( tz > 1 ) if( tz > 1 )
tz = -24;
else if( tz < -1 )
tz = 24; tz = 24;
else if( tz < -1 )
tz = -24;
else else
tz *= 24; tz *= 24;
tz += gmt.tm_hour - local.tm_hour; tz += local.tm_hour - gmt.tm_hour;
tz *= 60; tz *= 60;
tz += gmt.tm_min - local.tm_min; tz += local.tm_min - gmt.tm_min;
return tz; return tz;
} }
@ -202,10 +202,11 @@ char *time_string_gmtoffset(char *buffer)
{ {
long tz = time_gmtoffset(); long tz = time_gmtoffset();
char sign = (tz > 0)?'+':'-'; char sign = (tz > 0)?'+':'-';
int hour = tz/60; tz = abs(tz);
int mint = tz%60; unsigned int hour = tz/60;
unsigned int mint = tz%60;
sprintf(buffer, "%c%02d%02d", sign, hour, mint); sprintf(buffer, "%c%02u%02u", sign, hour, mint);
return buffer; return buffer;
} }

@ -179,6 +179,8 @@ typedef enum {
cf_emsi_FR_time, cf_emsi_FR_time,
cf_emsi_OH_time, cf_emsi_OH_time,
cf_emsi_slave_sends_nak, cf_emsi_slave_sends_nak,
cf_emsi_send_tz,
cf_emsi_send_time,
cf_filebox, cf_filebox,
cf_filebox_directory, cf_filebox_directory,
cf_flags, cf_flags,
@ -239,6 +241,7 @@ typedef enum {
cf_password, cf_password,
cf_phone, cf_phone,
cf_phone_translate, cf_phone_translate,
cf_proto_order,
cf_recode_file_in, cf_recode_file_in,
cf_recode_file_out, cf_recode_file_out,
cf_recode_intro_in, cf_recode_intro_in,

@ -116,7 +116,10 @@ struct compcodes
ZAP:1, /* ZedZap (Zmodem variant) */ ZAP:1, /* ZedZap (Zmodem variant) */
DZA:1, /* DirectZAP (Zmodem variant) */ DZA:1, /* DirectZAP (Zmodem variant) */
JAN:1, /* Janus */ JAN:1, /* Janus */
HYD:1; /* Hydra */ HYD:1, /* Hydra */
KER:1, /* Kermit, not supported */
SLK:1, /* SEALink, not supported */
TZA:1; /* TrapDoor DirectZAP, not supported */
UINT16 FRQ:1, /* The system will accept and process FREQs */ UINT16 FRQ:1, /* The system will accept and process FREQs */
NRQ:1, /* No file requests accepted by this system */ NRQ:1, /* No file requests accepted by this system */
@ -148,6 +151,7 @@ struct emsi
char passwd[EMSI_MAXPASSWD+1]; char passwd[EMSI_MAXPASSWD+1];
s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */ s_linkcodes linkcodes; /* XXn linkcodes contained in eaddr */
s_compcodes compcodes; s_compcodes compcodes;
char proto_order[EMSI_MAXADDONS+1];
char m_pid[EMSI_MAXMPID+1]; char m_pid[EMSI_MAXMPID+1];
char m_name[EMSI_MAXMNAME+1]; char m_name[EMSI_MAXMNAME+1];
char m_ver[EMSI_MAXMVER+1]; char m_ver[EMSI_MAXMVER+1];

Loading…
Cancel
Save