[BACK]Return to term_tag.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/term_tag.c between version 1.1 and 1.2

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. */
   
Line 119  fail:
Line 118  fail:
                 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;  
         }          }
 }  }
   

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

CVSweb