From b9f59f8adfebeec77817cf854c3f53fd7399cdfc Mon Sep 17 00:00:00 2001 From: oetiker Date: Mon, 28 Sep 2009 16:13:58 +0000 Subject: [PATCH] added rrd_mkdir_p - This function may be used to recursively create some directory, similar to "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 | 1 + src/rrd.h | 2 ++ src/rrd_utils.c | 64 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/librrd.sym.in.in b/src/librrd.sym.in.in index 18b5e72..a4b9a08 100644 --- a/src/librrd.sym.in.in +++ b/src/librrd.sym.in.in @@ -33,6 +33,7 @@ rrd_last_r rrd_lastupdate rrd_lastupdate_r rrd_lock +rrd_mkdir_p rrd_new_context rrd_open rrd_parsetime diff --git a/src/rrd.h b/src/rrd.h index a5d3129..697e552 100644 --- 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 diff --git a/src/rrd_utils.c b/src/rrd_utils.c index 9ac3e8a..3936cff 100644 --- a/src/rrd_utils.c +++ b/src/rrd_utils.c @@ -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. @@ -11,12 +15,22 @@ * 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 + * Sebastian Harl **/ #include "rrd_tool.h" -#include #include +#include +#include +#include +#include +#include +#include +#include #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 */ + -- 2.30.2