diff --git a/src/core/sys/freebsd/config.d b/src/core/sys/freebsd/config.d new file mode 100644 index 00000000000..1a61f901ca4 --- /dev/null +++ b/src/core/sys/freebsd/config.d @@ -0,0 +1,22 @@ +/** + * D header file for FreeBSD + * + * Authors: Iain Buclaw + */ +module core.sys.freebsd.config; + +version (FreeBSD): + +public import core.sys.posix.config; + +// __FreeBSD_version numbers are documented in the Porter's Handbook. +// https://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup + version (FreeBSD_12) enum __FreeBSD_version = 1202000; +else version (FreeBSD_11) enum __FreeBSD_version = 1104000; +else version (FreeBSD_10) enum __FreeBSD_version = 1004000; +else version (FreeBSD_9) enum __FreeBSD_version = 903000; +else version (FreeBSD_8) enum __FreeBSD_version = 804000; +else static assert(false "Unsupported version of FreeBSD"); + +// First version of FreeBSD to support 64-bit stat buffer. +enum INO64_FIRST = 1200031; diff --git a/src/core/sys/freebsd/sys/event.d b/src/core/sys/freebsd/sys/event.d index c8bc141be6b..bb402d197cc 100644 --- a/src/core/sys/freebsd/sys/event.d +++ b/src/core/sys/freebsd/sys/event.d @@ -18,6 +18,7 @@ extern (C): nothrow: @nogc: +import core.sys.freebsd.config; import core.stdc.stdint; // intptr_t, uintptr_t import core.sys.posix.time; // timespec @@ -43,7 +44,7 @@ extern(D) void EV_SET(kevent_t* kevp, typeof(kevent_t.tupleof) args) *kevp = kevent_t(args); } -version (FreeBSD_12) +static if (__FreeBSD_version >= 1200000 && __FreeBSD_version < 1300000) { struct kevent_t { @@ -56,7 +57,7 @@ version (FreeBSD_12) ulong[4] ext; } } -else version (FreeBSD_11) +else static if (__FreeBSD_version < 1200000) { struct kevent_t { diff --git a/src/core/sys/freebsd/sys/mount.d b/src/core/sys/freebsd/sys/mount.d index cca60159afc..42725750acc 100644 --- a/src/core/sys/freebsd/sys/mount.d +++ b/src/core/sys/freebsd/sys/mount.d @@ -11,6 +11,7 @@ module core.sys.freebsd.sys.mount; version (FreeBSD): +import core.sys.freebsd.config; import core.stdc.config : c_long; import core.sys.posix.sys.stat : stat_t; import core.sys.posix.sys.types : uid_t; @@ -33,12 +34,12 @@ struct fid enum MFSNAMELEN = 16; -version (FreeBSD_12) +static if (__FreeBSD_version >= 1200000 && __FreeBSD_version < 1300000) { enum MNAMELEN = 1024; enum STATFS_VERSION = 0x20140518; } -else version (FreeBSD_11) +else static if (__FreeBSD_version < 1200000) { enum MNAMELEN = 88; enum STATFS_VERSION = 0x20030518; diff --git a/src/core/sys/posix/dirent.d b/src/core/sys/posix/dirent.d index a07046b9ba3..1133162e7f1 100644 --- a/src/core/sys/posix/dirent.d +++ b/src/core/sys/posix/dirent.d @@ -141,6 +141,8 @@ else version (Darwin) } else version (FreeBSD) { + import core.sys.freebsd.config; + // https://github.com/freebsd/freebsd/blob/master/sys/sys/dirent.h enum { @@ -155,7 +157,7 @@ else version (FreeBSD) DT_WHT = 14 } - version (FreeBSD_12) + static if (__FreeBSD_version >= 1200000 && __FreeBSD_version < 1300000) { struct dirent { @@ -168,7 +170,7 @@ else version (FreeBSD) char[256] d_name = 0; } } - else version (FreeBSD_11) + else static if (__FreeBSD_version < 1200000) { align(4) struct dirent diff --git a/src/core/sys/posix/sys/stat.d b/src/core/sys/posix/sys/stat.d index ddc8aefef66..31ba2ead1f2 100644 --- a/src/core/sys/posix/sys/stat.d +++ b/src/core/sys/posix/sys/stat.d @@ -1078,9 +1078,10 @@ else version (Darwin) } else version (FreeBSD) { - // https://github.com/freebsd/freebsd/blob/master/sys/sys/stat.h + import core.sys.freebsd.config; - version (FreeBSD_12) + // https://github.com/freebsd/freebsd/blob/master/sys/sys/stat.h + static if (__FreeBSD_version >= INO64_FIRST) { struct stat_t { @@ -1122,7 +1123,7 @@ else version (FreeBSD) ulong[10] st_spare; } } - else version (FreeBSD_11) + else { struct stat_t { @@ -1154,8 +1155,6 @@ else version (FreeBSD) ubyte[16 - timespec.sizeof] padding; } } - else - static assert(0, "Unsupported version of FreeBSD"); enum S_IRUSR = 0x100; // octal 0000400 enum S_IWUSR = 0x080; // octal 0000200 diff --git a/src/core/sys/posix/sys/types.d b/src/core/sys/posix/sys/types.d index 1c5054ea3c7..ce280386663 100644 --- a/src/core/sys/posix/sys/types.d +++ b/src/core/sys/posix/sys/types.d @@ -169,17 +169,19 @@ else version (Darwin) } else version (FreeBSD) { + import core.sys.freebsd.config; + // https://github.com/freebsd/freebsd/blob/master/sys/sys/_types.h alias long blkcnt_t; - version (FreeBSD_12) + static if (__FreeBSD_version >= 1200000 && __FreeBSD_version < 1300000) { alias ulong blksize_t; alias ulong dev_t; alias ulong ino_t; alias ulong nlink_t; } - else version (FreeBSD_11) + else static if (__FreeBSD_version < 1200000) { alias uint blksize_t; alias uint dev_t;