732dd71b05b3bde4bcac529ff1edda5e3c77a18b
[id3fs.git] / lib / ID3FS / Fuse.pm
1 package ID3FS::Fuse;
2
3 use strict;
4 use warnings;
5 use ID3FS::Path;
6 use Fuse;
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);
10
11 sub new
12 {
13     my $proto=shift;
14     my $class=ref($proto) || $proto;
15     my $self={};
16     bless($self,$class);
17
18     $self->{db}=shift;
19     $self->{source}=shift;
20     $self->{mountpoint}=shift;
21     $self->{debug}=shift;
22     $self->{perms} = S_IRUSR() | S_IXUSR() | S_IRGRP() | S_IXGRP() | S_IROTH() | S_IXOTH();
23
24     return $self;
25 }
26
27 sub run
28 {
29     my($self)=@_;
30     Fuse::main(
31         mountpoint  => $self->{mountpoint},
32         threaded    => 0,
33         debug       => $self->{debug},
34         mountopts   => "allow_other,ro",
35         getattr     => sub { $self->getattr(@_); },
36         readlink    => sub { $self->readlink(@_); },
37         getdir      => sub { $self->getdir(@_); },
38         # Not used
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(@_); },
60         );
61 }
62
63 sub getattr
64 {
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);
71     my $uid=$<;
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);
79 }
80
81 sub readlink
82 {
83     my($self,$filename)=@_;
84     print "**READLINK: $filename\n";
85     my $path=ID3FS::Path->new($self->{db}, $filename);
86     return(-EINVAL()) unless($path->isfile());
87     return $path->dest();
88 }
89
90 sub getdir
91 {
92     my($self, $filename)=@_;
93     print "**GETDIR: $filename\n";
94     my $path=ID3FS::Path->new($self->{db}, $filename);
95     return(-ENOENT()) unless($path->isvalid());
96     if($path->isdir())
97     {
98         return(".", "..", $path->dirents(), 0);
99     }
100     return -ENOTDIR();
101 }
102
103 # unused stubs
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(); }
125
126 sub mode
127 {
128     my($self, $type)=@_;
129     return(($type << 9) | $self->{perms});
130 }
131
132
133
134 1;