Port fix: Windows does not allow read-only mappings > file's size
[babeltrace.git] / common / common.c
index b92fc89dd660aa85917c55071eedb996789986ce..363ffe2da5725e031954edc75f8c0d3928640ae2 100644 (file)
  * SOFTWARE.
  */
 
+#define BT_LOG_TAG "COMMON"
+#include "logging.h"
+
 #include <unistd.h>
 #include <string.h>
 #include <sys/types.h>
-#include <pwd.h>
 #include <unistd.h>
 #include <assert.h>
 #include <ctype.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"
@@ -89,23 +95,40 @@ 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",
-                       name);
+               BT_LOGD("Disregarding environment variable for setuid/setgid binary: "
+                       "name=\"%s\"", name);
                return NULL;
        }
        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;
@@ -123,21 +146,25 @@ static const char *get_home_dir(void)
 end:
        return val;
 }
+#endif /* __MINGW32__ */
 
 BT_HIDDEN
 char *bt_common_get_home_plugin_path(void)
 {
        char *path = NULL;
        const char *home_dir;
+       size_t length;
 
-       home_dir = get_home_dir();
+       home_dir = bt_get_home_dir();
        if (!home_dir) {
                goto end;
        }
 
-       if (strlen(home_dir) + strlen(HOME_PLUGIN_SUBPATH) + 1 >= PATH_MAX) {
-               printf_error("Home directory path is too long: `%s`\n",
-                       home_dir);
+       length = strlen(home_dir) + strlen(HOME_PLUGIN_SUBPATH) + 1;
+
+       if (length >= PATH_MAX) {
+               BT_LOGW("Home directory path is too long: length=%zu",
+                       length);
                goto end;
        }
 
@@ -174,19 +201,19 @@ int bt_common_append_plugin_path_dirs(const char *paths, GPtrArray *dirs)
 
        while (at < end) {
                GString *path;
-               const char *next_colon;
+               const char *next_sep;
 
-               next_colon = strchr(at, ':');
-               if (next_colon == at) {
+               next_sep = strchr(at, G_SEARCHPATH_SEPARATOR);
+               if (next_sep == at) {
                        /*
                         * Empty path: try next character (supported
                         * to conform to the typical parsing of $PATH).
                         */
                        at++;
                        continue;
-               } else if (!next_colon) {
-                       /* No more colon: use the remaining */
-                       next_colon = paths + strlen(paths);
+               } else if (!next_sep) {
+                       /* No more separator: use the remaining */
+                       next_sep = paths + strlen(paths);
                }
 
                path = g_string_new(NULL);
@@ -194,8 +221,8 @@ int bt_common_append_plugin_path_dirs(const char *paths, GPtrArray *dirs)
                        goto error;
                }
 
-               g_string_append_len(path, at, next_colon - at);
-               at = next_colon + 1;
+               g_string_append_len(path, at, next_sep - at);
+               at = next_sep + 1;
                g_ptr_array_add(dirs, path);
        }
 
@@ -219,6 +246,7 @@ bool bt_common_colors_supported(void)
        static bool supports_colors = false;
        static bool supports_colors_set = false;
        const char *term;
+       const char *force;
 
        if (supports_colors_set) {
                goto end;
@@ -226,6 +254,12 @@ bool bt_common_colors_supported(void)
 
        supports_colors_set = true;
 
+       force = getenv("BABELTRACE_FORCE_COLORS");
+       if (force && strcmp(force, "1") == 0) {
+               supports_colors = true;
+               goto end;
+       }
+
        term = getenv("TERM");
        if (!term) {
                goto end;
@@ -1135,7 +1169,8 @@ size_t bt_common_get_page_size(void)
 
        page_size = bt_sysconf(_SC_PAGESIZE);
        if (page_size < 0) {
-               printf_error("Cannot get system page size.");
+               BT_LOGF("Cannot get system's page size: ret=%d",
+                       page_size);
                abort();
        }
 
This page took 0.027347 seconds and 4 git commands to generate.