#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)
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
}
return (char *) dp - buf;
}
+
+attribute_hidden strong_alias(__getdents,__getdents64)
+
+#endif
#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)
}
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__ */