From 95db19f5d69d997520cefc9b3e1972db4f6777ac Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Mon, 20 Sep 2010 20:38:21 +0100 Subject: [PATCH] distinguish dirs from symlinks --- lib/ID3FS/Fuse.pm | 82 +++++++++++++++++++++++++++++++++++++------------------ sbin/id3fsd | 2 +- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/lib/ID3FS/Fuse.pm b/lib/ID3FS/Fuse.pm index aca53e4..44fdc6e 100644 --- a/lib/ID3FS/Fuse.pm +++ b/lib/ID3FS/Fuse.pm @@ -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; diff --git a/sbin/id3fsd b/sbin/id3fsd index da5f7df..3e95597 100755 --- a/sbin/id3fsd +++ b/sbin/id3fsd @@ -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 -- 2.11.0