fs-sink: fix handling static notifications
[babeltrace.git] / common / common.c
index bc22fa5c6a71a25ed32da120d4c70471ff80c2fd..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"
 #define HOME_PLUGIN_SUBPATH    "/.local/lib/babeltrace/plugins"
 
+static const char *bt_common_color_code_reset = "";
+static const char *bt_common_color_code_bold = "";
+static const char *bt_common_color_code_fg_default = "";
+static const char *bt_common_color_code_fg_red = "";
+static const char *bt_common_color_code_fg_green = "";
+static const char *bt_common_color_code_fg_yellow = "";
+static const char *bt_common_color_code_fg_blue = "";
+static const char *bt_common_color_code_fg_magenta = "";
+static const char *bt_common_color_code_fg_cyan = "";
+static const char *bt_common_color_code_fg_light_gray = "";
+static const char *bt_common_color_code_bg_default = "";
+static const char *bt_common_color_code_bg_red = "";
+static const char *bt_common_color_code_bg_green = "";
+static const char *bt_common_color_code_bg_yellow = "";
+static const char *bt_common_color_code_bg_blue = "";
+static const char *bt_common_color_code_bg_magenta = "";
+static const char *bt_common_color_code_bg_cyan = "";
+static const char *bt_common_color_code_bg_light_gray = "";
+
+static
+void __attribute__((constructor)) bt_common_color_ctor(void)
+{
+       if (bt_common_colors_supported()) {
+               bt_common_color_code_reset = BT_COMMON_COLOR_RESET;
+               bt_common_color_code_bold = BT_COMMON_COLOR_BOLD;
+               bt_common_color_code_fg_default = BT_COMMON_COLOR_FG_DEFAULT;
+               bt_common_color_code_fg_red = BT_COMMON_COLOR_FG_RED;
+               bt_common_color_code_fg_green = BT_COMMON_COLOR_FG_GREEN;
+               bt_common_color_code_fg_yellow = BT_COMMON_COLOR_FG_YELLOW;
+               bt_common_color_code_fg_blue = BT_COMMON_COLOR_FG_BLUE;
+               bt_common_color_code_fg_magenta = BT_COMMON_COLOR_FG_MAGENTA;
+               bt_common_color_code_fg_cyan = BT_COMMON_COLOR_FG_CYAN;
+               bt_common_color_code_fg_light_gray = BT_COMMON_COLOR_FG_LIGHT_GRAY;
+               bt_common_color_code_bg_default = BT_COMMON_COLOR_BG_DEFAULT;
+               bt_common_color_code_bg_red = BT_COMMON_COLOR_BG_RED;
+               bt_common_color_code_bg_green = BT_COMMON_COLOR_BG_GREEN;
+               bt_common_color_code_bg_yellow = BT_COMMON_COLOR_BG_YELLOW;
+               bt_common_color_code_bg_blue = BT_COMMON_COLOR_BG_BLUE;
+               bt_common_color_code_bg_magenta = BT_COMMON_COLOR_BG_MAGENTA;
+               bt_common_color_code_bg_cyan = BT_COMMON_COLOR_BG_CYAN;
+               bt_common_color_code_bg_light_gray = BT_COMMON_COLOR_BG_LIGHT_GRAY;
+       }
+}
+
 BT_HIDDEN
 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",
@@ -59,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;
@@ -77,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)
@@ -84,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;
        }
@@ -208,111 +275,109 @@ end:
 BT_HIDDEN
 const char *bt_common_color_reset(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_RESET : "";
+       return bt_common_color_code_reset;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bold(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BOLD : "";
+       return bt_common_color_code_bold;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_default(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_DEFAULT : "";
+       return bt_common_color_code_fg_default;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_red(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_RED : "";
+       return bt_common_color_code_fg_red;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_green(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_GREEN : "";
+       return bt_common_color_code_fg_green;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_yellow(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_YELLOW : "";
+       return bt_common_color_code_fg_yellow;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_blue(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_BLUE : "";
+       return bt_common_color_code_fg_blue;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_magenta(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_MAGENTA : "";
+       return bt_common_color_code_fg_magenta;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_cyan(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_FG_CYAN : "";
+       return bt_common_color_code_fg_cyan;
 }
 
 BT_HIDDEN
 const char *bt_common_color_fg_light_gray(void)
 {
-       return bt_common_colors_supported() ?
-               BT_COMMON_COLOR_FG_LIGHT_GRAY : "";
+       return bt_common_color_code_fg_light_gray;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_default(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_DEFAULT : "";
+       return bt_common_color_code_bg_default;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_red(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_RED : "";
+       return bt_common_color_code_bg_red;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_green(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_GREEN : "";
+       return bt_common_color_code_bg_green;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_yellow(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_YELLOW : "";
+       return bt_common_color_code_bg_yellow;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_blue(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_BLUE : "";
+       return bt_common_color_code_bg_blue;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_magenta(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_MAGENTA : "";
+       return bt_common_color_code_bg_magenta;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_cyan(void)
 {
-       return bt_common_colors_supported() ? BT_COMMON_COLOR_BG_CYAN : "";
+       return bt_common_color_code_bg_cyan;
 }
 
 BT_HIDDEN
 const char *bt_common_color_bg_light_gray(void)
 {
-       return bt_common_colors_supported() ?
-               BT_COMMON_COLOR_BG_LIGHT_GRAY : "";
+       return bt_common_color_code_bg_light_gray;
 }
 
 BT_HIDDEN
@@ -966,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.027977 seconds and 4 git commands to generate.