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

Diff for /mandoc/mandocdb.c between version 1.137 and 1.139

version 1.137, 2014/04/16 21:36:18 version 1.139, 2014/04/19 02:30:19
Line 442  main(int argc, char *argv[])
Line 442  main(int argc, char *argv[])
                  */                   */
                 if (0 == set_basedir(path_arg))                  if (0 == set_basedir(path_arg))
                         goto out;                          goto out;
                 for (i = 0; i < argc; i++)                  if (dbopen(1)) {
                         filescan(argv[i]);                          for (i = 0; i < argc; i++)
                 if (0 == dbopen(1))                                  filescan(argv[i]);
                         goto out;                          if (OP_TEST != op)
                 if (OP_TEST != op)                                  dbprune();
                         dbprune();                  } else {
                           /*
                            * Database missing or corrupt.
                            * Recreate from scratch.
                            */
                           op = OP_DEFAULT;
                           if (0 == treescan())
                                   goto out;
                           if (0 == dbopen(0))
                                   goto out;
                   }
                 if (OP_DELETE != op)                  if (OP_DELETE != op)
                         mpages_merge(mc, mp);                          mpages_merge(mc, mp);
                 dbclose(1);                  dbclose(OP_DEFAULT == op ? 0 : 1);
         } else {          } else {
                 /*                  /*
                  * If we have arguments, use them as our manpaths.                   * If we have arguments, use them as our manpaths.
Line 549  usage:
Line 559  usage:
 static int  static int
 treescan(void)  treescan(void)
 {  {
           char             buf[PATH_MAX];
         FTS             *f;          FTS             *f;
         FTSENT          *ff;          FTSENT          *ff;
         struct mlink    *mlink;          struct mlink    *mlink;
Line 560  treescan(void)
Line 571  treescan(void)
         argv[0] = ".";          argv[0] = ".";
         argv[1] = (char *)NULL;          argv[1] = (char *)NULL;
   
         /*          f = fts_open((char * const *)argv,
          * Walk through all components under the directory, using the              FTS_PHYSICAL | FTS_NOCHDIR, NULL);
          * logical descent of files.  
          */  
         f = fts_open((char * const *)argv, FTS_LOGICAL, NULL);  
         if (NULL == f) {          if (NULL == f) {
                 exitcode = (int)MANDOCLEVEL_SYSERR;                  exitcode = (int)MANDOCLEVEL_SYSERR;
                 say("", "&fts_open");                  say("", "&fts_open");
Line 576  treescan(void)
Line 584  treescan(void)
   
         while (NULL != (ff = fts_read(f))) {          while (NULL != (ff = fts_read(f))) {
                 path = ff->fts_path + 2;                  path = ff->fts_path + 2;
                   switch (ff->fts_info) {
   
                 /*                  /*
                    * Symbolic links require various sanity checks,
                    * then get handled just like regular files.
                    */
                   case (FTS_SL):
                           if (NULL == realpath(path, buf)) {
                                   if (warnings)
                                           say(path, "&realpath");
                                   continue;
                           }
                           if (strstr(buf, basedir) != buf) {
                                   if (warnings) say("",
                                       "%s: outside base directory", buf);
                                   continue;
                           }
                           /* Use logical inode to avoid mpages dupe. */
                           if (-1 == stat(path, ff->fts_statp)) {
                                   if (warnings)
                                           say(path, "&stat");
                                   continue;
                           }
                           /* FALLTHROUGH */
   
                   /*
                  * If we're a regular file, add an mlink by using the                   * If we're a regular file, add an mlink by using the
                  * stored directory data and handling the filename.                   * stored directory data and handling the filename.
                  */                   */
                 if (FTS_F == ff->fts_info) {                  case (FTS_F):
                         if (0 == strcmp(path, MANDOC_DB))                          if (0 == strcmp(path, MANDOC_DB))
                                 continue;                                  continue;
                         if ( ! use_all && ff->fts_level < 2) {                          if ( ! use_all && ff->fts_level < 2) {
Line 636  treescan(void)
Line 669  treescan(void)
                         mlink->gzip = gzip;                          mlink->gzip = gzip;
                         mlink_add(mlink, ff->fts_statp);                          mlink_add(mlink, ff->fts_statp);
                         continue;                          continue;
                 } else if (FTS_D != ff->fts_info &&  
                                 FTS_DP != ff->fts_info) {                  case (FTS_D):
                           /* FALLTHROUGH */
                   case (FTS_DP):
                           break;
   
                   default:
                         if (warnings)                          if (warnings)
                                 say(path, "Not a regular file");                                  say(path, "Not a regular file");
                         continue;                          continue;
Line 726  filescan(const char *file)
Line 764  filescan(const char *file)
         if (0 == strncmp(file, "./", 2))          if (0 == strncmp(file, "./", 2))
                 file += 2;                  file += 2;
   
           /*
            * We have to do lstat(2) before realpath(3) loses
            * the information whether this is a symbolic link.
            * We need to know that because for symbolic links,
            * we want to use the orginal file name, while for
            * regular files, we want to use the real path.
            */
           if (-1 == lstat(file, &st)) {
                   exitcode = (int)MANDOCLEVEL_BADARG;
                   say(file, "&lstat");
                   return;
           } else if (0 == ((S_IFREG | S_IFLNK) & st.st_mode)) {
                   exitcode = (int)MANDOCLEVEL_BADARG;
                   say(file, "Not a regular file");
                   return;
           }
   
           /*
            * We have to resolve the file name to the real path
            * in any case for the base directory check.
            */
         if (NULL == realpath(file, buf)) {          if (NULL == realpath(file, buf)) {
                 exitcode = (int)MANDOCLEVEL_BADARG;                  exitcode = (int)MANDOCLEVEL_BADARG;
                 say(file, "&realpath");                  say(file, "&realpath");
Line 742  filescan(const char *file)
Line 801  filescan(const char *file)
                 return;                  return;
         }          }
   
         if (-1 == stat(buf, &st)) {          /*
                 exitcode = (int)MANDOCLEVEL_BADARG;           * Now we are sure the file is inside our tree.
                 say(file, "&stat");           * If it is a symbolic link, ignore the real path
                 return;           * and use the original name.
         } else if ( ! (S_IFREG & st.st_mode)) {           * This implies passing stuff like "cat1/../man1/foo.1"
                 exitcode = (int)MANDOCLEVEL_BADARG;           * on the command line won't work.  So don't do that.
                 say(file, "Not a regular file");           * Note the stat(2) can still fail if the link target
                 return;           * doesn't exist.
            */
           if (S_IFLNK & st.st_mode) {
                   if (-1 == stat(buf, &st)) {
                           exitcode = (int)MANDOCLEVEL_BADARG;
                           say(file, "&stat");
                           return;
                   }
                   strlcpy(buf, file, sizeof(buf));
                   start = strstr(buf, basedir) == buf ?
                       buf + strlen(basedir) + 1 : buf;
         }          }
   
         mlink = mandoc_calloc(1, sizeof(struct mlink));          mlink = mandoc_calloc(1, sizeof(struct mlink));

Legend:
Removed from v.1.137  
changed lines
  Added in v.1.139

CVSweb