=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.264 retrieving revision 1.273 diff -u -p -r1.264 -r1.273 --- mandoc/main.c 2016/04/13 12:26:25 1.264 +++ mandoc/main.c 2016/07/19 13:36:13 1.273 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.264 2016/04/13 12:26:25 schwarze Exp $ */ +/* $Id: main.c,v 1.273 2016/07/19 13:36:13 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2012, 2014-2016 Ingo Schwarze @@ -30,11 +30,15 @@ #include #include #include +#if HAVE_SANDBOX_INIT +#include +#endif #include #include #include #include #include +#include #include #include "mandoc_aux.h" @@ -47,12 +51,6 @@ #include "manconf.h" #include "mansearch.h" -#if !defined(__GNUC__) || (__GNUC__ < 2) -# if !defined(lint) -# define __attribute__(x) -# endif -#endif /* !defined(__GNUC__) || (__GNUC__ < 2) */ - enum outmode { OUTMODE_DEF = 0, OUTMODE_FLN, @@ -83,6 +81,11 @@ struct curparse { struct manoutput *outopts; /* output options */ }; + +#if HAVE_SQLITE3 +int mandocdb(int, char *[]); +#endif + static int fs_lookup(const struct manpaths *, size_t ipath, const char *, const char *, const char *, @@ -91,9 +94,6 @@ static void fs_search(const struct mansearch *, const struct manpaths *, int, char**, struct manpage **, size_t *); static int koptions(int *, char *); -#if HAVE_SQLITE3 -int mandocdb(int, char**); -#endif static int moptions(int *, char *); static void mmsg(enum mandocerr, enum mandoclevel, const char *, int, int, const char *); @@ -158,6 +158,11 @@ main(int argc, char *argv[]) err((int)MANDOCLEVEL_SYSERR, "pledge"); #endif +#if HAVE_SANDBOX_INIT + if (sandbox_init(kSBXProfileNoInternet, SANDBOX_NAMED, NULL) == -1) + errx((int)MANDOCLEVEL_SYSERR, "sandbox_init"); +#endif + /* Search options. */ memset(&conf, 0, sizeof(conf)); @@ -478,7 +483,7 @@ main(int argc, char *argv[]) conf.output.synopsisonly); if (argc > 1 && curp.outtype <= OUTT_UTF8) - ascii_sepline(curp.outdata); + terminal_sepline(curp.outdata); } else if (rc < MANDOCLEVEL_ERROR) rc = MANDOCLEVEL_ERROR; @@ -663,8 +668,8 @@ fs_lookup(const struct manpaths *paths, size_t ipath, found: #if HAVE_SQLITE3 - warnx("outdated mandoc.db lacks %s(%s) entry, run makewhatis %s", - name, sec, paths->paths[ipath]); + warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", + name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); #endif *res = mandoc_reallocarray(*res, ++*ressz, sizeof(struct manpage)); page = *res + (*ressz - 1); @@ -969,7 +974,7 @@ woptions(struct curparse *curp, char *arg) while (*arg) { o = arg; - switch (getsubopt(&arg, UNCONST(toks), &v)) { + switch (getsubopt(&arg, (char * const *)toks, &v)) { case 0: curp->wstop = 1; break; @@ -1020,6 +1025,7 @@ mmsg(enum mandocerr t, enum mandoclevel lvl, static pid_t spawn_pager(struct tag_files *tag_files) { + const struct timespec timeout = { 0, 100000000 }; /* 0.1s */ #define MAX_PAGER_ARGS 16 char *argv[MAX_PAGER_ARGS]; const char *pager; @@ -1053,11 +1059,11 @@ spawn_pager(struct tag_files *tag_files) break; } - /* For more(1) and less(1), use the tag file. */ + /* For less(1), use the tag file. */ if ((cmdlen = strlen(argv[0])) >= 4) { cp = argv[0] + cmdlen - 4; - if (strcmp(cp, "less") == 0 || strcmp(cp, "more") == 0) { + if (strcmp(cp, "less") == 0) { argv[argc++] = mandoc_strdup("-T"); argv[argc++] = tag_files->tfn; } @@ -1069,8 +1075,6 @@ spawn_pager(struct tag_files *tag_files) case -1: err((int)MANDOCLEVEL_SYSERR, "fork"); case 0: - /* Set pgrp in both parent and child to avoid racing exec. */ - (void)setpgid(0, 0); break; default: (void)setpgid(pager_pid, 0); @@ -1089,6 +1093,12 @@ spawn_pager(struct tag_files *tag_files) err((int)MANDOCLEVEL_SYSERR, "pager stdout"); close(tag_files->ofd); close(tag_files->tfd); + + /* Do not start the pager before controlling the terminal. */ + + while (tcgetpgrp(STDIN_FILENO) != getpid()) + nanosleep(&timeout, NULL); + execvp(argv[0], argv); err((int)MANDOCLEVEL_SYSERR, "exec %s", argv[0]); }