diff options
Diffstat (limited to 'src/libstrongswan/utils.c')
-rw-r--r-- | src/libstrongswan/utils.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/libstrongswan/utils.c b/src/libstrongswan/utils.c index bd13b7c4d..b2134dfc7 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 * @@ -12,16 +13,20 @@ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * - * $Id: utils.c 3820 2008-04-17 11:22:37Z martin $ + * $Id: utils.c 4305 2008-08-28 07:47:55Z tobias $ */ #include "utils.h" +#include <sys/stat.h> #include <string.h> #include <pthread.h> #include <stdio.h> +#include <unistd.h> +#include <dirent.h> #include <enum.h> +#include <debug.h> ENUM(status_names, SUCCESS, DESTROY_ME, "SUCCESS", @@ -64,6 +69,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 */ void *return_null() |