=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.244 retrieving revision 1.248 diff -u -p -r1.244 -r1.248 --- mandoc/main.c 2015/07/28 18:38:55 1.244 +++ mandoc/main.c 2015/10/12 00:08:15 1.248 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.244 2015/07/28 18:38:55 schwarze Exp $ */ +/* $Id: main.c,v 1.248 2015/10/12 00:08:15 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2012, 2014, 2015 Ingo Schwarze @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include #include @@ -109,10 +109,11 @@ static int toptions(struct curparse *, char *); static void usage(enum argmode) __attribute__((noreturn)); static int woptions(struct curparse *, char *); +extern char *__progname; + static const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2, 9}; static char help_arg[] = "help"; static char *help_argv[] = {help_arg, NULL}; -static const char *progname; static enum mandoclevel rc; @@ -139,16 +140,18 @@ main(int argc, char *argv[]) int use_pager; int c; +#if !HAVE_PROGNAME if (argc < 1) - progname = "mandoc"; - else if ((progname = strrchr(argv[0], '/')) == NULL) - progname = argv[0]; + __progname = mandoc_strdup("mandoc"); + else if ((__progname = strrchr(argv[0], '/')) == NULL) + __progname = argv[0]; else - ++progname; + ++__progname; +#endif #if HAVE_SQLITE3 - if (strcmp(progname, BINM_MAKEWHATIS) == 0) - return(mandocdb(argc, argv)); + if (strcmp(__progname, BINM_MAKEWHATIS) == 0) + return mandocdb(argc, argv); #endif /* Search options. */ @@ -160,13 +163,13 @@ main(int argc, char *argv[]) memset(&search, 0, sizeof(struct mansearch)); search.outkey = "Nd"; - if (strcmp(progname, BINM_MAN) == 0) + if (strcmp(__progname, BINM_MAN) == 0) search.argmode = ARG_NAME; - else if (strcmp(progname, BINM_APROPOS) == 0) + else if (strcmp(__progname, BINM_APROPOS) == 0) search.argmode = ARG_EXPR; - else if (strcmp(progname, BINM_WHATIS) == 0) + else if (strcmp(__progname, BINM_WHATIS) == 0) search.argmode = ARG_WORD; - else if (strncmp(progname, "help", 4) == 0) + else if (strncmp(__progname, "help", 4) == 0) search.argmode = ARG_NAME; else search.argmode = ARG_FILE; @@ -207,16 +210,12 @@ main(int argc, char *argv[]) break; case 'I': if (strncmp(optarg, "os=", 3)) { - fprintf(stderr, - "%s: -I %s: Bad argument\n", - progname, optarg); - return((int)MANDOCLEVEL_BADARG); + warnx("-I %s: Bad argument", optarg); + return (int)MANDOCLEVEL_BADARG; } if (defos) { - fprintf(stderr, - "%s: -I %s: Duplicate argument\n", - progname, optarg); - return((int)MANDOCLEVEL_BADARG); + warnx("-I %s: Duplicate argument", optarg); + return (int)MANDOCLEVEL_BADARG; } defos = mandoc_strdup(optarg + 3); break; @@ -225,7 +224,7 @@ main(int argc, char *argv[]) break; case 'K': if ( ! koptions(&options, optarg)) - return((int)MANDOCLEVEL_BADARG); + return (int)MANDOCLEVEL_BADARG; break; case 'k': search.argmode = ARG_EXPR; @@ -254,11 +253,11 @@ main(int argc, char *argv[]) break; case 'T': if ( ! toptions(&curp, optarg)) - return((int)MANDOCLEVEL_BADARG); + return (int)MANDOCLEVEL_BADARG; break; case 'W': if ( ! woptions(&curp, optarg)) - return((int)MANDOCLEVEL_BADARG); + return (int)MANDOCLEVEL_BADARG; break; case 'w': outmode = OUTMODE_FLN; @@ -289,6 +288,11 @@ main(int argc, char *argv[]) } } + if (outmode == OUTMODE_FLN || + outmode == OUTMODE_LST || + !isatty(STDOUT_FILENO)) + use_pager = 0; + /* Parse arguments. */ if (argc > 0) { @@ -303,7 +307,7 @@ main(int argc, char *argv[]) */ if (search.argmode == ARG_NAME) { - if (*progname == 'h') { + if (*__progname == 'h') { if (argc == 0) { argv = help_argv; argc = 1; @@ -349,7 +353,7 @@ main(int argc, char *argv[]) if (search.argmode != ARG_NAME) { fputs("mandoc: database support not compiled in\n", stderr); - return((int)MANDOCLEVEL_BADARG); + return (int)MANDOCLEVEL_BADARG; } sz = 0; #endif @@ -359,9 +363,7 @@ main(int argc, char *argv[]) fs_search(&search, &conf.manpath, argc, argv, &res, &sz); else - fprintf(stderr, - "%s: nothing appropriate\n", - progname); + warnx("nothing appropriate"); } if (sz == 0) { @@ -418,11 +420,8 @@ main(int argc, char *argv[]) /* mandoc(1) */ if (search.argmode == ARG_FILE && ! moptions(&options, auxpaths)) - return((int)MANDOCLEVEL_BADARG); + return (int)MANDOCLEVEL_BADARG; - if (use_pager && ! isatty(STDOUT_FILENO)) - use_pager = 0; - curp.mchars = mchars_alloc(); curp.mp = mparse_alloc(options, curp.wlevel, mmsg, curp.mchars, defos); @@ -504,7 +503,7 @@ out: tag_unlink(); } - return((int)rc); + return (int)rc; } static void @@ -575,19 +574,18 @@ fs_lookup(const struct manpaths *paths, size_t ipath, paths->paths[ipath], sec, name); globres = glob(file, 0, NULL, &globinfo); if (globres != 0 && globres != GLOB_NOMATCH) - fprintf(stderr, "%s: %s: glob: %s\n", - progname, file, strerror(errno)); + warn("%s: glob", file); free(file); if (globres == 0) file = mandoc_strdup(*globinfo.gl_pathv); globfree(&globinfo); if (globres != 0) - return(0); + return 0; found: #if HAVE_SQLITE3 - fprintf(stderr, "%s: outdated mandoc.db lacks %s(%s) entry, run " - "makewhatis %s\n", progname, name, sec, paths->paths[ipath]); + warnx("outdated mandoc.db lacks %s(%s) entry, run makewhatis %s\n", + name, sec, paths->paths[ipath]); #endif *res = mandoc_reallocarray(*res, ++*ressz, sizeof(struct manpage)); page = *res + (*ressz - 1); @@ -598,7 +596,7 @@ found: page->bits = NAME_FILE & NAME_MASK; page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10; page->form = form; - return(1); + return 1; } static void @@ -629,9 +627,7 @@ fs_search(const struct mansearch *cfg, const struct ma return; } if (*ressz == lastsz) - fprintf(stderr, - "%s: No entry for %s in the manual.\n", - progname, *argv); + warnx("No entry for %s in the manual.", *argv); lastsz = *ressz; argv++; argc--; @@ -713,13 +709,9 @@ parse(struct curparse *curp, int fd, const char *file) curp->outman = man_man; break; case OUTT_PDF: - /* FALLTHROUGH */ case OUTT_ASCII: - /* FALLTHROUGH */ case OUTT_UTF8: - /* FALLTHROUGH */ case OUTT_LOCALE: - /* FALLTHROUGH */ case OUTT_PS: curp->outman = terminal_man; curp->outmdoc = terminal_mdoc; @@ -802,8 +794,7 @@ done: return; fail: - fprintf(stderr, "%s: %s: SYSERR: %s: %s", - progname, file, syscall, strerror(errno)); + warn("%s: SYSERR: %s", file, syscall); if (rc < MANDOCLEVEL_SYSERR) rc = MANDOCLEVEL_SYSERR; } @@ -821,11 +812,10 @@ koptions(int *options, char *arg) } else if ( ! strcmp(arg, "us-ascii")) { *options &= ~(MPARSE_UTF8 | MPARSE_LATIN1); } else { - fprintf(stderr, "%s: -K %s: Bad argument\n", - progname, arg); - return(0); + warnx("-K %s: Bad argument", arg); + return 0; } - return(1); + return 1; } static int @@ -841,12 +831,11 @@ moptions(int *options, char *arg) else if (0 == strcmp(arg, "an")) *options |= MPARSE_MAN; else { - fprintf(stderr, "%s: -m %s: Bad argument\n", - progname, arg); - return(0); + warnx("-m %s: Bad argument", arg); + return 0; } - return(1); + return 1; } static int @@ -875,12 +864,11 @@ toptions(struct curparse *curp, char *arg) else if (0 == strcmp(arg, "pdf")) curp->outtype = OUTT_PDF; else { - fprintf(stderr, "%s: -T %s: Bad argument\n", - progname, arg); - return(0); + warnx("-T %s: Bad argument", arg); + return 0; } - return(1); + return 1; } static int @@ -904,7 +892,6 @@ woptions(struct curparse *curp, char *arg) curp->wstop = 1; break; case 1: - /* FALLTHROUGH */ case 2: curp->wlevel = MANDOCLEVEL_WARNING; break; @@ -918,13 +905,12 @@ woptions(struct curparse *curp, char *arg) curp->wlevel = MANDOCLEVEL_BADARG; break; default: - fprintf(stderr, "%s: -W %s: Bad argument\n", - progname, o); - return(0); + warnx("-W %s: Bad argument", o); + return 0; } } - return(1); + return 1; } static void @@ -933,7 +919,7 @@ mmsg(enum mandocerr t, enum mandoclevel lvl, { const char *mparse_msg; - fprintf(stderr, "%s: %s:", progname, file); + fprintf(stderr, "%s: %s:", __progname, file); if (line) fprintf(stderr, "%d:%d:", line, col + 1); @@ -999,25 +985,19 @@ spawn_pager(struct tag_files *tag_files) switch (pager_pid = fork()) { case -1: - fprintf(stderr, "%s: fork: %s\n", - progname, strerror(errno)); - exit((int)MANDOCLEVEL_SYSERR); + err((int)MANDOCLEVEL_SYSERR, "fork"); case 0: break; default: - return(pager_pid); + return pager_pid; } /* The child process becomes the pager. */ - if (dup2(tag_files->ofd, STDOUT_FILENO) == -1) { - fprintf(stderr, "pager: stdout: %s\n", strerror(errno)); - exit((int)MANDOCLEVEL_SYSERR); - } + if (dup2(tag_files->ofd, STDOUT_FILENO) == -1) + err((int)MANDOCLEVEL_SYSERR, "pager stdout"); close(tag_files->ofd); close(tag_files->tfd); execvp(argv[0], argv); - fprintf(stderr, "%s: exec %s: %s\n", - progname, argv[0], strerror(errno)); - exit((int)MANDOCLEVEL_SYSERR); + err((int)MANDOCLEVEL_SYSERR, "exec %s", argv[0]); }