File Coverage

blib/lib/Linux/Inotify2.pm
Criterion Covered Total %
statement 50 61 81.9
branch 10 20 50.0
condition n/a
subroutine 13 23 56.5
pod 6 6 100.0
total 79 110 71.8


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             Linux::Inotify2 - scalable directory/file change notification
4              
5             =head1 SYNOPSIS
6              
7             =head2 Callback Interface
8              
9             use Linux::Inotify2;
10              
11             # create a new object
12             my $inotify = new Linux::Inotify2
13             or die "unable to create new inotify object: $!";
14            
15             # add watchers
16             $inotify->watch ("/etc/passwd", IN_ACCESS, sub {
17             my $e = shift;
18             my $name = $e->fullname;
19             print "$name was accessed\n" if $e->IN_ACCESS;
20             print "$name is no longer mounted\n" if $e->IN_UNMOUNT;
21             print "$name is gone\n" if $e->IN_IGNORED;
22             print "events for $name have been lost\n" if $e->IN_Q_OVERFLOW;
23            
24             # cancel this watcher: remove no further events
25             $e->w->cancel;
26             });
27              
28             # integration into AnyEvent (works with EV, Glib, Tk, POE...)
29             my $inotify_w = AnyEvent->io (
30             fh => $inofity->fileno, poll => 'r', cb => sub { $inotify->poll }
31             );
32              
33             # manual event loop
34             1 while $inotify->poll;
35              
36             =head2 Streaming Interface
37              
38             use Linux::Inotify2 ;
39              
40             # create a new object
41             my $inotify = new Linux::Inotify2
42             or die "Unable to create new inotify object: $!" ;
43              
44             # create watch
45             $inotify->watch ("/etc/passwd", IN_ACCESS)
46             or die "watch creation failed" ;
47              
48             while () {
49             my @events = $inotify->read;
50             unless (@events > 0) {
51             print "read error: $!";
52             last ;
53             }
54             printf "mask\t%d\n", $_->mask foreach @events ;
55             }
56              
57             =head1 DESCRIPTION
58              
59             This module implements an interface to the Linux 2.6.13 and later Inotify
60             file/directory change notification system.
61              
62             It has a number of advantages over the Linux::Inotify module:
63              
64             - it is portable (Linux::Inotify only works on x86)
65             - the equivalent of fullname works correctly
66             - it is better documented
67             - it has callback-style interface, which is better suited for
68             integration.
69              
70             =head2 The Linux::Inotify2 Class
71              
72             =over 4
73              
74             =cut
75              
76             package Linux::Inotify2;
77              
78 2     2   375423 use Carp ();
  2         6  
  2         47  
79 2     2   13 use Fcntl ();
  2         4  
  2         34  
80 2     2   13 use Scalar::Util ();
  2         9  
  2         37  
81              
82 2     2   7993 use common::sense;
  2         24  
  2         14  
83              
84 2     2   326 use base 'Exporter';
  2         7  
  2         540  
85              
86             BEGIN {
87 2     2   6 our $VERSION = '1.22';
88 2         10 our @EXPORT = qw(
89             IN_ACCESS IN_MODIFY IN_ATTRIB IN_CLOSE_WRITE
90             IN_CLOSE_NOWRITE IN_OPEN IN_MOVED_FROM IN_MOVED_TO
91             IN_CREATE IN_DELETE IN_DELETE_SELF IN_MOVE_SELF
92             IN_ALL_EVENTS
93             IN_UNMOUNT IN_Q_OVERFLOW IN_IGNORED
94             IN_CLOSE IN_MOVE
95             IN_ISDIR IN_ONESHOT IN_MASK_ADD IN_DONT_FOLLOW IN_ONLYDIR
96             );
97              
98 2         13 require XSLoader;
99 2         5599 XSLoader::load Linux::Inotify2, $VERSION;
100             }
101              
102             =item my $inotify = new Linux::Inotify2
103              
104             Create a new notify object and return it. A notify object is kind of a
105             container that stores watches on file system names and is responsible for
106             handling event data.
107              
108             On error, C<undef> is returned and C<$!> will be set accordingly. The
109             following errors are documented:
110              
111             ENFILE The system limit on the total number of file descriptors has been reached.
112             EMFILE The user limit on the total number of inotify instances has been reached.
113             ENOMEM Insufficient kernel memory is available.
114              
115             Example:
116              
117             my $inotify = new Linux::Inotify2
118             or die "Unable to create new inotify object: $!";
119              
120             =cut
121              
122             sub new {
123 1     1 1 13 my ($class) = @_;
124              
125 1         20 my $fd = inotify_init;
126              
127 1 50       5 return unless $fd >= 0;
128              
129 1         9 bless { fd => $fd }, $class
130             }
131              
132             =item $watch = $inotify->watch ($name, $mask[, $cb])
133              
134             Add a new watcher to the given notifier. The watcher will create events
135             on the pathname C<$name> as given in C<$mask>, which can be any of the
136             following constants (all exported by default) ORed together.
137              
138             "file" refers to any file system object in the watched object (always a
139             directory), that is files, directories, symlinks, device nodes etc., while
140             "object" refers to the object the watcher has been set on itself:
141              
142             IN_ACCESS object was accessed
143             IN_MODIFY object was modified
144             IN_ATTRIB object metadata changed
145             IN_CLOSE_WRITE writable fd to file / to object was closed
146             IN_CLOSE_NOWRITE readonly fd to file / to object closed
147             IN_OPEN object was opened
148             IN_MOVED_FROM file was moved from this object (directory)
149             IN_MOVED_TO file was moved to this object (directory)
150             IN_CREATE file was created in this object (directory)
151             IN_DELETE file was deleted from this object (directory)
152             IN_DELETE_SELF object itself was deleted
153             IN_MOVE_SELF object itself was moved
154             IN_ALL_EVENTS all of the above events
155              
156             IN_ONESHOT only send event once
157             IN_ONLYDIR only watch the path if it is a directory
158             IN_DONT_FOLLOW don't follow a sym link
159             IN_MASK_ADD not supported with the current version of this module
160              
161             IN_CLOSE same as IN_CLOSE_WRITE | IN_CLOSE_NOWRITE
162             IN_MOVE same as IN_MOVED_FROM | IN_MOVED_TO
163              
164             C<$cb> is a perl code reference that, if given, is called for each
165             event. It receives a C<Linux::Inotify2::Event> object.
166              
167             The returned C<$watch> object is of class C<Linux::Inotify2::Watch>.
168              
169             On error, C<undef> is returned and C<$!> will be set accordingly. The
170             following errors are documented:
171              
172             EBADF The given file descriptor is not valid.
173             EINVAL The given event mask contains no legal events.
174             ENOMEM Insufficient kernel memory was available.
175             ENOSPC The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource.
176             EACCESS Read access to the given file is not permitted.
177              
178             Example, show when C</etc/passwd> gets accessed and/or modified once:
179              
180             $inotify->watch ("/etc/passwd", IN_ACCESS | IN_MODIFY, sub {
181             my $e = shift;
182             print "$e->{w}{name} was accessed\n" if $e->IN_ACCESS;
183             print "$e->{w}{name} was modified\n" if $e->IN_MODIFY;
184             print "$e->{w}{name} is no longer mounted\n" if $e->IN_UNMOUNT;
185             print "events for $e->{w}{name} have been lost\n" if $e->IN_Q_OVERFLOW;
186              
187             $e->w->cancel;
188             });
189              
190             =cut
191              
192             sub watch {
193 1     1 1 972 my ($self, $name, $mask, $cb) = @_;
194              
195 1         31 my $wd = inotify_add_watch $self->{fd}, $name, $mask;
196              
197 1 50       7 return unless $wd >= 0;
198            
199 1         19 my $w = $self->{w}{$wd} = bless {
200             inotify => $self,
201             wd => $wd,
202             name => $name,
203             mask => $mask,
204             cb => $cb,
205             }, "Linux::Inotify2::Watch";
206              
207 1         14 Scalar::Util::weaken $w->{inotify};
208              
209 1         4 $w
210             }
211              
212             =item $inotify->fileno
213              
214             Returns the file descriptor for this notify object. When in non-blocking
215             mode, you are responsible for calling the C<poll> method when this file
216             descriptor becomes ready for reading.
217              
218             =cut
219              
220             sub fileno {
221 0     0 1 0 $_[0]{fd}
222             }
223              
224             =item $inotify->blocking ($blocking)
225              
226             Clears ($blocking true) or sets ($blocking false) the C<O_NONBLOCK> flag on the file descriptor.
227              
228             =cut
229              
230             sub blocking {
231 1     1 1 504 my ($self, $blocking) = @_;
232              
233 1         10 inotify_blocking $self->{fd}, $blocking;
234             }
235              
236             =item $count = $inotify->poll
237              
238             Reads events from the kernel and handles them. If the notify file
239             descriptor is blocking (the default), then this method waits for at least
240             one event (and thus returns true unless an error occurs). Otherwise it
241             returns immediately when no pending events could be read.
242              
243             Returns the count of events that have been handled.
244              
245             =cut
246              
247             sub poll {
248 1     1 1 1257 scalar &read
249             }
250              
251             =item @events = $inotify->read
252              
253             Reads events from the kernel. Blocks when the file descriptor is in
254             blocking mode (default) until any event arrives. Returns list of
255             C<Linux::Inotify2::Event> objects or empty list if none (non-blocking
256             mode) or error occurred ($! should be checked).
257              
258             Normally you shouldn't use this function, but instead use watcher
259             callbacks and call C<< ->poll >>.
260              
261             =cut
262              
263             sub read {
264 2     2 1 11 my ($self) = @_;
265              
266 2         24 my @ev = inotify_read $self->{fd};
267 2         5 my @res;
268              
269 2         6 for (@ev) {
270 2 100       15 my $w = $_->{w} = $self->{w}{$_->{wd}}
271             or next; # no such watcher
272              
273 1 50       5 exists $self->{ignore}{$_->{wd}}
274             and next; # watcher has been canceled
275              
276 1         4 bless $_, "Linux::Inotify2::Event";
277              
278 1         2 push @res, $_;
279              
280 1 50       4 $w->{cb}->($_) if $w->{cb};
281 1 50       11 $w->cancel if $_->{mask} & (IN_IGNORED | IN_UNMOUNT | IN_ONESHOT | IN_DELETE_SELF);
282             }
283              
284 2         7 delete $self->{ignore};
285              
286             @res
287 2         14 }
288              
289             sub DESTROY {
290 1     1   485 inotify_close $_[0]{fd}
291             }
292              
293             =back
294              
295             =head2 The Linux::Inotify2::Event Class
296              
297             Objects of this class are handed as first argument to the watcher
298             callback. It has the following members and methods:
299              
300             =over 4
301              
302             =item $event->w
303              
304             =item $event->{w}
305              
306             The watcher object for this event.
307              
308             =item $event->name
309              
310             =item $event->{name}
311              
312             The path of the file system object, relative to the watched name.
313              
314             =item $event->fullname
315              
316             Returns the "full" name of the relevant object, i.e. including the C<name>
317             member of the watcher (if the watch object is on a directory and a
318             directory entry is affected), or simply the C<name> member itself when the
319             object is the watch object itself.
320              
321             =item $event->mask
322              
323             =item $event->{mask}
324              
325             The received event mask. In addition to the events described for C<<
326             $inotify->watch >>, the following flags (exported by default) can be set:
327              
328             IN_ISDIR event object is a directory
329             IN_Q_OVERFLOW event queue overflowed
330              
331             # when any of the following flags are set,
332             # then watchers for this event are automatically canceled
333             IN_UNMOUNT filesystem for watched object was unmounted
334             IN_IGNORED file was ignored/is gone (no more events are delivered)
335             IN_ONESHOT only one event was generated
336              
337             =item $event->IN_xxx
338              
339             Returns a boolean that returns true if the event mask contains any events
340             specified by the mask. All of the C<IN_xxx> constants can be used as
341             methods.
342              
343             =item $event->cookie
344              
345             =item $event->{cookie}
346              
347             The event cookie to "synchronize two events". Normally zero, this value is
348             set when two events relating to the same file are generated. As far as I
349             know, this only happens for C<IN_MOVED_FROM> and C<IN_MOVED_TO> events, to
350             identify the old and new name of a file.
351              
352             =back
353              
354             =cut
355              
356             package Linux::Inotify2::Event;
357              
358 0     0   0 sub w { $_[0]{w} }
359 0     0   0 sub name { $_[0]{name} }
360 0     0   0 sub mask { $_[0]{mask} }
361 0     0   0 sub cookie { $_[0]{cookie} }
362              
363             sub fullname {
364 0 0   0   0 length $_[0]{name}
365             ? "$_[0]{w}{name}/$_[0]{name}"
366             : $_[0]{w}{name};
367             }
368              
369             for my $name (@Linux::Inotify2::EXPORT) {
370             my $mask = &{"Linux::Inotify2::$name"};
371              
372 0     0   0 *$name = sub { $_[0]{mask} & $mask };
373             }
374              
375             =head2 The Linux::Inotify2::Watch Class
376              
377             Watcher objects are created by calling the C<watch> method of a notifier.
378              
379             It has the following members and methods:
380              
381             =over 4
382              
383             =item $watch->name
384              
385             =item $watch->{name}
386              
387             The name as specified in the C<watch> call. For the object itself, this is
388             the empty string. For directory watches, this is the name of the entry
389             without leading path elements.
390              
391             =item $watch->mask
392              
393             =item $watch->{mask}
394              
395             The mask as specified in the C<watch> call.
396              
397             =item $watch->cb ([new callback])
398              
399             =item $watch->{cb}
400              
401             The callback as specified in the C<watch> call. Can optionally be changed.
402              
403             =item $watch->cancel
404              
405             Cancels/removes this watcher. Future events, even if already queued queued,
406             will not be handled and resources will be freed.
407              
408             =back
409              
410             =cut
411              
412             package Linux::Inotify2::Watch;
413              
414 0     0   0 sub name { $_[0]{name} }
415 0     0   0 sub mask { $_[0]{mask} }
416              
417             sub cb {
418 0 0   0   0 $_[0]{cb} = $_[1] if @_ > 1;
419 0         0 $_[0]{cb}
420             }
421              
422             sub cancel {
423 2     2   407 my ($self) = @_;
424              
425 2 100       9 my $inotify = delete $self->{inotify}
426             or return 1; # already canceled
427              
428 1         3 delete $inotify->{w}{$self->{wd}}; # we are no longer there
429 1         3 $inotify->{ignore}{$self->{wd}} = 1; # ignore further events for one poll
430              
431 1 50       10 (Linux::Inotify2::inotify_rm_watch $inotify->{fd}, $self->{wd})
432             ? 1 : undef
433             }
434              
435             =head1 SEE ALSO
436              
437             L<AnyEvent>, L<Linux::Inotify>.
438              
439             =head1 AUTHOR
440              
441             Marc Lehmann <schmorp@schmorp.de>
442             http://home.schmorp.de/
443              
444             =cut
445              
446             1