Fix: reference counting of consumer output
[lttng-tools.git] / src / common / utils.c
index 9a53330004931408df017fb4b2ebbd87ad31a61e..766f224c7e167118d30dbd99c6b32595b4fe99e4 100644 (file)
@@ -32,6 +32,7 @@
 #include <grp.h>
 #include <pwd.h>
 #include <sys/file.h>
+#include <dirent.h>
 
 #include <common/common.h>
 #include <common/runas.h>
@@ -1049,12 +1050,77 @@ char *utils_generate_optstring(const struct option *long_options,
                        break;
                }
 
-               optstring[str_pos++] = (char)long_options[i].val;
-               if (long_options[i].has_arg) {
-                       optstring[str_pos++] = ':';
+               if (long_options[i].val != '\0') {
+                       optstring[str_pos++] = (char) long_options[i].val;
+                       if (long_options[i].has_arg) {
+                               optstring[str_pos++] = ':';
+                       }
                }
        }
 
 end:
        return optstring;
 }
+
+/*
+ * Try to remove a hierarchy of empty directories, recursively. Don't unlink
+ * any file. Try to rmdir any empty directory within the hierarchy.
+ */
+LTTNG_HIDDEN
+int utils_recursive_rmdir(const char *path)
+{
+       DIR *dir;
+       int dir_fd, ret = 0, closeret, is_empty = 1;
+       struct dirent *entry;
+
+       /* Open directory */
+       dir = opendir(path);
+       if (!dir) {
+               PERROR("Cannot open '%s' path", path);
+               return -1;
+       }
+       dir_fd = dirfd(dir);
+       if (dir_fd < 0) {
+               PERROR("dirfd");
+               return -1;
+       }
+
+       while ((entry = readdir(dir))) {
+               if (!strcmp(entry->d_name, ".")
+                               || !strcmp(entry->d_name, ".."))
+                       continue;
+               switch (entry->d_type) {
+               case DT_DIR:
+               {
+                       char subpath[PATH_MAX];
+
+                       strncpy(subpath, path, PATH_MAX);
+                       subpath[PATH_MAX - 1] = '\0';
+                       strncat(subpath, "/",
+                               PATH_MAX - strlen(subpath) - 1);
+                       strncat(subpath, entry->d_name,
+                               PATH_MAX - strlen(subpath) - 1);
+                       if (utils_recursive_rmdir(subpath)) {
+                               is_empty = 0;
+                       }
+                       break;
+               }
+               case DT_REG:
+                       is_empty = 0;
+                       break;
+               default:
+                       ret = -EINVAL;
+                       goto end;
+               }
+       }
+end:
+       closeret = closedir(dir);
+       if (closeret) {
+               PERROR("closedir");
+       }
+       if (is_empty) {
+               DBG3("Attempting rmdir %s", path);
+               ret = rmdir(path);
+       }
+       return ret;
+}
This page took 0.023719 seconds and 4 git commands to generate.