aboutsummaryrefslogtreecommitdiff
path: root/std/os/index.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2018-11-27 21:06:35 -0500
committerAndrew Kelley <andrew@ziglang.org>2018-11-27 21:06:35 -0500
commit57f44eb2bd17fc0c4e9d09b8c8621867f784d2f0 (patch)
tree51f46cdc8f8ea0f4e642d62b3bf8fce58034362e /std/os/index.zig
parent1fb15be05f1037aad53d2db32d13123363365d10 (diff)
parentdd2450b1b21809c3fe62920498c318fbe519f579 (diff)
downloadzig-57f44eb2bd17fc0c4e9d09b8c8621867f784d2f0.tar.gz
zig-57f44eb2bd17fc0c4e9d09b8c8621867f784d2f0.zip
Merge branch 'freebsd2'
Tier 2 support for FreeBSD
Diffstat (limited to 'std/os/index.zig')
-rw-r--r--std/os/index.zig46
1 files changed, 29 insertions, 17 deletions
diff --git a/std/os/index.zig b/std/os/index.zig
index e1915a2012..15be08c689 100644
--- a/std/os/index.zig
+++ b/std/os/index.zig
@@ -3,7 +3,7 @@ const builtin = @import("builtin");
const Os = builtin.Os;
const is_windows = builtin.os == Os.windows;
const is_posix = switch (builtin.os) {
- builtin.Os.linux, builtin.Os.macosx => true,
+ builtin.Os.linux, builtin.Os.macosx, builtin.Os.freebsd => true,
else => false,
};
const os = @This();
@@ -24,10 +24,12 @@ test "std.os" {
pub const windows = @import("windows/index.zig");
pub const darwin = @import("darwin.zig");
pub const linux = @import("linux/index.zig");
+pub const freebsd = @import("freebsd/index.zig");
pub const zen = @import("zen.zig");
pub const posix = switch (builtin.os) {
Os.linux => linux,
Os.macosx, Os.ios => darwin,
+ Os.freebsd => freebsd,
Os.zen => zen,
else => @compileError("Unsupported OS"),
};
@@ -40,7 +42,7 @@ pub const time = @import("time.zig");
pub const page_size = 4 * 1024;
pub const MAX_PATH_BYTES = switch (builtin.os) {
- Os.linux, Os.macosx, Os.ios => posix.PATH_MAX,
+ Os.linux, Os.macosx, Os.ios, Os.freebsd => posix.PATH_MAX,
// Each UTF-16LE character may be expanded to 3 UTF-8 bytes.
// If it would require 4 UTF-8 bytes, then there would be a surrogate
// pair in the UTF-16LE, and we (over)account 3 bytes for it that way.
@@ -101,7 +103,7 @@ const math = std.math;
/// library implementation.
pub fn getRandomBytes(buf: []u8) !void {
switch (builtin.os) {
- Os.linux => while (true) {
+ Os.linux, Os.freebsd => while (true) {
// TODO check libc version and potentially call c.getrandom.
// See #397
const errno = posix.getErrno(posix.getrandom(buf.ptr, buf.len, 0));
@@ -174,7 +176,7 @@ pub fn abort() noreturn {
c.abort();
}
switch (builtin.os) {
- Os.linux, Os.macosx, Os.ios => {
+ Os.linux, Os.macosx, Os.ios, Os.freebsd => {
_ = posix.raise(posix.SIGABRT);
_ = posix.raise(posix.SIGKILL);
while (true) {}
@@ -196,7 +198,7 @@ pub fn exit(status: u8) noreturn {
c.exit(status);
}
switch (builtin.os) {
- Os.linux, Os.macosx, Os.ios => {
+ Os.linux, Os.macosx, Os.ios, Os.freebsd => {
posix.exit(status);
},
Os.windows => {
@@ -419,7 +421,7 @@ pub fn posix_pwritev(fd: i32, iov: [*]const posix.iovec_const, count: usize, off
}
}
},
- builtin.Os.linux => while (true) {
+ builtin.Os.linux, builtin.Os.freebsd => while (true) {
const rc = posix.pwritev(fd, iov, count, offset);
const err = posix.getErrno(rc);
switch (err) {
@@ -687,7 +689,7 @@ pub fn getBaseAddress() usize {
};
return phdr - @sizeOf(ElfHeader);
},
- builtin.Os.macosx => return @ptrToInt(&std.c._mh_execute_header),
+ builtin.Os.macosx, builtin.Os.freebsd => return @ptrToInt(&std.c._mh_execute_header),
builtin.Os.windows => return @ptrToInt(windows.GetModuleHandleW(null)),
else => @compileError("Unsupported OS"),
}
@@ -1305,7 +1307,7 @@ pub fn deleteDirC(dir_path: [*]const u8) DeleteDirError!void {
const dir_path_w = try windows_util.cStrToPrefixedFileW(dir_path);
return deleteDirW(&dir_path_w);
},
- Os.linux, Os.macosx, Os.ios => {
+ Os.linux, Os.macosx, Os.ios, Os.freebsd => {
const err = posix.getErrno(posix.rmdir(dir_path));
switch (err) {
0 => return,
@@ -1348,7 +1350,7 @@ pub fn deleteDir(dir_path: []const u8) DeleteDirError!void {
const dir_path_w = try windows_util.sliceToPrefixedFileW(dir_path);
return deleteDirW(&dir_path_w);
},
- Os.linux, Os.macosx, Os.ios => {
+ Os.linux, Os.macosx, Os.ios, Os.freebsd => {
const dir_path_c = try toPosixPath(dir_path);
return deleteDirC(&dir_path_c);
},
@@ -1465,7 +1467,7 @@ pub const Dir = struct {
allocator: *Allocator,
pub const Handle = switch (builtin.os) {
- Os.macosx, Os.ios => struct {
+ Os.macosx, Os.ios, Os.freebsd => struct {
fd: i32,
seek: i64,
buf: []u8,
@@ -1541,7 +1543,7 @@ pub const Dir = struct {
.name_data = undefined,
};
},
- Os.macosx, Os.ios => Handle{
+ Os.macosx, Os.ios, Os.freebsd => Handle{
.fd = try posixOpen(
dir_path,
posix.O_RDONLY | posix.O_NONBLOCK | posix.O_DIRECTORY | posix.O_CLOEXEC,
@@ -1572,7 +1574,7 @@ pub const Dir = struct {
Os.windows => {
_ = windows.FindClose(self.handle.handle);
},
- Os.macosx, Os.ios, Os.linux => {
+ Os.macosx, Os.ios, Os.linux, Os.freebsd => {
self.allocator.free(self.handle.buf);
os.close(self.handle.fd);
},
@@ -1587,6 +1589,7 @@ pub const Dir = struct {
Os.linux => return self.nextLinux(),
Os.macosx, Os.ios => return self.nextDarwin(),
Os.windows => return self.nextWindows(),
+ Os.freebsd => return self.nextFreebsd(),
else => @compileError("unimplemented"),
}
}
@@ -1726,6 +1729,11 @@ pub const Dir = struct {
};
}
}
+
+ fn nextFreebsd(self: *Dir) !?Entry {
+ //self.handle.buf = try self.allocator.alloc(u8, page_size);
+ @compileError("TODO implement dirs for FreeBSD");
+ }
};
pub fn changeCurDir(allocator: *Allocator, dir_path: []const u8) !void {
@@ -2164,7 +2172,7 @@ pub fn unexpectedErrorWindows(err: windows.DWORD) UnexpectedError {
pub fn openSelfExe() !os.File {
switch (builtin.os) {
Os.linux => return os.File.openReadC(c"/proc/self/exe"),
- Os.macosx, Os.ios => {
+ Os.macosx, Os.ios, Os.freebsd => {
var buf: [MAX_PATH_BYTES]u8 = undefined;
const self_exe_path = try selfExePath(&buf);
buf[self_exe_path.len] = 0;
@@ -2181,7 +2189,7 @@ pub fn openSelfExe() !os.File {
test "openSelfExe" {
switch (builtin.os) {
- Os.linux, Os.macosx, Os.ios, Os.windows => (try openSelfExe()).close(),
+ Os.linux, Os.macosx, Os.ios, Os.windows, Os.freebsd => (try openSelfExe()).close(),
else => return error.SkipZigTest, // Unsupported OS.
}
}
@@ -2212,6 +2220,7 @@ pub fn selfExePathW(out_buffer: *[windows_util.PATH_MAX_WIDE]u16) ![]u16 {
pub fn selfExePath(out_buffer: *[MAX_PATH_BYTES]u8) ![]u8 {
switch (builtin.os) {
Os.linux => return readLink(out_buffer, "/proc/self/exe"),
+ Os.freebsd => return readLink(out_buffer, "/proc/curproc/file"),
Os.windows => {
var utf16le_buf: [windows_util.PATH_MAX_WIDE]u16 = undefined;
const utf16le_slice = try selfExePathW(&utf16le_buf);
@@ -2250,7 +2259,7 @@ pub fn selfExeDirPath(out_buffer: *[MAX_PATH_BYTES]u8) ![]const u8 {
// will not return null.
return path.dirname(full_exe_path).?;
},
- Os.windows, Os.macosx, Os.ios => {
+ Os.windows, Os.macosx, Os.ios, Os.freebsd => {
const self_exe_path = try selfExePath(out_buffer);
// Assume that the OS APIs return absolute paths, and therefore dirname
// will not return null.
@@ -3095,10 +3104,13 @@ pub const CpuCountError = error{
pub fn cpuCount(fallback_allocator: *mem.Allocator) CpuCountError!usize {
switch (builtin.os) {
- builtin.Os.macosx => {
+ builtin.Os.macosx, builtin.Os.freebsd => {
var count: c_int = undefined;
var count_len: usize = @sizeOf(c_int);
- const rc = posix.sysctlbyname(c"hw.logicalcpu", @ptrCast(*c_void, &count), &count_len, null, 0);
+ const rc = posix.sysctlbyname(switch (builtin.os) {
+ builtin.Os.macosx => c"hw.logicalcpu",
+ else => c"hw.ncpu",
+ }, @ptrCast(*c_void, &count), &count_len, null, 0);
const err = posix.getErrno(rc);
switch (err) {
0 => return @intCast(usize, count),