bug-gnulib
[Top][All Lists]
Advanced

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

sync from coreutils for lstat, xalloc-die, mountlist


From: Paul Eggert
Subject: sync from coreutils for lstat, xalloc-die, mountlist
Date: Tue, 14 Feb 2006 15:03:14 -0800
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

I installed these changes to sync from coreutils.  These changes all
look pretty safe to me.

2006-02-14  Jim Meyering  <address@hidden>

        Sync from coreutils.

        Eliminate the unwelcome (albeit unlikely) possibility of xmalloc
        failure on deficient systems, and simplify gnulib lgpl dependencies.
        * lib/lstat.c (rpl_lstat): Rewrite to use stat() in place of the
        xmalloc/lstat combination.  Based on a patch from Bruno Haible.

        * lib/xalloc-die.c: Remove unused definition of N_.

        * m4/ls-mntd-fs.m4 (AC_FUNC_GETMNTENT): Invoke AC_CHECK_FUNCS(getmntent)
        unconditionally so that tests of $ac_cv_func_getmntent (e.g., in
        gl_LIST_MOUNTED_FILE_SYSTEMS) need not double-quote uses of that
        variable, to accommodate the rare case in which getmntent is
        available in none of the libraries checked.  This happens at
        least on FreeBSD 5.0.

2006-02-14  Paul Eggert  <address@hidden>

        Sync from coreutils.

        * modules/lstat (Depends-on): Don't depend on xalloc.
        (License): Change from GPL to LGPL, since this is now simply a
        replacement for a libc function.

--- lib/lstat.c 19 Sep 2005 17:28:14 -0000      1.9
+++ lib/lstat.c 14 Feb 2006 22:58:06 -0000
@@ -1,6 +1,6 @@
 /* Work around a bug of lstat on some systems
 
-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 
Free
    Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
@@ -30,28 +30,28 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
 #include "stat-macros.h"
-#include "xalloc.h"
 
 /* lstat works differently on Linux and Solaris systems.  POSIX (see
-   `pathname resolution' in the glossary) requires that programs like `ls'
-   take into consideration the fact that FILE has a trailing slash when
-   FILE is a symbolic link.  On Linux systems, the lstat function already
-   has the desired semantics (in treating `lstat("symlink/",sbuf)' just like
-   `lstat("symlink/.",sbuf)', but on Solaris it does not.
+   `pathname resolution' in the glossary) requires that programs like
+   `ls' take into consideration the fact that FILE has a trailing slash
+   when FILE is a symbolic link.  On Linux and Solaris 10 systems, the
+   lstat function already has the desired semantics (in treating
+   `lstat ("symlink/", sbuf)' just like `lstat ("symlink/.", sbuf)',
+   but on Solaris 9 and earlier it does not.
 
    If FILE has a trailing slash and specifies a symbolic link,
-   then append a `.' to FILE and call lstat a second time.  */
+   then use stat() to get more info on the referent of FILE.
+   If the referent is a non-directory, then set errno to ENOTDIR
+   and return -1.  Otherwise, return stat's result.  */
 
 int
 rpl_lstat (const char *file, struct stat *sbuf)
 {
   size_t len;
-  char *new_file;
-
   int lstat_result = lstat (file, sbuf);
 
   if (lstat_result != 0 || !S_ISLNK (sbuf->st_mode))
@@ -59,19 +59,22 @@ rpl_lstat (const char *file, struct stat
 
   len = strlen (file);
   if (len == 0 || file[len - 1] != '/')
-    return lstat_result;
+    return 0;
 
   /* FILE refers to a symbolic link and the name ends with a slash.
-     Append a `.' to FILE and repeat the lstat call.  */
-
-  /* Add one for the `.' we'll append, and one more for the trailing NUL.  */
-  new_file = xmalloc (len + 1 + 1);
-  memcpy (new_file, file, len);
-  new_file[len] = '.';
-  new_file[len + 1] = 0;
-
-  lstat_result = lstat (new_file, sbuf);
-  free (new_file);
+     Call stat() to get info about the link's referent.  */
 
-  return lstat_result;
+  /* If stat fails, then we do the same.  */
+  if (stat (file, sbuf) != 0)
+    return -1;
+
+  /* If FILE references a directory, return 0.  */
+  if (S_ISDIR (sbuf->st_mode))
+    return 0;
+
+  /* Here, we know stat succeeded and FILE references a non-directory.
+     But it was specified via a name including a trailing slash.
+     Fail with errno set to ENOTDIR to indicate the contradiction.  */
+  errno = ENOTDIR;
+  return -1;
 }
--- lib/xalloc-die.c    19 Sep 2005 17:28:15 -0000      1.3
+++ lib/xalloc-die.c    14 Feb 2006 22:58:06 -0000
@@ -1,6 +1,6 @@
 /* Report a memory allocation failure and exit.
 
-   Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 Free
+   Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2006 Free
    Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
@@ -30,7 +30,6 @@
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
 
 void
 xalloc_die (void)
--- m4/ls-mntd-fs.m4    23 Jan 2005 08:06:57 -0000      1.31
+++ m4/ls-mntd-fs.m4    14 Feb 2006 22:58:07 -0000
@@ -1,7 +1,7 @@
-#serial 20
+#serial 21
 # How to list mounted file systems.
 
-# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006 Free Software
 # Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
@@ -20,7 +20,8 @@ dnl
 AC_DEFUN([AC_FUNC_GETMNTENT],
 [# getmntent is in the standard C library on UNICOS, in -lsun on Irix 4,
 # -lseq on Dynix/PTX, -lgen on Unixware.
-AC_SEARCH_LIBS(getmntent, [sun seq gen], [AC_CHECK_FUNCS(getmntent)])
+AC_SEARCH_LIBS(getmntent, [sun seq gen])
+AC_CHECK_FUNCS(getmntent)
 ])
 
 # gl_LIST_MOUNTED_FILE_SYSTEMS([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
--- modules/lstat       24 Jun 2005 14:53:04 -0000      1.7
+++ modules/lstat       14 Feb 2006 22:58:07 -0000
@@ -7,7 +7,6 @@ lib/lstat.h
 m4/lstat.m4
 
 Depends-on:
-xalloc
 stat-macros
 
 configure.ac:
@@ -19,7 +18,7 @@ Include:
 "lstat.h"
 
 License:
-GPL
+LGPL
 
 Maintainer:
 Jim Meyering




reply via email to

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