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())]
|
#[clap(long, short, default_values_t=default_providers())]
|
||||||
providers: Vec<String>,
|
providers: Vec<String>,
|
||||||
|
|
||||||
#[clap(long, short)]
|
#[clap(long, short, default_values_t=default_init_flags())]
|
||||||
init_flags: Vec<String>,
|
init_flags: Vec<String>,
|
||||||
#[clap(long, short, default_values_t=default_event_f_flags())]
|
#[clap(long, short, default_values_t=default_event_f_flags())]
|
||||||
event_f_flags: Vec<String>,
|
event_f_flags: Vec<String>,
|
||||||
@ -61,6 +61,13 @@ fn default_providers() -> Vec<String> {
|
|||||||
vec!["tee".to_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> {
|
fn default_event_f_flags() -> Vec<String> {
|
||||||
vec!["O_RDWR", "O_LARGEFILE"]
|
vec!["O_RDWR", "O_LARGEFILE"]
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -91,17 +91,30 @@ impl Fanotify {
|
|||||||
}
|
}
|
||||||
let nread = nread as usize;
|
let nread = nread as usize;
|
||||||
let mut offset = 0;
|
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 {
|
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(
|
std::ptr::copy(
|
||||||
buffer.as_ptr().add(offset),
|
buffer.as_ptr().add(offset),
|
||||||
event.as_mut_ptr().cast(),
|
uninited.as_mut_ptr().cast(),
|
||||||
EVENT_SIZE,
|
EVENT_SIZE,
|
||||||
);
|
);
|
||||||
|
let event = uninited.assume_init();
|
||||||
|
|
||||||
result.push(Event(event.assume_init()));
|
// #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:
|
||||||
offset += EVENT_SIZE;
|
// 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