@@ -359,12 +359,17 @@ pub unsafe extern "C" fn sys_getcwd(buf: *mut c_char, size: usize) -> *const c_c
359
359
return error ( Errno :: Inval ) ;
360
360
}
361
361
362
- let cwd = fs :: get_cwd ( ) ;
363
- if let Err ( e ) = cwd {
364
- return error ( e ) ;
362
+ if buf . is_null ( ) {
363
+ // Behavior unspecified
364
+ return error ( Errno :: Noent ) ;
365
365
}
366
366
367
- let Ok ( cwd) = cwd else { unreachable ! ( ) } ;
367
+ let cwd = match fs:: get_cwd ( ) {
368
+ Err ( e) => {
369
+ return error ( e) ;
370
+ }
371
+ Ok ( cwd) => cwd,
372
+ } ;
368
373
369
374
let Ok ( cwd) = CString :: new ( cwd) else {
370
375
return error ( Errno :: Noent ) ;
@@ -374,10 +379,6 @@ pub unsafe extern "C" fn sys_getcwd(buf: *mut c_char, size: usize) -> *const c_c
374
379
return error ( Errno :: Range ) ;
375
380
}
376
381
377
- if buf. is_null ( ) {
378
- return cwd. into_raw ( ) ;
379
- }
380
-
381
382
unsafe {
382
383
buf. copy_from ( cwd. as_ptr ( ) , size) ;
383
384
}
@@ -411,10 +412,9 @@ pub unsafe extern "C" fn sys_faccessat(
411
412
_mode : i32 ,
412
413
flags : i32 ,
413
414
) -> i32 {
414
- let access_option = AccessOption :: from_bits_truncate ( flags) ;
415
- if access_option. bits ( ) != flags {
415
+ let Some ( access_option) = AccessOption :: from_bits ( flags) else {
416
416
return -i32:: from ( Errno :: Inval ) ;
417
- }
417
+ } ;
418
418
419
419
let Ok ( name) = unsafe { CStr :: from_ptr ( name) } . to_str ( ) else {
420
420
return -i32:: from ( Errno :: Inval ) ;
@@ -436,25 +436,19 @@ pub unsafe extern "C" fn sys_faccessat(
436
436
return -i32:: from ( Errno :: Nosys ) ;
437
437
} ;
438
438
439
- if let Err ( e) = stat {
440
- return -i32:: from ( e) ;
441
- }
442
-
443
- let Ok ( stat) = stat else { unreachable ! ( ) } ;
444
- if access_option. can_access ( stat. st_mode ) {
445
- 0
446
- } else {
447
- -i32:: from ( Errno :: Acces )
439
+ match stat {
440
+ Err ( e) => -i32:: from ( e) ,
441
+ Ok ( stat) if access_option. can_access ( stat. st_mode ) => 0 ,
442
+ Ok ( _) => -i32:: from ( Errno :: Acces ) ,
448
443
}
449
444
}
450
445
451
446
#[ hermit_macro:: system]
452
447
#[ unsafe( no_mangle) ]
453
448
pub unsafe extern "C" fn sys_access ( name : * const c_char , flags : i32 ) -> i32 {
454
- let access_option = AccessOption :: from_bits_truncate ( flags) ;
455
- if access_option. bits ( ) != flags {
449
+ let Some ( access_option) = AccessOption :: from_bits ( flags) else {
456
450
return -i32:: from ( Errno :: Inval ) ;
457
- }
451
+ } ;
458
452
459
453
if access_option. contains ( AccessOption :: F_OK ) && access_option != AccessOption :: F_OK {
460
454
return -i32:: from ( Errno :: Inval ) ;
@@ -463,28 +457,20 @@ pub unsafe extern "C" fn sys_access(name: *const c_char, flags: i32) -> i32 {
463
457
let Ok ( name) = unsafe { CStr :: from_ptr ( name) } . to_str ( ) else {
464
458
return -i32:: from ( Errno :: Inval ) ;
465
459
} ;
466
- let stat = crate :: fs:: read_lstat ( name) ;
467
-
468
- if let Err ( e) = stat {
469
- return -i32:: from ( e) ;
470
- }
471
460
472
- let Ok ( stat) = stat else { unreachable ! ( ) } ;
473
-
474
- if access_option. can_access ( stat. st_mode ) {
475
- 0
476
- } else {
477
- -i32:: from ( Errno :: Acces )
461
+ match crate :: fs:: read_lstat ( name) {
462
+ Err ( e) => -i32:: from ( e) ,
463
+ Ok ( stat) if access_option. can_access ( stat. st_mode ) => 0 ,
464
+ Ok ( _) => -i32:: from ( Errno :: Acces ) ,
478
465
}
479
466
}
480
467
481
468
#[ hermit_macro:: system]
482
469
#[ unsafe( no_mangle) ]
483
470
pub unsafe extern "C" fn sys_fchmod ( fd : FileDescriptor , mode : u32 ) -> i32 {
484
- let access_permission = AccessPermission :: from_bits_truncate ( mode) ;
485
- if access_permission. bits ( ) != mode {
471
+ let Some ( access_permission) = AccessPermission :: from_bits ( mode) else {
486
472
return -i32:: from ( Errno :: Inval ) ;
487
- }
473
+ } ;
488
474
489
475
crate :: fd:: chmod ( fd, access_permission)
490
476
. map ( |( ) | 0 )
0 commit comments