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

Diff for /mandoc/mansearch.c between version 1.56 and 1.57

version 1.56, 2015/03/27 17:37:25 version 1.57, 2015/04/01 12:48:33
Line 163  mansearch(const struct mansearch *search,
Line 163  mansearch(const struct mansearch *search,
                 int argc, char *argv[],                  int argc, char *argv[],
                 struct manpage **res, size_t *sz)                  struct manpage **res, size_t *sz)
 {  {
         int              fd, rc, c, indexbit;  
         int64_t          pageid;          int64_t          pageid;
         uint64_t         outbit, iterbit;          uint64_t         outbit, iterbit;
         char             buf[PATH_MAX];          char             buf[PATH_MAX];
Line 177  mansearch(const struct mansearch *search,
Line 176  mansearch(const struct mansearch *search,
         struct ohash     htab;          struct ohash     htab;
         unsigned int     idx;          unsigned int     idx;
         size_t           i, j, cur, maxres;          size_t           i, j, cur, maxres;
           int              c, chdir_status, getcwd_status, indexbit;
   
           if (argc == 0 || (e = exprcomp(search, argc, argv)) == NULL) {
                   *sz = 0;
                   return(0);
           }
   
         info.calloc = hash_calloc;          info.calloc = hash_calloc;
         info.alloc = hash_alloc;          info.alloc = hash_alloc;
         info.free = hash_free;          info.free = hash_free;
         info.key_offset = offsetof(struct match, pageid);          info.key_offset = offsetof(struct match, pageid);
   
         *sz = cur = maxres = 0;          cur = maxres = 0;
         sql = NULL;  
         *res = NULL;          *res = NULL;
         fd = -1;  
         e = NULL;  
         rc = 0;  
   
         if (0 == argc)  
                 goto out;  
         if (NULL == (e = exprcomp(search, argc, argv)))  
                 goto out;  
   
         if (NULL != search->outkey) {          if (NULL != search->outkey) {
                 outbit = TYPE_Nd;                  outbit = TYPE_Nd;
                 for (indexbit = 0, iterbit = 1;                  for (indexbit = 0, iterbit = 1;
Line 210  mansearch(const struct mansearch *search,
Line 206  mansearch(const struct mansearch *search,
                 outbit = 0;                  outbit = 0;
   
         /*          /*
          * Save a descriptor to the current working directory.           * Remember the original working directory, if possible.
          * Since pathnames in the "paths" variable might be relative,           * This will be needed if the second or a later directory
          * and we'll be chdir()ing into them, we need to keep a handle           * is given as a relative path.
          * on our current directory from which to start the chdir().           * Do not error out if the current directory is not
            * searchable: Maybe it won't be needed after all.
          */           */
   
         if (NULL == getcwd(buf, PATH_MAX)) {          if (getcwd(buf, PATH_MAX) == NULL) {
                 perror("getcwd");                  getcwd_status = 0;
                 goto out;                  (void)strlcpy(buf, strerror(errno), sizeof(buf));
         } else if (-1 == (fd = open(buf, O_RDONLY, 0))) {          } else
                 perror(buf);                  getcwd_status = 1;
                 goto out;  
         }  
   
         sql = sql_statement(e);          sql = sql_statement(e);
   
Line 234  mansearch(const struct mansearch *search,
Line 229  mansearch(const struct mansearch *search,
          * scan it for our match expression.           * scan it for our match expression.
          */           */
   
           chdir_status = 0;
         for (i = 0; i < paths->sz; i++) {          for (i = 0; i < paths->sz; i++) {
                 if (-1 == fchdir(fd)) {                  if (chdir_status && paths->paths[i][0] != '/') {
                         perror(buf);                          if ( ! getcwd_status) {
                         free(*res);                                  fprintf(stderr, "%s: getcwd: %s\n",
                         break;                                      paths->paths[i], buf);
                 } else if (-1 == chdir(paths->paths[i])) {                                  continue;
                           } else if (chdir(buf) == -1) {
                                   perror(buf);
                                   continue;
                           }
                   }
                   if (chdir(paths->paths[i]) == -1) {
                         perror(paths->paths[i]);                          perror(paths->paths[i]);
                         continue;                          continue;
                 }                  }
                   chdir_status = 1;
   
                 c = sqlite3_open_v2(MANDOC_DB, &db,                  c = sqlite3_open_v2(MANDOC_DB, &db,
                     SQLITE_OPEN_READONLY, NULL);                      SQLITE_OPEN_READONLY, NULL);
Line 370  mansearch(const struct mansearch *search,
Line 373  mansearch(const struct mansearch *search,
                         break;                          break;
         }          }
         qsort(*res, cur, sizeof(struct manpage), manpage_compare);          qsort(*res, cur, sizeof(struct manpage), manpage_compare);
         rc = 1;          if (chdir_status && getcwd_status && chdir(buf) == -1)
 out:                  perror(buf);
         if (-1 != fd) {  
                 if (-1 == fchdir(fd))  
                         perror(buf);  
                 close(fd);  
         }  
         exprfree(e);          exprfree(e);
         free(sql);          free(sql);
         *sz = cur;          *sz = cur;
         return(rc);          return(1);
 }  }
   
 void  void

Legend:
Removed from v.1.56  
changed lines
  Added in v.1.57

CVSweb