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; }
static bool process_config_parameter(const parm_desc *arg, char *val, priority_t precedence) /* returns true if ok, false if error */ { bool ok = true; if (arg->addr.v == NULL) return ok; switch (arg->type) { case CP_BOOLEAN: { *arg->addr.b = str_to_bool(val); if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> %s\n", arg->name, *arg->addr.b ? "Yes" : "No"); break; } case CP_INTEGER: { remove_comment(val); if (!xatoi(arg->addr.i, val)) return false; if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> %d\n", arg->name, *arg->addr.i); break; } case CP_DOUBLE: { remove_comment(val); if (!xatof(arg->addr.d, val)) return false; if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> %f\n", arg->name, *arg->addr.d); break; } case CP_CHAR: { *arg->addr.c = *val; if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> '%c'\n", arg->name, *arg->addr.c); break; } case CP_STRING: { *arg->addr.s = xstrdup(val); if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> '%s'\n", arg->name, *arg->addr.s); break; } case CP_DIRECTORY: { char *dir = tildeexpand(val, true); if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> '%s'\n", arg->name, dir); if (setup_wordlists(dir, precedence) != 0) exit(EX_ERROR); xfree(dir); break; } case CP_FUNCTION: { ok = (*arg->addr.f)((unsigned char *)val); if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> '%s'\n", arg->name, val); break; } case CP_WORDLIST: { char c = *val; switch (c) { case 'c': wl_mode = WL_M_COMBINED; break; case 's': wl_mode = WL_M_SEPARATE; break; default: fprintf(stderr, "Unknown wordlist type - '%s'.\n", val); exit(EX_ERROR); } if (DEBUG_CONFIG(2)) fprintf(dbgout, "%s -> '%s'\n", arg->name, val); break; } default: { ok = false; break; } } return ok; }
bool read_config_file(const char *fname, bool tilde_expand, bool warn_on_error, priority_t precedence) /* returns true if ok, false if error */ { bool error = false; int lineno = 0; FILE *fp; char *filename; char *arg = NULL, *val = NULL; filename = tildeexpand(fname, tilde_expand); fp = fopen(filename, "r"); if (fp == NULL) { if (DEBUG_CONFIG(0)) { fprintf(dbgout, "Cannot open %s: %s\n", filename, strerror(errno)); } xfree(filename); return false; } if (DEBUG_CONFIG(0)) fprintf(dbgout, "Reading %s\n", filename); while (!feof(fp)) { const char delim[] = " \t="; size_t len; char buff[MAXBUFFLEN]; memset(buff, '\0', sizeof(buff)); /* for debugging */ lineno += 1; if (fgets(buff, sizeof(buff), fp) == NULL) break; len = strlen(buff); if ( buff[0] == '#' || buff[0] == ';' || buff[0] == '\n' ) continue; while (iscntrl((unsigned char)buff[len-1]) || isspace((unsigned char)buff[len-1])) buff[--len] = '\0'; if (DEBUG_CONFIG(1)) fprintf(dbgout, "Testing: %s\n", buff); arg = buff; if (strcspn(arg, delim) < strlen(arg)) { /* if delimiter present */ val = arg + strcspn(arg, delim); *val++ = '\0'; val += strspn(val, delim); } else { val = NULL; } if (val == NULL || (! process_config_line(arg, val, usr_parms, precedence ) && ! process_config_line(arg, val, sys_parms, precedence ) && ! process_config_line(arg, val, format_parms, precedence ))) { error = true; if (warn_on_error) fprintf(stderr, "%s:%d: Error - bad parameter in '%s ... %s'\n", filename, lineno, buff, val); } } if (ferror(fp)) { fprintf(stderr, "Error reading file \"%s\"\n.", filename); error = true; } (void)fclose(fp); /* we're just reading, so fclose should succeed */ xfree(filename); return (error); }