Skip to content

Commit 60d73f5

Browse files
committed
syscalls: change some code to be more idiomatic
1 parent 97fd07c commit 60d73f5

File tree

1 file changed

+23
-37
lines changed

1 file changed

+23
-37
lines changed

src/syscalls/mod.rs

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,17 @@ pub unsafe extern "C" fn sys_getcwd(buf: *mut c_char, size: usize) -> *const c_c
359359
return error(Errno::Inval);
360360
}
361361

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);
365365
}
366366

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+
};
368373

369374
let Ok(cwd) = CString::new(cwd) else {
370375
return error(Errno::Noent);
@@ -374,10 +379,6 @@ pub unsafe extern "C" fn sys_getcwd(buf: *mut c_char, size: usize) -> *const c_c
374379
return error(Errno::Range);
375380
}
376381

377-
if buf.is_null() {
378-
return cwd.into_raw();
379-
}
380-
381382
unsafe {
382383
buf.copy_from(cwd.as_ptr(), size);
383384
}
@@ -411,10 +412,9 @@ pub unsafe extern "C" fn sys_faccessat(
411412
_mode: i32,
412413
flags: i32,
413414
) -> 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 {
416416
return -i32::from(Errno::Inval);
417-
}
417+
};
418418

419419
let Ok(name) = unsafe { CStr::from_ptr(name) }.to_str() else {
420420
return -i32::from(Errno::Inval);
@@ -436,25 +436,19 @@ pub unsafe extern "C" fn sys_faccessat(
436436
return -i32::from(Errno::Nosys);
437437
};
438438

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),
448443
}
449444
}
450445

451446
#[hermit_macro::system]
452447
#[unsafe(no_mangle)]
453448
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 {
456450
return -i32::from(Errno::Inval);
457-
}
451+
};
458452

459453
if access_option.contains(AccessOption::F_OK) && access_option != AccessOption::F_OK {
460454
return -i32::from(Errno::Inval);
@@ -463,28 +457,20 @@ pub unsafe extern "C" fn sys_access(name: *const c_char, flags: i32) -> i32 {
463457
let Ok(name) = unsafe { CStr::from_ptr(name) }.to_str() else {
464458
return -i32::from(Errno::Inval);
465459
};
466-
let stat = crate::fs::read_lstat(name);
467-
468-
if let Err(e) = stat {
469-
return -i32::from(e);
470-
}
471460

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),
478465
}
479466
}
480467

481468
#[hermit_macro::system]
482469
#[unsafe(no_mangle)]
483470
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 {
486472
return -i32::from(Errno::Inval);
487-
}
473+
};
488474

489475
crate::fd::chmod(fd, access_permission)
490476
.map(|()| 0)

0 commit comments

Comments
 (0)