version 1.298, 2017/07/02 21:18:29 |
version 1.304, 2018/04/13 19:55:30 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010-2012, 2014-2017 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010-2012, 2014-2018 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org> |
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
|
|
#include "config.h" |
#include "config.h" |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
#include <sys/ioctl.h> |
#include <sys/param.h> /* MACHINE */ |
#include <sys/param.h> /* MACHINE */ |
|
#include <sys/termios.h> |
#include <sys/wait.h> |
#include <sys/wait.h> |
|
|
#include <assert.h> |
#include <assert.h> |
Line 111 static const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2 |
|
Line 113 static const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2 |
|
static char help_arg[] = "help"; |
static char help_arg[] = "help"; |
static char *help_argv[] = {help_arg, NULL}; |
static char *help_argv[] = {help_arg, NULL}; |
static enum mandoclevel rc; |
static enum mandoclevel rc; |
|
static FILE *mmsg_stream; |
|
|
|
|
int |
int |
Line 119 main(int argc, char *argv[]) |
|
Line 122 main(int argc, char *argv[]) |
|
struct manconf conf; |
struct manconf conf; |
struct mansearch search; |
struct mansearch search; |
struct curparse curp; |
struct curparse curp; |
|
struct winsize ws; |
struct tag_files *tag_files; |
struct tag_files *tag_files; |
struct manpage *res, *resp; |
struct manpage *res, *resp; |
const char *progname, *sec, *thisarg; |
const char *progname, *sec, *thisarg; |
Line 190 main(int argc, char *argv[]) |
|
Line 194 main(int argc, char *argv[]) |
|
curp.mmin = MANDOCERR_MAX; |
curp.mmin = MANDOCERR_MAX; |
curp.outopts = &conf.output; |
curp.outopts = &conf.output; |
options = MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1; |
options = MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1; |
|
mmsg_stream = stderr; |
|
|
use_pager = 1; |
use_pager = 1; |
tag_files = NULL; |
tag_files = NULL; |
Line 314 main(int argc, char *argv[]) |
|
Line 319 main(int argc, char *argv[]) |
|
!isatty(STDOUT_FILENO)) |
!isatty(STDOUT_FILENO)) |
use_pager = 0; |
use_pager = 0; |
|
|
|
if (use_pager && |
|
(conf.output.width == 0 || conf.output.indent == 0) && |
|
ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) { |
|
if (conf.output.width == 0 && ws.ws_col < 79) |
|
conf.output.width = ws.ws_col - 1; |
|
if (conf.output.indent == 0 && ws.ws_col < 66) |
|
conf.output.indent = 3; |
|
} |
|
|
#if HAVE_PLEDGE |
#if HAVE_PLEDGE |
if (!use_pager) |
if (!use_pager) |
if (pledge("stdio rpath", NULL) == -1) |
if (pledge("stdio rpath", NULL) == -1) |
Line 476 main(int argc, char *argv[]) |
|
Line 490 main(int argc, char *argv[]) |
|
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]); |
(void)chdir(conf.manpath.paths[resp->ipath]); |
parse(&curp, fd, resp->file); |
parse(&curp, fd, resp->file); |
} else |
} else |
passthrough(resp->file, fd, |
passthrough(resp->file, fd, |
conf.output.synopsisonly); |
conf.output.synopsisonly); |
|
|
|
if (ferror(stdout)) { |
|
if (tag_files != NULL) { |
|
warn("%s", tag_files->ofn); |
|
tag_unlink(); |
|
tag_files = NULL; |
|
} else |
|
warn("stdout"); |
|
rc = MANDOCLEVEL_SYSERR; |
|
break; |
|
} |
|
|
if (argc > 1 && curp.outtype <= OUTT_UTF8) { |
if (argc > 1 && curp.outtype <= OUTT_UTF8) { |
if (curp.outdata == NULL) |
if (curp.outdata == NULL) |
outdata_alloc(&curp); |
outdata_alloc(&curp); |
Line 994 toptions(struct curparse *curp, char *arg) |
|
Line 1019 toptions(struct curparse *curp, char *arg) |
|
else if (0 == strcmp(arg, "lint")) { |
else if (0 == strcmp(arg, "lint")) { |
curp->outtype = OUTT_LINT; |
curp->outtype = OUTT_LINT; |
curp->mmin = MANDOCERR_BASE; |
curp->mmin = MANDOCERR_BASE; |
|
mmsg_stream = stdout; |
} else if (0 == strcmp(arg, "tree")) |
} else if (0 == strcmp(arg, "tree")) |
curp->outtype = OUTT_TREE; |
curp->outtype = OUTT_TREE; |
else if (0 == strcmp(arg, "man")) |
else if (0 == strcmp(arg, "man")) |
Line 1083 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
Line 1109 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
{ |
{ |
const char *mparse_msg; |
const char *mparse_msg; |
|
|
fprintf(stderr, "%s: %s:", getprogname(), |
fprintf(mmsg_stream, "%s: %s:", getprogname(), |
file == NULL ? "<stdin>" : file); |
file == NULL ? "<stdin>" : file); |
|
|
if (line) |
if (line) |
fprintf(stderr, "%d:%d:", line, col + 1); |
fprintf(mmsg_stream, "%d:%d:", line, col + 1); |
|
|
fprintf(stderr, " %s", |
fprintf(mmsg_stream, " %s", mparse_strlevel(lvl)); |
t < MANDOCERR_STYLE ? "BASE" : mparse_strlevel(lvl)); |
|
|
|
if ((mparse_msg = mparse_strerror(t)) != NULL) |
if ((mparse_msg = mparse_strerror(t)) != NULL) |
fprintf(stderr, ": %s", mparse_msg); |
fprintf(mmsg_stream, ": %s", mparse_msg); |
|
|
if (msg) |
if (msg) |
fprintf(stderr, ": %s", msg); |
fprintf(mmsg_stream, ": %s", msg); |
|
|
fputc('\n', stderr); |
fputc('\n', mmsg_stream); |
} |
} |
|
|
static pid_t |
static pid_t |
Line 1171 spawn_pager(struct tag_files *tag_files) |
|
Line 1196 spawn_pager(struct tag_files *tag_files) |
|
if (dup2(tag_files->ofd, STDOUT_FILENO) == -1) |
if (dup2(tag_files->ofd, STDOUT_FILENO) == -1) |
err((int)MANDOCLEVEL_SYSERR, "pager stdout"); |
err((int)MANDOCLEVEL_SYSERR, "pager stdout"); |
close(tag_files->ofd); |
close(tag_files->ofd); |
close(tag_files->tfd); |
assert(tag_files->tfd == -1); |
|
|
/* Do not start the pager before controlling the terminal. */ |
/* Do not start the pager before controlling the terminal. */ |
|
|