version 1.276, 2016/09/18 15:22:08 |
version 1.280, 2017/01/27 13:47:10 |
|
|
/* $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 123 main(int argc, char *argv[]) |
|
Line 123 main(int argc, char *argv[]) |
|
struct manpage *res, *resp; |
struct manpage *res, *resp; |
char *conf_file, *defpaths; |
char *conf_file, *defpaths; |
const char *sec; |
const char *sec; |
|
const char *thisarg; |
size_t i, sz; |
size_t i, sz; |
int prio, best_prio; |
int prio, best_prio; |
enum outmode outmode; |
enum outmode outmode; |
Line 247 main(int argc, char *argv[]) |
|
Line 248 main(int argc, char *argv[]) |
|
break; |
break; |
case 'O': |
case 'O': |
search.outkey = optarg; |
search.outkey = optarg; |
while (optarg != NULL) |
while (optarg != NULL) { |
manconf_output(&conf.output, |
thisarg = optarg; |
strsep(&optarg, ",")); |
if (manconf_output(&conf.output, |
|
strsep(&optarg, ","), 0) == 0) |
|
continue; |
|
warnx("-O %s: Bad argument", thisarg); |
|
return (int)MANDOCLEVEL_BADARG; |
|
} |
break; |
break; |
case 'S': |
case 'S': |
search.arch = optarg; |
search.arch = optarg; |
|
|
|
|
/* 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 781 parse(struct curparse *curp, int fd, const char *file) |
|
Line 787 parse(struct curparse *curp, int fd, const char *file) |
|
break; |
break; |
} |
} |
} |
} |
|
mparse_updaterc(curp->mp, &rc); |
} |
} |
|
|
static void |
static void |
Line 820 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 827 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 832 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 845 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 847 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 862 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 1065 spawn_pager(struct tag_files *tag_files) |
|
Line 1082 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 1083 spawn_pager(struct tag_files *tag_files) |
|
Line 1100 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); |