/[fuse_dbi]/fuse-couchdb/DBI.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /fuse-couchdb/DBI.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 36 by dpavlin, Tue Nov 16 15:34:25 2004 UTC revision 47 by dpavlin, Tue Nov 23 23:54:58 2004 UTC
# Line 13  use Carp; Line 13  use Carp;
13  use Data::Dumper;  use Data::Dumper;
14    
15    
16  our $VERSION = '0.05';  our $VERSION = '0.07';
17    
18  =head1 NAME  =head1 NAME
19    
# Line 148  sub mount { Line 148  sub mount {
148    
149          my $pid;          my $pid;
150          if ($arg->{'fork'}) {          if ($arg->{'fork'}) {
                 $self->{'mounted'} = 1;  
151                  $pid = fork();                  $pid = fork();
152                  die "fork() failed: $!" unless defined $pid;                  die "fork() failed: $!" unless defined $pid;
153                  # child will return to caller                  # child will return to caller
154                  if ($pid) {                  if ($pid) {
155                          return $self;                          my $counter = 4;
156                            while ($counter && ! $self->is_mounted) {
157                                    select(undef, undef, undef, 0.5);
158                                    $counter--;
159                            }
160                            if ($self->is_mounted) {
161                                    return $self;
162                            } else {
163                                    return undef;
164                            }
165                  }                  }
166          }          }
167    
# Line 170  sub mount { Line 178  sub mount {
178          $self->{'read_filenames'} = sub { $self->read_filenames };          $self->{'read_filenames'} = sub { $self->read_filenames };
179          $self->read_filenames;          $self->read_filenames;
180    
         $self->{'mounted'} = 1 unless ($arg->{'fork'});  
   
181          $fuse_self = \$self;          $fuse_self = \$self;
182    
183          Fuse::main(          Fuse::main(
# Line 189  sub mount { Line 195  sub mount {
195                  debug=>0,                  debug=>0,
196          );          );
197                    
         $self->{'mounted'} = 0;  
   
198          exit(0) if ($arg->{'fork'});          exit(0) if ($arg->{'fork'});
199    
200          return 1;          return 1;
201    
202  };  };
203    
204    =head2 is_mounted
205    
206    Check if fuse filesystem is mounted
207    
208      if ($mnt->is_mounted) { ... }
209    
210    =cut
211    
212    sub is_mounted {
213            my $self = shift;
214    
215            my $mounted = 0;
216            my $mount = $self->{'mount'} || confess "can't find mount point!";
217            if (open(MTAB, "/etc/mtab")) {
218                    while(<MTAB>) {
219                            $mounted = 1 if (/ $mount fuse /i);
220                    }
221                    close(MTAB);
222            } else {
223                    warn "can't open /etc/mtab: $!";
224            }
225    
226            return $mounted;
227    }
228    
229    
230  =head2 umount  =head2 umount
231    
232  Unmount your database as filesystem.  Unmount your database as filesystem.
# Line 211  database to filesystem. Line 241  database to filesystem.
241  sub umount {  sub umount {
242          my $self = shift;          my $self = shift;
243    
244          if ($self->{'mounted'}) {          if ($self->{'mount'} && $self->is_mounted) {
245                  system "fusermount -u ".$self->{'mount'} || warn "umount error: $!" && return 0;                  system "fusermount -u ".$self->{'mount'}." 2>&1 >/dev/null" || return 0;
246                    return 1;
247          }          }
248    
249          return 1;          return 0;
250  }  }
251    
252  $SIG{'INT'} = sub {  $SIG{'INT'} = sub {
253          print STDERR "umount called by SIG INT\n";          if ($fuse_self && $$fuse_self->umount) {
254          umount;                  print STDERR "umount called by SIG INT\n";
255            }
256    };
257    
258    $SIG{'QUIT'} = sub {
259            if ($fuse_self && $$fuse_self->umount) {
260                    print STDERR "umount called by SIG QUIT\n";
261            }
262  };  };
263    
264  sub DESTROY {  sub DESTROY {
265          my $self = shift;          my $self = shift;
266          return if (! $self->{'mounted'});          if ($self->umount) {
267          print STDERR "umount called by DESTROY\n";                  print STDERR "umount called by DESTROY\n";
268          $self->umount;          }
269  }  }
270    
271  =head2 fuse_module_loaded  =head2 fuse_module_loaded
# Line 265  sub read_filenames { Line 303  sub read_filenames {
303                          type => 0040,                          type => 0040,
304                          mode => 0755,                          mode => 0755,
305                  },                  },
306                    '..' => {
307                            type => 0040,
308                            mode => 0755,
309                    },
310          #       a => {          #       a => {
311          #               cont => "File 'a'.\n",          #               cont => "File 'a'.\n",
312          #               type => 0100,          #               type => 0100,
# Line 521  __END__ Line 563  __END__
563    
564  Nothing.  Nothing.
565    
566    =head1 BUGS
567    
568    Size information (C<ls -s>) is wrong. It's a problem in upstream Fuse module
569    (for which I'm to blame lately), so when it gets fixes, C<Fuse::DBI> will
570    automagically pick it up.
571    
572  =head1 SEE ALSO  =head1 SEE ALSO
573    
574  C<FUSE (Filesystem in USErspace)> website  C<FUSE (Filesystem in USErspace)> website

Legend:
Removed from v.36  
changed lines
  Added in v.47

  ViewVC Help
Powered by ViewVC 1.1.26