+# 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->{db}=shift;
$self->{source}=shift;
$self->{mountpoint}=Cwd::abs_path(shift);
- $self->{debug}=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;
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(@_); },
{
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);
$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);
+ 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);
+ 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();
+ push(@dents, @$dirs);
+ push(@dents, @$files);
+ if(@dents)
{
- return(".", "..", $path->dirents(), 0);
+ return( (".", "..", @dents, 0) );
}
- return -ENOTDIR();
+ return(0);
}
# unused stubs
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;