Browse Source

use just __getdents64 rather than either __getdents and __getdents64 when possible (saves space and gives us access to d_type most of the time)

Mike Frysinger 19 years ago
parent
commit
bd5827f470
2 changed files with 24 additions and 11 deletions
  1. 18 4
      libc/sysdeps/linux/common/getdents.c
  2. 6 7
      libc/sysdeps/linux/common/getdents64.c

+ 18 - 4
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

+ 6 - 7
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__ */