added rrd_mkdir_p - This function may be used to recursively create some directory...
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Mon, 28 Sep 2009 16:13:58 +0000 (16:13 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Mon, 28 Sep 2009 16:13:58 +0000 (16:13 +0000)
"mkdir -p" on the command-line. --  Sebastian Harl

git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1913 a5681a0c-68f1-0310-ab6d-d61299d08faa

src/librrd.sym.in.in
src/rrd.h
src/rrd_utils.c

index 18b5e72..a4b9a08 100644 (file)
@@ -33,6 +33,7 @@ rrd_last_r
 rrd_lastupdate
 rrd_lastupdate_r
 rrd_lock
+rrd_mkdir_p
 rrd_new_context
 rrd_open
 rrd_parsetime
index a5d3129..697e552 100644 (file)
--- a/src/rrd.h
+++ b/src/rrd.h
@@ -337,6 +337,8 @@ int       rrd_proc_start_end(
     int rrd_add_strdup(char ***dest, size_t *dest_size, char *src);
     void rrd_free_ptrs(void ***src, size_t *cnt);
 
+    int rrd_mkdir_p(const char *pathname, mode_t mode);
+
 /*
  * The following functions are _internal_ functions needed to read the raw RRD
  * files. Since they are _internal_ they may change with the file format and
index 9ac3e8a..3936cff 100644 (file)
@@ -1,4 +1,8 @@
 /**
+ * RRDtool - src/rrd_utils.c
+ * Copyright (C) 2009 Kevin Brintnall
+ * Copyright (C) 2008 Sebastian Harl
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
  * Free Software Foundation; only version 2 of the License is applicable.
  * You should have received a copy of the GNU General Public License along
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   kevin brintnall <kbrint@rufus.net>
+ *   Sebastian Harl <sh@tokkee.org>
  **/
 
 #include "rrd_tool.h"
 
-#include <stdlib.h>
 #include <assert.h>
+#include <errno.h>
+#include <libgen.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
 #ifdef WIN32
 #      define random() rand()
@@ -95,3 +109,51 @@ void rrd_free_ptrs(void ***src, size_t *cnt)
     free (sp);
     *src = NULL;
 }
+
+/* recursively create the directory named by 'pathname'
+ * (similar to "mkdir -p" on the command line) */
+int rrd_mkdir_p(const char *pathname, mode_t mode)
+{
+    struct stat sb;
+
+    char *pathname_copy;
+    char *base_dir;
+
+    if ((NULL == pathname) || ('\0' == *pathname)) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    if (0 == stat(pathname, &sb)) {
+        if (! S_ISDIR(sb.st_mode)) {
+            errno = ENOTDIR;
+            return -1;
+        }
+        return 0;
+    }
+
+    /* keep errno as set by stat() */
+    if (ENOENT != errno)
+        return -1;
+
+    /* dirname might modify its first argument */
+    if (NULL == (pathname_copy = strdup(pathname)))
+        return -1;
+
+    base_dir = dirname(pathname_copy);
+
+    if (0 != rrd_mkdir_p(base_dir, mode)) {
+        int orig_errno = errno;
+        free(pathname_copy);
+        errno = orig_errno;
+        return -1;
+    }
+
+    free(pathname_copy);
+
+    /* keep errno as set by mkdir() */
+    if (0 != mkdir(pathname, mode))
+        return -1;
+    return 0;
+} /* rrd_mkdir_p */
+