aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/main.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-08-22 03:42:18 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-08-22 03:42:18 +0000
commitd9b8d132cdb084ba9070449dea785f3aab99c335 (patch)
treed88359b923e814a0af936b9fb1472481c7d1557d /main.c
parenta42f210a473e732d8b21465b45c0c5e09d2144e8 (diff)
downloadmandoc-d9b8d132cdb084ba9070449dea785f3aab99c335.tar.gz
mandoc-d9b8d132cdb084ba9070449dea785f3aab99c335.tar.zst
mandoc-d9b8d132cdb084ba9070449dea785f3aab99c335.zip
mandoc -a, man, apropos -a, whatis -a now paginate by default
but provide an option -c to not paginate; taking inspiration from manpage.c, hence adding (c) 2012 kristaps@
Diffstat (limited to 'main.c')
-rw-r--r--main.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/main.c b/main.c
index b36bc899..924eddd3 100644
--- a/main.c
+++ b/main.c
@@ -1,6 +1,6 @@
-/* $Id: main.c,v 1.182 2014/08/21 00:32:15 schwarze Exp $ */
+/* $Id: main.c,v 1.183 2014/08/22 03:42:18 schwarze Exp $ */
/*
- * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2014 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
*
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <assert.h>
+#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
@@ -84,6 +85,7 @@ static void mmsg(enum mandocerr, enum mandoclevel,
const char *, int, int, const char *);
static void parse(struct curparse *, int,
const char *, enum mandoclevel *);
+static void spawn_pager(void);
static int toptions(struct curparse *, char *);
static void usage(enum argmode) __attribute__((noreturn));
static void version(void) __attribute__((noreturn));
@@ -111,6 +113,7 @@ main(int argc, char *argv[])
enum mandoclevel rc;
enum outmode outmode;
int show_usage;
+ int use_pager;
int options;
int c;
@@ -145,9 +148,11 @@ main(int argc, char *argv[])
options = MPARSE_SO;
defos = NULL;
+ use_pager = 1;
show_usage = 0;
outmode = OUTMODE_DEF;
- while (-1 != (c = getopt(argc, argv, "aC:fI:ikM:m:O:S:s:T:VW:w"))) {
+
+ while (-1 != (c = getopt(argc, argv, "aC:cfI:ikM:m:O:S:s:T:VW:w"))) {
switch (c) {
case 'a':
outmode = OUTMODE_ALL;
@@ -155,6 +160,9 @@ main(int argc, char *argv[])
case 'C':
conf_file = optarg;
break;
+ case 'c':
+ use_pager = 0;
+ break;
case 'f':
search.argmode = ARG_WORD;
break;
@@ -223,6 +231,7 @@ main(int argc, char *argv[])
switch (search.argmode) {
case ARG_FILE:
outmode = OUTMODE_ALL;
+ use_pager = 0;
break;
case ARG_NAME:
outmode = OUTMODE_ONE;
@@ -319,6 +328,9 @@ main(int argc, char *argv[])
if ( ! moptions(&options, auxpaths))
return((int)MANDOCLEVEL_BADARG);
+ if (use_pager && isatty(STDOUT_FILENO))
+ spawn_pager();
+
curp.mp = mparse_alloc(options, curp.wlevel, mmsg, defos);
/*
@@ -621,3 +633,41 @@ mmsg(enum mandocerr t, enum mandoclevel lvl,
fputc('\n', stderr);
}
+
+static void
+spawn_pager(void)
+{
+ int fildes[2];
+
+ if (pipe(fildes) == -1) {
+ fprintf(stderr, "%s: pipe: %s\n",
+ progname, strerror(errno));
+ return;
+ }
+
+ switch (fork()) {
+ case -1:
+ fprintf(stderr, "%s: fork: %s\n",
+ progname, strerror(errno));
+ exit((int)MANDOCLEVEL_SYSERR);
+ case 0:
+ close(fildes[0]);
+ if (dup2(fildes[1], STDOUT_FILENO) == -1) {
+ fprintf(stderr, "%s: dup output: %s\n",
+ progname, strerror(errno));
+ exit((int)MANDOCLEVEL_SYSERR);
+ }
+ 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));
+ }
+ exit((int)MANDOCLEVEL_SYSERR);
+ }
+}