Commit bb1bd327 authored by Tom Lane's avatar Tom Lane

Adjust mkdir_p to do stat() before trying mkdir(). Avoids problems on

Solaris and should be a little faster anyway, since in most scenarios
all but perhaps the last path component will already exist.
parent 5ae5e3bf
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* Portions taken from FreeBSD. * Portions taken from FreeBSD.
* *
* $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.73 2005/01/08 22:51:12 tgl Exp $ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.74 2005/01/28 00:34:32 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -476,6 +476,9 @@ popen_check(const char *command, const char *mode) ...@@ -476,6 +476,9 @@ popen_check(const char *command, const char *mode)
* this tries to build all the elements of a path to a directory a la mkdir -p * this tries to build all the elements of a path to a directory a la mkdir -p
* we assume the path is in canonical form, i.e. uses / as the separator * we assume the path is in canonical form, i.e. uses / as the separator
* we also assume it isn't null. * we also assume it isn't null.
*
* note that on failure, the path arg has been modified to show the particular
* directory level we had problems with.
*/ */
static int static int
mkdir_p(char *path, mode_t omode) mkdir_p(char *path, mode_t omode)
...@@ -544,31 +547,25 @@ mkdir_p(char *path, mode_t omode) ...@@ -544,31 +547,25 @@ mkdir_p(char *path, mode_t omode)
} }
if (last) if (last)
(void) umask(oumask); (void) umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0)
/* check for pre-existing directory; ok if it's a parent */
if (stat(path, &sb) == 0)
{ {
if (errno == EEXIST || errno == EISDIR) if (!S_ISDIR(sb.st_mode))
{
if (stat(path, &sb) < 0)
{
retval = 1;
break;
}
else if (!S_ISDIR(sb.st_mode))
{
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
retval = 1;
break;
}
}
else
{ {
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
retval = 1; retval = 1;
break; break;
} }
} }
else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0)
{
retval = 1;
break;
}
if (!last) if (!last)
*p = '/'; *p = '/';
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment