changeset 6641:884bb4ba6eae

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. 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.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 14 Feb 2006 23:00:23 +0000
parents 77c94e639286
children 847fb732c2ab
files ChangeLog lib/ChangeLog lib/lstat.c lib/xalloc-die.c m4/ChangeLog m4/ls-mntd-fs.m4 modules/lstat
diffstat 7 files changed, 59 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-14  Paul Eggert  <eggert@cs.ucla.edu>
+
+	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.
+
 2006-02-14  Simon Josefsson  <jas@extundo.com>
 
 	* modules/maintainer-makefile (Files): Rename.
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,14 @@
+2006-02-14  Jim Meyering  <jim@meyering.net>
+
+	Sync from coreutils.
+
+	Eliminate the unwelcome (albeit unlikely) possibility of xmalloc
+	failure on deficient systems, and simplify gnulib lgpl dependencies.
+	* lstat.c (rpl_lstat): Rewrite to use stat() in place of the
+	xmalloc/lstat combination.  Based on a patch from Bruno Haible.
+
+	* xalloc-die.c: Remove unused definition of N_.
+
 2006-02-13  Sergey Poznyakoff  <gray@gnu.org.ua>
 
 	* argp-fmtstream.c: Restore another bugfix lost on 2005-12-12
--- a/lib/lstat.c
+++ b/lib/lstat.c
@@ -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 @@
 
   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.  */
+     Call stat() to get info about the link's referent.  */
+
+  /* If stat fails, then we do the same.  */
+  if (stat (file, sbuf) != 0)
+    return -1;
 
-  /* 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;
+  /* If FILE references a directory, return 0.  */
+  if (S_ISDIR (sbuf->st_mode))
+    return 0;
 
-  lstat_result = lstat (new_file, sbuf);
-  free (new_file);
-
-  return lstat_result;
+  /* 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;
 }
--- a/lib/xalloc-die.c
+++ b/lib/xalloc-die.c
@@ -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)
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -1,3 +1,13 @@
+2006-02-14  Jim Meyering  <jim@meyering.net>
+
+	Sync from coreutils.
+	* 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-05  Paul Eggert  <eggert@cs.ucla.edu>
 
 	* extensions.m4 (gl_USE_SYSTEM_EXTENSIONS): Don't #define
--- a/m4/ls-mntd-fs.m4
+++ b/m4/ls-mntd-fs.m4
@@ -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 @@
 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]])
--- a/modules/lstat
+++ b/modules/lstat
@@ -7,7 +7,6 @@
 m4/lstat.m4
 
 Depends-on:
-xalloc
 stat-macros
 
 configure.ac:
@@ -19,7 +18,7 @@
 "lstat.h"
 
 License:
-GPL
+LGPL
 
 Maintainer:
 Jim Meyering