commit
						1eacadd453
					
				
							
								
								
									
										16
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								CHANGES
									
									
									
									
									
								
							@ -286,3 +286,19 @@ Alexey Khromov (zx@zxalexis.ru)
 | 
				
			|||||||
 + Fixed RPM spec-file to make builds for AltLinux
 | 
					 + Fixed RPM spec-file to make builds for AltLinux
 | 
				
			||||||
 + Added fail2ban filter to contrib
 | 
					 + Added fail2ban filter to contrib
 | 
				
			||||||
 + Fixed node/point-lists indexing and parsing for points listed
 | 
					 + Fixed node/point-lists indexing and parsing for points listed
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					0.27
 | 
				
			||||||
 | 
					 + Fixed warnings from PVS-Studio analyser
 | 
				
			||||||
 | 
					 + Fixed getaddrinfo switching through available ip-addresses
 | 
				
			||||||
 | 
					 + Reduced SYN-SENT timeout to 3 secs to avoid blocking on hosts with services down
 | 
				
			||||||
 | 
					 + nlookup - new option -o to show configured overrides and hidden lines
 | 
				
			||||||
 | 
					 + nlookup - new option -t to show calltable
 | 
				
			||||||
 | 
					 + Added support for multiply INA: addresses of a node
 | 
				
			||||||
 | 
					 + Added automatic rolling of all available adresses on callout
 | 
				
			||||||
 | 
					 + Added automatic rolling of all available hidden phone numbers on callout
 | 
				
			||||||
 | 
					 + Full rework of overrides in config: 
 | 
				
			||||||
 | 
					    * override (not hidden) changes phone,ipaddr and flags (old behaviour - add flags)
 | 
				
			||||||
 | 
					    * hidden flags temporary rolls instead of original
 | 
				
			||||||
 | 
					    * INA in hidden flags sets remote address, protoflags change protocols
 | 
				
			||||||
 | 
					    * ipaddr in hidden flags overwrites original and has max priority
 | 
				
			||||||
 | 
					    * phone in hidden lines do not affect ip callout in case without flags
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										40
									
								
								FAQ
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								FAQ
									
									
									
									
									
								
							@ -1,7 +1,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    BinkleyForce FAQ.
 | 
					    BinkleyForce FAQ.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
v. 1.15	от 26 марта 2002.
 | 
						27 апреля 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: А как для многолинейки сделать разные строки инициализации?
 | 
					Q: А как для многолинейки сделать разные строки инициализации?
 | 
				
			||||||
A: /DR/
 | 
					A: /DR/
 | 
				
			||||||
@ -103,17 +103,44 @@ A: /AB/
 | 
				
			|||||||
   Hу что-нибудь вроде:
 | 
					   Hу что-нибудь вроде:
 | 
				
			||||||
   override 2:5020/??? phone none ipaddr f???.n5020.z2.fidonet.net
 | 
					   override 2:5020/??? phone none ipaddr f???.n5020.z2.fidonet.net
 | 
				
			||||||
   Еще можно добавить флаги: BINKP - дл BinkP или IFC - для EMSI/..
 | 
					   Еще можно добавить флаги: BINKP - дл BinkP или IFC - для EMSI/..
 | 
				
			||||||
 | 
					A: /AK/
 | 
				
			||||||
 | 
					   Формат override-строки такой:
 | 
				
			||||||
 | 
					   override <фидоадрес> [hidden] [Phone <тлф>] [Ipaddr <dns|ip>] [Flags <флаги>]
 | 
				
			||||||
 | 
					   ip-адрес/днс-имя сервера можно подменить как через Ipaddr, так и через
 | 
				
			||||||
 | 
					   флаги, поставив INA:адрес
 | 
				
			||||||
 | 
					   Пример override:
 | 
				
			||||||
 | 
					   [флаги нодлиста: CM,IBN,INA:coolbbs.spb.ru,INA:cool2.spb.ru,BEER:lager 
 | 
				
			||||||
 | 
					   override 2:5030/xxx Phone Unpublished Flags IFC,INA:reservbbs.dyndns.org \
 | 
				
			||||||
 | 
					                       hidden Ipaddr 188.34.34.22 \
 | 
				
			||||||
 | 
					                       hidden Ipaddr 234.43.44.23 Flags IFC,CM
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					       Порядок дозвона (до первого успешного установления сессии):
 | 
				
			||||||
 | 
					            1. coolbbs.spb.ru:binkp
 | 
				
			||||||
 | 
					            2. reservbbs.dyndns.org:ifcico
 | 
				
			||||||
 | 
					            3. 188.34.34.22:binkp
 | 
				
			||||||
 | 
					            4. 234.43.44.23:ifcico
 | 
				
			||||||
 | 
					            5. cool2.spb.ru:binkp
 | 
				
			||||||
 | 
					   Проверить настроенные override-s и порядок дозвона можно с помощью
 | 
				
			||||||
 | 
					   программы nlookup: опция -o показывает override, опция -t - порядок
 | 
				
			||||||
 | 
					   дозвона (IP+PSTN)        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: Демон забивает на указание ip...и звонит по нодлистовому телефону. Вот как
 | 
					Q: Демон забивает на указание ip...и звонит по нодлистовому телефону. Вот как
 | 
				
			||||||
   это пофиксить?
 | 
					   это пофиксить?
 | 
				
			||||||
A: /AB/
 | 
					A: /AB/
 | 
				
			||||||
   Это бага така. Для этого и прописываетс "phone none".
 | 
					   Это бага така. Для этого и прописываетс "phone none".
 | 
				
			||||||
 | 
					A: /AK/
 | 
				
			||||||
 | 
					   Приоритеты c версии 0.26.x за ip-дозвоном, демон для ip-узлов не 
 | 
				
			||||||
 | 
					   производит дозвон, для PSTN-only - не ищет ip-адрес. При ручном дозвоне
 | 
				
			||||||
 | 
					   используются все способы соединения из нодлиста, сначала IP, потом модем
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: Я не понял, почему aftersession запускается, когда еще есть bsy?! Весь
 | 
					Q: Я не понял, почему aftersession запускается, когда еще есть bsy?! Весь
 | 
				
			||||||
   нужный эффект теряется (bforce 0.22.3).
 | 
					   нужный эффект теряется (bforce 0.22.3).
 | 
				
			||||||
A: /AB/
 | 
					A: /AB/
 | 
				
			||||||
   Почему теряется? Он же в отдельной сессии запускаться может и бфорсу не
 | 
					   Почему теряется? Он же в отдельной сессии запускаться может и бфорсу не
 | 
				
			||||||
   обязательно ждать его завершения.
 | 
					   обязательно ждать его завершения.
 | 
				
			||||||
 | 
					A: /AK/
 | 
				
			||||||
 | 
					   aftersession запускается, когда уже есть принятый пакет в inbound.
 | 
				
			||||||
 | 
					   процесс получает значения переменных окружения от демона
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: subst'ы было бы неплохо расширить т.к. очень не хватает AT~S91=7~DP :-(
 | 
					Q: subst'ы было бы неплохо расширить т.к. очень не хватает AT~S91=7~DP :-(
 | 
				
			||||||
A: /SNP/
 | 
					A: /SNP/
 | 
				
			||||||
@ -124,7 +151,7 @@ Q: 
 | 
				
			|||||||
A: /SNP/
 | 
					A: /SNP/
 | 
				
			||||||
   inbound_directory (Protected)   /var/spool/fido/inb-protected
 | 
					   inbound_directory (Protected)   /var/spool/fido/inb-protected
 | 
				
			||||||
   inbound_directory               /var/spool/fido/inb
 | 
					   inbound_directory               /var/spool/fido/inb
 | 
				
			||||||
Прим.: начина с 0.22.3 пример конфига имеет аналогичный порядок.
 | 
					Прим.: начиная с 0.22.3 пример конфига имеет аналогичный порядок.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: Статистику после сессии  собрать так и не смог. Пишет: "can't get modem
 | 
					Q: Статистику после сессии  собрать так и не смог. Пишет: "can't get modem
 | 
				
			||||||
   statistic: Modem not response". Модем IDC-2814BXL/VR+.
 | 
					   statistic: Modem not response". Модем IDC-2814BXL/VR+.
 | 
				
			||||||
@ -142,7 +169,7 @@ A: /AB/
 | 
				
			|||||||
   fido stream  tcp nowait root /usr/bin/bforce bforce -i auto
 | 
					   fido stream  tcp nowait root /usr/bin/bforce bforce -i auto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: А как бы сделать так, чтобы можно было прописать другую директорию для
 | 
					Q: А как бы сделать так, чтобы можно было прописать другую директорию для
 | 
				
			||||||
   локов? У мен, например, они в /var/spool/lock лежат...
 | 
					   локов? У меня, например, они в /var/spool/lock лежат...
 | 
				
			||||||
A: /AB/
 | 
					A: /AB/
 | 
				
			||||||
   Либо поправить autoconf (configure.in), либо ручками в config.h прописать.
 | 
					   Либо поправить autoconf (configure.in), либо ручками в config.h прописать.
 | 
				
			||||||
   /EK/
 | 
					   /EK/
 | 
				
			||||||
@ -161,6 +188,8 @@ A: /AB/
 | 
				
			|||||||
Q: Пример конфига 'override 2:5029/9 Phone Unpublished' не работает :-(
 | 
					Q: Пример конфига 'override 2:5029/9 Phone Unpublished' не работает :-(
 | 
				
			||||||
A: /VS/
 | 
					A: /VS/
 | 
				
			||||||
   override 2:5029/9 Phone None
 | 
					   override 2:5029/9 Phone None
 | 
				
			||||||
 | 
					A: /AK/
 | 
				
			||||||
 | 
					   Уже работает
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: У меня прописано несколько hidden'ов, но bforce упорно звонит только по
 | 
					Q: У меня прописано несколько hidden'ов, но bforce упорно звонит только по
 | 
				
			||||||
   одному из них.
 | 
					   одному из них.
 | 
				
			||||||
@ -169,6 +198,8 @@ A: /PVC/
 | 
				
			|||||||
   UUE. Также доступен для фреков на 2:5020/2091 как
 | 
					   UUE. Также доступен для фреков на 2:5020/2091 как
 | 
				
			||||||
   bforce-0.22.4-0.22.4pl2.diff.bz2. Время для фреков c 1:00 до 5:20, c
 | 
					   bforce-0.22.4-0.22.4pl2.diff.bz2. Время для фреков c 1:00 до 5:20, c
 | 
				
			||||||
   7:40-9:00.
 | 
					   7:40-9:00.
 | 
				
			||||||
 | 
					A: /AK/
 | 
				
			||||||
 | 
					   Исправлено в 0.27
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q: Подскажите, пожалyйста, как запpетить непаpольные соединения.
 | 
					Q: Подскажите, пожалyйста, как запpетить непаpольные соединения.
 | 
				
			||||||
A: /AB/
 | 
					A: /AB/
 | 
				
			||||||
@ -210,6 +241,9 @@ A: /AS/
 | 
				
			|||||||
  | /var/src/cvs/bforce/ > grep -r 'BFCONFIG' ./
 | 
					  | /var/src/cvs/bforce/ > grep -r 'BFCONFIG' ./
 | 
				
			||||||
  | ./source/bforce/conf_read.c:    const char *name = getenv("BFCONFIG");
 | 
					  | ./source/bforce/conf_read.c:    const char *name = getenv("BFCONFIG");
 | 
				
			||||||
  `----
 | 
					  `----
 | 
				
			||||||
 | 
					A: /AK/
 | 
				
			||||||
 | 
					   Опция -с <config> для всех программ комплекта
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
===
 | 
					===
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Thanx to:
 | 
					  Thanx to:
 | 
				
			||||||
 | 
				
			|||||||
@ -32,9 +32,12 @@ any later version. See the COPYING file for further information.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Known Bugs
 | 
					Known Bugs
 | 
				
			||||||
----------
 | 
					----------
 | 
				
			||||||
    - BinkleyForce has no support (yet) for multiple INA: addresses
 | 
					
 | 
				
			||||||
    - Can not rotate hidden lines
 | 
					~~BinkleyForce has no support (yet) for multiple INA: addresses~~ 
 | 
				
			||||||
    - Can not rotate supported IP protocols in case of failure
 | 
					~~Can not rotate hidden lines~~
 | 
				
			||||||
 | 
					~~Can not rotate supported IP protocols in case of failure~~ 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Can not (yet) apply flags to hidden phone lines.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bug Reports
 | 
					Bug Reports
 | 
				
			||||||
-----------
 | 
					-----------
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							@ -1,3 +1,17 @@
 | 
				
			|||||||
 | 
					bforce (0.27) UNRELEASED; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Fixed warnings from PVS-Studio analyser
 | 
				
			||||||
 | 
					  * Fixed getaddrinfo switching through available ip-addresses
 | 
				
			||||||
 | 
					  * Reduced SYN-SENT timeout to 3 secs to avoid blocking on hosts with services down
 | 
				
			||||||
 | 
					  * nlookup - new option -o to show configured overrides and hidden lines
 | 
				
			||||||
 | 
					  * nlookup - new option -t to show calltable
 | 
				
			||||||
 | 
					  * Added support for multiply INA: addresses of a node
 | 
				
			||||||
 | 
					  * Added automatic rolling of all available adresses on callout
 | 
				
			||||||
 | 
					  * Added automatic rolling of all available hidden phone numbers on callout
 | 
				
			||||||
 | 
					  * Full rework of overrides in config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Alexey Khromov <zx@zxalexis.ru>  Sat, 26 Apr 2025 21:19:54 +0300
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bforce (0.26.2) UNRELEASED; urgency=medium
 | 
					bforce (0.26.2) UNRELEASED; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * Added tests to CI actions
 | 
					  * Added tests to CI actions
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
.SH NAME
 | 
					.SH NAME
 | 
				
			||||||
Bnlookup \- Nodelist search tool for bforce
 | 
					Bnlookup \- Nodelist search tool for bforce
 | 
				
			||||||
.SH SYNOPSYS
 | 
					.SH SYNOPSYS
 | 
				
			||||||
\fBnlookup [-rh] [-C\fIconfig\fB]\fR
 | 
					\fBnlookup [-otrh] [-C\fIconfig\fB]\fR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.SH DESCRIPTION
 | 
					.SH DESCRIPTION
 | 
				
			||||||
\fBnlookup\fP is a nodelist search tool for BinkleyForce FTN mailer. 
 | 
					\fBnlookup\fP is a nodelist search tool for BinkleyForce FTN mailer. 
 | 
				
			||||||
@ -13,6 +13,12 @@ show nodelist string
 | 
				
			|||||||
\fB\-m\fR
 | 
					\fB\-m\fR
 | 
				
			||||||
show sysops e-mail (see FSP-1004.001 - p2)
 | 
					show sysops e-mail (see FSP-1004.001 - p2)
 | 
				
			||||||
.P
 | 
					.P
 | 
				
			||||||
 | 
					\fB\-t\fR
 | 
				
			||||||
 | 
					show calltable
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
 | 
					\fB\-o\fR
 | 
				
			||||||
 | 
					show overrides
 | 
				
			||||||
 | 
					.P
 | 
				
			||||||
\fB-h\fR
 | 
					\fB-h\fR
 | 
				
			||||||
show help message
 | 
					show help message
 | 
				
			||||||
.SH SEE ALSO
 | 
					.SH SEE ALSO
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
Summary: Bforce, Fidonet mailer
 | 
					Summary: Bforce, Fidonet mailer
 | 
				
			||||||
Name: bforce
 | 
					Name: bforce
 | 
				
			||||||
Version: 0.26.2
 | 
					Version: 0.27
 | 
				
			||||||
Release: %{_vendor}.1
 | 
					Release: %{_vendor}1
 | 
				
			||||||
Copyright: GPL
 | 
					Copyright: GPL
 | 
				
			||||||
Group: Fidonet/mailer
 | 
					Group: Fidonet/mailer
 | 
				
			||||||
Source0: bforce-%{version}.tar.gz
 | 
					Source0: bforce-%{version}.tar.gz
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1 @@
 | 
				
			|||||||
0.26.2
 | 
					0.27
 | 
				
			||||||
 | 
				
			|||||||
@ -76,8 +76,8 @@ s_daemon_queue daemon_queues[] = {
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Positions of the certain queues in the 'daemon_queues' array
 | 
					 * Positions of the certain queues in the 'daemon_queues' array
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define MODEM_QUEUE 0
 | 
					#define MODEM_QUEUE 1
 | 
				
			||||||
#define TCPIP_QUEUE 1
 | 
					#define TCPIP_QUEUE 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static RETSIGTYPE daemon_sighandler_chld(int sig)
 | 
					static RETSIGTYPE daemon_sighandler_chld(int sig)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -137,7 +137,7 @@ elemexp	: INCOMING
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
| FLAG flagstring
 | 
					| FLAG flagstring
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$$ = $2;
 | 
							$$ = $2; //-V1037
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| CONNSPEED AROP NUMBER
 | 
					| CONNSPEED AROP NUMBER
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -163,7 +163,7 @@ elemexp	: INCOMING
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
| TIME timestring
 | 
					| TIME timestring
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$$ = $2;
 | 
							$$ = $2; //-V1037
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| EXEC TEXT
 | 
					| EXEC TEXT
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -194,7 +194,7 @@ flagstring : TEXT
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
| TEXT COMMA flagstring
 | 
					| TEXT COMMA flagstring
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$$ = expr_check_logic($1, OR, $3);
 | 
							$$ = expr_check_logic($1, OR, $3); //-V1037
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	;
 | 
						;
 | 
				
			||||||
timestring : TEXT
 | 
					timestring : TEXT
 | 
				
			||||||
@ -205,7 +205,7 @@ timestring : TEXT
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
| TEXT COMMA timestring
 | 
					| TEXT COMMA timestring
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$$ = expr_check_logic($1, OR, $3);
 | 
							$$ = expr_check_logic($1, OR, $3); //-V1037
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	;
 | 
						;
 | 
				
			||||||
%%
 | 
					%%
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,7 @@
 | 
				
			|||||||
#include "logger.h"
 | 
					#include "logger.h"
 | 
				
			||||||
#include "util.h"
 | 
					#include "util.h"
 | 
				
			||||||
#include "io.h"
 | 
					#include "io.h"
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_PORT 60179	/* Birthday .. mother fucker :) */
 | 
					#define DEFAULT_PORT 60179	/* Birthday .. mother fucker :) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,10 +40,13 @@ static RETSIGTYPE tcpip_brokenpipe(int sig)
 | 
				
			|||||||
static int tcpip_connect2(struct addrinfo *ai)
 | 
					static int tcpip_connect2(struct addrinfo *ai)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int fd = -1;
 | 
						int fd = -1;
 | 
				
			||||||
 | 
						bool connected = FALSE;
 | 
				
			||||||
	char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
 | 
						char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
 | 
				
			||||||
	
 | 
						int synRetries = 2; // Send a total of 3 SYN packets => Timeout ~7s
 | 
				
			||||||
 | 
						int usertimeout = 3000;
 | 
				
			||||||
	struct addrinfo *rai;
 | 
						struct addrinfo *rai;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	for (rai = ai; rai != NULL; rai = rai->ai_next)
 | 
						for (rai = ai; rai != NULL; rai = rai->ai_next)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (getnameinfo(rai->ai_addr, rai->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
 | 
							if (getnameinfo(rai->ai_addr, rai->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
 | 
				
			||||||
@ -55,14 +59,34 @@ static int tcpip_connect2(struct addrinfo *ai)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			DEB((D_INFO, "tcpip_connect2: socket error"));
 | 
								DEB((D_INFO, "tcpip_connect2: socket error"));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else break;
 | 
							else 
 | 
				
			||||||
		
 | 
							{
 | 
				
			||||||
 | 
								DEB((D_INFO, "tcpip_connect2: socket opened - try to connect"));
 | 
				
			||||||
 | 
								setsockopt(fd, IPPROTO_TCP, TCP_SYNCNT, &synRetries, sizeof(synRetries));
 | 
				
			||||||
 | 
								setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &usertimeout, sizeof(usertimeout));	
 | 
				
			||||||
 | 
								if( connect(fd, rai->ai_addr, rai->ai_addrlen) == -1 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									DEB((D_INFO, "tcpip_connect2: can't connect %s", hbuf));
 | 
				
			||||||
 | 
									logerr("can't connect to %s", hbuf);
 | 
				
			||||||
 | 
									close(fd);
 | 
				
			||||||
 | 
									fd = -1;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									DEB((D_INFO, "tcpip_connect2: connect"));
 | 
				
			||||||
 | 
									connected = TRUE;
 | 
				
			||||||
 | 
									break;	
 | 
				
			||||||
 | 
								}	
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		hbuf[0]='\0';
 | 
							hbuf[0]='\0';
 | 
				
			||||||
		sbuf[0]='\0';
 | 
							sbuf[0]='\0';
 | 
				
			||||||
 | 
							if (!connected) {
 | 
				
			||||||
 | 
								DEB((D_INFO, "tcpip_connect2: socket not opened - returning"));
 | 
				
			||||||
 | 
								
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	DEB((D_INFO, "tcpip_connect2: socket success: %d", fd));
 | 
						}
 | 
				
			||||||
	if (fd < 0 )
 | 
						DEB((D_INFO, "tcpip_connect2: socket: %d", fd));
 | 
				
			||||||
 | 
						if ((fd < 0) || !connected)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							DEB((D_INFO, "tcpip_connect2: can't create socket and connect"));
 | 
				
			||||||
		logerr("can't create socket");
 | 
							logerr("can't create socket");
 | 
				
			||||||
		return(1);
 | 
							return(1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -73,6 +97,7 @@ static int tcpip_connect2(struct addrinfo *ai)
 | 
				
			|||||||
		(void)close(0);
 | 
							(void)close(0);
 | 
				
			||||||
		if( dup(fd) != 0 )
 | 
							if( dup(fd) != 0 )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								DEB((D_INFO, "tcpip_connect2: can't dup socket to stdin"));
 | 
				
			||||||
			logerr("cannot dup socket to stdin");
 | 
								logerr("cannot dup socket to stdin");
 | 
				
			||||||
			return(1);
 | 
								return(1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -92,7 +117,7 @@ static int tcpip_connect2(struct addrinfo *ai)
 | 
				
			|||||||
		logerr("cannot dup stdin to stderr");
 | 
							logerr("cannot dup stdin to stderr");
 | 
				
			||||||
		return(1);
 | 
							return(1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						DEB((D_INFO, "tcpip_connect2: stdin|out|err are connected"));
 | 
				
			||||||
	if( fd > 2 ) (void)close(fd);
 | 
						if( fd > 2 ) (void)close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* switch off stdio buffering */
 | 
						/* switch off stdio buffering */
 | 
				
			||||||
@ -103,22 +128,24 @@ static int tcpip_connect2(struct addrinfo *ai)
 | 
				
			|||||||
	clearerr(stdin);
 | 
						clearerr(stdin);
 | 
				
			||||||
	clearerr(stdout);
 | 
						clearerr(stdout);
 | 
				
			||||||
	clearerr(stderr);
 | 
						clearerr(stderr);
 | 
				
			||||||
	
 | 
						DEB((D_INFO, "tcpip_connect2: start connecting"));
 | 
				
			||||||
	if( connect(0, rai->ai_addr, rai->ai_addrlen) == -1 )
 | 
						//if( connect(0, rai->ai_addr, rai->ai_addrlen) == -1 )
 | 
				
			||||||
	{
 | 
						//{
 | 
				
			||||||
		logerr("can't connect to %s", hbuf);
 | 
						//	DEB((D_INFO, "tcpip_connect2: can't connect %s", hbuf));
 | 
				
			||||||
		close(0);
 | 
						//	logerr("can't connect to %s", hbuf);
 | 
				
			||||||
		close(1);
 | 
						//	
 | 
				
			||||||
		close(2);
 | 
						//	close(0);
 | 
				
			||||||
		return 1;
 | 
						//	close(1);
 | 
				
			||||||
	}
 | 
						//	close(2);
 | 
				
			||||||
 | 
						//	return 1;
 | 
				
			||||||
 | 
						//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( tcpip_init() )
 | 
						if( tcpip_init() )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		tcpip_shutdown();
 | 
							tcpip_shutdown();
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						DEB((D_INFO, "tcpip_connect2: TCP/IP connect success to %s on service %s", hbuf, sbuf));
 | 
				
			||||||
	(void)log("TCP/IP connect success to %s on service %s", hbuf, sbuf);
 | 
						(void)log("TCP/IP connect success to %s on service %s", hbuf, sbuf);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return(0);
 | 
						return(0);
 | 
				
			||||||
 | 
				
			|||||||
@ -116,7 +116,7 @@ static pid_t lock_read_pid(const char *lckname)
 | 
				
			|||||||
	if( len == sizeof(pid) || sscanf(buf, "%d", &pid) != 1 || pid == 0 )
 | 
						if( len == sizeof(pid) || sscanf(buf, "%d", &pid) != 1 || pid == 0 )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* We found binary lock file? */
 | 
							/* We found binary lock file? */
 | 
				
			||||||
		pid = *((u_int *)buf);
 | 
							pid = *((u_int *)buf); //-V1032
 | 
				
			||||||
#ifndef LOCK_BINARY
 | 
					#ifndef LOCK_BINARY
 | 
				
			||||||
		log("warning: found binary lock file %s", lckname);
 | 
							log("warning: found binary lock file %s", lckname);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -124,7 +124,7 @@ int log_open(const char *logname, const char *ext, const char *tty)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( log_name )
 | 
						if( log_name[0] )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Open previously set log file */
 | 
							/* Open previously set log file */
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
@ -145,7 +145,7 @@ int log_close(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ASSERT(log_fp);
 | 
						ASSERT(log_fp);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( log_fp != NULL )
 | 
						if( log_fp ) //-V0547
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		rc = fclose(log_fp); 
 | 
							rc = fclose(log_fp); 
 | 
				
			||||||
		DEB((D_INFO,"Closing log file."));
 | 
							DEB((D_INFO,"Closing log file."));
 | 
				
			||||||
@ -162,7 +162,7 @@ int log_reopen(const char *logname, const char *ext, const char *tty)
 | 
				
			|||||||
	if( log_isopened() )
 | 
						if( log_isopened() )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if( !strcmp(logname, log_name)
 | 
							if( !strcmp(logname, log_name)
 | 
				
			||||||
		 && !strcmp(log_extension ? log_extension : "", ext ? ext : "") )
 | 
							 && !strcmp(log_extension, ext ? ext : "") )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -464,7 +464,7 @@ int debug_open()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ASSERT(debug_fp == NULL);
 | 
						ASSERT(debug_fp == NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( debug_name )
 | 
						if( debug_name[0] )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                char log_name[PATH_MAX];
 | 
					                char log_name[PATH_MAX];
 | 
				
			||||||
@ -518,7 +518,7 @@ int debug_close(void)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	ASSERT(debug_fp != NULL);
 | 
						ASSERT(debug_fp != NULL);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( debug_fp )
 | 
						if( debug_fp ) //-V0547
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		fprintf(debug_fp, "****************************************************\n");
 | 
							fprintf(debug_fp, "****************************************************\n");
 | 
				
			||||||
		fprintf(debug_fp, " Closing binkleyforce debug file at %s\n",
 | 
							fprintf(debug_fp, " Closing binkleyforce debug file at %s\n",
 | 
				
			||||||
 | 
				
			|||||||
@ -60,7 +60,7 @@ int nodelist_checkflag(const char *nodeflags, const char *flag)
 | 
				
			|||||||
	if ( nodeflags ) {
 | 
						if ( nodeflags ) {
 | 
				
			||||||
		while( p = strcasestr(searchbase, flag) ) // p - found flag 
 | 
							while( p = strcasestr(searchbase, flag) ) // p - found flag 
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if( (p == searchbase) || (p != searchbase && *(p-1) == ',') )
 | 
								if ( ((p == searchbase)) || (*(p-1) == ','))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if( (q = strchr(p, ',')) == NULL || (q - p) == strlen(flag) ) {
 | 
									if( (q = strchr(p, ',')) == NULL || (q - p) == strlen(flag) ) {
 | 
				
			||||||
					DEB((D_NODELIST, "nodelist: found flag %s", flag));
 | 
										DEB((D_NODELIST, "nodelist: found flag %s", flag));
 | 
				
			||||||
@ -76,7 +76,7 @@ int nodelist_checkflag(const char *nodeflags, const char *flag)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return 1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*****************************************************************************
 | 
					/*****************************************************************************
 | 
				
			||||||
@ -354,6 +354,78 @@ int nodelist_parsestring(s_node *node, char *str)
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*****************************************************************************
 | 
				
			||||||
 | 
					 * Hidden adresses adder 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Arguments:
 | 
				
			||||||
 | 
					 * 	node      a node for which we add HIDDEN lines with IpAddr
 | 
				
			||||||
 | 
					 * 	str       pointer to the flags string
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return value:
 | 
				
			||||||
 | 
					 * -1 if error	
 | 
				
			||||||
 | 
					 * zero value if string had no hidden INA:, pos - num of INA's above 
 | 
				
			||||||
 | 
					 * first
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int nodelist_parsehiddenina(s_node *node,s_override *ov) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int rc = 0;
 | 
				
			||||||
 | 
						s_override *ovr;
 | 
				
			||||||
 | 
						s_override *ovrbase = ov;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						char *tmp, *p, *q;
 | 
				
			||||||
 | 
						const char *searchbase = node->flags;
 | 
				
			||||||
 | 
						int flaglen = 3;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tmp = xmalloc(BNI_MAXHOST+1);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						while( p = strstr(searchbase, "INA") )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( p == node->flags || *(p-1) == ',' ) // match flag
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if( *(p+flaglen) == 0 || *(p+flaglen) == ',' )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								    // empty flag
 | 
				
			||||||
 | 
								    memset(tmp, '\0', 1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								    if( *(p+flaglen) == ':' ) {
 | 
				
			||||||
 | 
										// flag has data
 | 
				
			||||||
 | 
										p += flaglen + 1; // start of data
 | 
				
			||||||
 | 
										q = strchrnul(p, ','); // end of data: comma or EOS
 | 
				
			||||||
 | 
										strncpy(tmp, p, q-p);
 | 
				
			||||||
 | 
										tmp[q-p]='\0';
 | 
				
			||||||
 | 
										DEB((D_NODELIST, "nodelist: host INA is %s", node->host));
 | 
				
			||||||
 | 
										if (!strcmp(tmp, node->host)) {
 | 
				
			||||||
 | 
											DEB((D_NODELIST, "nodelist: found host INA %s", tmp));
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											DEB((D_NODELIST, "nodelist: found hidden INA %s", tmp));
 | 
				
			||||||
 | 
											rc += 1;
 | 
				
			||||||
 | 
											// let's find last override to add
 | 
				
			||||||
 | 
											while (ovrbase->hidden != NULL) ovrbase = ovrbase->hidden;
 | 
				
			||||||
 | 
											// and add new element to hiddens:
 | 
				
			||||||
 | 
											ovr = xmalloc(sizeof(s_override));
 | 
				
			||||||
 | 
											memset(ovr,'\0',sizeof(s_override));
 | 
				
			||||||
 | 
											ovr->hidden = NULL;
 | 
				
			||||||
 | 
											ovr->sIpaddr = xstrcpy(tmp);
 | 
				
			||||||
 | 
											ovr->addr = node->addr;
 | 
				
			||||||
 | 
											ovrbase->hidden = ovr;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
								    }
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							searchbase = p + 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						free(tmp);
 | 
				
			||||||
 | 
						return rc;
 | 
				
			||||||
 | 
						// 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*****************************************************************************
 | 
					/*****************************************************************************
 | 
				
			||||||
 * Open nodelist, nodelist index, do some checks
 | 
					 * Open nodelist, nodelist index, do some checks
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@ -619,10 +691,10 @@ int nodelist_close(s_nodelist *nlp)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ASSERT(nlp && nlp->fp_nodelist && nlp->fp_index);
 | 
						ASSERT(nlp && nlp->fp_nodelist && nlp->fp_index);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( nlp->fp_nodelist && file_close(nlp->fp_nodelist) )
 | 
						if( nlp->fp_nodelist && file_close(nlp->fp_nodelist) )  //-V0560
 | 
				
			||||||
		logerr("cannot close nodelist \"%s\"", nlp->name_nodelist);
 | 
							logerr("cannot close nodelist \"%s\"", nlp->name_nodelist);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( nlp->fp_index && file_close(nlp->fp_index) )
 | 
						if( nlp->fp_index && file_close(nlp->fp_index) ) //-V0560
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		logerr("cannot close nodelist index \"%s\"", nlp->name_index);
 | 
							logerr("cannot close nodelist index \"%s\"", nlp->name_index);
 | 
				
			||||||
		rc = 1;
 | 
							rc = 1;
 | 
				
			||||||
 | 
				
			|||||||
@ -362,9 +362,6 @@ int xsystem(const char *command, const char *p_input, const char *p_output)
 | 
				
			|||||||
				close(fd);
 | 
									close(fd);
 | 
				
			||||||
				exit(-1);
 | 
									exit(-1);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if( p_output )
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			close(2);
 | 
								close(2);
 | 
				
			||||||
			fd = open(p_output, O_WRONLY|O_APPEND|O_CREAT, 0600);
 | 
								fd = open(p_output, O_WRONLY|O_APPEND|O_CREAT, 0600);
 | 
				
			||||||
			if( fd != 2 )
 | 
								if( fd != 2 )
 | 
				
			||||||
 | 
				
			|||||||
@ -369,7 +369,7 @@ static int out_bsy_convert_csy_to_bsy(s_bsylist *ptrl)
 | 
				
			|||||||
	out_bsy_file_link(lockname, ".csy", lockname, ".bsy")
 | 
						out_bsy_file_link(lockname, ".csy", lockname, ".bsy")
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Create BSY file in 4D outbound */
 | 
						/* Create BSY file in 4D outbound */
 | 
				
			||||||
	if( !isfailed && ptrl->name_4d )
 | 
						if( ptrl->name_4d )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		switch( LINK_CSY_TO_BSY(ptrl->name_4d) ) {
 | 
							switch( LINK_CSY_TO_BSY(ptrl->name_4d) ) {
 | 
				
			||||||
		case PLOCK_OK:	locked_4d = TRUE; break;
 | 
							case PLOCK_OK:	locked_4d = TRUE; break;
 | 
				
			||||||
 | 
				
			|||||||
@ -272,7 +272,7 @@ static int out_parse_name_lbox(s_faddr *addr, const char *filename)
 | 
				
			|||||||
	ASSERT(addr && filename);
 | 
						ASSERT(addr && filename);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	memset(&tmp, '\0', sizeof(s_faddr));
 | 
						memset(&tmp, '\0', sizeof(s_faddr));
 | 
				
			||||||
	if( sscanf(filename, "%d.%d.%d.%d",
 | 
						if( sscanf(filename, "%u.%u.%u.%u",
 | 
				
			||||||
		&tmp.zone, &tmp.net, &tmp.node, &tmp.point) == 4 )
 | 
							&tmp.zone, &tmp.net, &tmp.node, &tmp.point) == 4 )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		*addr = tmp;
 | 
							*addr = tmp;
 | 
				
			||||||
@ -377,7 +377,7 @@ int out_parse_name_aso(s_faddr *addr, const char *filename)
 | 
				
			|||||||
	ASSERT(addr && filename);
 | 
						ASSERT(addr && filename);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	memset(&tmp, '\0', sizeof(s_faddr));
 | 
						memset(&tmp, '\0', sizeof(s_faddr));
 | 
				
			||||||
	if( sscanf(filename, "%d.%d.%d.%d.%*s", &tmp.zone,
 | 
						if( sscanf(filename, "%u.%u.%u.%u.%*s", &tmp.zone,
 | 
				
			||||||
	    &tmp.net, &tmp.node, &tmp.point) == 4 )
 | 
						    &tmp.net, &tmp.node, &tmp.point) == 4 )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		*addr = tmp;
 | 
							*addr = tmp;
 | 
				
			||||||
 | 
				
			|||||||
@ -186,9 +186,9 @@ int out_handle_sysqueue(s_outbound_callback_data *callback)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Try to found existing entry for this address */
 | 
						/* Try to found existing entry for this address */
 | 
				
			||||||
	if( (sentry = out_getsysentry((s_sysqueue*)callback->dest,
 | 
						sentry = out_getsysentry((s_sysqueue*)callback->dest,
 | 
				
			||||||
			callback->addr)) == NULL )
 | 
								callback->addr);
 | 
				
			||||||
		return -1;
 | 
						//	if (!sentry) return -1;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( type == TYPE_NETMAIL || type == TYPE_REQUEST || type == TYPE_FILEBOX )
 | 
						if( type == TYPE_NETMAIL || type == TYPE_REQUEST || type == TYPE_FILEBOX )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -283,7 +283,7 @@ void log_sysqueue(const s_sysqueue *q)
 | 
				
			|||||||
		if( q->systab[i].flavors & FLAVOR_CRASH  ) strcat(tmp, "Crash,");
 | 
							if( q->systab[i].flavors & FLAVOR_CRASH  ) strcat(tmp, "Crash,");
 | 
				
			||||||
		if( q->systab[i].flavors & FLAVOR_NORMAL ) strcat(tmp, "Normal,");
 | 
							if( q->systab[i].flavors & FLAVOR_NORMAL ) strcat(tmp, "Normal,");
 | 
				
			||||||
		if( q->systab[i].flavors & FLAVOR_HOLD   ) strcat(tmp, "Hold,");
 | 
							if( q->systab[i].flavors & FLAVOR_HOLD   ) strcat(tmp, "Hold,");
 | 
				
			||||||
		if( tmp[0] ) tmp[strlen(tmp)-1] = '\0';
 | 
							if( strlen(tmp)>0 ) tmp[strlen(tmp)-1] = '\0';
 | 
				
			||||||
		DEB((D_OUTBOUND, "log_sysqueue: \tflavors: \"%s\"", tmp));
 | 
							DEB((D_OUTBOUND, "log_sysqueue: \tflavors: \"%s\"", tmp));
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		tmp[0] = '\0';
 | 
							tmp[0] = '\0';
 | 
				
			||||||
@ -294,7 +294,7 @@ void log_sysqueue(const s_sysqueue *q)
 | 
				
			|||||||
		if( q->systab[i].types & TYPE_FILEECHO ) strcat(tmp, "fileecho,");
 | 
							if( q->systab[i].types & TYPE_FILEECHO ) strcat(tmp, "fileecho,");
 | 
				
			||||||
		if( q->systab[i].types & TYPE_FILEBOX  ) strcat(tmp, "filebox,");
 | 
							if( q->systab[i].types & TYPE_FILEBOX  ) strcat(tmp, "filebox,");
 | 
				
			||||||
		if( q->systab[i].types & TYPE_FROMFLO  ) strcat(tmp, "fromflo,");
 | 
							if( q->systab[i].types & TYPE_FROMFLO  ) strcat(tmp, "fromflo,");
 | 
				
			||||||
		if( tmp[0] ) tmp[strlen(tmp)-1] = '\0';
 | 
							if( strlen(tmp)>0 ) tmp[strlen(tmp)-1] = '\0';
 | 
				
			||||||
		DEB((D_OUTBOUND, "log_sysqueue: \ttypes: \"%s\"", tmp));
 | 
							DEB((D_OUTBOUND, "log_sysqueue: \ttypes: \"%s\"", tmp));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	DEB((D_OUTBOUND, "log_sysqueue: END"));
 | 
						DEB((D_OUTBOUND, "log_sysqueue: END"));
 | 
				
			||||||
 | 
				
			|||||||
@ -281,9 +281,9 @@ int binkp_loop(s_binkp_state *bstate) {
 | 
				
			|||||||
int binkp_outgoing(s_binkp_sysinfo *local_data, s_binkp_sysinfo *remote_data)
 | 
					int binkp_outgoing(s_binkp_sysinfo *local_data, s_binkp_sysinfo *remote_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    char *p;
 | 
					    char *p;
 | 
				
			||||||
    init_keys(remote_data->keys_out, local_data->passwd ? local_data->passwd : "-");
 | 
					    init_keys(remote_data->keys_out, local_data->passwd[0] ? local_data->passwd : "-");
 | 
				
			||||||
    init_keys(remote_data->keys_in,  "-");
 | 
					    init_keys(remote_data->keys_in,  "-");
 | 
				
			||||||
    for (p=local_data->passwd ? local_data->passwd : "-"; *p; p++)
 | 
					    for (p=local_data->passwd[0] ? local_data->passwd : "-"; *p; p++)
 | 
				
			||||||
        update_keys(remote_data->keys_in, (int)*p);
 | 
					        update_keys(remote_data->keys_in, (int)*p);
 | 
				
			||||||
    s_binkp_state s;
 | 
					    s_binkp_state s;
 | 
				
			||||||
    s.mode = bmode_outgoing_handshake;
 | 
					    s.mode = bmode_outgoing_handshake;
 | 
				
			||||||
@ -1156,7 +1156,7 @@ case BINKP_BLK_DATA:
 | 
				
			|||||||
	        return 1;
 | 
						        return 1;
 | 
				
			||||||
	    }
 | 
						    }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
        PROTO_ERROR("never should be here");
 | 
					        PROTO_ERROR("never should be here"); //-V0779
 | 
				
			||||||
default:
 | 
					default:
 | 
				
			||||||
        PROTO_ERROR("impossible block_type");
 | 
					        PROTO_ERROR("impossible block_type");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ static int prot_get_next_file(s_filelist **dest, s_protinfo *pi)
 | 
				
			|||||||
	/* local queue */
 | 
						/* local queue */
 | 
				
			||||||
	for( ptrl = q->fslist; ptrl; ptrl = ptrl->next ) {
 | 
						for( ptrl = q->fslist; ptrl; ptrl = ptrl->next ) {
 | 
				
			||||||
	        //DEB((D_OUTBOUND, "scan %s", ptrl->fname));
 | 
						        //DEB((D_OUTBOUND, "scan %s", ptrl->fname));
 | 
				
			||||||
	        if (hint) if (strcmp(hint->fn, ptrl->fname) !=0 || hint->sz != ptrl->size) continue;
 | 
						        if (hint) if (strcmp(hint->fn, ptrl->fname) !=0 || hint->sz != ptrl->size) continue; //-V0547
 | 
				
			||||||
		if( ptrl->status == STATUS_WILLSEND )
 | 
							if( ptrl->status == STATUS_WILLSEND )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if( pi->reqs_only )
 | 
								if( pi->reqs_only )
 | 
				
			||||||
@ -100,7 +100,7 @@ static int prot_get_next_file(s_filelist **dest, s_protinfo *pi)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	for( ptrl = pi->filelist; ptrl; ptrl = ptrl->next ) {
 | 
						for( ptrl = pi->filelist; ptrl; ptrl = ptrl->next ) {
 | 
				
			||||||
	        if (hint) if (strcmp(hint->fn, ptrl->fname) !=0 || hint->sz != ptrl->size) continue;
 | 
						        if (hint) if (strcmp(hint->fn, ptrl->fname) !=0 || hint->sz != ptrl->size) continue; //-V0547
 | 
				
			||||||
		if( ptrl->status == STATUS_WILLSEND )
 | 
							if( ptrl->status == STATUS_WILLSEND )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			*dest = ptrl;
 | 
								*dest = ptrl;
 | 
				
			||||||
@ -112,7 +112,7 @@ static int prot_get_next_file(s_filelist **dest, s_protinfo *pi)
 | 
				
			|||||||
	/* network queue */
 | 
						/* network queue */
 | 
				
			||||||
#ifdef NETSPOOL
 | 
					#ifdef NETSPOOL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (hint) return 1; // cannot choose
 | 
					        if (hint) return 1; //-V0547 cannot choose 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*DEB((D_OUTBOUND, log("netspool next file");*/
 | 
						/*DEB((D_OUTBOUND, log("netspool next file");*/
 | 
				
			||||||
	if(state.netspool.state == NS_NOTINIT) {
 | 
						if(state.netspool.state == NS_NOTINIT) {
 | 
				
			||||||
 | 
				
			|||||||
@ -113,13 +113,13 @@ void emsi_deinit(s_handshake_protocol *THIS)
 | 
				
			|||||||
	ASSERT(THIS->remote_data);
 | 
						ASSERT(THIS->remote_data);
 | 
				
			||||||
	ASSERT(THIS->local_data);
 | 
						ASSERT(THIS->local_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( THIS->remote_data )
 | 
						if( THIS->remote_data ) //-V0547
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		memset(THIS->remote_data, '\0', sizeof(s_emsi));
 | 
							memset(THIS->remote_data, '\0', sizeof(s_emsi));
 | 
				
			||||||
		free(THIS->remote_data);
 | 
							free(THIS->remote_data);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( THIS->local_data )
 | 
						if( THIS->local_data ) //-V0547
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		memset(THIS->local_data, '\0', sizeof(s_emsi));
 | 
							memset(THIS->local_data, '\0', sizeof(s_emsi));
 | 
				
			||||||
		free(THIS->local_data);
 | 
							free(THIS->local_data);
 | 
				
			||||||
 | 
				
			|||||||
@ -439,7 +439,7 @@ char *emsi_createdat(s_emsi *emsi)
 | 
				
			|||||||
	 *  Write total length of <data_pkt>
 | 
						 *  Write total length of <data_pkt>
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	sprintf(buf, "%04hX", (short unsigned)strlen(tmp+14));
 | 
						sprintf(buf, "%04hX", (short unsigned)strlen(tmp+14));
 | 
				
			||||||
	memcpy(tmp+10, buf, 4);
 | 
						memcpy(tmp+10, buf, 4);  //-V1086
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return(tmp);
 | 
						return(tmp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -286,10 +286,11 @@ static char *hydra_putword(char *buf, int val)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static long hydra_getlong(const char *buf)
 | 
					static long hydra_getlong(const char *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return ( (unsigned long) ((unsigned char) buf[0])       )
 | 
						return (int32_t)(( (uint32_t) ((uint8_t) buf[0])       )
 | 
				
			||||||
	     | ( (unsigned long) ((unsigned char) buf[1]) << 8  )
 | 
						     | ( (uint32_t) ((uint8_t) buf[1]) << 8  )
 | 
				
			||||||
	     | ( (unsigned long) ((unsigned char) buf[2]) << 16 )
 | 
						     | ( (uint32_t) ((uint8_t) buf[2]) << 16 )
 | 
				
			||||||
	     | ( (unsigned long) ((unsigned char) buf[3]) << 24 );
 | 
						     | ( (uint32_t) ((uint8_t) buf[3]) << 24 ));
 | 
				
			||||||
 | 
						//return ( buf[3]<<24 | buf[2]<<16 | buf[1]<<8 | buf[0]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int hydra_getword(const char *buf)
 | 
					static int hydra_getword(const char *buf)
 | 
				
			||||||
@ -480,7 +481,7 @@ static char *hydra_putuueblock(char *buf, char *src, size_t szsrc)
 | 
				
			|||||||
		*buf++ = HYDRA_UUENC(src[0] >> 2);
 | 
							*buf++ = HYDRA_UUENC(src[0] >> 2);
 | 
				
			||||||
		*buf++ = HYDRA_UUENC(((src[0] << 4) & 0x30) | ((src[1] >> 4) & 0x0f));
 | 
							*buf++ = HYDRA_UUENC(((src[0] << 4) & 0x30) | ((src[1] >> 4) & 0x0f));
 | 
				
			||||||
		*buf++ = HYDRA_UUENC(((src[1] << 2) & 0x3c) | ((src[2] >> 6) & 0x03));
 | 
							*buf++ = HYDRA_UUENC(((src[1] << 2) & 0x3c) | ((src[2] >> 6) & 0x03));
 | 
				
			||||||
		*buf++ = HYDRA_UUENC(src[2] & 0x3f);
 | 
							*buf++ = HYDRA_UUENC(src[2] & 0x3f);  //-V0578
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( szsrc > 0 )
 | 
						if( szsrc > 0 )
 | 
				
			||||||
@ -1074,8 +1075,8 @@ static int hydra_parse_init(s_hydrainfo *hi, char *pkt, size_t pktlen)
 | 
				
			|||||||
						
 | 
											
 | 
				
			||||||
			sscanf(window, "%08lx%08lx", &txwindow, &rxwindow);
 | 
								sscanf(window, "%08lx%08lx", &txwindow, &rxwindow);
 | 
				
			||||||
						
 | 
											
 | 
				
			||||||
			if( txwindow < 0 ) txwindow = 0L;
 | 
								//if( txwindow < 0 ) txwindow = 0L;
 | 
				
			||||||
			if( rxwindow < 0 ) rxwindow = 0L;
 | 
								//if( rxwindow < 0 ) rxwindow = 0L;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * Log other's hydra information only at 1st batch
 | 
								 * Log other's hydra information only at 1st batch
 | 
				
			||||||
@ -1594,7 +1595,7 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		case HPKT_START:
 | 
							case HPKT_START:
 | 
				
			||||||
			if( txstate == HTX_START || txstate == HTX_SWAIT )
 | 
								if( txstate == HTX_START || txstate == HTX_SWAIT ) //-V0560
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				txtries = 0;
 | 
									txtries = 0;
 | 
				
			||||||
				txstate = HTX_INIT;
 | 
									txstate = HTX_INIT;
 | 
				
			||||||
@ -1615,7 +1616,7 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		case HPKT_INITACK:
 | 
							case HPKT_INITACK:
 | 
				
			||||||
			if( txstate == HTX_INIT || txstate == HTX_INITACK )
 | 
								if( txstate == HTX_INIT || txstate == HTX_INITACK ) //-V0560
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				txtries = 0;
 | 
									txtries = 0;
 | 
				
			||||||
				txstate = HTX_RINIT;
 | 
									txstate = HTX_RINIT;
 | 
				
			||||||
@ -1709,7 +1710,7 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
		case HPKT_FINFOACK:
 | 
							case HPKT_FINFOACK:
 | 
				
			||||||
			if( txstate == HTX_FINFO || txstate == HTX_FINFOACK )
 | 
								if( txstate == HTX_FINFO || txstate == HTX_FINFOACK ) //-V0560
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				long offs = 0L;
 | 
									long offs = 0L;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
@ -1724,7 +1725,7 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					log("Hydra: got invalid FINFOACK packet (ignored)");
 | 
										log("Hydra: got invalid FINFOACK packet (ignored)");
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else if( (offs = hydra_getlong(hi->ibuf)) == 0 )
 | 
									else if( (offs = hydra_getlong(hi->ibuf)) == 0 ) //-V0560 do not touch
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					txlastack = 0;
 | 
										txlastack = 0;
 | 
				
			||||||
					txtries = 0;
 | 
										txtries = 0;
 | 
				
			||||||
@ -1992,7 +1993,7 @@ int hydra_batch(s_hydrainfo *hi, s_protinfo *pi)
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if( rxstate == HRX_Skip || rxstate == HRX_SkipAck )
 | 
								else if( rxstate == HRX_Skip || rxstate == HRX_SkipAck ) //-V0560
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if( hi->isize < 4 )
 | 
									if( hi->isize < 4 )
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
 | 
				
			|||||||
@ -90,7 +90,7 @@ static void yoohoo_put_hello(char *buffer, s_yoohoo_sysinfo *myhello)
 | 
				
			|||||||
		char *q;
 | 
							char *q;
 | 
				
			||||||
		if( strlen(myhello->system) + strlen(state.localaddrs[0].addr.domain) > 57 )
 | 
							if( strlen(myhello->system) + strlen(state.localaddrs[0].addr.domain) > 57 )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if( strlen(state.localaddrs[0].addr.domain) < 60 )  //PVS-Suppress V547
 | 
								if( strlen(state.localaddrs[0].addr.domain) < 60 )  //-V0547
 | 
				
			||||||
				q = p + (60 - strlen(state.localaddrs[0].addr.domain));
 | 
									q = p + (60 - strlen(state.localaddrs[0].addr.domain));
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				q = p;
 | 
									q = p;
 | 
				
			||||||
 | 
				
			|||||||
@ -81,13 +81,13 @@ void yoohoo_deinit(s_handshake_protocol *THIS)
 | 
				
			|||||||
	ASSERT(THIS->remote_data);
 | 
						ASSERT(THIS->remote_data);
 | 
				
			||||||
	ASSERT(THIS->local_data);
 | 
						ASSERT(THIS->local_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( THIS->remote_data )
 | 
						if( THIS->remote_data )  //-V0547
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		memset(THIS->remote_data, '\0', sizeof(s_yoohoo_sysinfo));
 | 
							memset(THIS->remote_data, '\0', sizeof(s_yoohoo_sysinfo));
 | 
				
			||||||
		free(THIS->remote_data);
 | 
							free(THIS->remote_data);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( THIS->local_data )
 | 
						if( THIS->local_data )   //-V0547
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		memset(THIS->local_data, '\0', sizeof(s_yoohoo_sysinfo));
 | 
							memset(THIS->local_data, '\0', sizeof(s_yoohoo_sysinfo));
 | 
				
			||||||
		free(THIS->local_data);
 | 
							free(THIS->local_data);
 | 
				
			||||||
 | 
				
			|||||||
@ -360,12 +360,12 @@ static int noxrd7(void)
 | 
				
			|||||||
		if( (c = GETCHAR(Z_Rxwait)) < 0 )
 | 
							if( (c = GETCHAR(Z_Rxwait)) < 0 )
 | 
				
			||||||
			return(c);
 | 
								return(c);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		switch( c &= 0177 ) {
 | 
							switch( c &= 0x7F ) { // was octal 0177
 | 
				
			||||||
		case XON:
 | 
							case XON:
 | 
				
			||||||
		case XOFF:
 | 
							case XOFF:
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			if( Z_Ctlesc && !(c & 0140) )
 | 
								if( Z_Ctlesc && !(c & 0x60) ) //was octal 0140  b01100000 hex 0x60
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
		case '\r':
 | 
							case '\r':
 | 
				
			||||||
		case '\n':
 | 
							case '\n':
 | 
				
			||||||
@ -1056,8 +1056,8 @@ static int zrhhdr(char *hdr)
 | 
				
			|||||||
		/* There is some characters available.. */
 | 
							/* There is some characters available.. */
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		switch( (c = GETCHAR(1)) ) {
 | 
							switch( (c = GETCHAR(1)) ) {
 | 
				
			||||||
		case 0215:
 | 
							case 0x8D: //was octal 0215 dec 141 b 10001101 hex 0x8D ZCRC
 | 
				
			||||||
		case 015:
 | 
							case 0x0D:  //was octal 015 dec 13 b 00001101 hex 0x0D ZCRC
 | 
				
			||||||
	 		/* Throw away possible cr/lf */
 | 
						 		/* Throw away possible cr/lf */
 | 
				
			||||||
			if( (c = GETCHAR(1)) < 0 && c != ZTIMER )
 | 
								if( (c = GETCHAR(1)) < 0 && c != ZTIMER )
 | 
				
			||||||
				return(c);
 | 
									return(c);
 | 
				
			||||||
 | 
				
			|||||||
@ -248,8 +248,8 @@ int rx_zmodem(s_protinfo *pi, bool caller)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
		} /* end of switch(rxstate) */
 | 
							} /* end of switch(rxstate) */
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		
 | 
							//  && rxstate != ZRX_GOTFILE - always true, :131 changes it
 | 
				
			||||||
		if( rxstate != ZRX_INIT     && rxstate != ZRX_GOTFILE
 | 
							if( rxstate != ZRX_INIT    
 | 
				
			||||||
		 && rxstate != ZRX_SENDRPOS && rxstate != ZRX_WAITDATA
 | 
							 && rxstate != ZRX_SENDRPOS && rxstate != ZRX_WAITDATA
 | 
				
			||||||
		 && rxstate != ZRX_SKIP     && rxstate != ZRX_REFUSE )
 | 
							 && rxstate != ZRX_SKIP     && rxstate != ZRX_REFUSE )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
				
			|||||||
@ -133,6 +133,7 @@ int tx_zmodem(s_protinfo *pi, bool caller)
 | 
				
			|||||||
	int   dtype, n;
 | 
						int   dtype, n;
 | 
				
			||||||
	int   ftype;
 | 
						int   ftype;
 | 
				
			||||||
	char  c, *p;
 | 
						char  c, *p;
 | 
				
			||||||
 | 
						int   ichar = 0;
 | 
				
			||||||
	long unsigned crc32;
 | 
						long unsigned crc32;
 | 
				
			||||||
	enum  ztxstates txstate;
 | 
						enum  ztxstates txstate;
 | 
				
			||||||
	time_t deadtimer;
 | 
						time_t deadtimer;
 | 
				
			||||||
@ -390,7 +391,8 @@ int tx_zmodem(s_protinfo *pi, bool caller)
 | 
				
			|||||||
			break;
 | 
								break;
 | 
				
			||||||
		} /* end of switch(txstate) */
 | 
							} /* end of switch(txstate) */
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if( txstate != ZTX_START  && txstate != ZTX_RQINIT
 | 
							// txstate != ZTX_START always true
 | 
				
			||||||
 | 
							if( txstate != ZTX_RQINIT
 | 
				
			||||||
		 && txstate != ZTX_FINFO  && txstate != ZTX_DATA
 | 
							 && txstate != ZTX_FINFO  && txstate != ZTX_DATA
 | 
				
			||||||
		 && txstate != ZTX_EOF    && txstate != ZTX_FIN )
 | 
							 && txstate != ZTX_EOF    && txstate != ZTX_FIN )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -648,8 +650,8 @@ int tx_zmodem(s_protinfo *pi, bool caller)
 | 
				
			|||||||
					log(" Send file's CRC-32 ");
 | 
										log(" Send file's CRC-32 ");
 | 
				
			||||||
					crc32 = 0xFFFFFFFFL;
 | 
										crc32 = 0xFFFFFFFFL;
 | 
				
			||||||
					
 | 
										
 | 
				
			||||||
					while( ((c = getc(pi->send->fp)) != EOF) && --Z_Rxpos )
 | 
										while( ((ichar = getc(pi->send->fp)) != EOF) && --Z_Rxpos )
 | 
				
			||||||
						crc32 = updcrc32(c, crc32);
 | 
											crc32 = updcrc32(ichar, crc32);
 | 
				
			||||||
					
 | 
										
 | 
				
			||||||
					crc32 = ~crc32;
 | 
										crc32 = ~crc32;
 | 
				
			||||||
					
 | 
										
 | 
				
			||||||
 | 
				
			|||||||
@ -591,7 +591,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
	log(s);
 | 
						log(s);
 | 
				
			||||||
	DEB((D_EVENT, s));
 | 
						DEB((D_EVENT, s));
 | 
				
			||||||
	// find suitable way of connection and try to make session
 | 
						// find suitable way of connection and try to make session
 | 
				
			||||||
	
 | 
						s_override *tmpovr;
 | 
				
			||||||
        int rc = 0;
 | 
					        int rc = 0;
 | 
				
			||||||
        int runrc = 0;
 | 
					        int runrc = 0;
 | 
				
			||||||
	char abuf[BF_MAXADDRSTR+1];
 | 
						char abuf[BF_MAXADDRSTR+1];
 | 
				
			||||||
@ -599,7 +599,9 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
	char *errmsg = NULL;
 | 
						char *errmsg = NULL;
 | 
				
			||||||
	int call_mustuse = 0;
 | 
						int call_mustuse = 0;
 | 
				
			||||||
	int call_mayuse = 0;
 | 
						int call_mayuse = 0;
 | 
				
			||||||
 | 
					    char origphone[BNI_MAXPHONE+1];
 | 
				
			||||||
 | 
						char origflags[BNI_MAXFLAGS+1];
 | 
				
			||||||
 | 
						char orighost[BNI_MAXHOST+1];
 | 
				
			||||||
	init_state(&state);
 | 
						init_state(&state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	state.caller    = TRUE;
 | 
						state.caller    = TRUE;
 | 
				
			||||||
@ -613,6 +615,32 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
		gotoexit(BFERR_PHONE_UNKNOWN);
 | 
							gotoexit(BFERR_PHONE_UNKNOWN);
 | 
				
			||||||
	} 
 | 
						} 
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						// We can do it even if no nodelist string for node
 | 
				
			||||||
 | 
						// we got overrides, so apply ALL configs, except tuned by options
 | 
				
			||||||
 | 
						// BEFORE we decide how to call
 | 
				
			||||||
 | 
						if (state.override.sFlags) {
 | 
				
			||||||
 | 
							(void)strnxcpy(state.node.flags, state.override.sFlags, strlen(state.override.sFlags)+1);
 | 
				
			||||||
 | 
							state.node.do_binkp = (nodelist_checkflag(state.node.flags, "IBN") == 0);
 | 
				
			||||||
 | 
							state.node.do_ifcico = (nodelist_checkflag(state.node.flags, "IFC") == 0);
 | 
				
			||||||
 | 
							state.node.do_telnet = (nodelist_checkflag(state.node.flags, "ITN") == 0);
 | 
				
			||||||
 | 
							memset(state.node.host,'\0',sizeof(state.node.host));
 | 
				
			||||||
 | 
							nodelist_flagvalue(state.node.flags, "INA",state.node.host);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							DEB((D_EVENT, "sess_call: applied override flags=%s", state.node.flags));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (state.override.sPhone && !(opts->phone)) {
 | 
				
			||||||
 | 
							(void)strnxcpy(state.node.phone, state.override.sPhone, strlen(state.override.sPhone)+1);
 | 
				
			||||||
 | 
							DEB((D_EVENT, "sess_call: applied override phone=%s", state.node.phone));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (state.override.sIpaddr && !(opts->iphost)) {
 | 
				
			||||||
 | 
							(void)strnxcpy(state.node.host, state.override.sIpaddr, strlen(state.override.sIpaddr)+1);
 | 
				
			||||||
 | 
							DEB((D_EVENT, "sess_call: applied override ipaddr=%s", state.node.host));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (nodelist_parsehiddenina(&state.node, &state.override) > 0) {
 | 
				
			||||||
 | 
							DEB((D_EVENT, "sess_call: got hidden INAs"));	
 | 
				
			||||||
 | 
						}	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	state.listed    = state.node.listed;
 | 
						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 */
 | 
						state.node.addr.domain[0] = '\0'; /* Discard domain for node address */
 | 
				
			||||||
@ -640,7 +668,7 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	else if( opts->runmode == MODE_CALL_IP )
 | 
						else if( opts->runmode == MODE_CALL_IP )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		DEB((D_EVENT, "Calling init, MODE_CALL_IP"));
 | 
							DEB((D_EVENT, "sess_call: MODE_CALL_IP - from cli"));
 | 
				
			||||||
		if( !(opts->ipproto) ) // determine from nodelist/override
 | 
							if( !(opts->ipproto) ) // determine from nodelist/override
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			DEB((D_EVENT, "ipproto not set"));
 | 
								DEB((D_EVENT, "ipproto not set"));
 | 
				
			||||||
@ -676,9 +704,9 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
	call_mayuse |= call_mustuse; // it simplifies logics: all required is allowed
 | 
						call_mayuse |= call_mustuse; // it simplifies logics: all required is allowed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       //char s[300];
 | 
					       //char s[300];
 | 
				
			||||||
       //snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse);
 | 
					       snprintf(s, 299, "initial: may use %d must use %d", call_mayuse, call_mustuse);
 | 
				
			||||||
       //log(s);
 | 
					       //log(s);
 | 
				
			||||||
       //DEB((D_EVENT, s));
 | 
					       DEB((D_EVENT, s));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( (call_mayuse & CALL_MODEM) )
 | 
						if( (call_mayuse & CALL_MODEM) )
 | 
				
			||||||
@ -691,16 +719,17 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			(void)strnxcpy(state.node.phone, opts->phone, sizeof(state.node.phone));
 | 
								(void)strnxcpy(state.node.phone, opts->phone, sizeof(state.node.phone));
 | 
				
			||||||
			//log("phone from options");
 | 
								//log("phone from options");
 | 
				
			||||||
		}
 | 
							} // Moved to top
 | 
				
			||||||
		else if( state.override.sPhone )
 | 
							//else if( state.override.sPhone )
 | 
				
			||||||
		{
 | 
							//{
 | 
				
			||||||
			(void)strnxcpy(state.node.phone, state.override.sPhone, sizeof(state.node.phone));
 | 
							//	(void)strnxcpy(state.node.phone, state.override.sPhone, sizeof(state.node.phone));
 | 
				
			||||||
			//log("phone from override");
 | 
							//	//log("phone from override");
 | 
				
			||||||
		}
 | 
							//}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		if( !modem_isgood_phone(state.node.phone) )
 | 
							if( !modem_isgood_phone(state.node.phone) )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			log("bad phone, excluding modem");
 | 
								log("bad phone, excluding modem");
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: bad phone, excluding modem" )); 
 | 
				
			||||||
			call_mayuse &= ~CALL_MODEM;
 | 
								call_mayuse &= ~CALL_MODEM;
 | 
				
			||||||
			if( !(call_mayuse) )
 | 
								if( !(call_mayuse) )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
@ -749,14 +778,14 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
       //log(s);
 | 
					       //log(s);
 | 
				
			||||||
	   //DEB((D_EVENT, s));
 | 
						   //DEB((D_EVENT, s));
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Apply overrides to the node information
 | 
						 * Apply overrides to the node information - 2025 moved to start
 | 
				
			||||||
	 */	
 | 
						 */	
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( state.override.sFlags )
 | 
						//if( state.override.sFlags )
 | 
				
			||||||
	{
 | 
						//{
 | 
				
			||||||
		strnxcat(state.node.flags, ",", sizeof(state.node.flags));
 | 
						//	strnxcat(state.node.flags, ",", sizeof(state.node.flags));
 | 
				
			||||||
		strnxcat(state.node.flags, state.override.sFlags, sizeof(state.node.flags));
 | 
						//	strnxcat(state.node.flags, state.override.sFlags, sizeof(state.node.flags));
 | 
				
			||||||
	}
 | 
						//}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// state.node		nodelist
 | 
						// state.node		nodelist
 | 
				
			||||||
	// state.override	config
 | 
						// state.override	config
 | 
				
			||||||
@ -764,44 +793,50 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	// filter unavailable protos if not obligated to use it
 | 
						// filter unavailable protos if not obligated to use it
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( !(call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) )
 | 
						// Decide protos on calling by flags with override
 | 
				
			||||||
 | 
						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, "IBN") != 0 )
 | 
				
			||||||
		if( state.node.do_binkp == 0 )
 | 
							if( state.node.do_binkp == 0 )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			call_mayuse &= ~CALL_TCPIP_BINKP;
 | 
								call_mayuse &= ~CALL_TCPIP_BINKP;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( !(call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) )
 | 
						if( (call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//if( nodelist_checkflag(state.node.flags, "IFC") != 0 && nodelist_checkflag(state.node.flags, "IFC") != 0 )
 | 
							//if( nodelist_checkflag(state.node.flags, "IFC") != 0 )
 | 
				
			||||||
		if( state.node.do_ifcico == 0 )
 | 
							if( state.node.do_ifcico == 0 )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			call_mayuse &= ~CALL_TCPIP_IFCICO;
 | 
								call_mayuse &= ~CALL_TCPIP_IFCICO;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( !(call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) )
 | 
						if( (call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		//if( nodelist_checkflag(state.node.flags, "TELN") != 0 && nodelist_checkflag(state.node.flags, "TLN") != 0 )
 | 
							//if( nodelist_checkflag(state.node.flags, "TLN") != 0 )
 | 
				
			||||||
		if( state.node.do_telnet == 0 )
 | 
							if( state.node.do_telnet == 0 )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			call_mayuse &= ~CALL_TCPIP_TELNET;
 | 
								call_mayuse &= ~CALL_TCPIP_TELNET;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} 
 | 
						} 
 | 
				
			||||||
 | 
						   snprintf(s, 299, "after 1 check: may use %d must use %d", call_mayuse, call_mustuse);
 | 
				
			||||||
 | 
					       log(s);
 | 
				
			||||||
 | 
						   DEB((D_EVENT, s));
 | 
				
			||||||
	   
 | 
						   
 | 
				
			||||||
	if( opts->iphost && *opts->iphost )
 | 
						if( opts->iphost && *opts->iphost )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							memset(state.node.host,'\0',sizeof(state.node.host));
 | 
				
			||||||
		(void)strnxcpy(state.node.host, opts->iphost, sizeof(state.node.host));
 | 
							(void)strnxcpy(state.node.host, opts->iphost, sizeof(state.node.host));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if( state.override.sIpaddr )
 | 
						// Moved to start
 | 
				
			||||||
	{
 | 
						//else if( state.override.sIpaddr )
 | 
				
			||||||
		(void)strnxcpy(state.node.host,
 | 
						//{
 | 
				
			||||||
				state.override.sIpaddr, sizeof(state.node.host));
 | 
						//	(void)strnxcpy(state.node.host,
 | 
				
			||||||
	}
 | 
						//			state.override.sIpaddr, sizeof(state.node.host));
 | 
				
			||||||
 | 
						//}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	//DEB((D_EVENT, "Calling init, IPHOST", state.node.host));
 | 
						DEB((D_EVENT, "Calling init, IPHOST %s", state.node.host));
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// We have at least one protocol and not valid address - try to
 | 
						// We have at least one protocol and not valid address - try to
 | 
				
			||||||
	// find INA with through Fidonet DNS
 | 
						// find INA with through Fidonet DNS
 | 
				
			||||||
@ -871,13 +906,107 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	// try allowed methods and break if rc == 0
 | 
						// try allowed methods and break if rc == 0
 | 
				
			||||||
	rc = -1;
 | 
						rc = -1;
 | 
				
			||||||
 | 
						// START CALLING
 | 
				
			||||||
 | 
						// ROTATE HIDDEN LINES IF ANY
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						//snprintf(s, 299, "before call: may use %d must use %d", call_mayuse, call_mustuse);
 | 
				
			||||||
 | 
					    //log(s);
 | 
				
			||||||
 | 
					    //DEB((D_EVENT, s));
 | 
				
			||||||
 | 
					    // Hidden lines - if smth is not in place - use orig overriden hard
 | 
				
			||||||
 | 
					    memcpy(&origphone, &state.node.phone,sizeof(origphone));
 | 
				
			||||||
 | 
					    memcpy(&origflags, &state.node.flags,sizeof(origflags));
 | 
				
			||||||
 | 
					    memcpy(&orighost, &state.node.host,sizeof(orighost));
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
	if( call_mayuse & CALL_STDIO )
 | 
						if( call_mayuse & CALL_STDIO )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		DEB((D_EVENT,"sess_call: calling stdio"));
 | 
							DEB((D_EVENT,"sess_call: calling stdio, mayuse=%x", call_mayuse));
 | 
				
			||||||
		rc = call_system_quiet(opts->connect, opts->inetd);
 | 
							rc = call_system_quiet(opts->connect, opts->inetd);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( rc && (call_mayuse & CALL_TCPIP_BINKP) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DEB((D_EVENT,"sess_call: calling binkp, mayuse=%x", call_mayuse));
 | 
				
			||||||
 | 
							rc = call_system_tcpip(CALL_TCPIP_BINKP);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( rc && (call_mayuse & CALL_TCPIP_IFCICO) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DEB((D_EVENT,"sess_call: calling ifcico, mayuse=%x", call_mayuse));
 | 
				
			||||||
 | 
							rc = call_system_tcpip(CALL_TCPIP_IFCICO);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( rc && (call_mayuse & CALL_TCPIP_TELNET) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DEB((D_EVENT,"sess_call: calling telnet, mayuse=%x", call_mayuse));
 | 
				
			||||||
 | 
							rc = call_system_tcpip(CALL_TCPIP_TELNET);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						tmpovr = &state.override;
 | 
				
			||||||
 | 
						while (tmpovr->hidden != NULL && rc) {
 | 
				
			||||||
 | 
							DEB((D_EVENT, "sess_call: starting hidden, current is %x", tmpovr->hidden));
 | 
				
			||||||
 | 
							tmpovr = tmpovr->hidden;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (tmpovr->sFlags) {
 | 
				
			||||||
 | 
								if (nodelist_checkflag(tmpovr->sFlags, "INA") == 0) {
 | 
				
			||||||
 | 
									memset(state.node.host,'\0',sizeof(state.node.host));
 | 
				
			||||||
 | 
									nodelist_flagvalue(tmpovr->sFlags, "INA",state.node.host);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								(void)strnxcpy(state.node.flags, tmpovr->sFlags, strlen(tmpovr->sFlags)+1);
 | 
				
			||||||
 | 
								call_mayuse |= call_mustuse;
 | 
				
			||||||
 | 
								state.node.do_binkp = nodelist_checkflag(state.node.flags, "IBN") == 0;
 | 
				
			||||||
 | 
								state.node.do_ifcico = nodelist_checkflag(state.node.flags, "IFC") == 0;
 | 
				
			||||||
 | 
								state.node.do_telnet = nodelist_checkflag(state.node.flags, "ITN") == 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: applied hidden flags=%s", state.node.flags));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								memcpy(&state.node.flags, &origflags, sizeof(origflags));
 | 
				
			||||||
 | 
								call_mayuse |= call_mustuse;
 | 
				
			||||||
 | 
								state.node.do_binkp = nodelist_checkflag(state.node.flags, "IBN") == 0;
 | 
				
			||||||
 | 
								state.node.do_ifcico = nodelist_checkflag(state.node.flags, "IFC") == 0;
 | 
				
			||||||
 | 
								state.node.do_telnet = nodelist_checkflag(state.node.flags, "ITN") == 0;
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: applied original flags=%s", state.node.flags));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (tmpovr->sPhone && !(opts->phone)) {
 | 
				
			||||||
 | 
								(void)strnxcpy(state.node.phone, tmpovr->sPhone, strlen(tmpovr->sPhone)+1);
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: ?skipping hidden phone=%s", state.node.phone));
 | 
				
			||||||
 | 
								if ( !(tmpovr->sFlags) && !(tmpovr->sIpaddr) ) continue; // skip only telephone
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								memcpy(&state.node.phone, &origphone, sizeof(origphone));
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: applied original phone=%s", state.node.phone));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (tmpovr->sIpaddr && !(opts->iphost)) {
 | 
				
			||||||
 | 
								(void)strnxcpy(state.node.host, tmpovr->sIpaddr, strlen(tmpovr->sIpaddr)+1);
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: applied hidden ipaddr=%s", state.node.host));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if( (call_mustuse & CALL_TCPIP_BINKP) && (call_mayuse & CALL_TCPIP_BINKP) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//if( nodelist_checkflag(state.node.flags, "IBN") != 0 )
 | 
				
			||||||
 | 
								if( state.node.do_binkp == 0 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									call_mayuse &= ~CALL_TCPIP_BINKP;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if( (call_mustuse & CALL_TCPIP_IFCICO) && (call_mayuse & CALL_TCPIP_IFCICO) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//if( nodelist_checkflag(state.node.flags, "IFC") != 0 )
 | 
				
			||||||
 | 
								if( state.node.do_ifcico == 0 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									call_mayuse &= ~CALL_TCPIP_IFCICO;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if( (call_mustuse & CALL_TCPIP_TELNET) && (call_mayuse & CALL_TCPIP_TELNET) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//if( nodelist_checkflag(state.node.flags, "TLN") != 0 )
 | 
				
			||||||
 | 
								if( state.node.do_telnet == 0 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									call_mayuse &= ~CALL_TCPIP_TELNET;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		if( rc && (call_mayuse & CALL_TCPIP_BINKP) )
 | 
							if( rc && (call_mayuse & CALL_TCPIP_BINKP) )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			DEB((D_EVENT,"sess_call: calling binkp"));
 | 
								DEB((D_EVENT,"sess_call: calling binkp"));
 | 
				
			||||||
@ -895,7 +1024,11 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
			DEB((D_EVENT,"sess_call: calling telnet"));
 | 
								DEB((D_EVENT,"sess_call: calling telnet"));
 | 
				
			||||||
			rc = call_system_tcpip(CALL_TCPIP_TELNET);
 | 
								rc = call_system_tcpip(CALL_TCPIP_TELNET);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							DEB((D_EVENT, "sess_call: finished hidden, next is %x", tmpovr->hidden));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// DIALING_
 | 
				
			||||||
	if( rc && (call_mayuse & CALL_MODEM) )
 | 
						if( rc && (call_mayuse & CALL_MODEM) )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		DEB((D_EVENT,"sess_call: calling MODEM"));
 | 
							DEB((D_EVENT,"sess_call: calling MODEM"));
 | 
				
			||||||
@ -932,7 +1065,54 @@ int call_system(s_faddr addr, const s_bforce_opts *opts)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
		    errmsg = "unable to get modem port";
 | 
							    errmsg = "unable to get modem port";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							tmpovr = &state.override;
 | 
				
			||||||
 | 
							while (tmpovr->hidden != NULL && rc) {
 | 
				
			||||||
 | 
								DEB((D_EVENT, "sess_call: starting hidden, current is %x", tmpovr->hidden));
 | 
				
			||||||
 | 
								tmpovr = tmpovr->hidden;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								// As for now - no effect in phone calls
 | 
				
			||||||
 | 
								if (tmpovr->sFlags) {
 | 
				
			||||||
 | 
									(void)strnxcpy(state.node.flags, tmpovr->sFlags, strlen(tmpovr->sFlags)+1);
 | 
				
			||||||
 | 
									DEB((D_EVENT, "sess_call: applied hidden flags=%s", state.node.flags));
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									memcpy(&state.node.flags, &origflags, sizeof(origflags));
 | 
				
			||||||
 | 
									DEB((D_EVENT, "sess_call: applied original flags=%s", state.node.flags));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if (tmpovr->sPhone && !(opts->phone)) {
 | 
				
			||||||
 | 
									(void)strnxcpy(state.node.phone, tmpovr->sPhone, strlen(tmpovr->sPhone)+1);
 | 
				
			||||||
 | 
									DEB((D_EVENT, "sess_call: applied hidden phone=%s", state.node.phone));
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									DEB((D_EVENT, "sess_call: no hidden phone - skipping"));
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if( state.modemport )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								    if( port_lock(p_lockdir, state.modemport) == 0 ) /* Successfuly locked port */
 | 
				
			||||||
 | 
								    {
 | 
				
			||||||
 | 
										DEB((D_EVENT,"sess_call: hidden call_system_modem running"));
 | 
				
			||||||
 | 
								    	rc = call_system_modem();
 | 
				
			||||||
 | 
								    	port_unlock(p_lockdir, state.modemport);
 | 
				
			||||||
 | 
								    }
 | 
				
			||||||
 | 
								    else
 | 
				
			||||||
 | 
								    {
 | 
				
			||||||
 | 
									errmsg = "cannot lock modem port";
 | 
				
			||||||
 | 
								    }
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								    errmsg = "unable to get modem port";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							// END_DIALING
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// END CALLING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( rc )
 | 
						if( rc )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
				
			|||||||
@ -223,7 +223,8 @@ int session_init_outgoing()
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		else if( c == ENQ )
 | 
							else if( c == ENQ )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if( enq_need && ++enqcount >= enq_need && canyoohoo )
 | 
								if ( ++enqcount >= enq_need && canyoohoo )
 | 
				
			||||||
 | 
								//if( enq_need && ++enqcount >= enq_need && canyoohoo )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				DEB((D_HSHAKE, "tx_init: exit with YooHoo"));
 | 
									DEB((D_HSHAKE, "tx_init: exit with YooHoo"));
 | 
				
			||||||
				state.session = SESSION_YOOHOO;
 | 
									state.session = SESSION_YOOHOO;
 | 
				
			||||||
@ -232,7 +233,8 @@ int session_init_outgoing()
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		else if( c == TSYNC )
 | 
							else if( c == TSYNC )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if( nak_need && ++nakcount > nak_need && canftsc )
 | 
								if( ++nakcount > nak_need && canftsc )
 | 
				
			||||||
 | 
								//if( nak_need && ++nakcount > nak_need && canftsc )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				DEB((D_HSHAKE, "tx_init: exit with FTS-1"));
 | 
									DEB((D_HSHAKE, "tx_init: exit with FTS-1"));
 | 
				
			||||||
				state.session = SESSION_FTSC;
 | 
									state.session = SESSION_FTSC;
 | 
				
			||||||
 | 
				
			|||||||
@ -612,7 +612,7 @@ void session_traffic_log(bool incoming, s_traffic *traff)
 | 
				
			|||||||
			strcat(msg, buf);
 | 
								strcat(msg, buf);
 | 
				
			||||||
			strcat(msg, " files, ");
 | 
								strcat(msg, " files, ");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if( *msg )
 | 
							if( *msg && strlen(msg)>2 )
 | 
				
			||||||
			msg[strlen(msg)-2] = '\0';
 | 
								msg[strlen(msg)-2] = '\0';
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -283,15 +283,14 @@ int session_stat_update(s_faddr *addr, s_sess_stat *stat, bool caller, int rc)
 | 
				
			|||||||
				stat->tries_nodial++;
 | 
									stat->tries_nodial++;
 | 
				
			||||||
			if( BFERR_CANT_CONNECT10 <= rc && rc <= BFERR_CANT_CONNECT19 )
 | 
								if( BFERR_CANT_CONNECT10 <= rc && rc <= BFERR_CANT_CONNECT19 )
 | 
				
			||||||
				stat->tries_noconn++;
 | 
									stat->tries_noconn++;
 | 
				
			||||||
			if( rc >= BFERR_CONNECT_TOOLOW )
 | 
					 | 
				
			||||||
				stat->tries_sessns++;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			/* Reset some counters */	
 | 
					 | 
				
			||||||
			if( rc >= BFERR_CONNECT_TOOLOW ) 
 | 
								if( rc >= BFERR_CONNECT_TOOLOW ) 
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									stat->tries_sessns++;
 | 
				
			||||||
 | 
									/* Reset some counters */
 | 
				
			||||||
				stat->tries_noansw = TRIES_RESET;
 | 
									stat->tries_noansw = TRIES_RESET;
 | 
				
			||||||
				stat->tries_noconn = TRIES_RESET;
 | 
									stat->tries_noconn = TRIES_RESET;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
			if( rc >  BFERR_HANDSHAKE_ERROR )
 | 
								if( rc >  BFERR_HANDSHAKE_ERROR )
 | 
				
			||||||
				stat->tries_hshake = TRIES_RESET;
 | 
									stat->tries_hshake = TRIES_RESET;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -178,7 +178,6 @@ char *file_gettmp(void)
 | 
				
			|||||||
		
 | 
							
 | 
				
			||||||
		res = string_concat(tmp, chunk, '\0');
 | 
							res = string_concat(tmp, chunk, '\0');
 | 
				
			||||||
	    
 | 
						    
 | 
				
			||||||
	    if( chunk )
 | 
					 | 
				
			||||||
	    free(chunk);
 | 
						    free(chunk);
 | 
				
			||||||
		if( !res )
 | 
							if( !res )
 | 
				
			||||||
			free(tmp);
 | 
								free(tmp);
 | 
				
			||||||
 | 
				
			|||||||
@ -176,7 +176,7 @@ int strcasemask(const char *str, const char *mask)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return( *s != '\0' || *m != '\0' );
 | 
						return( *s != '\0' || *m != '\0' ); //-V0560 It seems more logical 
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*****************************************************************************
 | 
					/*****************************************************************************
 | 
				
			||||||
@ -329,7 +329,7 @@ void printf_usage(const char *ident, const char *fmt, ...)
 | 
				
			|||||||
	else
 | 
						else
 | 
				
			||||||
		printf("Sorry, no usage information available\n\n");
 | 
							printf("Sorry, no usage information available\n\n");
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	printf("Mail bug reports to <adb@newmail.ru>\n");
 | 
						printf("Mail bug reports to <zx@zxalexis.ru>\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fflush(stdout);
 | 
						fflush(stdout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -155,7 +155,7 @@ int plock_create(const char *lockname)
 | 
				
			|||||||
	char *tmpname, *p, *chunk;
 | 
						char *tmpname, *p, *chunk;
 | 
				
			||||||
	chunk = xmalloc(7);
 | 
						chunk = xmalloc(7);
 | 
				
			||||||
	if (!chunk) {
 | 
						if (!chunk) {
 | 
				
			||||||
		logerr("can't generate unique file name from \"%s\"", tmpname);
 | 
							logerr("can't malloc mem for generation of lock name");
 | 
				
			||||||
		DEB((D_FREE, "plock freed"));
 | 
							DEB((D_FREE, "plock freed"));
 | 
				
			||||||
		return PLOCK_ERROR;
 | 
							return PLOCK_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -60,8 +60,12 @@ char *xstrcpy(const char *src)
 | 
				
			|||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	tmp = xmalloc(strlen(src)+1);
 | 
						tmp = xmalloc(strlen(src)+1);
 | 
				
			||||||
 | 
						if (!tmp)	
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
		strcpy(tmp, src);
 | 
							strcpy(tmp, src);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	return tmp;
 | 
						return tmp;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -85,7 +89,7 @@ char *xstrcat(char *src, const char *add)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	size = (src ? strlen(src) : 0) + strlen(add);
 | 
						size = (src ? strlen(src) : 0) + strlen(add);
 | 
				
			||||||
	tmp  = (char*)xmalloc(size+1);
 | 
						tmp  = (char*)xmalloc(size+1);
 | 
				
			||||||
	
 | 
						if (tmp) {
 | 
				
			||||||
		if( src )
 | 
							if( src )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			strcpy(tmp, src);
 | 
								strcpy(tmp, src);
 | 
				
			||||||
@ -94,6 +98,7 @@ char *xstrcat(char *src, const char *add)
 | 
				
			|||||||
			*tmp = '\0';
 | 
								*tmp = '\0';
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		strcat(tmp, add);
 | 
							strcat(tmp, add);
 | 
				
			||||||
 | 
						}	
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return tmp;
 | 
						return tmp;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -216,7 +221,7 @@ char *string_chomp(char *str)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ASSERT(str != NULL);
 | 
						ASSERT(str != NULL);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( str && *str )
 | 
						if( *str )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		p = str + strlen(str + 1);
 | 
							p = str + strlen(str + 1);
 | 
				
			||||||
		if( *p == '\n' )
 | 
							if( *p == '\n' )
 | 
				
			||||||
@ -383,7 +388,7 @@ char *string_trimright(char *str)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ASSERT(str != NULL);
 | 
						ASSERT(str != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( str && *str )
 | 
						if( *str )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		p = str + strlen(str+1);
 | 
							p = str + strlen(str+1);
 | 
				
			||||||
		while( p >= str && isspace(*p) ) *p-- = '\0';
 | 
							while( p >= str && isspace(*p) ) *p-- = '\0';
 | 
				
			||||||
@ -407,7 +412,7 @@ char *string_trimleft(char *str)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	ASSERT(str != NULL);
 | 
						ASSERT(str != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( str && *str )
 | 
						if( *str )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		p = str;
 | 
							p = str;
 | 
				
			||||||
		while( isspace(*p) ) p++;
 | 
							while( isspace(*p) ) p++;
 | 
				
			||||||
@ -433,7 +438,7 @@ char *string_trimboth(char *str)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	ASSERT(str != NULL);
 | 
						ASSERT(str != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( str && *str )
 | 
						if( *str )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/* Remove leading spaces */
 | 
							/* Remove leading spaces */
 | 
				
			||||||
		p = str;
 | 
							p = str;
 | 
				
			||||||
@ -676,7 +681,7 @@ char *string_translate(const char *str, const char *find, const char *repl)
 | 
				
			|||||||
	size_t sz_find = strlen(find);
 | 
						size_t sz_find = strlen(find);
 | 
				
			||||||
	size_t sz_repl = strlen(repl);
 | 
						size_t sz_repl = strlen(repl);
 | 
				
			||||||
	size_t sz_dest = strlen(str);
 | 
						size_t sz_dest = strlen(str);
 | 
				
			||||||
	char *dest, *p;
 | 
						char *tmp, *dest, *p;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	p = dest = xstrcpy(str);
 | 
						p = dest = xstrcpy(str);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -689,9 +694,13 @@ char *string_translate(const char *str, const char *find, const char *repl)
 | 
				
			|||||||
			size_t offset = p - dest;
 | 
								size_t offset = p - dest;
 | 
				
			||||||
			size_t newsize = sz_dest + (sz_repl - sz_find);
 | 
								size_t newsize = sz_dest + (sz_repl - sz_find);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if( newsize > sz_dest )
 | 
								if( newsize > sz_dest ) {
 | 
				
			||||||
				dest = xrealloc(dest, newsize+1);
 | 
									tmp = xrealloc(dest, newsize+1);
 | 
				
			||||||
			
 | 
									if (!tmp) {
 | 
				
			||||||
 | 
										free(dest);
 | 
				
			||||||
 | 
										return NULL;
 | 
				
			||||||
 | 
									} else dest = tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			if( sz_repl > sz_find )
 | 
								if( sz_repl > sz_find )
 | 
				
			||||||
				memmove(dest + offset + (sz_repl - sz_find), dest + offset, sz_dest - offset + 1);
 | 
									memmove(dest + offset + (sz_repl - sz_find), dest + offset, sz_dest - offset + 1);
 | 
				
			||||||
			else if( sz_repl < sz_find )
 | 
								else if( sz_repl < sz_find )
 | 
				
			||||||
@ -842,6 +851,7 @@ char *string_concat(const char *str, ...)
 | 
				
			|||||||
	va_end(args);
 | 
						va_end(args);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	yield = xmalloc(yield_len + 1);
 | 
						yield = xmalloc(yield_len + 1);
 | 
				
			||||||
 | 
						if (yield) {
 | 
				
			||||||
		strncpy(yield, str, yield_len);
 | 
							strncpy(yield, str, yield_len);
 | 
				
			||||||
		yield[yield_len] = '\0';
 | 
							yield[yield_len] = '\0';
 | 
				
			||||||
		yield_ptr = yield + strlen(yield);
 | 
							yield_ptr = yield + strlen(yield);
 | 
				
			||||||
@ -853,7 +863,7 @@ char *string_concat(const char *str, ...)
 | 
				
			|||||||
			yield_ptr += strlen(p);
 | 
								yield_ptr += strlen(p);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		va_end(args);
 | 
							va_end(args);
 | 
				
			||||||
	
 | 
						}
 | 
				
			||||||
	return yield;
 | 
						return yield;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -469,7 +469,7 @@ int timevec_parse(s_timevec *dest, const char *str)
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	end_day = beg_day;
 | 
						end_day = beg_day;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( beg_day >= DAY_MONDAY && beg_day <= DAY_SUNDAY )
 | 
						if( beg_day <= DAY_SUNDAY )
 | 
				
			||||||
		str += 3;
 | 
							str += 3;
 | 
				
			||||||
	else if( beg_day == DAY_ANY )
 | 
						else if( beg_day == DAY_ANY )
 | 
				
			||||||
		str += 3;
 | 
							str += 3;
 | 
				
			||||||
 | 
				
			|||||||
@ -150,20 +150,14 @@ static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
 | 
				
			|||||||
				modepoint = false;
 | 
									modepoint = false;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case KEYWORD_REGION:
 | 
								case KEYWORD_REGION:
 | 
				
			||||||
 | 
								case KEYWORD_HOST: 		//-V1037
 | 
				
			||||||
				bni.net   = value;
 | 
									bni.net   = value;
 | 
				
			||||||
				bni.node  = 0;
 | 
									bni.node  = 0;
 | 
				
			||||||
				bni.point = 0;
 | 
									bni.point = 0;
 | 
				
			||||||
				bni.hub   = 0;
 | 
									bni.hub   = 0;
 | 
				
			||||||
				modepoint = false;
 | 
									modepoint = false;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case KEYWORD_HOST:
 | 
								case KEYWORD_HUB:		//-V1037
 | 
				
			||||||
				bni.net   = value;
 | 
					 | 
				
			||||||
				bni.node  = 0;
 | 
					 | 
				
			||||||
				bni.point = 0;
 | 
					 | 
				
			||||||
				bni.hub   = 0;
 | 
					 | 
				
			||||||
				modepoint = false;
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			case KEYWORD_HUB:
 | 
					 | 
				
			||||||
				bni.node  = value;
 | 
									bni.node  = value;
 | 
				
			||||||
				bni.point = 0;
 | 
									bni.point = 0;
 | 
				
			||||||
				bni.hub   = value;
 | 
									bni.hub   = value;
 | 
				
			||||||
 | 
				
			|||||||
@ -28,11 +28,13 @@ bool eventexpr(s_expr *expr)
 | 
				
			|||||||
static void usage(void)
 | 
					static void usage(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	printf_usage("nodelist lookup utility",
 | 
						printf_usage("nodelist lookup utility",
 | 
				
			||||||
		"usage: nlookup [-C config] [-rmh] <address>\n"
 | 
							"usage: nlookup [-C config] [-romh] <address>\n"
 | 
				
			||||||
		"\n"
 | 
							"\n"
 | 
				
			||||||
		"options:\n"
 | 
							"options:\n"
 | 
				
			||||||
		"  -r                show nodelist string\n"
 | 
							"  -r                show nodelist string\n"
 | 
				
			||||||
		"  -m                show email address\n"
 | 
							"  -m                show email address\n"
 | 
				
			||||||
 | 
							"  -o                show overrides\n"
 | 
				
			||||||
 | 
							"  -t                show calltable\n"
 | 
				
			||||||
		"  -h                show this help message\n"
 | 
							"  -h                show this help message\n"
 | 
				
			||||||
		"  -C config         use config file\n"
 | 
							"  -C config         use config file\n"
 | 
				
			||||||
		"\n"
 | 
							"\n"
 | 
				
			||||||
@ -43,7 +45,7 @@ void print_nodemail(const s_node *node)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	char abuf[BF_MAXADDRSTR+1];
 | 
						char abuf[BF_MAXADDRSTR+1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( node->sysop && *node->sysop && strcmp(node->sysop, "<none>") )
 | 
						if( *node->sysop && strcmp(node->sysop, "<none>") )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char username[BNI_MAXSYSOP+1];
 | 
							char username[BNI_MAXSYSOP+1];
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
@ -68,7 +70,7 @@ void print_nodeinfo(const s_node *node)
 | 
				
			|||||||
	printf("Phone     : %s\n", node->phone);
 | 
						printf("Phone     : %s\n", node->phone);
 | 
				
			||||||
	printf("Sysop     : %s\n", node->sysop);
 | 
						printf("Sysop     : %s\n", node->sysop);
 | 
				
			||||||
	printf("Location  : %s\n", node->location);
 | 
						printf("Location  : %s\n", node->location);
 | 
				
			||||||
	printf("Speed     : %lu\n", node->speed);
 | 
						printf("Speed     : %ld\n", node->speed);
 | 
				
			||||||
	printf("Flags     : %s\n", node->flags);
 | 
						printf("Flags     : %s\n", node->flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if( node->worktime.num )
 | 
						if( node->worktime.num )
 | 
				
			||||||
@ -83,7 +85,7 @@ void print_nodeinfo(const s_node *node)
 | 
				
			|||||||
			timevec_check(&node->worktime, now) ? "false" : "true");
 | 
								timevec_check(&node->worktime, now) ? "false" : "true");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if( (node->keyword != KEYWORD_POINT) && node->sysop && *node->sysop && strcmp(node->sysop, "<none>") )
 | 
						if( (node->keyword != KEYWORD_POINT) && *node->sysop && strcmp(node->sysop, "<none>") )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char username[BNI_MAXSYSOP+1];
 | 
							char username[BNI_MAXSYSOP+1];
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -123,22 +125,174 @@ void print_nodeinfo(const s_node *node)
 | 
				
			|||||||
	fflush(stdout);
 | 
						fflush(stdout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_overrides(const s_override *override_info) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						s_override *p;
 | 
				
			||||||
 | 
						char abuf[BF_MAXADDRSTR+1];
 | 
				
			||||||
 | 
						int lin = 0;
 | 
				
			||||||
 | 
						printf("----------- Overrides ------------\n");
 | 
				
			||||||
 | 
						printf("Address   : %s\n", ftn_addrstr(abuf, override_info->addr));
 | 
				
			||||||
 | 
						printf("IpAddr    : %s\n", override_info->sIpaddr);
 | 
				
			||||||
 | 
						printf("Phone     : %s\n", override_info->sPhone);
 | 
				
			||||||
 | 
						printf("Flags     : %s\n", override_info->sFlags);
 | 
				
			||||||
 | 
						printf("Run before: %s\n", override_info->run);
 | 
				
			||||||
 | 
						p = override_info->hidden;
 | 
				
			||||||
 | 
						if (p) {
 | 
				
			||||||
 | 
							printf("Hidden lines:\n");
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							while( p )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								printf("  %5d: ",++lin);
 | 
				
			||||||
 | 
								if (p->sIpaddr) printf("IpAddr: %s, ", p->sIpaddr);
 | 
				
			||||||
 | 
								if (p->sPhone) printf("Phone: %s", p->sPhone);
 | 
				
			||||||
 | 
								if (p->sFlags) printf("Flags: %s", p->sFlags);
 | 
				
			||||||
 | 
								printf("\n");
 | 
				
			||||||
 | 
								p = p->hidden;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool check_phone(const char *str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( !str || !str[0] )
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( str[0] == '-' && str[1] == '\0' )
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( string_casestr(str, "unpublished") )
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( string_casestr(str, "unknown") )
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( string_casestr(str, "none") )
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( string_casestr(str, "00-00-000000") )
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_calltable(s_faddr addr){
 | 
				
			||||||
 | 
						s_node nnode;
 | 
				
			||||||
 | 
						s_override *ovr, *tmpovr;
 | 
				
			||||||
 | 
						char *tmphost, *tmpphone;
 | 
				
			||||||
 | 
						int rc,ln = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if( nodelist_lookup(&nnode, addr) == 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// we got nodelist string
 | 
				
			||||||
 | 
							ovr = conf_override(cf_override, addr);
 | 
				
			||||||
 | 
							// be aware - ovr may not be, but second INA may 
 | 
				
			||||||
 | 
							if (ovr) {
 | 
				
			||||||
 | 
								ovr->addr = addr;
 | 
				
			||||||
 | 
								if (ovr->sIpaddr) strcpy (nnode.host, ovr->sIpaddr);
 | 
				
			||||||
 | 
								if (ovr->sPhone) strcpy (nnode.phone, ovr->sPhone);
 | 
				
			||||||
 | 
								if (ovr->sFlags) strcpy (nnode.flags, ovr->sFlags);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ovr = xmalloc(sizeof(s_override));
 | 
				
			||||||
 | 
								memset(ovr,'\0',sizeof(s_override));
 | 
				
			||||||
 | 
								ovr->addr=addr;
 | 
				
			||||||
 | 
								ovr->hidden=NULL;
 | 
				
			||||||
 | 
								ovr->sIpaddr=NULL;
 | 
				
			||||||
 | 
							}  
 | 
				
			||||||
 | 
							rc = nodelist_parsehiddenina(&nnode, ovr);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// we have no nodelist string - only overrides
 | 
				
			||||||
 | 
							ovr = conf_override(cf_override, addr);
 | 
				
			||||||
 | 
							if (ovr) {
 | 
				
			||||||
 | 
								ovr->addr = addr;
 | 
				
			||||||
 | 
								if (ovr->sIpaddr) strcpy (nnode.host, ovr->sIpaddr);
 | 
				
			||||||
 | 
								if (ovr->sPhone) strcpy (nnode.phone, ovr->sPhone);
 | 
				
			||||||
 | 
								if (ovr->sFlags) strcpy (nnode.flags, ovr->sFlags);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Let's print this table
 | 
				
			||||||
 | 
						// begin with HOST itself
 | 
				
			||||||
 | 
						ln = 0;
 | 
				
			||||||
 | 
						if (nnode.host[0]) {
 | 
				
			||||||
 | 
							tmphost = nnode.host;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!nodelist_checkflag(nnode.flags, "IBN")) {
 | 
				
			||||||
 | 
							ln +=1;
 | 
				
			||||||
 | 
							printf ("%5d. %s:binkp\n", ln, tmphost);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!nodelist_checkflag(nnode.flags, "IFC")) {
 | 
				
			||||||
 | 
							ln +=1;
 | 
				
			||||||
 | 
							printf ("%5d. %s:ifcico\n", ln, tmphost);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!nodelist_checkflag(nnode.flags, "ITN")) {
 | 
				
			||||||
 | 
							ln +=1;
 | 
				
			||||||
 | 
							printf ("%5d. %s:telnet\n", ln, tmphost);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (ovr->hidden) {
 | 
				
			||||||
 | 
							tmpovr = ovr;
 | 
				
			||||||
 | 
							while (ovr->hidden != NULL) {
 | 
				
			||||||
 | 
								ovr = ovr->hidden;
 | 
				
			||||||
 | 
								if (ovr->sIpaddr) {
 | 
				
			||||||
 | 
									tmphost = ovr->sIpaddr;
 | 
				
			||||||
 | 
									if (!nodelist_checkflag(nnode.flags, "IBN")) {
 | 
				
			||||||
 | 
										ln +=1;
 | 
				
			||||||
 | 
										printf ("%5d. %s:binkp\n", ln, tmphost);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (!nodelist_checkflag(nnode.flags, "IFC")) {
 | 
				
			||||||
 | 
										ln +=1;
 | 
				
			||||||
 | 
										printf ("%5d. %s:ifcico\n", ln, tmphost);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (!nodelist_checkflag(nnode.flags, "ITN")) {
 | 
				
			||||||
 | 
										ln +=1;
 | 
				
			||||||
 | 
										printf ("%5d. %s:telnet\n", ln, tmphost);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}	
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ovr = tmpovr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Calltable for pstn
 | 
				
			||||||
 | 
						if (nnode.phone[0] && check_phone(nnode.phone) ) {
 | 
				
			||||||
 | 
							tmpphone = nnode.phone;
 | 
				
			||||||
 | 
							ln +=1;
 | 
				
			||||||
 | 
							printf ("%5d. PSTN %s\n", ln, tmpphone);
 | 
				
			||||||
 | 
							if (ovr->hidden) {
 | 
				
			||||||
 | 
								tmpovr = ovr;
 | 
				
			||||||
 | 
								while (ovr->hidden != NULL) {
 | 
				
			||||||
 | 
									ovr = ovr->hidden;
 | 
				
			||||||
 | 
									if (ovr->sPhone && check_phone(ovr->sPhone)) {
 | 
				
			||||||
 | 
										tmpphone = ovr->sPhone;
 | 
				
			||||||
 | 
										ln +=1;
 | 
				
			||||||
 | 
										printf ("%5d. PSTN %s\n", ln, tmpphone);
 | 
				
			||||||
 | 
									}	
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ovr = tmpovr;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// free ovr elements
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	s_node node;
 | 
						s_node node;
 | 
				
			||||||
	s_faddr addr;
 | 
						s_faddr addr;
 | 
				
			||||||
 | 
						s_override *ovr;
 | 
				
			||||||
	char ch;
 | 
						char ch;
 | 
				
			||||||
	int rc = 0;
 | 
						int rc = 0;
 | 
				
			||||||
	char *confname = NULL;
 | 
						char *confname = NULL;
 | 
				
			||||||
	bool rawstring = FALSE;
 | 
						bool rawstring = FALSE;
 | 
				
			||||||
	bool emailaddr = FALSE;
 | 
						bool emailaddr = FALSE;
 | 
				
			||||||
 | 
						bool overrides = FALSE;
 | 
				
			||||||
 | 
						bool calltable = FALSE;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* Initialise random number generation */
 | 
						/* Initialise random number generation */
 | 
				
			||||||
	(void)srand((unsigned)time(0));
 | 
						(void)srand((unsigned)time(0));
 | 
				
			||||||
	/* Initialise current locale */
 | 
						/* Initialise current locale */
 | 
				
			||||||
	(void)setlocale(LC_ALL, "");
 | 
						(void)setlocale(LC_ALL, "");
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	while( (ch=getopt(argc, argv, "hdrmC:")) != (char)-1 )
 | 
						while( (ch=getopt(argc, argv, "hdrtmoC:")) != (char)-1 )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		switch( ch ) {
 | 
							switch( ch ) {
 | 
				
			||||||
		case 'h':
 | 
							case 'h':
 | 
				
			||||||
@ -150,6 +304,12 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
		case 'm':
 | 
							case 'm':
 | 
				
			||||||
			emailaddr = TRUE;
 | 
								emailaddr = TRUE;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case 't':
 | 
				
			||||||
 | 
								calltable = TRUE;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'o':
 | 
				
			||||||
 | 
								overrides = TRUE;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case 'C':
 | 
							case 'C':
 | 
				
			||||||
			if( confname || !optarg ) { usage(); exit(BFERR_FATALERROR); }
 | 
								if( confname || !optarg ) { usage(); exit(BFERR_FATALERROR); }
 | 
				
			||||||
			confname = (char *)xstrcpy(optarg);
 | 
								confname = (char *)xstrcpy(optarg);
 | 
				
			||||||
@ -188,6 +348,9 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	else if( nodelist_lookup(&node, addr) == 0 )
 | 
						else if( nodelist_lookup(&node, addr) == 0 )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
						    // Overrides
 | 
				
			||||||
 | 
						    ovr = conf_override(cf_override, addr);
 | 
				
			||||||
 | 
						    
 | 
				
			||||||
	    if (addr.point == 0) {
 | 
						    if (addr.point == 0) {
 | 
				
			||||||
			if( emailaddr )
 | 
								if( emailaddr )
 | 
				
			||||||
				print_nodemail(&node);
 | 
									print_nodemail(&node);
 | 
				
			||||||
@ -198,6 +361,25 @@ int main(int argc, char *argv[])
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			print_nodeinfo(&node);
 | 
								print_nodeinfo(&node);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (overrides && ovr) {
 | 
				
			||||||
 | 
								print_overrides(ovr);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (calltable) {
 | 
				
			||||||
 | 
								printf ("----------- Calltable ------------\n");
 | 
				
			||||||
 | 
								print_calltable(addr);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if (overrides) {
 | 
				
			||||||
 | 
								ovr = conf_override(cf_override, addr);
 | 
				
			||||||
 | 
								if (ovr) {
 | 
				
			||||||
 | 
									printf ("-------- No nodelist info --------");
 | 
				
			||||||
 | 
									print_overrides(ovr);
 | 
				
			||||||
 | 
									if (calltable) {
 | 
				
			||||||
 | 
										printf ("----- Calltable-on-overrides -----\n");
 | 
				
			||||||
 | 
										print_calltable(addr);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	deinit_conf();
 | 
						deinit_conf();
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ dnl
 | 
				
			|||||||
dnl $Id$
 | 
					dnl $Id$
 | 
				
			||||||
dnl
 | 
					dnl
 | 
				
			||||||
#AC_INIT(bforce/bforce.c)
 | 
					#AC_INIT(bforce/bforce.c)
 | 
				
			||||||
AC_INIT([bforce],[0.26.2],[zx@zxalexis.ru])
 | 
					AC_INIT([bforce],[0.27],[zx@zxalexis.ru])
 | 
				
			||||||
AC_CONFIG_HEADER(include/config.h)
 | 
					AC_CONFIG_HEADER(include/config.h)
 | 
				
			||||||
AC_CANONICAL_SYSTEM
 | 
					AC_CANONICAL_SYSTEM
 | 
				
			||||||
dnl # Minimum Autoconf version required.
 | 
					dnl # Minimum Autoconf version required.
 | 
				
			||||||
 | 
				
			|||||||
@ -137,6 +137,18 @@ typedef struct bni
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
s_bni;
 | 
					s_bni;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct pbline
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool inet;
 | 
				
			||||||
 | 
						bool prot_binkp;
 | 
				
			||||||
 | 
						bool prot_cico;
 | 
				
			||||||
 | 
						char *phone;
 | 
				
			||||||
 | 
						char *ina;
 | 
				
			||||||
 | 
						int  port;
 | 
				
			||||||
 | 
						struct pbline *nextline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					s_pbline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct node
 | 
					typedef struct node
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	s_faddr addr;
 | 
						s_faddr addr;
 | 
				
			||||||
@ -154,6 +166,7 @@ typedef struct node
 | 
				
			|||||||
	bool do_telnet;
 | 
						bool do_telnet;
 | 
				
			||||||
	char host[BNI_MAXHOST+1];
 | 
						char host[BNI_MAXHOST+1];
 | 
				
			||||||
	s_timevec worktime;
 | 
						s_timevec worktime;
 | 
				
			||||||
 | 
						s_pbline phbook;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
s_node;
 | 
					s_node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -171,7 +184,7 @@ int   nodelist_getstr(s_nodelist *nlp, size_t offset, char *buffer, size_t bufle
 | 
				
			|||||||
int   nodelist_lookup_string(char *buffer, size_t buflen, s_faddr addr);
 | 
					int   nodelist_lookup_string(char *buffer, size_t buflen, s_faddr addr);
 | 
				
			||||||
int   nodelist_lookup(s_node *node, s_faddr addr);
 | 
					int   nodelist_lookup(s_node *node, s_faddr addr);
 | 
				
			||||||
void  nodelist_initnode(s_node *node, s_faddr addr);
 | 
					void  nodelist_initnode(s_node *node, s_faddr addr);
 | 
				
			||||||
 | 
					int   nodelist_parsehiddenina(s_node *node, s_override *ov);
 | 
				
			||||||
 | 
					int   nodelist_flagvalue(const char *nodeflags, const char *flag, char *res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _NODELIST_H_ */
 | 
					#endif /* _NODELIST_H_ */
 | 
				
			||||||
 | 
				
			|||||||
@ -56,17 +56,17 @@ function testcomm() {
 | 
				
			|||||||
	# Variant 3 works with sockets and pipes - not pty
 | 
						# Variant 3 works with sockets and pipes - not pty
 | 
				
			||||||
	case ${1} in
 | 
						case ${1} in
 | 
				
			||||||
	    "PSTN")
 | 
						    "PSTN")
 | 
				
			||||||
	        socat -ly -Wlock EXEC:"${CURDIR}/runbfB.sh ${BFBIN} ${BFCFGB}" EXEC:"${CURDIR}/runbfA.sh ${BFBIN} ${BFCFGA}"
 | 
						        socat -T5 -ly -Wlock EXEC:"${CURDIR}/runbfB.sh ${BFBIN} ${BFCFGB}" EXEC:"${CURDIR}/runbfA.sh ${BFBIN} ${BFCFGA}"
 | 
				
			||||||
	        sleep 2
 | 
						        sleep 2
 | 
				
			||||||
	        ;;
 | 
						        ;;
 | 
				
			||||||
	    "IFC")
 | 
						    "IFC")
 | 
				
			||||||
	        ${CURDIR}/runbfC.sh ${BFBIN} ${BFCFGA} &
 | 
						        ${CURDIR}/runbfC.sh ${BFBIN} ${BFCFGA} &
 | 
				
			||||||
	        socat -ly -Wlock TCP4-LISTEN:59999 EXEC:"${CURDIR}/runbfD.sh ${BFBIN} ${BFCFGB}" 
 | 
						        socat -ly -Wlock TCP4-LISTEN:59999,accept-timeout=3 EXEC:"${CURDIR}/runbfD.sh ${BFBIN} ${BFCFGB}" 
 | 
				
			||||||
	        sleep 2
 | 
						        sleep 2
 | 
				
			||||||
	        ;;
 | 
						        ;;
 | 
				
			||||||
	    "BKP")
 | 
						    "BKP")
 | 
				
			||||||
	        ${CURDIR}/runbfE.sh ${BFBIN} ${BFCFGA} &
 | 
						        ${CURDIR}/runbfE.sh ${BFBIN} ${BFCFGA} &
 | 
				
			||||||
	        socat -ly -Wlock TCP4-LISTEN:59999 EXEC:"${CURDIR}/runbfF.sh ${BFBIN} ${BFCFGB}"
 | 
						        socat -ly -Wlock TCP4-LISTEN:59999,accept-timeout=3 EXEC:"${CURDIR}/runbfF.sh ${BFBIN} ${BFCFGB}"
 | 
				
			||||||
	        sleep 2
 | 
						        sleep 2
 | 
				
			||||||
	        ;;
 | 
						        ;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user