small step to implement extra metadatas
This commit is contained in:
parent
c07a87309d
commit
6cfdec1d3c
@ -159,7 +159,13 @@ fn main() -> Result<(), Error> {
|
|||||||
}
|
}
|
||||||
for event in events.iter_mut() {
|
for event in events.iter_mut() {
|
||||||
let Some(fd) = event.fd() else {
|
let Some(fd) = event.fd() else {
|
||||||
|
if init_flags & (InitFlags::FAN_REPORT_FID | InitFlags::FAN_REPORT_DIR_FID)
|
||||||
|
!= InitFlags::empty()
|
||||||
|
{
|
||||||
|
warn!("fid not implementd");
|
||||||
|
} else {
|
||||||
warn!("queue full");
|
warn!("queue full");
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
let path = match std::fs::read_link(format!("/proc/self/fd/{}", fd.as_raw_fd())) {
|
let path = match std::fs::read_link(format!("/proc/self/fd/{}", fd.as_raw_fd())) {
|
||||||
|
@ -114,7 +114,7 @@ impl Fanotify {
|
|||||||
// + (meta) -> event_len // add event_len to move to next
|
// + (meta) -> event_len // add event_len to move to next
|
||||||
// );
|
// );
|
||||||
offset += event.event_len as usize;
|
offset += event.event_len as usize;
|
||||||
result.push(Event(event));
|
result.push(Event::new(event));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,35 +136,42 @@ impl Fanotify {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Event(pub libc::fanotify_event_metadata);
|
pub struct Event {
|
||||||
|
pub fanotify_event_metadata: libc::fanotify_event_metadata,
|
||||||
|
}
|
||||||
|
|
||||||
impl Event {
|
impl Event {
|
||||||
|
fn new(fanotify_event_metadata: libc::fanotify_event_metadata) -> Self {
|
||||||
|
Self {
|
||||||
|
fanotify_event_metadata,
|
||||||
|
}
|
||||||
|
}
|
||||||
// compatible to nix::sys::fanotify::FanotifyEvent
|
// compatible to nix::sys::fanotify::FanotifyEvent
|
||||||
pub fn metadata_version(&self) -> u8 {
|
pub fn metadata_version(&self) -> u8 {
|
||||||
self.0.vers
|
self.fanotify_event_metadata.vers
|
||||||
}
|
}
|
||||||
pub fn check_metadata_version(&self) -> bool {
|
pub fn check_metadata_version(&self) -> bool {
|
||||||
self.0.vers == libc::FANOTIFY_METADATA_VERSION
|
self.fanotify_event_metadata.vers == libc::FANOTIFY_METADATA_VERSION
|
||||||
}
|
}
|
||||||
pub fn fd(&self) -> Option<BorrowedFd> {
|
pub fn fd(&self) -> Option<BorrowedFd> {
|
||||||
if self.0.fd == libc::FAN_NOFD {
|
if self.fanotify_event_metadata.fd == libc::FAN_NOFD {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(unsafe { BorrowedFd::borrow_raw(self.0.fd) })
|
Some(unsafe { BorrowedFd::borrow_raw(self.fanotify_event_metadata.fd) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn pid(&self) -> i32 {
|
pub fn pid(&self) -> i32 {
|
||||||
self.0.pid
|
self.fanotify_event_metadata.pid
|
||||||
}
|
}
|
||||||
pub fn mask(&self) -> MaskFlags {
|
pub fn mask(&self) -> MaskFlags {
|
||||||
MaskFlags::from_bits_truncate(self.0.mask)
|
MaskFlags::from_bits_truncate(self.fanotify_event_metadata.mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sometimes we don't want to close the fd immediately, so we forget about it, store it somewhere, and drop it later
|
// sometimes we don't want to close the fd immediately, so we forget about it, store it somewhere, and drop it later
|
||||||
// it is safe to just call this method without store it in variable, it will be dropped immediately due to the nature of rust
|
// it is safe to just call this method without store it in variable, it will be dropped immediately due to the nature of rust
|
||||||
pub fn forget_fd(&mut self) -> OwnedFd {
|
pub fn forget_fd(&mut self) -> OwnedFd {
|
||||||
let fd = self.0.fd;
|
let fd = self.fanotify_event_metadata.fd;
|
||||||
self.0.fd = libc::FAN_NOFD;
|
self.fanotify_event_metadata.fd = libc::FAN_NOFD;
|
||||||
|
|
||||||
unsafe { OwnedFd::from_raw_fd(fd) }
|
unsafe { OwnedFd::from_raw_fd(fd) }
|
||||||
}
|
}
|
||||||
@ -172,11 +179,11 @@ impl Event {
|
|||||||
|
|
||||||
impl Drop for Event {
|
impl Drop for Event {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if self.0.fd == libc::FAN_NOFD {
|
if self.fanotify_event_metadata.fd == libc::FAN_NOFD {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let e = unsafe { libc::close(self.0.fd) };
|
let e = unsafe { libc::close(self.fanotify_event_metadata.fd) };
|
||||||
if !std::thread::panicking() && e == libc::EBADF {
|
if !std::thread::panicking() && e == libc::EBADF {
|
||||||
panic!("Closing an invalid file descriptor!");
|
panic!("Closing an invalid file descriptor!");
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user