about summary refs log tree commit diff stats
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/common.c b/src/common.c
index 2d1ac3d7..da33cc3d 100644
--- a/src/common.c
+++ b/src/common.c
@@ -25,21 +25,20 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/types.h>
 #include <sys/stat.h>
 
 #include <curl/curl.h>
 #include <curl/easy.h>
 #include <glib.h>
 
+#include "log.h"
 #include "common.h"
 
 // assume malloc stores at most 8 bytes for size of allocated memory
 // and page size is at least 4KB
 #define READ_BUF_SIZE 4088
 
-// for generating ids
-static int unique_id = 0;
-
 struct curl_data_t
 {
     char *buffer;
@@ -72,29 +71,43 @@ p_slist_free_full(GSList *items, GDestroyNotify free_func)
     g_slist_free (items);
 }
 
-void
+gboolean
 create_dir(char *name)
 {
-    int e;
     struct stat sb;
 
-    e = stat(name, &sb);
-    if (e != 0)
-        if (errno == ENOENT)
-            e = mkdir(name, S_IRWXU);
+    if (stat(name, &sb) != 0) {
+        if (errno != ENOENT || mkdir(name, S_IRWXU) != 0) {
+            return FALSE;
+        }
+    } else {
+        if ((sb.st_mode & S_IFDIR) != S_IFDIR) {
+            log_debug("create_dir: %s exists and is not a directory!", name);
+            return FALSE;
+        }
+    }
+
+    return TRUE;
 }
 
-void
+gboolean
 mkdir_recursive(const char *dir)
 {
     int i;
+    gboolean result = TRUE;
+
     for (i = 1; i <= strlen(dir); i++) {
         if (dir[i] == '/' || dir[i] == '\0') {
             gchar *next_dir = g_strndup(dir, i);
-            create_dir(next_dir);
+            result = create_dir(next_dir);
             g_free(next_dir);
+            if (!result) {
+                break;
+            }
         }
     }
+
+    return result;
 }
 
 char *
@@ -400,10 +413,12 @@ xdg_get_data_home(void)
 char *
 get_unique_id(void)
 {
+    static unsigned long unique_id;
     char *result = NULL;
-    unique_id++;
     GString *result_str = g_string_new("");
-    g_string_printf(result_str, "prof%d", unique_id);
+
+    unique_id++;
+    g_string_printf(result_str, "prof%lu", unique_id);
     result = result_str->str;
     g_string_free(result_str, FALSE);