7 use POSIX qw(EINVAL EROFS ENOENT EOPNOTSUPP S_IRUSR S_IRGRP S_IROTH S_IXUSR S_IXGRP S_IXOTH);
8 use vars qw($TYPE_DIR $TYPE_SYMLINK);
9 ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120);
14 my $class=ref($proto) || $proto;
19 $self->{source}=shift;
20 $self->{mountpoint}=shift;
22 $self->{perms} = S_IRUSR() | S_IXUSR() | S_IRGRP() | S_IXGRP() | S_IROTH() | S_IXOTH();
31 mountpoint => $self->{mountpoint},
33 debug => $self->{debug},
34 mountopts => "allow_other,ro",
35 getattr => sub { $self->getattr(@_); },
36 readlink => sub { $self->readlink(@_); },
37 getdir => sub { $self->getdir(@_); },
39 # mknod => sub { $self->mknod(@_); },
40 # mkdir => sub { $self->mkdir(@_); },
41 # unlink => sub { $self->unlink(@_); },
42 # rmdir => sub { $self->rmdir(@_); },
43 # symlink => sub { $self->symlink(@_); },
44 # rename => sub { $self->rename(@_); },
45 # link => sub { $self->link(@_); },
46 # chmod => sub { $self->chmod(@_); },
47 # chown => sub { $self->chown(@_); },
48 # truncate => sub { $self->truncate(@_); },
49 # utime => sub { $self->utime(@_); },
50 # open => sub { $self->open(@_); },
51 # read => sub { $self->read(@_); },
52 # write => sub { $self->write(@_); },
53 # statfs => sub { $self->statfs(@_); },
54 # release => sub { $self->release(@_); },
55 # fsync => sub { $self->fsync(@_); },
56 # setxattr => sub { $self->setxattr(@_); },
57 # getxattr => sub { $self->getxattr(@_); },
58 # listxattr => sub { $self->listxattr(@_); },
59 # removexattr => sub { $self->removexattr(@_); },
65 my($self, $filename)=@_;
66 print "**GETATTR: $filename\n";
67 my $path=ID3FS::Path->new($self->{db}, $filename);
68 my $last_update=$self->{db}->last_update();
69 return(-ENOENT()) unless($path->isvalid());
70 my($dev,$ino,$nlink)=(0,0,1);
72 my $gid=(split(/ /, $( ))[0];
73 my($rdev,$size)=(0,1);
74 my($atime,$mtime,$ctime)=($last_update) x 3;
75 my($blksize,$blocks)=(512,1);
76 my $mode=$self->mode( $path->isdir() ? $TYPE_DIR : $TYPE_SYMLINK );
77 return($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
78 $atime,$mtime,$ctime,$blksize,$blocks);
83 my($self,$filename)=@_;
84 print "**READLINK: $filename\n";
85 my $path=ID3FS::Path->new($self->{db}, $filename);
86 return(-EINVAL()) unless($path->isfile());
92 my($self, $filename)=@_;
93 print "**GETDIR: $filename\n";
94 my $path=ID3FS::Path->new($self->{db}, $filename);
95 return(-ENOENT()) unless($path->isvalid());
98 return(".", "..", $path->dirents(), 0);
104 sub mknod { print "mknod\n"; return -EROFS(); }
105 sub mkdir { print "mkdir\n"; return -EROFS(); }
106 sub unlink { print "unlink\n"; return -EROFS(); }
107 sub rmdir { print "rmdir\n"; return -EROFS(); }
108 sub symlink { print "symlink\n"; return -EROFS(); }
109 sub rename { print "rename\n"; return -EROFS(); }
110 sub link { print "link\n"; return -EROFS(); }
111 sub chmod { print "chmod\n"; return -EROFS(); }
112 sub chown { print "chown\n"; return -EROFS(); }
113 sub truncate { print "truncate\n"; return -EROFS(); }
114 sub utime { print "utime\n"; return -EINVAL(); }
115 sub open { print "open\n"; return -EINVAL(); }
116 sub read { print "read\n"; return -EINVAL(); }
117 sub write { print "write\n"; return -EROFS(); }
118 sub statfs { print "statfs\n"; return -EINVAL(); }
119 sub release { print "release\n"; return 0; }
120 sub fsync { print "fsync\n"; return 0; }
121 sub setxattr { print "setxattr\n"; return -EOPNOTSUPP(); }
122 sub getxattr { print "getxattr\n"; return -EOPNOTSUPP(); }
123 sub listxattr { print "listxattr\n"; return -EOPNOTSUPP(); }
124 sub removexattr { print "removexattr\n"; return -EOPNOTSUPP(); }
129 return(($type << 9) | $self->{perms});