From 348925857a90662fb2bc8184f301ef16eff8ef80 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 20 Jan 2005 22:21:01 +0000 Subject: [PATCH] * lib/save-cwd.c (save_cwd): Remove code to support the case where fchdir is missing or flaky. * m4/save-cwd.m4 (gl_SAVE_CWD): Remove check for fcntl; we now assume it. --- lib/ChangeLog | 7 +++++- lib/save-cwd.c | 67 +++++++++++++------------------------------------- m4/ChangeLog | 4 +++ m4/save-cwd.m4 | 13 ++++------ 4 files changed, 32 insertions(+), 59 deletions(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index 1d835f799d..c161814442 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,4 +1,9 @@ -2004-12-28 Simon Josefsson +2005-01-20 Paul Eggert + + * save-cwd.c (save_cwd): Remove code to support the case + where fchdir is missing or flaky. + +2005-01-20 Simon Josefsson * base64.h (isbase64): Add. diff --git a/lib/save-cwd.c b/lib/save-cwd.c index 272f7421e9..596b78c8d9 100644 --- a/lib/save-cwd.c +++ b/lib/save-cwd.c @@ -1,5 +1,7 @@ /* save-cwd.c -- Save and restore current working directory. - Copyright (C) 1995, 1997, 1998, 2003, 2004 Free Software Foundation, Inc. + + Copyright (C) 1995, 1997, 1998, 2003, 2004, 2005 Free Software + Foundation, Inc. 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 @@ -51,68 +53,33 @@ closed; return non-zero -- in that case, free_cwd need not be called, but doing so is ok. Otherwise, return zero. - The `raison d'etre' for this interface is that some systems lack - support for fchdir, and getcwd is not robust or as efficient. + The `raison d'etre' for this interface is that the working directory + is sometimes inaccessible, and getcwd is not robust or as efficient. So, we prefer to use the open/fchdir approach, but fall back on - getcwd if necessary. Some systems lack fchdir altogether: OS/2, - Cygwin (as of March 2003), SCO Xenix. At least SunOS 4 and Irix 5.3 - provide the function, yet it doesn't work for partitions on which - auditing is enabled. */ + getcwd if necessary. + + Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin, + SCO Xenix. Also, SunOS 4 and Irix 5.3 provide the function, yet it + doesn't work for partitions on which auditing is enabled. If + you're still using an obsolete system with these problems, please + send email to the maintainer of this code. */ int save_cwd (struct saved_cwd *cwd) { -#if !HAVE_FCHDIR -# undef fchdir -# define fchdir(x) (abort (), 0) - bool have_working_fchdir = false; - bool fchdir_needs_testing = false; -#elif (__sgi || __sun) - static bool have_working_fchdir = true; - bool fchdir_needs_testing = true; -#else - bool have_working_fchdir = true; - bool fchdir_needs_testing = false; -#endif - - cwd->desc = -1; cwd->name = NULL; - if (have_working_fchdir) + cwd->desc = open (".", O_RDONLY); + if (cwd->desc < 0) { - cwd->desc = open (".", O_RDONLY); + cwd->desc = open (".", O_WRONLY); if (cwd->desc < 0) { - cwd->desc = open (".", O_WRONLY); - if (cwd->desc < 0) - { - cwd->name = xgetcwd (); - return cwd->name ? 0 : -1; - } - } - - /* On SunOS 4 and IRIX 5.3, fchdir returns EINVAL when auditing - is enabled, so we have to fall back to chdir. */ - if (fchdir_needs_testing && fchdir (cwd->desc) != 0) - { - int saved_errno = errno; - close (cwd->desc); - cwd->desc = -1; - if (saved_errno != EINVAL) - { - errno = saved_errno; - return -1; - } - have_working_fchdir = false; + cwd->name = xgetcwd (); + return cwd->name ? 0 : -1; } } - if (!have_working_fchdir) - { - cwd->name = xgetcwd (); - if (cwd->name == NULL) - return -1; - } return 0; } diff --git a/m4/ChangeLog b/m4/ChangeLog index 1832f17756..f1ee0caf5e 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,7 @@ +2005-01-20 Paul Eggert + + * save-cwd.m4 (gl_SAVE_CWD): Remove check for fcntl; we now assume it. + 2005-01-18 Paul Eggert Merge from coreutils. diff --git a/m4/save-cwd.m4 b/m4/save-cwd.m4 index 79173c212c..685d34ee22 100644 --- a/m4/save-cwd.m4 +++ b/m4/save-cwd.m4 @@ -1,10 +1,8 @@ -# save-cwd.m4 serial 3 -dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. -dnl This file is free software, distributed under the terms of the GNU -dnl General Public License. As a special exception to the GNU General -dnl Public License, this file may be distributed as part of a program -dnl that contains a configuration script generated by Autoconf, under -dnl the same distribution terms as the rest of that program. +# save-cwd.m4 serial 4 +dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SAVE_CWD], [ @@ -12,5 +10,4 @@ AC_DEFUN([gl_SAVE_CWD], AC_LIBOBJ([save-cwd]) dnl Prerequisites for lib/save-cwd.c. AC_CHECK_HEADERS_ONCE(fcntl.h unistd.h) - AC_CHECK_FUNCS(fchdir) ]) -- 2.30.2