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

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

version 1.145, 2014/04/25 12:13:15 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 512  main(int argc, char *argv[])
Line 512  main(int argc, char *argv[])
                                 goto out;                                  goto out;
   
                         mpages_merge(mc, mp);                          mpages_merge(mc, mp);
                         if (warnings &&                          if (warnings && !nodb &&
                             ! (MPARSE_QUICK & mparse_options))                              ! (MPARSE_QUICK & mparse_options))
                                 names_check();                                  names_check();
                         dbclose(0);                          dbclose(0);
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 1996  dbadd(struct mpage *mpage, struct mchars *mc)
Line 1996  dbadd(struct mpage *mpage, struct mchars *mc)
         mlink = mpage->mlinks;          mlink = mpage->mlinks;
   
         if (nodb) {          if (nodb) {
                   for (key = ohash_first(&names, &slot); NULL != key;
                        key = ohash_next(&names, &slot)) {
                           if (key->rendered != key->key)
                                   free(key->rendered);
                           free(key);
                   }
                   for (key = ohash_first(&strings, &slot); NULL != key;
                        key = ohash_next(&strings, &slot)) {
                           if (key->rendered != key->key)
                                   free(key->rendered);
                           free(key);
                   }
                 if (0 == debug)                  if (0 == debug)
                         return;                          return;
                 while (NULL != mlink) {                  while (NULL != mlink) {
Line 2024  dbadd(struct mpage *mpage, struct mchars *mc)
Line 2036  dbadd(struct mpage *mpage, struct mchars *mc)
         if (debug)          if (debug)
                 say(mlink->file, "Adding to database");                  say(mlink->file, "Adding to database");
   
           i = strlen(mpage->desc) + 1;
           key = mandoc_calloc(1, sizeof(struct str) + i);
           memcpy(key->key, mpage->desc, i);
           render_key(mc, key);
   
         i = 1;          i = 1;
         SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->desc);          SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, key->rendered);
         SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form);          SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form);
         SQL_STEP(stmts[STMT_INSERT_PAGE]);          SQL_STEP(stmts[STMT_INSERT_PAGE]);
         mpage->pageid = sqlite3_last_insert_rowid(db);          mpage->pageid = sqlite3_last_insert_rowid(db);
         sqlite3_reset(stmts[STMT_INSERT_PAGE]);          sqlite3_reset(stmts[STMT_INSERT_PAGE]);
   
           if (key->rendered != key->key)
                   free(key->rendered);
           free(key);
   
         while (NULL != mlink) {          while (NULL != mlink) {
                 dbadd_mlink(mlink);                  dbadd_mlink(mlink);
                 mlink = mlink->next;                  mlink = mlink->next;
Line 2209  dbopen(int real)
Line 2230  dbopen(int real)
                 rc = sqlite3_open_v2(MANDOC_DB, &db, ofl, NULL);                  rc = sqlite3_open_v2(MANDOC_DB, &db, ofl, NULL);
                 if (SQLITE_OK != rc) {                  if (SQLITE_OK != rc) {
                         exitcode = (int)MANDOCLEVEL_SYSERR;                          exitcode = (int)MANDOCLEVEL_SYSERR;
                         say(MANDOC_DB, "%s", sqlite3_errmsg(db));                          if (SQLITE_CANTOPEN != rc)
                                   say(MANDOC_DB, "%s", sqlite3_errstr(rc));
                         return(0);                          return(0);
                 }                  }
                 goto prepare_statements;                  goto prepare_statements;
Line 2223  dbopen(int real)
Line 2245  dbopen(int real)
                 goto create_tables;                  goto create_tables;
         if (MPARSE_QUICK & mparse_options) {          if (MPARSE_QUICK & mparse_options) {
                 exitcode = (int)MANDOCLEVEL_SYSERR;                  exitcode = (int)MANDOCLEVEL_SYSERR;
                 say(MANDOC_DB "~", "%s", sqlite3_errmsg(db));                  say(MANDOC_DB "~", "%s", sqlite3_errstr(rc));
                 return(0);                  return(0);
         }          }
   
Line 2239  dbopen(int real)
Line 2261  dbopen(int real)
         rc = sqlite3_open_v2(tempfilename, &db, ofl, NULL);          rc = sqlite3_open_v2(tempfilename, &db, ofl, NULL);
         if (SQLITE_OK != rc) {          if (SQLITE_OK != rc) {
                 exitcode = (int)MANDOCLEVEL_SYSERR;                  exitcode = (int)MANDOCLEVEL_SYSERR;
                 say("", "%s: %s", tempfilename, sqlite3_errmsg(db));                  say("", "%s: %s", tempfilename, sqlite3_errstr(rc));
                 return(0);                  return(0);
         }          }
   
Line 2277  create_tables:
Line 2299  create_tables:
         if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, NULL)) {          if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, NULL)) {
                 exitcode = (int)MANDOCLEVEL_SYSERR;                  exitcode = (int)MANDOCLEVEL_SYSERR;
                 say(MANDOC_DB, "%s", sqlite3_errmsg(db));                  say(MANDOC_DB, "%s", sqlite3_errmsg(db));
                   sqlite3_close(db);
                 return(0);                  return(0);
         }          }
   
 prepare_statements:  prepare_statements:
         SQL_EXEC("PRAGMA foreign_keys = ON");          if (SQLITE_OK != sqlite3_exec(db,
               "PRAGMA foreign_keys = ON", NULL, NULL, NULL)) {
                   exitcode = (int)MANDOCLEVEL_SYSERR;
                   say(MANDOC_DB, "PRAGMA foreign_keys: %s",
                       sqlite3_errmsg(db));
                   sqlite3_close(db);
                   return(0);
           }
   
         sql = "DELETE FROM mpages WHERE pageid IN "          sql = "DELETE FROM mpages WHERE pageid IN "
                 "(SELECT pageid FROM mlinks WHERE "                  "(SELECT pageid FROM mlinks WHERE "
                 "sec=? AND arch=? AND name=?)";                  "sec=? AND arch=? AND name=?)";
Line 2305  prepare_statements:
Line 2336  prepare_statements:
          * synchronous mode for much better performance.           * synchronous mode for much better performance.
          */           */
   
         if (real)          if (real && SQLITE_OK != sqlite3_exec(db,
                 SQL_EXEC("PRAGMA synchronous = OFF");              "PRAGMA synchronous = OFF", NULL, NULL, NULL)) {
                   exitcode = (int)MANDOCLEVEL_SYSERR;
                   say(MANDOC_DB, "PRAGMA synchronous: %s",
                   sqlite3_errmsg(db));
                   sqlite3_close(db);
                   return(0);
           }
 #endif  #endif
   
         return(1);          return(1);
Line 2338  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 2348  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 2357  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 2369  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 2383  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.145  
changed lines
  Added in v.1.150

CVSweb