Add CWD handling to standalone WASI mode, and some related syscalls #24247
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR builds on top of #24246 and adds "proper" CWD handling in standalone WASI mode. It takes more code from PR #18285 (modified were needed).
Unlike wasi-libc, all of
chdir
,fchdir
andgetcwd
are properly supported. This is done by maintaining a global directory fd inO_SEARCH
mode and modifying the path resolution function__paths_resolve_path()
frompaths.{h,c}
accordingly.getcwd
is implemented by walking from the current CWD fd "up" until a root, i.e. a preopened fd is reached, and comparing dirent inodes along the way.To support this, the following syscalls are implemented:
F_GETFD
,F_SETFD
,F_GETFL
offcntl
fstat
chdir
fchdir
getcwd
getdents64
(note that this now accesses thetell
member of theDIR*
with someoffsetof
hackery in order to find out the current offset inside the directory)The following tests work now in standalone WASM mode:
test_readdir
: wastime and toywasm worktest_unistd_curdir
: just toywasm works -- on wasmtime,openat(AT_FDCWD, "..")
always seems to fail with a permission error, so the implementation strategy ofgetcwd
does not work right now. Wasmer can do this, but fails because of a symlink issue.test_unistd_cwd
: just toywasm worksI had do to some minor adjustments to the tests.