version 1.351, 2020/07/20 16:57:30 |
version 1.356, 2021/08/14 13:53:08 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2010-2012, 2014-2020 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010-2012, 2014-2021 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org> |
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org> |
* |
* |
Line 93 struct outstate { |
|
Line 93 struct outstate { |
|
|
|
int mandocdb(int, char *[]); |
int mandocdb(int, char *[]); |
|
|
static void check_xr(void); |
static void check_xr(struct manpaths *); |
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 104 static int fs_search(const struct mansearch *, |
|
Line 104 static int fs_search(const struct mansearch *, |
|
static void glob_esc(char **, const char *, const char *); |
static void glob_esc(char **, const char *, const char *); |
static void outdata_alloc(struct outstate *, struct manoutput *); |
static void outdata_alloc(struct outstate *, struct manoutput *); |
static void parse(struct mparse *, int, const char *, |
static void parse(struct mparse *, int, const char *, |
struct outstate *, struct manoutput *); |
struct outstate *, struct manconf *); |
static void passthrough(int, int); |
static void passthrough(int, int); |
static void process_onefile(struct mparse *, struct manpage *, |
static void process_onefile(struct mparse *, struct manpage *, |
int, struct outstate *, struct manconf *); |
int, struct outstate *, struct manconf *); |
Line 165 main(int argc, char *argv[]) |
|
Line 165 main(int argc, char *argv[]) |
|
return mandocdb(argc, argv); |
return mandocdb(argc, argv); |
|
|
#if HAVE_PLEDGE |
#if HAVE_PLEDGE |
if (pledge("stdio rpath tmppath tty proc exec", NULL) == -1) { |
if (pledge("stdio rpath wpath cpath tmppath tty proc exec", NULL) == -1) { |
mandoc_msg(MANDOCERR_PLEDGE, 0, 0, "%s", strerror(errno)); |
mandoc_msg(MANDOCERR_PLEDGE, 0, 0, "%s", strerror(errno)); |
return mandoc_msg_getrc(); |
return mandoc_msg_getrc(); |
} |
} |
Line 373 main(int argc, char *argv[]) |
|
Line 373 main(int argc, char *argv[]) |
|
|
|
if (outmode == OUTMODE_FLN || |
if (outmode == OUTMODE_FLN || |
outmode == OUTMODE_LST || |
outmode == OUTMODE_LST || |
!isatty(STDOUT_FILENO)) |
(conf.output.outfilename == NULL && |
|
conf.output.tagfilename == NULL && |
|
isatty(STDOUT_FILENO) == 0)) |
outst.use_pager = 0; |
outst.use_pager = 0; |
|
|
if (outst.use_pager && |
if (outst.use_pager && |
Line 387 main(int argc, char *argv[]) |
|
Line 389 main(int argc, char *argv[]) |
|
} |
} |
|
|
#if HAVE_PLEDGE |
#if HAVE_PLEDGE |
if (outst.use_pager == 0) { |
if (outst.use_pager == 0) |
if (pledge("stdio rpath", NULL) == -1) { |
c = pledge("stdio rpath", NULL); |
mandoc_msg(MANDOCERR_PLEDGE, 0, 0, |
else if (conf.output.outfilename != NULL || |
"%s", strerror(errno)); |
conf.output.tagfilename != NULL) |
return mandoc_msg_getrc(); |
c = pledge("stdio rpath wpath cpath", NULL); |
} |
else |
|
c = pledge("stdio rpath tmppath tty proc exec", NULL); |
|
if (c == -1) { |
|
mandoc_msg(MANDOCERR_PLEDGE, 0, 0, "%s", strerror(errno)); |
|
return mandoc_msg_getrc(); |
} |
} |
#endif |
#endif |
|
|
Line 446 main(int argc, char *argv[]) |
|
Line 452 main(int argc, char *argv[]) |
|
|
|
/* Read the configuration file. */ |
/* Read the configuration file. */ |
|
|
if (search.argmode != ARG_FILE) |
if (search.argmode != ARG_FILE || |
|
mandoc_msg_getmin() == MANDOCERR_STYLE) |
manconf_parse(&conf, conf_file, defpaths, auxpaths); |
manconf_parse(&conf, conf_file, defpaths, auxpaths); |
|
|
/* man(1): Resolve each name individually. */ |
/* man(1): Resolve each name individually. */ |
|
|
manconf_free(&conf); |
manconf_free(&conf); |
|
|
if (outst.tag_files != NULL) { |
if (outst.tag_files != NULL) { |
if (term_tag_close() != -1) |
if (term_tag_close() != -1 && |
|
conf.output.outfilename == NULL && |
|
conf.output.tagfilename == NULL) |
run_pager(&outst, conf.output.tag); |
run_pager(&outst, conf.output.tag); |
term_tag_unlink(); |
term_tag_unlink(); |
} else if (outst.had_output && outst.outtype != OUTT_LINT) |
} else if (outst.had_output && outst.outtype != OUTT_LINT) |
Line 837 process_onefile(struct mparse *mp, struct manpage *res |
|
Line 846 process_onefile(struct mparse *mp, struct manpage *res |
|
|
|
if (outst->use_pager) { |
if (outst->use_pager) { |
outst->use_pager = 0; |
outst->use_pager = 0; |
outst->tag_files = term_tag_init(); |
outst->tag_files = term_tag_init(conf->output.outfilename, |
|
outst->outtype == OUTT_HTML ? ".html" : "", |
|
conf->output.tagfilename); |
|
#if HAVE_PLEDGE |
|
if ((conf->output.outfilename != NULL || |
|
conf->output.tagfilename != NULL) && |
|
pledge("stdio rpath cpath", NULL) == -1) { |
|
mandoc_msg(MANDOCERR_PLEDGE, 0, 0, |
|
"%s", strerror(errno)); |
|
exit(mandoc_msg_getrc()); |
|
} |
|
#endif |
} |
} |
if (outst->had_output && outst->outtype <= OUTT_UTF8) { |
if (outst->had_output && outst->outtype <= OUTT_UTF8) { |
if (outst->outdata == NULL) |
if (outst->outdata == NULL) |
Line 846 process_onefile(struct mparse *mp, struct manpage *res |
|
Line 866 process_onefile(struct mparse *mp, struct manpage *res |
|
} |
} |
|
|
if (resp->form == FORM_SRC) |
if (resp->form == FORM_SRC) |
parse(mp, fd, resp->file, outst, &conf->output); |
parse(mp, fd, resp->file, outst, conf); |
else { |
else { |
passthrough(fd, conf->output.synopsisonly); |
passthrough(fd, conf->output.synopsisonly); |
outst->had_output = 1; |
outst->had_output = 1; |
Line 867 process_onefile(struct mparse *mp, struct manpage *res |
|
Line 887 process_onefile(struct mparse *mp, struct manpage *res |
|
|
|
static void |
static void |
parse(struct mparse *mp, int fd, const char *file, |
parse(struct mparse *mp, int fd, const char *file, |
struct outstate *outst, struct manoutput *outconf) |
struct outstate *outst, struct manconf *conf) |
{ |
{ |
|
static struct manpaths basepaths; |
static int previous; |
static int previous; |
struct roff_meta *meta; |
struct roff_meta *meta; |
|
|
Line 894 parse(struct mparse *mp, int fd, const char *file, |
|
Line 915 parse(struct mparse *mp, int fd, const char *file, |
|
return; |
return; |
|
|
if (outst->outdata == NULL) |
if (outst->outdata == NULL) |
outdata_alloc(outst, outconf); |
outdata_alloc(outst, &conf->output); |
else if (outst->outtype == OUTT_HTML) |
else if (outst->outtype == OUTT_HTML) |
html_reset(outst->outdata); |
html_reset(outst->outdata); |
|
|
Line 947 parse(struct mparse *mp, int fd, const char *file, |
|
Line 968 parse(struct mparse *mp, int fd, const char *file, |
|
case OUTT_PS: |
case OUTT_PS: |
terminal_man(outst->outdata, meta); |
terminal_man(outst->outdata, meta); |
break; |
break; |
|
case OUTT_MARKDOWN: |
|
mandoc_msg(MANDOCERR_MAN_TMARKDOWN, 0, 0, NULL); |
|
break; |
default: |
default: |
break; |
break; |
} |
} |
} |
} |
if (outconf->tag != NULL && outconf->tag_found == 0 && |
if (conf->output.tag != NULL && conf->output.tag_found == 0 && |
tag_exists(outconf->tag)) |
tag_exists(conf->output.tag)) |
outconf->tag_found = 1; |
conf->output.tag_found = 1; |
if (mandoc_msg_getmin() < MANDOCERR_STYLE) |
|
check_xr(); |
if (mandoc_msg_getmin() < MANDOCERR_STYLE) { |
|
if (basepaths.sz == 0) |
|
manpath_base(&basepaths); |
|
check_xr(&basepaths); |
|
} else if (mandoc_msg_getmin() < MANDOCERR_WARNING) |
|
check_xr(&conf->manpath); |
} |
} |
|
|
static void |
static void |
check_xr(void) |
check_xr(struct manpaths *paths) |
{ |
{ |
static struct manpaths paths; |
|
struct mansearch search; |
struct mansearch search; |
struct mandoc_xr *xr; |
struct mandoc_xr *xr; |
size_t sz; |
size_t sz; |
|
|
if (paths.sz == 0) |
|
manpath_base(&paths); |
|
|
|
for (xr = mandoc_xr_get(); xr != NULL; xr = xr->next) { |
for (xr = mandoc_xr_get(); xr != NULL; xr = xr->next) { |
if (xr->line == -1) |
if (xr->line == -1) |
continue; |
continue; |
|
|
search.outkey = NULL; |
search.outkey = NULL; |
search.argmode = ARG_NAME; |
search.argmode = ARG_NAME; |
search.firstmatch = 1; |
search.firstmatch = 1; |
if (mansearch(&search, &paths, 1, &xr->name, NULL, &sz)) |
if (mansearch(&search, paths, 1, &xr->name, NULL, &sz)) |
continue; |
continue; |
if (fs_search(&search, &paths, xr->name, NULL, &sz) != -1) |
if (fs_search(&search, paths, xr->name, NULL, &sz) != -1) |
continue; |
continue; |
if (xr->count == 1) |
if (xr->count == 1) |
mandoc_msg(MANDOCERR_XR_BAD, xr->line, |
mandoc_msg(MANDOCERR_XR_BAD, xr->line, |