package Linux::FANotify;
use strict;
use warnings;
use Linux::FANotify::LowLevel ':constants',':functions';
use POSIX qw();
use Data::Printer;
my $fan_fd = perl_fanotify_init(0,0);
warn "fan fd: $fan_fd $!";
my $fan_fh;open($fan_fh,'<&=',$fan_fd);
my $ret = perl_fanotify_mark(
$fan_fd,
CONST_mark_add,
CONST_open | CONST_close | CONST_event_on_child,
0, '/tmp');
if ($ret < 0) {
die "WTF? $ret";
}
my $buffer;
sub program_for_pid {
my ($pid) = @_;
my $ret = "<unknown program ($pid)>";
open my $fh,'<',"/proc/$pid/cmdline" or return $ret;
my $cmdline = do { local $/;<$fh> };chomp $cmdline;
return $cmdline || $ret;
}
sub print_event {
my ($ev) = @_;
my $procname = program_for_pid($ev->{pid});
my $filename = readlink "/proc/self/fd/".$ev->{fd};
$filename ||= "<unknown file ($ev->{fd})>";
my $mask = $ev->{mask};
print "$procname ($mask) $filename\n";
POSIX::close($ev->{fd});
}
while (1) {
my $len = sysread($fan_fh,$buffer,8192,0);
my $ret = unpack_events($buffer);
for my $ev (@$ret) {
print_event($ev);
}
}
close $fan_fh;