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

Diff for /mandoc/mandocdb.c between version 1.49.2.2 and 1.49.2.4

version 1.49.2.2, 2013/09/17 22:48:53 version 1.49.2.4, 2013/09/17 23:12:21
Line 299  main(int argc, char *argv[])
Line 299  main(int argc, char *argv[])
         int              ch, i, flags;          int              ch, i, flags;
         DB              *hash; /* temporary keyword hashtable */          DB              *hash; /* temporary keyword hashtable */
         BTREEINFO        info; /* btree configuration */          BTREEINFO        info; /* btree configuration */
         size_t           sz1, sz2;          size_t           sz1, sz2, ipath;
         struct buf       buf, /* keyword buffer */          struct buf       buf, /* keyword buffer */
                          dbuf; /* description buffer */                           dbuf; /* description buffer */
         struct of       *of; /* list of files for processing */          struct of       *of; /* list of files for processing */
Line 482  main(int argc, char *argv[])
Line 482  main(int argc, char *argv[])
         } else          } else
                 manpath_parse(&dirs, dir, NULL, NULL);                  manpath_parse(&dirs, dir, NULL, NULL);
   
         for (i = 0; i < dirs.sz; i++) {          for (ipath = 0; ipath < dirs.sz; ipath++) {
   
                 /*                  /*
                  * Go to the root of the respective manual tree.                   * Go to the root of the respective manual tree.
Line 490  main(int argc, char *argv[])
Line 490  main(int argc, char *argv[])
                  * They are indexed relative to the root.                   * They are indexed relative to the root.
                  */                   */
   
                 if (-1 == chdir(dirs.paths[i])) {                  if (-1 == chdir(dirs.paths[ipath])) {
                         perror(dirs.paths[i]);                          perror(dirs.paths[ipath]);
                         exit((int)MANDOCLEVEL_SYSERR);                          exit((int)MANDOCLEVEL_SYSERR);
                 }                  }
   
                 strlcpy(mdb.dbn, MANDOC_DB, PATH_MAX);                  /* Create a new database in two temporary files. */
                 strlcpy(mdb.idxn, MANDOC_IDX, PATH_MAX);  
   
                 flags = O_CREAT | O_TRUNC | O_RDWR;                  flags = O_CREAT | O_EXCL | O_RDWR;
                 mdb.db = dbopen(mdb.dbn, flags, 0644, DB_BTREE, &info);                  while (NULL == mdb.db) {
                 mdb.idx = dbopen(mdb.idxn, flags, 0644, DB_RECNO, NULL);                          strlcpy(mdb.dbn, MANDOC_DB, PATH_MAX);
                           strlcat(mdb.dbn, ".XXXXXXXXXX", PATH_MAX);
                 if (NULL == mdb.db) {                          if (NULL == mktemp(mdb.dbn)) {
                         perror(mdb.dbn);                                  perror(mdb.dbn);
                         exit((int)MANDOCLEVEL_SYSERR);                                  exit((int)MANDOCLEVEL_SYSERR);
                 } else if (NULL == mdb.idx) {                          }
                         perror(mdb.idxn);                          mdb.db = dbopen(mdb.dbn, flags, 0644,
                         exit((int)MANDOCLEVEL_SYSERR);                                          DB_BTREE, &info);
                           if (NULL == mdb.db && EEXIST != errno) {
                                   perror(mdb.dbn);
                                   exit((int)MANDOCLEVEL_SYSERR);
                           }
                 }                  }
                   while (NULL == mdb.idx) {
                           strlcpy(mdb.idxn, MANDOC_IDX, PATH_MAX);
                           strlcat(mdb.idxn, ".XXXXXXXXXX", PATH_MAX);
                           if (NULL == mktemp(mdb.idxn)) {
                                   perror(mdb.idxn);
                                   unlink(mdb.dbn);
                                   exit((int)MANDOCLEVEL_SYSERR);
                           }
                           mdb.idx = dbopen(mdb.idxn, flags, 0644,
                                           DB_RECNO, NULL);
                           if (NULL == mdb.idx && EEXIST != errno) {
                                   perror(mdb.idxn);
                                   unlink(mdb.dbn);
                                   exit((int)MANDOCLEVEL_SYSERR);
                           }
                   }
   
                 /*                  /*
                  * Search for manuals and fill the new database.                   * Search for manuals and fill the new database.
Line 527  main(int argc, char *argv[])
Line 546  main(int argc, char *argv[])
                 (*mdb.idx->close)(mdb.idx);                  (*mdb.idx->close)(mdb.idx);
                 mdb.db = NULL;                  mdb.db = NULL;
                 mdb.idx = NULL;                  mdb.idx = NULL;
   
                   /*
                    * Replace the old database with the new one.
                    * This is not perfectly atomic,
                    * but i cannot think of a better way.
                    */
   
                   if (-1 == rename(mdb.dbn, MANDOC_DB)) {
                           perror(MANDOC_DB);
                           unlink(mdb.dbn);
                           unlink(mdb.idxn);
                           exit((int)MANDOCLEVEL_SYSERR);
                   }
                   if (-1 == rename(mdb.idxn, MANDOC_IDX)) {
                           perror(MANDOC_IDX);
                           unlink(MANDOC_DB);
                           unlink(MANDOC_IDX);
                           unlink(mdb.idxn);
                           exit((int)MANDOCLEVEL_SYSERR);
                   }
         }          }
   
 out:  out:

Legend:
Removed from v.1.49.2.2  
changed lines
  Added in v.1.49.2.4

CVSweb