Update.
* include/dirent.h: Remove __getdirentries declaration, add __getdents and __getdents64. * sysdeps/unix/readdir.c: Use __getdents, not __getdirentries. * sysdeps/unix/readdir_r.c: Likewise. * sysdeps/unix/sysv/linux/readdir64.c: Likewise. * sysdeps/unix/sysv/linux/readdir64_r.c: Likewise. * sysdeps/unix/sysv/linux/getdents.c: Define __getdents, not __getdirentries. Remove fourth argument. * sysdeps/unix/sysv/linux/getdirentries.c: New file. * sysdeps/unix/sysv/linux/getdirentries64.c: New file. * sysdeps/unix/sysv/linux/Makefile [subdir=dirent] (sysdep_routines): Add getdirentries and getdirentries64. * sysdeps/unix/sysv/linux/Dist: Add getdirentries and getdirentries64.
This commit is contained in:
parent
b6a7609d56
commit
980e58323a
14
ChangeLog
14
ChangeLog
@ -1,5 +1,19 @@
|
||||
1999-04-27 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* include/dirent.h: Remove __getdirentries declaration, add __getdents
|
||||
and __getdents64.
|
||||
* sysdeps/unix/readdir.c: Use __getdents, not __getdirentries.
|
||||
* sysdeps/unix/readdir_r.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/readdir64.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/readdir64_r.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/getdents.c: Define __getdents, not
|
||||
__getdirentries. Remove fourth argument.
|
||||
* sysdeps/unix/sysv/linux/getdirentries.c: New file.
|
||||
* sysdeps/unix/sysv/linux/getdirentries64.c: New file.
|
||||
* sysdeps/unix/sysv/linux/Makefile [subdir=dirent] (sysdep_routines):
|
||||
Add getdirentries and getdirentries64.
|
||||
* sysdeps/unix/sysv/linux/Dist: Add getdirentries and getdirentries64.
|
||||
|
||||
* posix/fnmatch.c (internal_fnmatch): Correctly reset string
|
||||
pointer in case of an invalid [[: expression.
|
||||
|
||||
|
@ -8,6 +8,8 @@ extern struct dirent *__readdir __P ((DIR *__dirp));
|
||||
extern struct dirent64 *__readdir64 __P ((DIR *__dirp));
|
||||
extern int __readdir_r __P ((DIR *__dirp, struct dirent *__entry,
|
||||
struct dirent **__result));
|
||||
extern __ssize_t __getdirentries __P ((int __fd, char *__buf,
|
||||
size_t __nbytes, __off_t *__basep));
|
||||
extern __ssize_t __getdents __P ((int __fd, char *__buf, size_t __nbytes))
|
||||
internal_function;
|
||||
extern __ssize_t __getdents64 __P ((int __fd, char *__buf, size_t __nbytes))
|
||||
internal_function;
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,99 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
|
||||
@ -45,7 +45,6 @@ __readdir (DIR *dirp)
|
||||
/* We've emptied out our buffer. Refill it. */
|
||||
|
||||
size_t maxread;
|
||||
off_t base;
|
||||
ssize_t bytes;
|
||||
|
||||
#ifndef _DIRENT_HAVE_D_RECLEN
|
||||
@ -55,8 +54,7 @@ __readdir (DIR *dirp)
|
||||
maxread = dirp->allocation;
|
||||
#endif
|
||||
|
||||
base = dirp->filepos;
|
||||
bytes = __getdirentries (dirp->fd, dirp->data, maxread, &base);
|
||||
bytes = __getdents (dirp->fd, dirp->data, maxread);
|
||||
if (bytes <= 0)
|
||||
{
|
||||
dp = NULL;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,98,99 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
|
||||
@ -44,7 +44,6 @@ __readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
|
||||
/* We've emptied out our buffer. Refill it. */
|
||||
|
||||
size_t maxread;
|
||||
off_t base;
|
||||
ssize_t bytes;
|
||||
|
||||
#ifndef _DIRENT_HAVE_D_RECLEN
|
||||
@ -54,8 +53,7 @@ __readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
|
||||
maxread = dirp->allocation;
|
||||
#endif
|
||||
|
||||
base = dirp->filepos;
|
||||
bytes = __getdirentries (dirp->fd, dirp->data, maxread, &base);
|
||||
bytes = __getdents (dirp->fd, dirp->data, maxread);
|
||||
if (bytes <= 0)
|
||||
{
|
||||
dp = NULL;
|
||||
|
@ -1,6 +1,8 @@
|
||||
bits/pthreadtypes.h
|
||||
cmsg_nxthdr.c
|
||||
errlist.h
|
||||
getdirentries.c
|
||||
getdirentries64.c
|
||||
init-first.h
|
||||
kernel_sigaction.h
|
||||
kernel_stat.h
|
||||
|
@ -97,7 +97,7 @@ endif
|
||||
inhibit-glue = yes
|
||||
|
||||
ifeq ($(subdir),dirent)
|
||||
sysdep_routines += getdents64
|
||||
sysdep_routines += getdents64 getdirentries getdirentries64
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),nis)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1993, 95, 96, 97, 98, 99 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
|
||||
@ -51,22 +51,23 @@ struct kernel_dirent
|
||||
};
|
||||
|
||||
#ifdef GETDENTS64
|
||||
#define __getdirentries __getdirentries64
|
||||
#define dirent dirent64
|
||||
# define __getdents __getdents64
|
||||
# define dirent dirent64
|
||||
#endif
|
||||
|
||||
/* The problem here is that we cannot simply read the next NBYTES
|
||||
bytes. We need to take the additional field into account. We use
|
||||
some heuristic. Assuming the directory contains names with 14
|
||||
characters on average we can compute an estimate number of entries
|
||||
characters on average we can compute an estimated number of entries
|
||||
which fit in the buffer. Taking this number allows us to specify a
|
||||
correct number of bytes to read. If we should be wrong, we can reset
|
||||
the file descriptor. */
|
||||
reasonable number of bytes to read. If we should be wrong, we can
|
||||
reset the file descriptor. In practice the kernel is limiting the
|
||||
amount of data returned much more then the reduced buffer size. */
|
||||
ssize_t
|
||||
__getdirentries (int fd, char *buf, size_t nbytes, off_t *basep)
|
||||
internal_function
|
||||
__getdents (int fd, char *buf, size_t nbytes)
|
||||
{
|
||||
off_t base = __lseek (fd, (off_t) 0, SEEK_CUR);
|
||||
off_t last_offset = base;
|
||||
off_t last_offset = 0;
|
||||
size_t red_nbytes;
|
||||
struct kernel_dirent *skdp, *kdp;
|
||||
struct dirent *dp;
|
||||
@ -84,7 +85,7 @@ __getdirentries (int fd, char *buf, size_t nbytes, off_t *basep)
|
||||
|
||||
if (retval == -1)
|
||||
return -1;
|
||||
|
||||
|
||||
while ((char *) kdp < (char *) skdp + retval)
|
||||
{
|
||||
const size_t alignment = __alignof__ (struct dirent);
|
||||
@ -95,8 +96,13 @@ __getdirentries (int fd, char *buf, size_t nbytes, off_t *basep)
|
||||
if ((char *) dp + new_reclen > buf + nbytes)
|
||||
{
|
||||
/* Our heuristic failed. We read too many entries. Reset
|
||||
the stream. */
|
||||
__lseek (fd, last_offset, SEEK_SET);
|
||||
the stream. `last_offset' contains the last known
|
||||
position. If it is zero this is the first record we are
|
||||
reading. In this case do a relative search. */
|
||||
if (last_offset == 0)
|
||||
__lseek (fd, -retval, SEEK_CUR);
|
||||
else
|
||||
__lseek (fd, last_offset, SEEK_SET);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -112,12 +118,5 @@ __getdirentries (int fd, char *buf, size_t nbytes, off_t *basep)
|
||||
kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen);
|
||||
}
|
||||
|
||||
if (basep)
|
||||
*basep = base;
|
||||
|
||||
return (char *) dp - buf;
|
||||
}
|
||||
|
||||
#ifndef GETDENTS64
|
||||
weak_alias (__getdirentries, getdirentries)
|
||||
#endif
|
||||
|
39
sysdeps/unix/sysv/linux/getdirentries.c
Normal file
39
sysdeps/unix/sysv/linux/getdirentries.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 1993, 95, 96, 97, 98, 99 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 Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef GETDENTS64
|
||||
# define getdirentries getdirentries64
|
||||
# define __getdents __getdents64
|
||||
#endif
|
||||
|
||||
ssize_t
|
||||
getdirentries (int fd, char *buf, size_t nbytes, off_t *basep)
|
||||
{
|
||||
off_t base = __lseek (fd, (off_t) 0, SEEK_CUR);
|
||||
ssize_t result;
|
||||
|
||||
result = __getdents (fd, buf, nbytes);
|
||||
|
||||
if (result != -1)
|
||||
*basep = base;
|
||||
|
||||
return result;
|
||||
}
|
2
sysdeps/unix/sysv/linux/getdirentries64.c
Normal file
2
sysdeps/unix/sysv/linux/getdirentries64.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define GETDENTS64 1
|
||||
#include "getdirentries.c"
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997, 1998, 1999 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
|
||||
@ -27,9 +27,6 @@
|
||||
|
||||
#include <dirstream.h>
|
||||
|
||||
extern ssize_t __getdirentries64 (int, char *, size_t, off_t *);
|
||||
|
||||
|
||||
/* Read a directory entry from DIRP. */
|
||||
struct dirent64 *
|
||||
__readdir64 (DIR *dirp)
|
||||
@ -47,7 +44,6 @@ __readdir64 (DIR *dirp)
|
||||
/* We've emptied out our buffer. Refill it. */
|
||||
|
||||
size_t maxread;
|
||||
off_t base;
|
||||
ssize_t bytes;
|
||||
|
||||
#ifndef _DIRENT_HAVE_D_RECLEN
|
||||
@ -57,8 +53,7 @@ __readdir64 (DIR *dirp)
|
||||
maxread = dirp->allocation;
|
||||
#endif
|
||||
|
||||
base = dirp->filepos;
|
||||
bytes = __getdirentries64 (dirp->fd, dirp->data, maxread, &base);
|
||||
bytes = __getdents64 (dirp->fd, dirp->data, maxread);
|
||||
if (bytes <= 0)
|
||||
{
|
||||
dp = NULL;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997, 1998, 1999 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
|
||||
@ -27,9 +27,6 @@
|
||||
|
||||
#include <dirstream.h>
|
||||
|
||||
extern ssize_t __getdirentries64 (int, char *, size_t, off_t *);
|
||||
|
||||
|
||||
/* Read a directory entry from DIRP, store result in ENTRY and return
|
||||
pointer to result in *RESULT. */
|
||||
int
|
||||
@ -47,7 +44,6 @@ readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
|
||||
/* We've emptied out our buffer. Refill it. */
|
||||
|
||||
size_t maxread;
|
||||
off_t base;
|
||||
ssize_t bytes;
|
||||
|
||||
#ifndef _DIRENT_HAVE_D_RECLEN
|
||||
@ -57,8 +53,7 @@ readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
|
||||
maxread = dirp->allocation;
|
||||
#endif
|
||||
|
||||
base = dirp->filepos;
|
||||
bytes = __getdirentries64 (dirp->fd, dirp->data, maxread, &base);
|
||||
bytes = __getdents64 (dirp->fd, dirp->data, maxread);
|
||||
if (bytes <= 0)
|
||||
{
|
||||
dp = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user