From: <ag...@us...> - 2013-01-28 16:40:07
|
Revision: 2584 http://nagios.svn.sourceforge.net/nagios/?rev=2584&view=rev Author: ageric Date: 2013-01-28 16:39:59 +0000 (Mon, 28 Jan 2013) Log Message: ----------- lib/nspath: Add nspath_mkdir_p() This is in preparation for letting Nagios set up directories and whatnot as required, without requiring too much user intervention beyond setting the proper permissions. This is currently untested code, but since it's also unused, I'm not too fuzzed atm. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/lib/nspath.c nagioscore/trunk/lib/nspath.h Modified: nagioscore/trunk/lib/nspath.c =================================================================== --- nagioscore/trunk/lib/nspath.c 2013-01-28 16:39:35 UTC (rev 2583) +++ nagioscore/trunk/lib/nspath.c 2013-01-28 16:39:59 UTC (rev 2584) @@ -185,3 +185,41 @@ free(buf); return ret; } + +int nspath_mkdir_p(const char *orig_path, mode_t mode, int options) +{ + char *sep, *path; + int ret = 0, mkdir_start = 0; + + if (options) + return mkdir(path, mode); + + sep = path = strdup(path); + for (;;) { + struct stat st; + + sep = strchr(sep, '/'); + if (!sep && !(options & NSPATH_MKDIR_SKIP_LAST)) + break; + + /* stat() our way up the tree and start mkdir() on ENOENT */ + if (!mkdir_start) { + ret = stat(path, &st); + if (ret < 0 && errno != ENOENT) + break; + mkdir_start = 1; + } + + if (mkdir_start) { + ret = mkdir(path, mode); + if (ret < 0) + break; + } + if (!sep) + break; + *sep = '/'; + } + + free(path); + return ret; +} Modified: nagioscore/trunk/lib/nspath.h =================================================================== --- nagioscore/trunk/lib/nspath.h 2013-01-28 16:39:35 UTC (rev 2583) +++ nagioscore/trunk/lib/nspath.h 2013-01-28 16:39:59 UTC (rev 2584) @@ -11,6 +11,7 @@ */ #define _GNU_SOURCE 1 +#include <errno.h> #include "snprintf.h" /** @@ -58,4 +59,19 @@ * @return NULL on errors, allocated absolute directory name on success */ extern char *nspath_absolute_dirname(const char *path, const char *base); + + +/** + * Recursively create a directory, just like mkdir_p would + * @param path Path to create, in normalized form + * @param mode Filemode (same as mkdir() takes) + * @param options Options flag. See NSPATH_MKDIR_* for or-able options + * @return 0 on success, -1 on errors and errno will hold error code + * from either stat() or mkdir(). + */ +extern int nspath_mkdir_p(const char *path, mode_t mode, int options); + +/** Don't mkdir() last element of path when calling nspath_mkdir_p() */ +#define NSPATH_MKDIR_SKIP_LAST (1 << 0) + /* @} */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |