OSDN Git Service

We need to have the size of struct dirent equal to the size of struct dirent64
authorEric Andersen <andersen@codepoet.org>
Mon, 10 Feb 2003 21:15:20 +0000 (21:15 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 10 Feb 2003 21:15:20 +0000 (21:15 -0000)
so when _FILE_OFFSET_BITS=64 (such that we transparently change 32bit into 64
bit interfaces), we will not lose an unsigned char from d_name which silently
becomes the d_type field instead.  oops.
 -Erik

libc/sysdeps/linux/common/bits/dirent.h
libc/sysdeps/linux/common/getdents.c
libc/sysdeps/linux/common/getdents64.c

index fb40e99..76794b0 100644 (file)
@@ -30,9 +30,7 @@ struct dirent
     __off64_t d_off;
 #endif
     unsigned short int d_reclen;
-#ifdef __USE_FILE_OFFSET64
     unsigned char d_type;
-#endif
     char d_name[256];          /* We must not include limits.h! */
   };
 
@@ -52,8 +50,4 @@ struct dirent64
 #undef  _DIRENT_HAVE_D_NAMLEN
 #define _DIRENT_HAVE_D_RECLEN
 #define _DIRENT_HAVE_D_OFF
-#ifdef __USE_FILE_OFFSET64
-# define _DIRENT_HAVE_D_TYPE
-#else
-# undef _DIRENT_HAVE_D_TYPE
-#endif
+#define _DIRENT_HAVE_D_TYPE
index 47d8294..ab6a276 100644 (file)
 
 struct kernel_dirent
 {
-    long int d_ino;
-    __kernel_off_t d_off;
-    unsigned short int d_reclen;
-    char d_name[256];
+    long               d_ino;
+    __kernel_off_t     d_off;
+    unsigned short     d_reclen;
+    char               d_name[256];
 };
 
 #define __NR___syscall_getdents __NR_getdents
@@ -90,7 +90,7 @@ ssize_t __getdents (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 = DT_UNKNOWN;
        memcpy (dp->d_name, kdp->d_name,
                kdp->d_reclen - offsetof (struct kernel_dirent, d_name));
        dp = (struct dirent *) ((char *) dp + new_reclen);
index 53e57b3..a37f5e5 100644 (file)
 
 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 
-struct kernel_dirent64
+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];
 };