version 1.267, 2016/07/08 22:29:05 |
version 1.275, 2016/08/09 15:09:27 |
|
|
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
#include <glob.h> |
#include <glob.h> |
|
#if HAVE_SANDBOX_INIT |
|
#include <sandbox.h> |
|
#endif |
#include <signal.h> |
#include <signal.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdint.h> |
#include <stdint.h> |
|
|
#include "manconf.h" |
#include "manconf.h" |
#include "mansearch.h" |
#include "mansearch.h" |
|
|
#if !defined(__GNUC__) || (__GNUC__ < 2) |
|
# if !defined(lint) |
|
# define __attribute__(x) |
|
# endif |
|
#endif /* !defined(__GNUC__) || (__GNUC__ < 2) */ |
|
|
|
enum outmode { |
enum outmode { |
OUTMODE_DEF = 0, |
OUTMODE_DEF = 0, |
OUTMODE_FLN, |
OUTMODE_FLN, |
Line 84 struct curparse { |
|
Line 81 struct curparse { |
|
struct manoutput *outopts; /* output options */ |
struct manoutput *outopts; /* output options */ |
}; |
}; |
|
|
|
|
|
int mandocdb(int, char *[]); |
|
|
static int fs_lookup(const struct manpaths *, |
static int fs_lookup(const struct manpaths *, |
size_t ipath, const char *, |
size_t ipath, const char *, |
const char *, const char *, |
const char *, const char *, |
Line 92 static void fs_search(const struct mansearch *, |
|
Line 92 static void fs_search(const struct mansearch *, |
|
const struct manpaths *, int, char**, |
const struct manpaths *, int, char**, |
struct manpage **, size_t *); |
struct manpage **, size_t *); |
static int koptions(int *, char *); |
static int koptions(int *, char *); |
#if HAVE_SQLITE3 |
|
int mandocdb(int, char**); |
|
#endif |
|
static int moptions(int *, char *); |
static int moptions(int *, char *); |
static void mmsg(enum mandocerr, enum mandoclevel, |
static void mmsg(enum mandocerr, enum mandoclevel, |
const char *, int, int, const char *); |
const char *, int, int, const char *); |
Line 148 main(int argc, char *argv[]) |
|
Line 145 main(int argc, char *argv[]) |
|
setprogname(progname); |
setprogname(progname); |
#endif |
#endif |
|
|
#if HAVE_SQLITE3 |
|
if (strncmp(progname, "mandocdb", 8) == 0 || |
if (strncmp(progname, "mandocdb", 8) == 0 || |
strcmp(progname, BINM_MAKEWHATIS) == 0) |
strcmp(progname, BINM_MAKEWHATIS) == 0) |
return mandocdb(argc, argv); |
return mandocdb(argc, argv); |
#endif |
|
|
|
#if HAVE_PLEDGE |
#if HAVE_PLEDGE |
if (pledge("stdio rpath tmppath tty proc exec flock", NULL) == -1) |
if (pledge("stdio rpath tmppath tty proc exec flock", NULL) == -1) |
err((int)MANDOCLEVEL_SYSERR, "pledge"); |
err((int)MANDOCLEVEL_SYSERR, "pledge"); |
#endif |
#endif |
|
|
|
#if HAVE_SANDBOX_INIT |
|
if (sandbox_init(kSBXProfileNoInternet, SANDBOX_NAMED, NULL) == -1) |
|
errx((int)MANDOCLEVEL_SYSERR, "sandbox_init"); |
|
#endif |
|
|
/* Search options. */ |
/* Search options. */ |
|
|
memset(&conf, 0, sizeof(conf)); |
memset(&conf, 0, sizeof(conf)); |
Line 345 main(int argc, char *argv[]) |
|
Line 345 main(int argc, char *argv[]) |
|
/* man(1), whatis(1), apropos(1) */ |
/* man(1), whatis(1), apropos(1) */ |
|
|
if (search.argmode != ARG_FILE) { |
if (search.argmode != ARG_FILE) { |
if (argc == 0) |
|
usage(search.argmode); |
|
|
|
if (search.argmode == ARG_NAME && |
if (search.argmode == ARG_NAME && |
outmode == OUTMODE_ONE) |
outmode == OUTMODE_ONE) |
search.firstmatch = 1; |
search.firstmatch = 1; |
Line 355 main(int argc, char *argv[]) |
|
Line 352 main(int argc, char *argv[]) |
|
/* Access the mandoc database. */ |
/* Access the mandoc database. */ |
|
|
manconf_parse(&conf, conf_file, defpaths, auxpaths); |
manconf_parse(&conf, conf_file, defpaths, auxpaths); |
#if HAVE_SQLITE3 |
|
mansearch_setup(1); |
|
if ( ! mansearch(&search, &conf.manpath, |
if ( ! mansearch(&search, &conf.manpath, |
argc, argv, &res, &sz)) |
argc, argv, &res, &sz)) |
usage(search.argmode); |
usage(search.argmode); |
#else |
|
if (search.argmode != ARG_NAME) { |
|
fputs("mandoc: database support not compiled in\n", |
|
stderr); |
|
return (int)MANDOCLEVEL_BADARG; |
|
} |
|
sz = 0; |
|
#endif |
|
|
|
if (sz == 0) { |
if (sz == 0) { |
if (search.argmode == ARG_NAME) |
if (search.argmode == ARG_NAME) |
Line 470 main(int argc, char *argv[]) |
|
Line 457 main(int argc, char *argv[]) |
|
|
|
if (resp == NULL) |
if (resp == NULL) |
parse(&curp, fd, *argv); |
parse(&curp, fd, *argv); |
else if (resp->form & FORM_SRC) { |
else if (resp->form == FORM_SRC) { |
/* For .so only; ignore failure. */ |
/* For .so only; ignore failure. */ |
chdir(conf.manpath.paths[resp->ipath]); |
chdir(conf.manpath.paths[resp->ipath]); |
parse(&curp, fd, resp->file); |
parse(&curp, fd, resp->file); |
Line 518 main(int argc, char *argv[]) |
|
Line 505 main(int argc, char *argv[]) |
|
out: |
out: |
if (search.argmode != ARG_FILE) { |
if (search.argmode != ARG_FILE) { |
manconf_free(&conf); |
manconf_free(&conf); |
#if HAVE_SQLITE3 |
|
mansearch_free(res, sz); |
mansearch_free(res, sz); |
mansearch_setup(0); |
|
#endif |
|
} |
} |
|
|
free(defos); |
free(defos); |
Line 625 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 609 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
glob_t globinfo; |
glob_t globinfo; |
struct manpage *page; |
struct manpage *page; |
char *file; |
char *file; |
int form, globres; |
int globres; |
|
enum form form; |
|
|
form = FORM_SRC; |
form = FORM_SRC; |
mandoc_asprintf(&file, "%s/man%s/%s.%s", |
mandoc_asprintf(&file, "%s/man%s/%s.%s", |
Line 663 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 648 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
return 0; |
return 0; |
|
|
found: |
found: |
#if HAVE_SQLITE3 |
|
warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", |
warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", |
name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); |
name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); |
#endif |
|
*res = mandoc_reallocarray(*res, ++*ressz, sizeof(struct manpage)); |
*res = mandoc_reallocarray(*res, ++*ressz, sizeof(struct manpage)); |
page = *res + (*ressz - 1); |
page = *res + (*ressz - 1); |
page->file = file; |
page->file = file; |
Line 970 woptions(struct curparse *curp, char *arg) |
|
Line 953 woptions(struct curparse *curp, char *arg) |
|
|
|
while (*arg) { |
while (*arg) { |
o = arg; |
o = arg; |
switch (getsubopt(&arg, UNCONST(toks), &v)) { |
switch (getsubopt(&arg, (char * const *)toks, &v)) { |
case 0: |
case 0: |
curp->wstop = 1; |
curp->wstop = 1; |
break; |
break; |
Line 1002 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
Line 985 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
{ |
{ |
const char *mparse_msg; |
const char *mparse_msg; |
|
|
fprintf(stderr, "%s: %s:", getprogname(), file); |
fprintf(stderr, "%s: %s:", getprogname(), |
|
file == NULL ? "<stdin>" : file); |
|
|
if (line) |
if (line) |
fprintf(stderr, "%d:%d:", line, col + 1); |
fprintf(stderr, "%d:%d:", line, col + 1); |
Line 1055 spawn_pager(struct tag_files *tag_files) |
|
Line 1039 spawn_pager(struct tag_files *tag_files) |
|
break; |
break; |
} |
} |
|
|
/* For more(1) and less(1), use the tag file. */ |
/* For less(1), use the tag file. */ |
|
|
if ((cmdlen = strlen(argv[0])) >= 4) { |
if ((cmdlen = strlen(argv[0])) >= 4) { |
cp = argv[0] + cmdlen - 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++] = mandoc_strdup("-T"); |
argv[argc++] = tag_files->tfn; |
argv[argc++] = tag_files->tfn; |
} |
} |