OSDN Git Service

- trim any trailing whitespace
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / common / getdents64.c
index 53e57b3..e695b96 100644 (file)
@@ -1,20 +1,8 @@
-/* Copyright (C) 1993, 1995-2002 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 Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
 
 #include <features.h>
 #include <alloca.h>
 #include <stdint.h>
 #include <string.h>
 #include <unistd.h>
-#include <sysdep.h>
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/syscall.h>
+#include <bits/kernel_types.h>
 
-#if defined __UCLIBC_HAS_LFS__ && defined __NR_getdents64 
+#if defined __UCLIBC_HAS_LFS__ && defined __NR_getdents64
 
+/* Experimentally off - libc_hidden_proto(memcpy) */
+libc_hidden_proto(lseek64)
 
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+# ifndef offsetof
+#  define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+# endif
 
 struct kernel_dirent64
 {
-    uint64_t            d_ino;
-    int64_t             d_off;
-    unsigned short int  d_reclen;
-    unsigned char       d_type;
-    char                d_name[256];
+    uint64_t           d_ino;
+    int64_t            d_off;
+    unsigned short     d_reclen;
+    unsigned char      d_type;
+    char               d_name[256];
 };
 
 
-#define __NR___syscall_getdents64 __NR_getdents64
-static inline _syscall3(int, __syscall_getdents64, int, fd, unsigned char *, dirp, size_t, count);
-
+# define __NR___syscall_getdents64 __NR_getdents64
+static __inline__ _syscall3(int, __syscall_getdents64, int, fd, unsigned char *, dirp, size_t, count);
 
+ssize_t __getdents64 (int fd, char *buf, size_t nbytes) attribute_hidden;
 ssize_t __getdents64 (int fd, char *buf, size_t nbytes)
 {
     struct dirent64 *dp;
@@ -59,14 +51,14 @@ ssize_t __getdents64 (int fd, char *buf, size_t nbytes)
     const size_t size_diff = (offsetof (struct dirent64, d_name)
            - offsetof (struct kernel_dirent64, d_name));
 
-    red_nbytes = MIN (nbytes - ((nbytes / 
-                   (offsetof (struct dirent64, d_name) + 14)) * size_diff), 
+    red_nbytes = MIN (nbytes - ((nbytes /
+                   (offsetof (struct dirent64, d_name) + 14)) * size_diff),
            nbytes - size_diff);
 
     dp = (struct dirent64 *) buf;
     skdp = kdp = alloca (red_nbytes);
 
-    retval = __syscall_getdents64(fd, (char *)kdp, red_nbytes);
+    retval = __syscall_getdents64(fd, (unsigned char *)kdp, red_nbytes);
     if (retval == -1)
        return -1;
 
@@ -95,7 +87,7 @@ ssize_t __getdents64 (int fd, char *buf, size_t nbytes)
        dp->d_ino = kdp->d_ino;
        dp->d_off = kdp->d_off;
        dp->d_reclen = new_reclen;
-       dp->d_type = DT_UNKNOWN;
+       dp->d_type = kdp->d_type;
        memcpy (dp->d_name, kdp->d_name,
                kdp->d_reclen - offsetof (struct kernel_dirent64, d_name));
        dp = (struct dirent64 *) ((char *) dp + new_reclen);
@@ -103,11 +95,11 @@ ssize_t __getdents64 (int fd, char *buf, size_t nbytes)
     }
     return (char *) dp - buf;
 }
-#else
-ssize_t __getdents (int fd, char *buf, size_t nbytes);
-ssize_t __getdents64 (int fd, char *buf, size_t nbytes)
-{
-    return(__getdents(fd, buf, nbytes));
-}
-#endif /* __UCLIBC_HAS_LFS__ */
 
+#if __WORDSIZE == 64
+/* 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
+
+#endif /* __UCLIBC_HAS_LFS__ */