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

Diff for /mandoc/main.c between version 1.349 and 1.350

version 1.349, 2020/06/14 16:24:18 version 1.350, 2020/06/15 17:25:42
Line 108  static void    parse(struct mparse *, int, const char 
Line 108  static void    parse(struct mparse *, int, const char 
 static  void              passthrough(int, int);  static  void              passthrough(int, int);
 static  void              process_onefile(struct mparse *, struct manpage *,  static  void              process_onefile(struct mparse *, struct manpage *,
                                 int, struct outstate *, struct manconf *);                                  int, struct outstate *, struct manconf *);
 static  void              run_pager(struct tag_files *, char *);  static  void              run_pager(struct outstate *, char *);
 static  pid_t             spawn_pager(struct tag_files *, char *);  static  pid_t             spawn_pager(struct outstate *, char *);
 static  void              usage(enum argmode) __attribute__((__noreturn__));  static  void              usage(enum argmode) __attribute__((__noreturn__));
 static  int               woptions(char *, enum mandoc_os *, int *);  static  int               woptions(char *, enum mandoc_os *, int *);
   
Line 643  out:
Line 643  out:
   
         if (outst.tag_files != NULL) {          if (outst.tag_files != NULL) {
                 if (term_tag_close() != -1)                  if (term_tag_close() != -1)
                         run_pager(outst.tag_files, conf.output.tag);                          run_pager(&outst, conf.output.tag);
                 term_tag_unlink();                  term_tag_unlink();
         } else if (outst.had_output && outst.outtype != OUTT_LINT)          } else if (outst.had_output && outst.outtype != OUTT_LINT)
                 mandoc_msg_summary();                  mandoc_msg_summary();
Line 1144  woptions(char *arg, enum mandoc_os *os_e, int *wstop)
Line 1144  woptions(char *arg, enum mandoc_os *os_e, int *wstop)
  * then fork the pager and wait for the user to close it.   * then fork the pager and wait for the user to close it.
  */   */
 static void  static void
 run_pager(struct tag_files *tag_files, char *tag_target)  run_pager(struct outstate *outst, char *tag_target)
 {  {
         int      signum, status;          int      signum, status;
         pid_t    man_pgid, tc_pgid;          pid_t    man_pgid, tc_pgid;
         pid_t    pager_pid, wait_pid;          pid_t    pager_pid, wait_pid;
   
         man_pgid = getpgid(0);          man_pgid = getpgid(0);
         tag_files->tcpgid = man_pgid == getpid() ? getpgid(getppid()) :          outst->tag_files->tcpgid =
             man_pgid;              man_pgid == getpid() ? getpgid(getppid()) : man_pgid;
         pager_pid = 0;          pager_pid = 0;
         signum = SIGSTOP;          signum = SIGSTOP;
   
Line 1166  run_pager(struct tag_files *tag_files, char *tag_targe
Line 1166  run_pager(struct tag_files *tag_files, char *tag_targe
                                 if (signum == SIGTTIN)                                  if (signum == SIGTTIN)
                                         continue;                                          continue;
                         } else                          } else
                                 tag_files->tcpgid = tc_pgid;                                  outst->tag_files->tcpgid = tc_pgid;
                         kill(0, signum);                          kill(0, signum);
                         continue;                          continue;
                 }                  }
Line 1177  run_pager(struct tag_files *tag_files, char *tag_targe
Line 1177  run_pager(struct tag_files *tag_files, char *tag_targe
                         (void)tcsetpgrp(STDOUT_FILENO, pager_pid);                          (void)tcsetpgrp(STDOUT_FILENO, pager_pid);
                         kill(pager_pid, SIGCONT);                          kill(pager_pid, SIGCONT);
                 } else                  } else
                         pager_pid = spawn_pager(tag_files, tag_target);                          pager_pid = spawn_pager(outst, tag_target);
   
                 /* Wait for the pager to stop or exit. */                  /* Wait for the pager to stop or exit. */
   
Line 1198  run_pager(struct tag_files *tag_files, char *tag_targe
Line 1198  run_pager(struct tag_files *tag_files, char *tag_targe
 }  }
   
 static pid_t  static pid_t
 spawn_pager(struct tag_files *tag_files, char *tag_target)  spawn_pager(struct outstate *outst, char *tag_target)
 {  {
         const struct timespec timeout = { 0, 100000000 };  /* 0.1s */          const struct timespec timeout = { 0, 100000000 };  /* 0.1s */
 #define MAX_PAGER_ARGS 16  #define MAX_PAGER_ARGS 16
Line 1211  spawn_pager(struct tag_files *tag_files, char *tag_tar
Line 1211  spawn_pager(struct tag_files *tag_files, char *tag_tar
         int              argc, use_ofn;          int              argc, use_ofn;
         pid_t            pager_pid;          pid_t            pager_pid;
   
         assert(tag_files->ofd == -1);          assert(outst->tag_files->ofd == -1);
         assert(tag_files->tfs == NULL);          assert(outst->tag_files->tfs == NULL);
   
         pager = getenv("MANPAGER");          pager = getenv("MANPAGER");
         if (pager == NULL || *pager == '\0')          if (pager == NULL || *pager == '\0')
Line 1243  spawn_pager(struct tag_files *tag_files, char *tag_tar
Line 1243  spawn_pager(struct tag_files *tag_files, char *tag_tar
   
         use_ofn = 1;          use_ofn = 1;
 #if HAVE_LESS_T  #if HAVE_LESS_T
         if (*tag_files->tfn != '\0' && (cmdlen = strlen(argv[0])) >= 4) {          if (*outst->tag_files->tfn != '\0' &&
               (cmdlen = strlen(argv[0])) >= 4) {
                 cp = argv[0] + cmdlen - 4;                  cp = argv[0] + cmdlen - 4;
                 if (strcmp(cp, "less") == 0) {                  if (strcmp(cp, "less") == 0) {
                         argv[argc++] = mandoc_strdup("-T");                          argv[argc++] = mandoc_strdup("-T");
                         argv[argc++] = tag_files->tfn;                          argv[argc++] = outst->tag_files->tfn;
                         if (tag_target != NULL) {                          if (tag_target != NULL) {
                                 argv[argc++] = mandoc_strdup("-t");                                  argv[argc++] = mandoc_strdup("-t");
                                 argv[argc++] = tag_target;                                  argv[argc++] = tag_target;
Line 1256  spawn_pager(struct tag_files *tag_files, char *tag_tar
Line 1257  spawn_pager(struct tag_files *tag_files, char *tag_tar
                 }                  }
         }          }
 #endif  #endif
         if (use_ofn)          if (use_ofn) {
                 argv[argc++] = tag_files->ofn;                  if (outst->outtype == OUTT_HTML && tag_target != NULL)
                           mandoc_asprintf(&argv[argc], "file://%s#%s",
                               outst->tag_files->ofn, tag_target);
                   else
                           argv[argc] = outst->tag_files->ofn;
                   argc++;
           }
         argv[argc] = NULL;          argv[argc] = NULL;
   
         switch (pager_pid = fork()) {          switch (pager_pid = fork()) {
Line 1276  spawn_pager(struct tag_files *tag_files, char *tag_tar
Line 1283  spawn_pager(struct tag_files *tag_files, char *tag_tar
                         exit(mandoc_msg_getrc());                          exit(mandoc_msg_getrc());
                 }                  }
 #endif  #endif
                 tag_files->pager_pid = pager_pid;                  outst->tag_files->pager_pid = pager_pid;
                 return pager_pid;                  return pager_pid;
         }          }
   

Legend:
Removed from v.1.349  
changed lines
  Added in v.1.350

CVSweb