From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 14 Feb 2006 23:00:23 +0000 (+0000)
Subject: Sync from coreutils.
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28fe652e06a47bc9d02812968dc8c188e5d68593;p=pspp

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

diff --git a/ChangeLog b/ChangeLog
index 1808c6140d..bfc4bc617c 100644
--- 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.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 165e968a5e..1a79df7ad5 100644
--- 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
diff --git a/lib/lstat.c b/lib/lstat.c
index f5a22b07b2..9b9c33e415 100644
--- 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 @@ rpl_lstat (const char *file, struct stat *sbuf)
 
   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.  */
 
-  /* 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 stat fails, then we do the same.  */
+  if (stat (file, sbuf) != 0)
+    return -1;
 
-  lstat_result = lstat (new_file, sbuf);
-  free (new_file);
+  /* If FILE references a directory, return 0.  */
+  if (S_ISDIR (sbuf->st_mode))
+    return 0;
 
-  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;
 }
diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c
index ff5ac9e675..9b4a76c6ba 100644
--- 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)
diff --git a/m4/ChangeLog b/m4/ChangeLog
index e4a93b49f2..0c784d4343 100644
--- 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
diff --git a/m4/ls-mntd-fs.m4 b/m4/ls-mntd-fs.m4
index ed243861ca..a4c8089073 100644
--- 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 @@ 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]])
diff --git a/modules/lstat b/modules/lstat
index d26e9646c4..6b72505c6c 100644
--- a/modules/lstat
+++ b/modules/lstat
@@ -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