test cleanup
[Fuse-DBI] / DBI.pm
diff --git a/DBI.pm b/DBI.pm
index 3537bf0..c360e3c 100755 (executable)
--- a/DBI.pm
+++ b/DBI.pm
@@ -13,7 +13,7 @@ use Carp;
 use Data::Dumper;
 
 
-our $VERSION = '0.05';
+our $VERSION = '0.07';
 
 =head1 NAME
 
@@ -29,7 +29,7 @@ See C<run> below for examples how to set parameters.
 =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)
@@ -148,12 +148,20 @@ sub mount {
 
        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;
+                       }
                }
        }
 
@@ -170,8 +178,6 @@ sub mount {
        $self->{'read_filenames'} = sub { $self->read_filenames };
        $self->read_filenames;
 
-       $self->{'mounted'} = 1 unless ($arg->{'fork'});
-
        $fuse_self = \$self;
 
        Fuse::main(
@@ -189,14 +195,38 @@ sub mount {
                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.
@@ -211,23 +241,31 @@ database to 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
@@ -265,6 +303,10 @@ sub read_filenames {
                        type => 0040,
                        mode => 0755,
                },
+               '..' => {
+                       type => 0040,
+                       mode => 0755,
+               },
        #       a => {
        #               cont => "File 'a'.\n",
        #               type => 0100,
@@ -521,10 +563,16 @@ __END__
 
 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