id3fs-index: update usage and man page
[id3fs.git] / lib / ID3FS / Fuse.pm
index 50e7060..94e935f 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,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 = 10;
 
 sub new
 {
@@ -18,7 +36,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 +50,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 +85,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);
@@ -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);
+    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);
+    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;