// Copyright 2021 The Emscripten Authors. All rights reserved. // Emscripten is available under two separate licenses, the MIT license and the // University of Illinois/NCSA Open Source License. Both these licenses can be // found in the LICENSE file. // This file defines the open file table of the new file system. // Current Status: Work in Progress. // See https://github.com/emscripten-core/emscripten/issues/15041. #include "file_table.h" #include "special_files.h" namespace wasmfs { FileTable::FileTable() { entries.push_back( std::make_shared(0, O_RDONLY, SpecialFiles::getStdin())); entries.push_back( std::make_shared(0, O_WRONLY, SpecialFiles::getStdout())); entries.push_back( std::make_shared(0, O_WRONLY, SpecialFiles::getStderr())); } std::shared_ptr FileTable::Handle::getEntry(__wasi_fd_t fd) { if (fd >= fileTable.entries.size() || fd < 0) { return nullptr; } return fileTable.entries[fd]; } void FileTable::Handle::setEntry(__wasi_fd_t fd, std::shared_ptr openFile) { assert(fd >= 0); if (fd >= fileTable.entries.size()) { fileTable.entries.resize(fd + 1); } fileTable.entries[fd] = openFile; } __wasi_fd_t FileTable::Handle::addEntry(std::shared_ptr openFileState) { // TODO: add freelist to avoid linear lookup time. for (__wasi_fd_t i = 0;; i++) { if (!getEntry(i)) { setEntry(i, openFileState); return i; } } return -EBADF; } } // namespace wasmfs