DIR *dir;
int dir_fd, ret = 0, closeret;
struct dirent *entry;
+ size_t path_len;
int has_warning = 0;
/* Open directory */
PERROR("Cannot open '%s' path", input_path);
return -1;
}
+
+ path_len = strlen(input_path);
+
dir_fd = dirfd(dir);
if (dir_fd < 0) {
PERROR("dirfd");
}
while ((entry = readdir(dir))) {
+ struct stat st;
+ size_t name_len;
+ char filename[PATH_MAX];
+
if (!strcmp(entry->d_name, ".")
|| !strcmp(entry->d_name, "..")) {
continue;
}
- switch (entry->d_type) {
- case DT_DIR:
- {
+
+ name_len = strlen(entry->d_name);
+ if (path_len + name_len + 2 > sizeof(filename)) {
+ ERR("Failed to remove file: path name too long (%s/%s)",
+ input_path, entry->d_name);
+ continue;
+ }
+
+ if (snprintf(filename, sizeof(filename), "%s/%s",
+ input_path, entry->d_name) < 0) {
+ ERR("Failed to format path.");
+ continue;
+ }
+
+ if (stat(filename, &st)) {
+ PERROR("stat");
+ continue;
+ }
+
+ if (S_ISDIR(st.st_mode)) {
char output_subpath[PATH_MAX];
char input_subpath[PATH_MAX];
if (ret) {
has_warning = 1;
}
- break;
- }
- case DT_REG:
- case DT_LNK:
+ } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
if (!strcmp(entry->d_name, "metadata")) {
ret = extract_one_trace(output_path,
input_path);
has_warning = 1;
}
}
- /* Ignore other files */
- break;
- default:
+ } else {
has_warning = 1;
goto end;
}
{
DIR *dir;
int dir_fd, ret = 0, closeret;
+ size_t path_len;
struct dirent *entry;
/* Open trace directory */
ret = -errno;
goto end;
}
+
+ path_len = strlen(path);
+
dir_fd = dirfd(dir);
if (dir_fd < 0) {
PERROR("dirfd");
}
while ((entry = readdir(dir))) {
+ struct stat st;
+ size_t name_len;
+ char filename[PATH_MAX];
+
if (!strcmp(entry->d_name, ".")
|| !strcmp(entry->d_name, "..")) {
continue;
}
- switch (entry->d_type) {
- case DT_DIR:
- {
+
+ name_len = strlen(entry->d_name);
+ if (path_len + name_len + 2 > sizeof(filename)) {
+ ERR("Failed to remove file: path name too long (%s/%s)",
+ path, entry->d_name);
+ continue;
+ }
+
+ if (snprintf(filename, sizeof(filename), "%s/%s",
+ path, entry->d_name) < 0) {
+ ERR("Failed to format path.");
+ continue;
+ }
+
+ if (stat(filename, &st)) {
+ PERROR("stat");
+ continue;
+ }
+
+ if (S_ISDIR(st.st_mode)) {
char *subpath = zmalloc(PATH_MAX);
if (!subpath) {
/* Error occured, abort traversal. */
goto end;
}
- break;
- }
- case DT_REG:
+ } else if (S_ISREG(st.st_mode)) {
ret = unlinkat(dir_fd, entry->d_name, 0);
if (ret) {
PERROR("Unlinking '%s'", entry->d_name);
goto end;
}
- break;
- default:
+ } else {
ret = -EINVAL;
goto end;
}