#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use Fcntl ':mode'; use Fuse; use POSIX qw(ENOENT ENOSYS); Fuse::main ( debug => 1, mountpoint => 'mnt', getattr => sub { fuse('getattr', @_); }, getdir => sub { fuse('getdir', @_); }, init => sub { fuse('init', @_); }, read => sub { fuse('read', @_); }, truncate => sub { fuse('truncate', @_); }, write => sub { fuse('write', @_); }, ); sub fuse { my $function = shift; my $callback_for = { getattr => \&fuse_getattr, getdir => \&fuse_getdir, init => \&fuse_init, read => \&fuse_read, truncate => \&fuse_truncate, write => \&fuse_write, }; if (exists $callback_for->{$function}) { return $callback_for->{$function} -> (@_); } else { return -(ENOSYS); } die; } sub fuse_getattr { my $path = shift; my $context = Fuse::fuse_get_context(); print Dumper ($context), "\n"; my $stat = undef; if ($path eq '/') { my $mode = S_IFDIR | S_IRUSR | S_IXUSR; $stat = [ 0, # dev 0, # inode $mode, # mode 1, # nlink $context->{uid}, # uid $context->{gid}, # gid 0, # rdev 0, # size 0, # atime 0, # mtime 0, # ctime 4096, # blksie 0, # blocks ]; } elsif ($path eq '/save') { my $mode = S_IFREG | S_IRUSR; $stat = [ 0, # dev 0, # inode $mode, # mode 1, # nlink $context->{uid}, # uid $context->{gid}, # gid 0, # rdev 1_024_000, # size 0, # atime 0, # mtime 0, # ctime 4096, # blksie 1, # blocks ]; } elsif ($path eq '/load') { my $mode = S_IFREG | S_IWUSR; $stat = [ 0, # dev 0, # inode $mode, # mode 1, # nlink $context->{uid}, # uid $context->{gid}, # gid 0, # rdev 0, # size 0, # atime 0, # mtime 0, # ctime 4096, # blksie 0, # blocks ]; } if (defined $stat) { return @{$stat}; } else { return -(ENOENT); } die; } sub fuse_getdir { my $path = shift; if ($path eq '/') { return '.', '..', 'load', 'save', 0; } return -(ENOENT); } sub fuse_init { print Dumper [@_], "\n"; return 'PRIVDAT'; } sub fuse_read { my $path = shift; if ($path eq '/save') { return 1 x 4096; } return -(ENOENT); } sub fuse_truncate { my $path = shift; if ($path eq '/load') { return 0; } return -(ENOENT); } sub fuse_write { print Dumper (@_), "\n"; return length $_[1]; return -(ENOENT); }