| ... | @@ -591,7 +591,7 @@ pub const Dir = struct { | ... | @@ -591,7 +591,7 @@ pub const Dir = struct { |
| 591 | return self.openFileZ(&path_c, flags); | 591 | return self.openFileZ(&path_c, flags); |
| 592 | } | 592 | } |
| 593 | | 593 | |
| 594 | pub fn openFileWasi(self: Dir, sub_path: []const u8, flags: File.OpenFlags) File.OpenError!File { | 594 | fn openFileWasi(self: Dir, sub_path: []const u8, flags: File.OpenFlags) File.OpenError!File { |
| 595 | var fdflags: wasi.fdflag_t = 0x0; | 595 | var fdflags: wasi.fdflag_t = 0x0; |
| 596 | var rights: wasi.rights_t = 0x0; | 596 | var rights: wasi.rights_t = 0x0; |
| 597 | if (flags.read) { | 597 | if (flags.read) { |
| ... | @@ -703,11 +703,12 @@ pub const Dir = struct { | ... | @@ -703,11 +703,12 @@ pub const Dir = struct { |
| 703 | | 703 | |
| 704 | pub const createFileC = @compileError("deprecated: renamed to createFileZ"); | 704 | pub const createFileC = @compileError("deprecated: renamed to createFileZ"); |
| 705 | | 705 | |
| 706 | pub fn createFileWasi(self: Dir, sub_path: []const u8, flags: File.CreateFlags) File.OpenError!File { | 706 | fn createFileWasi(self: Dir, sub_path: []const u8, flags: File.CreateFlags) File.OpenError!File { |
| 707 | var oflags: wasi.oflags_t = 0x0; | 707 | const wasi = os.wasi; |
| 708 | var rights: wasi.rights_t = wasi.FD_WRITE | wasi.FD_DATASYNC | wasi.FD_SEEK | wasi.FD_FDSTAT_SET_FLAGS | wasi.FD_SYNC | wasi.FD_ALLOCATE | wasi.FD_ADVISE | wasi.FD_FILESTAT_SET_TIMES | wasi.FD_FILESTAT_SET_SIZE; | 708 | var oflags: wasi.oflags_t = wasi.O_CREAT; |
| | 709 | var rights: wasi.rights_t = wasi.RIGHT_FD_WRITE | wasi.RIGHT_FD_DATASYNC | wasi.RIGHT_FD_SEEK | wasi.RIGHT_FD_FDSTAT_SET_FLAGS | wasi.RIGHT_FD_SYNC | wasi.RIGHT_FD_ALLOCATE | wasi.RIGHT_FD_ADVISE | wasi.RIGHT_FD_FILESTAT_SET_TIMES | wasi.RIGHT_FD_FILESTAT_SET_SIZE; |
| 709 | if (flags.read) { | 710 | if (flags.read) { |
| 710 | rights |= wasi.FD_READ | wasi.FD_TELL | wasi.FD_FILESTAT_GET; | 711 | rights |= wasi.RIGHT_FD_READ | wasi.RIGHT_FD_TELL | wasi.RIGHT_FD_FILESTAT_GET; |
| 711 | } | 712 | } |
| 712 | if (flags.truncate) { | 713 | if (flags.truncate) { |
| 713 | oflags |= wasi.O_TRUNC; | 714 | oflags |= wasi.O_TRUNC; |
| ... | @@ -1438,6 +1439,18 @@ pub const Dir = struct { | ... | @@ -1438,6 +1439,18 @@ pub const Dir = struct { |
| 1438 | pub fn cwd() Dir { | 1439 | pub fn cwd() Dir { |
| 1439 | if (builtin.os.tag == .windows) { | 1440 | if (builtin.os.tag == .windows) { |
| 1440 | return Dir{ .fd = os.windows.peb().ProcessParameters.CurrentDirectory.Handle }; | 1441 | return Dir{ .fd = os.windows.peb().ProcessParameters.CurrentDirectory.Handle }; |
| | 1442 | } else if (builtin.os.tag == .wasi) { |
| | 1443 | const wasi = os.wasi; |
| | 1444 | // On WASI we indeed don't have a concept of cwd; however, we can approximate it with |
| | 1445 | // trying to obtain a preopen for ".". |
| | 1446 | // TODO `cwd()` should be a fallible operation if we're going to support WASI this way. |
| | 1447 | var fd: wasi.fd_t = undefined; |
| | 1448 | var prefix: usize = undefined; |
| | 1449 | switch (wasi.resolve_preopen(".", &fd, &prefix)) { |
| | 1450 | 0 => {}, |
| | 1451 | else => {}, |
| | 1452 | } |
| | 1453 | return Dir{ .fd = fd }; |
| 1441 | } else { | 1454 | } else { |
| 1442 | return Dir{ .fd = os.AT_FDCWD }; | 1455 | return Dir{ .fd = os.AT_FDCWD }; |
| 1443 | } | 1456 | } |