diff options
| author | Žiga Željko <ziga.zeljko@gmail.com> | 2022-01-31 16:12:50 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-01-31 22:54:30 +0100 |
| commit | 5210b9074ca68c23da474b0afcaa4ce11f7cc57c (patch) | |
| tree | ade7a233e0e07c129901ae00115a632c1c2c4296 /lib | |
| parent | 66cf011aa91a66fd8b1489d186152522ccd27550 (diff) | |
| download | zig-5210b9074ca68c23da474b0afcaa4ce11f7cc57c.tar.gz zig-5210b9074ca68c23da474b0afcaa4ce11f7cc57c.zip | |
os,wasi: use wasi-libc if available
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/c/wasi.zig | 49 | ||||
| -rw-r--r-- | lib/std/os.zig | 22 |
2 files changed, 52 insertions, 19 deletions
diff --git a/lib/std/c/wasi.zig b/lib/std/c/wasi.zig index d9fbed8e6d..9c9148a783 100644 --- a/lib/std/c/wasi.zig +++ b/lib/std/c/wasi.zig @@ -8,6 +8,15 @@ pub fn _errno() *c_int { return &errno; } +pub const AT = wasi.AT; +pub const CLOCK = wasi.CLOCK; +pub const E = wasi.E; +pub const IOV_MAX = wasi.IOV_MAX; +pub const LOCK = wasi.LOCK; +pub const S = wasi.S; +pub const STDERR_FILENO = wasi.STDERR_FILENO; +pub const STDIN_FILENO = wasi.STDIN_FILENO; +pub const STDOUT_FILENO = wasi.STDOUT_FILENO; pub const fd_t = wasi.fd_t; pub const pid_t = c_int; pub const uid_t = u32; @@ -17,14 +26,6 @@ pub const ino_t = wasi.ino_t; pub const mode_t = wasi.mode_t; pub const time_t = wasi.time_t; pub const timespec = wasi.timespec; -pub const STDERR_FILENO = wasi.STDERR_FILENO; -pub const STDIN_FILENO = wasi.STDIN_FILENO; -pub const STDOUT_FILENO = wasi.STDOUT_FILENO; -pub const E = wasi.E; -pub const CLOCK = wasi.CLOCK; -pub const S = wasi.S; -pub const IOV_MAX = wasi.IOV_MAX; -pub const AT = wasi.AT; pub const Stat = extern struct { dev: i32, @@ -93,8 +94,40 @@ pub const O = struct { pub const WRONLY = (0x10000000); }; +pub const F = struct { + pub const GETFD = 1; + pub const SETFD = 2; + pub const GETFL = 3; + pub const SETFL = 4; +}; + +pub const FD_CLOEXEC = 1; + +pub const F_OK = 0; +pub const X_OK = 1; +pub const W_OK = 2; +pub const R_OK = 4; + pub const SEEK = struct { pub const SET: wasi.whence_t = .SET; pub const CUR: wasi.whence_t = .CUR; pub const END: wasi.whence_t = .END; }; + +pub const nfds_t = usize; + +pub const pollfd = extern struct { + fd: fd_t, + events: i16, + revents: i16, +}; + +pub const POLL = struct { + pub const RDNORM = 0x1; + pub const WRNORM = 0x2; + pub const IN = RDNORM; + pub const OUT = WRNORM; + pub const ERR = 0x1000; + pub const HUP = 0x2000; + pub const NVAL = 0x4000; +}; diff --git a/lib/std/os.zig b/lib/std/os.zig index 69883a1395..6d59080820 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -238,7 +238,7 @@ pub fn close(fd: fd_t) void { if (builtin.os.tag == .windows) { return windows.CloseHandle(fd); } - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { _ = wasi.fd_close(fd); return; } @@ -1395,7 +1395,7 @@ pub fn openW(file_path_w: []const u16, flags: u32, perm: mode_t) OpenError!fd_t /// `file_path` is relative to the open directory handle `dir_fd`. /// See also `openatZ`. pub fn openat(dir_fd: fd_t, file_path: []const u8, flags: u32, mode: mode_t) OpenError!fd_t { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("use openatWasi instead"); } if (builtin.os.tag == .windows) { @@ -1760,7 +1760,7 @@ pub fn getcwd(out_buffer: []u8) GetCwdError![]u8 { if (builtin.os.tag == .windows) { return windows.GetCurrentDirectory(out_buffer); } - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("WASI doesn't have a concept of cwd(); use std.fs.wasi.PreopenList to get available Dir handles instead"); } @@ -1804,7 +1804,7 @@ pub const SymLinkError = error{ /// If `sym_link_path` exists, it will not be overwritten. /// See also `symlinkZ. pub fn symlink(target_path: []const u8, sym_link_path: []const u8) SymLinkError!void { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("symlink is not supported in WASI; use symlinkat instead"); } if (builtin.os.tag == .windows) { @@ -2021,7 +2021,7 @@ pub const UnlinkError = error{ /// Delete a name and possibly the file it refers to. /// See also `unlinkZ`. pub fn unlink(file_path: []const u8) UnlinkError!void { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("unlink is not supported in WASI; use unlinkat instead"); } else if (builtin.os.tag == .windows) { const file_path_w = try windows.sliceToPrefixedFileW(file_path); @@ -2175,7 +2175,7 @@ pub const RenameError = error{ /// Change the name or location of a file. pub fn rename(old_path: []const u8, new_path: []const u8) RenameError!void { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("rename is not supported in WASI; use renameat instead"); } else if (builtin.os.tag == .windows) { const old_path_w = try windows.sliceToPrefixedFileW(old_path); @@ -2469,7 +2469,7 @@ pub const MakeDirError = error{ /// Create a directory. /// `mode` is ignored on Windows. pub fn mkdir(dir_path: []const u8, mode: u32) MakeDirError!void { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("mkdir is not supported in WASI; use mkdirat instead"); } else if (builtin.os.tag == .windows) { const dir_path_w = try windows.sliceToPrefixedFileW(dir_path); @@ -2539,7 +2539,7 @@ pub const DeleteDirError = error{ /// Deletes an empty directory. pub fn rmdir(dir_path: []const u8) DeleteDirError!void { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("rmdir is not supported in WASI; use unlinkat instead"); } else if (builtin.os.tag == .windows) { const dir_path_w = try windows.sliceToPrefixedFileW(dir_path); @@ -2600,7 +2600,7 @@ pub const ChangeCurDirError = error{ /// Changes the current working directory of the calling process. /// `dir_path` is recommended to be a UTF-8 encoded string. pub fn chdir(dir_path: []const u8) ChangeCurDirError!void { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("chdir is not supported in WASI"); } else if (builtin.os.tag == .windows) { var utf16_dir_path: [windows.PATH_MAX_WIDE]u16 = undefined; @@ -2684,7 +2684,7 @@ pub const ReadLinkError = error{ /// Read value of a symbolic link. /// The return value is a slice of `out_buffer` from index 0. pub fn readlink(file_path: []const u8, out_buffer: []u8) ReadLinkError![]u8 { - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("readlink is not supported in WASI; use readlinkat instead"); } else if (builtin.os.tag == .windows) { const file_path_w = try windows.sliceToPrefixedFileW(file_path); @@ -4631,7 +4631,7 @@ pub fn realpath(pathname: []const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealPathE const pathname_w = try windows.sliceToPrefixedFileW(pathname); return realpathW(pathname_w.span(), out_buffer); } - if (builtin.os.tag == .wasi) { + if (builtin.os.tag == .wasi and !builtin.link_libc) { @compileError("Use std.fs.wasi.PreopenList to obtain valid Dir handles instead of using absolute paths"); } const pathname_c = try toPosixPath(pathname); |
