X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsavewd.c;h=c4893ef6f1f877b75cae747a8222f5f21ac1a31e;hb=1056e42fdb8bb68c6afcdcb3a793558cae08ba44;hp=c9af955d6c8bd7313c49eb9e7c44a693dbbb2bfe;hpb=52034676ffeda4137d247a91c9c05366b1142686;p=gnulib.git diff --git a/lib/savewd.c b/lib/savewd.c index c9af955d6..c4893ef6f 100644 --- a/lib/savewd.c +++ b/lib/savewd.c @@ -1,11 +1,11 @@ /* Save and restore the working directory, possibly using a child process. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2007 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,8 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* Written by Paul Eggert. */ @@ -25,15 +24,19 @@ #include #include #include +#include #include +#include #include #include #include -#include "exit.h" #include "dirname.h" #include "fcntl-safer.h" +#ifndef ESTALE +# define ESTALE -1 +#endif /* Save the working directory into *WD, if it hasn't been saved already. Return true if a child has been forked to do the real @@ -53,7 +56,7 @@ savewd_save (struct savewd *wd) wd->val.fd = fd; break; } - if (errno != EACCES) + if (errno != EACCES && errno != ESTALE) { wd->state = ERROR_STATE; wd->val.errnum = errno; @@ -102,7 +105,8 @@ savewd_chdir (struct savewd *wd, char const *dir, int options, /* Open the directory if requested, or if avoiding a race condition is requested and possible. */ - if (open_result || (options & (O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0))) + if (open_result + || (options & (HAVE_WORKING_O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0))) { fd = open (dir, (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK @@ -201,13 +205,13 @@ savewd_restore (struct savewd *wd, int status) _exit (status); if (0 < child) { - int status; - while (waitpid (child, &status, 0) < 0) + int child_status; + while (waitpid (child, &child_status, 0) < 0) assert (errno == EINTR); wd->val.child = -1; - if (! WIFEXITED (status)) - raise (WTERMSIG (status)); - return WEXITSTATUS (status); + if (! WIFEXITED (child_status)) + raise (WTERMSIG (child_status)); + return WEXITSTATUS (child_status); } } break;