(make_dir_parents): Don't report an error if an

intermediate directory is in a read-only file system.
This commit is contained in:
Paul Eggert 2005-10-13 19:05:13 +00:00
parent 71a4b4865c
commit 2ec133706a
2 changed files with 32 additions and 23 deletions

View File

@ -1,3 +1,9 @@
2005-10-13 Paul Eggert <eggert@cs.ucla.edu>
* mkdir-p.c (make_dir_parents): Don't report an error if an
intermediate directory is in a read-only file system. Problem
reported by Eric Blake.
2005-10-08 Jim Meyering <jim@meyering.net>
* openat.c (rpl_openat): Use the promoted type (int), not mode_t,
@ -5480,7 +5486,7 @@
* exclude.c (bool): Declare, perhaps by including stdbool.h.
(<sys/types.h>): Include only if HAVE_SYS_TYPES_H.
(<stdlib.h>, <string.h>, <strings.h>, <inttypes.h>, <stdint.h>):
Include if available.
Include if available.
(<xalloc.h>): Include
(SIZE_MAX): Define if <stdint.h> or <inttypes.h> doesn't.
(verify): New macro. Use it to verify that EXCLUDE macros do not

View File

@ -45,10 +45,6 @@
#include "quote.h"
#include "stat-macros.h"
#ifndef ENOSYS
# define ENOSYS EEXIST
#endif
#define WX_USR (S_IWUSR | S_IXUSR)
/* Ensure that the directory ARG exists.
@ -175,6 +171,9 @@ make_dir_parents (char const *arg,
while (true)
{
bool dir_known_to_exist;
int mkdir_errno;
/* slash points to the leftmost unprocessed component of dir. */
basename_dir = slash;
@ -188,7 +187,10 @@ make_dir_parents (char const *arg,
basename_dir = dir;
*slash = '\0';
if (mkdir (basename_dir, tmp_mode) == 0)
dir_known_to_exist = (mkdir (basename_dir, tmp_mode) == 0);
mkdir_errno = errno;
if (dir_known_to_exist)
{
if (verbose_fmt_string)
error (0, 0, verbose_fmt_string, quote (dir));
@ -215,29 +217,30 @@ make_dir_parents (char const *arg,
leading_dirs = new;
}
}
else if (errno == EEXIST || errno == ENOSYS)
{
/* A file is already there. Perhaps it is a directory.
If not, it will be diagnosed later.
The ENOSYS is for Solaris 8 NFS clients, which can
fail with errno == ENOSYS if mkdir is invoked on an
NFS mount point. */
}
else
{
error (0, errno, _("cannot create directory %s"), quote (dir));
retval = false;
break;
}
/* If we were able to save the initial working directory,
then we can use chdir to change into each directory before
creating an entry in that directory. This avoids making
mkdir process O(n^2) file name components. */
if (do_chdir && chdir (basename_dir) < 0)
if (do_chdir)
{
error (0, errno, _("cannot chdir to directory %s"),
if (chdir (basename_dir) == 0)
dir_known_to_exist = true;
else if (dir_known_to_exist)
{
error (0, errno, _("cannot chdir to directory %s"),
quote (dir));
retval = false;
break;
}
}
else if (!dir_known_to_exist)
dir_known_to_exist = (stat (basename_dir, &stats) == 0
&& S_ISDIR (stats.st_mode));
if (!dir_known_to_exist)
{
error (0, mkdir_errno, _("cannot create directory %s"),
quote (dir));
retval = false;
break;