/*
* 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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <version.h>
#include <lprintf.h>
#include <getopt.h>
#include <chanlib.h>
#include <readcfg.h>
#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<filename> active file -h ignore history\n"
" -c<filename> configuration file -i ignore expire lines\n"
" -e<days> expire time -r rebuild\n"
" -E<days> forget time\n"
" -n<directory> news directory\n"
" -y<filename> 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();
}