Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion wasm-wasi-core/src/common/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ export abstract class WasiProcess {

this.environmentService = EnvironmentWasiService.create(
this.fileDescriptors, this.programName,
this.preOpenDirectories.entries(), options
Array.from(this.preOpenDirectories.entries()), options
);
this.processService = {
proc_exit: async (_memory, exitCode: exitcode) => {
Expand Down
25 changes: 15 additions & 10 deletions wasm-wasi-core/src/common/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,11 +191,13 @@ export interface EnvironmentOptions extends Omit<ProcessOptions, 'args' | 'trace
}

export namespace EnvironmentWasiService {
export function create(fileDescriptors: FileDescriptors, programName: string, preStats: IterableIterator<[string, DeviceDriver]>, options: EnvironmentOptions): EnvironmentWasiService {
export function create(fileDescriptors: FileDescriptors, programName: string, preStats: [string, DeviceDriver][], options: EnvironmentOptions): EnvironmentWasiService {

const $encoder: RAL.TextEncoder = RAL().TextEncoder.create(options?.encoding);
const $preStatDirnames: Map<fd, string> = new Map();

fileDescriptors.switchToRunning(3 + preStats.length);

const result: EnvironmentWasiService = {
args_sizes_get: (memory: ArrayBuffer, argvCount_ptr: ptr<u32>, argvBufSize_ptr: ptr<u32>): Promise<errno> => {
let count = 0;
Expand Down Expand Up @@ -262,16 +264,19 @@ export namespace EnvironmentWasiService {
},
fd_prestat_get: async (memory: ArrayBuffer, fd: fd, bufPtr: ptr<prestat>): Promise<errno> => {
try {
const next = preStats.next();
if (next.done === true) {
fileDescriptors.switchToRunning(fd);
if (fd < 3) {
return Errno.badf;
}
if (fd - 3 >= preStats.length) {
return Errno.badf;
}
const [ mountPoint, driver ] = next.value;
const fileDescriptor = await driver.fd_create_prestat_fd(fd);
fileDescriptors.add(fileDescriptor);
fileDescriptors.setRoot(driver, fileDescriptor);
$preStatDirnames.set(fileDescriptor.fd, mountPoint);
const [ mountPoint, driver ] = preStats[fd - 3];
if (!fileDescriptors.has(fd)) {
const fileDescriptor = await driver.fd_create_prestat_fd(fd);
fileDescriptors.add(fileDescriptor);
fileDescriptors.setRoot(driver, fileDescriptor);
$preStatDirnames.set(fileDescriptor.fd, mountPoint);
}
const view = new DataView(memory);
const prestat = Prestat.create(view, bufPtr);
prestat.preopentype = Preopentype.dir;
Expand Down Expand Up @@ -1124,7 +1129,7 @@ export namespace FileSystemService {
const clock = Clock.create();
return Object.assign(
{},
EnvironmentWasiService.create(fileDescriptors, 'virtualRootFileSystem', preOpens.entries(), {}),
EnvironmentWasiService.create(fileDescriptors, 'virtualRootFileSystem', Array.from(preOpens.entries()), {}),
DeviceWasiService.create(deviceDrivers, fileDescriptors, clock, virtualRootFileSystem, options)
);
}
Expand Down
2 changes: 1 addition & 1 deletion wasm-wasi-core/src/common/test/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ export function createWasiService(workspaceContent: WorkspaceContent): WasiServi

const clock = Clock.create();
const fileSystemService = DeviceWasiService.create(deviceDrivers, fileDescriptors, clock, undefined, options);
const environmentService = EnvironmentWasiService.create(fileDescriptors, 'testApp', preOpenDirectories.entries(), options);
const environmentService = EnvironmentWasiService.create(fileDescriptors, 'testApp', Array.from(preOpenDirectories.entries()), options);
const clockService = ClockWasiService.create(clock);
const result: WasiService = Object.assign({}, NoSysWasiService, environmentService, clockService, fileSystemService);
return result;
Expand Down
6 changes: 3 additions & 3 deletions wasm-wasi-core/src/common/test/wasi.worker.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ suite(`Simple test - ${memoryQualifier}`, () => {
});

suite(`Filesystem - ${memoryQualifier}`, () => {
const rootFd: fd = 4;
const rootFd: fd = 3;
test(`fd_prestat`, () => {
const memory = createMemory();
const prestat = memory.allocStruct(Prestat);
Expand All @@ -252,7 +252,7 @@ suite(`Filesystem - ${memoryQualifier}`, () => {
errno = wasi.fd_prestat_dir_name(rootFd, buffer.$ptr, prestat.len);
assert.strictEqual(errno, Errno.success);
// We only have one prestat directory
errno = wasi.fd_prestat_get(5, prestat.$ptr);
errno = wasi.fd_prestat_get(rootFd + 1, prestat.$ptr);
assert.strictEqual(errno, Errno.badf);
});

Expand All @@ -262,7 +262,7 @@ suite(`Filesystem - ${memoryQualifier}`, () => {
const path = memory.allocString('fixture/read/helloWorld.txt');
let errno = wasi.path_open(rootFd, Lookupflags.none, path.$ptr, path.byteLength, Oflags.none, FileBaseRights, FileInheritingRights, Fdflags.none, fd.$ptr);
assert.strictEqual(errno, Errno.success);
assert.strictEqual(fd.value, 5);
assert.strictEqual(fd.value, rootFd + 1);
errno = wasi.fd_close(fd.value);
assert.strictEqual(errno, Errno.success);
});
Expand Down