diff options
Diffstat (limited to 'lib/PublicInbox/Inotify.pm')
-rw-r--r-- | lib/PublicInbox/Inotify.pm | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/PublicInbox/Inotify.pm b/lib/PublicInbox/Inotify.pm new file mode 100644 index 00000000..c4f1ae84 --- /dev/null +++ b/lib/PublicInbox/Inotify.pm @@ -0,0 +1,47 @@ +# Copyright (C) all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> + +# wrap Linux::Inotify2 XS module, support pure Perl via `syscall' someday +package PublicInbox::Inotify; +use v5.12; +our @ISA; +BEGIN { # prefer pure Perl since it works out-of-the-box + my $isa; + for my $m (qw(PublicInbox::Inotify3 Linux::Inotify2)) { + eval "require $m"; + next if $@; + $isa = $m; + } + if ($isa) { + push @ISA, $isa; + my $buf = ''; + for (qw(IN_MOVED_TO IN_CREATE IN_DELETE IN_DELETE_SELF + IN_MOVE_SELF IN_MOVED_FROM IN_MODIFY)) { + $buf .= "*$_ = \\&PublicInbox::Inotify3::$_;\n"; + } + eval $buf; + die $@ if $@; + } else { + die <<EOM; +W: inotify syscall numbers unknown on your platform and +W: Linux::Inotify2 missing: $@ +W: public-inbox hackers welcome the plain-text output of ./devel/sysdefs-list +W: at meta\@public-inbox.org +EOM + } +}; + +sub new { + $_[0]->SUPER::new // do { + my $msg = $!{EMFILE} ? <<EOM : "$_[0]->new: $!\n"; +inotify_init/inotify_init1: $! +You may need to raise the `fs.inotify.max_user_instances' sysctl limit. +Consult your OS documentation and/or sysctl(8) + sysctl.conf(5) manpages. +EOM + $msg =~ s/^/E: /smg; + require Carp; + Carp::croak($msg); + } +} + +1; |