aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/main.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-09-03 23:21:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-09-03 23:21:47 +0000
commita828d911328c6ac46d0f8c2f2d99e9f0bb46e21d (patch)
tree2e2600805b20efd2527183ad36ab9f087484bdb9 /main.c
parent248398820acb6a81f0d92b7a33dc1e449dda483b (diff)
downloadmandoc-a828d911328c6ac46d0f8c2f2d99e9f0bb46e21d.tar.gz
mandoc-a828d911328c6ac46d0f8c2f2d99e9f0bb46e21d.tar.zst
mandoc-a828d911328c6ac46d0f8c2f2d99e9f0bb46e21d.zip
Add *.gz support to apropos(1) -a, man(1), and even mandoc(1).
Implemented by moving the zip code from makewhatis(8) to the parser lib.
Diffstat (limited to 'main.c')
-rw-r--r--main.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/main.c b/main.c
index 5e596603..620cd6c1 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.191 2014/09/03 18:09:14 schwarze Exp $ */
+/* $Id: main.c,v 1.192 2014/09/03 23:21:47 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -87,7 +87,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 enum mandoclevel passthrough(const char *);
+static enum mandoclevel passthrough(const char *, int);
static void spawn_pager(void);
static int toptions(struct curparse *, char *);
static void usage(enum argmode) __attribute__((noreturn));
@@ -114,6 +114,8 @@ main(int argc, char *argv[])
#endif
enum mandoclevel rc;
enum outmode outmode;
+ pid_t child_pid;
+ int fd;
int show_usage;
int use_pager;
int options;
@@ -370,16 +372,30 @@ main(int argc, char *argv[])
while (argc) {
#if HAVE_SQLITE3
if (resp != NULL) {
- if (resp->form & FORM_SRC) {
+ rc = mparse_open(curp.mp, &fd, resp->file,
+ &child_pid);
+ if (fd == -1)
+ /* nothing */;
+ else if (resp->form & FORM_SRC) {
/* For .so only; ignore failure. */
chdir(paths.paths[resp->ipath]);
- parse(&curp, -1, resp->file, &rc);
+ parse(&curp, fd, resp->file, &rc);
} else
- rc = passthrough(resp->file);
+ rc = passthrough(resp->file, fd);
resp++;
} else
#endif
- parse(&curp, -1, *argv++, &rc);
+ {
+ rc = mparse_open(curp.mp, &fd, *argv++,
+ &child_pid);
+ if (fd != -1)
+ parse(&curp, fd, argv[-1], &rc);
+ }
+
+ if (child_pid &&
+ mparse_wait(curp.mp, child_pid) != MANDOCLEVEL_OK)
+ rc = MANDOCLEVEL_SYSERR;
+
if (MANDOCLEVEL_OK != rc && curp.wstop)
break;
argc--;
@@ -555,18 +571,11 @@ parse(struct curparse *curp, int fd, const char *file,
}
static enum mandoclevel
-passthrough(const char *file)
+passthrough(const char *file, int fd)
{
char buf[BUFSIZ];
const char *syscall;
ssize_t nr, nw, off;
- int fd;
-
- fd = open(file, O_RDONLY);
- if (fd == -1) {
- syscall = "open";
- goto fail;
- }
while ((nr = read(fd, buf, BUFSIZ)) != -1 && nr != 0)
for (off = 0; off < nr; off += nw)