summaryrefslogtreecommitdiff
path: root/lib/Linux/FANotify.pm
blob: a839574c71c50e8b60a881676f24f23fa782c275 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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_mark_mount, 
    CONST_open | CONST_close | CONST_event_on_child,
    0, '/tmp');
if ($ret < 0) {
    die "WTF? $ret";
}
 
my $buffer;#=perl_memalign(4096,8192); 
 
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;