Skip to content

Commit 3c7687f

Browse files
committed
Replace {environ,size}_{sizes_get,get} C code with Rust
1 parent d6b2fae commit 3c7687f

File tree

4 files changed

+91
-91
lines changed

4 files changed

+91
-91
lines changed

wasmtime-wasi/sandboxed-system-primitives/include/wasmtime_ssp.h

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -454,22 +454,6 @@ _Static_assert(_Alignof(__wasi_subscription_t) == 8, "non-wasi data layout");
454454
#define WASMTIME_SSP_SYSCALL_NAME(name)
455455
#endif
456456

457-
__wasi_errno_t wasmtime_ssp_args_get(
458-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
459-
struct argv_environ_values *arg_environ,
460-
#endif
461-
char **argv,
462-
char *argv_buf
463-
) WASMTIME_SSP_SYSCALL_NAME(args_get) __attribute__((__warn_unused_result__));
464-
465-
__wasi_errno_t wasmtime_ssp_args_sizes_get(
466-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
467-
struct argv_environ_values *arg_environ,
468-
#endif
469-
size_t *argc,
470-
size_t *argv_buf_size
471-
) WASMTIME_SSP_SYSCALL_NAME(args_sizes_get) __attribute__((__warn_unused_result__));
472-
473457
__wasi_errno_t wasmtime_ssp_clock_res_get(
474458
__wasi_clockid_t clock_id,
475459
__wasi_timestamp_t *resolution
@@ -481,21 +465,13 @@ __wasi_errno_t wasmtime_ssp_clock_time_get(
481465
__wasi_timestamp_t *time
482466
) WASMTIME_SSP_SYSCALL_NAME(clock_time_get) __attribute__((__warn_unused_result__));
483467

484-
__wasi_errno_t wasmtime_ssp_environ_get(
468+
__wasi_errno_t wasmtime_ssp_fd_prestat_get(
485469
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
486-
struct argv_environ_values *arg_environ,
487-
#endif
488-
char **environ,
489-
char *environ_buf
490-
) WASMTIME_SSP_SYSCALL_NAME(environ_get) __attribute__((__warn_unused_result__));
491-
492-
__wasi_errno_t wasmtime_ssp_environ_sizes_get(
493-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
494-
struct argv_environ_values *arg_environ,
470+
struct fd_prestats *prestats,
495471
#endif
496-
size_t *environ_count,
497-
size_t *environ_buf_size
498-
) WASMTIME_SSP_SYSCALL_NAME(environ_sizes_get) __attribute__((__warn_unused_result__));
472+
__wasi_fd_t fd,
473+
__wasi_prestat_t *buf
474+
) WASMTIME_SSP_SYSCALL_NAME(fd_prestat_get) __attribute__((__warn_unused_result__));
499475

500476
__wasi_errno_t wasmtime_ssp_fd_prestat_dir_name(
501477
#if !defined(WASMTIME_SSP_STATIC_CURFDS)

wasmtime-wasi/sandboxed-system-primitives/src/posix.c

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2656,60 +2656,6 @@ __wasi_errno_t wasmtime_ssp_sock_shutdown(
26562656
return 0;
26572657
}
26582658

2659-
__wasi_errno_t wasmtime_ssp_args_get(
2660-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2661-
struct argv_environ_values *argv_environ,
2662-
#endif
2663-
char **argv,
2664-
char *argv_buf
2665-
) {
2666-
for (size_t i = 0; i < argv_environ->argc; ++i) {
2667-
argv[i] = argv_buf + (argv_environ->argv[i] - argv_environ->argv_buf);
2668-
}
2669-
argv[argv_environ->argc] = NULL;
2670-
memcpy(argv_buf, argv_environ->argv_buf, argv_environ->argv_buf_size);
2671-
return __WASI_ESUCCESS;
2672-
}
2673-
2674-
__wasi_errno_t wasmtime_ssp_args_sizes_get(
2675-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2676-
struct argv_environ_values *argv_environ,
2677-
#endif
2678-
size_t *argc,
2679-
size_t *argv_buf_size
2680-
) {
2681-
*argc = argv_environ->argc;
2682-
*argv_buf_size = argv_environ->argv_buf_size;
2683-
return __WASI_ESUCCESS;
2684-
}
2685-
2686-
__wasi_errno_t wasmtime_ssp_environ_get(
2687-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2688-
struct argv_environ_values *argv_environ,
2689-
#endif
2690-
char **environ,
2691-
char *environ_buf
2692-
) {
2693-
for (size_t i = 0; i < argv_environ->environ_count; ++i) {
2694-
environ[i] = environ_buf + (argv_environ->environ[i] - argv_environ->environ_buf);
2695-
}
2696-
environ[argv_environ->environ_count] = NULL;
2697-
memcpy(environ_buf, argv_environ->environ_buf, argv_environ->environ_buf_size);
2698-
return __WASI_ESUCCESS;
2699-
}
2700-
2701-
__wasi_errno_t wasmtime_ssp_environ_sizes_get(
2702-
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
2703-
struct argv_environ_values *argv_environ,
2704-
#endif
2705-
size_t *environ_count,
2706-
size_t *environ_buf_size
2707-
) {
2708-
*environ_count = argv_environ->environ_count;
2709-
*environ_buf_size = argv_environ->environ_buf_size;
2710-
return __WASI_ESUCCESS;
2711-
}
2712-
27132659
void argv_environ_init(struct argv_environ_values *argv_environ,
27142660
const size_t *argv_offsets, size_t argv_offsets_len,
27152661
const char *argv_buf, size_t argv_buf_len,

wasmtime-wasi/src/host_impls.rs

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::host;
2-
use super::wasm32;
32
use errno::{errno, Errno};
3+
use std::slice;
44

55
/// Convert POSIX error code to host's WASI error code
66
fn convert_errno(error: Errno) -> host::__wasi_errno_t {
@@ -121,7 +121,79 @@ macro_rules! rwlock_unlock {
121121
};
122122
}
123123

124-
pub fn wasmtime_ssp_proc_exit(rval: wasm32::__wasi_exitcode_t) {
124+
pub fn wasmtime_ssp_args_get(
125+
argv_environ: &mut host::argv_environ_values,
126+
argv: &mut [*mut host::char],
127+
argv_buf: &mut [host::char],
128+
) -> host::__wasi_errno_t {
129+
for i in 0..(*argv_environ).argc {
130+
let buf_off;
131+
unsafe {
132+
buf_off = usize::checked_sub(
133+
*(*argv_environ).argv.offset(i as isize) as _,
134+
(*argv_environ).argv_buf as _,
135+
)
136+
.expect("argv[i] - argv_buf overflows");
137+
}
138+
argv[i] = argv_buf[buf_off..].as_mut_ptr();
139+
}
140+
argv[(*argv_environ).argc] = std::ptr::null_mut();
141+
unsafe {
142+
argv_buf.copy_from_slice(slice::from_raw_parts_mut(
143+
(*argv_environ).argv_buf,
144+
(*argv_environ).argv_buf_size,
145+
));
146+
}
147+
host::__WASI_ESUCCESS
148+
}
149+
150+
pub fn wasmtime_ssp_args_sizes_get(
151+
argv_environ: &mut host::argv_environ_values,
152+
argc: &mut usize,
153+
argv_buf_size: &mut usize,
154+
) -> host::__wasi_errno_t {
155+
*argc = (*argv_environ).argc;
156+
*argv_buf_size = (*argv_environ).argv_buf_size;
157+
host::__WASI_ESUCCESS
158+
}
159+
160+
pub fn wasmtime_ssp_environ_get(
161+
argv_environ: &mut host::argv_environ_values,
162+
environ: &mut [*mut host::char],
163+
environ_buf: &mut [host::char],
164+
) -> host::__wasi_errno_t {
165+
for i in 0..(*argv_environ).environ_count {
166+
let buf_off;
167+
unsafe {
168+
buf_off = usize::checked_sub(
169+
*(*argv_environ).environ.offset(i as isize) as _,
170+
(*argv_environ).environ_buf as _,
171+
)
172+
.expect("environ[i] - environ_buf overflows");
173+
}
174+
environ[i] = environ_buf[buf_off..].as_mut_ptr();
175+
}
176+
environ[(*argv_environ).environ_count] = std::ptr::null_mut();
177+
unsafe {
178+
environ_buf.copy_from_slice(slice::from_raw_parts_mut(
179+
(*argv_environ).environ_buf,
180+
(*argv_environ).environ_buf_size,
181+
));
182+
}
183+
host::__WASI_ESUCCESS
184+
}
185+
186+
pub fn wasmtime_ssp_environ_sizes_get(
187+
argv_environ: &mut host::argv_environ_values,
188+
environ_count: &mut usize,
189+
environ_buf_size: &mut usize,
190+
) -> host::__wasi_errno_t {
191+
*environ_count = (*argv_environ).environ_count;
192+
*environ_buf_size = (*argv_environ).environ_buf_size;
193+
host::__WASI_ESUCCESS
194+
}
195+
196+
pub fn wasmtime_ssp_proc_exit(rval: host::__wasi_exitcode_t) {
125197
::std::process::exit(rval as i32)
126198
}
127199

wasmtime-wasi/src/syscalls.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,10 @@ syscalls! {
192192
let mut host_argv = Vec::new();
193193
host_argv.resize((*argv_environ).argc + 1, ptr::null_mut());
194194

195-
let e = host::wasmtime_ssp_args_get(argv_environ, host_argv.as_mut_ptr(), host_argv_buf);
195+
let e = host_impls::wasmtime_ssp_args_get(
196+
&mut *argv_environ,
197+
host_argv.as_mut_slice(),
198+
slice::from_raw_parts_mut(host_argv_buf, argv_buf_size as usize));
196199

197200
encode_charstar_slice(argv, host_argv, argv_buf, host_argv_buf);
198201

@@ -223,7 +226,7 @@ syscalls! {
223226
let vmctx = &mut *vmctx;
224227
let argv_environ = get_argv_environ(vmctx);
225228

226-
let e = host::wasmtime_ssp_args_sizes_get(argv_environ, &mut host_argc, &mut host_argv_buf_size);
229+
let e = host_impls::wasmtime_ssp_args_sizes_get(&mut *argv_environ, &mut host_argc, &mut host_argv_buf_size);
227230

228231
trace!(" | *argc={:?}", host_argc);
229232
encode_usize_byref(vmctx, argc, host_argc);
@@ -311,8 +314,8 @@ syscalls! {
311314
Err(_) => return wasm32::__WASI_ENOMEM,
312315
};
313316

314-
let (host_environ_buf, _environ_buf_len) = match decode_char_slice(vmctx, environ_buf, environ_buf_size) {
315-
Ok((environ_buf, environ_buf_len)) => (environ_buf, environ_buf_len),
317+
let (host_environ_buf, _environ_buf_size) = match decode_char_slice(vmctx, environ_buf, environ_buf_size) {
318+
Ok((environ_buf, environ_buf_size)) => (environ_buf, environ_buf_size),
316319
Err(e) => return return_encoded_errno(e),
317320
};
318321
// Add 1 so that we can add an extra NULL pointer at the end.
@@ -323,7 +326,10 @@ syscalls! {
323326
let mut host_environ = Vec::new();
324327
host_environ.resize((*argv_environ).environ_count + 1, ptr::null_mut());
325328

326-
let e = host::wasmtime_ssp_environ_get(argv_environ, host_environ.as_mut_ptr(), host_environ_buf);
329+
let e = host_impls::wasmtime_ssp_environ_get(
330+
&mut *argv_environ,
331+
host_environ.as_mut_slice(),
332+
slice::from_raw_parts_mut(host_environ_buf, environ_buf_size as usize));
327333

328334
encode_charstar_slice(environ, host_environ, environ_buf, host_environ_buf);
329335

@@ -354,7 +360,7 @@ syscalls! {
354360
let vmctx = &mut *vmctx;
355361
let argv_environ = get_argv_environ(vmctx);
356362

357-
let e = host::wasmtime_ssp_environ_sizes_get(argv_environ, &mut host_environ_count, &mut host_environ_buf_size);
363+
let e = host_impls::wasmtime_ssp_environ_sizes_get(&mut *argv_environ, &mut host_environ_count, &mut host_environ_buf_size);
358364

359365
trace!(" | *environ_count={:?}", host_environ_count);
360366
encode_usize_byref(vmctx, environ_count, host_environ_count);

0 commit comments

Comments
 (0)