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

Diff for /mandoc/mandocdb.c between version 1.149 and 1.150

version 1.149, 2014/06/18 19:34:04 version 1.150, 2014/06/19 00:45:37
Line 433  main(int argc, char *argv[])
Line 433  main(int argc, char *argv[])
         if (OP_UPDATE == op || OP_DELETE == op || OP_TEST == op) {          if (OP_UPDATE == op || OP_DELETE == op || OP_TEST == op) {
   
                 /*                  /*
                  * All of these deal with a specific directory.                   * Most of these deal with a specific directory.
                  * Jump into that directory first.                   * Jump into that directory first.
                  */                   */
                 if (0 == set_basedir(path_arg))                  if (OP_TEST != op && 0 == set_basedir(path_arg))
                         goto out;                          goto out;
   
                 if (dbopen(1)) {                  if (dbopen(1)) {
Line 525  main(int argc, char *argv[])
Line 525  main(int argc, char *argv[])
                 }                  }
         }          }
 out:  out:
         set_basedir(NULL);  
         manpath_free(&dirs);          manpath_free(&dirs);
         mchars_free(mc);          mchars_free(mc);
         mparse_free(mp);          mparse_free(mp);
Line 800  filescan(const char *file)
Line 799  filescan(const char *file)
                 return;                  return;
         }          }
   
         if (strstr(buf, basedir) == buf)          if (OP_TEST == op)
                 start = buf + strlen(basedir) + 1;  
         else if (OP_TEST == op)  
                 start = buf;                  start = buf;
           else if (strstr(buf, basedir) == buf)
                   start = buf + strlen(basedir);
         else {          else {
                 exitcode = (int)MANDOCLEVEL_BADARG;                  exitcode = (int)MANDOCLEVEL_BADARG;
                 say("", "%s: outside base directory", buf);                  say("", "%s: outside base directory", buf);
Line 829  filescan(const char *file)
Line 828  filescan(const char *file)
                         say(file, "Filename too long");                          say(file, "Filename too long");
                         return;                          return;
                 }                  }
                 start = strstr(buf, basedir) == buf ?                  start = buf;
                     buf + strlen(basedir) + 1 : buf;                  if (OP_TEST != op && strstr(buf, basedir) == buf)
                           start += strlen(basedir);
         }          }
   
         mlink = mandoc_calloc(1, sizeof(struct mlink));          mlink = mandoc_calloc(1, sizeof(struct mlink));
Line 2375  set_basedir(const char *targetdir)
Line 2375  set_basedir(const char *targetdir)
 {  {
         static char      startdir[PATH_MAX];          static char      startdir[PATH_MAX];
         static int       fd;          static int       fd;
           char            *cp;
   
         /*          /*
          * Remember where we started by keeping a fd open to the origin           * Remember where we started by keeping a fd open to the origin
Line 2385  set_basedir(const char *targetdir)
Line 2386  set_basedir(const char *targetdir)
         if ('\0' == *startdir) {          if ('\0' == *startdir) {
                 if (NULL == getcwd(startdir, PATH_MAX)) {                  if (NULL == getcwd(startdir, PATH_MAX)) {
                         exitcode = (int)MANDOCLEVEL_SYSERR;                          exitcode = (int)MANDOCLEVEL_SYSERR;
                         if (NULL != targetdir)                          say("", "&getcwd");
                                 say("", "&getcwd");  
                         return(0);                          return(0);
                 }                  }
                 if (-1 == (fd = open(startdir, O_RDONLY, 0))) {                  if (-1 == (fd = open(startdir, O_RDONLY, 0))) {
Line 2394  set_basedir(const char *targetdir)
Line 2394  set_basedir(const char *targetdir)
                         say("", "&open %s", startdir);                          say("", "&open %s", startdir);
                         return(0);                          return(0);
                 }                  }
                 if (NULL == targetdir)  
                         targetdir = startdir;  
         } else {          } else {
                 if (-1 == fd)                  if (-1 == fd)
                         return(0);                          return(0);
Line 2406  set_basedir(const char *targetdir)
Line 2404  set_basedir(const char *targetdir)
                         say("", "&chdir %s", startdir);                          say("", "&chdir %s", startdir);
                         return(0);                          return(0);
                 }                  }
                 if (NULL == targetdir) {  
                         close(fd);  
                         return(1);  
                 }  
         }          }
         if (NULL == realpath(targetdir, basedir)) {          if (NULL == realpath(targetdir, basedir)) {
                 basedir[0] = '\0';                  basedir[0] = '\0';
Line 2420  set_basedir(const char *targetdir)
Line 2414  set_basedir(const char *targetdir)
                 exitcode = (int)MANDOCLEVEL_BADARG;                  exitcode = (int)MANDOCLEVEL_BADARG;
                 say("", "&chdir");                  say("", "&chdir");
                 return(0);                  return(0);
           }
           cp = strchr(basedir, '\0');
           if ('/' != cp[-1]) {
                   if (cp - basedir >= PATH_MAX - 1) {
                           exitcode = (int)MANDOCLEVEL_SYSERR;
                           say("", "Filename too long");
                           return(0);
                   }
                   *cp++ = '/';
                   *cp = '\0';
         }          }
         return(1);          return(1);
 }  }

Legend:
Removed from v.1.149  
changed lines
  Added in v.1.150

CVSweb