diff --git a/src/code/unix.lisp b/src/code/unix.lisp index 1fbb1c110..5fc2be487 100644 --- a/src/code/unix.lisp +++ b/src/code/unix.lisp @@ -656,25 +656,21 @@ SYSCALL-FORM. Repeat evaluation of SYSCALL-FORM if it is interrupted." ;;; st_size is a long, not an off-t, because off-t is a 64-bit ;;; quantity on Alpha. And FIXME: "No one would want a file length ;;; longer than 32 bits anyway, right?":-| +;;; +;;; The comment about alien and 64-bit quantities has not been kept in +;;; sync with the comment now in wrap.h (formerly wrap.c), but it's +;;; not clear whether either comment is correct. -- RMK 2007-11-14. (define-alien-type nil (struct wrapped_stat - (st-dev #!-(or mips largefile) unsigned-int - #!+mips unsigned-long - #!+(and largefile (not mips)) dev-t) + (st-dev ffi-dev-t) (st-ino ino-t) (st-mode mode-t) (st-nlink nlink-t) (st-uid uid-t) (st-gid gid-t) - (st-rdev #!-(or mips largefile) unsigned-int - #!+mips unsigned-long - #!+(and largefile (not mips)) dev-t) - (st-size #!-(or darwin mips largefile) unsigned-int - #!+(or darwin mips largefile) off-t) - #!+(and darwin) - (st-blksize unsigned-int) - #!-(and darwin) - (st-blksize unsigned-long) + (st-rdev ffi-dev-t) + (st-size ffi-off-t) + (st-blksize ffi-blksize-t) (st-blocks unsigned-long) (st-atime time-t) (st-mtime time-t) diff --git a/src/runtime/wrap.c b/src/runtime/wrap.c index 376beaf64..1d17e9ac1 100644 --- a/src/runtime/wrap.c +++ b/src/runtime/wrap.c @@ -41,6 +41,7 @@ #include "runtime.h" #include "util.h" +#include "wrap.h" /* Although it might seem as though this should be in some standard Unix header, according to Perry E. Metzger, in a message on @@ -154,72 +155,6 @@ wrapped_readlink(char *path) * stat(2) stuff */ -/* As of 0.6.12, the FFI can't handle 64-bit values. For now, we use - * these munged-to-32-bits values for might-be-64-bit slots of - * stat_wrapper as a workaround, so that at least we can still work - * when values are small. - * - * FIXME: But of course we should fix the FFI so that we can use the - * actual 64-bit values instead. In fact, we probably have by now - * (2003-10-03) on all working platforms except MIPS and HPPA; if some - * motivated spark would simply fix those, this hack could go away. - * -- CSR, 2003-10-03 - * - * Some motivated spark fixed MIPS. -- ths, 2005-10-06 */ - -#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; -#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 */ -#endif - -#ifdef LISP_FEATURE_OS_PROVIDES_BLKSIZE_T -typedef blksize_t ffi_blksize_t; -#else -typedef unsigned long ffi_blksize_t; -#endif - -/* a representation of stat(2) results which doesn't depend on CPU or OS */ -struct stat_wrapper { - /* KLUDGE: The verbose wrapped_st_ prefixes are to protect us from - * the C preprocessor as wielded by the fiends of OpenBSD, who do - * things like - * #define st_atime st_atimespec.tv_sec - * I remember when I was young and innocent, I read about how the - * C preprocessor isn't to be used to globally munge random - * lowercase symbols like this, because things like this could - * 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 */ - 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 */ - 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 */ -}; - static void copy_to_stat_wrapper(struct stat_wrapper *to, struct stat *from) { diff --git a/src/runtime/wrap.h b/src/runtime/wrap.h new file mode 100644 index 000000000..040897123 --- /dev/null +++ b/src/runtime/wrap.h @@ -0,0 +1,82 @@ +/* + * 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. + */ + + +/* As of 0.6.12, the FFI can't handle 64-bit values. For now, we use + * these munged-to-32-bits values for might-be-64-bit slots of + * stat_wrapper as a workaround, so that at least we can still work + * when values are small. + * + * FIXME: But of course we should fix the FFI so that we can use the + * actual 64-bit values instead. In fact, we probably have by now + * (2003-10-03) on all working platforms except MIPS and HPPA; if some + * motivated spark would simply fix those, this hack could go away. + * -- 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 */ + +#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; +#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 */ +#endif + +#ifdef LISP_FEATURE_OS_PROVIDES_BLKSIZE_T +typedef blksize_t ffi_blksize_t; +#else +typedef unsigned long ffi_blksize_t; +#endif + +/* a representation of stat(2) results which doesn't depend on CPU or OS */ +struct stat_wrapper { + /* KLUDGE: The verbose wrapped_st_ prefixes are to protect us from + * the C preprocessor as wielded by the fiends of OpenBSD, who do + * things like + * #define st_atime st_atimespec.tv_sec + * I remember when I was young and innocent, I read about how the + * C preprocessor isn't to be used to globally munge random + * lowercase symbols like this, because things like this could + * 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 */ + 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 */ + 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 */ +}; diff --git a/tools-for-build/grovel-headers.c b/tools-for-build/grovel-headers.c index 49eeac50c..f0e6f76c1 100644 --- a/tools-for-build/grovel-headers.c +++ b/tools-for-build/grovel-headers.c @@ -47,6 +47,8 @@ #include "genesis/config.h" +#include "wrap.h" + #define DEFTYPE(lispname,cname) { cname foo; \ printf("(define-alien-type " lispname " (%s %d))\n", (((foo=-1)<0) ? "sb!alien:signed" : "unsigned"), (8 * (sizeof foo))); } @@ -248,6 +250,10 @@ main(int argc, char *argv[]) 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("\n"); printf(";;; fcntl.h (or unistd.h on OpenBSD and NetBSD)\n"); diff --git a/version.lisp-expr b/version.lisp-expr index 5a0cae677..28223d169 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.11.25" +"1.0.11.26"