+# id3fs - a FUSE-based filesystem for browsing audio metadata
+# Copyright (C) 2010 Ian Beckwith <ianb@erislabs.net>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
package ID3FS::Fuse;
use strict;
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
{
$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;
{
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);
$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});
}
{
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)
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;