version 1.1, 2020/03/13 15:32:29 |
version 1.2, 2020/04/02 22:12:55 |
Line 45 static struct tag_files tag_files; |
|
Line 45 static struct tag_files tag_files; |
|
* but for simplicity, create it anyway. |
* but for simplicity, create it anyway. |
*/ |
*/ |
struct tag_files * |
struct tag_files * |
term_tag_init(char *tagname) |
term_tag_init(void) |
{ |
{ |
struct sigaction sa; |
struct sigaction sa; |
int ofd; /* In /tmp/, dup(2)ed to stdout. */ |
int ofd; /* In /tmp/, dup(2)ed to stdout. */ |
Line 54 term_tag_init(char *tagname) |
|
Line 54 term_tag_init(char *tagname) |
|
ofd = tfd = -1; |
ofd = tfd = -1; |
tag_files.tfs = NULL; |
tag_files.tfs = NULL; |
tag_files.tcpgid = -1; |
tag_files.tcpgid = -1; |
tag_files.tagname = tagname; |
|
|
|
/* Clean up when dying from a signal. */ |
/* Clean up when dying from a signal. */ |
|
|
|
|
close(tag_files.ofd); |
close(tag_files.ofd); |
tag_files.ofd = -1; |
tag_files.ofd = -1; |
} |
} |
tag_files.tagname = NULL; |
|
return NULL; |
return NULL; |
} |
} |
|
|
Line 141 term_tag_write(struct roff_node *n, size_t line) |
|
Line 139 term_tag_write(struct roff_node *n, size_t line) |
|
len, cp, tag_files.ofn, line); |
len, cp, tag_files.ofn, line); |
} |
} |
|
|
void |
/* |
term_tag_finish(void) |
* Close both output files and restore the original standard output |
|
* to the terminal. In the unlikely case that the latter fails, |
|
* trying to start a pager would be useless, so report the failure |
|
* to the main program. |
|
*/ |
|
int |
|
term_tag_close(void) |
{ |
{ |
if (tag_files.tfs == NULL) |
int irc = 0; |
return; |
|
fclose(tag_files.tfs); |
if (tag_files.tfs != NULL) { |
tag_files.tfs = NULL; |
fclose(tag_files.tfs); |
switch (tag_check(tag_files.tagname)) { |
tag_files.tfs = NULL; |
case TAG_EMPTY: |
|
unlink(tag_files.tfn); |
|
*tag_files.tfn = '\0'; |
|
/* FALLTHROUGH */ |
|
case TAG_MISS: |
|
if (tag_files.tagname == NULL) |
|
break; |
|
mandoc_msg(MANDOCERR_TAG, 0, 0, "%s", tag_files.tagname); |
|
tag_files.tagname = NULL; |
|
break; |
|
case TAG_OK: |
|
break; |
|
} |
} |
|
if (tag_files.ofd != -1) { |
|
fflush(stdout); |
|
if ((irc = dup2(tag_files.ofd, STDOUT_FILENO)) == -1) |
|
mandoc_msg(MANDOCERR_DUP, 0, 0, "%s", strerror(errno)); |
|
close(tag_files.ofd); |
|
tag_files.ofd = -1; |
|
} |
|
return irc; |
} |
} |
|
|
void |
void |
Line 170 term_tag_unlink(void) |
|
Line 170 term_tag_unlink(void) |
|
pid_t tc_pgid; |
pid_t tc_pgid; |
|
|
if (tag_files.tcpgid != -1) { |
if (tag_files.tcpgid != -1) { |
tc_pgid = tcgetpgrp(tag_files.ofd); |
tc_pgid = tcgetpgrp(STDOUT_FILENO); |
if (tc_pgid == tag_files.pager_pid || |
if (tc_pgid == tag_files.pager_pid || |
tc_pgid == getpgid(0) || |
tc_pgid == getpgid(0) || |
getpgid(tc_pgid) == -1) |
getpgid(tc_pgid) == -1) |
(void)tcsetpgrp(tag_files.ofd, tag_files.tcpgid); |
(void)tcsetpgrp(STDOUT_FILENO, tag_files.tcpgid); |
} |
} |
if (*tag_files.ofn != '\0') { |
if (*tag_files.ofn != '\0') { |
unlink(tag_files.ofn); |
unlink(tag_files.ofn); |
Line 183 term_tag_unlink(void) |
|
Line 183 term_tag_unlink(void) |
|
if (*tag_files.tfn != '\0') { |
if (*tag_files.tfn != '\0') { |
unlink(tag_files.tfn); |
unlink(tag_files.tfn); |
*tag_files.tfn = '\0'; |
*tag_files.tfn = '\0'; |
} |
|
if (tag_files.tfs != NULL) { |
|
fclose(tag_files.tfs); |
|
tag_files.tfs = NULL; |
|
} |
} |
} |
} |
|
|