diff --git a/lib/wasi/src/lib.rs b/lib/wasi/src/lib.rs index e9d65f0e027..ab8f35e0471 100644 --- a/lib/wasi/src/lib.rs +++ b/lib/wasi/src/lib.rs @@ -55,7 +55,7 @@ pub use wasmer_vfs::VirtualFile as WasiFile; pub use wasmer_vfs::{FsError, VirtualFile}; use thiserror::Error; -use wasmer::{imports, Function, Imports, Memory, MemoryAccessError}; +use wasmer::{imports, namespace, Exports, Function, Imports, Memory, MemoryAccessError}; use std::sync::{Arc, Mutex, MutexGuard}; @@ -121,208 +121,129 @@ pub fn generate_import_object_from_ctx( } } +fn wasi_unstable_exports(ctx: &mut ContextMut<'_, WasiEnv>) -> Exports { + let namespace = namespace! { + "args_get" => Function::new_native(ctx, args_get), + "args_sizes_get" => Function::new_native(ctx, args_sizes_get), + "clock_res_get" => Function::new_native(ctx, clock_res_get), + "clock_time_get" => Function::new_native(ctx, clock_time_get), + "environ_get" => Function::new_native(ctx, environ_get), + "environ_sizes_get" => Function::new_native(ctx, environ_sizes_get), + "fd_advise" => Function::new_native(ctx, fd_advise), + "fd_allocate" => Function::new_native(ctx, fd_allocate), + "fd_close" => Function::new_native(ctx, fd_close), + "fd_datasync" => Function::new_native(ctx, fd_datasync), + "fd_fdstat_get" => Function::new_native(ctx, fd_fdstat_get), + "fd_fdstat_set_flags" => Function::new_native(ctx, fd_fdstat_set_flags), + "fd_fdstat_set_rights" => Function::new_native(ctx, fd_fdstat_set_rights), + "fd_filestat_get" => Function::new_native(ctx, legacy::snapshot0::fd_filestat_get), + "fd_filestat_set_size" => Function::new_native(ctx, fd_filestat_set_size), + "fd_filestat_set_times" => Function::new_native(ctx, fd_filestat_set_times), + "fd_pread" => Function::new_native(ctx, fd_pread), + "fd_prestat_get" => Function::new_native(ctx, fd_prestat_get), + "fd_prestat_dir_name" => Function::new_native(ctx, fd_prestat_dir_name), + "fd_pwrite" => Function::new_native(ctx, fd_pwrite), + "fd_read" => Function::new_native(ctx, fd_read), + "fd_readdir" => Function::new_native(ctx, fd_readdir), + "fd_renumber" => Function::new_native(ctx, fd_renumber), + "fd_seek" => Function::new_native(ctx, legacy::snapshot0::fd_seek), + "fd_sync" => Function::new_native(ctx, fd_sync), + "fd_tell" => Function::new_native(ctx, fd_tell), + "fd_write" => Function::new_native(ctx, fd_write), + "path_create_directory" => Function::new_native(ctx, path_create_directory), + "path_filestat_get" => Function::new_native(ctx, legacy::snapshot0::path_filestat_get), + "path_filestat_set_times" => Function::new_native(ctx, path_filestat_set_times), + "path_link" => Function::new_native(ctx, path_link), + "path_open" => Function::new_native(ctx, path_open), + "path_readlink" => Function::new_native(ctx, path_readlink), + "path_remove_directory" => Function::new_native(ctx, path_remove_directory), + "path_rename" => Function::new_native(ctx, path_rename), + "path_symlink" => Function::new_native(ctx, path_symlink), + "path_unlink_file" => Function::new_native(ctx, path_unlink_file), + "poll_oneoff" => Function::new_native(ctx, legacy::snapshot0::poll_oneoff), + "proc_exit" => Function::new_native(ctx, proc_exit), + "proc_raise" => Function::new_native(ctx, proc_raise), + "random_get" => Function::new_native(ctx, random_get), + "sched_yield" => Function::new_native(ctx, sched_yield), + "sock_recv" => Function::new_native(ctx, sock_recv), + "sock_send" => Function::new_native(ctx, sock_send), + "sock_shutdown" => Function::new_native(ctx, sock_shutdown), + }; + namespace +} + +fn wasi_snapshot_preview1_exports(ctx: &mut ContextMut<'_, WasiEnv>) -> Exports { + let namespace = namespace! { + "args_get" => Function::new_native(ctx, args_get), + "args_sizes_get" => Function::new_native(ctx, args_sizes_get), + "clock_res_get" => Function::new_native(ctx, clock_res_get), + "clock_time_get" => Function::new_native(ctx, clock_time_get), + "environ_get" => Function::new_native(ctx, environ_get), + "environ_sizes_get" => Function::new_native(ctx, environ_sizes_get), + "fd_advise" => Function::new_native(ctx, fd_advise), + "fd_allocate" => Function::new_native(ctx, fd_allocate), + "fd_close" => Function::new_native(ctx, fd_close), + "fd_datasync" => Function::new_native(ctx, fd_datasync), + "fd_fdstat_get" => Function::new_native(ctx, fd_fdstat_get), + "fd_fdstat_set_flags" => Function::new_native(ctx, fd_fdstat_set_flags), + "fd_fdstat_set_rights" => Function::new_native(ctx, fd_fdstat_set_rights), + "fd_filestat_get" => Function::new_native(ctx, fd_filestat_get), + "fd_filestat_set_size" => Function::new_native(ctx, fd_filestat_set_size), + "fd_filestat_set_times" => Function::new_native(ctx, fd_filestat_set_times), + "fd_pread" => Function::new_native(ctx, fd_pread), + "fd_prestat_get" => Function::new_native(ctx, fd_prestat_get), + "fd_prestat_dir_name" => Function::new_native(ctx, fd_prestat_dir_name), + "fd_pwrite" => Function::new_native(ctx, fd_pwrite), + "fd_read" => Function::new_native(ctx, fd_read), + "fd_readdir" => Function::new_native(ctx, fd_readdir), + "fd_renumber" => Function::new_native(ctx, fd_renumber), + "fd_seek" => Function::new_native(ctx, fd_seek), + "fd_sync" => Function::new_native(ctx, fd_sync), + "fd_tell" => Function::new_native(ctx, fd_tell), + "fd_write" => Function::new_native(ctx, fd_write), + "path_create_directory" => Function::new_native(ctx, path_create_directory), + "path_filestat_get" => Function::new_native(ctx, path_filestat_get), + "path_filestat_set_times" => Function::new_native(ctx, path_filestat_set_times), + "path_link" => Function::new_native(ctx, path_link), + "path_open" => Function::new_native(ctx, path_open), + "path_readlink" => Function::new_native(ctx, path_readlink), + "path_remove_directory" => Function::new_native(ctx, path_remove_directory), + "path_rename" => Function::new_native(ctx, path_rename), + "path_symlink" => Function::new_native(ctx, path_symlink), + "path_unlink_file" => Function::new_native(ctx, path_unlink_file), + "poll_oneoff" => Function::new_native(ctx, poll_oneoff), + "proc_exit" => Function::new_native(ctx, proc_exit), + "proc_raise" => Function::new_native(ctx, proc_raise), + "random_get" => Function::new_native(ctx, random_get), + "sched_yield" => Function::new_native(ctx, sched_yield), + "sock_recv" => Function::new_native(ctx, sock_recv), + "sock_send" => Function::new_native(ctx, sock_send), + "sock_shutdown" => Function::new_native(ctx, sock_shutdown), + }; + namespace +} pub fn import_object_for_all_wasi_versions(ctx: &mut ContextMut<'_, WasiEnv>) -> Imports { + let wasi_unstable_exports = wasi_unstable_exports(ctx); + let wasi_snapshot_preview1_exports = wasi_snapshot_preview1_exports(ctx); imports! { - "wasi_unstable" => { - "args_get" => Function::new_native(ctx, args_get), - "args_sizes_get" => Function::new_native(ctx, args_sizes_get), - "clock_res_get" => Function::new_native(ctx, clock_res_get), - "clock_time_get" => Function::new_native(ctx, clock_time_get), - "environ_get" => Function::new_native(ctx, environ_get), - "environ_sizes_get" => Function::new_native(ctx, environ_sizes_get), - "fd_advise" => Function::new_native(ctx, fd_advise), - "fd_allocate" => Function::new_native(ctx, fd_allocate), - "fd_close" => Function::new_native(ctx, fd_close), - "fd_datasync" => Function::new_native(ctx, fd_datasync), - "fd_fdstat_get" => Function::new_native(ctx, fd_fdstat_get), - "fd_fdstat_set_flags" => Function::new_native(ctx, fd_fdstat_set_flags), - "fd_fdstat_set_rights" => Function::new_native(ctx, fd_fdstat_set_rights), - "fd_filestat_get" => Function::new_native(ctx, legacy::snapshot0::fd_filestat_get), - "fd_filestat_set_size" => Function::new_native(ctx, fd_filestat_set_size), - "fd_filestat_set_times" => Function::new_native(ctx, fd_filestat_set_times), - "fd_pread" => Function::new_native(ctx, fd_pread), - "fd_prestat_get" => Function::new_native(ctx, fd_prestat_get), - "fd_prestat_dir_name" => Function::new_native(ctx, fd_prestat_dir_name), - "fd_pwrite" => Function::new_native(ctx, fd_pwrite), - "fd_read" => Function::new_native(ctx, fd_read), - "fd_readdir" => Function::new_native(ctx, fd_readdir), - "fd_renumber" => Function::new_native(ctx, fd_renumber), - "fd_seek" => Function::new_native(ctx, legacy::snapshot0::fd_seek), - "fd_sync" => Function::new_native(ctx, fd_sync), - "fd_tell" => Function::new_native(ctx, fd_tell), - "fd_write" => Function::new_native(ctx, fd_write), - "path_create_directory" => Function::new_native(ctx, path_create_directory), - "path_filestat_get" => Function::new_native(ctx, legacy::snapshot0::path_filestat_get), - "path_filestat_set_times" => Function::new_native(ctx, path_filestat_set_times), - "path_link" => Function::new_native(ctx, path_link), - "path_open" => Function::new_native(ctx, path_open), - "path_readlink" => Function::new_native(ctx, path_readlink), - "path_remove_directory" => Function::new_native(ctx, path_remove_directory), - "path_rename" => Function::new_native(ctx, path_rename), - "path_symlink" => Function::new_native(ctx, path_symlink), - "path_unlink_file" => Function::new_native(ctx, path_unlink_file), - "poll_oneoff" => Function::new_native(ctx, legacy::snapshot0::poll_oneoff), - "proc_exit" => Function::new_native(ctx, proc_exit), - "proc_raise" => Function::new_native(ctx, proc_raise), - "random_get" => Function::new_native(ctx, random_get), - "sched_yield" => Function::new_native(ctx, sched_yield), - "sock_recv" => Function::new_native(ctx, sock_recv), - "sock_send" => Function::new_native(ctx, sock_send), - "sock_shutdown" => Function::new_native(ctx, sock_shutdown), - }, - "wasi_snapshot_preview1" => { - "args_get" => Function::new_native(ctx, args_get), - "args_sizes_get" => Function::new_native(ctx, args_sizes_get), - "clock_res_get" => Function::new_native(ctx, clock_res_get), - "clock_time_get" => Function::new_native(ctx, clock_time_get), - "environ_get" => Function::new_native(ctx, environ_get), - "environ_sizes_get" => Function::new_native(ctx, environ_sizes_get), - "fd_advise" => Function::new_native(ctx, fd_advise), - "fd_allocate" => Function::new_native(ctx, fd_allocate), - "fd_close" => Function::new_native(ctx, fd_close), - "fd_datasync" => Function::new_native(ctx, fd_datasync), - "fd_fdstat_get" => Function::new_native(ctx, fd_fdstat_get), - "fd_fdstat_set_flags" => Function::new_native(ctx, fd_fdstat_set_flags), - "fd_fdstat_set_rights" => Function::new_native(ctx, fd_fdstat_set_rights), - "fd_filestat_get" => Function::new_native(ctx, fd_filestat_get), - "fd_filestat_set_size" => Function::new_native(ctx, fd_filestat_set_size), - "fd_filestat_set_times" => Function::new_native(ctx, fd_filestat_set_times), - "fd_pread" => Function::new_native(ctx, fd_pread), - "fd_prestat_get" => Function::new_native(ctx, fd_prestat_get), - "fd_prestat_dir_name" => Function::new_native(ctx, fd_prestat_dir_name), - "fd_pwrite" => Function::new_native(ctx, fd_pwrite), - "fd_read" => Function::new_native(ctx, fd_read), - "fd_readdir" => Function::new_native(ctx, fd_readdir), - "fd_renumber" => Function::new_native(ctx, fd_renumber), - "fd_seek" => Function::new_native(ctx, fd_seek), - "fd_sync" => Function::new_native(ctx, fd_sync), - "fd_tell" => Function::new_native(ctx, fd_tell), - "fd_write" => Function::new_native(ctx, fd_write), - "path_create_directory" => Function::new_native(ctx, path_create_directory), - "path_filestat_get" => Function::new_native(ctx, path_filestat_get), - "path_filestat_set_times" => Function::new_native(ctx, path_filestat_set_times), - "path_link" => Function::new_native(ctx, path_link), - "path_open" => Function::new_native(ctx, path_open), - "path_readlink" => Function::new_native(ctx, path_readlink), - "path_remove_directory" => Function::new_native(ctx, path_remove_directory), - "path_rename" => Function::new_native(ctx, path_rename), - "path_symlink" => Function::new_native(ctx, path_symlink), - "path_unlink_file" => Function::new_native(ctx, path_unlink_file), - "poll_oneoff" => Function::new_native(ctx, poll_oneoff), - "proc_exit" => Function::new_native(ctx, proc_exit), - "proc_raise" => Function::new_native(ctx, proc_raise), - "random_get" => Function::new_native(ctx, random_get), - "sched_yield" => Function::new_native(ctx, sched_yield), - "sock_recv" => Function::new_native(ctx, sock_recv), - "sock_send" => Function::new_native(ctx, sock_send), - "sock_shutdown" => Function::new_native(ctx, sock_shutdown), - } + "wasi_unstable" => wasi_unstable_exports, + "wasi_snapshot_preview1" => wasi_snapshot_preview1_exports, } } /// Combines a state generating function with the import list for legacy WASI fn generate_import_object_snapshot0(ctx: &mut ContextMut<'_, WasiEnv>) -> Imports { + let wasi_unstable_exports = wasi_unstable_exports(ctx); imports! { - "wasi_unstable" => { - "args_get" => Function::new_native(ctx, args_get), - "args_sizes_get" => Function::new_native(ctx, args_sizes_get), - "clock_res_get" => Function::new_native(ctx, clock_res_get), - "clock_time_get" => Function::new_native(ctx, clock_time_get), - "environ_get" => Function::new_native(ctx, environ_get), - "environ_sizes_get" => Function::new_native(ctx, environ_sizes_get), - "fd_advise" => Function::new_native(ctx, fd_advise), - "fd_allocate" => Function::new_native(ctx, fd_allocate), - "fd_close" => Function::new_native(ctx, fd_close), - "fd_datasync" => Function::new_native(ctx, fd_datasync), - "fd_fdstat_get" => Function::new_native(ctx, fd_fdstat_get), - "fd_fdstat_set_flags" => Function::new_native(ctx, fd_fdstat_set_flags), - "fd_fdstat_set_rights" => Function::new_native(ctx, fd_fdstat_set_rights), - "fd_filestat_get" => Function::new_native(ctx, legacy::snapshot0::fd_filestat_get), - "fd_filestat_set_size" => Function::new_native(ctx, fd_filestat_set_size), - "fd_filestat_set_times" => Function::new_native(ctx, fd_filestat_set_times), - "fd_pread" => Function::new_native(ctx, fd_pread), - "fd_prestat_get" => Function::new_native(ctx, fd_prestat_get), - "fd_prestat_dir_name" => Function::new_native(ctx, fd_prestat_dir_name), - "fd_pwrite" => Function::new_native(ctx, fd_pwrite), - "fd_read" => Function::new_native(ctx, fd_read), - "fd_readdir" => Function::new_native(ctx, fd_readdir), - "fd_renumber" => Function::new_native(ctx, fd_renumber), - "fd_seek" => Function::new_native(ctx, legacy::snapshot0::fd_seek), - "fd_sync" => Function::new_native(ctx, fd_sync), - "fd_tell" => Function::new_native(ctx, fd_tell), - "fd_write" => Function::new_native(ctx, fd_write), - "path_create_directory" => Function::new_native(ctx, path_create_directory), - "path_filestat_get" => Function::new_native(ctx, legacy::snapshot0::path_filestat_get), - "path_filestat_set_times" => Function::new_native(ctx, path_filestat_set_times), - "path_link" => Function::new_native(ctx, path_link), - "path_open" => Function::new_native(ctx, path_open), - "path_readlink" => Function::new_native(ctx, path_readlink), - "path_remove_directory" => Function::new_native(ctx, path_remove_directory), - "path_rename" => Function::new_native(ctx, path_rename), - "path_symlink" => Function::new_native(ctx, path_symlink), - "path_unlink_file" => Function::new_native(ctx, path_unlink_file), - "poll_oneoff" => Function::new_native(ctx, legacy::snapshot0::poll_oneoff), - "proc_exit" => Function::new_native(ctx, proc_exit), - "proc_raise" => Function::new_native(ctx, proc_raise), - "random_get" => Function::new_native(ctx, random_get), - "sched_yield" => Function::new_native(ctx, sched_yield), - "sock_recv" => Function::new_native(ctx, sock_recv), - "sock_send" => Function::new_native(ctx, sock_send), - "sock_shutdown" => Function::new_native(ctx, sock_shutdown), - }, + "wasi_unstable" => wasi_unstable_exports } } /// Combines a state generating function with the import list for snapshot 1 fn generate_import_object_snapshot1(ctx: &mut ContextMut<'_, WasiEnv>) -> Imports { + let wasi_snapshot_preview1_exports = wasi_snapshot_preview1_exports(ctx); imports! { - "wasi_snapshot_preview1" => { - "args_get" => Function::new_native(ctx, args_get), - "args_sizes_get" => Function::new_native(ctx, args_sizes_get), - "clock_res_get" => Function::new_native(ctx, clock_res_get), - "clock_time_get" => Function::new_native(ctx, clock_time_get), - "environ_get" => Function::new_native(ctx, environ_get), - "environ_sizes_get" => Function::new_native(ctx, environ_sizes_get), - "fd_advise" => Function::new_native(ctx, fd_advise), - "fd_allocate" => Function::new_native(ctx, fd_allocate), - "fd_close" => Function::new_native(ctx, fd_close), - "fd_datasync" => Function::new_native(ctx, fd_datasync), - "fd_fdstat_get" => Function::new_native(ctx, fd_fdstat_get), - "fd_fdstat_set_flags" => Function::new_native(ctx, fd_fdstat_set_flags), - "fd_fdstat_set_rights" => Function::new_native(ctx, fd_fdstat_set_rights), - "fd_filestat_get" => Function::new_native(ctx, fd_filestat_get), - "fd_filestat_set_size" => Function::new_native(ctx, fd_filestat_set_size), - "fd_filestat_set_times" => Function::new_native(ctx, fd_filestat_set_times), - "fd_pread" => Function::new_native(ctx, fd_pread), - "fd_prestat_get" => Function::new_native(ctx, fd_prestat_get), - "fd_prestat_dir_name" => Function::new_native(ctx, fd_prestat_dir_name), - "fd_pwrite" => Function::new_native(ctx, fd_pwrite), - "fd_read" => Function::new_native(ctx, fd_read), - "fd_readdir" => Function::new_native(ctx, fd_readdir), - "fd_renumber" => Function::new_native(ctx, fd_renumber), - "fd_seek" => Function::new_native(ctx, fd_seek), - "fd_sync" => Function::new_native(ctx, fd_sync), - "fd_tell" => Function::new_native(ctx, fd_tell), - "fd_write" => Function::new_native(ctx, fd_write), - "path_create_directory" => Function::new_native(ctx, path_create_directory), - "path_filestat_get" => Function::new_native(ctx, path_filestat_get), - "path_filestat_set_times" => Function::new_native(ctx, path_filestat_set_times), - "path_link" => Function::new_native(ctx, path_link), - "path_open" => Function::new_native(ctx, path_open), - "path_readlink" => Function::new_native(ctx, path_readlink), - "path_remove_directory" => Function::new_native(ctx, path_remove_directory), - "path_rename" => Function::new_native(ctx, path_rename), - "path_symlink" => Function::new_native(ctx, path_symlink), - "path_unlink_file" => Function::new_native(ctx, path_unlink_file), - "poll_oneoff" => Function::new_native(ctx, poll_oneoff), - "proc_exit" => Function::new_native(ctx, proc_exit), - "proc_raise" => Function::new_native(ctx, proc_raise), - "random_get" => Function::new_native(ctx, random_get), - "sched_yield" => Function::new_native(ctx, sched_yield), - "sock_recv" => Function::new_native(ctx, sock_recv), - "sock_send" => Function::new_native(ctx, sock_send), - "sock_shutdown" => Function::new_native(ctx, sock_shutdown), - } + "wasi_snapshot_preview1" => wasi_snapshot_preview1_exports } }