| ... | ... | @@ -193,7 +193,11 @@ pub fn io(t: *Threaded) Io { |
| 193 | 193 | .wasi => dirCreateFileWasi, |
| 194 | 194 | else => dirCreateFilePosix, |
| 195 | 195 | }, |
| 196 | | .dirOpenFile = dirOpenFile, |
| 196 | .dirOpenFile = switch (builtin.os.tag) { |
| 197 | .windows => @panic("TODO"), |
| 198 | .wasi => dirOpenFileWasi, |
| 199 | else => dirOpenFilePosix, |
| 200 | }, |
| 197 | 201 | .fileClose = fileClose, |
| 198 | 202 | .fileWriteStreaming = fileWriteStreaming, |
| 199 | 203 | .fileWritePositional = fileWritePositional, |
| ... | ... | @@ -1451,7 +1455,7 @@ fn dirCreateFileWasi( |
| 1451 | 1455 | } |
| 1452 | 1456 | } |
| 1453 | 1457 | |
| 1454 | | fn dirOpenFile( |
| 1458 | fn dirOpenFilePosix( |
| 1455 | 1459 | userdata: ?*anyopaque, |
| 1456 | 1460 | dir: Io.Dir, |
| 1457 | 1461 | sub_path: []const u8, |
| ... | ... | @@ -1584,6 +1588,74 @@ fn dirOpenFile( |
| 1584 | 1588 | return .{ .handle = fd }; |
| 1585 | 1589 | } |
| 1586 | 1590 | |
| 1591 | fn dirOpenFileWasi( |
| 1592 | userdata: ?*anyopaque, |
| 1593 | dir: Io.Dir, |
| 1594 | sub_path: []const u8, |
| 1595 | flags: Io.File.OpenFlags, |
| 1596 | ) Io.File.OpenError!Io.File { |
| 1597 | if (builtin.link_libc) return dirOpenFilePosix(userdata, dir, sub_path, flags); |
| 1598 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 1599 | const wasi = std.os.wasi; |
| 1600 | var base: std.os.wasi.rights_t = .{}; |
| 1601 | // POLL_FD_READWRITE only grants extra rights if the corresponding FD_READ and/or FD_WRITE |
| 1602 | // is also set. |
| 1603 | if (flags.isRead()) { |
| 1604 | base.FD_READ = true; |
| 1605 | base.FD_TELL = true; |
| 1606 | base.FD_SEEK = true; |
| 1607 | base.FD_FILESTAT_GET = true; |
| 1608 | base.POLL_FD_READWRITE = true; |
| 1609 | } |
| 1610 | if (flags.isWrite()) { |
| 1611 | base.FD_WRITE = true; |
| 1612 | base.FD_TELL = true; |
| 1613 | base.FD_SEEK = true; |
| 1614 | base.FD_DATASYNC = true; |
| 1615 | base.FD_FDSTAT_SET_FLAGS = true; |
| 1616 | base.FD_SYNC = true; |
| 1617 | base.FD_ALLOCATE = true; |
| 1618 | base.FD_ADVISE = true; |
| 1619 | base.FD_FILESTAT_SET_TIMES = true; |
| 1620 | base.FD_FILESTAT_SET_SIZE = true; |
| 1621 | base.POLL_FD_READWRITE = true; |
| 1622 | } |
| 1623 | const lookup_flags: wasi.lookupflags_t = .{}; |
| 1624 | const oflags: wasi.oflags_t = .{}; |
| 1625 | const inheriting: wasi.rights_t = .{}; |
| 1626 | const fdflags: wasi.fdflags_t = .{}; |
| 1627 | var fd: posix.fd_t = undefined; |
| 1628 | while (true) { |
| 1629 | try t.checkCancel(); |
| 1630 | switch (wasi.path_open(dir.handle, lookup_flags, sub_path.ptr, sub_path.len, oflags, base, inheriting, fdflags, &fd)) { |
| 1631 | .SUCCESS => return .{ .handle = fd }, |
| 1632 | .INTR => continue, |
| 1633 | .CANCELED => return error.Canceled, |
| 1634 | |
| 1635 | .FAULT => |err| return errnoBug(err), |
| 1636 | .BADF => |err| return errnoBug(err), // File descriptor used after closed. |
| 1637 | .ACCES => return error.AccessDenied, |
| 1638 | .FBIG => return error.FileTooBig, |
| 1639 | .OVERFLOW => return error.FileTooBig, |
| 1640 | .ISDIR => return error.IsDir, |
| 1641 | .LOOP => return error.SymLinkLoop, |
| 1642 | .MFILE => return error.ProcessFdQuotaExceeded, |
| 1643 | .NFILE => return error.SystemFdQuotaExceeded, |
| 1644 | .NODEV => return error.NoDevice, |
| 1645 | .NOENT => return error.FileNotFound, |
| 1646 | .NOMEM => return error.SystemResources, |
| 1647 | .NOTDIR => return error.NotDir, |
| 1648 | .PERM => return error.PermissionDenied, |
| 1649 | .BUSY => return error.DeviceBusy, |
| 1650 | .NOTCAPABLE => return error.AccessDenied, |
| 1651 | .NAMETOOLONG => return error.NameTooLong, |
| 1652 | .INVAL => return error.BadPathName, |
| 1653 | .ILSEQ => return error.BadPathName, |
| 1654 | else => |err| return posix.unexpectedErrno(err), |
| 1655 | } |
| 1656 | } |
| 1657 | } |
| 1658 | |
| 1587 | 1659 | fn fileClose(userdata: ?*anyopaque, file: Io.File) void { |
| 1588 | 1660 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 1589 | 1661 | _ = t; |
| ... | ... | @@ -3319,7 +3391,7 @@ fn clockToPosix(clock: Io.Clock) posix.clockid_t { |
| 3319 | 3391 | |
| 3320 | 3392 | fn clockToWasi(clock: Io.Clock) std.os.wasi.clockid_t { |
| 3321 | 3393 | return switch (clock) { |
| 3322 | | .realtime => .REALTIME, |
| 3394 | .real => .REALTIME, |
| 3323 | 3395 | .awake => .MONOTONIC, |
| 3324 | 3396 | .boot => .MONOTONIC, |
| 3325 | 3397 | .cpu_process => .PROCESS_CPUTIME_ID, |