bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bug-gnulib] new modules chdir-long, openat; also, save-cwd improvem


From: Paul Eggert
Subject: Re: [bug-gnulib] new modules chdir-long, openat; also, save-cwd improvements
Date: Thu, 20 Jan 2005 14:23:13 -0800
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

Jim Meyering <address@hidden> writes:

> FYI, fchdir is used by fts.c, and hence by chmod, chgrp, chown, and du.
> It's been in use like that (at least for du) for over a year - since 5.1.0.
> No one has complained about link failures :-)

In that case let's just rip out the claimed support for non-fchdir
systems in save-cwd.c; its comments are a bit wrong now, it's possible
the fchdir code doesn't work, and we're probably better off not giving
people the warm feeling that it does work.

I installed this, into both gnulib and coreutils.  (This also changes
the .m4 file's license to match RMS's suggestion.)

2005-01-20  Paul Eggert  <address@hidden>

        * 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.

Index: lib/save-cwd.c
===================================================================
RCS file: /fetish/cu/lib/save-cwd.c,v
retrieving revision 1.23
diff -p -c -r1.23 save-cwd.c
*** lib/save-cwd.c      3 Dec 2004 06:25:03 -0000       1.23
--- lib/save-cwd.c      20 Jan 2005 22:15:26 -0000
***************
*** 1,5 ****
  /* save-cwd.c -- Save and restore current working directory.
!    Copyright (C) 1995, 1997, 1998, 2003, 2004 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
--- 1,7 ----
  /* save-cwd.c -- Save and restore current working directory.
! 
!    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,118 ****
     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.
     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.  */
  
  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_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;
        }
      }
  
-   if (!have_working_fchdir)
-     {
-       cwd->name = xgetcwd ();
-       if (cwd->name == NULL)
-       return -1;
-     }
    return 0;
  }
  
--- 53,85 ----
     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 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: 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)
  {
    cwd->name = NULL;
  
!   cwd->desc = open (".", O_RDONLY);
!   if (cwd->desc < 0)
      {
!       cwd->desc = open (".", O_WRONLY);
        if (cwd->desc < 0)
        {
!         cwd->name = xgetcwd ();
!         return cwd->name ? 0 : -1;
        }
      }
  
    return 0;
  }
  
Index: m4/save-cwd.m4
===================================================================
RCS file: /fetish/cu/m4/save-cwd.m4,v
retrieving revision 1.4
diff -p -c -r1.4 save-cwd.m4
*** m4/save-cwd.m4      6 Dec 2004 10:35:27 -0000       1.4
--- m4/save-cwd.m4      20 Jan 2005 22:15:26 -0000
***************
*** 1,10 ****
! # 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.
  
  AC_DEFUN([gl_SAVE_CWD],
  [
--- 1,8 ----
! # 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],
  [
*************** AC_DEFUN([gl_SAVE_CWD],
*** 12,16 ****
    AC_LIBOBJ([save-cwd])
    dnl Prerequisites for lib/save-cwd.c.
    AC_CHECK_HEADERS_ONCE(fcntl.h unistd.h)
-   AC_CHECK_FUNCS(fchdir)
  ])
--- 10,13 ----




reply via email to

[Prev in Thread] Current Thread [Next in Thread]