/* Variables */
static char *progname,
- *opt_viewer_path = DEFAULT_VIEWER,
- *opt_output_path;
+ *opt_viewer_path = NULL,
+ *opt_output_path = NULL;
static char *input_path;
}
break;
case 'e':
+ free(opt_viewer_path);
opt_viewer_path = strdup(optarg);
break;
case 'x':
+ free(opt_output_path);
opt_output_path = strdup(optarg);
break;
case OPT_DUMP_OPTIONS:
}
}
+ if (!opt_viewer_path) {
+ opt_viewer_path = DEFAULT_VIEWER;
+ }
+
/* No leftovers, or more than one input path, print usage and quit */
if ((argc - optind) == 0 || (argc - optind) > 1) {
usage(stderr);
return -EINVAL;
}
- DBG("Copy crash subbuffer at offset %lu", offset);
+ DBG("Copy crash subbuffer at offset %" PRIu64, offset);
sbidx = subbuf_index(offset, buf_size, subbuf_size);
/*
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:
+ } 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;
}