add copyright/license headers
[id3fs.git] / lib / ID3FS / Fuse.pm
index 058b868..ffb3950 100644 (file)
@@ -1,3 +1,19 @@
+# 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;
@@ -6,8 +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 ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120);
+our $DEFAULT_MAXTAGDEPTH = 10;
 sub new
 {
     my $proto=shift;
@@ -18,7 +35,9 @@ 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;
@@ -30,7 +49,7 @@ 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(@_); },
@@ -65,7 +84,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);
@@ -83,7 +102,7 @@ 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});
 }
@@ -92,12 +111,14 @@ 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());
     return(-ENOTDIR()) unless($path->isdir());
     my @dents=();
     my($dirs, $files)=$path->dirents();
-    push(@dents, $path->filter(@$dirs));
+    # too slow
+#    push(@dents, $path->filter(@$dirs));
+    push(@dents, @$dirs);
     push(@dents, @$files);
     if(@dents)
     {