--- trunk/DBI.pm 2004/10/02 15:29:02 21 +++ trunk/DBI.pm 2004/10/08 20:07:12 24 @@ -24,11 +24,11 @@ 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 @@ 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 @@ 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 @@ $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 @@ $self->read_filenames; - my $mount = Fuse::main( + Fuse::main( mountpoint=>$arg->{'mount'}, getattr=>\&e_getattr, getdir=>\&e_getdir, @@ -117,10 +126,10 @@ 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 @@ 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 @@ return 0; } print "updated '$file' [",$files{$file}{id},"]\n"; + + $fuse_self->{'invalidate'}->() if (ref $fuse_self->{'invalidate'}); } return 1; }