Ver código fonte

We need to have the size of struct dirent equal to the size of struct dirent64
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

Eric Andersen 21 anos atrás
pai
commit
6d165d5c58

+ 1 - 7
libc/sysdeps/linux/common/bits/dirent.h

@@ -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

+ 5 - 5
libc/sysdeps/linux/common/getdents.c

@@ -34,10 +34,10 @@
 
 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);

+ 6 - 6
libc/sysdeps/linux/common/getdents64.c

@@ -35,13 +35,13 @@
 
 #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];
 };