X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FFuse.pm;h=3345bc27407f562a3a1370f4b5a29292d3de0cfb;hb=a88823c2e87634d9fdad780b4923a839ba7e2d04;hp=264cf8729d25dc51785f68ef5995feb0c821f580;hpb=5b2547d90f42403c6b4148ee6f58315e8537f267;p=id3fs.git diff --git a/lib/ID3FS/Fuse.pm b/lib/ID3FS/Fuse.pm index 264cf87..3345bc2 100644 --- a/lib/ID3FS/Fuse.pm +++ b/lib/ID3FS/Fuse.pm @@ -4,10 +4,11 @@ use strict; use warnings; use ID3FS::Path; use Fuse; +use Cwd; use POSIX qw(EINVAL EROFS ENOENT EOPNOTSUPP S_IRUSR S_IRGRP S_IROTH S_IXUSR S_IXGRP S_IXOTH); -use vars qw($TYPE_DIR $TYPE_SYMLINK); -($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120); +our ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120); +our $DEFAULT_MAXTAGDEPTH = 15; sub new { my $proto=shift; @@ -17,8 +18,10 @@ sub new $self->{db}=shift; $self->{source}=shift; - $self->{mountpoint}=shift; - $self->{debug}=shift; + $self->{mountpoint}=Cwd::abs_path(shift); + $self->{verbose}=shift; + $self->{tagdepth}=shift; + $self->{tagdepth}=$DEFAULT_MAXTAGDEPTH unless($self->{tagdepth}); $self->{perms} = S_IRUSR() | S_IXUSR() | S_IRGRP() | S_IXGRP() | S_IROTH() | S_IXOTH(); return $self; @@ -30,32 +33,33 @@ sub run Fuse::main( mountpoint => $self->{mountpoint}, threaded => 0, - debug => $self->{debug}, + debug => ($self->{verbose} > 1), mountopts => "allow_other,ro", getattr => sub { $self->getattr(@_); }, readlink => sub { $self->readlink(@_); }, getdir => sub { $self->getdir(@_); }, + # Not used -# mknod => sub { $self->mknod(@_); }, -# mkdir => sub { $self->mkdir(@_); }, -# unlink => sub { $self->unlink(@_); }, -# rmdir => sub { $self->rmdir(@_); }, -# symlink => sub { $self->symlink(@_); }, -# rename => sub { $self->rename(@_); }, -# link => sub { $self->link(@_); }, -# chmod => sub { $self->chmod(@_); }, -# chown => sub { $self->chown(@_); }, -# truncate => sub { $self->truncate(@_); }, -# utime => sub { $self->utime(@_); }, -# open => sub { $self->open(@_); }, -# read => sub { $self->read(@_); }, -# write => sub { $self->write(@_); }, -# statfs => sub { $self->statfs(@_); }, -# release => sub { $self->release(@_); }, -# fsync => sub { $self->fsync(@_); }, -# setxattr => sub { $self->setxattr(@_); }, -# getxattr => sub { $self->getxattr(@_); }, -# listxattr => sub { $self->listxattr(@_); }, +# mknod => sub { $self->mknod(@_); }, +# mkdir => sub { $self->mkdir(@_); }, +# unlink => sub { $self->unlink(@_); }, +# rmdir => sub { $self->rmdir(@_); }, +# symlink => sub { $self->symlink(@_); }, +# rename => sub { $self->rename(@_); }, +# link => sub { $self->link(@_); }, +# chmod => sub { $self->chmod(@_); }, +# chown => sub { $self->chown(@_); }, +# truncate => sub { $self->truncate(@_); }, +# utime => sub { $self->utime(@_); }, +# open => sub { $self->open(@_); }, +# read => sub { $self->read(@_); }, +# write => sub { $self->write(@_); }, +# statfs => sub { $self->statfs(@_); }, +# release => sub { $self->release(@_); }, +# fsync => sub { $self->fsync(@_); }, +# setxattr => sub { $self->setxattr(@_); }, +# getxattr => sub { $self->getxattr(@_); }, +# listxattr => sub { $self->listxattr(@_); }, # removexattr => sub { $self->removexattr(@_); }, ); } @@ -64,7 +68,7 @@ sub getattr { my($self, $filename)=@_; # print "**GETATTR: $filename\n"; - my $path=ID3FS::Path->new($self->{db}, $filename); + my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}, $self->{tagdepth}); my $last_update=$self->{db}->last_update(); return(-ENOENT()) unless($path->isvalid()); my($dev,$ino,$nlink)=(0,0,1); @@ -74,54 +78,61 @@ sub getattr my($atime,$mtime,$ctime)=($last_update) x 3; my($blksize,$blocks)=(512,1); my $mode=$self->mode( $path->isdir() ? $TYPE_DIR : $TYPE_SYMLINK ); - return($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks); + return($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, + $atime, $mtime, $ctime, $blksize, $blocks); } sub readlink { my($self,$filename)=@_; # print "**READLINK: $filename\n"; - my $path=ID3FS::Path->new($self->{db}, $filename); + my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}, $self->{tagdepth}); return(-EINVAL()) unless($path->isfile()); - return $path->dest(); + return $path->dest($self->{mountpoint}); } sub getdir { my($self, $filename)=@_; # print "**GETDIR: $filename\n"; - my $path=ID3FS::Path->new($self->{db}, $filename); + my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}, $self->{tagdepth}); return(-ENOENT()) unless($path->isvalid()); - if($path->isdir()) + return(-ENOTDIR()) unless($path->isdir()); + my @dents=(); + my($dirs, $files)=$path->dirents(); + # too slow +# push(@dents, $path->filter(@$dirs)); + push(@dents, @$dirs); + push(@dents, @$files); + if(@dents) { - return(".", "..", $path->dirents(), 0); + return( (".", "..", @dents, 0) ); } - return -ENOTDIR(); + return(0); } # unused stubs -sub mknod { print "mknod\n"; return -EROFS(); } -sub mkdir { print "mkdir\n"; return -EROFS(); } -sub unlink { print "unlink\n"; return -EROFS(); } -sub rmdir { print "rmdir\n"; return -EROFS(); } -sub symlink { print "symlink\n"; return -EROFS(); } -sub rename { print "rename\n"; return -EROFS(); } -sub link { print "link\n"; return -EROFS(); } -sub chmod { print "chmod\n"; return -EROFS(); } -sub chown { print "chown\n"; return -EROFS(); } -sub truncate { print "truncate\n"; return -EROFS(); } -sub utime { print "utime\n"; return -EINVAL(); } -sub open { print "open\n"; return -EINVAL(); } -sub read { print "read\n"; return -EINVAL(); } -sub write { print "write\n"; return -EROFS(); } -sub statfs { print "statfs\n"; return -EINVAL(); } -sub release { print "release\n"; return 0; } -sub fsync { print "fsync\n"; return 0; } -sub setxattr { print "setxattr\n"; return -EOPNOTSUPP(); } -sub getxattr { print "getxattr\n"; return -EOPNOTSUPP(); } -sub listxattr { print "listxattr\n"; return -EOPNOTSUPP(); } -sub removexattr { print "removexattr\n"; return -EOPNOTSUPP(); } +sub mknod { print "FUSE: mknod\n"; return -EROFS(); } +sub mkdir { print "FUSE: mkdir\n"; return -EROFS(); } +sub unlink { print "FUSE: unlink\n"; return -EROFS(); } +sub rmdir { print "FUSE: rmdir\n"; return -EROFS(); } +sub symlink { print "FUSE: symlink\n"; return -EROFS(); } +sub rename { print "FUSE: rename\n"; return -EROFS(); } +sub link { print "FUSE: link\n"; return -EROFS(); } +sub chmod { print "FUSE: chmod\n"; return -EROFS(); } +sub chown { print "FUSE: chown\n"; return -EROFS(); } +sub truncate { print "FUSE: truncate\n"; return -EROFS(); } +sub utime { print "FUSE: utime\n"; return -EINVAL(); } +sub open { print "FUSE: open\n"; return -EINVAL(); } +sub read { print "FUSE: read\n"; return -EINVAL(); } +sub write { print "FUSE: write\n"; return -EROFS(); } +sub statfs { print "FUSE: statfs\n"; return -EINVAL(); } +sub release { print "FUSE: release\n"; return 0; } +sub fsync { print "FUSE: fsync\n"; return 0; } +sub setxattr { print "FUSE: setxattr\n"; return -EOPNOTSUPP(); } +sub getxattr { print "FUSE: getxattr\n"; return -EOPNOTSUPP(); } +sub listxattr { print "FUSE: listxattr\n"; return -EOPNOTSUPP(); } +sub removexattr { print "FUSE: removexattr\n"; return -EOPNOTSUPP(); } sub mode { @@ -129,6 +140,4 @@ sub mode return(($type << 9) | $self->{perms}); } - - 1;