distinguish dirs from symlinks
authorIan Beckwith <ianb@erislabs.net>
Mon, 20 Sep 2010 19:38:21 +0000 (20:38 +0100)
committerIan Beckwith <ianb@erislabs.net>
Mon, 20 Sep 2010 19:38:21 +0000 (20:38 +0100)
lib/ID3FS/Fuse.pm
sbin/id3fsd

index aca53e4..44fdc6e 100644 (file)
@@ -2,8 +2,10 @@ package ID3FS::Fuse;
 
 use strict;
 use warnings;
-use POSIX qw(EINVAL ENOENT EROFS EOPNOTSUPP);
 use Fuse;
+use POSIX qw(EINVAL EROFS 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);
 
 sub new
 {
@@ -15,6 +17,8 @@ sub new
     $self->{db}=shift;
     $self->{source}=shift;
     $self->{mountpoint}=shift;
+    $self->{debug}=shift;
+    $self->{perms} = S_IRUSR() | S_IXUSR() | S_IRGRP() | S_IXGRP() | S_IROTH() | S_IXOTH();
 
     return $self;
 }
@@ -24,11 +28,13 @@ sub run
     my($self)=@_;
     Fuse::main(
        mountpoint  => $self->{mountpoint},
-       threaded=>0,
-       debug => 1,
+       threaded    => 0,
+       debug       => $self->{debug},
+       mountopts   => "allow_other,ro",
        getattr     => sub { $self->getattr(@_); },
-#      readlink    => sub { $self->readlink(@_); },
+       readlink    => sub { $self->readlink(@_); },
        getdir      => sub { $self->getdir(@_); },
+       # Not used
 #      mknod       => sub { $self->mknod(@_); },
 #      mkdir       => sub { $self->mkdir(@_); },
 #      unlink      => sub { $self->unlink(@_); },
@@ -55,7 +61,7 @@ sub run
 
 sub getattr
 {
-    my($filename)=@_;
+    my($self, $filename)=@_;
     print "GETATTR: $filename\n";
     my($dev,$ino,$nlink)=(0,0,1);
     my $uid=$<;
@@ -63,12 +69,25 @@ sub getattr
     my($rdev,$size)=(0,1);
     my($atime,$mtime,$ctime)=(0,0,0);
     my($blksize,$blocks)=(512,1);
-    my $mode=(0040 << 9) | 0755;
+    my $mode;
+    if($filename eq "/")
+    {
+       $mode=$self->mode($TYPE_DIR);
+    }
+    else
+    {
+       $mode=$self->mode($TYPE_SYMLINK);
+    }
     return($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
           $atime,$mtime,$ctime,$blksize,$blocks);
 }
 
-sub readlink    { print "readlink\n"; return "FIXME";       }
+sub readlink
+{
+    my($self,$filename)=@_;
+    print "READLINK: $filename\n";
+    return "FIXME";
+}
 
 sub getdir
 {
@@ -81,26 +100,35 @@ sub getdir
     return('.',0);
 }
 
-sub mknod       { print "mknod\n"; return -EINVAL();     }
-sub mkdir       { print "mkdir\n"; return -EROFS();      }
-sub unlink      { print "unlink\n"; return -EINVAL();     }
-sub rmdir       { print "rmdir\n"; return -EROFS();      }
-sub symlink     { print "symlink\n"; return -EROFS();      }
-sub rename      { print "rename\n"; return -EROFS();      }
-sub link        { print "link\n"; return -EROFS();      }
-sub chmod       { print "chmod\n"; return -EINVAL();     }
-sub chown       { print "chown\n"; return -EINVAL();     }
-sub truncate    { print "truncate\n"; return -EROFS();      }
-sub utime       { print "utime\n"; return -EINVAL();     }
-sub open        { print "open\n"; return -EINVAL();     }
-sub read        { print "read\n"; return -EINVAL();     }
-sub write       { print "write\n"; return -EINVAL();     }
-sub statfs      { print "statfs\n"; return -EINVAL();     }
-sub release     { print "release\n"; return 0;             }
-sub fsync       { print "fsync\n"; return 0;             }
-sub setxattr    { print "setxattr\n"; return -EOPNOTSUPP(); }
-sub getxattr    { print "getxattr\n"; return -EOPNOTSUPP(); }
-sub listxattr   { print "listxattr\n"; return -EOPNOTSUPP(); }
+# unused stubs
+sub mknod       { print "mknod\n"; return -EROFS();            }
+sub mkdir       { print "mkdir\n"; return -EROFS();            }
+sub unlink      { print "unlink\n"; return -EROFS();           }
+sub rmdir       { print "rmdir\n"; return -EROFS();            }
+sub symlink     { print "symlink\n"; return -EROFS();          }
+sub rename      { print "rename\n"; return -EROFS();           }
+sub link        { print "link\n"; return -EROFS();             }
+sub chmod       { print "chmod\n"; return -EROFS();            }
+sub chown       { print "chown\n"; return -EROFS();            }
+sub truncate    { print "truncate\n"; return -EROFS();         }
+sub utime       { print "utime\n"; return -EINVAL();           }
+sub open        { print "open\n"; return -EINVAL();            }
+sub read        { print "read\n"; return -EINVAL();            }
+sub write       { print "write\n"; return -EROFS();            }
+sub statfs      { print "statfs\n"; return -EINVAL();          }
+sub release     { print "release\n"; return 0;                 }
+sub fsync       { print "fsync\n"; return 0;                   }
+sub setxattr    { print "setxattr\n"; return -EOPNOTSUPP();    }
+sub getxattr    { print "getxattr\n"; return -EOPNOTSUPP();    }
+sub listxattr   { print "listxattr\n"; return -EOPNOTSUPP();   }
 sub removexattr { print "removexattr\n"; return -EOPNOTSUPP(); }
 
+sub mode
+{
+    my($self, $type)=@_;
+    return(($type << 9) | $self->{perms});
+}
+
+
+
 1;
index da5f7df..3e95597 100755 (executable)
@@ -26,7 +26,7 @@ my $source=shift;
 my $mountpoint=shift;
 
 my $db=ID3FS::DB->new($source, 0, $me);
-my $fuse=ID3FS::Fuse->new($db, $source, $mountpoint);
+my $fuse=ID3FS::Fuse->new($db, $source, $mountpoint, $verbose);
 $fuse->run();
 
 sub usage