Add d_type to 'struct dirent'
authorDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Thu, 2 Apr 2009 07:39:51 +0000 (03:39 -0400)
committerDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Thu, 2 Apr 2009 07:39:51 +0000 (03:39 -0400)
TODO.opensolaris
sysdeps/unix/sysv/linux/getdents.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/dirent.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getdents.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getdents64.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/linux/posix_types.h [new file with mode: 0644]

index b717b1a..a646548 100644 (file)
@@ -1,6 +1,3 @@
-ABI changes:
-  Add d_type to struct dirent
-
 /usr/include/gnu/stubs-32.h
 
 ptrace details:
index b33d178..6b2b4f0 100644 (file)
@@ -58,6 +58,7 @@ extern int __have_no_getdents64 attribute_hidden;
 
    Here is the kernel definition of `struct dirent' as of 2.1.20:  */
 
+#ifndef __KERNEL_DIRENT
 struct kernel_dirent
   {
     long int d_ino;
@@ -66,6 +67,7 @@ struct kernel_dirent
     char d_name[256];
   };
 
+# ifdef __NR_getdents64
 struct kernel_dirent64
   {
     uint64_t           d_ino;
@@ -74,6 +76,8 @@ struct kernel_dirent64
     unsigned char      d_type;
     char               d_name[256];
   };
+# endif
+#endif
 
 #ifndef __GETDENTS
 # define __GETDENTS __getdents
index bb7a4c7..eaa6ac6 100644 (file)
@@ -20,9 +20,6 @@
 # error "Never use <bits/dirent.h> directly; include <dirent.h> instead."
 #endif
 
-/* XXX: On OpenSolaris d_name is variable length. For compatibility we define
-   it to have length 256.  */
-
 typedef struct dirent
   {
 #ifndef __USE_FILE_OFFSET64
@@ -33,25 +30,17 @@ typedef struct dirent
     __off64_t d_off;
 #endif
     unsigned short int d_reclen;
+    unsigned char d_type;
     char d_name[256];          /* We must not include limits.h! */
   } dirent_t;
 
-#ifdef _SYSCALL32
-typedef struct dirent32
-  {
-       __ino_t d_ino;
-       __off_t d_off;
-       __uint16_t d_reclen;
-       char d_name[256];
-  } dirent32_t;
-#endif
-
 #ifdef __USE_LARGEFILE64
 typedef struct dirent64
   {
     __ino64_t d_ino;
     __off64_t d_off;
     unsigned short int d_reclen;
+    unsigned char d_type;
     char d_name[256];          /* We must not include limits.h! */
   } dirent64_t;
 #endif
@@ -61,3 +50,4 @@ typedef struct dirent64
 #undef  _DIRENT_HAVE_D_NAMLEN
 #define _DIRENT_HAVE_D_RECLEN
 #define _DIRENT_HAVE_D_OFF
+#define _DIRENT_HAVE_D_TYPE
index 469816e..73c8b5e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
 
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <inline-syscall.h>
-#include <dirent.h>
+#include <sys/types,h>
 
-/* This can't be a direct syscall since it's marked as internal_function. */
+#define __KERNEL_DIRENT
+struct kernel_dirent
+  {
+    __ino_t d_ino;
+    __off_t d_off;
+    unsigned short d_reclen;
+    char d_name[1];
+  };
+#endif
 
-DECLARE_INLINE_SYSCALL (int, getdents, int fd, void *buf, size_t count);
-
-ssize_t
-internal_function
-__getdents (int fd, char *buf, size_t nbytes)
-{
-  return INLINE_SYSCALL(getdents, 3, fd, buf, nbytes);
-}
+#include <sysdeps/unix/sysv/linux/getdents.c>
index 68c9faf..562e169 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2009 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
 
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <inline-syscall.h>
-#include <dirent.h>
+#include <sys/types,h>
 
-/* This can't be a direct syscall since it's marked as internal_function. */
+#define __KERNEL_DIRENT
+struct kernel_dirent
+  {
+    __ino64_t d_ino;
+    __off64_t d_off;
+    unsigned short d_reclen;
+    char d_name[1];
+  };
+#endif
 
-DECLARE_INLINE_SYSCALL (int, getdents64, int fd, void *buf, size_t count);
-
-ssize_t
-internal_function
-__getdents64 (int fd, char *buf, size_t nbytes)
-{
-  return INLINE_SYSCALL (getdents64, 3, fd, buf, nbytes);
-}
+#define __GETDENTS __getdents64
+#define DIRENT_TYPE struct dirent64
+#include <sysdeps/unix/sysv/linux/getdents.c>
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/linux/posix_types.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/linux/posix_types.h
new file mode 100644 (file)
index 0000000..affdde1
--- /dev/null
@@ -0,0 +1 @@
+/* This file left intentionally blank.  */