]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandocd.c
Clean up memory handling in spawn_pager(), free(3)ing everything
[mandoc.git] / mandocd.c
index 7d76b7635731f7ac8e36246e60ac5d84bb4b7e19..60e40fed80239642fb0faf8b99f775ef6eae707f 100644 (file)
--- a/mandocd.c
+++ b/mandocd.c
@@ -1,7 +1,7 @@
-/*     $Id: mandocd.c,v 1.2 2017/02/05 22:51:11 schwarze Exp $ */
+/*     $Id: mandocd.c,v 1.12 2020/06/14 23:40:31 schwarze Exp $ */
 /*
  * Copyright (c) 2017 Michael Stapelberg <stapelberg@debian.org>
 /*
  * Copyright (c) 2017 Michael Stapelberg <stapelberg@debian.org>
- * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2017, 2019 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
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  */
 #include "config.h"
 
  */
 #include "config.h"
 
+#if NEED_XPG4_2
+#define _XPG4_2
+#endif
+
 #include <sys/types.h>
 #include <sys/socket.h>
 
 #include <sys/types.h>
 #include <sys/socket.h>
 
@@ -34,6 +38,7 @@
 #include "roff.h"
 #include "mdoc.h"
 #include "man.h"
 #include "roff.h"
 #include "mdoc.h"
 #include "man.h"
+#include "mandoc_parse.h"
 #include "main.h"
 #include "manconf.h"
 
 #include "main.h"
 #include "manconf.h"
 
@@ -45,7 +50,7 @@ enum  outt {
 
 static void      process(struct mparse *, enum outt, void *);
 static int       read_fds(int, int *);
 
 static void      process(struct mparse *, enum outt, void *);
 static int       read_fds(int, int *);
-static void      usage(void) __attribute__((noreturn));
+static void      usage(void) __attribute__((__noreturn__));
 
 
 #define NUM_FDS 3
 
 
 #define NUM_FDS 3
@@ -114,6 +119,7 @@ main(int argc, char *argv[])
        struct manoutput         options;
        struct mparse           *parser;
        void                    *formatter;
        struct manoutput         options;
        struct mparse           *parser;
        void                    *formatter;
+       const char              *defos;
        const char              *errstr;
        int                      clientfd;
        int                      old_stdin;
        const char              *errstr;
        int                      clientfd;
        int                      old_stdin;
@@ -123,9 +129,18 @@ main(int argc, char *argv[])
        int                      state, opt;
        enum outt                outtype;
 
        int                      state, opt;
        enum outt                outtype;
 
+       defos = NULL;
        outtype = OUTT_ASCII;
        outtype = OUTT_ASCII;
-       while ((opt = getopt(argc, argv, "T:")) != -1) {
+       while ((opt = getopt(argc, argv, "I:T:")) != -1) {
                switch (opt) {
                switch (opt) {
+               case 'I':
+                       if (strncmp(optarg, "os=", 3) == 0)
+                               defos = optarg + 3;
+                       else {
+                               warnx("-I %s: Bad argument", optarg);
+                               usage();
+                       }
+                       break;
                case 'T':
                        if (strcmp(optarg, "ascii") == 0)
                                outtype = OUTT_ASCII;
                case 'T':
                        if (strcmp(optarg, "ascii") == 0)
                                outtype = OUTT_ASCII;
@@ -156,8 +171,8 @@ main(int argc, char *argv[])
                errx(1, "file descriptor %s %s", argv[1], errstr);
 
        mchars_alloc();
                errx(1, "file descriptor %s %s", argv[1], errstr);
 
        mchars_alloc();
-       parser = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1,
-           MANDOCLEVEL_BADARG, NULL, NULL);
+       parser = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1 |
+           MPARSE_VALIDATE, MANDOC_OS_OTHER, defos);
 
        memset(&options, 0, sizeof(options));
        switch (outtype) {
 
        memset(&options, 0, sizeof(options));
        switch (outtype) {
@@ -198,6 +213,8 @@ main(int argc, char *argv[])
 
                process(parser, outtype, formatter);
                mparse_reset(parser);
 
                process(parser, outtype, formatter);
                mparse_reset(parser);
+               if (outtype == OUTT_HTML)
+                       html_reset(formatter);
 
                fflush(stdout);
                fflush(stderr);
 
                fflush(stdout);
                fflush(stderr);
@@ -229,35 +246,29 @@ main(int argc, char *argv[])
 static void
 process(struct mparse *parser, enum outt outtype, void *formatter)
 {
 static void
 process(struct mparse *parser, enum outt outtype, void *formatter)
 {
-       struct roff_man  *man;
+       struct roff_meta *meta;
 
        mparse_readfd(parser, STDIN_FILENO, "<unixfd>");
 
        mparse_readfd(parser, STDIN_FILENO, "<unixfd>");
-       mparse_result(parser, &man, NULL);
-
-       if (man == NULL)
-               return;
-
-       if (man->macroset == MACROSET_MDOC) {
-               mdoc_validate(man);
+       meta = mparse_result(parser);
+       if (meta->macroset == MACROSET_MDOC) {
                switch (outtype) {
                case OUTT_ASCII:
                case OUTT_UTF8:
                switch (outtype) {
                case OUTT_ASCII:
                case OUTT_UTF8:
-                       terminal_mdoc(formatter, man);
+                       terminal_mdoc(formatter, meta);
                        break;
                case OUTT_HTML:
                        break;
                case OUTT_HTML:
-                       html_mdoc(formatter, man);
+                       html_mdoc(formatter, meta);
                        break;
                }
        }
                        break;
                }
        }
-       if (man->macroset == MACROSET_MAN) {
-               man_validate(man);
+       if (meta->macroset == MACROSET_MAN) {
                switch (outtype) {
                case OUTT_ASCII:
                case OUTT_UTF8:
                switch (outtype) {
                case OUTT_ASCII:
                case OUTT_UTF8:
-                       terminal_man(formatter, man);
+                       terminal_man(formatter, meta);
                        break;
                case OUTT_HTML:
                        break;
                case OUTT_HTML:
-                       html_man(formatter, man);
+                       html_man(formatter, meta);
                        break;
                }
        }
                        break;
                }
        }
@@ -266,6 +277,6 @@ process(struct mparse *parser, enum outt outtype, void *formatter)
 void
 usage(void)
 {
 void
 usage(void)
 {
-       fprintf(stderr, "usage: mandocd [-T output] socket_fd\n");
+       fprintf(stderr, "usage: mandocd [-I os=name] [-T output] socket_fd\n");
        exit(1);
 }
        exit(1);
 }