diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-09-03 23:21:47 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-09-03 23:21:47 +0000 |
commit | a828d911328c6ac46d0f8c2f2d99e9f0bb46e21d (patch) | |
tree | 2e2600805b20efd2527183ad36ab9f087484bdb9 /main.c | |
parent | 248398820acb6a81f0d92b7a33dc1e449dda483b (diff) | |
download | mandoc-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.c | 37 |
1 files changed, 23 insertions, 14 deletions
@@ -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) |