X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2FID3FS%2FFuse.pm;h=b6a5611ebf7baf25f2e98ff9c678edfdcf682b3c;hb=f768e5fc4f33962bfac1142c546776cc0e239ec0;hp=14304f79fef68297dc801d54d071bc7e32b29558;hpb=7009392ead613e8ad7f6a2c1ab7105d6ec2ef91b;p=id3fs.git diff --git a/lib/ID3FS/Fuse.pm b/lib/ID3FS/Fuse.pm index 14304f7..b6a5611 100644 --- a/lib/ID3FS/Fuse.pm +++ b/lib/ID3FS/Fuse.pm @@ -1,3 +1,19 @@ +# id3fs - a FUSE-based filesystem for browsing audio metadata +# Copyright (C) 2010 Ian Beckwith +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + package ID3FS::Fuse; use strict; @@ -6,7 +22,9 @@ 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); + our ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120); +our $DEFAULT_MAXTAGDEPTH = 6; sub new { @@ -19,6 +37,8 @@ sub new $self->{source}=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; @@ -65,7 +85,7 @@ sub getattr { my($self, $filename)=@_; # print "**GETATTR: $filename\n"; - my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}); + 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); @@ -79,11 +99,17 @@ sub getattr $atime, $mtime, $ctime, $blksize, $blocks); } +sub mode +{ + my($self, $type)=@_; + return(($type << 9) | $self->{perms}); +} + sub readlink { my($self,$filename)=@_; # print "**READLINK: $filename\n"; - my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}); + my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}, $self->{tagdepth}); return(-EINVAL()) unless($path->isfile()); return $path->dest($self->{mountpoint}); } @@ -92,13 +118,11 @@ sub getdir { my($self, $filename)=@_; # print "**GETDIR: $filename\n"; - my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}); + my $path=ID3FS::Path->new($self->{db}, $filename, $self->{verbose}, $self->{tagdepth}); return(-ENOENT()) unless($path->isvalid()); 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) @@ -131,10 +155,4 @@ 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 -{ - my($self, $type)=@_; - return(($type << 9) | $self->{perms}); -} - 1;