]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
If a manual page is installed gzip(1)ed, let makewhatis(8) take
[mandoc.git] / mandocdb.c
index d27620952da2937f23b9790f2a4a743de7af97ff..e1c744d736aae67b94b5f4ac2b5935a4ed7a2bbd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandocdb.c,v 1.156 2014/08/10 23:54:41 schwarze Exp $ */
+/*     $OpenBSD$ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
+#if HAVE_FTS
 #include <fts.h>
+#else
+#include "compat_fts.h"
+#endif
 #include <getopt.h>
 #include <limits.h>
 #include <stddef.h>
@@ -35,7 +39,7 @@
 #include <string.h>
 #include <unistd.h>
 
-#ifdef HAVE_OHASH
+#if HAVE_OHASH
 #include <ohash.h>
 #else
 #include "compat_ohash.h"
@@ -79,12 +83,6 @@ enum op {
        OP_TEST /* change no databases, report potential problems */
 };
 
-enum   form {
-       FORM_NONE,  /* format is unknown */
-       FORM_SRC,   /* format is -man or -mdoc */
-       FORM_CAT    /* format is cat */
-};
-
 struct str {
        char            *rendered; /* key in UTF-8 or ASCII form */
        const struct mpage *mpage; /* if set, the owning parse */
@@ -100,24 +98,24 @@ struct     inodev {
 struct mpage {
        struct inodev    inodev;  /* used for hashing routine */
        int64_t          pageid;  /* pageid in mpages SQL table */
-       enum form        form;    /* format from file content */
        char            *sec;     /* section from file content */
        char            *arch;    /* architecture from file content */
        char            *title;   /* title from file content */
        char            *desc;    /* description from file content */
        struct mlink    *mlinks;  /* singly linked list */
+       int              form;    /* format from file content */
 };
 
 struct mlink {
        char             file[PATH_MAX]; /* filename rel. to manpath */
-       enum form        dform;   /* format from directory */
-       enum form        fform;   /* format from file name suffix */
        char            *dsec;    /* section from directory */
        char            *arch;    /* architecture from directory */
        char            *name;    /* name from file name (not empty) */
        char            *fsec;    /* section from file name suffix */
        struct mlink    *next;    /* singly linked list */
        struct mpage    *mpage;   /* parent */
+       int              dform;   /* format from directory */
+       int              fform;   /* format from file name suffix */
        int              gzip;    /* filename has a .gz suffix */
 };
 
@@ -834,6 +832,7 @@ filescan(const char *file)
        }
 
        mlink = mandoc_calloc(1, sizeof(struct mlink));
+       mlink->dform = FORM_NONE;
        if (strlcpy(mlink->file, start, sizeof(mlink->file)) >=
            sizeof(mlink->file)) {
                say(start, "Filename too long");
@@ -1222,6 +1221,8 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
                        mpage->title =
                            mandoc_strdup(mpage->mlinks->name);
                }
+               if (mpage->mlinks->gzip)
+                       mpage->form |= FORM_GZ;
                putkey(mpage, mpage->sec, TYPE_sec);
                putkey(mpage, '\0' == *mpage->arch ?
                    any : mpage->arch, TYPE_arch);
@@ -1328,6 +1329,8 @@ parse_cat(struct mpage *mpage, int fd)
            fopen(mpage->mlinks->file, "r") :
            fdopen(fd, "r");
        if (NULL == stream) {
+               if (-1 != fd)
+                       close(fd);
                if (warnings)
                        say(mpage->mlinks->file, "&fopen");
                return;
@@ -1978,6 +1981,13 @@ dbadd_mlink(const struct mlink *mlink)
        SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid);
        SQL_STEP(stmts[STMT_INSERT_LINK]);
        sqlite3_reset(stmts[STMT_INSERT_LINK]);
+
+       i = 1;
+       SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, NAME_FILE);
+       SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, mlink->name);
+       SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mlink->mpage->pageid);
+       SQL_STEP(stmts[STMT_INSERT_NAME]);
+       sqlite3_reset(stmts[STMT_INSERT_NAME]);
 }
 
 /*
@@ -2044,7 +2054,7 @@ dbadd(struct mpage *mpage, struct mchars *mc)
 
        i = 1;
        SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, key->rendered);
-       SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form);
+       SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, mpage->form);
        SQL_STEP(stmts[STMT_INSERT_PAGE]);
        mpage->pageid = sqlite3_last_insert_rowid(db);
        sqlite3_reset(stmts[STMT_INSERT_PAGE]);