Re: Strange issue with initdb on 8.0 and Solaris automounts - Mailing list pgsql-hackers
| From | Tom Lane |
|---|---|
| Subject | Re: Strange issue with initdb on 8.0 and Solaris automounts |
| Date | |
| Msg-id | 22687.1106872653@sss.pgh.pa.us Whole thread Raw |
| In response to | Re: Strange issue with initdb on 8.0 and Solaris automounts (Kenneth Lareau <elessar@numenor.org>) |
| Responses |
Re: Strange issue with initdb on 8.0 and Solaris automounts
|
| List | pgsql-hackers |
Kenneth Lareau <elessar@numenor.org> writes:
> In message <22095.1106869848@sss.pgh.pa.us>, 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
isin 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 = '/';
pgsql-hackers by date: