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

[commits] r14884 - in /fsf/trunk/libc: ./ dirent/ include/ nptl/ nptl/sysdeps/unix/sysv/linux/x86_64/ sysdeps/unix/ sysdeps/unix/sysv/...



Author: eglibc
Date: Wed Aug 10 00:02:27 2011
New Revision: 14884

Log:
Import glibc-mainline for 2011-08-10

Added:
    fsf/trunk/libc/dirent/scandirat.c
    fsf/trunk/libc/dirent/scandirat64.c
    fsf/trunk/libc/sysdeps/wordsize-64/scandirat.c
    fsf/trunk/libc/sysdeps/wordsize-64/scandirat64.c
Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/NEWS
    fsf/trunk/libc/Versions.def
    fsf/trunk/libc/dirent/Makefile
    fsf/trunk/libc/dirent/Versions
    fsf/trunk/libc/dirent/dirent.h
    fsf/trunk/libc/dirent/opendir.c
    fsf/trunk/libc/dirent/scandir.c
    fsf/trunk/libc/dirent/scandir64.c
    fsf/trunk/libc/include/dirent.h
    fsf/trunk/libc/nptl/ChangeLog
    fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S
    fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
    fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
    fsf/trunk/libc/sysdeps/unix/opendir.c
    fsf/trunk/libc/sysdeps/unix/sysv/linux/i386/scandir64.c

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Wed Aug 10 00:02:27 2011
@@ -1,3 +1,34 @@
+2011-08-09  Ulrich Drepper  <drepper@xxxxxxxxx>
+
+	* Versions.def [libc]: Add GLIBC_2.15.
+	* dirent/Makefile (routines): Add scandirat and scandirat64.
+	* dirent/Versions [libc]: Export scandirat and scandirat64 for
+	GLIBC_2.15.
+	* dirent/dirent.h: Declare scandirat and scandirat64.
+	* dirent/scandirat.c: New file.
+	* dirent/scandirat64.c: New file.
+	* sysdeps/wordsize-64/scandirat.c: New file.
+	* sysdeps/wordsize-64/scandirat64.c: New file.
+	* dirent/opendir.c: Define opendirat.
+	* dirent/scandir.c: Move code to scandirat.c.  Implement scandir
+	using scandirat.
+	* dirent/scandir64.c: Adjust for scandir.c change.
+	* include/dirent.h: Define scandir_cancel_struct.  Declare __opendirat,
+	__scandirat64, and __scandir_cancel_handler.
+	* sysdeps/unix/opendir.c: Rename __opendir to __opendirat.  Take
+	additional parameter and use openat instead of open (outside of ld.so).
+	Add new __opendir as wrapper around __opendirat.
+	* sysdeps/unix/sysv/linux/i386/scandir64.c: Reimplement __old_scandir64
+	here without requiring old scandirat implementation.
+
+2011-08-08  Ulrich Drepper  <drepper@xxxxxxxxx>
+
+	* dirent/scandir.c (cancel_handler): Renamed to
+	__scandir_cancel_handler.  Do not define if SKIP_SCANDIR_CANCEL is
+	defined.  Adjust users.
+	* dirent/scandir64.c: Define SKIP_SCANDIR_CANCEL.
+	* sysdeps/unix/sysv/linux/i386/scandir64.c: Likewise.
+
 2011-08-04  Ulrich Drepper  <drepper@xxxxxxxxx>
 
 	* string/test-string.h (IMPL): Use __STRING to expand name and then

Modified: fsf/trunk/libc/NEWS
==============================================================================
--- fsf/trunk/libc/NEWS (original)
+++ fsf/trunk/libc/NEWS Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2011-7-23
+GNU C Library NEWS -- history of user-visible changes.  2011-8-8
 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -26,6 +26,9 @@
 
 * Optimized strcat and strncat on x86-64.
   Contributed by Liubov Dmitrieva.
+
+* New interfaces: scandirat, scandirat64
+  Implemented by Ulrich Drepper.
 
 Version 2.14
 

Modified: fsf/trunk/libc/Versions.def
==============================================================================
--- fsf/trunk/libc/Versions.def (original)
+++ fsf/trunk/libc/Versions.def Wed Aug 10 00:02:27 2011
@@ -31,6 +31,7 @@
   GLIBC_2.12
   GLIBC_2.13
   GLIBC_2.14
+  GLIBC_2.15
 %ifdef USE_IN_LIBIO
   HURD_CTHREADS_0.3
 %endif

Modified: fsf/trunk/libc/dirent/Makefile
==============================================================================
--- fsf/trunk/libc/dirent/Makefile (original)
+++ fsf/trunk/libc/dirent/Makefile Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-2000,2002,2003,2005,2006 Free Software Foundation, Inc.
+# Copyright (C) 1991-2000,2002,2003,2005,2006,2011 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -25,7 +25,8 @@
 routines	:= opendir closedir readdir readdir_r rewinddir \
 		   seekdir telldir scandir alphasort versionsort \
 		   getdents getdents64 dirfd readdir64 readdir64_r scandir64 \
-		   alphasort64 versionsort64 fdopendir
+		   alphasort64 versionsort64 fdopendir \
+		   scandirat scandirat64
 distribute := dirstream.h
 
 tests	   := list tst-seekdir opendir-tst1 bug-readdir1 tst-fdopendir \

Modified: fsf/trunk/libc/dirent/Versions
==============================================================================
--- fsf/trunk/libc/dirent/Versions (original)
+++ fsf/trunk/libc/dirent/Versions Wed Aug 10 00:02:27 2011
@@ -44,4 +44,7 @@
   GLIBC_2.4 {
     fdopendir;
   }
+  GLIBC_2.15 {
+    scandirat; scandirat64;
+  }
 }

Modified: fsf/trunk/libc/dirent/dirent.h
==============================================================================
--- fsf/trunk/libc/dirent/dirent.h (original)
+++ fsf/trunk/libc/dirent/dirent.h Wed Aug 10 00:02:27 2011
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991-2000,2003-2005,2009,2010 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2000,2003-2005,2009,2010,2011
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -247,7 +248,10 @@
 /* Scan the directory DIR, calling SELECTOR on each directory entry.
    Entries for which SELECT returns nonzero are individually malloc'd,
    sorted using qsort with CMP, and collected in a malloc'd array in
-   *NAMELIST.  Returns the number of entries selected, or -1 on error.  */
+   *NAMELIST.  Returns the number of entries selected, or -1 on error.
+
+   This function is a cancellation point and therefore not marked with
+   __THROW.  */
 # ifndef __USE_FILE_OFFSET64
 extern int scandir (__const char *__restrict __dir,
 		    struct dirent ***__restrict __namelist,
@@ -278,6 +282,43 @@
 		      int (*__cmp) (__const struct dirent64 **,
 				    __const struct dirent64 **))
      __nonnull ((1, 2));
+# endif
+
+# ifdef __USE_GNU
+/* Similar to `scandir' but a relative DIR name is interpreted relative
+   to the directory for which DFD is a descriptor.
+
+   This function is a cancellation point and therefore not marked with
+   __THROW.  */
+#  ifndef __USE_FILE_OFFSET64
+extern int scandirat (int __dfd, __const char *__restrict __dir,
+		      struct dirent ***__restrict __namelist,
+		      int (*__selector) (__const struct dirent *),
+		      int (*__cmp) (__const struct dirent **,
+				    __const struct dirent **))
+     __nonnull ((2, 3));
+#  else
+#   ifdef __REDIRECT
+extern int __REDIRECT (scandirat,
+		       (int __dfd, __const char *__restrict __dir,
+			struct dirent ***__restrict __namelist,
+			int (*__selector) (__const struct dirent *),
+			int (*__cmp) (__const struct dirent **,
+				      __const struct dirent **)),
+		       scandirat64) __nonnull ((2, 3));
+#   else
+#    define scandirat scandirat64
+#   endif
+#  endif
+
+/* This function is like `scandir' but it uses the 64bit dirent structure.
+   Please note that the CMP function must now work with struct dirent64 **.  */
+extern int scandirat64 (int __dfd, __const char *__restrict __dir,
+			struct dirent64 ***__restrict __namelist,
+			int (*__selector) (__const struct dirent64 *),
+			int (*__cmp) (__const struct dirent64 **,
+				      __const struct dirent64 **))
+     __nonnull ((2, 3));
 # endif
 
 /* Function to compare two `struct dirent's alphabetically.  */

Modified: fsf/trunk/libc/dirent/opendir.c
==============================================================================
--- fsf/trunk/libc/dirent/opendir.c (original)
+++ fsf/trunk/libc/dirent/opendir.c Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -21,12 +21,19 @@
 #include <dirent.h>
 
 
+DIR *
+__opendirat (int dfd, const char *name)
+{
+  __set_errno (ENOSYS);
+  return NULL;
+}
+
+
 /* Open a directory stream on NAME.  */
 DIR *
 __opendir (const char *name)
 {
-  __set_errno (ENOSYS);
-  return NULL;
+  return __opendirat (AT_FDCWD, name);
 }
 weak_alias (__opendir, opendir)
 

Modified: fsf/trunk/libc/dirent/scandir.c
==============================================================================
--- fsf/trunk/libc/dirent/scandir.c (original)
+++ fsf/trunk/libc/dirent/scandir.c Wed Aug 10 00:02:27 2011
@@ -1,4 +1,5 @@
-/* Copyright (C) 1992-1998,2000,2002,2003,2009 Free Software Foundation, Inc.
+/* Copyright (C) 1992-1998,2000,2002,2003,2009,2011
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -17,38 +18,12 @@
    02111-1307 USA.  */
 
 #include <dirent.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <bits/libc-lock.h>
+#include <fcntl.h>
 
 #ifndef SCANDIR
-#define SCANDIR scandir
-#define READDIR __readdir
-#define DIRENT_TYPE struct dirent
-#endif
-
-#ifndef SCANDIR_CANCEL
-#define SCANDIR_CANCEL
-struct scandir_cancel_struct
-{
-  DIR *dp;
-  void *v;
-  size_t cnt;
-};
-
-static void
-cancel_handler (void *arg)
-{
-  struct scandir_cancel_struct *cp = arg;
-  size_t i;
-  void **v = cp->v;
-
-  for (i = 0; i < cp->cnt; ++i)
-    free (v[i]);
-  free (v);
-  (void) __closedir (cp->dp);
-}
+# define SCANDIR scandir
+# define SCANDIRAT scandirat
+# define DIRENT_TYPE struct dirent
 #endif
 
 
@@ -59,91 +34,5 @@
      int (*select) (const DIRENT_TYPE *);
      int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **);
 {
-  DIR *dp = __opendir (dir);
-  DIRENT_TYPE **v = NULL;
-  size_t vsize = 0;
-  struct scandir_cancel_struct c;
-  DIRENT_TYPE *d;
-  int save;
-
-  if (dp == NULL)
-    return -1;
-
-  save = errno;
-  __set_errno (0);
-
-  c.dp = dp;
-  c.v = NULL;
-  c.cnt = 0;
-  __libc_cleanup_push (cancel_handler, &c);
-
-  while ((d = READDIR (dp)) != NULL)
-    {
-      int use_it = select == NULL;
-
-      if (! use_it)
-	{
-	  use_it = select (d);
-	  /* The select function might have changed errno.  It was
-	     zero before and it need to be again to make the latter
-	     tests work.  */
-	  __set_errno (0);
-	}
-
-      if (use_it)
-	{
-	  DIRENT_TYPE *vnew;
-	  size_t dsize;
-
-	  /* Ignore errors from select or readdir */
-	  __set_errno (0);
-
-	  if (__builtin_expect (c.cnt == vsize, 0))
-	    {
-	      DIRENT_TYPE **new;
-	      if (vsize == 0)
-		vsize = 10;
-	      else
-		vsize *= 2;
-	      new = (DIRENT_TYPE **) realloc (v, vsize * sizeof (*v));
-	      if (new == NULL)
-		break;
-	      v = new;
-	      c.v = (void *) v;
-	    }
-
-	  dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
-	  vnew = (DIRENT_TYPE *) malloc (dsize);
-	  if (vnew == NULL)
-	    break;
-
-	  v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize);
-	}
-    }
-
-  if (__builtin_expect (errno, 0) != 0)
-    {
-      save = errno;
-
-      while (c.cnt > 0)
-	free (v[--c.cnt]);
-      free (v);
-      c.cnt = -1;
-    }
-  else
-    {
-      /* Sort the list if we have a comparison function to sort with.  */
-      if (cmp != NULL)
-	qsort (v, c.cnt, sizeof (*v),
-	       (int (*) (const void *, const void *)) cmp);
-
-      *namelist = v;
-    }
-
-  __libc_cleanup_pop (0);
-
-  (void) __closedir (dp);
-  __set_errno (save);
-
-  return c.cnt;
+  return SCANDIRAT (AT_FDCWD, dir, namelist, select, cmp);
 }

Modified: fsf/trunk/libc/dirent/scandir64.c
==============================================================================
--- fsf/trunk/libc/dirent/scandir64.c (original)
+++ fsf/trunk/libc/dirent/scandir64.c Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2009, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,13 +19,7 @@
 #include <dirent.h>
 
 #define SCANDIR scandir64
-#define READDIR __readdir64
+#define SCANDIRAT scandirat64
 #define DIRENT_TYPE struct dirent64
 
-int scandir64 (__const char *__restrict __dir,
-	       struct dirent64 ***__restrict __namelist,
-	       int (*__selector) (__const struct dirent64 *),
-	       int (*__cmp) (__const struct dirent64 **,
-			     __const struct dirent64 **));
-
 #include <dirent/scandir.c>

Added: fsf/trunk/libc/dirent/scandirat.c
==============================================================================
--- fsf/trunk/libc/dirent/scandirat.c (added)
+++ fsf/trunk/libc/dirent/scandirat.c Wed Aug 10 00:02:27 2011
@@ -1,0 +1,143 @@
+/* Copyright (C) 1992-1998,2000,2002,2003,2009,2011
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <dirent.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <bits/libc-lock.h>
+
+#ifndef SCANDIRAT
+# define SCANDIRAT scandirat
+# define READDIR __readdir
+# define DIRENT_TYPE struct dirent
+#endif
+
+#ifndef SKIP_SCANDIR_CANCEL
+void
+__scandir_cancel_handler (void *arg)
+{
+  struct scandir_cancel_struct *cp = arg;
+  size_t i;
+  void **v = cp->v;
+
+  for (i = 0; i < cp->cnt; ++i)
+    free (v[i]);
+  free (v);
+  (void) __closedir (cp->dp);
+}
+#endif
+
+
+int
+SCANDIRAT (dfd, dir, namelist, select, cmp)
+     int dfd;
+     const char *dir;
+     DIRENT_TYPE ***namelist;
+     int (*select) (const DIRENT_TYPE *);
+     int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **);
+{
+  DIR *dp = __opendirat (dfd, dir);
+  DIRENT_TYPE **v = NULL;
+  size_t vsize = 0;
+  struct scandir_cancel_struct c;
+  DIRENT_TYPE *d;
+  int save;
+
+  if (dp == NULL)
+    return -1;
+
+  save = errno;
+  __set_errno (0);
+
+  c.dp = dp;
+  c.v = NULL;
+  c.cnt = 0;
+  __libc_cleanup_push (__scandir_cancel_handler, &c);
+
+  while ((d = READDIR (dp)) != NULL)
+    {
+      int use_it = select == NULL;
+
+      if (! use_it)
+	{
+	  use_it = select (d);
+	  /* The select function might have changed errno.  It was
+	     zero before and it need to be again to make the latter
+	     tests work.  */
+	  __set_errno (0);
+	}
+
+      if (use_it)
+	{
+	  DIRENT_TYPE *vnew;
+	  size_t dsize;
+
+	  /* Ignore errors from select or readdir */
+	  __set_errno (0);
+
+	  if (__builtin_expect (c.cnt == vsize, 0))
+	    {
+	      DIRENT_TYPE **new;
+	      if (vsize == 0)
+		vsize = 10;
+	      else
+		vsize *= 2;
+	      new = (DIRENT_TYPE **) realloc (v, vsize * sizeof (*v));
+	      if (new == NULL)
+		break;
+	      v = new;
+	      c.v = (void *) v;
+	    }
+
+	  dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
+	  vnew = (DIRENT_TYPE *) malloc (dsize);
+	  if (vnew == NULL)
+	    break;
+
+	  v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize);
+	}
+    }
+
+  if (__builtin_expect (errno, 0) != 0)
+    {
+      save = errno;
+
+      while (c.cnt > 0)
+	free (v[--c.cnt]);
+      free (v);
+      c.cnt = -1;
+    }
+  else
+    {
+      /* Sort the list if we have a comparison function to sort with.  */
+      if (cmp != NULL)
+	qsort (v, c.cnt, sizeof (*v),
+	       (int (*) (const void *, const void *)) cmp);
+
+      *namelist = v;
+    }
+
+  __libc_cleanup_pop (0);
+
+  (void) __closedir (dp);
+  __set_errno (save);
+
+  return c.cnt;
+}

Added: fsf/trunk/libc/dirent/scandirat64.c
==============================================================================
--- fsf/trunk/libc/dirent/scandirat64.c (added)
+++ fsf/trunk/libc/dirent/scandirat64.c Wed Aug 10 00:02:27 2011
@@ -1,0 +1,28 @@
+/* Copyright (C) 2000, 2009, 2011 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <dirent.h>
+
+#define SCANDIRAT __scandirat64
+#define READDIR __readdir64
+#define DIRENT_TYPE struct dirent64
+#define SKIP_SCANDIR_CANCEL 1
+
+#include "scandirat.c"
+
+weak_alias (__scandirat64, scandirat64)

Modified: fsf/trunk/libc/include/dirent.h
==============================================================================
--- fsf/trunk/libc/include/dirent.h (original)
+++ fsf/trunk/libc/include/dirent.h Wed Aug 10 00:02:27 2011
@@ -4,8 +4,16 @@
 # include <sys/stat.h>
 # include <stdbool.h>
 
+struct scandir_cancel_struct
+{
+  DIR *dp;
+  void *v;
+  size_t cnt;
+};
+
 /* Now define the internal interfaces.  */
 extern DIR *__opendir (__const char *__name);
+extern DIR *__opendirat (int dfd, __const char *__name) internal_function;
 extern DIR *__fdopendir (int __fd);
 extern int __closedir (DIR *__dirp);
 extern struct dirent *__readdir (DIR *__dirp);
@@ -19,6 +27,11 @@
 			int (*__selector) (__const struct dirent64 *),
 			int (*__cmp) (__const struct dirent64 **,
 				      __const struct dirent64 **));
+extern int __scandirat64 (int __dfd, __const char * __dir,
+			  struct dirent64 *** __namelist,
+			  int (*__selector) (__const struct dirent64 *),
+			  int (*__cmp) (__const struct dirent64 **,
+					__const struct dirent64 **));
 extern __ssize_t __getdents (int __fd, char *__buf, size_t __nbytes)
      internal_function;
 extern __ssize_t __getdents64 (int __fd, char *__buf, size_t __nbytes)
@@ -31,6 +44,7 @@
 extern DIR *__alloc_dir (int fd, bool close_fd, int flags,
 			 const struct stat64 *statp)
      internal_function;
+extern void __scandir_cancel_handler (void *arg);
 
 libc_hidden_proto (rewinddir)
 

Modified: fsf/trunk/libc/nptl/ChangeLog
==============================================================================
--- fsf/trunk/libc/nptl/ChangeLog (original)
+++ fsf/trunk/libc/nptl/ChangeLog Wed Aug 10 00:02:27 2011
@@ -1,3 +1,10 @@
+2011-08-08  Andreas Schwab  <schwab@xxxxxxxxxx>
+
+	* sysdeps/unix/sysv/linux/x86_64/cancellation.S: Maintain aligned
+	stack.
+	* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.
+	* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise.
+
 2011-07-22  Ulrich Drepper  <drepper@xxxxxxxxx>
 
 	* sysdeps/pthread/unwind-forcedunwind.c (_Unwind_Resume): Add read

Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 2009.
 
@@ -71,7 +71,9 @@
 
 1:	ret
 
-3:	movq	$TCB_PTHREAD_CANCELED, %fs:RESULT
+3:	subq	$8, %rsp
+	cfi_adjust_cfa_offset(8)
+	movq	$TCB_PTHREAD_CANCELED, %fs:RESULT
 	lock
 	orl	$TCB_EXITING_BITMASK, %fs:CANCELHANDLING
 	movq	%fs:CLEANUP_JMP_BUF, %rdi

Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2005, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 2002.
 
@@ -63,9 +63,9 @@
 	cfi_adjust_cfa_offset(8)
 	cfi_rel_offset(%r15, 0)
 #ifdef __ASSUME_FUTEX_CLOCK_REALTIME
-# define FRAME_SIZE 32
-#else
-# define FRAME_SIZE 48
+# define FRAME_SIZE (32+8)
+#else
+# define FRAME_SIZE (48+8)
 #endif
 	subq	$FRAME_SIZE, %rsp
 	cfi_adjust_cfa_offset(FRAME_SIZE)

Modified: fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
==============================================================================
--- fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S (original)
+++ fsf/trunk/libc/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2007, 2009, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 2002.
 
@@ -45,7 +45,7 @@
 	cfi_lsda(DW_EH_PE_udata4, .LexceptSTART)
 #endif
 
-#define FRAME_SIZE 32
+#define FRAME_SIZE (32+8)
 	leaq	-FRAME_SIZE(%rsp), %rsp
 	cfi_adjust_cfa_offset(FRAME_SIZE)
 

Modified: fsf/trunk/libc/sysdeps/unix/opendir.c
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/opendir.c (original)
+++ fsf/trunk/libc/sysdeps/unix/opendir.c Wed Aug 10 00:02:27 2011
@@ -17,6 +17,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <assert.h>
 #include <errno.h>
 #include <limits.h>
 #include <stddef.h>
@@ -76,9 +77,9 @@
 #endif
 
 
-/* Open a directory stream on NAME.  */
 DIR *
-__opendir (const char *name)
+internal_function
+__opendirat (int dfd, const char *name)
 {
   struct stat64 statbuf;
   struct stat64 *statp = NULL;
@@ -116,7 +117,13 @@
 #ifdef O_CLOEXEC
   flags |= O_CLOEXEC;
 #endif
-  int fd = open_not_cancel_2 (name, flags);
+  int fd;
+#ifdef IS_IN_rtld
+  assert (dfd == AT_FDCWD);
+  fd = open_not_cancel_2 (name, flags);
+#else
+  fd = openat_not_cancel_3 (dfd, name, flags);
+#endif
   if (__builtin_expect (fd, 0) < 0)
     return NULL;
 
@@ -140,6 +147,14 @@
 
   return __alloc_dir (fd, true, 0, statp);
 }
+
+
+/* Open a directory stream on NAME.  */
+DIR *
+__opendir (const char *name)
+{
+  return __opendirat (AT_FDCWD, name);
+}
 weak_alias (__opendir, opendir)
 
 

Modified: fsf/trunk/libc/sysdeps/unix/sysv/linux/i386/scandir64.c
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/i386/scandir64.c (original)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/i386/scandir64.c Wed Aug 10 00:02:27 2011
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2004, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,8 +19,10 @@
 #include <dirent.h>
 
 #define SCANDIR __scandir64
+#define SCANDIRAT __scandirat64
 #define READDIR __readdir64
 #define DIRENT_TYPE struct dirent64
+#define SKIP_SCANDIR_CANCEL 1
 
 #include <dirent/scandir.c>
 
@@ -33,15 +35,106 @@
 versioned_symbol (libc, __scandir64, scandir64, GLIBC_2_2);
 
 #if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+# include <errno.h>
+# include "olddirent.h"
 
-#include <sysdeps/unix/sysv/linux/i386/olddirent.h>
+int
+__old_scandir64 (dir, namelist, select, cmp)
+     const char *dir;
+     struct __old_dirent64 ***namelist;
+     int (*select) (const struct __old_dirent64 *);
+     int (*cmp) (const struct __old_dirent64 **,
+		 const struct __old_dirent64 **);
+{
+  DIR *dp = __opendir (dir);
+  struct __old_dirent64 **v = NULL;
+  size_t vsize = 0;
+  struct scandir_cancel_struct c;
+  struct __old_dirent64 *d;
+  int save;
 
-#define SCANDIR attribute_compat_text_section __old_scandir64
-#define READDIR __old_readdir64
-#define DIRENT_TYPE struct __old_dirent64
+  if (dp == NULL)
+    return -1;
 
-#include <dirent/scandir.c>
+  save = errno;
+  __set_errno (0);
 
+  c.dp = dp;
+  c.v = NULL;
+  c.cnt = 0;
+  __libc_cleanup_push (__scandir_cancel_handler, &c);
+
+  while ((d = __old_readdir64 (dp)) != NULL)
+    {
+      int use_it = select == NULL;
+
+      if (! use_it)
+	{
+	  use_it = select (d);
+	  /* The select function might have changed errno.  It was
+	     zero before and it need to be again to make the latter
+	     tests work.  */
+	  __set_errno (0);
+	}
+
+      if (use_it)
+	{
+	  struct __old_dirent64 *vnew;
+	  size_t dsize;
+
+	  /* Ignore errors from select or readdir */
+	  __set_errno (0);
+
+	  if (__builtin_expect (c.cnt == vsize, 0))
+	    {
+	      struct __old_dirent64 **new;
+	      if (vsize == 0)
+		vsize = 10;
+	      else
+		vsize *= 2;
+	      new = (struct __old_dirent64 **) realloc (v,
+							vsize * sizeof (*v));
+	      if (new == NULL)
+		break;
+	      v = new;
+	      c.v = (void *) v;
+	    }
+
+	  dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
+	  vnew = (struct __old_dirent64 *) malloc (dsize);
+	  if (vnew == NULL)
+	    break;
+
+	  v[c.cnt++] = (struct __old_dirent64 *) memcpy (vnew, d, dsize);
+	}
+    }
+
+  if (__builtin_expect (errno, 0) != 0)
+    {
+      save = errno;
+
+      while (c.cnt > 0)
+	free (v[--c.cnt]);
+      free (v);
+      c.cnt = -1;
+    }
+  else
+    {
+      /* Sort the list if we have a comparison function to sort with.  */
+      if (cmp != NULL)
+	qsort (v, c.cnt, sizeof (*v),
+	       (int (*) (const void *, const void *)) cmp);
+
+      *namelist = v;
+    }
+
+  __libc_cleanup_pop (0);
+
+  (void) __closedir (dp);
+  __set_errno (save);
+
+  return c.cnt;
+}
 compat_symbol (libc, __old_scandir64, scandir64, GLIBC_2_1);
 
 #endif

Added: fsf/trunk/libc/sysdeps/wordsize-64/scandirat.c
==============================================================================
--- fsf/trunk/libc/sysdeps/wordsize-64/scandirat.c (added)
+++ fsf/trunk/libc/sysdeps/wordsize-64/scandirat.c Wed Aug 10 00:02:27 2011
@@ -1,0 +1,6 @@
+#define scandirat64 scandirat64_renamed
+
+#include "../../dirent/scandirat.c"
+
+#undef scandirat64
+weak_alias (scandirat, scandirat64)

Added: fsf/trunk/libc/sysdeps/wordsize-64/scandirat64.c
==============================================================================
--- fsf/trunk/libc/sysdeps/wordsize-64/scandirat64.c (added)
+++ fsf/trunk/libc/sysdeps/wordsize-64/scandirat64.c Wed Aug 10 00:02:27 2011
@@ -1,0 +1,1 @@
+/* Defined in scandirat.c.  */