Compare commits
	
		
			12 Commits
		
	
	
		
			22fa90589b
			...
			1eacadd453
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1eacadd453 | |||
| e94fcfc054 | |||
| 6bcd460e15 | |||
| 0999c65b1a | |||
| 72f46f357d | |||
| 162a22f0a4 | |||
| 81b326ca45 | |||
| 7903fd08af | |||
| a2479e18f0 | |||
| 4c796b042c | |||
| 64cfc794dc | |||
| c5dc00c084 | 
							
								
								
									
										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