fix read_events if extra metadata is filled into read buffer
This commit is contained in:
parent
936bc7c43d
commit
c07a87309d
@ -45,7 +45,7 @@ struct Args {
|
||||
#[clap(long, short, default_values_t=default_providers())]
|
||||
providers: Vec<String>,
|
||||
|
||||
#[clap(long, short)]
|
||||
#[clap(long, short, default_values_t=default_init_flags())]
|
||||
init_flags: Vec<String>,
|
||||
#[clap(long, short, default_values_t=default_event_f_flags())]
|
||||
event_f_flags: Vec<String>,
|
||||
@ -61,6 +61,13 @@ fn default_providers() -> Vec<String> {
|
||||
vec!["tee".to_string()]
|
||||
}
|
||||
|
||||
fn default_init_flags() -> Vec<String> {
|
||||
vec!["FAN_CLASS_NOTIF", "FAN_REPORT_FID"]
|
||||
.iter()
|
||||
.map(|s| s.to_string())
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn default_event_f_flags() -> Vec<String> {
|
||||
vec!["O_RDWR", "O_LARGEFILE"]
|
||||
.iter()
|
||||
|
@ -91,17 +91,30 @@ impl Fanotify {
|
||||
}
|
||||
let nread = nread as usize;
|
||||
let mut offset = 0;
|
||||
// #define FAN_EVENT_OK(meta, len) \
|
||||
// ((long)(len) => (long)FAN_EVENT_METADATA_LEN) && // rest buffer can contain a metadata struct
|
||||
// (long)(meta) ->event_len >= (long)FAN_FAN_EVENT_METADATA_LEN && // struct contains valid size (not implemented)
|
||||
// (long)(meta) ->event_len <= (long)(len) // struct does not read over buffer boundary (not implemented)
|
||||
while offset + EVENT_SIZE <= nread {
|
||||
let mut event: MaybeUninit<libc::fanotify_event_metadata> = MaybeUninit::uninit();
|
||||
let mut uninited: MaybeUninit<libc::fanotify_event_metadata> = MaybeUninit::uninit();
|
||||
std::ptr::copy(
|
||||
buffer.as_ptr().add(offset),
|
||||
event.as_mut_ptr().cast(),
|
||||
uninited.as_mut_ptr().cast(),
|
||||
EVENT_SIZE,
|
||||
);
|
||||
let event = uninited.assume_init();
|
||||
|
||||
result.push(Event(event.assume_init()));
|
||||
|
||||
offset += EVENT_SIZE;
|
||||
// #define FAN_EVENT_NEXT(meta, len) ((len) -= (meta)->event_len, (struct fanotify_event_metadata*)(((char*)(meta)) + (meta) -> event_len)
|
||||
// meta = FAN_EVENT_NEXT(meta, len) translate to:
|
||||
// len -= meta->event_len; // shrink rest length
|
||||
// , // comma operator, evaluate first express, but not using its result
|
||||
//
|
||||
// meta = (struct fanotify_event_metadata*) ( // cast pointer back to metadata type
|
||||
// ((char*)(meta)) // discard metadata type to increase pointer by 1
|
||||
// + (meta) -> event_len // add event_len to move to next
|
||||
// );
|
||||
offset += event.event_len as usize;
|
||||
result.push(Event(event));
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user