From 3526bc5ece38669dec3139c21f83c02ed1e5ccf9 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Mon, 24 Jun 2024 23:23:24 +0300 Subject: [PATCH 01/11] Minor debug improvement --- source/bforce/daemon.c | 9 ++++++++- source/bforce/daemon_call.c | 17 ++++++++++++----- source/bforce/logger.c | 8 +++++++- source/bforce/nodelist.c | 5 ++++- source/bforce/sess_call.c | 10 ++++++++-- source/bforce/u_ftn.c | 6 ++++-- 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/source/bforce/daemon.c b/source/bforce/daemon.c index d50a839..0398c67 100644 --- a/source/bforce/daemon.c +++ b/source/bforce/daemon.c @@ -1011,9 +1011,16 @@ int daemon_run(const char *confname, const char *incname, bool quit) } if( max_modem > 0 ) + { + DEB((D_INFO,"daemon: daemon_modem_queue")); daemon_queue_do(&daemon_queues[MODEM_QUEUE]); - if( max_tcpip > 0 ) + } + + if( max_tcpip > 0 ) + { + DEB((D_INFO,"daemon: daemon_modem_queue")); daemon_queue_do(&daemon_queues[TCPIP_QUEUE]); + } (void)sleep(DAEMON_IDLE_SLEEP); break; diff --git a/source/bforce/daemon_call.c b/source/bforce/daemon_call.c index 4bf2ec6..fe18b80 100644 --- a/source/bforce/daemon_call.c +++ b/source/bforce/daemon_call.c @@ -54,7 +54,7 @@ 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.hiddline = 0; opts.runmode = MODE_CALL_DEFAULT; opts.ipproto = NULL; opts.phone = NULL; @@ -62,7 +62,7 @@ static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport 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); } @@ -87,8 +87,11 @@ int daemon_call(s_sysentry *syst) /* * Check whether this node is allready locked */ - if( out_bsy_check(syst->node.addr) ) + if( out_bsy_check(syst->node.addr) ) + { + DEB((D_DAEMON, "daemon_call: node locked by .bsy file")); return 0; + } /* * Set state structure to make expressions works properly now @@ -101,6 +104,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,7 +114,10 @@ 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, syst->tcpip ? "TCP/IP" : modemport->name); @@ -138,7 +145,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)); } diff --git a/source/bforce/logger.c b/source/bforce/logger.c index f3599cf..d62d35b 100644 --- a/source/bforce/logger.c +++ b/source/bforce/logger.c @@ -106,11 +106,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)); @@ -142,7 +146,9 @@ int log_close(void) if( log_fp ) { - rc = fclose(log_fp); log_fp = NULL; + rc = fclose(log_fp); + DEB((D_INFO,"Closing log file.")); + log_fp = NULL; } return rc; diff --git a/source/bforce/nodelist.c b/source/bforce/nodelist.c index 8357dad..071c1d3 100644 --- a/source/bforce/nodelist.c +++ b/source/bforce/nodelist.c @@ -243,7 +243,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 +291,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: %d", node->do_binkp, node->do_ifcico, node->do_telnet, node->host)); + return 0; } diff --git a/source/bforce/sess_call.c b/source/bforce/sess_call.c index b2e897f..4389e3d 100644 --- a/source/bforce/sess_call.c +++ b/source/bforce/sess_call.c @@ -771,7 +771,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts) 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); @@ -807,29 +807,34 @@ 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 ) { + DEB((D_EVENT,"sess_call: calling stdio")); rc = call_system_quiet(opts->connect, opts->inetd); } 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 ) { + DEB((D_EVENT,"sess_call: calling ifcico")); rc = call_system_tcpip(CALL_TCPIP_IFCICO); } 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 ) { + 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 +855,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); } diff --git a/source/bforce/u_ftn.c b/source/bforce/u_ftn.c index 2c595df..aed1368 100644 --- a/source/bforce/u_ftn.c +++ b/source/bforce/u_ftn.c @@ -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; } @@ -325,7 +326,8 @@ int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard) addr->net = DEFAULT_NET; 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 From 9aed37b92e85c95f023d655e280d648ca66a0628 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Tue, 25 Jun 2024 23:05:07 +0300 Subject: [PATCH 02/11] IPv6 fixes for incoming inetd calls, minors from lint --- source/bforce/io_tcpip.c | 1 - source/bforce/io_unix_tio.c | 8 +++++++- source/bforce/prot_binkp.c | 2 +- source/bforce/sess_answ.c | 27 +++++++++++++++------------ source/bforce/u_misc.c | 1 + 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/source/bforce/io_tcpip.c b/source/bforce/io_tcpip.c index e4f38f7..38f3145 100644 --- a/source/bforce/io_tcpip.c +++ b/source/bforce/io_tcpip.c @@ -54,7 +54,6 @@ static int tcpip_connect2(struct addrinfo *ai) if ( fd == -1 ) { DEB((D_INFO, "tcpip_connect2: socket error")); - continue; } else break; diff --git a/source/bforce/io_unix_tio.c b/source/bforce/io_unix_tio.c index 91b4281..5f37c1f 100644 --- a/source/bforce/io_unix_tio.c +++ b/source/bforce/io_unix_tio.c @@ -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) diff --git a/source/bforce/prot_binkp.c b/source/bforce/prot_binkp.c index 3c3d051..c3d0e6a 100644 --- a/source/bforce/prot_binkp.c +++ b/source/bforce/prot_binkp.c @@ -788,7 +788,7 @@ case BPMSG_FILE: /* File information */ DEB((D_24554, "no, skipping; TODO: accept it")); if( bstate->extracmd[0] != -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 %ld %ld %ld", recvfi.fn, recvfi.sz, recvfi.tm, recvfi.offs); bstate->extraislast = false; return 1; } diff --git a/source/bforce/sess_answ.c b/source/bforce/sess_answ.c index ddb0642..f6cb2d5 100644 --- a/source/bforce/sess_answ.c +++ b/source/bforce/sess_answ.c @@ -22,8 +22,11 @@ int answ_system(e_session type, char *connstr, int inetd) { TIO oldtio; - struct sockaddr_in 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; @@ -74,18 +77,18 @@ int answ_system(e_session type, char *connstr, int 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 + 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 + clientres = getnameinfo( (struct sockaddr*)&client, 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)); } } diff --git a/source/bforce/u_misc.c b/source/bforce/u_misc.c index e2f1967..d2042ec 100644 --- a/source/bforce/u_misc.c +++ b/source/bforce/u_misc.c @@ -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(); } From bba77edecd025ec1191538228d6987d5b9773218 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Tue, 25 Jun 2024 23:42:52 +0300 Subject: [PATCH 03/11] mFix ipv6 --- source/bforce/sess_answ.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/bforce/sess_answ.c b/source/bforce/sess_answ.c index f6cb2d5..4d24efe 100644 --- a/source/bforce/sess_answ.c +++ b/source/bforce/sess_answ.c @@ -22,7 +22,12 @@ int answ_system(e_session type, char *connstr, int inetd) { TIO oldtio; - struct sockaddr_storage 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]; @@ -79,7 +84,9 @@ int answ_system(e_session type, char *connstr, int inetd) state.connstr = (char*)xstrcpy(connstr); else { - clientres = getnameinfo( (struct sockaddr*)&client, clientlen, + 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 ) From 5a7bac039ae75c259f609d73bf40948a96622153 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Mon, 1 Jul 2024 00:10:20 +0300 Subject: [PATCH 04/11] Changed daemon mode tcpip priority (to be first in outbound calls), fixed daemon_call creating opts record, fixed working time for tcp nodes --- source/bforce/daemon.c | 52 ++++++++++++++++++++++++++++++++----- source/bforce/daemon_call.c | 7 ++++- source/bforce/nodelist.c | 2 +- source/bforce/sess_call.c | 41 +++++++++++++++++------------ 4 files changed, 77 insertions(+), 25 deletions(-) diff --git a/source/bforce/daemon.c b/source/bforce/daemon.c index 0398c67..2a2fcb1 100644 --- a/source/bforce/daemon.c +++ b/source/bforce/daemon.c @@ -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; @@ -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; @@ -1010,16 +1048,16 @@ int daemon_run(const char *confname, const char *incname, bool quit) timer_set(&timer_alive, DAEMON_ALIVE_TIMER); } - if( max_modem > 0 ) + if( max_tcpip > 0 ) { - DEB((D_INFO,"daemon: daemon_modem_queue")); - daemon_queue_do(&daemon_queues[MODEM_QUEUE]); + DEB((D_INFO,"daemon: daemon_tcpip_queue")); + daemon_queue_do(&daemon_queues[TCPIP_QUEUE]); } - if( max_tcpip > 0 ) + if( max_modem > 0 ) { DEB((D_INFO,"daemon: daemon_modem_queue")); - daemon_queue_do(&daemon_queues[TCPIP_QUEUE]); + daemon_queue_do(&daemon_queues[MODEM_QUEUE]); } (void)sleep(DAEMON_IDLE_SLEEP); diff --git a/source/bforce/daemon_call.c b/source/bforce/daemon_call.c index fe18b80..1139379 100644 --- a/source/bforce/daemon_call.c +++ b/source/bforce/daemon_call.c @@ -54,8 +54,13 @@ static int daemon_call_branch(s_sysentry *syst, const char *lockdir, s_modemport s_bforce_opts opts; // TODO: add hiddenline round-robin + memset(&opts, '\0', sizeof(s_bforce_opts)); + opts.hiddline = 0; - opts.runmode = MODE_CALL_DEFAULT; + if ( syst->tcpip ) + opts.runmode = MODE_CALL_IP; + else + opts.runmode = MODE_CALL_DEFAULT; opts.ipproto = NULL; opts.phone = NULL; opts.force = 0; diff --git a/source/bforce/nodelist.c b/source/bforce/nodelist.c index 071c1d3..e686a1c 100644 --- a/source/bforce/nodelist.c +++ b/source/bforce/nodelist.c @@ -294,7 +294,7 @@ int nodelist_parsestring(s_node *node, char *str) //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: %d", node->do_binkp, node->do_ifcico, node->do_telnet, 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; } diff --git a/source/bforce/sess_call.c b/source/bforce/sess_call.c index 4389e3d..252193c 100644 --- a/source/bforce/sess_call.c +++ b/source/bforce/sess_call.c @@ -543,7 +543,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 +568,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 +582,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 +594,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,31 +613,29 @@ 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; } call_mayuse |= call_mustuse; // it simplifies logics: all required is allowed //char s[300]; - //snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse); - //log(s); + 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 @@ -693,9 +699,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 */ @@ -746,6 +752,8 @@ int call_system(s_faddr addr, const s_bforce_opts *opts) state.override.sIpaddr, sizeof(state.node.host)); } + DEB((D_EVENT, "Calling init, IPHOST", state.node.host)); + if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(state.node.host) ) { char *fidodnszone = conf_string(cf_fidodnszone); if (fidodnszone) { @@ -765,6 +773,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts) { call_mayuse &= ~CALL_TCPIP_ANY; log("bad host, exclude IP"); + DEB((D_EVENT, "bad host %s, exclude IP", state.node.host)); if( call_mustuse & CALL_TCPIP_ANY ) { errmsg = "don't know host name"; From 983440fc29df161be57fd19434f9c53ce97690d4 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Mon, 1 Jul 2024 00:11:18 +0300 Subject: [PATCH 05/11] Changed version up to 0.25.3 --- source/.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/.version b/source/.version index 166c9e2..3d9dcb1 100644 --- a/source/.version +++ b/source/.version @@ -1 +1 @@ -0.25.2 +0.25.3 From 73a3376a3d4f0860a7d277d0cdff2bc09ea750c3 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Tue, 2 Jul 2024 21:51:58 +0300 Subject: [PATCH 06/11] 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 --- source/bforce/sess_call.c | 55 +++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/source/bforce/sess_call.c b/source/bforce/sess_call.c index 252193c..a895cc1 100644 --- a/source/bforce/sess_call.c +++ b/source/bforce/sess_call.c @@ -568,7 +568,7 @@ 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)); + //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 @@ -630,9 +630,9 @@ int call_system(s_faddr addr, const s_bforce_opts *opts) call_mayuse |= call_mustuse; // it simplifies logics: all required is allowed //char s[300]; - snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse); - log(s); - DEB((D_EVENT, s)); + //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) ) @@ -656,7 +656,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_mustuse & CALL_MODEM) ) { errmsg = "don't know phone number"; gotoexit(BFERR_PHONE_UNKNOWN); @@ -690,7 +690,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_mustuse & CALL_MODEM) ) { errmsg = "not works now, try later"; gotoexit(BFERR_NOTWORKING); @@ -699,9 +699,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); - DEB((D_EVENT, 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 */ @@ -720,7 +720,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; } @@ -728,7 +729,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; } @@ -736,7 +738,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; } @@ -752,9 +755,12 @@ int call_system(s_faddr addr, const s_bforce_opts *opts) state.override.sIpaddr, sizeof(state.node.host)); } - DEB((D_EVENT, "Calling init, IPHOST", state.node.host)); + //DEB((D_EVENT, "Calling init, IPHOST", state.node.host)); - if( call_mayuse & CALL_TCPIP_ANY && !tcpip_isgood_host(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) { @@ -769,14 +775,17 @@ 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"); - DEB((D_EVENT, "bad host %s, exclude IP", state.node.host)); - 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_mustuse & CALL_TCPIP_ANY) ) { - errmsg = "don't know host name"; + errmsg = "Aborting, don't know host name"; gotoexit(BFERR_PHONE_UNKNOWN); } } @@ -817,31 +826,31 @@ 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( rc && (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", From f72259cfe3b0981b0e4ca075b6237c067025cf5d Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Tue, 2 Jul 2024 23:17:07 +0300 Subject: [PATCH 07/11] mFix aarch64 binkp FSM --- source/bforce/prot_binkp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/bforce/prot_binkp.c b/source/bforce/prot_binkp.c index c3d0e6a..3604b69 100644 --- a/source/bforce/prot_binkp.c +++ b/source/bforce/prot_binkp.c @@ -740,7 +740,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; @@ -749,7 +749,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)-1 ) return 0; // suspend if extra is occupied bstate->extracmd[0] = BPMSG_BSY; strcpy(bstate->extracmd+1, "All addresses are busy"); bstate->extraislast = true; @@ -770,6 +770,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; @@ -786,7 +787,7 @@ 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, recvfi.offs); bstate->extraislast = false; @@ -798,7 +799,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) { From 5ef2b0986107429a2870f2881f10c73816e05288 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Tue, 2 Jul 2024 23:28:00 +0300 Subject: [PATCH 08/11] Added systemd and xinetd service files --- CHANGES | 9 +++++++++ contrib/systemd/bforce.service | 13 +++++++++++++ contrib/xinetd.d/bforce-binkp | 13 +++++++++++++ contrib/xinetd.d/bforce-ifcico | 13 +++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 contrib/systemd/bforce.service create mode 100644 contrib/xinetd.d/bforce-binkp create mode 100644 contrib/xinetd.d/bforce-ifcico diff --git a/CHANGES b/CHANGES index b3c3fc0..aba0735 100644 --- a/CHANGES +++ b/CHANGES @@ -257,3 +257,12 @@ Alexey Khromov (zx@zxalexis.ru) 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 diff --git a/contrib/systemd/bforce.service b/contrib/systemd/bforce.service new file mode 100644 index 0000000..9b2463a --- /dev/null +++ b/contrib/systemd/bforce.service @@ -0,0 +1,13 @@ +[Unit] +Description=Binkleyforce Outbound server + +[Service] +Type=forking +PIDFile=/tmp/bforce.pid +User=fido +Group=fido +ExecStart=/usr/bin/bforce -d -C /opt/fidonms/etc/bforce.conf +ExecStop=/usr/bin/bforce -q + +[Install] +WantedBy=multi-user.target diff --git a/contrib/xinetd.d/bforce-binkp b/contrib/xinetd.d/bforce-binkp new file mode 100644 index 0000000..fcddb5f --- /dev/null +++ b/contrib/xinetd.d/bforce-binkp @@ -0,0 +1,13 @@ +#binkleyforce ifc (port 60179) EMSI-over-ip +service binkp +{ + disable = no + socket_type = stream +# flags = IPv4 + protocol = tcp + port = 24554 + wait = no + user = fido + server = /usr/bin/bforce + server_args = -C /opt/fidonms/etc/bforce.conf -i binkp +} diff --git a/contrib/xinetd.d/bforce-ifcico b/contrib/xinetd.d/bforce-ifcico new file mode 100644 index 0000000..2d47a70 --- /dev/null +++ b/contrib/xinetd.d/bforce-ifcico @@ -0,0 +1,13 @@ +#binkleyforce ifc (port 60179) EMSI-over-ip +service ifc +{ + disable = no + socket_type = stream +# flags = IPv4 + protocol = tcp + port = 60179 + wait = no + user = fido + server = /usr/bin/bforce + server_args = -C /opt/fidonms/etc/bforce.conf -i auto +} \ No newline at end of file From 46312ebc1bb0846730b001900db10ed1c2f26f2c Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Wed, 3 Jul 2024 22:42:20 +0300 Subject: [PATCH 09/11] Fixed flag creation, added flags inctic_flag incfile_flag --- CHANGES | 2 ++ source/bforce/conf_proc.c | 2 ++ source/bforce/daemon.c | 4 +-- source/bforce/outb_fsqueue.c | 8 ++++++ source/bforce/prot_binkp.c | 51 ++++++++++++++++++++---------------- source/bforce/prot_common.c | 5 ++++ source/bforce/sess_call.c | 6 ++--- source/bforce/sess_main.c | 44 ++++++++++++++++++++++++++++--- source/include/confread.h | 2 ++ source/include/prot_common.h | 1 + 10 files changed, 93 insertions(+), 32 deletions(-) diff --git a/CHANGES b/CHANGES index aba0735..b28e76e 100644 --- a/CHANGES +++ b/CHANGES @@ -266,3 +266,5 @@ Alexey Khromov (zx@zxalexis.ru) + 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) diff --git a/source/bforce/conf_proc.c b/source/bforce/conf_proc.c index 1d7d02a..fc85dbf 100644 --- a/source/bforce/conf_proc.c +++ b/source/bforce/conf_proc.c @@ -100,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), diff --git a/source/bforce/daemon.c b/source/bforce/daemon.c index 2a2fcb1..dfd706e 100644 --- a/source/bforce/daemon.c +++ b/source/bforce/daemon.c @@ -1050,13 +1050,13 @@ int daemon_run(const char *confname, const char *incname, bool quit) if( max_tcpip > 0 ) { - DEB((D_INFO,"daemon: daemon_tcpip_queue")); + DEB((D_DAEMON,"daemon: daemon_tcpip_queue")); daemon_queue_do(&daemon_queues[TCPIP_QUEUE]); } if( max_modem > 0 ) { - DEB((D_INFO,"daemon: daemon_modem_queue")); + DEB((D_DAEMON,"daemon: daemon_modem_queue")); daemon_queue_do(&daemon_queues[MODEM_QUEUE]); } diff --git a/source/bforce/outb_fsqueue.c b/source/bforce/outb_fsqueue.c index ddf0e9f..7e8a9fb 100644 --- a/source/bforce/outb_fsqueue.c +++ b/source/bforce/outb_fsqueue.c @@ -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; } diff --git a/source/bforce/prot_binkp.c b/source/bforce/prot_binkp.c index 3604b69..53731db 100644 --- a/source/bforce/prot_binkp.c +++ b/source/bforce/prot_binkp.c @@ -1052,7 +1052,7 @@ case BINKP_BLK_DATA: 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); @@ -1081,28 +1081,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; } diff --git a/source/bforce/prot_common.c b/source/bforce/prot_common.c index 4fd536f..afd6e9d 100644 --- a/source/bforce/prot_common.c +++ b/source/bforce/prot_common.c @@ -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; diff --git a/source/bforce/sess_call.c b/source/bforce/sess_call.c index a895cc1..dea5fa5 100644 --- a/source/bforce/sess_call.c +++ b/source/bforce/sess_call.c @@ -656,7 +656,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); @@ -690,7 +690,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); @@ -783,7 +783,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts) 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_mustuse & CALL_TCPIP_ANY) ) + if( !(call_mayuse) ) { errmsg = "Aborting, don't know host name"; gotoexit(BFERR_PHONE_UNKNOWN); diff --git a/source/bforce/sess_main.c b/source/bforce/sess_main.c index 99c28d0..7329dec 100644 --- a/source/bforce/sess_main.c +++ b/source/bforce/sess_main.c @@ -895,13 +895,22 @@ int session(void) * Write total amount of received/sent bytes, files, etc. */ 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 */ diff --git a/source/include/confread.h b/source/include/confread.h index 17d35a6..48457af 100644 --- a/source/include/confread.h +++ b/source/include/confread.h @@ -195,6 +195,8 @@ typedef enum { cf_freq_srif_command, cf_incnet_flag, cf_incarc_flag, + cf_inctic_flag, + cf_incfile_flag, cf_hide_our_aka, cf_history_file, cf_hydra_options, diff --git a/source/include/prot_common.h b/source/include/prot_common.h index d5967fc..734879e 100644 --- a/source/include/prot_common.h +++ b/source/include/prot_common.h @@ -44,6 +44,7 @@ typedef struct traffic { int freqed_num; int freqed_time; size_t freqed_size; + int ticfile_num; } s_traffic; /* From 3f9d10e4675e3e7dec33d97e7d99560c7dd09f19 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Thu, 4 Jul 2024 23:05:23 +0300 Subject: [PATCH 10/11] Fixed nodelist index for root zone nodes, added support for IBN:port --- CHANGES | 2 + README.md | 23 ++++++++-- contrib/mkpoll.sh | 92 +++++++++++++++++++++++++++++++++++++++ examples/bforce.conf | 5 +++ source/bforce/sess_call.c | 51 ++++++++++++++++++++-- source/bfutil/bfindex.c | 2 +- 6 files changed, 168 insertions(+), 7 deletions(-) create mode 100755 contrib/mkpoll.sh diff --git a/CHANGES b/CHANGES index b28e76e..fc46fa0 100644 --- a/CHANGES +++ b/CHANGES @@ -268,3 +268,5 @@ Alexey Khromov (zx@zxalexis.ru) + 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 diff --git a/README.md b/README.md index 8365b06..b639c34 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,26 @@ 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 +28,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 ----------- diff --git a/contrib/mkpoll.sh b/contrib/mkpoll.sh new file mode 100755 index 0000000..8f3e73a --- /dev/null +++ b/contrib/mkpoll.sh @@ -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
" + 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 + diff --git a/examples/bforce.conf b/examples/bforce.conf index c613b43..6c54a58 100644 --- a/examples/bforce.conf +++ b/examples/bforce.conf @@ -103,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 diff --git a/source/bforce/sess_call.c b/source/bforce/sess_call.c index dea5fa5..1217183 100644 --- a/source/bforce/sess_call.c +++ b/source/bforce/sess_call.c @@ -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; + 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,14 +507,17 @@ 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: log("invalid protocol for TCP/IP module"); @@ -520,8 +528,45 @@ defalt: ftn_addrstr(abuf, state.node.addr), (state.node.name && *state.node.name ) ? state.node.name : "", (state.node.host && *state.node.host) ? state.node.host : ""); + + memset(abuf, '\0', BF_MAXADDRSTR+1); + pbuf = xmalloc(1024); + + resflg = nodelist_lookup_string(pbuf, 1024, state.node.addr); + if ( ! resflg ) + { + + char *p = strcasestr(pbuf, target); - if( (rc = tcpip_connect(state.node.host, state.tcpmode)) == 0 + if ( p ) + { + target = strrchr(p, ','); + if ( target ) target[0] = '\0'; + target = strrchr(p, ':'); + if ( target ) { + target++; + strcpy(abuf,target); + } + } + } + + free(pbuf); + pbuf = xstrcpy(state.node.host); + + + if ( ! resflg ) + { + if ( abuf[0] != '\0' ) + { + // port not empty + DEB((D_EVENT, "Modifying host address %s with port %s", pbuf, abuf)); + pbuf = xstrcat(pbuf, ":"); + pbuf = xstrcat(pbuf, abuf); + } + } + + + if( (rc = tcpip_connect(pbuf, state.tcpmode)) == 0 && (rc = tcpip_init() == 0) ) { TTYSTATUS(1); @@ -532,7 +577,7 @@ defalt: { rc = BFERR_CANT_CONNECT10; } - + free(pbuf); return rc; } diff --git a/source/bfutil/bfindex.c b/source/bfutil/bfindex.c index 0311397..b757bd1 100644 --- a/source/bfutil/bfindex.c +++ b/source/bfutil/bfindex.c @@ -127,7 +127,7 @@ 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; From abb1153cf3d28484b36af7d930881c471d0905d9 Mon Sep 17 00:00:00 2001 From: Alexey Khromov Date: Fri, 5 Jul 2024 09:16:24 +0300 Subject: [PATCH 11/11] small fix --- source/bforce/sess_call.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/bforce/sess_call.c b/source/bforce/sess_call.c index 1217183..268a805 100644 --- a/source/bforce/sess_call.c +++ b/source/bforce/sess_call.c @@ -540,7 +540,7 @@ defalt: if ( p ) { - target = strrchr(p, ','); + target = strchr(p, ','); if ( target ) target[0] = '\0'; target = strrchr(p, ':'); if ( target ) {