diff options
author | David Mulder <dmulder@suse.com> | 2017-03-08 08:33:56 -0700 |
---|---|---|
committer | Garming Sam <garming@samba.org> | 2017-11-20 21:41:14 +0100 |
commit | 6159b8eb6a6df0743c35c9cf533c4cc1883c72c2 (patch) | |
tree | f590b1e6bfb29b89a9df548cc52925a61ad441be /lib/util | |
parent | a80296b12e38ef3fb8d4601f0e0564c294f9dbc9 (diff) | |
download | samba-6159b8eb6a6df0743c35c9cf533c4cc1883c72c2.tar.gz |
gpo: move mkdir_p to lib/util
Move the mkdir_p function to lib/util so it can be used elsewhere
Signed-off-by: David Mulder <dmulder@suse.com>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
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) |