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

Diff for /mandoc/main.c between version 1.302 and 1.305

version 1.302, 2017/08/21 15:42:58 version 1.305, 2018/04/19 16:25:24
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-2017 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010-2012, 2014-2018 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 19 
Line 19 
 #include "config.h"  #include "config.h"
   
 #include <sys/types.h>  #include <sys/types.h>
   #include <sys/ioctl.h>
 #include <sys/param.h>  /* MACHINE */  #include <sys/param.h>  /* MACHINE */
   #include <sys/termios.h>
 #include <sys/wait.h>  #include <sys/wait.h>
   
 #include <assert.h>  #include <assert.h>
Line 120  main(int argc, char *argv[])
Line 122  main(int argc, char *argv[])
         struct manconf   conf;          struct manconf   conf;
         struct mansearch search;          struct mansearch search;
         struct curparse  curp;          struct curparse  curp;
           struct winsize   ws;
         struct tag_files *tag_files;          struct tag_files *tag_files;
         struct manpage  *res, *resp;          struct manpage  *res, *resp;
         const char      *progname, *sec, *thisarg;          const char      *progname, *sec, *thisarg;
Line 129  main(int argc, char *argv[])
Line 132  main(int argc, char *argv[])
         size_t           i, sz;          size_t           i, sz;
         int              prio, best_prio;          int              prio, best_prio;
         enum outmode     outmode;          enum outmode     outmode;
         int              fd;          int              fd, startdir;
         int              show_usage;          int              show_usage;
         int              options;          int              options;
         int              use_pager;          int              use_pager;
Line 316  main(int argc, char *argv[])
Line 319  main(int argc, char *argv[])
             !isatty(STDOUT_FILENO))              !isatty(STDOUT_FILENO))
                 use_pager = 0;                  use_pager = 0;
   
           if (use_pager &&
               (conf.output.width == 0 || conf.output.indent == 0) &&
               ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) {
                   if (conf.output.width == 0 && ws.ws_col < 79)
                           conf.output.width = ws.ws_col - 1;
                   if (conf.output.indent == 0 && ws.ws_col < 66)
                           conf.output.indent = 3;
           }
   
 #if HAVE_PLEDGE  #if HAVE_PLEDGE
         if (!use_pager)          if (!use_pager)
                 if (pledge("stdio rpath", NULL) == -1)                  if (pledge("stdio rpath", NULL) == -1)
Line 374  main(int argc, char *argv[])
Line 386  main(int argc, char *argv[])
                     argc, argv, &res, &sz))                      argc, argv, &res, &sz))
                         usage(search.argmode);                          usage(search.argmode);
   
                 if (sz == 0) {                  if (sz == 0 && search.argmode == ARG_NAME)
                         if (search.argmode == ARG_NAME)                          fs_search(&search, &conf.manpath,
                                 fs_search(&search, &conf.manpath,                              argc, argv, &res, &sz);
                                     argc, argv, &res, &sz);  
                         else                  if (search.argmode == ARG_NAME) {
                                 warnx("nothing appropriate");                          for (c = 0; c < argc; c++) {
                                   if (strchr(argv[c], '/') == NULL)
                                           continue;
                                   if (access(argv[c], R_OK) == -1) {
                                           warn("%s", argv[c]);
                                           continue;
                                   }
                                   res = mandoc_reallocarray(res,
                                       sz + 1, sizeof(*res));
                                   res[sz].file = mandoc_strdup(argv[c]);
                                   res[sz].names = NULL;
                                   res[sz].output = NULL;
                                   res[sz].ipath = SIZE_MAX;
                                   res[sz].bits = 0;
                                   res[sz].sec = 10;
                                   res[sz].form = FORM_SRC;
                                   sz++;
                           }
                 }                  }
   
                 if (sz == 0) {                  if (sz == 0) {
                           if (search.argmode != ARG_NAME)
                                   warnx("nothing appropriate");
                         rc = MANDOCLEVEL_BADARG;                          rc = MANDOCLEVEL_BADARG;
                         goto out;                          goto out;
                 }                  }
Line 466  main(int argc, char *argv[])
Line 497  main(int argc, char *argv[])
                 parse(&curp, STDIN_FILENO, "<stdin>");                  parse(&curp, STDIN_FILENO, "<stdin>");
         }          }
   
           /*
            * Remember the original working directory, if possible.
            * This will be needed if some names on the command line
            * are page names and some are relative file names.
            * Do not error out if the current directory is not
            * readable: Maybe it won't be needed after all.
            */
           startdir = open(".", O_RDONLY | O_DIRECTORY);
   
         while (argc > 0) {          while (argc > 0) {
   
                   /*
                    * Changing directories is not needed in ARG_FILE mode.
                    * Do it on a best-effort basis.  Even in case of
                    * failure, some functionality may still work.
                    */
                   if (resp != NULL) {
                           if (resp->ipath != SIZE_MAX)
                                   (void)chdir(conf.manpath.paths[resp->ipath]);
                           else if (startdir != -1)
                                   (void)fchdir(startdir);
                   }
   
                 fd = mparse_open(curp.mp, resp != NULL ? resp->file : *argv);                  fd = mparse_open(curp.mp, resp != NULL ? resp->file : *argv);
                 if (fd != -1) {                  if (fd != -1) {
                         if (use_pager) {                          if (use_pager) {
Line 476  main(int argc, char *argv[])
Line 529  main(int argc, char *argv[])
   
                         if (resp == NULL)                          if (resp == NULL)
                                 parse(&curp, fd, *argv);                                  parse(&curp, fd, *argv);
                         else if (resp->form == FORM_SRC) {                          else if (resp->form == FORM_SRC)
                                 /* For .so only; ignore failure. */  
                                 (void)chdir(conf.manpath.paths[resp->ipath]);  
                                 parse(&curp, fd, resp->file);                                  parse(&curp, fd, resp->file);
                         } else                          else
                                 passthrough(resp->file, fd,                                  passthrough(resp->file, fd,
                                     conf.output.synopsisonly);                                      conf.output.synopsisonly);
   
Line 513  main(int argc, char *argv[])
Line 564  main(int argc, char *argv[])
                 if (--argc)                  if (--argc)
                         mparse_reset(curp.mp);                          mparse_reset(curp.mp);
         }          }
           if (startdir != -1) {
                   (void)fchdir(startdir);
                   close(startdir);
           }
   
         if (curp.outdata != NULL) {          if (curp.outdata != NULL) {
                 switch (curp.outtype) {                  switch (curp.outtype) {
Line 733  fs_search(const struct mansearch *cfg, const struct ma
Line 788  fs_search(const struct mansearch *cfg, const struct ma
                                     cfg->firstmatch)                                      cfg->firstmatch)
                                         return 1;                                          return 1;
                 }                  }
                 if (res != NULL && *ressz == lastsz)                  if (res != NULL && *ressz == lastsz &&
                       strchr(*argv, '/') == NULL)
                         warnx("No entry for %s in the manual.", *argv);                          warnx("No entry for %s in the manual.", *argv);
                 lastsz = *ressz;                  lastsz = *ressz;
                 argv++;                  argv++;
Line 1184  spawn_pager(struct tag_files *tag_files)
Line 1240  spawn_pager(struct tag_files *tag_files)
         if (dup2(tag_files->ofd, STDOUT_FILENO) == -1)          if (dup2(tag_files->ofd, STDOUT_FILENO) == -1)
                 err((int)MANDOCLEVEL_SYSERR, "pager stdout");                  err((int)MANDOCLEVEL_SYSERR, "pager stdout");
         close(tag_files->ofd);          close(tag_files->ofd);
         close(tag_files->tfd);          assert(tag_files->tfd == -1);
   
         /* Do not start the pager before controlling the terminal. */          /* Do not start the pager before controlling the terminal. */
   

Legend:
Removed from v.1.302  
changed lines
  Added in v.1.305

CVSweb