int set_wordlist_dir(const char* d, priority_t precedence) { int rc = 0; char *dir; static priority_t saved_precedence = PR_NONE; if (DEBUG_WORDLIST(2)) fprintf(dbgout, "p: %d, s: %d\n", (int) precedence, (int) saved_precedence); if (precedence < saved_precedence) return rc; dir = (d != NULL) ? tildeexpand(d) : get_directory(precedence); if (dir == NULL) return -1; if (DEBUG_WORDLIST(2)) fprintf(dbgout, "d: %s\n", dir); saved_precedence = precedence; set_bogohome(dir); xfree(dir); return rc; }
bool bfpath_check_mode(bfpath *bfp, bfpath_mode m) { bool ok = true; bfp->checked = true; if (bfp->filepath != NULL && bfp->dirname == NULL && bfp->filename == NULL) { char *t = strrchr(bfp->filepath, DIRSEP_C); if (t == NULL) bfp->filename = xstrdup(bfp->filepath); else { bfp->dirname = xstrdup(bfp->filepath); bfp->dirname[t - bfp->filepath] = '\0'; bfp->filename = xstrdup(t+1); } } check_for_file(bfp); switch (m) { case BFP_MUST_EXIST: if (!bfp->exists) ok = false; break; case BFP_MAY_CREATE: break; case BFP_ERROR: /* can't get here */ abort(); } if (bfp->dirname != NULL && bogohome == NULL) set_bogohome(bfp->dirname); return ok; }
int main(int argc, char **argv) /*@globals errno,stderr,stdout@*/ { ex_t exitcode = EX_OK; fBogotune = true; /* for rob_compute_spamicity() */ dbgout = stderr; progtype = build_progtype(progname, DB_TYPE); ham_files = filelist_new("ham"); spam_files = filelist_new("spam"); /* process args and read mailboxes */ process_arglist(argc, argv); /* directories from command line and config file are already handled */ if (ds_flag == DS_DSK) { bfpath *bfp; if (ds_path == NULL) ds_path = get_directory(PR_ENV_BOGO); if (ds_path == NULL) ds_path = get_directory(PR_ENV_HOME); if (ds_path == NULL) { fprintf(stderr, "Cannot derive bogofilter directory from environment, aborting.\n"); exit(EX_ERROR); } set_bogohome(ds_path); bfp = bfpath_create(ds_path); if (!bfpath_check_mode(bfp, BFP_MUST_EXIST)) { fprintf(stderr, "Can't open wordlist '%s'\n", bfp->filepath); exit(EX_ERROR); } if (bfp->exists && bfp->isdir) { bfpath_free(bfp); ds_path = mxcat(ds_path, DIRSEP_S, WORDLIST, NULL); bfp = bfpath_create(ds_path); if (!bfpath_check_mode(bfp, BFP_MUST_EXIST)) { fprintf(stderr, "Can't open wordlist '%s'\n", bfp->filepath); exit(EX_ERROR); } } env = ds_init(bfp); init_wordlist("word", ds_path, 0, WL_REGULAR); } bogotune_init(); if (ds_flag == DS_DSK) load_wordlist(load_hook, train); /* if encoding not yet set, assume old style */ if (encoding == E_UNKNOWN) encoding = E_RAW; if (bogolex_file != NULL) bogolex(); else bogotune(); bogotune_free(); if (ds_flag == DS_DSK) ds_cleanup(env); exit(exitcode); }
int main(int argc, char *argv[]) { ex_t rc = EX_OK; bfpath *bfp; bfpath_mode mode; fBogoutil = true; signal_setup(); /* setup to catch signals */ atexit(bf_exit); progtype = build_progtype(progname, DB_TYPE); set_today(); /* compute current date for token age */ process_arglist(argc, argv); process_config_files(false, longopts_bogoutil); /* need to read lock sizes */ /* Extra or missing parameters */ if (flag != M_WORD && flag != M_LIST_LOGFILES && argc != optind) { fprintf(stderr, "Missing or extraneous argument.\n"); usage(stderr); exit(EX_ERROR); } bfp = bfpath_create(ds_file); if (bogohome == NULL) set_bogohome( "." ); /* set default */ bfpath_set_bogohome(bfp); mode = get_mode(flag); if (bfpath_check_mode(bfp, mode)) { if (bfp->isdir) bfpath_set_filename(bfp, WORDLIST); } if (!bfpath_check_mode(bfp, mode)) { fprintf(stderr, "Can't open wordlist '%s'\n", bfp->filepath); exit(EX_ERROR); } errno = 0; /* clear error status */ switch (flag) { case M_RECOVER: ds_init(bfp); rc = ds_recover(bfp, false); break; case M_CRECOVER: ds_init(bfp); rc = ds_recover(bfp, true); break; case M_CHECKPOINT: ds_init(bfp); rc = ds_checkpoint(bfp); break; case M_LIST_LOGFILES: dsm_init(bfp); rc = ds_list_logfiles(bfp, argc - optind, argv + optind); break; case M_PURGELOGS: ds_init(bfp); rc = ds_purgelogs(bfp); break; case M_REMOVEENV: dsm_init(bfp); rc = ds_remove(bfp); break; case M_VERIFY: dsm_init(bfp); rc = ds_verify(bfp); break; case M_LEAFPAGES: { u_int32_t c; dsm_init(bfp); c = ds_leafpages(bfp); if (c == 0xffffffff) { fprintf(stderr, "%s: error getting leaf page count.\n", ds_file); rc = EX_ERROR; } else if (c == 0) { puts("UNKNOWN"); } else { printf("%lu\n", (unsigned long)c); } } break; case M_PAGESIZE: { u_int32_t s; dsm_init(bfp); s = ds_pagesize(bfp); if (s == 0xffffffff) { fprintf(stderr, "%s: error getting page size.\n", ds_file); } else if (s == 0) { puts("UNKNOWN"); } else { printf("%lu\n", (unsigned long)s); } } break; case M_DUMP: rc = dump_wordlist(bfp); break; case M_LOAD: rc = load_wordlist(bfp) ? EX_ERROR : EX_OK; break; case M_MAINTAIN: maintain = true; rc = maintain_wordlist_file(bfp); break; case M_WORD: argc -= optind; argv += optind; rc = display_words(bfp, argc, argv, prob); break; case M_HIST: rc = histogram(bfp); break; case M_ROBX: rc = get_robx(bfp); break; case M_NONE: default: /* should have been handled above */ abort(); break; } bfpath_free(bfp); return rc; }