[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/...
- To: commits@xxxxxxxxxx
- Subject: [commits] r14884 - in /fsf/trunk/libc: ./ dirent/ include/ nptl/ nptl/sysdeps/unix/sysv/linux/x86_64/ sysdeps/unix/ sysdeps/unix/sysv/...
- From: eglibc@xxxxxxxxxx
- Date: Wed, 10 Aug 2011 07:02:29 -0000
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. */