use std::fs::File;
use crate::align::AlignedBuf;
use crate::error::{Result, WalError};
pub(crate) fn zero_tail(buf: &mut AlignedBuf) {
let written = buf.len();
let cap = buf.capacity();
if written < cap {
unsafe {
std::ptr::write_bytes(buf.as_mut_ptr().add(written), 0, cap - written);
}
}
}
pub(crate) fn full_capacity_slice(buf: &AlignedBuf) -> &[u8] {
unsafe { std::slice::from_raw_parts(buf.as_ptr(), buf.capacity()) }
}
pub(crate) fn pwrite_all(file: &File, data: &[u8], offset: u64) -> Result<()> {
use std::os::unix::io::AsRawFd as _;
let fd = file.as_raw_fd();
let mut remaining = data;
let mut write_offset = offset;
while !remaining.is_empty() {
let n = unsafe {
libc::pwrite(
fd,
remaining.as_ptr() as *const libc::c_void,
remaining.len(),
write_offset as libc::off_t,
)
};
if n < 0 {
return Err(WalError::Io(std::io::Error::last_os_error()));
}
let n = n as usize;
remaining = &remaining[n..];
write_offset += n as u64;
}
Ok(())
}