reduce default maxtagdepth to 6
[id3fs.git] / lib / ID3FS / Fuse.pm
index 2a02276..b6a5611 100644 (file)
@@ -1,11 +1,30 @@
+# 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 warnings;
 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
 {
@@ -16,8 +35,10 @@ sub new
 
     $self->{db}=shift;
     $self->{source}=shift;
-    $self->{mountpoint}=shift;
-    $self->{debug}=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;
@@ -29,11 +50,12 @@ 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(@_); },
        getdir      => sub { $self->getdir(@_); },
+
        # Not used
 #      mknod       => sub { $self->mknod(@_);       },
 #      mkdir       => sub { $self->mkdir(@_);       },
@@ -63,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);
@@ -77,26 +99,37 @@ 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();
+    return $path->dest($self->{mountpoint});
 }
 
 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());
-    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
@@ -122,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;