Kenneth Lareau <[EMAIL PROTECTED]> writes:
> In message <[EMAIL PROTECTED]>, Tom Lane writes:
>> Could you truss that and see what it does?
> Here's the relevant truss output from 'mkdir /software/postgresql-8.0.0'
> on my Solaris 9 system:
> 10832: mkdir("/software/postgresql-8.0.0", 0777) Err#89 ENOSYS
> 10832: stat64("/software/postgresql-8.0.0", 0xFFBFFA38) = 0
> It's doing the stat after the mkdir attempt it seems, and coming back
> with the correct response. Hmm, maybe I should look at the Solaris 8
> code for the mkdir command...
Well, the important point is that the stat does succeed. I'm not going
to put in anything as specific as a check for ENOSYS, but it seems
reasonable to try the stat first and mkdir only if stat fails.
I've applied the attached patch.
regards, tom lane
*** src/bin/initdb/initdb.c.orig Sat Jan 8 17:51:12 2005
--- src/bin/initdb/initdb.c Thu Jan 27 19:23:49 2005
***************
*** 476,481 ****
--- 476,484 ----
* 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,573 ****
}
if (last)
(void) umask(oumask);
! if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 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
{
retval = 1;
break;
}
}
if (!last)
*p = '/';
--- 547,570 ----
}
if (last)
(void) umask(oumask);
!
! /* check for pre-existing directory; ok if it's a parent */
! if (stat(path, &sb) == 0)
{
! 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 = '/';
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org