Skip to content

Latest commit

 

History

History
114 lines (77 loc) · 4.38 KB

WASI-some-possible-changes.md

File metadata and controls

114 lines (77 loc) · 4.38 KB

Possible changes

The following are a list of relatively straightforward changes to WASI core that should be considered.

Split file/networking/random/clock from args/environ/exit.

Currently everything is mixed together in one big "core" module. But we can split them out to allow minimal configurations that don't support this style of files and networking.

Move higher-level and unused errno codes out of the core API.

The core API currently defines errno codes such as EDOM which are not used for anything. POSIX requires them to be defined, however that can be done in the higher-level libraries, rather than in the WASI core API itself.

Detecting EOF from read/recv explicitly.

POSIX's read returns 0 if and only if it reaches the end of a file or stream.

Say you have a read buffer of 1024 bytes, and are reading a file that happens to be 7 bytes long. The first read call will return 7, but unless you happen to know how big the file is supposed to be, you can't distinguish between that being all there is, and read getting interrupted and returning less data than you requested.

Many applications today do an extra read when they encounter the end of a file, to ensure that they get a read that returns 0 bytes read, to confirm that they've reached the end of the file. If read instead had a way to indicate that it had reached the end, this extra call wouldn't be necessary.

And, read on a socket is almost equivalent to recv with no flags -- except for one surprising special case: on a datagram socket, if there's a zero-length datagram, read can't consume it, while recv can. This is because read can't indicate that it successfully read 0 bytes, because it has overloaded the meaning of 0 to indicate eof-of-file.

So, it would be tidier from multiple perspectives if read could indicate that it had reached the end of a file or stream, independently of how many bytes it has read.

Merging read and recv

These are very similar, and differ only in subtle ways. It'd make the API easier to understand if they were unified.

Trap instead of returning EFAULT

POSIX system calls return EFAULT when given invalid pointers, however from an application perspective, it'd be more natural for them to just segfault.

More detailed capability error reporting

Replace __WASI_ENOTCAPABLE with error codes that indicate which capabilities were required but not present.

Split __wasi_path_open into __wasi_path_open_file and __wasi_path_open_directory?

We could also split __WASI_RIGHT_PATH_OPEN into file vs directory, (obviating __WASI_O_DIRECTORY).

Fix the y2556 bug

In some places, timestamps are measured in nanoseconds since the UNIX epoch, so our calculations indicate a 64-bit counter will overflow on Sunday, July 21, 2554, at 11:34:33 pm UTC.

These timestamps aren't used in that many places, so it wouldn't cost that much to widen these timestamps. We can either just extend the current type to 128 bits (two i64's in wasm) or move to a timespec-like tv_sec/tv_nsec pair.

Remove fd_allocate?

Darwin doesn't implement posix_fallocate (similar to fd_allocate), despite it being in POSIX since 2001. So we don't currently know any way to implement fd_allocate on Darwin that's safe from race conditions. Should we remove it from the API?

Redesign fstflags_t

The relationship between *_SET_*TIM and *_SET_*TIM_NOW is non-obvious. We should look at this again.

readdir

Truncating entries that don't fit into a buffer may be error-prone. Should we redesign how directory reading works?

symlinks

Symlinks are fairly UNIX-specific. Should we remove __wasi_path_symlink and __wasi_path_readlink?

Also, symlink resolution doesn't benefit from libpreopen-style path translation. Should we move symlink resolution into the libpreopen layer and do it entirely in "userspace"?

Remove the path_len argument from __wasi_fd_prestat_dir_name

The buffer should be sized to the length returned from __wasi_fd_prestat_get, so it's not necessary to pass the length back into the runtime.

Add a __wasi_path_filestat_set_size function?

Along with libc/libpreopen support, this would enable implementing the POSIX truncate function.

errno values returned by path_open

We should specify the errno value returned when path_open is told to open a directory and __WASI_LOOKUP_SYMLINK_FOLLOW isn't set, and the path refers to a symbolic link.