authorgravatar for jethro@jethron.id.auJethro Nederhof <jethro@jethron.id.au> 2020-05-25 10:52:13+10:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-05-24 20:52:13-04:00
log4b1a8464715a9b2af1d9024694282883f3346482
treeae6b14bd8e3f386b2905c8c3f2c52632558c0504
parent07472fb453ced756d248fc03493b83a2221ea1a3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

target: Implement running OS version detection for FreeBSD (#5416)

* target: Implement OS version detection for FreeBSD Fixes #4582 * freebsd version: handle errors explicitly

1 files changed, 21 insertions(+), 2 deletions(-)

lib/std/zig/system.zig+21-2
......@@ -292,8 +292,27 @@ pub const NativeTargetInfo = struct {
292292 }
293293 },
294294 .freebsd => {
295 // Unimplemented, fall back to default.
296 // https://github.com/ziglang/zig/issues/4582
295 var osreldate: u32 = undefined;
296 var len: usize = undefined;
297
298 std.os.sysctlbynameZ("kern.osreldate", &osreldate, &len, null, 0) catch |err| switch (err) {
299 error.NameTooLong => unreachable, // constant, known good value
300 error.PermissionDenied => unreachable, // only when setting values,
301 error.SystemResources => unreachable, // memory already on the stack
302 error.UnknownName => unreachable, // constant, known good value
303 error.Unexpected => unreachable, // EFAULT: stack should be safe, EISDIR/ENOTDIR: constant, known good value
304 };
305
306 // https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html
307 // Major * 100,000 has been convention since FreeBSD 2.2 (1997)
308 // Minor * 1(0),000 summed has been convention since FreeBSD 2.2 (1997)
309 // e.g. 492101 = 4.11-STABLE = 4.(9+2)
310 const major = osreldate / 100_000;
311 const minor1 = osreldate % 100_000 / 10_000; // usually 0 since 5.1
312 const minor2 = osreldate % 10_000 / 1_000; // 0 before 5.1, minor version since
313 const patch = osreldate % 1_000;
314 os.version_range.semver.min = .{ .major = major, .minor = minor1 + minor2, .patch = patch };
315 os.version_range.semver.max = .{ .major = major, .minor = minor1 + minor2, .patch = patch };
297316 },
298317 else => {
299318 // Unimplemented, fall back to default version range.