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: