ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-Inotify2/Inotify2.pm
Revision: 1.34
Committed: Sat Jul 31 11:47:05 2021 UTC (2 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rel-2_3, HEAD
Changes since 1.33: +13 -6 lines
Log Message:
2.3

File Contents

# Content
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 = AE::io $inotify->fileno, 0, sub { $inotify->poll };
30
31 # manual event loop
32 $inotify->poll while 1;
33
34 =head2 Streaming Interface
35
36 use Linux::Inotify2;
37
38 # create a new object
39 my $inotify = new Linux::Inotify2
40 or die "Unable to create new inotify object: $!";
41
42 # create watch
43 $inotify->watch ("/etc/passwd", IN_ACCESS)
44 or die "watch creation failed";
45
46 while () {
47 my @events = $inotify->read;
48 printf "mask\t%d\n", $_->mask foreach @events;
49 }
50
51 =head1 DESCRIPTION
52
53 This module implements an interface to the Linux 2.6.13 and later Inotify
54 file/directory change notification system.
55
56 It has a number of advantages over the Linux::Inotify module:
57
58 - it is portable (Linux::Inotify only works on x86)
59 - the equivalent of fullname works correctly
60 - it is better documented
61 - it has callback-style interface, which is better suited for
62 integration.
63
64 As for the inotify API itself - it is a very tricky, and somewhat
65 unreliable API. For a good overview of the challenges you might run into,
66 see this LWN article: L<https://lwn.net/Articles/605128/>.
67
68 =head2 The Linux::Inotify2 Class
69
70 =over 4
71
72 =cut
73
74 package Linux::Inotify2;
75
76 use Scalar::Util ();
77
78 use common::sense;
79
80 use Exporter qw(import);
81
82 BEGIN {
83 our $VERSION = '2.3';
84 our @EXPORT = qw(
85 IN_ACCESS IN_MODIFY IN_ATTRIB IN_CLOSE_WRITE
86 IN_CLOSE_NOWRITE IN_OPEN IN_MOVED_FROM IN_MOVED_TO
87 IN_CREATE IN_DELETE IN_DELETE_SELF IN_MOVE_SELF
88 IN_ALL_EVENTS
89 IN_UNMOUNT IN_Q_OVERFLOW IN_IGNORED
90 IN_CLOSE IN_MOVE
91 IN_ISDIR IN_ONESHOT IN_MASK_ADD
92 IN_DONT_FOLLOW IN_EXCL_UNLINK IN_ONLYDIR
93 );
94
95 require XSLoader;
96 XSLoader::load Linux::Inotify2, $VERSION;
97 }
98
99 =item my $inotify = new Linux::Inotify2
100
101 Create a new notify object and return it. A notify object is kind of a
102 container that stores watches on file system names and is responsible for
103 handling event data.
104
105 On error, C<undef> is returned and C<$!> will be set accordingly. The
106 following errors are documented:
107
108 ENFILE The system limit on the total number of file descriptors has been reached.
109 EMFILE The user limit on the total number of inotify instances has been reached.
110 ENOMEM Insufficient kernel memory is available.
111
112 Example:
113
114 my $inotify = new Linux::Inotify2
115 or die "Unable to create new inotify object: $!";
116
117 =cut
118
119 sub new {
120 my ($class) = @_;
121
122 my $fd = inotify_init;
123
124 return unless $fd >= 0;
125
126 open my $fh, "<&=", $fd
127 or die "cannot open fd $fd as perl handle\n";
128
129 bless { fd => $fd, fh => $fh }, $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. Constants
137 unavailable on your system will evaluate to C<0>.
138
139 "file" refers to any file system object in the watched object (always a
140 directory), that is files, directories, symlinks, device nodes etc., while
141 "object" refers to the object the watcher has been set on itself:
142
143 IN_ACCESS object was accessed
144 IN_MODIFY object was modified
145 IN_ATTRIB object metadata changed
146 IN_CLOSE_WRITE writable fd to file / to object was closed
147 IN_CLOSE_NOWRITE readonly fd to file / to object closed
148 IN_OPEN object was opened
149 IN_MOVED_FROM file was moved from this object (directory)
150 IN_MOVED_TO file was moved to this object (directory)
151 IN_CREATE file was created in this object (directory)
152 IN_DELETE file was deleted from this object (directory)
153 IN_DELETE_SELF object itself was deleted
154 IN_MOVE_SELF object itself was moved
155 IN_ALL_EVENTS all of the above events
156
157 IN_ONESHOT only send event once
158 IN_ONLYDIR only watch the path if it is a directory
159 IN_DONT_FOLLOW don't follow a sym link (Linux 2.6.15+)
160 IN_EXCL_UNLINK don't create events for unlinked objects (Linux 2.6.36+)
161 IN_MASK_ADD not supported with the current version of this module
162
163 IN_CLOSE same as IN_CLOSE_WRITE | IN_CLOSE_NOWRITE
164 IN_MOVE same as IN_MOVED_FROM | IN_MOVED_TO
165
166 C<$cb> is a perl code reference that, if given, is called for each
167 event. It receives a C<Linux::Inotify2::Event> object.
168
169 The returned C<$watch> object is of class C<Linux::Inotify2::Watch>.
170
171 On error, C<undef> is returned and C<$!> will be set accordingly. The
172 following errors are documented:
173
174 EBADF The given file descriptor is not valid.
175 EINVAL The given event mask contains no legal events.
176 ENOMEM Insufficient kernel memory was available.
177 ENOSPC The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource.
178 EACCESS Read access to the given file is not permitted.
179
180 Example, show when C</etc/passwd> gets accessed and/or modified once:
181
182 $inotify->watch ("/etc/passwd", IN_ACCESS | IN_MODIFY, sub {
183 my $e = shift;
184 print "$e->{w}{name} was accessed\n" if $e->IN_ACCESS;
185 print "$e->{w}{name} was modified\n" if $e->IN_MODIFY;
186 print "$e->{w}{name} is no longer mounted\n" if $e->IN_UNMOUNT;
187 print "events for $e->{w}{name} have been lost\n" if $e->IN_Q_OVERFLOW;
188
189 $e->w->cancel;
190 });
191
192 =cut
193
194 sub watch {
195 my ($self, $name, $mask, $cb) = @_;
196
197 my $wd = inotify_add_watch $self->{fd}, $name, $mask;
198
199 return unless $wd >= 0;
200
201 my $w = $self->{w}{$wd} = bless {
202 inotify => $self,
203 wd => $wd,
204 name => $name,
205 mask => $mask,
206 cb => $cb,
207 }, "Linux::Inotify2::Watch";
208
209 Scalar::Util::weaken $w->{inotify};
210
211 $w
212 }
213
214 =item $inotify->fileno
215
216 Returns the file descriptor for this notify object. When in non-blocking
217 mode, you are responsible for calling the C<poll> method when this file
218 descriptor becomes ready for reading.
219
220 =item $inotify->fh
221
222 Similar to C<fileno>, but returns a perl file handle instead.
223
224 =cut
225
226 sub fileno {
227 $_[0]{fd}
228 }
229
230 sub fh {
231 $_[0]{fh}
232 }
233
234 =item $inotify->blocking ($blocking)
235
236 Clears ($blocking true) or sets ($blocking false) the C<O_NONBLOCK> flag on the file descriptor.
237
238 =cut
239
240 sub blocking {
241 my ($self, $blocking) = @_;
242
243 inotify_blocking $self->{fd}, $blocking;
244 }
245
246 =item $count = $inotify->poll
247
248 Reads events from the kernel and handles them. If the notify file
249 descriptor is blocking (the default), then this method waits for at least
250 one event. Otherwise it returns immediately when no pending events could
251 be read.
252
253 Returns the count of events that have been handled (which can be C<0> in case
254 events have been received but have been ignored or handled internally).
255
256 Croaks when an error occurs.
257
258 =cut
259
260 sub poll {
261 scalar &read
262 }
263
264 =item @events = $inotify->read
265
266 Reads events from the kernel. Blocks when the file descriptor is in
267 blocking mode (default) until any event arrives. Returns list of
268 C<Linux::Inotify2::Event> objects or empty list if none (non-blocking
269 mode or events got ignored).
270
271 Croaks on error.
272
273 Normally you shouldn't use this function, but instead use watcher
274 callbacks and call C<< ->poll >>.
275
276 =cut
277
278 sub read {
279 my ($self) = @_;
280
281 my @ev = inotify_read $self->{fd};
282 my @res;
283
284 for (@ev) {
285 exists $self->{ignore}{$_->{wd}}
286 and next; # watcher has been canceled
287
288 push @res, bless $_, "Linux::Inotify2::Event";
289
290 my $w = $_->{w} = $self->{w}{$_->{wd}}
291 or do {
292 # no such watcher, but maybe we can do overflow handling
293 if ($_->{mask} & IN_Q_OVERFLOW) {
294 if ($self->{on_overflow}) {
295 $self->{on_overflow}($_);
296 } else {
297 $self->broadcast ($_);
298 }
299 }
300 next;
301 };
302
303 $w->{cb}($_) if $w->{cb};
304 $w->cancel if $_->{mask} & (IN_IGNORED | IN_UNMOUNT | IN_ONESHOT | IN_DELETE_SELF);
305 }
306
307 delete $self->{ignore};
308
309 wantarray ? @res : scalar @res
310 }
311
312 =item $inotify->on_overflow ($cb->($ev))
313
314 Sets the callback to be used for overflow handling
315 (default: C<undef>): When C<read> receives an event with C<IN_Q_OVERFLOW>
316 set, it will invoke this callback with the event.
317
318 When the callback is C<undef>, then it broadcasts the event to all
319 registered watchers, i.e., C<undef> is equivalent to:
320
321 sub { $inotify->broadcast ($_[0]) }
322
323 =cut
324
325 sub on_overflow {
326 my $prev = $_[0]{on_overflow};
327
328 $_[0]{on_overflow} = $_[1]
329 if @_ >= 2;
330
331 $prev
332 }
333
334 =item $inotify->broadcast ($ev)
335
336 Invokes all registered watcher callbacks and passes the given event to
337 them. Most useful in overflow handlers.
338
339 =cut
340
341 sub broadcast {
342 my ($self, $ev) = @_;
343
344 for my $w (values %{ $self->{w} }) {
345 local $ev->{w} = $w;
346 $w->{cb}($ev) if $w->{cb};
347 }
348 }
349
350 =back
351
352 =head2 The Linux::Inotify2::Event Class
353
354 Objects of this class are handed as first argument to the watcher
355 callback. It has the following members and methods:
356
357 =over 4
358
359 =item $event->w
360
361 =item $event->{w}
362
363 The watcher object for this event, if one is available. Generally, you cna
364 only rely on the value of this member inside watcher callbacks.
365
366 =item $event->name
367
368 =item $event->{name}
369
370 The path of the file system object, relative to the watched name.
371
372 =item $event->fullname
373
374 Returns the "full" name of the relevant object, i.e. including the C<name>
375 member of the watcher (if the watch object is on a directory and a
376 directory entry is affected), or simply the C<name> member itself when the
377 object is the watch object itself.
378
379 This call requires C<< $event->{w} >> to be valid, which is generally only
380 the case within watcher callbacks.
381
382 =item $event->mask
383
384 =item $event->{mask}
385
386 The received event mask. In addition to the events described for C<<
387 $inotify->watch >>, the following flags (exported by default) can be set:
388
389 IN_ISDIR event object is a directory
390 IN_Q_OVERFLOW event queue overflowed
391
392 # when any of the following flags are set,
393 # then watchers for this event are automatically canceled
394 IN_UNMOUNT filesystem for watched object was unmounted
395 IN_IGNORED file was ignored/is gone (no more events are delivered)
396 IN_ONESHOT only one event was generated
397 IN_Q_OVERFLOW queue overflow - event might not be specific to a watcher
398
399 =item $event->IN_xxx
400
401 Returns a boolean that returns true if the event mask contains any events
402 specified by the mask. All of the C<IN_xxx> constants can be used as
403 methods.
404
405 =item $event->cookie
406
407 =item $event->{cookie}
408
409 The event cookie to "synchronize two events". Normally zero, this value is
410 set when two events relating to the same file are generated. As far as I
411 know, this only happens for C<IN_MOVED_FROM> and C<IN_MOVED_TO> events, to
412 identify the old and new name of a file.
413
414 Note that the inotify API makes it impossible to know whether there will
415 be a C<IN_MOVED_TO> event - you might receive only one of the events,
416 and even if you receive both, there might be any number of events in
417 between. The best approach seems to be to implement a small timeout
418 after C<IN_MOVED_FROM> to see if a matching C<IN_MOVED_TO> event will be
419 received - 2ms seem to work relatively well.
420
421 =back
422
423 =cut
424
425 package Linux::Inotify2::Event;
426
427 sub w { $_[0]{w} }
428 sub name { $_[0]{name} }
429 sub mask { $_[0]{mask} }
430 sub cookie { $_[0]{cookie} }
431
432 sub fullname {
433 length $_[0]{name}
434 ? "$_[0]{w}{name}/$_[0]{name}"
435 : $_[0]{w}{name};
436 }
437
438 for my $name (@Linux::Inotify2::EXPORT) {
439 my $mask = &{"Linux::Inotify2::$name"};
440
441 *$name = sub { $_[0]{mask} & $mask };
442 }
443
444 =head2 The Linux::Inotify2::Watch Class
445
446 Watcher objects are created by calling the C<watch> method of a notifier.
447
448 It has the following members and methods:
449
450 =over 4
451
452 =item $watch->name
453
454 =item $watch->{name}
455
456 The name as specified in the C<watch> call. For the object itself, this is
457 the empty string. For directory watches, this is the name of the entry
458 without leading path elements.
459
460 =item $watch->mask
461
462 =item $watch->{mask}
463
464 The mask as specified in the C<watch> call.
465
466 =item $watch->cb ([new callback])
467
468 =item $watch->{cb}
469
470 The callback as specified in the C<watch> call. Can optionally be changed.
471
472 =item $watch->cancel
473
474 Cancels/removes this watcher. Future events, even if already queued queued,
475 will not be handled and resources will be freed.
476
477 =back
478
479 =cut
480
481 package Linux::Inotify2::Watch;
482
483 sub name { $_[0]{name} }
484 sub mask { $_[0]{mask} }
485
486 sub cb {
487 $_[0]{cb} = $_[1] if @_ > 1;
488 $_[0]{cb}
489 }
490
491 sub cancel {
492 my ($self) = @_;
493
494 my $inotify = delete $self->{inotify}
495 or return 1; # already canceled
496
497 delete $inotify->{w}{$self->{wd}}; # we are no longer there
498 $inotify->{ignore}{$self->{wd}} = 1; # ignore further events for one poll
499
500 (Linux::Inotify2::inotify_rm_watch $inotify->{fd}, $self->{wd})
501 ? 1 : undef
502 }
503
504 =head1 SEE ALSO
505
506 L<AnyEvent>, L<Linux::Inotify>.
507
508 =head1 AUTHOR
509
510 Marc Lehmann <schmorp@schmorp.de>
511 http://home.schmorp.de/
512
513 =cut
514
515 1