blob: 102883220aa68066c405242df0e82ef79a0c286d [file] [log] [blame]
use std::{
mem,
os::unix::io::RawFd
};
use inotify_sys as ffi;
use libc::{
c_void,
size_t,
};
pub fn read_into_buffer(fd: RawFd, buffer: &mut [u8]) -> isize {
unsafe {
// Discard the unaligned portion, if any, of the supplied buffer
let buffer = align_buffer_mut(buffer);
ffi::read(
fd,
buffer.as_mut_ptr() as *mut c_void,
buffer.len() as size_t
)
}
}
pub fn align_buffer(buffer: &[u8]) -> &[u8] {
if buffer.len() >= mem::align_of::<ffi::inotify_event>() {
let ptr = buffer.as_ptr();
let offset = ptr.align_offset(mem::align_of::<ffi::inotify_event>());
&buffer[offset..]
} else {
&buffer[0..0]
}
}
pub fn align_buffer_mut(buffer: &mut [u8]) -> &mut [u8] {
if buffer.len() >= mem::align_of::<ffi::inotify_event>() {
let ptr = buffer.as_mut_ptr();
let offset = ptr.align_offset(mem::align_of::<ffi::inotify_event>());
&mut buffer[offset..]
} else {
&mut buffer[0..0]
}
}