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 |