use Data::Dumper;
-our $VERSION = '0.05';
+our $VERSION = '0.07';
=head1 NAME
=head1 DESCRIPTION
This module will use C<Fuse> module, part of C<FUSE (Filesystem in USErspace)>
-available at L<http://sourceforge.net/projects/avf> to mount
+available at L<http://fuse.sourceforge.net/> to mount
your database as file system.
That will give you possibility to use normal file-system tools (cat, grep, vi)
my $pid;
if ($arg->{'fork'}) {
- $self->{'mounted'} = 1;
$pid = fork();
die "fork() failed: $!" unless defined $pid;
# child will return to caller
if ($pid) {
- return $self;
+ my $counter = 4;
+ while ($counter && ! $self->is_mounted) {
+ select(undef, undef, undef, 0.5);
+ $counter--;
+ }
+ if ($self->is_mounted) {
+ return $self;
+ } else {
+ return undef;
+ }
}
}
$self->{'read_filenames'} = sub { $self->read_filenames };
$self->read_filenames;
- $self->{'mounted'} = 1 unless ($arg->{'fork'});
-
$fuse_self = \$self;
Fuse::main(
debug=>0,
);
- $self->{'mounted'} = 0;
-
exit(0) if ($arg->{'fork'});
return 1;
};
+=head2 is_mounted
+
+Check if fuse filesystem is mounted
+
+ if ($mnt->is_mounted) { ... }
+
+=cut
+
+sub is_mounted {
+ my $self = shift;
+
+ my $mounted = 0;
+ my $mount = $self->{'mount'} || confess "can't find mount point!";
+ if (open(MTAB, "/etc/mtab")) {
+ while(<MTAB>) {
+ $mounted = 1 if (/ $mount fuse /i);
+ }
+ close(MTAB);
+ } else {
+ warn "can't open /etc/mtab: $!";
+ }
+
+ return $mounted;
+}
+
+
=head2 umount
Unmount your database as filesystem.
sub umount {
my $self = shift;
- if ($self->{'mounted'}) {
- system "fusermount -u ".$self->{'mount'} || warn "umount error: $!" && return 0;
+ if ($self->{'mount'} && $self->is_mounted) {
+ system "fusermount -u ".$self->{'mount'}." 2>&1 >/dev/null" || return 0;
+ return 1;
}
- return 1;
+ return 0;
}
$SIG{'INT'} = sub {
- print STDERR "umount called by SIG INT\n";
- umount;
+ if ($fuse_self && $$fuse_self->umount) {
+ print STDERR "umount called by SIG INT\n";
+ }
+};
+
+$SIG{'QUIT'} = sub {
+ if ($fuse_self && $$fuse_self->umount) {
+ print STDERR "umount called by SIG QUIT\n";
+ }
};
sub DESTROY {
my $self = shift;
- return if (! $self->{'mounted'});
- print STDERR "umount called by DESTROY\n";
- $self->umount;
+ if ($self->umount) {
+ print STDERR "umount called by DESTROY\n";
+ }
}
=head2 fuse_module_loaded
type => 0040,
mode => 0755,
},
+ '..' => {
+ type => 0040,
+ mode => 0755,
+ },
# a => {
# cont => "File 'a'.\n",
# type => 0100,
Nothing.
+=head1 BUGS
+
+Size information (C<ls -s>) is wrong. It's a problem in upstream Fuse module
+(for which I'm to blame lately), so when it gets fixes, C<Fuse::DBI> will
+automagically pick it up.
+
=head1 SEE ALSO
C<FUSE (Filesystem in USErspace)> website
-L<http://sourceforge.net/projects/avf>
+L<http://fuse.sourceforge.net/>
Example for WebGUI which comes with this distribution in
directory C<examples/webgui.pl>. It also contains a lot of documentation