Will this make it into 8.1? >-----Original Message----- >From: Tom Lane [mailto:[EMAIL PROTECTED] >Sent: Thursday, January 27, 2005 7:38 PM >To: Kenneth Lareau >Cc: David Parker; pgsql-hackers@postgresql.org >Subject: Re: [HACKERS] Strange issue with initdb on 8.0 and >Solaris automounts > >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 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly