]> git.cameronkatri.com Git - mandoc.git/blobdiff - term_tag.c
old groff_char(7) reported by kamil at NetBSD
[mandoc.git] / term_tag.c
index 7895d872ea0e918a0c544e295643c73f6460a53b..c448a6ef5ddde53425de827f0cf51eeddd75037a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: term_tag.c,v 1.4 2020/04/18 20:40:10 schwarze Exp $ */
+/* $Id: term_tag.c,v 1.5 2020/07/21 15:10:01 schwarze Exp $ */
 /*
  * Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -22,6 +22,7 @@
 #include <sys/types.h>
 
 #include <errno.h>
+#include <fcntl.h>
 #include <signal.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -46,7 +47,7 @@ static struct tag_files tag_files;
  * but for simplicity, create it anyway.
  */
 struct tag_files *
-term_tag_init(void)
+term_tag_init(const char *outfilename, const char *tagfilename)
 {
        struct sigaction         sa;
        int                      ofd;   /* In /tmp/, dup(2)ed to stdout. */
@@ -83,19 +84,43 @@ term_tag_init(void)
 
        /* Create both temporary output files. */
 
-       (void)strlcpy(tag_files.ofn, "/tmp/man.XXXXXXXXXX",
-           sizeof(tag_files.ofn));
-       (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
-           sizeof(tag_files.tfn));
-       if ((ofd = mkstemp(tag_files.ofn)) == -1) {
-               mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
-                   "%s: %s", tag_files.ofn, strerror(errno));
-               goto fail;
+       if (outfilename == NULL) {
+               (void)strlcpy(tag_files.ofn, "/tmp/man.XXXXXXXXXX",
+                   sizeof(tag_files.ofn));
+               if ((ofd = mkstemp(tag_files.ofn)) == -1) {
+                       mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
+                           "%s: %s", tag_files.ofn, strerror(errno));
+                       goto fail;
+               }
+       } else {
+               (void)strlcpy(tag_files.ofn, outfilename,
+                  sizeof(tag_files.ofn));
+               unlink(outfilename);
+               ofd = open(outfilename, O_WRONLY | O_CREAT | O_EXCL, 0644);
+               if (ofd == -1) {
+                       mandoc_msg(MANDOCERR_OPEN, 0, 0,
+                           "%s: %s", outfilename, strerror(errno));
+                       goto fail;
+               }
        }
-       if ((tfd = mkstemp(tag_files.tfn)) == -1) {
-               mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
-                   "%s: %s", tag_files.tfn, strerror(errno));
-               goto fail;
+       if (tagfilename == NULL) {
+               (void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
+                   sizeof(tag_files.tfn));
+               if ((tfd = mkstemp(tag_files.tfn)) == -1) {
+                       mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
+                           "%s: %s", tag_files.tfn, strerror(errno));
+                       goto fail;
+               }
+       } else {
+               (void)strlcpy(tag_files.tfn, tagfilename,
+                   sizeof(tag_files.tfn));
+               unlink(tagfilename);
+               tfd = open(tagfilename, O_WRONLY | O_CREAT | O_EXCL, 0644);
+               if (tfd == -1) {
+                       mandoc_msg(MANDOCERR_OPEN, 0, 0,
+                           "%s: %s", tagfilename, strerror(errno));
+                       goto fail;
+               }
        }
        if ((tag_files.tfs = fdopen(tfd, "w")) == NULL) {
                mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));
@@ -175,11 +200,11 @@ term_tag_unlink(void)
                    getpgid(tc_pgid) == -1)
                        (void)tcsetpgrp(STDOUT_FILENO, tag_files.tcpgid);
        }
-       if (*tag_files.ofn != '\0') {
+       if (strncmp(tag_files.ofn, "/tmp/man.", 9) == 0) {
                unlink(tag_files.ofn);
                *tag_files.ofn = '\0';
        }
-       if (*tag_files.tfn != '\0') {
+       if (strncmp(tag_files.tfn, "/tmp/man.", 9) == 0) {
                unlink(tag_files.tfn);
                *tag_files.tfn = '\0';
        }