/* $Id: man_conf.c,v 1.1 2011/11/17 14:52:32 schwarze Exp $ */ /* * Copyright (c) 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include "mandoc.h" #include "man_conf.h" #define MAN_CONF_FILE "/etc/man.conf" static void add_dir(struct man_conf *, const char *); static void add_dir(struct man_conf *dirs, const char *dir) { if (dirs->maxargs == dirs->argc) { dirs->maxargs += 8; assert(0 < dirs->maxargs); dirs->argv = mandoc_realloc(dirs->argv, (size_t)dirs->maxargs); } dirs->argv[dirs->argc++] = mandoc_strdup(dir); } void manpath_parse(struct man_conf *dirs, char *path) { char *dir; for (dir = strtok(path, ":"); dir; dir = strtok(NULL, ":")) add_dir(dirs, dir); } void man_conf_parse(struct man_conf *dirs) { FILE *stream; char *p, *q; size_t len; if (NULL == (stream = fopen(MAN_CONF_FILE, "r"))) return; while (NULL != (p = fgetln(stream, &len)) && '\n' == p[--len]) { p[len] = '\0'; while (isspace(*p)) p++; if (strncmp("_whatdb", p, 7)) continue; p += 7; while (isspace(*p)) p++; if ('\0' == *p) continue; if (NULL == (q = strrchr(p, '/'))) continue; *q = '\0'; add_dir(dirs, p); } fclose(stream); } void man_conf_free(struct man_conf *dirs) { while (dirs->argc--) free(dirs->argv[dirs->argc]); free(dirs->argv); dirs->maxargs = 0; }