fs-sink: handle trace name
[babeltrace.git] / common / common.c
index d6742962393758c689e03d7390810d20ea0268b2..609975f7ec749bc9436f0b7889d257a7433dde9d 100644 (file)
 #include <unistd.h>
 #include <string.h>
 #include <sys/types.h>
-#include <pwd.h>
 #include <unistd.h>
 #include <assert.h>
 #include <ctype.h>
 #include <glib.h>
+#include <stdlib.h>
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/common-internal.h>
+#include <babeltrace/compat/unistd-internal.h>
+
+#ifndef __MINGW32__
+#include <pwd.h>
+#endif
 
 #define SYSTEM_PLUGIN_PATH     INSTALL_LIBDIR "/babeltrace/plugins"
 #define HOME_ENV_VAR           "HOME"
@@ -87,13 +92,22 @@ const char *bt_common_get_system_plugin_path(void)
        return SYSTEM_PLUGIN_PATH;
 }
 
+#ifdef __MINGW32__
+BT_HIDDEN
+bool bt_common_is_setuid_setgid(void)
+{
+       return false;
+}
+#else /* __MINGW32__ */
 BT_HIDDEN
 bool bt_common_is_setuid_setgid(void)
 {
        return (geteuid() != getuid() || getegid() != getgid());
 }
+#endif /* __MINGW32__ */
 
-static char *bt_secure_getenv(const char *name)
+static
+char *bt_secure_getenv(const char *name)
 {
        if (bt_common_is_setuid_setgid()) {
                printf_error("Disregarding %s environment variable for setuid/setgid binary",
@@ -103,7 +117,15 @@ static char *bt_secure_getenv(const char *name)
        return getenv(name);
 }
 
-static const char *get_home_dir(void)
+#ifdef __MINGW32__
+static
+const char *bt_get_home_dir(void)
+{
+       return g_get_home_dir();
+}
+#else /* __MINGW32__ */
+static
+const char *bt_get_home_dir(void)
 {
        char *val = NULL;
        struct passwd *pwd;
@@ -121,6 +143,7 @@ static const char *get_home_dir(void)
 end:
        return val;
 }
+#endif /* __MINGW32__ */
 
 BT_HIDDEN
 char *bt_common_get_home_plugin_path(void)
@@ -128,7 +151,7 @@ char *bt_common_get_home_plugin_path(void)
        char *path = NULL;
        const char *home_dir;
 
-       home_dir = get_home_dir();
+       home_dir = bt_get_home_dir();
        if (!home_dir) {
                goto end;
        }
@@ -1008,3 +1031,134 @@ end_of_pattern:
        p++;
        return p[-1] == '*' && at_end_of_pattern(p, pattern, pattern_len);
 }
+
+static
+void append_path_parts(const char *path, GPtrArray *parts)
+{
+       const char *ch = path;
+       const char *last = path;
+
+       while (true) {
+               if (*ch == G_DIR_SEPARATOR || *ch == '\0') {
+                       if (ch - last > 0) {
+                               GString *part = g_string_new(NULL);
+
+                               assert(part);
+                               g_string_append_len(part, last, ch - last);
+                               g_ptr_array_add(parts, part);
+                       }
+
+                       if (*ch == '\0') {
+                               break;
+                       }
+
+                       last = ch + 1;
+               }
+
+               ch++;
+       }
+}
+
+static
+void destroy_gstring(void *gstring)
+{
+       (void) g_string_free(gstring, TRUE);
+}
+
+BT_HIDDEN
+GString *bt_common_normalize_path(const char *path, const char *wd)
+{
+       size_t i;
+       GString *norm_path;
+       GPtrArray *parts = NULL;
+
+       assert(path);
+       norm_path = g_string_new(G_DIR_SEPARATOR_S);
+       if (!norm_path) {
+               goto error;
+       }
+
+       parts = g_ptr_array_new_with_free_func(destroy_gstring);
+       if (!parts) {
+               goto error;
+       }
+
+       if (path[0] != G_DIR_SEPARATOR) {
+               /* Relative path: start with working directory */
+               if (wd) {
+                       append_path_parts(wd, parts);
+               } else {
+                       gchar *cd = g_get_current_dir();
+
+                       append_path_parts(cd, parts);
+                       g_free(cd);
+               }
+       }
+
+       /* Append parts of the path parameter */
+       append_path_parts(path, parts);
+
+       /* Resolve special `..` and `.` parts */
+       for (i = 0; i < parts->len; i++) {
+               GString *part = g_ptr_array_index(parts, i);
+
+               if (strcmp(part->str, "..") == 0) {
+                       if (i == 0) {
+                               /*
+                                * First part of absolute path is `..`:
+                                * this is invalid.
+                                */
+                               goto error;
+                       }
+
+                       /* Remove `..` and previous part */
+                       g_ptr_array_remove_index(parts, i - 1);
+                       g_ptr_array_remove_index(parts, i - 1);
+                       i -= 2;
+               } else if (strcmp(part->str, ".") == 0) {
+                       /* Remove `.` */
+                       g_ptr_array_remove_index(parts, i);
+                       i -= 1;
+               }
+       }
+
+       /* Create normalized path with what's left */
+       for (i = 0; i < parts->len; i++) {
+               GString *part = g_ptr_array_index(parts, i);
+
+               g_string_append(norm_path, part->str);
+
+               if (i < parts->len - 1) {
+                       g_string_append_c(norm_path, G_DIR_SEPARATOR);
+               }
+       }
+
+       goto end;
+
+error:
+       if (norm_path) {
+               g_string_free(norm_path, TRUE);
+               norm_path = NULL;
+       }
+
+end:
+       if (parts) {
+               g_ptr_array_free(parts, TRUE);
+       }
+
+       return norm_path;
+}
+
+BT_HIDDEN
+size_t bt_common_get_page_size(void)
+{
+       int page_size;
+
+       page_size = bt_sysconf(_SC_PAGESIZE);
+       if (page_size < 0) {
+               printf_error("Cannot get system page size.");
+               abort();
+       }
+
+       return page_size;
+}
This page took 0.026353 seconds and 4 git commands to generate.