]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
Add *.gz support to apropos(1) -a, man(1), and even mandoc(1).
[mandoc.git] / mandocdb.c
index e1c744d736aae67b94b5f4ac2b5935a4ed7a2bbd..492f9ee813441109c4939f05dfd9d676fd9d9395 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD$ */
+/*     $Id: mandocdb.c,v 1.162 2014/09/03 23:21:47 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -17,8 +17,8 @@
  */
 #include "config.h"
 
-#include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/wait.h>
 
 #include <assert.h>
@@ -1076,7 +1076,6 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
 {
        char                     any[] = "any";
        struct ohash_info        str_info;
-       int                      fd[2];
        struct mpage            *mpage, *mpage_dest;
        struct mlink            *mlink, *mlink_dest;
        struct mdoc             *mdoc;
@@ -1084,7 +1083,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
        char                    *sodest;
        char                    *cp;
        pid_t                    child_pid;
-       int                      status;
+       int                      fd;
        unsigned int             pslot;
        enum mandoclevel         lvl;
 
@@ -1112,38 +1111,11 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
                man = NULL;
                sodest = NULL;
                child_pid = 0;
-               fd[0] = -1;
-               fd[1] = -1;
-
-               if (mpage->mlinks->gzip) {
-                       if (-1 == pipe(fd)) {
-                               exitcode = (int)MANDOCLEVEL_SYSERR;
-                               say(mpage->mlinks->file, "&pipe gunzip");
-                               goto nextpage;
-                       }
-                       switch (child_pid = fork()) {
-                       case -1:
-                               exitcode = (int)MANDOCLEVEL_SYSERR;
-                               say(mpage->mlinks->file, "&fork gunzip");
-                               child_pid = 0;
-                               close(fd[1]);
-                               close(fd[0]);
-                               goto nextpage;
-                       case 0:
-                               close(fd[0]);
-                               if (-1 == dup2(fd[1], STDOUT_FILENO)) {
-                                       say(mpage->mlinks->file,
-                                           "&dup gunzip");
-                                       exit(1);
-                               }
-                               execlp("gunzip", "gunzip", "-c",
-                                   mpage->mlinks->file, NULL);
-                               say(mpage->mlinks->file, "&exec gunzip");
-                               exit(1);
-                       default:
-                               close(fd[1]);
-                               break;
-                       }
+
+               mparse_open(mp, &fd, mpage->mlinks->file, &child_pid);
+               if (fd == -1) {
+                       say(mpage->mlinks->file, "&open");
+                       goto nextpage;
                }
 
                /*
@@ -1153,7 +1125,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
                 */
                if (FORM_CAT != mpage->mlinks->dform ||
                    FORM_CAT != mpage->mlinks->fform) {
-                       lvl = mparse_readfd(mp, fd[0], mpage->mlinks->file);
+                       lvl = mparse_readfd(mp, fd, mpage->mlinks->file);
                        if (lvl < MANDOCLEVEL_FATAL)
                                mparse_result(mp, &mdoc, &man, &sodest);
                }
@@ -1245,7 +1217,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
                } else if (NULL != man)
                        parse_man(mpage, man_node(man));
                else
-                       parse_cat(mpage, fd[0]);
+                       parse_cat(mpage, fd);
                if (NULL == mpage->desc)
                        mpage->desc = mandoc_strdup(mpage->mlinks->name);
 
@@ -1257,21 +1229,10 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
                dbadd(mpage, mc);
 
 nextpage:
-               if (child_pid) {
-                       if (-1 == waitpid(child_pid, &status, 0)) {
-                               exitcode = (int)MANDOCLEVEL_SYSERR;
-                               say(mpage->mlinks->file, "&wait gunzip");
-                       } else if (WIFSIGNALED(status)) {
-                               exitcode = (int)MANDOCLEVEL_SYSERR;
-                               say(mpage->mlinks->file,
-                                   "gunzip died from signal %d",
-                                   WTERMSIG(status));
-                       } else if (WEXITSTATUS(status)) {
-                               exitcode = (int)MANDOCLEVEL_SYSERR;
-                               say(mpage->mlinks->file,
-                                   "gunzip failed with code %d",
-                                   WEXITSTATUS(status));
-                       }
+               if (child_pid &&
+                   mparse_wait(mp, child_pid) != MANDOCLEVEL_OK) {
+                       exitcode = (int)MANDOCLEVEL_SYSERR;
+                       say(mpage->mlinks->file, "&wait gunzip");
                }
                ohash_delete(&strings);
                ohash_delete(&names);
@@ -2351,7 +2312,7 @@ prepare_statements:
            "PRAGMA synchronous = OFF", NULL, NULL, NULL)) {
                exitcode = (int)MANDOCLEVEL_SYSERR;
                say(MANDOC_DB, "PRAGMA synchronous: %s",
-               sqlite3_errmsg(db));
+                   sqlite3_errmsg(db));
                sqlite3_close(db);
                return(0);
        }