]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocdb.c
add missing prototypes, no code change;
[mandoc.git] / mandocdb.c
index cb99451f8393e86711b6ddbc56ad2e3a0117a5ac..d5052db91a4a393b75cb2d4c1fe5d379373886a4 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mandocdb.c,v 1.208 2015/11/07 14:22:29 schwarze Exp $ */
+/*     $Id: mandocdb.c,v 1.219 2016/07/15 18:03:45 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
 #else
 #include "compat_fts.h"
 #endif
-#include <getopt.h>
 #include <limits.h>
+#if HAVE_SANDBOX_INIT
+#include <sandbox.h>
+#endif
 #include <stddef.h>
 #include <stdio.h>
 #include <stdint.h>
@@ -137,6 +139,9 @@ struct      mdoc_handler {
        uint64_t         mask;  /* set unless handler returns 0 */
 };
 
+
+int             mandocdb(int, char *[]);
+
 static void     dbclose(int);
 static void     dbadd(struct mpage *);
 static void     dbadd_mlink(const struct mlink *mlink);
@@ -156,8 +161,6 @@ static      void     parse_man(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static void     parse_mdoc(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
-static int      parse_mdoc_body(struct mpage *, const struct roff_meta *,
-                       const struct roff_node *);
 static int      parse_mdoc_head(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static int      parse_mdoc_Fd(struct mpage *, const struct roff_meta *,
@@ -173,6 +176,8 @@ static      int      parse_mdoc_Nm(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static int      parse_mdoc_Sh(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
+static int      parse_mdoc_Va(struct mpage *, const struct roff_meta *,
+                       const struct roff_node *);
 static int      parse_mdoc_Xr(struct mpage *, const struct roff_meta *,
                        const struct roff_node *);
 static void     putkey(const struct mpage *, char *, uint64_t);
@@ -242,8 +247,8 @@ static      const struct mdoc_handler mdocs[MDOC_MAX] = {
        { NULL, TYPE_Pa },  /* Pa */
        { NULL, 0 },  /* Rv */
        { NULL, TYPE_St },  /* St */
-       { NULL, TYPE_Va },  /* Va */
-       { parse_mdoc_body, TYPE_Va },  /* Vt */
+       { parse_mdoc_Va, TYPE_Va },  /* Va */
+       { parse_mdoc_Va, TYPE_Vt },  /* Vt */
        { parse_mdoc_Xr, 0 },  /* Xr */
        { NULL, 0 },  /* %A */
        { NULL, 0 },  /* %B */
@@ -341,7 +346,14 @@ mandocdb(int argc, char *argv[])
 
 #if HAVE_PLEDGE
        if (pledge("stdio rpath wpath cpath fattr flock proc exec", NULL) == -1) {
-               perror("pledge");
+               warn("pledge");
+               return (int)MANDOCLEVEL_SYSERR;
+       }
+#endif
+
+#if HAVE_SANDBOX_INIT
+       if (sandbox_init(kSBXProfileNoInternet, SANDBOX_NAMED, NULL) == -1) {
+               warnx("sandbox_init");
                return (int)MANDOCLEVEL_SYSERR;
        }
 #endif
@@ -420,9 +432,11 @@ mandocdb(int argc, char *argv[])
        argv += optind;
 
 #if HAVE_PLEDGE
-       if (nodb && pledge("stdio rpath", NULL) == -1) {
-               perror("pledge");
-               return (int)MANDOCLEVEL_SYSERR;
+       if (nodb) {
+               if (pledge("stdio rpath", NULL) == -1) {
+                       warn("pledge");
+                       return (int)MANDOCLEVEL_SYSERR;
+               }
        }
 #endif
 
@@ -452,11 +466,12 @@ mandocdb(int argc, char *argv[])
                         * all files specified on the command-line.
                         */
 #if HAVE_PLEDGE
-                       if (!nodb && pledge("stdio rpath wpath cpath fattr flock",
-                           NULL) == -1) {
-                               perror("pledge");
-                               exitcode = (int)MANDOCLEVEL_SYSERR;
-                               goto out;
+                       if (!nodb) {
+                               if (pledge("stdio rpath wpath cpath fattr flock", NULL) == -1) {
+                                       warn("pledge");
+                                       exitcode = (int)MANDOCLEVEL_SYSERR;
+                                       goto out;
+                               }
                        }
 #endif
                        use_all = 1;
@@ -571,7 +586,7 @@ usage:
  *   or
  *   [./]cat<section>[/<arch>]/<name>.0
  *
- * TODO: accomodate for multi-language directories.
+ * TODO: accommodate for multi-language directories.
  */
 static int
 treescan(void)
@@ -1131,8 +1146,7 @@ mpages_merge(struct mparse *mp)
                man = NULL;
                sodest = NULL;
 
-               mparse_open(mp, &fd, mlink->file);
-               if (fd == -1) {
+               if ((fd = mparse_open(mp, mlink->file)) == -1) {
                        say(mlink->file, "&open");
                        goto nextpage;
                }
@@ -1143,6 +1157,7 @@ mpages_merge(struct mparse *mp)
                 */
                if (mlink->dform != FORM_CAT || mlink->fform != FORM_CAT) {
                        mparse_readfd(mp, fd, mlink->file);
+                       close(fd);
                        mparse_result(mp, &man, &sodest);
                }
 
@@ -1291,7 +1306,9 @@ parse_cat(struct mpage *mpage, int fd)
 {
        FILE            *stream;
        char            *line, *p, *title;
-       size_t           len, plen, titlesz;
+       size_t           linesz, plen, titlesz;
+       ssize_t          len;
+       int              offs;
 
        stream = (-1 == fd) ?
            fopen(mpage->mlinks->file, "r") :
@@ -1304,10 +1321,13 @@ parse_cat(struct mpage *mpage, int fd)
                return;
        }
 
+       line = NULL;
+       linesz = 0;
+
        /* Skip to first blank line. */
 
-       while (NULL != (line = fgetln(stream, &len)))
-               if ('\n' == *line)
+       while (getline(&line, &linesz, stream) != -1)
+               if (*line == '\n')
                        break;
 
        /*
@@ -1315,8 +1335,8 @@ parse_cat(struct mpage *mpage, int fd)
         * is the first section header.  Skip to it.
         */
 
-       while (NULL != (line = fgetln(stream, &len)))
-               if ('\n' != *line && ' ' != *line)
+       while (getline(&line, &linesz, stream) != -1)
+               if (*line != '\n' && *line != ' ')
                        break;
 
        /*
@@ -1329,20 +1349,20 @@ parse_cat(struct mpage *mpage, int fd)
        titlesz = 0;
        title = NULL;
 
-       while (NULL != (line = fgetln(stream, &len))) {
-               if (' ' != *line || '\n' != line[len - 1])
+       while ((len = getline(&line, &linesz, stream)) != -1) {
+               if (*line != ' ')
                        break;
-               while (len > 0 && isspace((unsigned char)*line)) {
-                       line++;
-                       len--;
-               }
-               if (1 == len)
+               offs = 0;
+               while (isspace((unsigned char)line[offs]))
+                       offs++;
+               if (line[offs] == '\0')
                        continue;
-               title = mandoc_realloc(title, titlesz + len);
-               memcpy(title + titlesz, line, len);
-               titlesz += len;
+               title = mandoc_realloc(title, titlesz + len - offs);
+               memcpy(title + titlesz, line + offs, len - offs);
+               titlesz += len - offs;
                title[titlesz - 1] = ' ';
        }
+       free(line);
 
        /*
         * If no page content can be found, or the input line
@@ -1360,8 +1380,7 @@ parse_cat(struct mpage *mpage, int fd)
                return;
        }
 
-       title = mandoc_realloc(title, titlesz + 1);
-       title[titlesz] = '\0';
+       title[titlesz - 1] = '\0';
 
        /*
         * Skip to the first dash.
@@ -1439,7 +1458,7 @@ parse_man(struct mpage *mpage, const struct roff_meta *meta,
        char             byte;
        size_t           sz;
 
-       if (NULL == n)
+       if (n == NULL)
                return;
 
        /*
@@ -1451,13 +1470,12 @@ parse_man(struct mpage *mpage, const struct roff_meta *meta,
 
        if (n->type == ROFFT_BODY && n->tok == MAN_SH) {
                body = n;
-               assert(body->parent);
-               if (NULL != (head = body->parent->head) &&
-                   1 == head->nchild &&
-                   NULL != (head = (head->child)) &&
+               if ((head = body->parent->head) != NULL &&
+                   (head = head->child) != NULL &&
+                   head->next == NULL &&
                    head->type == ROFFT_TEXT &&
-                   0 == strcmp(head->string, "NAME") &&
-                   NULL != body->child) {
+                   strcmp(head->string, "NAME") == 0 &&
+                   body->child != NULL) {
 
                        /*
                         * Suck the entire NAME section into memory.
@@ -1681,6 +1699,31 @@ parse_mdoc_Fo(struct mpage *mpage, const struct roff_meta *meta,
        return 0;
 }
 
+static int
+parse_mdoc_Va(struct mpage *mpage, const struct roff_meta *meta,
+       const struct roff_node *n)
+{
+       char *cp;
+
+       if (n->type != ROFFT_ELEM && n->type != ROFFT_BODY)
+               return 0;
+
+       if (n->child != NULL &&
+           n->child->next == NULL &&
+           n->child->type == ROFFT_TEXT)
+               return 1;
+
+       cp = NULL;
+       deroff(&cp, n);
+       if (cp != NULL) {
+               putkey(mpage, cp, TYPE_Vt | (n->tok == MDOC_Va ||
+                   n->type == ROFFT_BODY ? TYPE_Va : 0));
+               free(cp);
+       }
+
+       return 0;
+}
+
 static int
 parse_mdoc_Xr(struct mpage *mpage, const struct roff_meta *meta,
        const struct roff_node *n)
@@ -1749,14 +1792,6 @@ parse_mdoc_head(struct mpage *mpage, const struct roff_meta *meta,
        return n->type == ROFFT_HEAD;
 }
 
-static int
-parse_mdoc_body(struct mpage *mpage, const struct roff_meta *meta,
-       const struct roff_node *n)
-{
-
-       return n->type == ROFFT_BODY;
-}
-
 /*
  * Add a string to the hash table for the current manual.
  * Each string has a bitmask telling which macros it belongs to.