From 6ebf2fc7a3583e02b98cb489cbe9eb05e6584b9d Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Mon, 27 May 2024 23:30:25 +0300 Subject: [PATCH] EMSI handshake FTSC-0088 compliant, protocol_order, EMSI TZUTC --- CHANGES | 20 +++- INSTALL.ru | 33 +++++-- contrib/legacy-part.conf | 19 ++++ examples/bforce.conf | 34 ++++++- source/.version | 2 +- source/bforce/conf_proc.c | 3 + source/bforce/io_tcpip.c | 4 +- source/bforce/io_unix_lock.c | 4 +- source/bforce/prot_emsi.c | 22 +++++ source/bforce/prot_emsi_api.c | 47 +++++++-- source/bforce/prot_emsi_misc.c | 174 ++++++++++++++++++++++++++++++--- source/bforce/sess_answ.c | 4 +- source/bforce/u_time.c | 17 ++-- source/include/confread.h | 3 + source/include/prot_emsi.h | 6 +- 15 files changed, 344 insertions(+), 48 deletions(-) create mode 100644 contrib/legacy-part.conf diff --git a/CHANGES b/CHANGES index 86b05b2..a90d1d3 100644 --- a/CHANGES +++ b/CHANGES @@ -228,9 +228,25 @@ 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. diff --git a/INSTALL.ru b/INSTALL.ru index e7aeeb1..a697fd5 100644 --- a/INSTALL.ru +++ b/INSTALL.ru @@ -1,10 +1,10 @@ В этом файле описывается процесс установки и настройки -фидонет-совместимого мейлера bforce 0.22.8.ugenk1. +фидонет-совместимого мейлера bforce 0.xx. В данном документе приняты следующие обозначения: - путь, куда вы распаковали тарболл с исходными - текстами bforce 0.22.8.ugenk1 (далее bforce) + текстами bforce 0.xx (далее bforce) Тарболл - файл с расширением tar.gz, или tar.bz2 @@ -24,14 +24,14 @@ gmake Распакуйте тарболл следующими командами: -gzip -d bforce-0.22.8.ugenk1.tar.gz +gzip -d bforce-master.tar.gz или -bzip2 -d bforce-0.22.8.ugenk1.tar.bz2 +bzip2 -d bforce-master.tar.bz2 -tar -xvf bforce-0.22.8.ugenk1.tar +tar -xvf bforce-master.tar -Перейдите в директорию bforce-0.22.8.ugenk1/source: -cd /bforce-0.22.8.ugenk1/source +Перейдите в директорию bforce/source: +cd /bforce/source Для создания Makefile, который наиболее подходит к вашей системе, наберите: @@ -76,6 +76,11 @@ gmake install Настройка ========= +Рекомендуется установить системную переменную BFCONFIG, +указывающую на местоположение конфигурации bforce. +Проще всего через /etc/environment для общесистемной или +.profile для переменной пользователя. + Для нормальной работы вам нужно отредактировать конфигурационные файлы bforce. По умолчанию они находятся в /usr/local/fido/etc и называются bforce.conf - основной конфигурационный файл bforce @@ -125,6 +130,19 @@ cat `which mgetty` |strings |grep FIDO |wc -l где news - это пользователь, из-под которого у вас работает ftn-подсистема. +Bforce при ИСХОДЯЩИХ звонках использует файлы блокировки порта модема, +при несовпадении каталога или невозможности создания файла +mgetty сбросит модем во время звонка. +Поэтому настоятельно рекомендуется проверить права на папку /var/lock +и то, на какой ФС она расположенв. +Современные системы имеют тенденцию к применению /var/lock как ссылки +на /run/lock, а ФС /run монтируется и создается на tmpfs при каждой +загрузке с помощью systemd-tempfiles. +Для изменения поведения необходимо создать файл в /etc/tempfiles.d/, +совпадающим (за исключением части имени -part) c именем файла в +/usr/lib/systemd/systemd-tempfiles.d. +Рабочий пример legacy-part.conf в папке contrib. + Совместная работа с inetd/xinetd ================================ К сожалению (или к счастью), bforce не умеет самостоятельно принимать входящие @@ -150,6 +168,7 @@ init.d/bforce - init- bfha - bforce history analyzer (bfha) bfha/README - bfha README bfha/bfha.pl - собственно, bfha +legacy-part.conf - файл для донастройки прав на /run/lock в systemd u-srif - продвинутый freq-процессор u-srif/u-srif-index.py \ с поддержой отчетов, u-srif/u-srif-lookup.py \ ограничений, diff --git a/contrib/legacy-part.conf b/contrib/legacy-part.conf new file mode 100644 index 0000000..48c3268 --- /dev/null +++ b/contrib/legacy-part.conf @@ -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 - \ No newline at end of file diff --git a/examples/bforce.conf b/examples/bforce.conf index c84436f..c613b43 100644 --- a/examples/bforce.conf +++ b/examples/bforce.conf @@ -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 @@ -109,13 +115,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 +259,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 [<:lock_speed>] @@ -342,6 +352,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 +455,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 # diff --git a/source/.version b/source/.version index 8b95abd..7d385d4 100644 --- a/source/.version +++ b/source/.version @@ -1 +1 @@ -0.24.2 +0.25 diff --git a/source/bforce/conf_proc.c b/source/bforce/conf_proc.c index c2dfa54..1d7d02a 100644 --- a/source/bforce/conf_proc.c +++ b/source/bforce/conf_proc.c @@ -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), @@ -144,6 +146,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), diff --git a/source/bforce/io_tcpip.c b/source/bforce/io_tcpip.c index 4148d40..36c5f55 100644 --- a/source/bforce/io_tcpip.c +++ b/source/bforce/io_tcpip.c @@ -123,8 +123,8 @@ 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"; if( ISDEC(port) ) server.sin_port = htons(atoi(port)); diff --git a/source/bforce/io_unix_lock.c b/source/bforce/io_unix_lock.c index 4d281e1..7c2bd92 100644 --- a/source/bforce/io_unix_lock.c +++ b/source/bforce/io_unix_lock.c @@ -77,7 +77,7 @@ static char *lock_getname(const char *lockdir, const s_modemport *modemport) ASSERT(modemport != NULL); - if( lockdir && *lockdir ) + if( *lockdir ) lckname = (char *)xstrcpy(lockdir); else lckname = (char *)xstrcpy(BFORCE_LOCK_DIR); @@ -314,7 +314,7 @@ int port_lock(const char *lockdir, const s_modemport *modemport) char *lckname; char *tmpname, *p_tmpname; - if( lockdir && *lockdir ) + if( *lockdir ) tmpname = xstrcpy(lockdir); else tmpname = xstrcpy(BFORCE_LOCK_DIR); diff --git a/source/bforce/prot_emsi.c b/source/bforce/prot_emsi.c index 1ffbba7..028fba3 100644 --- a/source/bforce/prot_emsi.c +++ b/source/bforce/prot_emsi.c @@ -598,6 +598,8 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc, s_cval_entry *addr_ptr; s_cval_entry *hide_ptr; s_faddr *primary = NULL; + char xdt[EMSI_MAXXDATETIME+1]; + time_t xtm; const long options = conf_options(cf_options); const long speed = conf_number(cf_max_speed); @@ -737,6 +739,10 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc, { emsi->compcodes.JAN = 1; } if( (options & OPTIONS_NO_HYDRA) != OPTIONS_NO_HYDRA ) { emsi->compcodes.HYD = 1; } + DEB((D_HSHAKE,"Generated compcodes for caller: NCP:%x.ZMO:%x.ZAP:%x.DZA:%x.JAN:%x.HYD:%x.KER:%x.SLK:%x.TZA:%x", + emsi->compcodes.NCP, emsi->compcodes.ZMO, emsi->compcodes.ZAP, + emsi->compcodes.DZA, emsi->compcodes.JAN, emsi->compcodes.HYD, + emsi->compcodes.KER, emsi->compcodes.SLK, emsi->compcodes.TZA)); } else { @@ -813,6 +819,22 @@ void emsi_set_sysinfo(s_emsi *emsi, s_emsi *remote_emsi, int hrc, strnxcpy(emsi->flags, p_flags ? p_flags : "MO", sizeof(emsi->flags)); } + /* ----------------------------------------------------------------- */ + /* Data for {TZUTC} and {XDATETIME} field */ + /* ----------------------------------------------------------------- */ + + if ( conf_boolean(cf_emsi_send_tz) ) { + emsi->have_tzutc = 1; + emsi->tzutc = (int)(time_gmtoffset()); + } + + if ( conf_boolean(cf_emsi_send_time) ) { + emsi->have_xdatetime = 1; + + strnxcpy(xdt,time_string_format(xdt, EMSI_MAXXDATETIME, "%d.%m.%Y %H:%M:%S %z", xtm),EMSI_MAXXDATETIME); + strnxcpy(emsi->xdatetime, xdt, sizeof(emsi->xdatetime)); + } + /* ----------------------------------------------------------------- */ /* Data for {OHFR} field */ /* ----------------------------------------------------------------- */ diff --git a/source/bforce/prot_emsi_api.c b/source/bforce/prot_emsi_api.c index c77fc14..684dc9e 100644 --- a/source/bforce/prot_emsi_api.c +++ b/source/bforce/prot_emsi_api.c @@ -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 diff --git a/source/bforce/prot_emsi_misc.c b/source/bforce/prot_emsi_misc.c index 12fdf2c..7f91403 100644 --- a/source/bforce/prot_emsi_misc.c +++ b/source/bforce/prot_emsi_misc.c @@ -103,6 +103,10 @@ char *emsi_createdat(s_emsi *emsi) char *tmp = NULL; char buf[100]; char abuf[BF_MAXADDRSTR+1]; + char *p_order = NULL; + char *ord = NULL; + + tmp = (char *)xstrcpy("**EMSI_DAT0000"); @@ -179,14 +183,79 @@ char *emsi_createdat(s_emsi *emsi) tmp = add_char(tmp, '}'); } - /* compatibility_codes */ + /* compatibility_codes (EMSI behavior as FTS-0088) */ tmp = add_char(tmp, '{'); - if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,"); - if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,"); - if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,"); - if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,"); - if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,"); - if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,"); + + p_order = conf_string(cf_proto_order); + + if ( !p_order ) { + if( emsi->compcodes.HYD ) tmp = add_str(tmp, "HYD,"); + if( emsi->compcodes.JAN ) tmp = add_str(tmp, "JAN,"); + if( emsi->compcodes.DZA ) tmp = add_str(tmp, "DZA,"); + if( emsi->compcodes.ZAP ) tmp = add_str(tmp, "ZAP,"); + if( emsi->compcodes.ZMO ) tmp = add_str(tmp, "ZMO,"); + if( emsi->compcodes.TZA ) tmp = add_str(tmp, "TZA,"); + if( emsi->compcodes.SLK ) tmp = add_str(tmp, "SLK,"); + if( emsi->compcodes.KER ) tmp = add_str(tmp, "KER,"); + if( emsi->compcodes.NCP ) tmp = add_str(tmp, "NCP,"); + } else { + ord = xmalloc(4); + DEB((D_HSHAKE,"Protocol order found: %s", p_order)); + ord = strncpy(ord, p_order,3); + ord[3] = '\0'; + DEB((D_HSHAKE,"Protocol order chunk: %s", ord)); + if ( ord == NULL ) + DEB((D_HSHAKE,"EMSI create order error")); + if ( !strcmp(ord,"HYD") ) + if ( emsi->compcodes.HYD) tmp = add_str(tmp, "HYD,"); + if ( !strcmp(ord,"JAN") ) + if ( emsi->compcodes.JAN) tmp = add_str(tmp, "JAN,"); + if ( !strcmp(ord,"DZA") ) + if ( emsi->compcodes.DZA) tmp = add_str(tmp, "DZA,"); + if ( !strcmp(ord,"ZAP") ) + if ( emsi->compcodes.ZAP) tmp = add_str(tmp, "ZAP,"); + if ( !strcmp(ord,"ZMO") ) + if ( emsi->compcodes.ZMO) tmp = add_str(tmp, "ZMO,"); + if ( !strcmp(ord,"TZA") ) + if ( emsi->compcodes.TZA) tmp = add_str(tmp, "TZA,"); + if ( !strcmp(ord,"SLK") ) + if ( emsi->compcodes.SLK) tmp = add_str(tmp, "SLK,"); + if ( !strcmp(ord,"KER") ) + if ( emsi->compcodes.KER) tmp = add_str(tmp, "KER,"); + if ( !strcmp(ord,"NCP") ) + if ( emsi->compcodes.NCP) tmp = add_str(tmp, "NCP,"); + p_order = strchr(p_order, ','); + if ( p_order ) p_order = p_order+1; /* skip ',' */ + while ( p_order ) { + ord = strncpy(ord, p_order,3); + ord[3] = '\0'; + DEB((D_HSHAKE,"Protocol order chunk: %s", ord)); + if ( ord == NULL ) + DEB((D_HSHAKE,"EMSI create order error")); + if ( !strcmp(ord,"HYD") ) + if ( emsi->compcodes.HYD) tmp = add_str(tmp, "HYD,"); + if ( !strcmp(ord,"JAN") ) + if ( emsi->compcodes.JAN) tmp = add_str(tmp, "JAN,"); + if ( !strcmp(ord,"DZA") ) + if ( emsi->compcodes.DZA) tmp = add_str(tmp, "DZA,"); + if ( !strcmp(ord,"ZAP") ) + if ( emsi->compcodes.ZAP) tmp = add_str(tmp, "ZAP,"); + if ( !strcmp(ord,"ZMO") ) + if ( emsi->compcodes.ZMO) tmp = add_str(tmp, "ZMO,"); + if ( !strcmp(ord,"TZA") ) + if ( emsi->compcodes.TZA) tmp = add_str(tmp, "TZA,"); + if ( !strcmp(ord,"SLK") ) + if ( emsi->compcodes.SLK) tmp = add_str(tmp, "SLK,"); + if ( !strcmp(ord,"KER") ) + if ( emsi->compcodes.KER) tmp = add_str(tmp, "KER,"); + if ( !strcmp(ord,"NCP") ) + if ( emsi->compcodes.NCP) tmp = add_str(tmp, "NCP,"); + p_order = strchr(p_order, ','); + if ( p_order ) p_order = p_order+1; /* skip ',' */ + } + free(ord); + } + if( emsi->compcodes.FRQ ) tmp = add_str(tmp, "FRQ,"); if( emsi->compcodes.NRQ ) tmp = add_str(tmp, "NRQ,"); if( emsi->compcodes.ARC ) tmp = add_str(tmp, "ARC,"); @@ -325,10 +394,15 @@ char *emsi_createdat(s_emsi *emsi) tmp = add_char(tmp, '{'); tmp = add_char(tmp, '['); - sprintf(buf, "+%04d", emsi->tzutc); - tmp = add_str(tmp, buf); + /* BUGGY */ + // sprintf(buf, "+%04d", emsi->tzutc); + ord = xmalloc(6); + ord = xstrcpy(time_string_gmtoffset(ord)); + ord[5] = '\0'; + tmp = add_str(tmp, ord); tmp = add_char(tmp, ']'); tmp = add_char(tmp, '}'); + free(ord); } /* {XDATE} indentifier.. What's the fucking invention :-/ @@ -450,6 +524,8 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi) { int i; char *tmp, *p, *q, *n; + unsigned int tzh, tzm,tzn ; + char *tzc, *otmp; while( (tmp=get_field(&emsi_dat, '{', '}')) != NULL ) { @@ -525,13 +601,64 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi) /* compatibility codes */ if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); DEB((D_HSHAKE, "parse_emsidat: compatibility codes: %s", p)); + emsi->proto_order[0] = '\0'; + for( p = strtok(p, ","); p; p=strtok(NULL, ",") ) { - if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1; + /* if( !strcmp(p, "ZMO") ) emsi->compcodes.ZMO = 1; else if( !strcmp(p, "ZAP") ) emsi->compcodes.ZAP = 1; else if( !strcmp(p, "DZA") ) emsi->compcodes.DZA = 1; else if( !strcmp(p, "JAN") ) emsi->compcodes.JAN = 1; else if( !strcmp(p, "HYD") ) emsi->compcodes.HYD = 1; + */ + if ( !strcmp(p, "ZMO") ) { + emsi->compcodes.ZMO = 1; + otmp = strcat(emsi->proto_order,"ZMO,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "ZAP") ) { + emsi->compcodes.ZAP = 1; + otmp = strcat(emsi->proto_order,"ZAP,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "DZA") ) { + emsi->compcodes.DZA = 1; + otmp = strcat(emsi->proto_order,"DZA,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "JAN") ) { + emsi->compcodes.JAN = 1; + otmp = strcat(emsi->proto_order,"JAN,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "HYD") ) { + emsi->compcodes.HYD = 1; + otmp = strcat(emsi->proto_order,"HYD,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "KER") ) { + emsi->compcodes.KER = 1; + otmp = strcat(emsi->proto_order,"KER,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "TZA") ) { + emsi->compcodes.TZA = 1; + otmp = strcat(emsi->proto_order,"TZA,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } + else if ( !strcmp(p, "SLK") ) { + emsi->compcodes.SLK = 1; + otmp = strcat(emsi->proto_order,"SLK,"); + strcpy(emsi->proto_order, otmp); + DEB((D_HSHAKE,"Parse_emsidat: ordered proto added: %s", otmp)); + } else if( !strcmp(p, "NCP") ) emsi->compcodes.NCP = 1; else if( !strcmp(p, "NRQ") ) emsi->compcodes.NRQ = 1; else if( !strcmp(p, "ARC") ) emsi->compcodes.ARC = 1; @@ -542,6 +669,9 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi) else if( !strcmp(p, "BBS") ) emsi->compcodes.BBS = 1; else if( !strcmp(p, "HFR") ) emsi->compcodes.HFR = 1; } + /* Delete last comma from order list */ + emsi->proto_order[strlen(emsi->proto_order)-1] = '\0'; + DEB((D_HSHAKE,"Ordered compcodes: %s",emsi->proto_order)); /* mailer information */ if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); @@ -645,14 +775,32 @@ int emsi_parsedat(char *emsi_dat, s_emsi *emsi) if( *p ) strnxcpy(emsi->xdatetime, p, sizeof(emsi->xdatetime)); } else if( strcmp(tmp, "TZUTC") == 0 ) - { - emsi->have_tzutc = 1; - + { if( (p=get_field(&emsi_dat, '{', '}')) == NULL ) return(1); if( (p=get_field(&p, '[', ']')) == NULL ) return(1); + /* Parse EMSI TZUTC in fmt (+|-)HHMM */ + if( *p ) { + tzc = malloc(2); + DEB((D_HSHAKE, "Got TZUTC=%s for parsing", p)); + tzn = sscanf( p, "%1c%02u%02u", tzc, &tzh, &tzm); + tzc[1] = '\0'; + if ( tzn == 3) { + DEB((D_HSHAKE, "Got TZC=%s , H=%u, M=%u", tzc, tzh,tzm)); + emsi->have_tzutc = 1; + if ( strcmp(tzc, "-") == 0 ) { + emsi->tzutc = -(tzh*60 + tzm); + } else { + emsi->tzutc = tzh*60 + tzm; + } + } else { + DEB((D_HSHAKE,"TZUTC value not parsed!")); + } + free(tzc); + } } else { + DEB((D_HSHAKE, "Step - no known EMSI-part - got %s", tmp)); strnxcat(emsi->addons, "{", sizeof(emsi->addons)); strnxcat(emsi->addons, tmp, sizeof(emsi->addons)); strnxcat(emsi->addons, "}", sizeof(emsi->addons)); diff --git a/source/bforce/sess_answ.c b/source/bforce/sess_answ.c index 9ffdb05..ddb0642 100644 --- a/source/bforce/sess_answ.c +++ b/source/bforce/sess_answ.c @@ -71,6 +71,7 @@ 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 ) @@ -116,9 +117,10 @@ int answ_system(e_session type, char *connstr, int inetd) port_carrier(0, TRUE); rc = session(); - + log("Session ended up, rc=%d, inetd=%d", rc, inetd); if( ( !inetd ) ) { + log("Deactivating modem port"); port_deinit(0, &oldtio); port_close(); } diff --git a/source/bforce/u_time.c b/source/bforce/u_time.c index e17438e..b150248 100644 --- a/source/bforce/u_time.c +++ b/source/bforce/u_time.c @@ -173,18 +173,18 @@ 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 = local.tm_yday - gmt.tm_yday; if( tz > 1 ) - tz = -24; - else if( tz < -1 ) tz = 24; + else if( tz < -1 ) + tz = -24; else tz *= 24; - tz += gmt.tm_hour - local.tm_hour; + tz += local.tm_hour - gmt.tm_hour; tz *= 60; - tz += gmt.tm_min - local.tm_min; + tz += local.tm_min - gmt.tm_min; return tz; } @@ -202,10 +202,11 @@ char *time_string_gmtoffset(char *buffer) { 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; } diff --git a/source/include/confread.h b/source/include/confread.h index 714ea0b..17d35a6 100644 --- a/source/include/confread.h +++ b/source/include/confread.h @@ -179,6 +179,8 @@ typedef enum { cf_emsi_FR_time, cf_emsi_OH_time, cf_emsi_slave_sends_nak, + cf_emsi_send_tz, + cf_emsi_send_time, cf_filebox, cf_filebox_directory, cf_flags, @@ -239,6 +241,7 @@ typedef enum { cf_password, cf_phone, cf_phone_translate, + cf_proto_order, cf_recode_file_in, cf_recode_file_out, cf_recode_intro_in, diff --git a/source/include/prot_emsi.h b/source/include/prot_emsi.h index 7e8c688..fab290a 100644 --- a/source/include/prot_emsi.h +++ b/source/include/prot_emsi.h @@ -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];