You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bforce/source/bfutil/bfindex.c

288 lines
5.4 KiB
C

/*
* binkleyforce -- unix FTN mailer project
*
* Copyright (c) 1998-2000 Alexander Belkin, 2:5020/1398.11
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* $Id$
*/
#include "includes.h"
#include "confread.h"
#include "version.h"
#include "logger.h"
#include "util.h"
#include "nodelist.h"
/*
* Our fake expressions checker. Allways return FALSE (?)
*/
bool eventexpr(s_expr *expr)
{
return FALSE;
}
static void usage(void)
{
printf_usage("nodelist compiler",
"usage: bfindex [-fh]\n"
"\n"
"options:\n"
" -f force nodelist compiling\n"
" -h show this help message\n"
"\n"
);
}
static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr)
{
s_bni bni;
char buf[1024];
long countnodes = 0L;
long countlines = 0L;
enum nodelist_keyword keyword;
memset(&bni, 0, sizeof(s_bni));
bni.zone = addr.zone;
bni.net = addr.net;
bni.node = addr.node;
bni.point = addr.point;
if( nodelist_createheader(nlp) == -1 )
{
log("cannot create nodelist index header");
return -1;
}
while(1)
{
char *p, *q;
if( (bni.offset = ftell(nlp->fp_nodelist)) == -1 )
{
logerr("ftell() return -1 for nodelist");
return -1;
}
if( fgets(buf, sizeof(buf), nlp->fp_nodelist) == NULL )
{
return countnodes;
}
string_chomp(buf);
++countlines;
if( buf[0] == ';' || buf[0] == '\0' ) continue;
if( (p = strchr(buf, ',')) )
{
*p++ = '\0';
if( (q = strchr(p, ',')) ) *q = '\0';
}
if( p == NULL || *p == '\0' )
{
log("incorrect nodelist line %ld: Short line", countlines);
continue;
}
if( (keyword = nodelist_keywordval(buf)) == -1 )
{
log("incorrect nodelist line %d: Bad keyword \"%s\"",
countlines, buf);
continue;
}
if( keyword == KEYWORD_BOSS )
{
s_faddr tmpaddr;
if( ftn_addrparse(&tmpaddr, p, FALSE) )
{
log("incorrect nodelist line %ld: Bad boss address \"%s\"",
countlines, p);
}
else
{
bni.zone = tmpaddr.zone;
bni.net = tmpaddr.net;
bni.node = tmpaddr.node;
bni.point = 0;
bni.hub = 0;
}
}
else if( ISDEC(p) )
{
int value = atoi(p);
if( value > 0x7fff )
value = 0x7fff;
else if( value < 0 )
value = 0;
switch(keyword) {
case KEYWORD_ZONE:
bni.zone = value;
bni.net = 0;
bni.node = 0;
bni.point = 0;
bni.hub = 0;
break;
case KEYWORD_REGION:
bni.net = value;
bni.node = 0;
bni.point = 0;
bni.hub = 0;
break;
case KEYWORD_HOST:
bni.net = value;
bni.node = 0;
bni.point = 0;
bni.hub = 0;
break;
case KEYWORD_HUB:
bni.node = value;
bni.point = 0;
bni.hub = value;
break;
case KEYWORD_EMPTY:
case KEYWORD_PVT:
case KEYWORD_HOLD:
case KEYWORD_DOWN:
bni.node = value;
bni.point = 0;
break;
case KEYWORD_POINT:
bni.point = value;
break;
default:
ASSERT_MSG();
}
if( nodelist_putindex(nlp, &bni) == -1 )
return -1;
++countnodes;
}
else
{
log("incorrect nodelist line %ld: Bad number \"%s\"",
countlines, p);
}
}
return -1;
}
int main(int argc, char *argv[])
{
s_cval_entry *cfptr;
char *nodelistdir = NULL;
time_t starttime = 0L;
bool forcecompile = FALSE;
long countnodes = 0L;
char c;
/* Initialise random number generation */
(void)srand((unsigned)time(0));
/* Initialise current locale */
(void)setlocale(LC_ALL, "");
/* Set our name (for logging only) */
while( (c = getopt(argc, argv, "hf")) != (char)-1 )
{
switch( c ) {
case 'f':
forcecompile = TRUE;
break;
case 'h':
usage();
exit(0);
default:
usage();
exit(5);
}
}
if( conf_readconf(conf_getconfname(), 0, false) )
{
exit(1);
}
if( log_open(log_getfilename(LOG_FILE_SESSION), NULL, NULL) )
{
log("can't continue without logging");
exit(2);
}
/* Ignore some terminating signals */
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
time(&starttime);
nodelistdir = conf_string(cf_nodelist_directory);
for( cfptr = conf_first(cf_nodelist); cfptr; cfptr = conf_next(cfptr) )
{
s_nodelist *nlp = NULL;
bool willcompile = FALSE;
if( forcecompile )
{
willcompile = TRUE;
}
else if( (nlp = nodelist_open(nodelistdir,
cfptr->d.falist.what,
NODELIST_READ)) == NULL )
{
willcompile = TRUE;
}
else
{
nodelist_close(nlp); nlp = NULL;
willcompile = FALSE;
}
if( willcompile )
{
log("rebuilding index for nodelist \"%s\"", cfptr->d.falist.what);
if( (nlp = nodelist_open(nodelistdir, cfptr->d.falist.what,
NODELIST_WRITE)) )
{
long rc = nodelist_makeindex(nlp, cfptr->d.falist.addr);
nodelist_close(nlp); nlp = NULL;
if( rc > 0 ) countnodes += rc;
}
}
else
log("nodelist \"%s\" is up to date", cfptr->d.falist.what);
}
if( countnodes > 0 )
{
long ptime = (long)time(NULL) - (long)starttime;
long nps = (ptime > 0) ? countnodes / ptime : countnodes;
log("processed %ld nodes in %ld second(s) (%ld node/sec)",
countnodes, ptime, nps);
}
deinit_conf();
/*
* Shutdown logging services
*/
if( log_isopened() ) log_close();
#ifdef DEBUG
if( debug_isopened() ) debug_close();
#endif
exit(0);
}