| author | |
| committer | |
| log | c903b760106ff9db5b3de74fa0c4034eddbd9cbf |
| tree | 17a0db9969c843926d7541bdbdfa73fd35c7f978 |
| parent | 3c7f030a60b038045334788837f40bee0226109c |
| parent | 845af5c55208753dc355fad734a8c4893338f8f6 |
| signature |
target: Implement OS version detection for OSX3 files changed, 29 insertions(+), 2 deletions(-)
lib/std/os.zig+3| ... | @@ -2764,6 +2764,7 @@ pub const SysCtlError = error{ | ... | @@ -2764,6 +2764,7 @@ pub const SysCtlError = error{ |
| 2764 | PermissionDenied, | 2764 | PermissionDenied, |
| 2765 | SystemResources, | 2765 | SystemResources, |
| 2766 | NameTooLong, | 2766 | NameTooLong, |
| 2767 | UnknownName, | ||
| 2767 | } || UnexpectedError; | 2768 | } || UnexpectedError; |
| 2768 | 2769 | ||
| 2769 | pub fn sysctl( | 2770 | pub fn sysctl( |
| ... | @@ -2779,6 +2780,7 @@ pub fn sysctl( | ... | @@ -2779,6 +2780,7 @@ pub fn sysctl( |
| 2779 | EFAULT => unreachable, | 2780 | EFAULT => unreachable, |
| 2780 | EPERM => return error.PermissionDenied, | 2781 | EPERM => return error.PermissionDenied, |
| 2781 | ENOMEM => return error.SystemResources, | 2782 | ENOMEM => return error.SystemResources, |
| 2783 | ENOENT => return error.UnknownName, | ||
| 2782 | else => |err| return unexpectedErrno(err), | 2784 | else => |err| return unexpectedErrno(err), |
| 2783 | } | 2785 | } |
| 2784 | } | 2786 | } |
| ... | @@ -2795,6 +2797,7 @@ pub fn sysctlbynameC( | ... | @@ -2795,6 +2797,7 @@ pub fn sysctlbynameC( |
| 2795 | EFAULT => unreachable, | 2797 | EFAULT => unreachable, |
| 2796 | EPERM => return error.PermissionDenied, | 2798 | EPERM => return error.PermissionDenied, |
| 2797 | ENOMEM => return error.SystemResources, | 2799 | ENOMEM => return error.SystemResources, |
| 2800 | ENOENT => return error.UnknownName, | ||
| 2798 | else => |err| return unexpectedErrno(err), | 2801 | else => |err| return unexpectedErrno(err), |
| 2799 | } | 2802 | } |
| 2800 | } | 2803 | } |
lib/std/thread.zig+1-1| ... | @@ -382,7 +382,7 @@ pub const Thread = struct { | ... | @@ -382,7 +382,7 @@ pub const Thread = struct { |
| 382 | var count_len: usize = @sizeOf(c_int); | 382 | var count_len: usize = @sizeOf(c_int); |
| 383 | const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu"; | 383 | const name = if (comptime std.Target.current.isDarwin()) "hw.logicalcpu" else "hw.ncpu"; |
| 384 | os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) { | 384 | os.sysctlbynameC(name, &count, &count_len, null, 0) catch |err| switch (err) { |
| 385 | error.NameTooLong => unreachable, | 385 | error.NameTooLong, error.UnknownName => unreachable, |
| 386 | else => |e| return e, | 386 | else => |e| return e, |
| 387 | }; | 387 | }; |
| 388 | return @intCast(usize, count); | 388 | return @intCast(usize, count); |
lib/std/zig/system.zig+25-1| ... | @@ -224,7 +224,31 @@ pub const NativeTargetInfo = struct { | ... | @@ -224,7 +224,31 @@ pub const NativeTargetInfo = struct { |
| 224 | // TODO Detect native operating system version. | 224 | // TODO Detect native operating system version. |
| 225 | }, | 225 | }, |
| 226 | .macosx => { | 226 | .macosx => { |
| 227 | // TODO Detect native operating system version. | 227 | var product_version: [32]u8 = undefined; |
| 228 | var size: usize = product_version.len; | ||
| 229 | |||
| 230 | // The osproductversion sysctl was introduced first with | ||
| 231 | // High Sierra, thankfully that's also the baseline that Zig | ||
| 232 | // supports | ||
| 233 | std.os.sysctlbynameC( | ||
| 234 | "kern.osproductversion", | ||
| 235 | &product_version[0], | ||
| 236 | &size, | ||
| 237 | null, | ||
| 238 | 0, | ||
| 239 | ) catch |err| switch (err) { | ||
| 240 | error.UnknownName => unreachable, | ||
| 241 | else => unreachable, | ||
| 242 | }; | ||
| 243 | |||
| 244 | if (std.builtin.Version.parse(product_version[0..size])) |ver| { | ||
| 245 | os.version_range.semver.min = ver; | ||
| 246 | os.version_range.semver.max = ver; | ||
| 247 | } else |err| switch (err) { | ||
| 248 | error.Overflow => {}, | ||
| 249 | error.InvalidCharacter => {}, | ||
| 250 | error.InvalidVersion => {}, | ||
| 251 | } | ||
| 228 | }, | 252 | }, |
| 229 | .freebsd => { | 253 | .freebsd => { |
| 230 | // TODO Detect native operating system version. | 254 | // TODO Detect native operating system version. |