Added calllist option to nlookup, fixed bunch of PVS-Studio lint warnings
All checks were successful
Altlinux build / build-alt (push) Successful in 2m34s
Archlinux build / build-arch (push) Successful in 2m55s
Archlinux build / make-test (push) Successful in 1m0s
Debian build / build-ubuntu (push) Successful in 3m43s

This commit is contained in:
Alexey Khromov 2025-04-26 07:56:48 +03:00
parent 7903fd08af
commit 81b326ca45
13 changed files with 235 additions and 28 deletions

View File

@ -354,6 +354,77 @@ 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
strncpy(tmp, p,'\0');
}
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';
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
* *

View File

@ -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);
} }

View File

@ -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;

View File

@ -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);

View File

@ -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;
} }

View File

@ -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);

View File

@ -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
} }
/***************************************************************************** /*****************************************************************************

View File

@ -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;
} }

View File

@ -216,7 +216,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 +383,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 +407,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 +433,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;

View File

@ -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;

View File

@ -150,14 +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: 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_HUB: case KEYWORD_HUB: //-V1037
bni.node = value; bni.node = value;
bni.point = 0; bni.point = 0;
bni.hub = value; bni.hub = value;

View File

@ -34,6 +34,7 @@ static void usage(void)
" -r show nodelist string\n" " -r show nodelist string\n"
" -m show email address\n" " -m show email address\n"
" -o show overrides\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"
@ -44,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];
@ -84,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];
@ -138,16 +139,141 @@ void print_overrides(const s_override *override_info)
p = override_info->hidden; p = override_info->hidden;
if (p) { if (p) {
printf("Hidden lines:\n"); printf("Hidden lines:\n");
while( p ) while( p )
{ {
printf(" Hidden IpAddr : %s\n", p->sIpaddr); printf(" %5d: ",++lin);
printf(" Hidden Phone : %s\n", p->sPhone); if (p->sIpaddr) printf("IpAddr: %s, ", p->sIpaddr);
printf(" Hidden Flags : %s\n", p->sFlags); if (p->sPhone) printf("Phone: %s", p->sPhone);
if (p->sFlags) printf("Flags: %s", p->sFlags);
printf("\n");
p = p->hidden; 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) {
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 && 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;
@ -159,13 +285,14 @@ int main(int argc, char *argv[])
bool rawstring = FALSE; bool rawstring = FALSE;
bool emailaddr = FALSE; bool emailaddr = FALSE;
bool overrides = 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, "hdrmoC:")) != (char)-1 ) while( (ch=getopt(argc, argv, "hdrtmoC:")) != (char)-1 )
{ {
switch( ch ) { switch( ch ) {
case 'h': case 'h':
@ -177,6 +304,9 @@ int main(int argc, char *argv[])
case 'm': case 'm':
emailaddr = TRUE; emailaddr = TRUE;
break; break;
case 't':
calltable = TRUE;
break;
case 'o': case 'o':
overrides = TRUE; overrides = TRUE;
break; break;
@ -234,12 +364,20 @@ int main(int argc, char *argv[])
if (overrides && ovr) { if (overrides && ovr) {
print_overrides(ovr); print_overrides(ovr);
} }
if (calltable) {
printf ("----------- Calltable ------------\n");
print_calltable(addr);
}
} else { } else {
if (overrides) { if (overrides) {
ovr = conf_override(cf_override, addr); ovr = conf_override(cf_override, addr);
if (ovr) { if (ovr) {
printf ("-- No nodelist info, only overrides --"); printf ("-------- No nodelist info --------");
print_overrides(ovr); print_overrides(ovr);
if (calltable) {
printf ("----- Calltable-on-overrides -----\n");
print_calltable(addr);
}
} }
} }
} }

View File

@ -184,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);
#endif /* _NODELIST_H_ */ #endif /* _NODELIST_H_ */