Avoid multiple definitions of identical scandir cancellation handler

This commit is contained in:
Ulrich Drepper 2011-08-08 13:49:37 -04:00
parent 16292eddd7
commit 879165f25a
4 changed files with 25 additions and 10 deletions

View File

@ -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> 2011-08-04 Ulrich Drepper <drepper@gmail.com>
* string/test-string.h (IMPL): Use __STRING to expand name and then * string/test-string.h (IMPL): Use __STRING to expand name and then

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -23,13 +24,13 @@
#include <bits/libc-lock.h> #include <bits/libc-lock.h>
#ifndef SCANDIR #ifndef SCANDIR
#define SCANDIR scandir # define SCANDIR scandir
#define READDIR __readdir # define READDIR __readdir
#define DIRENT_TYPE struct dirent # define DIRENT_TYPE struct dirent
#endif #endif
#ifndef SCANDIR_CANCEL #ifndef SCANDIR_CANCEL
#define SCANDIR_CANCEL # define SCANDIR_CANCEL
struct scandir_cancel_struct struct scandir_cancel_struct
{ {
DIR *dp; DIR *dp;
@ -37,8 +38,9 @@ struct scandir_cancel_struct
size_t cnt; size_t cnt;
}; };
static void # ifndef SKIP_SCANDIR_CANCEL
cancel_handler (void *arg) void
__scandir_cancel_handler (void *arg)
{ {
struct scandir_cancel_struct *cp = arg; struct scandir_cancel_struct *cp = arg;
size_t i; size_t i;
@ -49,6 +51,9 @@ cancel_handler (void *arg)
free (v); free (v);
(void) __closedir (cp->dp); (void) __closedir (cp->dp);
} }
# else
extern void __scandir_cancel_handler (void *arg);
# endif
#endif #endif
@ -75,7 +80,7 @@ SCANDIR (dir, namelist, select, cmp)
c.dp = dp; c.dp = dp;
c.v = NULL; c.v = NULL;
c.cnt = 0; c.cnt = 0;
__libc_cleanup_push (cancel_handler, &c); __libc_cleanup_push (__scandir_cancel_handler, &c);
while ((d = READDIR (dp)) != NULL) while ((d = READDIR (dp)) != NULL)
{ {

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -21,6 +21,7 @@
#define SCANDIR scandir64 #define SCANDIR scandir64
#define READDIR __readdir64 #define READDIR __readdir64
#define DIRENT_TYPE struct dirent64 #define DIRENT_TYPE struct dirent64
#define SKIP_SCANDIR_CANCEL 1
int scandir64 (__const char *__restrict __dir, int scandir64 (__const char *__restrict __dir,
struct dirent64 ***__restrict __namelist, struct dirent64 ***__restrict __namelist,

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -21,6 +21,7 @@
#define SCANDIR __scandir64 #define SCANDIR __scandir64
#define READDIR __readdir64 #define READDIR __readdir64
#define DIRENT_TYPE struct dirent64 #define DIRENT_TYPE struct dirent64
#define SKIP_SCANDIR_CANCEL 1
#include <dirent/scandir.c> #include <dirent/scandir.c>