diff options
Diffstat (limited to 'fanotify.c')
-rw-r--r-- | fanotify.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/fanotify.c b/fanotify.c new file mode 100644 index 0000000..c8a7e37 --- /dev/null +++ b/fanotify.c @@ -0,0 +1,86 @@ +#include "defs.h" +#include <linux/fanotify.h> + +static const struct xlat fan_classes[] = { + XLAT(FAN_CLASS_NOTIF), + XLAT(FAN_CLASS_CONTENT), + XLAT(FAN_CLASS_PRE_CONTENT), + XLAT_END +}; + +static const struct xlat fan_init_flags[] = { + XLAT(FAN_CLOEXEC), + XLAT(FAN_NONBLOCK), + XLAT(FAN_UNLIMITED_QUEUE), + XLAT(FAN_UNLIMITED_MARKS), + XLAT_END +}; + +int +sys_fanotify_init(struct tcb *tcp) +{ + unsigned flags; + + if (exiting(tcp)) + return 0; + + flags = tcp->u_arg[0]; + printxval(fan_classes, flags & FAN_ALL_CLASS_BITS, "FAN_CLASS_???"); + flags &= ~FAN_ALL_CLASS_BITS; + if (flags) { + tprints("|"); + printflags(fan_init_flags, flags, "FAN_???"); + } + tprints(", "); + tprint_open_modes((unsigned) tcp->u_arg[1]); + + return 0; +} + +static const struct xlat fan_mark_flags[] = { + XLAT(FAN_MARK_ADD), + XLAT(FAN_MARK_REMOVE), + XLAT(FAN_MARK_DONT_FOLLOW), + XLAT(FAN_MARK_ONLYDIR), + XLAT(FAN_MARK_MOUNT), + XLAT(FAN_MARK_IGNORED_MASK), + XLAT(FAN_MARK_IGNORED_SURV_MODIFY), + XLAT(FAN_MARK_FLUSH), + XLAT_END +}; + +static const struct xlat fan_event_flags[] = { + XLAT(FAN_ACCESS), + XLAT(FAN_MODIFY), + XLAT(FAN_CLOSE), + XLAT(FAN_CLOSE_WRITE), + XLAT(FAN_CLOSE_NOWRITE), + XLAT(FAN_OPEN), + XLAT(FAN_Q_OVERFLOW), + XLAT(FAN_OPEN_PERM), + XLAT(FAN_ACCESS_PERM), + XLAT(FAN_ONDIR), + XLAT(FAN_EVENT_ON_CHILD), + XLAT_END +}; + +int +sys_fanotify_mark(struct tcb *tcp) +{ + if (exiting(tcp)) + return 0; + + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printflags(fan_mark_flags, (unsigned) tcp->u_arg[1], "FAN_MARK_???"); + tprints(", "); + printflags(fan_event_flags, tcp->u_arg[2], "FAN_???"); + tprints(", "); + if ((int) tcp->u_arg[3] == FAN_NOFD) + tprints("FAN_NOFD, "); + else + print_dirfd(tcp, tcp->u_arg[3]); + printpath(tcp, tcp->u_arg[4]); + + return 0; +} |