@@ -273,8 +273,367 @@ pub fn fd_pread(fd: fd_t, iovs: &[iovec_t], offset: filesize_t) -> (errno_t, usi
273
273
}
274
274
}
275
275
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
+
276
286
pub fn random_get ( buf : & mut [ u8 ] ) -> errno_t {
277
287
unsafe { __wasi_random_get ( buf. as_mut_ptr ( ) as * mut c_void , buf. len ( ) ) }
278
288
}
279
289
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