int len, ret;
DIR *d, *p = NULL;
- ret = 0;
- len = strlen(path);
+ ret = 0;
+ len = strlen(path);
d = opendir(path);
if (!d && errno != ENOTDIR) {
if (sem_init && (ret = sem_init(path, parent ?: p, &d, data, de)))
goto err;
- if (!d || (param->get_lmv && !param->recursive)) {
- ret = 0;
+ if (!d || (param->get_lmv && !param->recursive))
goto out;
- }
while ((dent = readdir64(d)) != NULL) {
+ int rc;
+
param->have_fileinfo = 0;
if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
if (dent->d_type == DT_UNKNOWN) {
lstat_t *st = ¶m->lmd->lmd_st;
- ret = get_lmd_info(path, d, NULL, param->lmd,
+ rc = get_lmd_info(path, d, NULL, param->lmd,
param->lumlen);
- if (ret == 0)
+ if (rc == 0)
dent->d_type = IFTODT(st->st_mode);
+ else if (ret == 0)
+ ret = rc;
- if (ret == -ENOENT)
- continue;
+ if (rc == -ENOENT)
+ continue;
}
switch (dent->d_type) {
case DT_UNKNOWN:
"error: %s: '%s' is UNKNOWN type %d",
__func__, dent->d_name, dent->d_type);
break;
- case DT_DIR:
- ret = llapi_semantic_traverse(path, size, d, sem_init,
- sem_fini, data, dent);
- if (ret < 0)
- goto out;
- break;
- default:
- ret = 0;
- if (sem_init) {
- ret = sem_init(path, d, NULL, data, dent);
- if (ret < 0)
- goto out;
- }
- if (sem_fini && ret == 0)
- sem_fini(path, d, NULL, data, dent);
+ case DT_DIR:
+ rc = llapi_semantic_traverse(path, size, d, sem_init,
+ sem_fini, data, dent);
+ if (rc != 0 && ret == 0)
+ ret = rc;
+ break;
+ default:
+ rc = 0;
+ if (sem_init) {
+ rc = sem_init(path, d, NULL, data, dent);
+ if (rc < 0 && ret == 0)
+ ret = rc;
+ }
+ if (sem_fini && rc == 0)
+ sem_fini(path, d, NULL, data, dent);
}
}
closedir(d);
if (p)
closedir(p);
- return ret;
+ return ret;
}
static int param_callback(char *path, semantic_func_t sem_init,