X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=Fuse.pm;h=f9f6e73edf1dfce654e546baa1f4216f98ff16e1;hb=c66dce6e79b980376e51981561de6b52b6f6c364;hp=d4e09d9b35927f66f05f5ded6aa6283588bc8aa3;hpb=f65671bc06444a72f67aa36eda532e0cba750e7b;p=perl-fuse.git diff --git a/Fuse.pm b/Fuse.pm old mode 100644 new mode 100755 index d4e09d9..f9f6e73 --- a/Fuse.pm +++ b/Fuse.pm @@ -21,14 +21,14 @@ our @ISA = qw(Exporter DynaLoader); # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK # will save memory. our %EXPORT_TAGS = ( - 'all' => [ qw(XATTR_CREATE XATTR_REPLACE) ], + 'all' => [ qw(XATTR_CREATE XATTR_REPLACE fuse_get_context) ], 'xattr' => [ qw(XATTR_CREATE XATTR_REPLACE) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = (); -our $VERSION = '0.07_3'; +our $VERSION = '0.09_3'; sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() @@ -75,17 +75,16 @@ sub XATTR_REPLACE { bootstrap Fuse $VERSION; sub main { - my (@subs) = (undef,undef,undef,undef,undef,undef,undef,undef,undef,undef, - undef,undef,undef,undef,undef,undef,undef,undef,undef,undef, - undef,undef,undef,undef,undef); - my (@names) = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink - rename link chmod chown truncate utime open read write statfs - flush release fsync setxattr getxattr listxattr removexattr); - my (@validOpts) = qw(allow_other); - my ($tmp) = 0; - my (%mapping) = map { $_ => $tmp++ } (@names); - my (%optmap) = map { $_ => 1 } (@validOpts); - my (%otherargs) = (debug=>0, threaded=>0, mountpoint=>"", mountopts=>""); + my @names = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink + rename link chmod chown truncate utime open read write statfs + flush release fsync setxattr getxattr listxattr removexattr); + my @subs = map {undef} @names; + my @validOpts = qw(ro allow_other default_permissions fsname use_ino nonempty); + my $tmp = 0; + my %mapping = map { $_ => $tmp++ } @names; + my %optmap = map { $_ => 1 } @validOpts; + my @otherargs = qw(debug threaded mountpoint mountopts); + my %otherargs = (debug=>0, threaded=>0, mountpoint=>"", mountopts=>""); while(my $name = shift) { my ($subref) = shift; if(exists($otherargs{$name})) { @@ -96,10 +95,9 @@ sub main { $subs[$mapping{$name}] = $subref; } } - foreach my $opt ( split(/,/,$otherargs{mountopts}) ) { - if ( ! exists($optmap{$opt}) ) { - croak "Use of an invalid mountopt argument"; - } + foreach my $opt ( map {m/^([^=]*)/; $1} split(/,/,$otherargs{mountopts}) ) { + next if exists($optmap{$opt}); + croak "Fuse::main: invalid '$opt' argument in mountopts"; } if($otherargs{threaded}) { # make sure threads are both available, and loaded. @@ -120,7 +118,7 @@ sub main { $otherargs{threaded} = 0; } } - perl_fuse_main($otherargs{debug},$otherargs{threaded},$otherargs{mountpoint},$otherargs{mountopts},@subs); + perl_fuse_main(@otherargs{@otherargs},@subs); } # Autoload methods go after =cut, and are processed by the autosplit program. @@ -236,6 +234,15 @@ threads::shared.) =back +=head3 Fuse::fuse_get_context + + use Fuse "fuse_get_context"; + my $caller_uid = fuse_get_context()->{"uid"}; + my $caller_gid = fuse_get_context()->{"gid"}; + my $caller_pid = fuse_get_context()->{"pid"}; + +Access context information about the current Fuse operation. + =head2 FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT =head3 getattr @@ -287,7 +294,7 @@ example rv: return "/proc/self/fd/stdin"; Arguments: Containing directory name. Returns a list: 0 or more text strings (the filenames), followed by a numeric errno (usually 0). -This is used to obtain directory listings. Its opendir(), readdir(), filldir() and closedir() all in one call. +This is used to obtain directory listings. It's opendir(), readdir(), filldir() and closedir() all in one call. example rv: return ('.', 'a', 'b', 0); @@ -372,26 +379,31 @@ Called to change access/modification times for a file/directory/device/symlink. =head3 open Arguments: Pathname, numeric flags (which is an OR-ing of stuff like O_RDONLY -and O_SYNC, constants you can import from POSIX). -Returns an errno. +and O_SYNC, constants you can import from POSIX), fileinfo hash reference. +Returns an errno, a file handle (optional). No creation, or trunctation flags (O_CREAT, O_EXCL, O_TRUNC) will be passed to open(). +The fileinfo hash reference contains flags from the Fuse open call which may be modified by the module. The only fields presently supported are: + direct_io (version 2.4 onwards) + keep_cache (version 2.4 onwards) + nonseekable (version 2.9 onwards) Your open() method needs only check if the operation is permitted for the given flags, and return 0 for success. +Optionally a file handle may be returned, which will be passed to subsequent read, write, flush, fsync and release calls. =head3 read -Arguments: Pathname, numeric requestedsize, numeric offset. +Arguments: Pathname, numeric requested size, numeric offset, file handle Returns a numeric errno, or a string scalar with up to $requestedsize bytes of data. Called in an attempt to fetch a portion of the file. =head3 write -Arguments: Pathname, scalar buffer, numeric offset. You can use length($buffer) to +Arguments: Pathname, scalar buffer, numeric offset, file handle. You can use length($buffer) to find the buffersize. Returns an errno. -Called in an attempt to write (or overwrite) a portion of the file. Be prepared because $buffer could contain random binary data with NULLs and all sorts of other wonderful stuff. +Called in an attempt to write (or overwrite) a portion of the file. Be prepared because $buffer could contain random binary data with NULs and all sorts of other wonderful stuff. =head3 statfs @@ -410,7 +422,7 @@ or =head3 flush -Arguments: Pathname +Arguments: Pathname, file handle Returns an errno or 0 on success. Called to synchronise any cached data. This is called before the file @@ -418,7 +430,7 @@ is closed. It may be called multiple times before a file is closed. =head3 release -Arguments: Pathname, numeric flags passed to open +Arguments: Pathname, numeric flags passed to open, file handle Returns an errno or 0 on success. Called to indicate that there are no more references to the file. Called once