aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/manpath.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2019-07-10 19:39:01 +0000
committerIngo Schwarze <schwarze@openbsd.org>2019-07-10 19:39:01 +0000
commita597f1a3e2780fed1216f2237e8a276110b0daef (patch)
treee59b39076a9f1141d186002bff45c25d72423539 /manpath.c
parent589c83d3597ba6229a69bda10630710c515d2508 (diff)
downloadmandoc-a597f1a3e2780fed1216f2237e8a276110b0daef.tar.gz
mandoc-a597f1a3e2780fed1216f2237e8a276110b0daef.tar.zst
mandoc-a597f1a3e2780fed1216f2237e8a276110b0daef.zip
Some time ago, i simplified mandoc_msg() such that it can be used
everywhere and not only in the parsers. For more uniform messages, use it at more places instead of err(3), in particular in the main program. While here, integrate a few trivial functions called at exactly one place into the main option parser, and let a few more functions use the normal convention of returning 0 for success and -1 for error.
Diffstat (limited to 'manpath.c')
-rw-r--r--manpath.c92
1 files changed, 48 insertions, 44 deletions
diff --git a/manpath.c b/manpath.c
index 703d6328..e4578cce 100644
--- a/manpath.c
+++ b/manpath.c
@@ -1,6 +1,6 @@
-/* $Id: manpath.c,v 1.39 2019/05/03 18:39:34 schwarze Exp $ */
+/* $Id: manpath.c,v 1.40 2019/07/10 19:39:01 schwarze Exp $ */
/*
- * Copyright (c) 2011,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011,2014,2015,2017-2019 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -21,20 +21,19 @@
#include <sys/stat.h>
#include <ctype.h>
-#if HAVE_ERR
-#include <err.h>
-#endif
+#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mandoc_aux.h"
+#include "mandoc.h"
#include "manconf.h"
static void manconf_file(struct manconf *, const char *);
-static void manpath_add(struct manpaths *, const char *, int);
-static void manpath_parseline(struct manpaths *, char *, int);
+static void manpath_add(struct manpaths *, const char *, char);
+static void manpath_parseline(struct manpaths *, char *, char);
void
@@ -44,11 +43,11 @@ manconf_parse(struct manconf *conf, const char *file,
char *insert;
/* Always prepend -m. */
- manpath_parseline(&conf->manpath, auxp, 1);
+ manpath_parseline(&conf->manpath, auxp, 'm');
/* If -M is given, it overrides everything else. */
if (NULL != defp) {
- manpath_parseline(&conf->manpath, defp, 1);
+ manpath_parseline(&conf->manpath, defp, 'M');
return;
}
@@ -66,13 +65,13 @@ manconf_parse(struct manconf *conf, const char *file,
/* Prepend man.conf(5) to MANPATH. */
if (':' == defp[0]) {
manconf_file(conf, file);
- manpath_parseline(&conf->manpath, defp, 0);
+ manpath_parseline(&conf->manpath, defp, '\0');
return;
}
/* Append man.conf(5) to MANPATH. */
if (':' == defp[strlen(defp) - 1]) {
- manpath_parseline(&conf->manpath, defp, 0);
+ manpath_parseline(&conf->manpath, defp, '\0');
manconf_file(conf, file);
return;
}
@@ -81,28 +80,28 @@ manconf_parse(struct manconf *conf, const char *file,
insert = strstr(defp, "::");
if (NULL != insert) {
*insert++ = '\0';
- manpath_parseline(&conf->manpath, defp, 0);
+ manpath_parseline(&conf->manpath, defp, '\0');
manconf_file(conf, file);
- manpath_parseline(&conf->manpath, insert + 1, 0);
+ manpath_parseline(&conf->manpath, insert + 1, '\0');
return;
}
/* MANPATH overrides man.conf(5) completely. */
- manpath_parseline(&conf->manpath, defp, 0);
+ manpath_parseline(&conf->manpath, defp, '\0');
}
void
manpath_base(struct manpaths *dirs)
{
char path_base[] = MANPATH_BASE;
- manpath_parseline(dirs, path_base, 0);
+ manpath_parseline(dirs, path_base, '\0');
}
/*
* Parse a FULL pathname from a colon-separated list of arrays.
*/
static void
-manpath_parseline(struct manpaths *dirs, char *path, int complain)
+manpath_parseline(struct manpaths *dirs, char *path, char option)
{
char *dir;
@@ -110,7 +109,7 @@ manpath_parseline(struct manpaths *dirs, char *path, int complain)
return;
for (dir = strtok(path, ":"); dir; dir = strtok(NULL, ":"))
- manpath_add(dirs, dir, complain);
+ manpath_add(dirs, dir, option);
}
/*
@@ -118,33 +117,32 @@ manpath_parseline(struct manpaths *dirs, char *path, int complain)
* Grow the array one-by-one for simplicity's sake.
*/
static void
-manpath_add(struct manpaths *dirs, const char *dir, int complain)
+manpath_add(struct manpaths *dirs, const char *dir, char option)
{
char buf[PATH_MAX];
struct stat sb;
char *cp;
size_t i;
- if (NULL == (cp = realpath(dir, buf))) {
- if (complain)
- warn("manpath: %s", dir);
- return;
- }
+ if ((cp = realpath(dir, buf)) == NULL)
+ goto fail;
for (i = 0; i < dirs->sz; i++)
- if (0 == strcmp(dirs->paths[i], dir))
+ if (strcmp(dirs->paths[i], dir) == 0)
return;
- if (stat(cp, &sb) == -1) {
- if (complain)
- warn("manpath: %s", dir);
- return;
- }
+ if (stat(cp, &sb) == -1)
+ goto fail;
dirs->paths = mandoc_reallocarray(dirs->paths,
- dirs->sz + 1, sizeof(char *));
-
+ dirs->sz + 1, sizeof(*dirs->paths));
dirs->paths[dirs->sz++] = mandoc_strdup(cp);
+ return;
+
+fail:
+ if (option != '\0')
+ mandoc_msg(MANDOCERR_BADARG_BAD, 0, 0,
+ "-%c %s: %s", option, dir, strerror(errno));
}
void
@@ -210,7 +208,7 @@ manconf_file(struct manconf *conf, const char *file)
*ep = '\0';
/* FALLTHROUGH */
case 0: /* manpath */
- manpath_add(&conf->manpath, cp, 0);
+ manpath_add(&conf->manpath, cp, '\0');
*manpath_default = '\0';
break;
case 1: /* output */
@@ -225,7 +223,7 @@ manconf_file(struct manconf *conf, const char *file)
out:
if (*manpath_default != '\0')
- manpath_parseline(&conf->manpath, manpath_default, 0);
+ manpath_parseline(&conf->manpath, manpath_default, '\0');
}
int
@@ -243,7 +241,7 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
for (tok = 0; tok < ntoks; tok++) {
len = strlen(toks[tok]);
- if ( ! strncmp(cp, toks[tok], len) &&
+ if (strncmp(cp, toks[tok], len) == 0 &&
strchr(" = ", cp[len]) != NULL) {
cp += len;
if (*cp == '=')
@@ -255,11 +253,11 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
}
if (tok < 6 && *cp == '\0') {
- warnx("-O %s=?: Missing argument value", toks[tok]);
+ mandoc_msg(MANDOCERR_BADVAL_MISS, 0, 0, "-O %s=?", toks[tok]);
return -1;
}
if (tok > 6 && tok < ntoks && *cp != '\0') {
- warnx("-O %s: Does not take a value: %s", toks[tok], cp);
+ mandoc_msg(MANDOCERR_BADVAL, 0, 0, "-O %s=%s", toks[tok], cp);
return -1;
}
@@ -300,7 +298,8 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
conf->indent = strtonum(cp, 0, 1000, &errstr);
if (errstr == NULL)
return 0;
- warnx("-O indent=%s is %s", cp, errstr);
+ mandoc_msg(MANDOCERR_BADVAL_BAD, 0, 0,
+ "-O indent=%s is %s", cp, errstr);
return -1;
case 5:
if (conf->width) {
@@ -310,7 +309,8 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
conf->width = strtonum(cp, 1, 1000, &errstr);
if (errstr == NULL)
return 0;
- warnx("-O width=%s is %s", cp, errstr);
+ mandoc_msg(MANDOCERR_BADVAL_BAD, 0, 0,
+ "-O width=%s is %s", cp, errstr);
return -1;
case 6:
if (conf->tag != NULL) {
@@ -332,12 +332,16 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
conf->toc = 1;
return 0;
default:
- warnx("-O %s: Bad argument", cp);
+ mandoc_msg(MANDOCERR_BADARG_BAD, 0, 0, "-O %s", cp);
+ return -1;
+ }
+ if (fromfile) {
+ free(oldval);
+ return 0;
+ } else {
+ mandoc_msg(MANDOCERR_BADVAL_DUPE, 0, 0,
+ "-O %s=%s: already set to %s", toks[tok], cp, oldval);
+ free(oldval);
return -1;
}
- if (fromfile == 0)
- warnx("-O %s=%s: Option already set to %s",
- toks[tok], cp, oldval);
- free(oldval);
- return -1;
}