diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-01-28 00:36:17 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-01-28 00:36:17 +0000 |
commit | 51aac369968fe1f6d6eb69a3ea84b665f7b52a26 (patch) | |
tree | 38d7d84092fa490581dbfb2a182cc59fd067566c | |
parent | f2196c00b205acd196f9adeb0a4dcbc6246ddf75 (diff) | |
download | postgresql-51aac369968fe1f6d6eb69a3ea84b665f7b52a26.tar.gz |
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.
-rw-r--r-- | src/bin/initdb/initdb.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 2d3958b5a1..a763a627b0 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -39,7 +39,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * 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.73.4.1 2005/01/28 00:36:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -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 * we assume the path is in canonical form, i.e. uses / as the separator * 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 mkdir_p(char *path, mode_t omode) @@ -544,31 +547,25 @@ mkdir_p(char *path, mode_t omode) } if (last) (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 (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 (!S_ISDIR(sb.st_mode)) { + if (last) + errno = EEXIST; + else + errno = ENOTDIR; retval = 1; break; } } + else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) + { + retval = 1; + break; + } if (!last) *p = '/'; } |