diff options
author | Amitay Isaacs <amitay@gmail.com> | 2014-06-06 12:55:56 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2014-06-12 05:40:10 +0200 |
commit | 890bd9fb7f11b1236d493770fe635da9cfcad5f7 (patch) | |
tree | 802b74d62358f9a5ae8e2142d5279946d94d0b2b /ctdb/common/system_util.c | |
parent | dd672431c0b8a3a416f6c244b131074d868250cc (diff) | |
download | samba-890bd9fb7f11b1236d493770fe635da9cfcad5f7.tar.gz samba-890bd9fb7f11b1236d493770fe635da9cfcad5f7.tar.xz samba-890bd9fb7f11b1236d493770fe635da9cfcad5f7.zip |
ctdb-common: Separate system utilties that are ctdb independent
Routines in system_common and system_<os> are supposed to be ctdb
functions with OS specific implementations.
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Diffstat (limited to 'ctdb/common/system_util.c')
-rw-r--r-- | ctdb/common/system_util.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/ctdb/common/system_util.c b/ctdb/common/system_util.c new file mode 100644 index 0000000000..3aa9ebaaee --- /dev/null +++ b/ctdb/common/system_util.c @@ -0,0 +1,71 @@ +/* + common system utilities + + 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 "includes.h" +#include "system/filesys.h" + +#include <libgen.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; +} |