X-Git-Url: http://git.rot13.org/?p=Fuse-DBI;a=blobdiff_plain;f=DBI.pm;h=bb429672a4f53ebf98f3b48c51aa342c66cfdcc9;hp=8caecd3918101286f349fc57ac68ade3d710d39a;hb=319f204599f005d7303c923b4387e537a232ead8;hpb=423879e95093f0dc5a34dbd712555377a3b6aa38 diff --git a/DBI.pm b/DBI.pm index 8caecd3..bb42967 100755 --- a/DBI.pm +++ b/DBI.pm @@ -24,11 +24,11 @@ Fuse::DBI - mount your database as filesystem and use it use Fuse::DBI; Fuse::DBI->mount( ... ); -See L below for examples how to set parametars. +See C below for examples how to set parametars. =head1 DESCRIPTION -This module will use L module, part of C +This module will use C module, part of C available at L to mount your database as file system. @@ -64,6 +64,11 @@ my $ctime_start; sub read_filenames; sub fuse_module_loaded; +# evil, evil way to solve this. It makes this module non-reentrant. But, since +# fuse calls another copy of this script for each mount anyway, this shouldn't +# be a problem. +my $fuse_self; + sub mount { my $class = shift; my $self = {}; @@ -77,7 +82,10 @@ sub mount { carp "mount needs 'mount' as mountpoint" unless ($arg->{'mount'}); # save (some) arguments in self - $self->{$_} = $arg->{$_} foreach (qw(mount)); + foreach (qw(mount invalidate)) { + $self->{$_} = $arg->{$_}; + $fuse_self->{$_} = $arg->{$_}; + } foreach (qw(filenames read update)) { carp "mount needs '$_' SQL" unless ($arg->{$_}); @@ -85,12 +93,13 @@ sub mount { $ctime_start = time(); + my $pid; if ($arg->{'fork'}) { - my $pid = fork(); + $pid = fork(); die "fork() failed: $!" unless defined $pid; # child will return to caller if ($pid) { - $self ? return $self : return undef; + return $self; } } @@ -103,7 +112,7 @@ sub mount { $self->read_filenames; - my $mount = Fuse::main( + Fuse::main( mountpoint=>$arg->{'mount'}, getattr=>\&e_getattr, getdir=>\&e_getdir, @@ -117,10 +126,10 @@ sub mount { debug=>0, ); - if (! $mount) { - warn "mount on ",$arg->{'mount'}," failed!\n"; - return undef; - } + exit(0) if ($arg->{'fork'}); + + return 1; + }; =head2 umount @@ -142,6 +151,17 @@ sub umount { return 1; } +#$SIG{'INT'} = sub { +# print STDERR "umount called by SIG INT\n"; +# umount; +#}; + +sub DESTROY { + my $self = shift; + print STDERR "umount called by DESTROY\n"; + $self->umount; +} + =head2 fuse_module_loaded Checks if C module is loaded in kernel. @@ -347,6 +367,8 @@ sub update_db { return 0; } print "updated '$file' [",$files{$file}{id},"]\n"; + + $fuse_self->{'invalidate'}->() if (ref $fuse_self->{'invalidate'}); } return 1; }