use core::ffi::CStr;
use crate::{
AsCStr, AtFlags, Syscall, Timespec, Timestamps, fd::AsFd, syscall_result_unit,
syscall4_readonly,
};
use bitflags::bitflags;
use linux_raw_sys::general::{AT_EMPTY_PATH, AT_SYMLINK_NOFOLLOW};
#[inline]
pub fn utimensat<Fd: AsFd, P: AsCStr>(
fd: Fd,
path: impl Into<Option<P>>,
times: &Timestamps,
flags: AtFlags,
) -> crate::Result<()> {
match path.into() {
Some(path) => path.try_as_c_str(|path| {
syscall_result_unit(unsafe {
syscall4_readonly(
Syscall::UTIMENSAT,
fd.as_fd(),
path,
&raw const *times,
flags.bits(),
)
})
}),
None => syscall_result_unit(unsafe {
syscall4_readonly(
Syscall::UTIMENSAT,
fd.as_fd(),
None::<&CStr>,
&raw const *times,
flags.bits(),
)
}),
}
}