/* * This program was hacked by Harald Kipp using a source * written by Eric S. Raymond. * * Bug reports related to THIS modified version should be sent to * * harald@os2point.ping.de * harald@haport.sesam.com * Fido: 2:2448/434 * * You may freely copy or redistribute this software. However, * this may not apply to any part of it, if otherwise noted. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "chanco.h" static CFGITEM cfgitm[] = { { "access" , 0, 4, NULL }, { "actimes" , 0, 4, cfg.active_times }, { "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 } }; typedef struct { char *type; void (*exec)(int, char **); } method_t; static method_t methods[] = { /* name vector to */ {"cancel", c_cancel}, {"checkgroups", c_checkgroups}, {"newgroup", c_newgroup}, {"rmgroup", c_rmgroup} }; #define NMETHODS (sizeof(methods) / sizeof(methods[0])) static void usage(void); /************************************************************************/ /* */ /* CHANCO */ /* */ /* This program handles incoming control messages. */ /* */ /************************************************************************/ int main(int argc, char **argv) { int result = 0; FILE *fp; char *cp; int option; time_t t_proc = time(NULL); init_cfg(); initexit(); lopen(cfg.logfile); lprintf("Chanco %s - %s", version, __TIMESTAMP__); /* * Process command line options */ while((option = getopt(argc, argv, "?a:c:d:f: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 'a': cfg.logflg |= LOG_ACTIVE; break; case 'h': cfg.logflg |= LOG_HISTORY; break; case 'f': cfg.logflg |= LOG_FLUSH; lflush(1); break; default: lprintf("Unknown option -d%c ignored", *cp); break; } cp++; } break; case 'f': strcpy(cfg.newsfile, optarg); break; case 'n': strcpy(cfg.newsdir, optarg); break; case 'y': strcpy(cfg.historyfile, optarg); break; default: case '?': lprintf("Unknown option -%c", option); usage(); return(2); } } /* * All command line options are processed, check if one * argument is left to give us an article file name. */ argc -= optind; argv += optind; if(!argc) { lprintf("Missing command, returning error %d", 2); lclose(); return(2); } if(cfg.newsfile[0]) { if((fp = freopen(cfg.newsfile, "rb", stdin)) == NULL) { lperror(argv[0]); lprintf("Chanco returned error %d", 3); lclose(); return(3); } } else { fp = stdin; setmode(0, O_BINARY); } if(fp) { ReadCfg(cfg.configfile, cfgitm, sizeof(cfgitm) / sizeof(CFGITEM)); if(validate_cfg()) { int i; if(load_active(cfg.activefile)) { for (i = 0; i < NMETHODS; ++i) if (!stricmp(methods[i].type, argv[0])) break; if (i < NMETHODS) (*methods[i].exec) (argc, argv); else { lprintf("Command %s unrecognized.", argv[0]); result = 3; } } } else result = 2; fclose(fp); } else lperror("Input file"); if(result) lprintf("Chanco returned error %d", result); else { t_proc = time(NULL) - t_proc; lprintf("Chanco processed command in %lu second(s)", t_proc); } lclose(); return(result); } /************************************************************************/ /* */ /************************************************************************/ static void usage(void) { puts("usage: chanco [options] \n\n" "commands:\n" " cancel \n" " newgroup \n" " rmgroup \n\n" "options:\n" " -a active file\n" " -c config file\n" " -d logfile flags\n" " -n news directory\n" " -y history file\n\n" "logfile flags:\n" " a active file processing\n" " f flush logfile after each line\n" " h history file processing"); lprintf("Chanco usage displayed%c", '\n'); lclose(); }