summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
0c39a7e)
The callers of the regfile iter API already handle the case of no
epigrams or tag expressions just fine. In particular, the stats
command can still print meaningful output if the tag expression
directory does not exist, which is a perfectly valid setup.
This patch modifies regfile_iter_new() to no longer abort but merely
print a log message and return NULL if opendir() fails. The various
accessors of the regfile iter API have to be adjusted to deal with
NULL pointers but no changes to tfortune.c are required.
void regfile_iter_new(const char *dirname, struct regfile_iter **result)
{
void regfile_iter_new(const char *dirname, struct regfile_iter **result)
{
- struct regfile_iter *iter = xmalloc(sizeof(*iter));
+ struct regfile_iter *iter;
+ DIR *dir = opendir(dirname);
- iter->dir = opendir(dirname);
- if (!iter->dir) {
- EMERG_LOG("opendir %s: %s\n", dirname, strerror(errno));
- exit(EXIT_FAILURE);
+ if (!dir) {
+ NOTICE_LOG("opendir %s: %s\n", dirname, strerror(errno));
+ *result = NULL;
+ return;
+ iter = xmalloc(sizeof(*iter));
+ iter->dir = dir;
iter->dfd = dirfd(iter->dir);
assert(iter->dfd >= 0);
regfile_iter_next(iter);
iter->dfd = dirfd(iter->dir);
assert(iter->dfd >= 0);
regfile_iter_next(iter);
void *map;
const char *path;
void *map;
const char *path;
+ if (!iter || !iter->entry)
return false;
path = iter->entry->d_name;
ret = openat(iter->dfd, path, O_RDONLY, 0);
return false;
path = iter->entry->d_name;
ret = openat(iter->dfd, path, O_RDONLY, 0);
const char *regfile_iter_basename(const struct regfile_iter *iter)
{
const char *regfile_iter_basename(const struct regfile_iter *iter)
{
+ if (!iter || !iter->entry)
return NULL;
return iter->entry->d_name;
}
const struct stat *regfile_iter_stat(const struct regfile_iter *iter)
{
return NULL;
return iter->entry->d_name;
}
const struct stat *regfile_iter_stat(const struct regfile_iter *iter)
{
+ return iter? &iter->stat : NULL;
}
void regfile_iter_free(struct regfile_iter *iter)
{
}
void regfile_iter_free(struct regfile_iter *iter)
{
closedir(iter->dir);
free(iter);
}
closedir(iter->dir);
free(iter);
}