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

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

version 1.54, 2015/02/27 16:02:10 version 1.57, 2015/04/01 12:48:33
Line 7 
Line 7 
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
  * copyright notice and this permission notice appear in all copies.   * copyright notice and this permission notice appear in all copies.
  *   *
  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Line 46 
Line 46 
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "manpath.h"  #include "manconf.h"
 #include "mansearch.h"  #include "mansearch.h"
   
 extern int mansearch_keymax;  extern int mansearch_keymax;
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;  
   
         outbit = 0;  
         if (NULL != search->outkey) {          if (NULL != search->outkey) {
                   outbit = TYPE_Nd;
                 for (indexbit = 0, iterbit = 1;                  for (indexbit = 0, iterbit = 1;
                      indexbit < mansearch_keymax;                       indexbit < mansearch_keymax;
                      indexbit++, iterbit <<= 1) {                       indexbit++, iterbit <<= 1) {
Line 206  mansearch(const struct mansearch *search,
Line 202  mansearch(const struct mansearch *search,
                                 break;                                  break;
                         }                          }
                 }                  }
         }          } else
                   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 233  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 369  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.54  
changed lines
  Added in v.1.57

CVSweb