From 6c20579a43a73916574f887bf6dc67bc122c0c65 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Thu, 28 Aug 2008 07:47:55 +0000 Subject: mkdir_p: utility function to create a directory and all required parent directories --- src/libstrongswan/utils.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/libstrongswan/utils.c') diff --git a/src/libstrongswan/utils.c b/src/libstrongswan/utils.c index 416c8ef44..88aa1bf79 100644 --- a/src/libstrongswan/utils.c +++ b/src/libstrongswan/utils.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2008 Tobias Brunner * Copyright (C) 2005-2008 Martin Willi * Hochschule fuer Technik Rapperswil * @@ -17,11 +18,15 @@ #include "utils.h" +#include #include #include #include +#include +#include #include +#include ENUM(status_names, SUCCESS, DESTROY_ME, "SUCCESS", @@ -63,6 +68,52 @@ void memxor(u_int8_t dest[], u_int8_t src[], size_t n) } } +/** + * Described in header. + */ +bool mkdir_p(const char *path, mode_t mode) +{ + size_t len; + char *pos, full[PATH_MAX]; + pos = full; + if (!path || *path == '\0') + { + return TRUE; + } + len = snprintf(full, sizeof(full)-1, "%s", path); + if (len < 0 || len >= sizeof(full)-1) + { + DBG1("path string %s too long", path); + return FALSE; + } + /* ensure that the path ends with a '/' */ + if (full[len-1] != '/') + { + full[len++] = '/'; + full[len] = '\0'; + } + /* skip '/' at the beginning */ + while (*pos == '/') + { + pos++; + } + while ((pos = strchr(pos, '/'))) + { + *pos = '\0'; + if (access(full, F_OK) < 0) + { + if (mkdir(full, mode) < 0) + { + DBG1("failed to create directory %s", full); + return FALSE; + } + } + *pos = '/'; + pos++; + } + return TRUE; +} + /** * return null */ -- cgit v1.2.3