about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/getdents.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/getdents.c')
-rw-r--r--sysdeps/unix/sysv/linux/getdents.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/sysdeps/unix/sysv/linux/getdents.c b/sysdeps/unix/sysv/linux/getdents.c
index 0f16683eed..474bf1989b 100644
--- a/sysdeps/unix/sysv/linux/getdents.c
+++ b/sysdeps/unix/sysv/linux/getdents.c
@@ -51,9 +51,12 @@ struct kernel_dirent
     char d_name[256];
   };
 
-#ifdef GETDENTS64
-# define __getdents __getdents64
-# define dirent dirent64
+#ifndef __GETDENTS
+# define __GETDENTS __getdents
+# define DIRENT_TYPE struct dirent
+#endif
+#ifndef DIRENT_SET_DP_INO
+# define DIRENT_SET_DP_INO(dp, value) (dp)->d_ino = (value)
 #endif
 
 /* The problem here is that we cannot simply read the next NBYTES
@@ -66,22 +69,22 @@ struct kernel_dirent
    amount of data returned much more then the reduced buffer size.  */
 ssize_t
 internal_function
-__getdents (int fd, char *buf, size_t nbytes)
+__GETDENTS (int fd, char *buf, size_t nbytes)
 {
   off_t last_offset = -1;
   size_t red_nbytes;
   struct kernel_dirent *skdp, *kdp;
-  struct dirent *dp;
+  DIRENT_TYPE *dp;
   int retval;
-  const size_t size_diff = (offsetof (struct dirent, d_name)
+  const size_t size_diff = (offsetof (DIRENT_TYPE, d_name)
 			    - offsetof (struct kernel_dirent, d_name));
 
   red_nbytes = MIN (nbytes
-		    - ((nbytes / (offsetof (struct dirent, d_name) + 14))
+		    - ((nbytes / (offsetof (DIRENT_TYPE, d_name) + 14))
 		       * size_diff),
 		    nbytes - size_diff);
 
-  dp = (struct dirent *) buf;
+  dp = (DIRENT_TYPE *) buf;
   skdp = kdp = __alloca (red_nbytes);
 
   retval = INLINE_SYSCALL (getdents, 3, fd,
@@ -92,7 +95,7 @@ __getdents (int fd, char *buf, size_t nbytes)
 
   while ((char *) kdp < (char *) skdp + retval)
     {
-      const size_t alignment = __alignof__ (struct dirent);
+      const size_t alignment = __alignof__ (DIRENT_TYPE);
       /* Since kdp->d_reclen is already aligned for the kernel structure
 	 this may compute a value that is bigger than necessary.  */
       size_t new_reclen = ((kdp->d_reclen + size_diff + alignment - 1)
@@ -116,14 +119,14 @@ __getdents (int fd, char *buf, size_t nbytes)
 	}
 
       last_offset = kdp->d_off;
-      dp->d_ino = kdp->d_ino;
+      DIRENT_SET_DP_INO(dp, kdp->d_ino);
       dp->d_off = kdp->d_off;
       dp->d_reclen = new_reclen;
       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);
+      dp = (DIRENT_TYPE *) ((char *) dp + new_reclen);
       kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen);
     }