| ... | ... | @@ -591,7 +591,7 @@ pub const Dir = struct { |
| 591 | 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 | 595 | var fdflags: wasi.fdflag_t = 0x0; |
| 596 | 596 | var rights: wasi.rights_t = 0x0; |
| 597 | 597 | if (flags.read) { |
| ... | ... | @@ -703,11 +703,12 @@ pub const Dir = struct { |
| 703 | 703 | |
| 704 | 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 { |
| 707 | | var oflags: wasi.oflags_t = 0x0; |
| 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; |
| 706 | fn createFileWasi(self: Dir, sub_path: []const u8, flags: File.CreateFlags) File.OpenError!File { |
| 707 | const wasi = os.wasi; |
| 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 | 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 | 713 | if (flags.truncate) { |
| 713 | 714 | oflags |= wasi.O_TRUNC; |
| ... | ... | @@ -1438,6 +1439,18 @@ pub const Dir = struct { |
| 1438 | 1439 | pub fn cwd() Dir { |
| 1439 | 1440 | if (builtin.os.tag == .windows) { |
| 1440 | 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 | 1454 | } else { |
| 1442 | 1455 | return Dir{ .fd = os.AT_FDCWD }; |
| 1443 | 1456 | } |