| // Copyright 2023 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 contains implementations of emscripten APIs that are compatible | |
| // with WasmFS. These replace APIs in src/library*js, and basically do things | |
| // in a simpler manner for the situation where the FS is in wasm and not JS | |
| // (in particular, these implementations avoid calling from JS to wasm, and | |
| // dependency issues that arise from that). | |
| // | |
| namespace wasmfs { | |
| // Given an fd, returns the string path that the fd refers to. | |
| // TODO: full error handling | |
| // TODO: maybe make this a public API, as it is useful for debugging | |
| std::string getPath(int fd) { | |
| auto fileTable = wasmfs::wasmFS.getFileTable().locked(); | |
| auto openFile = fileTable.getEntry(fd); | |
| if (!openFile) { | |
| return "!"; | |
| } | |
| auto curr = openFile->locked().getFile(); | |
| std::string result = ""; | |
| while (curr != wasmfs::wasmFS.getRootDirectory()) { | |
| auto parent = curr->locked().getParent(); | |
| // Check if the parent exists. The parent may not exist if curr was | |
| // unlinked. | |
| if (!parent) { | |
| return "?/" + result; | |
| } | |
| auto parentDir = parent->dynCast<wasmfs::Directory>(); | |
| auto name = parentDir->locked().getName(curr); | |
| result = '/' + name + result; | |
| curr = parentDir; | |
| } | |
| return result; | |
| } | |
| } // namespace wasmfs | |
| extern "C" { | |
| char* emscripten_get_preloaded_image_data_from_FILE(FILE* file, | |
| int* w, | |
| int* h) { | |
| auto fd = fileno(file); | |
| if (fd < 0) { | |
| return 0; | |
| } | |
| auto path = wasmfs::getPath(fd); | |
| return emscripten_get_preloaded_image_data(path.c_str(), w, h); | |
| } | |
| } // extern "C" | |