/*
* Data structures used in wrap.c in this directory, moved here from
* wrap.c in November 2007 so that
- * src/tools-for-build/grovel-headers.c can grovel the sizes and
- * offsets of things.
+ * src/tools-for-build/grovel-headers.c can grovel the sizes of
+ * things.
*/
* -- CSR, 2003-10-03
*
* Some motivated spark fixed MIPS. -- ths, 2005-10-06 */
+
/* It would seem as though the FFI would have to be able to handle
* 64-bit values in order for the LARGEFILE && !MIPS case below to
* work, so can the comment above still be right? If FFI can only
* handle 64-bit aliens on some platforms, maybe there should be a
* distinct Lisp feature for 64-bit aliens support? -- RMK,
- * 2007-11-14 */
+ * 2007-11-14
+ *
+ * In any case, since the types defined here exist to give sizes to
+ * potentially munged or faked data in our stat wrapper, these
+ * shouldn't be used for any purpose for which the real type can be
+ * employed. */
#include "sbcl.h"
#include "runtime.h"
-#if defined(LISP_FEATURE_LARGEFILE) && !defined(LISP_FEATURE_MIPS)
-typedef dev_t ffi_dev_t;
-typedef off_t ffi_off_t;
-#elif defined(LISP_FEATURE_MIPS)
-typedef unsigned long ffi_dev_t; /* Linux/MIPS struct stat doesn't use dev_t */
-typedef off_t ffi_off_t;
-#elif defined(LISP_FEATURE_DARWIN)
-typedef dev_t ffi_dev_t;
-typedef off_t ffi_off_t;
+/* We use an extra layer of aliasing because Linux/MIPS struct stat
+ doesn't use dev_t. This type is not defined on the Lisp side. */
+#ifdef LISP_FEATURE_MIPS
+typedef unsigned long aliased_dev_t;
+#else
+typedef dev_t aliased_dev_t;
+#endif
+
+#if defined(LISP_FEATURE_LARGEFILE) || defined(LISP_FEATURE_DARWIN)
+typedef aliased_dev_t wst_dev_t;
+typedef off_t wst_off_t;
#else
-typedef u32 ffi_dev_t; /* since Linux dev_t can be 64 bits */
-typedef u32 ffi_off_t; /* since OpenBSD 2.8 st_size is 64 bits */
+typedef u32 wst_dev_t; /* since Linux dev_t can be 64 bits */
+typedef u32 wst_off_t; /* since OpenBSD 2.8 st_size is 64 bits */
#endif
#ifdef LISP_FEATURE_OS_PROVIDES_BLKSIZE_T
-typedef blksize_t ffi_blksize_t;
+typedef blksize_t wst_blksize_t;
+typedef blkcnt_t wst_blkcnt_t;
#else
-typedef unsigned long ffi_blksize_t;
+typedef unsigned long wst_blksize_t;
+typedef unsigned long wst_blkcnt_t;
+#endif
+
+#ifdef LISP_FEATURE_WIN32 /* Win32 lacks nlink_t, st_uid, st_gid.*/
+typedef short wst_nlink_t;
+typedef short wst_uid_t;
+typedef short wst_gid_t;
+#else
+typedef nlink_t wst_nlink_t;
+typedef uid_t wst_uid_t;
+typedef gid_t wst_gid_t;
#endif
/* a representation of stat(2) results which doesn't depend on CPU or OS */
* happen, and I nodded sagely. But now I know better.:-| This is
* another entry for Dan Barlow's ongoing episodic rant about C
* header files, I guess.. -- WHN 2001-05-10 */
- ffi_dev_t wrapped_st_dev; /* device */
+ wst_dev_t wrapped_st_dev; /* device */
ino_t wrapped_st_ino; /* inode */
mode_t wrapped_st_mode; /* protection */
-#ifndef LISP_FEATURE_WIN32
- nlink_t wrapped_st_nlink; /* number of hard links */
- uid_t wrapped_st_uid; /* user ID of owner */
- gid_t wrapped_st_gid; /* group ID of owner */
-#else
- short wrapped_st_nlink; /* Win32 doesn't have nlink_t */
- short wrapped_st_uid; /* Win32 doesn't have st_uid */
- short wrapped_st_gid; /* Win32 doesn't have st_gid */
-#endif
- ffi_dev_t wrapped_st_rdev; /* device type (if inode device) */
- ffi_off_t wrapped_st_size; /* total size, in bytes */
- ffi_blksize_t wrapped_st_blksize; /* blocksize for filesystem I/O */
- unsigned long wrapped_st_blocks; /* number of blocks allocated */
+ wst_nlink_t wrapped_st_nlink; /* number of hard links */
+ wst_uid_t wrapped_st_uid; /* user ID of owner */
+ wst_gid_t wrapped_st_gid; /* group ID of owner */
+ wst_dev_t wrapped_st_rdev; /* device type (if inode device) */
+ wst_off_t wrapped_st_size; /* total size, in bytes */
+ wst_blksize_t wrapped_st_blksize; /* blocksize for filesystem I/O */
+ wst_blkcnt_t wrapped_st_blocks; /* number of blocks allocated */
time_t wrapped_st_atime; /* time_t of last access */
time_t wrapped_st_mtime; /* time_t of last modification */
time_t wrapped_st_ctime; /* time_t of last change */
DEFTYPE("suseconds-t", suseconds_t);
#endif
DEFTYPE("uid-t", uid_t);
-/* Types in src/runtime/wrap.h */
- DEFTYPE("ffi-dev-t", ffi_dev_t);
- DEFTYPE("ffi-off-t", ffi_off_t);
- DEFTYPE("ffi-blksize-t", ffi_blksize_t);
+ printf(";; Types in src/runtime/wrap.h. See that file for explantion.\n");
+ printf(";; Don't use these types for anything other than the stat wrapper.\n");
+ DEFTYPE("wst-dev-t", wst_dev_t);
+ DEFTYPE("wst-off-t", wst_off_t);
+ DEFTYPE("wst-blksize-t", wst_blksize_t);
+ DEFTYPE("wst-blkcnt-t", wst_blkcnt_t);
+ DEFTYPE("wst-nlink-t", wst_nlink_t);
+ DEFTYPE("wst-uid-t", wst_uid_t);
+ DEFTYPE("wst-gid-t", wst_gid_t);
printf("\n");
printf(";;; fcntl.h (or unistd.h on OpenBSD and NetBSD)\n");
defconstant("fpe-fltsub", -1);
#endif
-#endif // _WIN32
+#endif // !WIN32
return 0;
}