/* * This part was written by Harald Kipp * * Bug reports should be sent to * * harald@os2point.ping.de * harald@sesam.com * Fido: 2:2448/434 * * This module contains routines to read the configuration file. * */ #include #include #include #include #include #include #include #include #include #include "config.h" #include "expire.h" long arts_deleted = 0; long arts_kept = 0; long bytes_deleted = 0; long bytes_kept = 0; long ids_deleted = 0; long ids_kept = 0; static CFGITEM cfgitm[] = { { "access" , 0, 4, NULL }, { "actimes" , 0, 4, NULL }, { "active" , 0, 4, cfg.activefile }, { "control" , 0, 4, NULL }, { "dupegroup" , 0, 4, NULL }, { "gunzip" , 0, 4, NULL }, { "history" , 0, 4, cfg.historyfile }, { "inews" , 0, 4, NULL }, { "junkgroup" , 0, 4, NULL }, { "mydomain" , 0, 4, NULL }, { "mynode" , 0, 4, NULL }, { "newsdir" , 0, 4, cfg.newsdir }, { "newsserver", 0, 4, NULL }, { "rnews" , 0, 4, NULL }, { "spooldir" , 0, 4, NULL }, { "uncompress", 0, 4, NULL } }; static void usage(void); /************************************************************************/ /* */ /* EXPIRE */ /* */ /************************************************************************/ int main(int argc, char **argv) { int result = 0; int option; char *cp; time_t t_proc = time(NULL); time_t expire_time = time(NULL); /* * Set up initial configuration */ init_cfg(); /* * Initialize exit proc */ initexit(); /* * Open log file */ lopen(cfg.logfile); lprintf("Expire %s - %s", version, __TIMESTAMP__); /* * Process command line options */ while((option = getopt(argc, argv, "?hiIra:c:d:e:E:n:y:")) != EOF) { switch(option) { case 'a': strcpy(cfg.activefile, optarg); break; case 'c': strcpy(cfg.configfile, optarg); break; case 'd': cp = optarg; while(*cp) { switch(*cp) { case 'e': cfg.logflg |= LOG_EXPIRE; break; case 'f': cfg.logflg |= LOG_FLUSH; lflush(1); break; case 't': cfg.logflg |= LOG_TESTMODE; printf("- Testmode -\n"); break; default: lprintf("Unknown option -d%c ignored", *cp); break; } cp++; } break; case 'e': cfg.expiredays = atoi(optarg); break; case 'E': cfg.forgetdays = atoi(optarg); break; case 'h': /* ignore history */ cfg.nohistory = 1; break; case 'I': /* Ignore any existing expiration date */ cfg.ignorexp = 2; break; case 'i': /* Ignore any existing expiration date */ cfg.ignorexp = 1; break; case 'n': strcpy(cfg.newsdir, optarg); break; case 'r': /* rebuild history file */ cfg.dorebuild = 1; cfg.nohistory = 1; break; case 'y': strcpy(cfg.historyfile, optarg); break; default: lprintf("Unknown option -%c", option); printf("Unknown option -%c\n", option); case '?': usage(); return(1); } } /* * All command line options are processed, check if one * argument is left to give us a list of newsgroups. */ argc -= optind; argv += optind; if(argc) strcpy(cfg.groups, argv[0]); ReadCfg(cfg.configfile, cfgitm, sizeof(cfgitm) / sizeof(CFGITEM)); if(validate_cfg()) { lprintf("Purging %s received before %.*s GMT", *(cfg.groups) ? cfg.groups : "all", strlen(ctime(&cfg.expiretime)) - 1, ctime(&cfg.expiretime)); if(cfg.expiretime > cfg.forgettime) lprintf("Remember articles received before %.*s GMT", strlen(ctime(&cfg.forgettime)) - 1, ctime(&cfg.forgettime)); if(cfg.nohistory) { if(PurgeByActive() || DOLOG(LOG_TESTMODE) || cfg.dorebuild) UpdateActive(); } else if(PurgeByHistory() || DOLOG(LOG_TESTMODE) || cfg.dorebuild) UpdateActive(); } else result = 3; if(result) lprintf("Expire returned error %d", result); else { t_proc = time(NULL) - t_proc; lprintf("Articles deleted: %10lu", arts_deleted); lprintf("Articles kept : %10lu", arts_kept); lprintf("Bytes deleted : %10lu", bytes_deleted); lprintf("Bytes kept : %10lu", bytes_kept); lprintf("Ids deleted : %10lu", ids_deleted); lprintf("Ids kept : %10lu", ids_kept); lprintf("Expire processed %lu ids in %lu second(s)", ids_deleted + ids_kept, t_proc); } lclose(); return(result); } /************************************************************************/ /* */ /************************************************************************/ static void usage(void) { puts("usage: expire [options] [newsgroups]\n\n" " newsgroups is a comma separated list of groups, which may\n" " include '!', '*', '?' and '[...]'\n\n" "options:\n" " -a active file -h ignore history\n" " -c configuration file -i ignore expire lines\n" " -e expire time -r rebuild\n" " -E forget time\n" " -n news directory\n" " -y history filename\n\n" "logfile flags:\n" " e log expiration progress\n" " f flush logfile after each line\n" " t test mode, do not really expire"); lprintf("Expire usage displayed"); lclose(); }