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

Diff for /mandoc/main.c between version 1.258 and 1.264

version 1.258, 2015/11/14 23:57:47 version 1.264, 2016/04/13 12:26:25
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010-2012, 2014-2016 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>   * Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
Line 123  main(int argc, char *argv[])
Line 123  main(int argc, char *argv[])
         unsigned char   *uc;          unsigned char   *uc;
         struct manpage  *res, *resp;          struct manpage  *res, *resp;
         char            *conf_file, *defpaths;          char            *conf_file, *defpaths;
         size_t           isec, i, sz;          const char      *sec;
           size_t           i, sz;
         int              prio, best_prio;          int              prio, best_prio;
         char             sec;  
         enum mandoclevel rctmp;  
         enum outmode     outmode;          enum outmode     outmode;
         int              fd;          int              fd;
         int              show_usage;          int              show_usage;
         int              options;          int              options;
         int              use_pager;          int              use_pager;
         int              status;          int              status, signum;
         int              c;          int              c;
         pid_t            pager_pid;          pid_t            pager_pid, tc_pgid, man_pgid, pid;
   
 #if HAVE_PROGNAME  #if HAVE_PROGNAME
         progname = getprogname();          progname = getprogname();
Line 299  main(int argc, char *argv[])
Line 298  main(int argc, char *argv[])
                 use_pager = 0;                  use_pager = 0;
   
 #if HAVE_PLEDGE  #if HAVE_PLEDGE
         if (!use_pager && pledge("stdio rpath flock", NULL) == -1)          if (!use_pager)
                 err((int)MANDOCLEVEL_SYSERR, "pledge");                  if (pledge("stdio rpath flock", NULL) == -1)
                           err((int)MANDOCLEVEL_SYSERR, "pledge");
 #endif  #endif
   
         /* Parse arguments. */          /* Parse arguments. */
Line 389  main(int argc, char *argv[])
Line 389  main(int argc, char *argv[])
   
                 if (outmode == OUTMODE_ONE) {                  if (outmode == OUTMODE_ONE) {
                         argc = 1;                          argc = 1;
                         best_prio = 10;                          best_prio = 20;
                 } else if (outmode == OUTMODE_ALL)                  } else if (outmode == OUTMODE_ALL)
                         argc = (int)sz;                          argc = (int)sz;
   
Line 405  main(int argc, char *argv[])
Line 405  main(int argc, char *argv[])
                                     res[i].output);                                      res[i].output);
                         else if (outmode == OUTMODE_ONE) {                          else if (outmode == OUTMODE_ONE) {
                                 /* Search for the best section. */                                  /* Search for the best section. */
                                 isec = strcspn(res[i].file, "123456789");                                  sec = res[i].file;
                                 sec = res[i].file[isec];                                  sec += strcspn(sec, "123456789");
                                 if ('\0' == sec)                                  if (sec[0] == '\0')
                                         continue;                                          continue;
                                 prio = sec_prios[sec - '1'];                                  prio = sec_prios[sec[0] - '1'];
                                   if (sec[1] != '/')
                                           prio += 10;
                                 if (prio >= best_prio)                                  if (prio >= best_prio)
                                         continue;                                          continue;
                                 best_prio = prio;                                  best_prio = prio;
Line 430  main(int argc, char *argv[])
Line 432  main(int argc, char *argv[])
         /* mandoc(1) */          /* mandoc(1) */
   
 #if HAVE_PLEDGE  #if HAVE_PLEDGE
         if (pledge(use_pager ? "stdio rpath tmppath tty proc exec" :          if (use_pager) {
             "stdio rpath", NULL) == -1)                  if (pledge("stdio rpath tmppath tty proc exec", NULL) == -1)
                 err((int)MANDOCLEVEL_SYSERR, "pledge");                          err((int)MANDOCLEVEL_SYSERR, "pledge");
           } else {
                   if (pledge("stdio rpath", NULL) == -1)
                           err((int)MANDOCLEVEL_SYSERR, "pledge");
           }
 #endif  #endif
   
         if (search.argmode == ARG_FILE && ! moptions(&options, auxpaths))          if (search.argmode == ARG_FILE && ! moptions(&options, auxpaths))
Line 454  main(int argc, char *argv[])
Line 460  main(int argc, char *argv[])
         }          }
   
         while (argc > 0) {          while (argc > 0) {
                 rctmp = mparse_open(curp.mp, &fd,                  fd = mparse_open(curp.mp, resp != NULL ? resp->file : *argv);
                     resp != NULL ? resp->file : *argv);  
                 if (rc < rctmp)  
                         rc = rctmp;  
   
                 if (fd != -1) {                  if (fd != -1) {
                         if (use_pager) {                          if (use_pager) {
                                 tag_files = tag_init();                                  tag_files = tag_init();
Line 477  main(int argc, char *argv[])
Line 479  main(int argc, char *argv[])
   
                         if (argc > 1 && curp.outtype <= OUTT_UTF8)                          if (argc > 1 && curp.outtype <= OUTT_UTF8)
                                 ascii_sepline(curp.outdata);                                  ascii_sepline(curp.outdata);
                 }                  } else if (rc < MANDOCLEVEL_ERROR)
                           rc = MANDOCLEVEL_ERROR;
   
                 if (MANDOCLEVEL_OK != rc && curp.wstop)                  if (MANDOCLEVEL_OK != rc && curp.wstop)
                         break;                          break;
Line 530  out:
Line 533  out:
         if (tag_files != NULL) {          if (tag_files != NULL) {
                 fclose(stdout);                  fclose(stdout);
                 tag_write();                  tag_write();
                 pager_pid = spawn_pager(tag_files);                  man_pgid = getpgid(0);
                   tag_files->tcpgid = man_pgid == getpid() ?
                       getpgid(getppid()) : man_pgid;
                   pager_pid = 0;
                   signum = SIGSTOP;
                 for (;;) {                  for (;;) {
                         if (waitpid(pager_pid, &status, WUNTRACED) == -1) {  
                                 if (errno == EINTR)                          /* Stop here until moved to the foreground. */
                                         continue;  
                           tc_pgid = tcgetpgrp(STDIN_FILENO);
                           if (tc_pgid != man_pgid) {
                                   if (tc_pgid == pager_pid) {
                                           (void)tcsetpgrp(STDIN_FILENO,
                                               man_pgid);
                                           if (signum == SIGTTIN)
                                                   continue;
                                   } else
                                           tag_files->tcpgid = tc_pgid;
                                   kill(0, signum);
                                   continue;
                           }
   
                           /* Once in the foreground, activate the pager. */
   
                           if (pager_pid) {
                                   (void)tcsetpgrp(STDIN_FILENO, pager_pid);
                                   kill(pager_pid, SIGCONT);
                           } else
                                   pager_pid = spawn_pager(tag_files);
   
                           /* Wait for the pager to stop or exit. */
   
                           while ((pid = waitpid(pager_pid, &status,
                               WUNTRACED)) == -1 && errno == EINTR)
                                   continue;
   
                           if (pid == -1) {
                                 warn("wait");                                  warn("wait");
                                 rc = MANDOCLEVEL_SYSERR;                                  rc = MANDOCLEVEL_SYSERR;
                                 break;                                  break;
Line 542  out:
Line 577  out:
                         if (!WIFSTOPPED(status))                          if (!WIFSTOPPED(status))
                                 break;                                  break;
   
                         (void)tcsetpgrp(STDIN_FILENO, getpgid(0));                          signum = WSTOPSIG(status);
                         kill(0, WSTOPSIG(status));  
   
                         /*  
                          * I'm now stopped.  
                          * When getting SIGCONT, continue here:  
                          */  
   
                         (void)tcsetpgrp(STDIN_FILENO, pager_pid);  
                         kill(pager_pid, SIGCONT);  
                 }                  }
                 tag_unlink();                  tag_unlink();
         }          }
Line 657  fs_search(const struct mansearch *cfg, const struct ma
Line 683  fs_search(const struct mansearch *cfg, const struct ma
         int argc, char **argv, struct manpage **res, size_t *ressz)          int argc, char **argv, struct manpage **res, size_t *ressz)
 {  {
         const char *const sections[] =          const char *const sections[] =
             {"1", "8", "6", "2", "3", "3p", "5", "7", "4", "9"};              {"1", "8", "6", "2", "3", "5", "7", "4", "9", "3p"};
         const size_t nsec = sizeof(sections)/sizeof(sections[0]);          const size_t nsec = sizeof(sections)/sizeof(sections[0]);
   
         size_t           ipath, isec, lastsz;          size_t           ipath, isec, lastsz;
Line 696  parse(struct curparse *curp, int fd, const char *file)
Line 722  parse(struct curparse *curp, int fd, const char *file)
         /* Begin by parsing the file itself. */          /* Begin by parsing the file itself. */
   
         assert(file);          assert(file);
         assert(fd >= -1);          assert(fd >= 0);
   
         rctmp = mparse_readfd(curp->mp, fd, file);          rctmp = mparse_readfd(curp->mp, fd, file);
           if (fd != STDIN_FILENO)
                   close(fd);
         if (rc < rctmp)          if (rc < rctmp)
                 rc = rctmp;                  rc = rctmp;
   
Line 1046  spawn_pager(struct tag_files *tag_files)
Line 1074  spawn_pager(struct tag_files *tag_files)
                 break;                  break;
         default:          default:
                 (void)setpgid(pager_pid, 0);                  (void)setpgid(pager_pid, 0);
                 if (tcsetpgrp(STDIN_FILENO, pager_pid) == -1)                  (void)tcsetpgrp(STDIN_FILENO, pager_pid);
                         err((int)MANDOCLEVEL_SYSERR, "tcsetpgrp");  
 #if HAVE_PLEDGE  #if HAVE_PLEDGE
                 if (pledge("stdio rpath tmppath tty proc", NULL) == -1)                  if (pledge("stdio rpath tmppath tty proc", NULL) == -1)
                         err((int)MANDOCLEVEL_SYSERR, "pledge");                          err((int)MANDOCLEVEL_SYSERR, "pledge");
 #endif  #endif
                   tag_files->pager_pid = pager_pid;
                 return pager_pid;                  return pager_pid;
         }          }
   

Legend:
Removed from v.1.258  
changed lines
  Added in v.1.264

CVSweb