From f62187ed5d303633b9155dc880cc51828a569dec Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Thu, 4 May 2023 01:30:52 +0330 Subject: [PATCH] LibWasm: Accept newly-created wasi file descriptors as well --- Userland/Libraries/LibWasm/WASI/Wasi.cpp | 63 +++++++++++++++--------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/Userland/Libraries/LibWasm/WASI/Wasi.cpp b/Userland/Libraries/LibWasm/WASI/Wasi.cpp index d01708b017..8db3251418 100644 --- a/Userland/Libraries/LibWasm/WASI/Wasi.cpp +++ b/Userland/Libraries/LibWasm/WASI/Wasi.cpp @@ -515,14 +515,19 @@ ErrorOr> Implementation::impl$path_filestat_get(Configuration& auto dir_fd = AT_FDCWD; auto mapped_fd = map_fd(fd); - if (mapped_fd.has()) { - auto& entry = preopened_directories()[mapped_fd.get().value()]; - dir_fd = entry.opened_fd.value_or_lazy_evaluated([&] { - DeprecatedString path = entry.host_path.string(); - return open(path.characters(), O_DIRECTORY, 0755); - }); - entry.opened_fd = dir_fd; - } + mapped_fd.visit( + [&](PreopenedDirectoryDescriptor descriptor) { + auto& entry = preopened_directories()[descriptor.value()]; + dir_fd = entry.opened_fd.value_or_lazy_evaluated([&] { + DeprecatedString path = entry.host_path.string(); + return open(path.characters(), O_DIRECTORY, 0755); + }); + entry.opened_fd = dir_fd; + }, + [&](u32 fd) { + dir_fd = fd; + }, + [](UnmappedDescriptor) {}); if (dir_fd < 0 && dir_fd != AT_FDCWD) return errno_value_from_errno(errno); @@ -573,14 +578,19 @@ ErrorOr> Implementation::impl$path_create_directory(Configuration& auto dir_fd = AT_FDCWD; auto mapped_fd = map_fd(fd); - if (mapped_fd.has()) { - auto& entry = preopened_directories()[mapped_fd.get().value()]; - dir_fd = entry.opened_fd.value_or_lazy_evaluated([&] { - DeprecatedString path = entry.host_path.string(); - return open(path.characters(), O_DIRECTORY, 0755); - }); - entry.opened_fd = dir_fd; - } + mapped_fd.visit( + [&](PreopenedDirectoryDescriptor descriptor) { + auto& entry = preopened_directories()[descriptor.value()]; + dir_fd = entry.opened_fd.value_or_lazy_evaluated([&] { + DeprecatedString path = entry.host_path.string(); + return open(path.characters(), O_DIRECTORY, 0755); + }); + entry.opened_fd = dir_fd; + }, + [&](u32 fd) { + dir_fd = fd; + }, + [](UnmappedDescriptor) {}); if (dir_fd < 0 && dir_fd != AT_FDCWD) return errno_value_from_errno(errno); @@ -599,14 +609,19 @@ ErrorOr> Implementation::impl$path_open(Configuration& configuration, auto dir_fd = AT_FDCWD; auto mapped_fd = map_fd(fd); - if (mapped_fd.has()) { - auto& entry = preopened_directories()[mapped_fd.get().value()]; - dir_fd = entry.opened_fd.value_or_lazy_evaluated([&] { - DeprecatedString path = entry.host_path.string(); - return open(path.characters(), O_DIRECTORY, 0755); - }); - entry.opened_fd = dir_fd; - } + mapped_fd.visit( + [&](PreopenedDirectoryDescriptor descriptor) { + auto& entry = preopened_directories()[descriptor.value()]; + dir_fd = entry.opened_fd.value_or_lazy_evaluated([&] { + DeprecatedString path = entry.host_path.string(); + return open(path.characters(), O_DIRECTORY, 0755); + }); + entry.opened_fd = dir_fd; + }, + [&](u32 fd) { + dir_fd = fd; + }, + [](UnmappedDescriptor) {}); if (dir_fd < 0 && dir_fd != AT_FDCWD) return errno_value_from_errno(errno);