Code

make rrd_mkdir_p work on bsd* unixes too ... their dirname call works differently...
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Wed, 23 Nov 2011 08:53:49 +0000 (08:53 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Wed, 23 Nov 2011 08:53:49 +0000 (08:53 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4/program@2218 a5681a0c-68f1-0310-ab6d-d61299d08faa

src/rrd_utils.c

index 31e53e2a6684d638516db02e911abf084bd1471f..94c86558e3217b6ecf579b83bc87fc22886b7d15 100644 (file)
@@ -146,23 +146,33 @@ int rrd_mkdir_p(const char *pathname, mode_t mode)
         return -1;
 
 #ifndef _MSC_VER
-    base_dir = dirname(pathname_copy);
+    /* the data pointedd too by dirname might change too (bsd) */
+    if (NULL == (base_dir = strdup(dirname(pathname_copy)))) {
+        free(pathname_copy);
+        return -1;
+    }
 #else
-       _splitpath(pathname_copy, NULL, base_dir, NULL, NULL);
+    _splitpath(pathname_copy, NULL, base_dir, NULL, NULL);
 #endif
 
     if (0 != rrd_mkdir_p(base_dir, mode)) {
         int orig_errno = errno;
         free(pathname_copy);
+#ifndef _MSC_VER
+        free(base_dir);
+#endif
         errno = orig_errno;
         return -1;
     }
 
     free(pathname_copy);
+#ifndef _MSC_VER
+    free(base_dir);
+#endif
 
     /* keep errno as set by mkdir() */
 #ifdef _MSC_VER
-       if (0 != mkdir(pathname))
+    if (0 != mkdir(pathname))
         return -1;
 #else
     if (0 != mkdir(pathname, mode))