diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2020-07-21 15:10:01 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2020-07-21 15:10:01 +0000 |
commit | 34c3fd437f1b1a9f91c688bf395a99c631b642ed (patch) | |
tree | 457254f96054c09e8e8c023fc4e684b34c589021 /term_tag.c | |
parent | eb396f5b0bb17fecfc3db0045d2979fa42d4478d (diff) | |
download | mandoc-34c3fd437f1b1a9f91c688bf395a99c631b642ed.tar.gz mandoc-34c3fd437f1b1a9f91c688bf395a99c631b642ed.tar.zst mandoc-34c3fd437f1b1a9f91c688bf395a99c631b642ed.zip |
undocumented options -O outfilename and -O tagfilename
to support regression testing without a tty;
no user visible change intended
Diffstat (limited to 'term_tag.c')
-rw-r--r-- | term_tag.c | 57 |
1 files changed, 41 insertions, 16 deletions
@@ -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'; } |