This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch, master, updated. glibc-2.14-153-gc55fbd1


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  c55fbd1ea768f9fdef34a01377702c0d72cbc213 (commit)
       via  879165f25a1a6b13995e43c11e88b1a21b6f101e (commit)
      from  16292eddd77f66002e2104848e75a0fb4d316692 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c55fbd1ea768f9fdef34a01377702c0d72cbc213

commit c55fbd1ea768f9fdef34a01377702c0d72cbc213
Author: Ulrich Drepper <drepper@gmail.com>
Date:   Tue Aug 9 09:57:55 2011 -0400

    Implement scandirat function

diff --git a/ChangeLog b/ChangeLog
index 4b6a62f..3ca8232 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2011-08-09  Ulrich Drepper  <drepper@gmail.com>
+
+	* 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@gmail.com>
 
 	* dirent/scandir.c (cancel_handler): Renamed to
diff --git a/NEWS b/NEWS
index 1abcae1..78810a9 100644
--- a/NEWS
+++ b/NEWS
@@ -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 @@ Version 2.15
 
 * Optimized strcat and strncat on x86-64.
   Contributed by Liubov Dmitrieva.
+
+* New interfaces: scandirat, scandirat64
+  Implemented by Ulrich Drepper.
 
 Version 2.14
 
diff --git a/Versions.def b/Versions.def
index 666ea73..98c2800 100644
--- a/Versions.def
+++ b/Versions.def
@@ -31,6 +31,7 @@ libc {
   GLIBC_2.12
   GLIBC_2.13
   GLIBC_2.14
+  GLIBC_2.15
 %ifdef USE_IN_LIBIO
   HURD_CTHREADS_0.3
 %endif
diff --git a/dirent/Makefile b/dirent/Makefile
index ef639f2..07f706e 100644
--- a/dirent/Makefile
+++ b/dirent/Makefile
@@ -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 @@ headers		:= dirent.h bits/dirent.h
 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 \
diff --git a/dirent/Versions b/dirent/Versions
index 41c1584..d976d37 100644
--- a/dirent/Versions
+++ b/dirent/Versions
@@ -44,4 +44,7 @@ libc {
   GLIBC_2.4 {
     fdopendir;
   }
+  GLIBC_2.15 {
+    scandirat; scandirat64;
+  }
 }
diff --git a/dirent/dirent.h b/dirent/dirent.h
index bb4ede1..6a5a0ef 100644
--- a/dirent/dirent.h
+++ b/dirent/dirent.h
@@ -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 @@ extern int dirfd (DIR *__dirp) __THROW __nonnull ((1));
 /* 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,
@@ -280,6 +284,43 @@ extern int scandir64 (__const char *__restrict __dir,
      __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.  */
 # ifndef __USE_FILE_OFFSET64
 extern int alphasort (__const struct dirent **__e1,
diff --git a/dirent/opendir.c b/dirent/opendir.c
index 771013f..6375b67 100644
--- a/dirent/opendir.c
+++ b/dirent/opendir.c
@@ -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,13 +21,20 @@
 #include <dirent.h>
 
 
-/* Open a directory stream on NAME.  */
 DIR *
-__opendir (const char *name)
+__opendirat (int dfd, const char *name)
 {
   __set_errno (ENOSYS);
   return NULL;
 }
+
+
+/* Open a directory stream on NAME.  */
+DIR *
+__opendir (const char *name)
+{
+  return __opendirat (AT_FDCWD, name);
+}
 weak_alias (__opendir, opendir)
 
 stub_warning (opendir)
diff --git a/dirent/scandir.c b/dirent/scandir.c
index e90b942..3f69a8d 100644
--- a/dirent/scandir.c
+++ b/dirent/scandir.c
@@ -18,44 +18,14 @@
    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 SCANDIRAT scandirat
 # define DIRENT_TYPE struct dirent
 #endif
 
-#ifndef SCANDIR_CANCEL
-# define SCANDIR_CANCEL
-struct scandir_cancel_struct
-{
-  DIR *dp;
-  void *v;
-  size_t cnt;
-};
-
-# 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);
-}
-# else
-extern void __scandir_cancel_handler (void *arg);
-# endif
-#endif
-
 
 int
 SCANDIR (dir, namelist, select, cmp)
@@ -64,91 +34,5 @@ SCANDIR (dir, namelist, select, cmp)
      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 (__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;
+  return SCANDIRAT (AT_FDCWD, dir, namelist, select, cmp);
 }
diff --git a/dirent/scandir64.c b/dirent/scandir64.c
index 274822e..21a936e 100644
--- a/dirent/scandir64.c
+++ b/dirent/scandir64.c
@@ -19,14 +19,7 @@
 #include <dirent.h>
 
 #define SCANDIR scandir64
-#define READDIR __readdir64
+#define SCANDIRAT scandirat64
 #define DIRENT_TYPE struct dirent64
-#define SKIP_SCANDIR_CANCEL 1
-
-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>
diff --git a/dirent/scandir.c b/dirent/scandirat.c
similarity index 90%
copy from dirent/scandir.c
copy to dirent/scandirat.c
index e90b942..e6f5ece 100644
--- a/dirent/scandir.c
+++ b/dirent/scandirat.c
@@ -23,22 +23,13 @@
 #include <errno.h>
 #include <bits/libc-lock.h>
 
-#ifndef SCANDIR
-# define SCANDIR scandir
+#ifndef SCANDIRAT
+# define SCANDIRAT scandirat
 # 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;
-};
-
-# ifndef SKIP_SCANDIR_CANCEL
+#ifndef SKIP_SCANDIR_CANCEL
 void
 __scandir_cancel_handler (void *arg)
 {
@@ -51,20 +42,18 @@ __scandir_cancel_handler (void *arg)
   free (v);
   (void) __closedir (cp->dp);
 }
-# else
-extern void __scandir_cancel_handler (void *arg);
-# endif
 #endif
 
 
 int
-SCANDIR (dir, namelist, select, cmp)
+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 = __opendir (dir);
+  DIR *dp = __opendirat (dfd, dir);
   DIRENT_TYPE **v = NULL;
   size_t vsize = 0;
   struct scandir_cancel_struct c;
diff --git a/dirent/scandir64.c b/dirent/scandirat64.c
similarity index 76%
copy from dirent/scandir64.c
copy to dirent/scandirat64.c
index 274822e..c4afb90 100644
--- a/dirent/scandir64.c
+++ b/dirent/scandirat64.c
@@ -18,15 +18,11 @@
 
 #include <dirent.h>
 
-#define SCANDIR scandir64
+#define SCANDIRAT __scandirat64
 #define READDIR __readdir64
 #define DIRENT_TYPE struct dirent64
 #define SKIP_SCANDIR_CANCEL 1
 
-int scandir64 (__const char *__restrict __dir,
-	       struct dirent64 ***__restrict __namelist,
-	       int (*__selector) (__const struct dirent64 *),
-	       int (*__cmp) (__const struct dirent64 **,
-			     __const struct dirent64 **));
+#include "scandirat.c"
 
-#include <dirent/scandir.c>
+weak_alias (__scandirat64, scandirat64)
diff --git a/include/dirent.h b/include/dirent.h
index 0f8f1cb..9ed5876 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -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 @@ extern int __scandir64 (__const char * __dir,
 			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 int __versionsort64 (const struct dirent64 **a,
 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)
 
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c
index c2d1dda..58d3176 100644
--- a/sysdeps/unix/opendir.c
+++ b/sysdeps/unix/opendir.c
@@ -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 @@ tryopen_o_directory (void)
 #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 @@ __opendir (const char *name)
 #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 @@ __opendir (const char *name)
 
   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)
 
 
diff --git a/sysdeps/unix/sysv/linux/i386/scandir64.c b/sysdeps/unix/sysv/linux/i386/scandir64.c
index 837e1b9..dacac0a 100644
--- a/sysdeps/unix/sysv/linux/i386/scandir64.c
+++ b/sysdeps/unix/sysv/linux/i386/scandir64.c
@@ -19,6 +19,7 @@
 #include <dirent.h>
 
 #define SCANDIR __scandir64
+#define SCANDIRAT __scandirat64
 #define READDIR __readdir64
 #define DIRENT_TYPE struct dirent64
 #define SKIP_SCANDIR_CANCEL 1
@@ -34,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
diff --git a/sysdeps/wordsize-64/scandirat.c b/sysdeps/wordsize-64/scandirat.c
new file mode 100644
index 0000000..02b8fde
--- /dev/null
+++ b/sysdeps/wordsize-64/scandirat.c
@@ -0,0 +1,6 @@
+#define scandirat64 scandirat64_renamed
+
+#include "../../dirent/scandirat.c"
+
+#undef scandirat64
+weak_alias (scandirat, scandirat64)
diff --git a/sysdeps/wordsize-64/scandirat64.c b/sysdeps/wordsize-64/scandirat64.c
new file mode 100644
index 0000000..fb93865
--- /dev/null
+++ b/sysdeps/wordsize-64/scandirat64.c
@@ -0,0 +1 @@
+/* Defined in scandirat.c.  */

http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=879165f25a1a6b13995e43c11e88b1a21b6f101e

commit 879165f25a1a6b13995e43c11e88b1a21b6f101e
Author: Ulrich Drepper <drepper@gmail.com>
Date:   Mon Aug 8 13:49:37 2011 -0400

    Avoid multiple definitions of identical scandir cancellation handler

diff --git a/ChangeLog b/ChangeLog
index f8212a6..4b6a62f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-08-08  Ulrich Drepper  <drepper@gmail.com>
+
+	* 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@gmail.com>
 
 	* string/test-string.h (IMPL): Use __STRING to expand name and then
diff --git a/dirent/scandir.c b/dirent/scandir.c
index 2e03578..e90b942 100644
--- a/dirent/scandir.c
+++ b/dirent/scandir.c
@@ -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
@@ -23,13 +24,13 @@
 #include <bits/libc-lock.h>
 
 #ifndef SCANDIR
-#define SCANDIR scandir
-#define READDIR __readdir
-#define DIRENT_TYPE struct dirent
+# define SCANDIR scandir
+# define READDIR __readdir
+# define DIRENT_TYPE struct dirent
 #endif
 
 #ifndef SCANDIR_CANCEL
-#define SCANDIR_CANCEL
+# define SCANDIR_CANCEL
 struct scandir_cancel_struct
 {
   DIR *dp;
@@ -37,8 +38,9 @@ struct scandir_cancel_struct
   size_t cnt;
 };
 
-static void
-cancel_handler (void *arg)
+# ifndef SKIP_SCANDIR_CANCEL
+void
+__scandir_cancel_handler (void *arg)
 {
   struct scandir_cancel_struct *cp = arg;
   size_t i;
@@ -49,6 +51,9 @@ cancel_handler (void *arg)
   free (v);
   (void) __closedir (cp->dp);
 }
+# else
+extern void __scandir_cancel_handler (void *arg);
+# endif
 #endif
 
 
@@ -75,7 +80,7 @@ SCANDIR (dir, namelist, select, cmp)
   c.dp = dp;
   c.v = NULL;
   c.cnt = 0;
-  __libc_cleanup_push (cancel_handler, &c);
+  __libc_cleanup_push (__scandir_cancel_handler, &c);
 
   while ((d = READDIR (dp)) != NULL)
     {
diff --git a/dirent/scandir64.c b/dirent/scandir64.c
index b7bd654..274822e 100644
--- a/dirent/scandir64.c
+++ b/dirent/scandir64.c
@@ -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
@@ -21,6 +21,7 @@
 #define SCANDIR scandir64
 #define READDIR __readdir64
 #define DIRENT_TYPE struct dirent64
+#define SKIP_SCANDIR_CANCEL 1
 
 int scandir64 (__const char *__restrict __dir,
 	       struct dirent64 ***__restrict __namelist,
diff --git a/sysdeps/unix/sysv/linux/i386/scandir64.c b/sysdeps/unix/sysv/linux/i386/scandir64.c
index 690be81..837e1b9 100644
--- a/sysdeps/unix/sysv/linux/i386/scandir64.c
+++ b/sysdeps/unix/sysv/linux/i386/scandir64.c
@@ -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
@@ -21,6 +21,7 @@
 #define SCANDIR __scandir64
 #define READDIR __readdir64
 #define DIRENT_TYPE struct dirent64
+#define SKIP_SCANDIR_CANCEL 1
 
 #include <dirent/scandir.c>
 

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                |   31 +++++++
 NEWS                                     |    5 +-
 Versions.def                             |    1 +
 dirent/Makefile                          |    5 +-
 dirent/Versions                          |    3 +
 dirent/dirent.h                          |   45 +++++++++-
 dirent/opendir.c                         |   13 ++-
 dirent/scandir.c                         |  125 ++------------------------
 dirent/scandir64.c                       |   10 +--
 dirent/scandirat.c                       |  143 ++++++++++++++++++++++++++++++
 dirent/scandirat64.c                     |   28 ++++++
 include/dirent.h                         |   14 +++
 sysdeps/unix/opendir.c                   |   21 ++++-
 sysdeps/unix/sysv/linux/i386/scandir64.c |  105 +++++++++++++++++++++--
 sysdeps/wordsize-64/scandirat.c          |    6 ++
 sysdeps/wordsize-64/scandirat64.c        |    1 +
 16 files changed, 413 insertions(+), 143 deletions(-)
 create mode 100644 dirent/scandirat.c
 create mode 100644 dirent/scandirat64.c
 create mode 100644 sysdeps/wordsize-64/scandirat.c
 create mode 100644 sysdeps/wordsize-64/scandirat64.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]