aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/main.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-08-22 04:52:55 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-08-22 04:52:55 +0000
commit743625d0a2ab57f1df38ea2dd5d5822e3ab95d38 (patch)
tree8f82ce76a750f91e39b1f4b6f71961d26503299d /main.c
parentd9b8d132cdb084ba9070449dea785f3aab99c335 (diff)
downloadmandoc-743625d0a2ab57f1df38ea2dd5d5822e3ab95d38.tar.gz
mandoc-743625d0a2ab57f1df38ea2dd5d5822e3ab95d38.tar.zst
mandoc-743625d0a2ab57f1df38ea2dd5d5822e3ab95d38.zip
implement MANPAGER and PAGER
Diffstat (limited to 'main.c')
-rw-r--r--main.c60
1 files changed, 49 insertions, 11 deletions
diff --git a/main.c b/main.c
index 924eddd3..adf3d0ff 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.183 2014/08/22 03:42:18 schwarze Exp $ */
+/* $Id: main.c,v 1.184 2014/08/22 04:52:55 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -637,7 +637,12 @@ mmsg(enum mandocerr t, enum mandoclevel lvl,
static 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) {
fprintf(stderr, "%s: pipe: %s\n",
@@ -659,15 +664,48 @@ spawn_pager(void)
}
return;
default:
- close(fildes[1]);
- if (dup2(fildes[0], STDIN_FILENO) == -1) {
- fprintf(stderr, "%s: dup input: %s\n",
- progname, strerror(errno));
- } else {
- execlp("more", "more", "-s", NULL);
- fprintf(stderr, "%s: exec: %s\n",
- progname, strerror(errno));
- }
+ break;
+ }
+
+ /* The original process becomes the pager. */
+
+ close(fildes[1]);
+ if (dup2(fildes[0], STDIN_FILENO) == -1) {
+ fprintf(stderr, "%s: dup input: %s\n",
+ progname, strerror(errno));
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);
}