diff options
Diffstat (limited to 'lib/mkdir.c')
-rw-r--r-- | lib/mkdir.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/mkdir.c b/lib/mkdir.c new file mode 100644 index 0000000..5a0c4b0 --- /dev/null +++ b/lib/mkdir.c @@ -0,0 +1,63 @@ +/* On some systems, mkdir ("foo/", 0700) fails because of the trailing + slash. On those systems, this wrapper removes the trailing slash. + + Copyright (C) 2001, 2003, 2006 Free Software Foundation, Inc. + + 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 2, 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, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* written by Jim Meyering */ + +#include <config.h> + +/* Disable the definition of mkdir to rpl_mkdir (from config.h) in this + file. Otherwise, we'd get conflicting prototypes for rpl_mkdir on + most systems. */ +#undef mkdir + +#include <sys/types.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "dirname.h" +#include "xalloc.h" + +/* This function is required at least for NetBSD 1.5.2. */ + +int +rpl_mkdir (char const *dir, mode_t mode) +{ + int ret_val; + char *tmp_dir; + size_t len = strlen (dir); + + if (len && dir[len - 1] == '/') + { + tmp_dir = xstrdup (dir); + strip_trailing_slashes (tmp_dir); + } + else + { + tmp_dir = (char *) dir; + } + + ret_val = mkdir (tmp_dir, mode); + + if (tmp_dir != dir) + free (tmp_dir); + + return ret_val; +} |