diff options
| -rw-r--r-- | libc/sysdeps/linux/common/getdents.c | 22 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/getdents64.c | 13 | 
2 files changed, 24 insertions, 11 deletions
diff --git a/libc/sysdeps/linux/common/getdents.c b/libc/sysdeps/linux/common/getdents.c index 7056c3ebc..0c6eba658 100644 --- a/libc/sysdeps/linux/common/getdents.c +++ b/libc/sysdeps/linux/common/getdents.c @@ -16,6 +16,16 @@  #include <sys/types.h>  #include <sys/syscall.h> +/* With newer versions of linux, the getdents syscall returns d_type + * information after the name field.  Someday, we should add support for + * that instead of always calling getdents64 ... + * + * See __ASSUME_GETDENTS32_D_TYPE in glibc's kernel-features.h for specific + * version / arch details. + */ + +#if ! defined __UCLIBC_HAS_LFS__ || ! defined __NR_getdents64 +  libc_hidden_proto(memcpy)  libc_hidden_proto(lseek) @@ -25,10 +35,10 @@ libc_hidden_proto(lseek)  struct kernel_dirent  { -    long		d_ino; -    __kernel_off_t	d_off; -    unsigned short	d_reclen; -    char		d_name[256]; +	long int d_ino; +	__kernel_off_t d_off; +	unsigned short int d_reclen; +	char d_name[256];  };  #define __NR___syscall_getdents __NR_getdents @@ -89,3 +99,7 @@ ssize_t attribute_hidden __getdents (int fd, char *buf, size_t nbytes)      }      return (char *) dp - buf;  } + +attribute_hidden strong_alias(__getdents,__getdents64) + +#endif diff --git a/libc/sysdeps/linux/common/getdents64.c b/libc/sysdeps/linux/common/getdents64.c index aa30bd661..da193ebab 100644 --- a/libc/sysdeps/linux/common/getdents64.c +++ b/libc/sysdeps/linux/common/getdents64.c @@ -17,7 +17,7 @@  #include <sys/types.h>  #include <sys/syscall.h> -#if defined __UCLIBC_HAS_LFS__ && defined __NR_getdents64  +#if defined __UCLIBC_HAS_LFS__ && defined __NR_getdents64  libc_hidden_proto(memcpy)  libc_hidden_proto(lseek64) @@ -94,10 +94,9 @@ ssize_t attribute_hidden __getdents64 (int fd, char *buf, size_t nbytes)      }      return (char *) dp - buf;  } -#else -extern ssize_t __getdents (int fd, char *buf, size_t nbytes) attribute_hidden; -ssize_t attribute_hidden __getdents64 (int fd, char *buf, size_t nbytes) -{ -    return(__getdents(fd, buf, nbytes)); -} + +/* since getdents doesnt give us d_type but getdents64 does, try and + * use getdents64 as much as possible */ +attribute_hidden strong_alias(__getdents64,__getdents) +  #endif /* __UCLIBC_HAS_LFS__ */  | 
