[lttng-dev] [PATCH lttng-tools 2/2] Fix: lttng-crash: remove tmp working directory
Jonathan Rajotte
jonathan.rajotte-julien at efficios.com
Thu Sep 3 17:52:07 EDT 2015
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
---
src/bin/lttng-crash/lttng-crash.c | 65 +++++++++++++++++++++++++++++----------
1 file changed, 48 insertions(+), 17 deletions(-)
diff --git a/src/bin/lttng-crash/lttng-crash.c b/src/bin/lttng-crash/lttng-crash.c
index 8e57034..00a97df 100644
--- a/src/bin/lttng-crash/lttng-crash.c
+++ b/src/bin/lttng-crash/lttng-crash.c
@@ -1053,35 +1053,62 @@ end:
}
static
-int delete_trace(const char *trace_path)
+int delete_recursive_dir(const char *path)
{
- DIR *trace_dir;
- int trace_dir_fd, ret = 0, closeret;
+ DIR *dir;
+ int dir_fd, ret = 0, closeret;
struct dirent *entry;
/* Open trace directory */
- trace_dir = opendir(trace_path);
- if (!trace_dir) {
- PERROR("Cannot open '%s' path", trace_path);
+ dir = opendir(path);
+ if (!dir) {
+ PERROR("Cannot open '%s' path", path);
return -1;
}
- trace_dir_fd = dirfd(trace_dir);
- if (trace_dir_fd < 0) {
+ dir_fd = dirfd(dir);
+ if (dir_fd < 0) {
PERROR("dirfd");
return -1;
}
- while ((entry = readdir(trace_dir))) {
+ while ((entry = readdir(dir))) {
if (!strcmp(entry->d_name, ".")
|| !strcmp(entry->d_name, "..")) {
continue;
}
switch (entry->d_type) {
case DT_DIR:
- unlinkat(trace_dir_fd, entry->d_name, AT_REMOVEDIR);
+ {
+ char subpath[PATH_MAX];
+
+ strncpy(subpath, path,
+ sizeof(subpath));
+ subpath[sizeof(subpath) - 1] = '\0';
+ strncat(subpath, "/",
+ sizeof(subpath) - strlen(subpath) - 1);
+ strncat(subpath, entry->d_name,
+ sizeof(subpath) - strlen(subpath) - 1);
+
+ ret = delete_recursive_dir(subpath);
+ if (ret) {
+ goto end;
+ }
+
+ ret = unlinkat(dir_fd, entry->d_name, AT_REMOVEDIR);
+ if (ret) {
+ PERROR("Unlinking '%s'", entry->d_name);
+ goto end;
+ }
+
break;
+ }
case DT_REG:
- unlinkat(trace_dir_fd, entry->d_name, 0);
+ ret = unlinkat(dir_fd, entry->d_name, 0);
+ if (ret) {
+ PERROR("Unlinking '%s'", entry->d_name);
+ goto end;
+ }
+
break;
default:
ret = -EINVAL;
@@ -1089,13 +1116,10 @@ int delete_trace(const char *trace_path)
}
}
end:
- closeret = closedir(trace_dir);
+ closeret = closedir(dir);
if (closeret) {
PERROR("closedir");
}
- if (!ret) {
- ret = rmdir(trace_path);
- }
return ret;
}
@@ -1178,9 +1202,16 @@ int main(int argc, char *argv[])
has_warning = 1;
/* unlink temporary trace */
- ret = delete_trace(output_path);
- if (ret)
+ ret = delete_recursive_dir(output_path);
+ if (ret){
has_warning = 1;
+ }else{
+ ret = rmdir(output_path);
+ if (ret) {
+ PERROR("Deleting '%s'", output_path);
+ has_warning = 1;
+ }
+ }
}
if (has_warning)
exit(EXIT_FAILURE);
--
2.1.4
More information about the lttng-dev
mailing list