diff options
Diffstat (limited to 'lib/util')
-rw-r--r-- | lib/util/mkdir_p.c | 70 | ||||
-rw-r--r-- | lib/util/mkdir_p.h | 21 | ||||
-rw-r--r-- | lib/util/wscript_build | 2 |
3 files changed, 92 insertions, 1 deletions
diff --git a/lib/util/mkdir_p.c b/lib/util/mkdir_p.c new file mode 100644 index 00000000000..290a1f39520 --- /dev/null +++ b/lib/util/mkdir_p.c @@ -0,0 +1,70 @@ +/* + mkdir -p + + Copyright (C) Amitay Isaacs 2014 + Copyright (C) Martin Schwenke 2014 + + 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; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see <http://www.gnu.org/licenses/>. +*/ +#include "replace.h" +#include <sys/stat.h> +#include <libgen.h> +#include "mkdir_p.h" + +int mkdir_p(const char *dir, int mode) +{ + char t[PATH_MAX]; + ssize_t len; + int ret; + + if (strcmp(dir, "/") == 0) { + return 0; + } + + if (strcmp(dir, ".") == 0) { + return 0; + } + + /* Try to create directory */ + ret = mkdir(dir, mode); + /* Succeed if that worked or if it already existed */ + if (ret == 0 || errno == EEXIST) { + return 0; + } + /* Fail on anything else except ENOENT */ + if (errno != ENOENT) { + return ret; + } + + /* Create ancestors */ + len = strlen(dir); + if (len >= PATH_MAX) { + errno = ENAMETOOLONG; + return -1; + } + strncpy(t, dir, len+1); + + ret = mkdir_p(dirname(t), mode); + if (ret != 0) { + return ret; + } + + /* Create directory */ + ret = mkdir(dir, mode); + if ((ret == -1) && (errno == EEXIST)) { + ret = 0; + } + + return ret; +} diff --git a/lib/util/mkdir_p.h b/lib/util/mkdir_p.h new file mode 100644 index 00000000000..9281de8cb91 --- /dev/null +++ b/lib/util/mkdir_p.h @@ -0,0 +1,21 @@ +/* + mkdir -p + + Copyright (C) Amitay Isaacs 2014 + Copyright (C) Martin Schwenke 2014 + + 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; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see <http://www.gnu.org/licenses/>. +*/ + +int mkdir_p(const char *dir, int mode); diff --git a/lib/util/wscript_build b/lib/util/wscript_build index bb3cdd134ad..0b16b6f8216 100644 --- a/lib/util/wscript_build +++ b/lib/util/wscript_build @@ -72,7 +72,7 @@ bld.SAMBA_SUBSYSTEM('samba-util-core', signal.c util.c idtree.c fault.c substitute.c util_process.c util_strlist.c strv_util.c bitmap.c select.c pidfile.c - become_daemon.c ''', + become_daemon.c mkdir_p.c''', deps='''time-basic samba-debug socket-blocking talloc tevent execinfo pthread strv''', local_include=False) |