fix file splitting; tweaks
[id3fs.git] / lib / ID3FS / Fuse.pm
index 44fdc6e..cc38b65 100644 (file)
@@ -2,8 +2,9 @@ package ID3FS::Fuse;
 
 use strict;
 use warnings;
+use ID3FS::Path;
 use Fuse;
-use POSIX qw(EINVAL EROFS EOPNOTSUPP S_IRUSR S_IRGRP S_IROTH S_IXUSR S_IXGRP S_IXOTH);
+use POSIX qw(EINVAL EROFS ENOENT EOPNOTSUPP S_IRUSR S_IRGRP S_IROTH S_IXUSR S_IXGRP S_IXOTH);
 use vars qw($TYPE_DIR $TYPE_SYMLINK);
 ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120);
 
@@ -62,22 +63,16 @@ sub run
 sub getattr
 {
     my($self, $filename)=@_;
-    print "GETATTR: $filename\n";
+    print "**GETATTR: $filename\n";
+    my $path=ID3FS::Path->new($self->{db}, $filename);
+    return(-ENOENT()) unless($path->isvalid());
     my($dev,$ino,$nlink)=(0,0,1);
     my $uid=$<;
     my $gid=(split(/ /, $( ))[0];
     my($rdev,$size)=(0,1);
     my($atime,$mtime,$ctime)=(0,0,0);
     my($blksize,$blocks)=(512,1);
-    my $mode;
-    if($filename eq "/")
-    {
-       $mode=$self->mode($TYPE_DIR);
-    }
-    else
-    {
-       $mode=$self->mode($TYPE_SYMLINK);
-    }
+    my $mode=$self->mode( $path->isdir() ? $TYPE_DIR : $TYPE_SYMLINK );
     return($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
           $atime,$mtime,$ctime,$blksize,$blocks);
 }
@@ -85,19 +80,23 @@ sub getattr
 sub readlink
 {
     my($self,$filename)=@_;
-    print "READLINK: $filename\n";
-    return "FIXME";
+    print "**READLINK: $filename\n";
+    my $path=ID3FS::Path->new($self->{db}, $filename);
+    return(-EINVAL()) unless($path->isfile());
+    return $path->dest();
 }
 
 sub getdir
 {
     my($self, $filename)=@_;
-    print "GETDIR(", ref($self), ": $filename\n";
-    if($filename eq "/")
+    print "**GETDIR: $filename\n";
+    my $path=ID3FS::Path->new($self->{db}, $filename);
+    return(-ENOENT()) unless($path->isvalid());
+    if($path->isdir())
     {
-       return(".", "..", $self->{db}->tags(), 0);
+       return(".", "..", $path->dirents(), 0);
     }
-    return('.',0);
+    return -ENOTDIR();
 }
 
 # unused stubs