/* * 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] [-C config]\n" "\n" "options:\n" " -f force nodelist compiling\n" " -h show this help message\n" " -C config use config\n" "\n" ); } static int nodelist_makeindex(s_nodelist *nlp, s_faddr addr) { s_bni bni; char buf[1024]; bool modepoint = FALSE; 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; DEB((D_INDEX, "Start create index for addr: %u:%u/%u.%u", bni.zone, bni.net, bni.node, bni.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, ',')) ) { //DEB((D_INDEX, "index: parse comma: %s", p )); *p++ = '\0'; if( (q = strchr(p, ',')) ) *q = '\0'; } if( p == NULL || *p == '\0' ) { log("incorrect nodelist line %ld: Short line", countlines); DEB((D_INDEX,"incorrect nodelist line %ld: Short line", countlines)); continue; } if( (keyword = nodelist_keywordval(buf)) == -1 ) { log("incorrect nodelist line %d: Bad keyword \"%s\"", countlines, buf); DEB((D_INDEX,"incorrect nodelist line %d: Bad keyword \"%s\"", countlines, buf)); continue; } //DEB((D_INDEX,"index: keyword=%d", keyword)); if( keyword == KEYWORD_BOSS ) { s_faddr tmpaddr; if( ftn_addrparse(&tmpaddr, p, FALSE) ) { DEB((D_INDEX,"incorrect nodelist line %ld: Bad boss address \"%s\"", countlines, p)); log("incorrect nodelist line %ld: Bad boss address \"%s\"", countlines, p); } else { DEB((D_INDEX,"index: parsing Boss %u:%u/%u.0", tmpaddr.zone, tmpaddr.net, tmpaddr.node)); if (addr.point == -1 ) modepoint = true; 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 = value; // zxalexis bni.node = 0; bni.point = 0; bni.hub = 0; modepoint = false; break; case KEYWORD_REGION: bni.net = value; bni.node = 0; bni.point = 0; bni.hub = 0; modepoint = false; break; case KEYWORD_HOST: bni.net = value; bni.node = 0; bni.point = 0; bni.hub = 0; modepoint = false; break; case KEYWORD_HUB: bni.node = value; bni.point = 0; bni.hub = value; modepoint = false; break; case KEYWORD_EMPTY: if (modepoint) { //DEB((D_INDEX,"found empty value=%u",value )); bni.point = value; break; } case KEYWORD_PVT: case KEYWORD_HOLD: case KEYWORD_DOWN: bni.node = value; bni.point = 0; modepoint = false; break; case KEYWORD_POINT: DEB((D_INDEX,"index: kw point")); bni.point = value; break; default: ASSERT_MSG(); DEB((D_INDEX,"index: default assert")); } 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; char *confname = NULL; time_t starttime = 0L; bool forcecompile = FALSE; long countnodes = 0L; char c; int rc = 0; /* 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, "hfC:")) != (char)-1 ) { switch( c ) { case 'f': forcecompile = TRUE; break; case 'h': usage(); exit(0); case 'C': if( confname || !optarg ) { usage(); exit(5); } confname = (char *)xstrcpy(optarg); break; default: usage(); exit(5); } } if( confname && *confname ) rc = conf_readconf(confname, 0, false); else rc = conf_readconf(conf_getconfname(), 0, false); if( rc ) { log("Can not find config"); 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); }