Skip to content

Commit c653eb6

Browse files
committed
Implement most of the rest of wasi_unstable.
Implement everything except the args and environ functions.
1 parent 250dc07 commit c653eb6

File tree

1 file changed

+360
-1
lines changed

1 file changed

+360
-1
lines changed

src/wasi_unstable/mod.rs

Lines changed: 360 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,367 @@ pub fn fd_pread(fd: fd_t, iovs: &[iovec_t], offset: filesize_t) -> (errno_t, usi
273273
}
274274
}
275275

276+
pub fn fd_pwrite(fd: fd_t, iovs: &[ciovec_t], offset: filesize_t) -> (__wasi_errno_t, usize) {
277+
let mut nwritten = MaybeUninit::<usize>::uninit();
278+
unsafe {
279+
(
280+
__wasi_fd_pwrite(fd, iovs.as_ptr(), iovs.len(), offset, nwritten.as_mut_ptr()),
281+
nwritten.assume_init(),
282+
)
283+
}
284+
}
285+
276286
pub fn random_get(buf: &mut [u8]) -> errno_t {
277287
unsafe { __wasi_random_get(buf.as_mut_ptr() as *mut c_void, buf.len()) }
278288
}
279289

280-
// TODO: Implement more functions
290+
pub fn fd_close(fd: fd_t) -> errno_t {
291+
unsafe { __wasi_fd_close(fd) }
292+
}
293+
294+
pub fn fd_datasync(fd: fd_t) -> errno_t {
295+
unsafe { __wasi_fd_datasync(fd) }
296+
}
297+
298+
pub fn fd_read(fd: fd_t, iovs: &[iovec_t]) -> (errno_t, usize) {
299+
let mut nread = MaybeUninit::<usize>::uninit();
300+
unsafe {
301+
(
302+
__wasi_fd_read(fd, iovs.as_ptr(), iovs.len(), nread.as_mut_ptr()),
303+
nread.assume_init(),
304+
)
305+
}
306+
}
307+
308+
pub fn fd_renumber(from: fd_t, to: fd_t) -> errno_t {
309+
unsafe { __wasi_fd_renumber(from, to) }
310+
}
311+
312+
pub fn fd_seek(fd: fd_t, offset: filedelta_t, whence: whence_t) -> (errno_t, filesize_t) {
313+
let mut newoffset = MaybeUninit::<filesize_t>::uninit();
314+
unsafe {
315+
(
316+
__wasi_fd_seek(fd, offset, whence, newoffset.as_mut_ptr()),
317+
newoffset.assume_init(),
318+
)
319+
}
320+
}
321+
322+
pub fn fd_tell(fd: fd_t) -> (errno_t, filesize_t) {
323+
let mut newoffset = MaybeUninit::<filesize_t>::uninit();
324+
unsafe {
325+
(
326+
__wasi_fd_tell(fd, newoffset.as_mut_ptr()),
327+
newoffset.assume_init(),
328+
)
329+
}
330+
}
331+
332+
pub fn fd_fdstat_get(fd: fd_t) -> (errno_t, fdstat_t) {
333+
let mut buf = MaybeUninit::<fdstat_t>::uninit();
334+
unsafe {
335+
(
336+
__wasi_fd_fdstat_get(fd, buf.as_mut_ptr()),
337+
buf.assume_init(),
338+
)
339+
}
340+
}
341+
342+
pub fn fd_fdstat_set_flags(fd: fd_t, flags: fdflags_t) -> errno_t {
343+
unsafe { __wasi_fd_fdstat_set_flags(fd, flags) }
344+
}
345+
346+
pub fn fd_fdstat_set_rights(
347+
fd: fd_t,
348+
fs_rights_base: rights_t,
349+
fs_rights_inheriting: rights_t,
350+
) -> errno_t {
351+
unsafe { __wasi_fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting) }
352+
}
353+
354+
pub fn fd_sync(fd: fd_t) -> errno_t {
355+
unsafe { __wasi_fd_sync(fd) }
356+
}
357+
358+
pub fn fd_write(fd: fd_t, iovs: &[ciovec_t]) -> (errno_t, usize) {
359+
let mut nwritten = MaybeUninit::<usize>::uninit();
360+
unsafe {
361+
(
362+
__wasi_fd_write(fd, iovs.as_ptr(), iovs.len(), nwritten.as_mut_ptr()),
363+
nwritten.assume_init(),
364+
)
365+
}
366+
}
367+
368+
pub fn fd_advise(fd: fd_t, offset: filesize_t, len: filesize_t, advice: advice_t) -> errno_t {
369+
unsafe { __wasi_fd_advise(fd, offset, len, advice) }
370+
}
371+
372+
pub fn fd_allocate(fd: fd_t, offset: filesize_t, len: filesize_t) -> errno_t {
373+
unsafe { __wasi_fd_allocate(fd, offset, len) }
374+
}
375+
376+
pub fn path_create_directory(fd: fd_t, path: &[u8]) -> errno_t {
377+
unsafe { __wasi_path_create_directory(fd, path.as_ptr(), path.len()) }
378+
}
379+
380+
pub fn path_link(
381+
old_fd: fd_t,
382+
old_flags: lookupflags_t,
383+
old_path: &[u8],
384+
new_fd: fd_t,
385+
new_path: &[u8],
386+
) -> errno_t {
387+
unsafe {
388+
__wasi_path_link(
389+
old_fd,
390+
old_flags,
391+
old_path.as_ptr(),
392+
old_path.len(),
393+
new_fd,
394+
new_path.as_ptr(),
395+
new_path.len(),
396+
)
397+
}
398+
}
399+
400+
pub fn path_open(
401+
dirfd: fd_t,
402+
dirflags: lookupflags_t,
403+
path: &[u8],
404+
oflags: oflags_t,
405+
fs_rights_base: rights_t,
406+
fs_rights_inheriting: rights_t,
407+
fs_flags: fdflags_t,
408+
) -> (errno_t, fd_t) {
409+
let mut fd = MaybeUninit::<fd_t>::uninit();
410+
unsafe {
411+
(
412+
__wasi_path_open(
413+
dirfd,
414+
dirflags,
415+
path.as_ptr(),
416+
path.len(),
417+
oflags,
418+
fs_rights_base,
419+
fs_rights_inheriting,
420+
fs_flags,
421+
fd.as_mut_ptr(),
422+
),
423+
fd.assume_init(),
424+
)
425+
}
426+
}
427+
428+
pub fn fd_readdir(fd: fd_t, buf: &mut [u8], cookie: dircookie_t) -> (errno_t, usize) {
429+
let mut bufused = MaybeUninit::<usize>::uninit();
430+
unsafe {
431+
(
432+
__wasi_fd_readdir(
433+
fd,
434+
buf.as_mut_ptr() as *mut c_void,
435+
buf.len(),
436+
cookie,
437+
bufused.as_mut_ptr(),
438+
),
439+
bufused.assume_init(),
440+
)
441+
}
442+
}
443+
444+
pub fn path_readlink(fd: fd_t, path: &[u8], buf: &mut [u8]) -> (errno_t, usize) {
445+
let mut bufused = MaybeUninit::<usize>::uninit();
446+
unsafe {
447+
(
448+
__wasi_path_readlink(
449+
fd,
450+
path.as_ptr(),
451+
path.len(),
452+
buf.as_mut_ptr(),
453+
buf.len(),
454+
bufused.as_mut_ptr(),
455+
),
456+
bufused.assume_init(),
457+
)
458+
}
459+
}
460+
461+
pub fn path_rename(old_fd: fd_t, old_path: &[u8], new_fd: fd_t, new_path: &[u8]) -> errno_t {
462+
unsafe {
463+
__wasi_path_rename(
464+
old_fd,
465+
old_path.as_ptr(),
466+
old_path.len(),
467+
new_fd,
468+
new_path.as_ptr(),
469+
new_path.len(),
470+
)
471+
}
472+
}
473+
474+
pub fn fd_filestat_get(fd: fd_t) -> (errno_t, filestat_t) {
475+
let mut buf = MaybeUninit::<filestat_t>::uninit();
476+
unsafe {
477+
(
478+
__wasi_fd_filestat_get(fd, buf.as_mut_ptr()),
479+
buf.assume_init(),
480+
)
481+
}
482+
}
483+
484+
pub fn fd_filestat_set_times(
485+
fd: fd_t,
486+
st_atim: timestamp_t,
487+
st_mtim: timestamp_t,
488+
fstflags: fstflags_t,
489+
) -> errno_t {
490+
unsafe { __wasi_fd_filestat_set_times(fd, st_atim, st_mtim, fstflags) }
491+
}
492+
493+
pub fn fd_filestat_set_size(fd: fd_t, st_size: filesize_t) -> errno_t {
494+
unsafe { __wasi_fd_filestat_set_size(fd, st_size) }
495+
}
496+
497+
pub fn path_filestat_get(fd: fd_t, flags: lookupflags_t, path: &[u8]) -> (errno_t, filestat_t) {
498+
let mut buf = MaybeUninit::<filestat_t>::uninit();
499+
unsafe {
500+
(
501+
__wasi_path_filestat_get(fd, flags, path.as_ptr(), path.len(), buf.as_mut_ptr()),
502+
buf.assume_init(),
503+
)
504+
}
505+
}
506+
507+
pub fn path_filestat_set_times(
508+
fd: fd_t,
509+
flags: lookupflags_t,
510+
path: &[u8],
511+
st_atim: timestamp_t,
512+
st_mtim: timestamp_t,
513+
fstflags: fstflags_t,
514+
) -> errno_t {
515+
unsafe {
516+
__wasi_path_filestat_set_times(
517+
fd,
518+
flags,
519+
path.as_ptr(),
520+
path.len(),
521+
st_atim,
522+
st_mtim,
523+
fstflags,
524+
)
525+
}
526+
}
527+
528+
pub fn path_symlink(old_path: &[u8], fd: fd_t, new_path: &[u8]) -> errno_t {
529+
unsafe {
530+
__wasi_path_symlink(
531+
old_path.as_ptr(),
532+
old_path.len(),
533+
fd,
534+
new_path.as_ptr(),
535+
new_path.len(),
536+
)
537+
}
538+
}
539+
540+
pub fn path_unlink_file(fd: fd_t, path: &[u8]) -> errno_t {
541+
unsafe { __wasi_path_unlink_file(fd, path.as_ptr(), path.len()) }
542+
}
543+
544+
pub fn path_remove_directory(fd: fd_t, path: &[u8]) -> errno_t {
545+
unsafe { __wasi_path_remove_directory(fd, path.as_ptr(), path.len()) }
546+
}
547+
548+
pub fn poll_oneoff(in_: &[subscription_t], out: &mut [event_t]) -> (errno_t, usize) {
549+
assert!(out.len() >= in_.len());
550+
let mut nevents = MaybeUninit::<usize>::uninit();
551+
unsafe {
552+
(
553+
__wasi_poll_oneoff(
554+
in_.as_ptr(),
555+
out.as_mut_ptr(),
556+
in_.len(),
557+
nevents.as_mut_ptr(),
558+
),
559+
nevents.assume_init(),
560+
)
561+
}
562+
}
563+
564+
pub fn proc_exit(rval: exitcode_t) {
565+
unsafe { __wasi_proc_exit(rval) }
566+
}
567+
568+
pub fn proc_raise(sig: signal_t) -> errno_t {
569+
unsafe { __wasi_proc_raise(sig) }
570+
}
571+
572+
pub fn sock_recv(
573+
sock: fd_t,
574+
ri_data: &[iovec_t],
575+
ri_flags: riflags_t,
576+
) -> (errno_t, usize, roflags_t) {
577+
let mut ro_datalen = MaybeUninit::<usize>::uninit();
578+
let mut ro_flags = MaybeUninit::<roflags_t>::uninit();
579+
unsafe {
580+
(
581+
__wasi_sock_recv(
582+
sock,
583+
ri_data.as_ptr(),
584+
ri_data.len(),
585+
ri_flags,
586+
ro_datalen.as_mut_ptr(),
587+
ro_flags.as_mut_ptr(),
588+
),
589+
ro_datalen.assume_init(),
590+
ro_flags.assume_init(),
591+
)
592+
}
593+
}
594+
595+
pub fn sock_send(sock: fd_t, si_data: &[ciovec_t], si_flags: siflags_t) -> (errno_t, usize) {
596+
let mut so_datalen = MaybeUninit::<usize>::uninit();
597+
unsafe {
598+
(
599+
__wasi_sock_send(
600+
sock,
601+
si_data.as_ptr(),
602+
si_data.len(),
603+
si_flags,
604+
so_datalen.as_mut_ptr(),
605+
),
606+
so_datalen.assume_init(),
607+
)
608+
}
609+
}
610+
611+
pub fn sock_shutdown(sock: fd_t, how: sdflags_t) -> errno_t {
612+
unsafe { __wasi_sock_shutdown(sock, how) }
613+
}
614+
615+
pub fn sched_yield() -> errno_t {
616+
unsafe { __wasi_sched_yield() }
617+
}
618+
619+
pub fn fd_prestat_get(fd: fd_t) -> (errno_t, prestat_t) {
620+
let mut buf = MaybeUninit::<prestat_t>::uninit();
621+
unsafe {
622+
(
623+
__wasi_fd_prestat_get(fd, buf.as_mut_ptr()),
624+
buf.assume_init(),
625+
)
626+
}
627+
}
628+
629+
pub fn fd_prestat_dir_name(fd: fd_t, path: &mut [u8]) -> errno_t {
630+
unsafe { __wasi_fd_prestat_dir_name(fd, path.as_mut_ptr(), path.len()) }
631+
}
632+
633+
// TODO: Safe interfaces to the args and environ functions
634+
/*
635+
pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> errno_t {}
636+
pub fn args_sizes_get(argc: *mut usize, argv_buf_size: *mut usize) -> errno_t {}
637+
pub fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> errno_t {}
638+
pub fn environ_sizes_get(environ_count: *mut usize, environ_buf_size: *mut usize) -> errno_t {}
639+
*/

0 commit comments

Comments
 (0)