Re: Strange issue with initdb on 8.0 and Solaris automounts

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Strange issue with initdb on 8.0 and Solaris automounts
Дата
Msg-id 22687.1106872653@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: Strange issue with initdb on 8.0 and Solaris automounts  (Kenneth Lareau <elessar@numenor.org>)
Ответы Re: Strange issue with initdb on 8.0 and Solaris automounts  (Kenneth Lareau <elessar@numenor.org>)
Список 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 по дате отправления:

Предыдущее
От: Andrew Dunstan
Дата:
Сообщение: Re: Strange issue with initdb on 8.0 and Solaris automounts
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Strange issue with initdb on 8.0 and Solaris automounts