version 1.183, 2014/08/22 03:42:18 |
version 1.185, 2014/08/22 18:07:15 |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <assert.h> |
#include <assert.h> |
|
#include <ctype.h> |
#include <errno.h> |
#include <errno.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdint.h> |
#include <stdint.h> |
Line 227 main(int argc, char *argv[]) |
|
Line 228 main(int argc, char *argv[]) |
|
if (show_usage) |
if (show_usage) |
usage(search.argmode); |
usage(search.argmode); |
|
|
|
/* Postprocess options. */ |
|
|
if (outmode == OUTMODE_DEF) { |
if (outmode == OUTMODE_DEF) { |
switch (search.argmode) { |
switch (search.argmode) { |
case ARG_FILE: |
case ARG_FILE: |
Line 242 main(int argc, char *argv[]) |
|
Line 245 main(int argc, char *argv[]) |
|
} |
} |
} |
} |
|
|
|
/* Parse arguments. */ |
|
|
argc -= optind; |
argc -= optind; |
argv += optind; |
argv += optind; |
#if HAVE_SQLITE3 |
#if HAVE_SQLITE3 |
auxargv = NULL; |
auxargv = NULL; |
#endif |
#endif |
|
|
|
/* Quirk for a man(1) section argument without -s. */ |
|
|
|
if (search.argmode == ARG_NAME && |
|
argv[0] != NULL && |
|
isdigit((unsigned char)argv[0][0]) && |
|
(argv[0][1] == '\0' || !strcmp(argv[0], "3p"))) { |
|
search.sec = argv[0]; |
|
argv++; |
|
argc--; |
|
} |
|
|
rc = MANDOCLEVEL_OK; |
rc = MANDOCLEVEL_OK; |
|
|
/* man(1), whatis(1), apropos(1) */ |
/* man(1), whatis(1), apropos(1) */ |
Line 637 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
Line 653 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
static void |
static void |
spawn_pager(void) |
spawn_pager(void) |
{ |
{ |
int fildes[2]; |
#define MAX_PAGER_ARGS 16 |
|
char *argv[MAX_PAGER_ARGS]; |
|
const char *pager; |
|
char *cp; |
|
int fildes[2]; |
|
int argc; |
|
|
if (pipe(fildes) == -1) { |
if (pipe(fildes) == -1) { |
fprintf(stderr, "%s: pipe: %s\n", |
fprintf(stderr, "%s: pipe: %s\n", |
Line 659 spawn_pager(void) |
|
Line 680 spawn_pager(void) |
|
} |
} |
return; |
return; |
default: |
default: |
close(fildes[1]); |
break; |
if (dup2(fildes[0], STDIN_FILENO) == -1) { |
} |
fprintf(stderr, "%s: dup input: %s\n", |
|
progname, strerror(errno)); |
/* The original process becomes the pager. */ |
} else { |
|
execlp("more", "more", "-s", NULL); |
close(fildes[1]); |
fprintf(stderr, "%s: exec: %s\n", |
if (dup2(fildes[0], STDIN_FILENO) == -1) { |
progname, strerror(errno)); |
fprintf(stderr, "%s: dup input: %s\n", |
} |
progname, strerror(errno)); |
exit((int)MANDOCLEVEL_SYSERR); |
exit((int)MANDOCLEVEL_SYSERR); |
} |
} |
|
|
|
pager = getenv("MANPAGER"); |
|
if (pager == NULL || *pager == '\0') |
|
pager = getenv("PAGER"); |
|
if (pager == NULL || *pager == '\0') |
|
pager = "/usr/bin/more -s"; |
|
cp = mandoc_strdup(pager); |
|
|
|
/* |
|
* Parse the pager command into words. |
|
* Intentionally do not do anything fancy here. |
|
*/ |
|
|
|
argc = 0; |
|
while (argc + 1 < MAX_PAGER_ARGS) { |
|
argv[argc++] = cp; |
|
cp = strchr(cp, ' '); |
|
if (cp == NULL) |
|
break; |
|
*cp++ = '\0'; |
|
while (*cp == ' ') |
|
cp++; |
|
if (*cp == '\0') |
|
break; |
|
} |
|
argv[argc] = NULL; |
|
|
|
/* Hand over to the pager. */ |
|
|
|
execvp(argv[0], argv); |
|
fprintf(stderr, "%s: exec: %s\n", |
|
progname, strerror(errno)); |
|
exit((int)MANDOCLEVEL_SYSERR); |
} |
} |