version 1.273, 2016/07/19 13:36:13 |
version 1.273.2.4, 2017/01/09 17:57:15 |
|
|
/* $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-2016 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010-2012, 2014-2017 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 |
Line 97 static int koptions(int *, char *); |
|
Line 97 static int koptions(int *, char *); |
|
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 *); |
|
static void outdata_alloc(struct curparse *); |
static void parse(struct curparse *, int, const char *); |
static void parse(struct curparse *, int, const char *); |
static void passthrough(const char *, int, int); |
static void passthrough(const char *, int, int); |
static pid_t spawn_pager(struct tag_files *); |
static pid_t spawn_pager(struct tag_files *); |
Line 482 main(int argc, char *argv[]) |
|
Line 483 main(int argc, char *argv[]) |
|
passthrough(resp->file, fd, |
passthrough(resp->file, fd, |
conf.output.synopsisonly); |
conf.output.synopsisonly); |
|
|
if (argc > 1 && curp.outtype <= OUTT_UTF8) |
if (argc > 1 && curp.outtype <= OUTT_UTF8) { |
|
if (curp.outdata == NULL) |
|
outdata_alloc(&curp); |
terminal_sepline(curp.outdata); |
terminal_sepline(curp.outdata); |
|
} |
} else if (rc < MANDOCLEVEL_ERROR) |
} else if (rc < MANDOCLEVEL_ERROR) |
rc = MANDOCLEVEL_ERROR; |
rc = MANDOCLEVEL_ERROR; |
|
|
|
|
|
|
/* Stop here until moved to the foreground. */ |
/* Stop here until moved to the foreground. */ |
|
|
tc_pgid = tcgetpgrp(STDIN_FILENO); |
tc_pgid = tcgetpgrp(tag_files->ofd); |
if (tc_pgid != man_pgid) { |
if (tc_pgid != man_pgid) { |
if (tc_pgid == pager_pid) { |
if (tc_pgid == pager_pid) { |
(void)tcsetpgrp(STDIN_FILENO, |
(void)tcsetpgrp(tag_files->ofd, |
man_pgid); |
man_pgid); |
if (signum == SIGTTIN) |
if (signum == SIGTTIN) |
continue; |
continue; |
|
|
/* Once in the foreground, activate the pager. */ |
/* Once in the foreground, activate the pager. */ |
|
|
if (pager_pid) { |
if (pager_pid) { |
(void)tcsetpgrp(STDIN_FILENO, pager_pid); |
(void)tcsetpgrp(tag_files->ofd, pager_pid); |
kill(pager_pid, SIGCONT); |
kill(pager_pid, SIGCONT); |
} else |
} else |
pager_pid = spawn_pager(tag_files); |
pager_pid = spawn_pager(tag_files); |
Line 743 parse(struct curparse *curp, int fd, const char *file) |
|
Line 747 parse(struct curparse *curp, int fd, const char *file) |
|
if (rctmp != MANDOCLEVEL_OK && curp->wstop) |
if (rctmp != MANDOCLEVEL_OK && curp->wstop) |
return; |
return; |
|
|
/* If unset, allocate output dev now (if applicable). */ |
if (curp->outdata == NULL) |
|
outdata_alloc(curp); |
|
|
if (curp->outdata == NULL) { |
|
switch (curp->outtype) { |
|
case OUTT_HTML: |
|
curp->outdata = html_alloc(curp->outopts); |
|
break; |
|
case OUTT_UTF8: |
|
curp->outdata = utf8_alloc(curp->outopts); |
|
break; |
|
case OUTT_LOCALE: |
|
curp->outdata = locale_alloc(curp->outopts); |
|
break; |
|
case OUTT_ASCII: |
|
curp->outdata = ascii_alloc(curp->outopts); |
|
break; |
|
case OUTT_PDF: |
|
curp->outdata = pdf_alloc(curp->outopts); |
|
break; |
|
case OUTT_PS: |
|
curp->outdata = ps_alloc(curp->outopts); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
|
mparse_result(curp->mp, &man, NULL); |
mparse_result(curp->mp, &man, NULL); |
|
|
/* Execute the out device, if it exists. */ |
/* Execute the out device, if it exists. */ |
Line 822 parse(struct curparse *curp, int fd, const char *file) |
|
Line 802 parse(struct curparse *curp, int fd, const char *file) |
|
break; |
break; |
} |
} |
} |
} |
|
mparse_updaterc(curp->mp, &rc); |
} |
} |
|
|
static void |
static void |
|
outdata_alloc(struct curparse *curp) |
|
{ |
|
switch (curp->outtype) { |
|
case OUTT_HTML: |
|
curp->outdata = html_alloc(curp->outopts); |
|
break; |
|
case OUTT_UTF8: |
|
curp->outdata = utf8_alloc(curp->outopts); |
|
break; |
|
case OUTT_LOCALE: |
|
curp->outdata = locale_alloc(curp->outopts); |
|
break; |
|
case OUTT_ASCII: |
|
curp->outdata = ascii_alloc(curp->outopts); |
|
break; |
|
case OUTT_PDF: |
|
curp->outdata = pdf_alloc(curp->outopts); |
|
break; |
|
case OUTT_PS: |
|
curp->outdata = ps_alloc(curp->outopts); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
|
static void |
passthrough(const char *file, int fd, int synopsis_only) |
passthrough(const char *file, int fd, int synopsis_only) |
{ |
{ |
const char synb[] = "S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS"; |
const char synb[] = "S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS"; |
Line 834 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 842 passthrough(const char *file, int fd, int synopsis_onl |
|
const char *syscall; |
const char *syscall; |
char *line, *cp; |
char *line, *cp; |
size_t linesz; |
size_t linesz; |
|
ssize_t len, written; |
int print; |
int print; |
|
|
line = NULL; |
line = NULL; |
linesz = 0; |
linesz = 0; |
|
|
|
if (fflush(stdout) == EOF) { |
|
syscall = "fflush"; |
|
goto fail; |
|
} |
|
|
if ((stream = fdopen(fd, "r")) == NULL) { |
if ((stream = fdopen(fd, "r")) == NULL) { |
close(fd); |
close(fd); |
syscall = "fdopen"; |
syscall = "fdopen"; |
Line 846 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 860 passthrough(const char *file, int fd, int synopsis_onl |
|
} |
} |
|
|
print = 0; |
print = 0; |
while (getline(&line, &linesz, stream) != -1) { |
while ((len = getline(&line, &linesz, stream)) != -1) { |
cp = line; |
cp = line; |
if (synopsis_only) { |
if (synopsis_only) { |
if (print) { |
if (print) { |
if ( ! isspace((unsigned char)*cp)) |
if ( ! isspace((unsigned char)*cp)) |
goto done; |
goto done; |
while (isspace((unsigned char)*cp)) |
while (isspace((unsigned char)*cp)) { |
cp++; |
cp++; |
|
len--; |
|
} |
} else { |
} else { |
if (strcmp(cp, synb) == 0 || |
if (strcmp(cp, synb) == 0 || |
strcmp(cp, synr) == 0) |
strcmp(cp, synr) == 0) |
Line 861 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 877 passthrough(const char *file, int fd, int synopsis_onl |
|
continue; |
continue; |
} |
} |
} |
} |
if (fputs(cp, stdout)) { |
for (; len > 0; len -= written) { |
|
if ((written = write(STDOUT_FILENO, cp, len)) != -1) |
|
continue; |
fclose(stream); |
fclose(stream); |
syscall = "fputs"; |
syscall = "write"; |
goto fail; |
goto fail; |
} |
} |
} |
} |
Line 1006 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
Line 1024 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 1078 spawn_pager(struct tag_files *tag_files) |
|
Line 1097 spawn_pager(struct tag_files *tag_files) |
|
break; |
break; |
default: |
default: |
(void)setpgid(pager_pid, 0); |
(void)setpgid(pager_pid, 0); |
(void)tcsetpgrp(STDIN_FILENO, pager_pid); |
(void)tcsetpgrp(tag_files->ofd, pager_pid); |
#if HAVE_PLEDGE |
#if HAVE_PLEDGE |
if (pledge("stdio rpath tmppath tty proc", NULL) == -1) |
if (pledge("stdio rpath tmppath tty proc", NULL) == -1) |
err((int)MANDOCLEVEL_SYSERR, "pledge"); |
err((int)MANDOCLEVEL_SYSERR, "pledge"); |
Line 1096 spawn_pager(struct tag_files *tag_files) |
|
Line 1115 spawn_pager(struct tag_files *tag_files) |
|
|
|
/* Do not start the pager before controlling the terminal. */ |
/* Do not start the pager before controlling the terminal. */ |
|
|
while (tcgetpgrp(STDIN_FILENO) != getpid()) |
while (tcgetpgrp(STDOUT_FILENO) != getpid()) |
nanosleep(&timeout, NULL); |
nanosleep(&timeout, NULL); |
|
|
execvp(argv[0], argv); |
execvp(argv[0], argv); |