diff options
author | DJ Delorie <dj@redhat.com> | 2018-07-06 01:10:41 -0400 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2018-08-22 21:20:37 -0400 |
commit | 561b0bec4448f0302cb4915bf67c919bde4a1c57 (patch) | |
tree | a05c836bfe23e523ec7d357203e7b6599b287f98 /support/xmkdirp.c | |
parent | b35d3509caee04b2e196bb832138e4e4042347db (diff) | |
download | glibc-561b0bec4448f0302cb4915bf67c919bde4a1c57.tar.gz glibc-561b0bec4448f0302cb4915bf67c919bde4a1c57.tar.xz glibc-561b0bec4448f0302cb4915bf67c919bde4a1c57.zip |
Add test-in-container infrastructure.
* Makefile (testroot.pristine): New rules to initialize the test-in-container "testroot". * Makerules (all-testsuite): Add tests-container. * Rules (tests-expected): Add tests-container. (binaries-all-tests): Likewise. (tests-container): New, run these tests in the testroot container. * support/Makefile (others): Add *-container, support_paths.c, xmkdirp, and links-dso-program. * support/links-dso-program-c.c: New. * support/links-dso-program.cc: New. * support/test-container.c: New. * support/shell-container.c: New. * support/echo-container.c: New. * support/true-container.c: New. * support/xmkdirp.c: New. * support/xsymlink.c: New. * support/support_paths.c: New. * support/support.h: Add support paths prototypes. * support/xunistd.h: Add xmkdirp () and xsymlink (). * nss/tst-nss-test3.c: Convert to test-in-container. * nss/tst-nss-test3.root/: New.
Diffstat (limited to 'support/xmkdirp.c')
-rw-r--r-- | support/xmkdirp.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/support/xmkdirp.c b/support/xmkdirp.c new file mode 100644 index 0000000000..fada0452ea --- /dev/null +++ b/support/xmkdirp.c @@ -0,0 +1,66 @@ +/* Error-checking replacement for "mkdir -p". + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <support/support.h> +#include <support/check.h> +#include <support/xunistd.h> + +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +/* Equivalent of "mkdir -p". Any failures cause FAIL_EXIT1 so no + return code is needed. */ + +void +xmkdirp (const char *path, mode_t mode) +{ + struct stat s; + const char *slash_p; + int rv; + + if (path[0] == 0) + return; + + if (stat (path, &s) == 0) + { + if (S_ISDIR (s.st_mode)) + return; + errno = EEXIST; + FAIL_EXIT1 ("mkdir_p (\"%s\", 0%o): %m", path, mode); + } + + slash_p = strrchr (path, '/'); + if (slash_p != NULL) + { + while (slash_p > path && slash_p[-1] == '/') + --slash_p; + if (slash_p > path) + { + char *parent = xstrndup (path, slash_p - path); + xmkdirp (parent, mode); + free (parent); + } + } + + rv = mkdir (path, mode); + if (rv != 0) + FAIL_EXIT1 ("mkdir_p (\"%s\", 0%o): %m", path, mode); + + return; +} |