/[fuse.before_github]/perl/trunk/Fuse.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /perl/trunk/Fuse.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 7 by dpavlin, Thu Nov 18 12:09:10 2004 UTC revision 20 by dpavlin, Tue Dec 27 14:49:31 2005 UTC
# Line 5  use strict; Line 5  use strict;
5  use warnings;  use warnings;
6  use Errno;  use Errno;
7  use Carp;  use Carp;
8    use Config;
9    
10  require Exporter;  require Exporter;
11  require DynaLoader;  require DynaLoader;
# Line 19  our @ISA = qw(Exporter DynaLoader); Line 20  our @ISA = qw(Exporter DynaLoader);
20  # This allows declaration       use Fuse ':all';  # This allows declaration       use Fuse ':all';
21  # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK  # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
22  # will save memory.  # will save memory.
23  our %EXPORT_TAGS = ( 'all' => [ qw(  our %EXPORT_TAGS = (
24          FUSE_DEBUG                      'all' => [ qw(XATTR_CREATE XATTR_REPLACE) ],
25  ) ] );                      'xattr' => [ qw(XATTR_CREATE XATTR_REPLACE) ]
26                        );
27    
28  our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );  our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
29    
30  our @EXPORT = qw(  our @EXPORT = ();
31          FUSE_DEBUG  our $VERSION = '0.07_1';
 );  
 our $VERSION = '0.04';  
32    
33  sub AUTOLOAD {  sub AUTOLOAD {
34      # This AUTOLOAD is used to 'autoload' constants from the constant()      # This AUTOLOAD is used to 'autoload' constants from the constant()
# Line 62  sub AUTOLOAD { Line 62  sub AUTOLOAD {
62      goto &$AUTOLOAD;      goto &$AUTOLOAD;
63  }  }
64    
65    sub XATTR_CREATE {
66        # See <sys/xattr.h>.
67        return 1;
68    }
69    
70    sub XATTR_REPLACE {
71        # See <sys/xattr.h>.
72        return 2;
73    }
74    
75  bootstrap Fuse $VERSION;  bootstrap Fuse $VERSION;
76    
77  sub main {  sub main {
78          my (@subs) = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);          my (@subs) = (undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,
79                          undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,
80                          undef,undef,undef,undef,undef);
81          my (@names) = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink          my (@names) = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink
82                           rename link chmod chown truncate utime open read write statfs);                           rename link chmod chown truncate utime open read write statfs
83                             flush release fsync setxattr getxattr listxattr removexattr);
84            my (@validOpts) = qw(allow_other);
85          my ($tmp) = 0;          my ($tmp) = 0;
86          my (%mapping) = map { $_ => $tmp++ } (@names);          my (%mapping) = map { $_ => $tmp++ } (@names);
87          my (%otherargs) = (debug=>0, mountpoint=>"");          my (%optmap) = map { $_ => 1 } (@validOpts);
88            my (%otherargs) = (debug=>0, threaded=>0, mountpoint=>"", mountopts=>"");
89          while(my $name = shift) {          while(my $name = shift) {
90                  my ($subref) = shift;                  my ($subref) = shift;
91                  if(exists($otherargs{$name})) {                  if(exists($otherargs{$name})) {
92                          $otherargs{$name} = $subref;                          $otherargs{$name} = $subref;
93                  } else {                  } else {
94                          croak "There is no function $name" unless exists($mapping{$name});                          croak "There is no function $name" unless exists($mapping{$name});
95                          croak "Usage: Fuse::main(getattr => &my_getattr, ...)" unless $subref;                          croak "Usage: Fuse::main(getattr => \"main::my_getattr\", ...)" unless $subref;
                         croak "Usage: Fuse::main(getattr => &my_getattr, ...)" unless ref($subref);  
                         croak "Usage: Fuse::main(getattr => &my_getattr, ...)" unless ref($subref) eq "CODE";  
96                          $subs[$mapping{$name}] = $subref;                          $subs[$mapping{$name}] = $subref;
97                  }                  }
98          }          }
99          perl_fuse_main($otherargs{debug},$otherargs{mountpoint},@subs);          foreach my $opt ( split(/,/,$otherargs{mountopts}) ) {
100                    if ( ! exists($optmap{$opt}) ) {
101                            croak "Use of an invalid mountopt argument";
102                    }
103            }
104            if($otherargs{threaded}) {
105                    # make sure threads are both available, and loaded.
106                    if($Config{useithreads}) {
107                            if(exists($threads::{VERSION})) {
108                                    if(exists($threads::shared::{VERSION})) {
109                                            # threads will work.
110                                    } else {
111                                            carp("Thread support requires you to use threads::shared.\nThreads are disabled.\n");
112                                            $otherargs{threaded} = 0;
113                                    }
114                            } else {
115                                    carp("Thread support requires you to use threads and threads::shared.\nThreads are disabled.\n");
116                                    $otherargs{threaded} = 0;
117                            }
118                    } else {
119                            carp("Thread support was not compiled into this build of perl.\nThreads are disabled.\n");
120                            $otherargs{threaded} = 0;
121                    }
122            }
123            perl_fuse_main($otherargs{debug},$otherargs{threaded},$otherargs{mountpoint},$otherargs{mountopts},@subs);
124  }  }
125    
126  # Autoload methods go after =cut, and are processed by the autosplit program.  # Autoload methods go after =cut, and are processed by the autosplit program.
# Line 100  Fuse - write filesystems in Perl using F Line 137  Fuse - write filesystems in Perl using F
137    use Fuse;    use Fuse;
138    my ($mountpoint) = "";    my ($mountpoint) = "";
139    $mountpoint = shift(@ARGV) if @ARGV;    $mountpoint = shift(@ARGV) if @ARGV;
140    Fuse::main(mountpoint=>$mountpoint, getattr=>\&my_getattr, getdir=>\&my_getdir, ...);    Fuse::main(mountpoint=>$mountpoint, getattr=>"main::my_getattr", getdir=>"main::my_getdir", ...);
141    
142  =head1 DESCRIPTION  =head1 DESCRIPTION
143    
# Line 109  This lets you implement filesystems in p Line 146  This lets you implement filesystems in p
146    
147  FUSE expects you to implement callbacks for the various functions.  FUSE expects you to implement callbacks for the various functions.
148    
 NOTE:  I have only tested the things implemented in example.pl!  
 It should work, but some things may not.  
   
149  In the following definitions, "errno" can be 0 (for a success),  In the following definitions, "errno" can be 0 (for a success),
150  -EINVAL, -ENOENT, -EONFIRE, any integer less than 1 really.  -EINVAL, -ENOENT, -EONFIRE, any integer less than 1 really.
151    
# Line 122  Every constant you need (file types, ope Line 156  Every constant you need (file types, ope
156  etc) can be imported either from POSIX or from Fcntl, often both.  etc) can be imported either from POSIX or from Fcntl, often both.
157  See their respective documentations, for more information.  See their respective documentations, for more information.
158    
159  =head2 EXPORT  =head2 EXPORTED SYMBOLS
160    
161  None by default.  None by default.
162    
163  =head2 EXPORTABLE CONSTANTS  You can request all exportable symbols by using the tag ":all".
164    
165  None.  You can request the extended attribute symbols by using the tag ":xattr".
166    This will export XATTR_CREATE and XATTR_REPLACE.
167    
168  =head2 FUNCTIONS  =head2 FUNCTIONS
169    
# Line 157  specify this.  An example would be '/mnt Line 192  specify this.  An example would be '/mnt
192    
193  =back  =back
194    
195  unthreaded => boolean  mountopts => string
196    
197    =over 1
198    
199    This is a comma seperated list of mount options to pass to the FUSE kernel
200    module.
201    
202    At present, it allows the specification of the allow_other
203    argument when mounting the new FUSE filesystem. To use this, you will also
204    need 'user_allow_other' in /etc/fuse.conf as per the FUSE documention
205    
206      mountopts => "allow_other" or
207      mountopts => ""
208    
209    =back
210    
211    threaded => boolean
212    
213  =over 1  =over 1
214    
215  This turns FUSE multithreading off and on.  NOTE: This perlmodule does not  This turns FUSE multithreading on and off.  The default is 0, meaning your FUSE
216  currently work properly in multithreaded mode!  The author is unfortunately  script will run in single-threaded mode.  Note that single-threaded mode also
217  not familiar enough with perl-threads internals, and according to the  means that you will not have to worry about reentrancy, though you will have to
218  documentation available at time of writing (2002-03-08), those internals are  worry about recursive lookups.  In single-threaded mode, FUSE holds a global
219  subject to changing anyway.  Note that singlethreaded mode also means that  lock on your filesystem, and will wait for one callback to return before
220  you will not have to worry about reentrancy, though you will have to worry  calling another.  This can lead to deadlocks, if your script makes any attempt
221  about recursive lookups (since the kernel holds a global lock on your  to access files or directories in the filesystem it is providing.  (This
222  filesystem and blocks waiting for one callback to complete before calling  includes calling stat() on the mount-point, statfs() calls from the 'df'
223  another).  command, and so on and so forth.)  It is worth paying a little attention and
224    being careful about this.
225  I hope to add full multithreading functionality later, but for now, I  
226  recommend you leave this option at the default, 1 (which means  Enabling multithreading will cause FUSE to make multiple simultaneous calls
227  unthreaded, no threads will be used and no reentrancy is needed).  into the various callback functions of your perl script.  If you enable
228    threaded mode, you can enjoy all the parallel execution and interactive
229    response benefits of threads, and you get to enjoy all the benefits of race
230    conditions and locking bugs, too.  Please also ensure any other perl modules
231    you're using are also thread-safe.
232    
233    (If enabled, this option will cause a warning if your perl interpreter was not
234    built with USE_ITHREADS, or if you have failed to use threads or
235    threads::shared.)
236    
237  =back  =back
238    
# Line 349  or Line 408  or
408    
409  -ENOANO(), $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize  -ENOANO(), $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
410    
411    =head3 flush
412    
413    Arguments: Pathname
414    Returns an errno or 0 on success.
415    
416    Called to synchronise any cached data. This is called before the file
417    is closed. It may be called multiple times before a file is closed.
418    
419    =head3 release
420    
421    Arguments: Pathname, numeric flags passed to open
422    Returns an errno or 0 on success.
423    
424    Called to indicate that there are no more references to the file. Called once
425    for every file with the same pathname and flags as were passed to open.
426    
427    =head3 fsync
428    
429    Arguments: Pathname, numeric flags
430    Returns an errno or 0 on success.
431    
432    Called to synchronise the file's contents. If flags is non-zero,
433    only synchronise the user data. Otherwise synchronise the user and meta data.
434    
435    =head3 setxattr
436    
437    Arguments: Pathname, extended attribute's name, extended attribute's value, numeric flags (which is an OR-ing of XATTR_CREATE and XATTR_REPLACE
438    Returns an errno or 0 on success.
439    
440    Called to set the value of the named extended attribute.
441    
442    If you wish to reject setting of a particular form of extended attribute name
443    (e.g.: regexps matching user\..* or security\..*), then return - EOPNOTSUPP.
444    
445    If flags is set to XATTR_CREATE and the extended attribute already exists,
446    this should fail with - EEXIST. If flags is set to XATTR_REPLACE
447    and the extended attribute doesn't exist, this should fail with - ENOATTR.
448    
449    XATTR_CREATE and XATTR_REPLACE are provided by this module, but not exported
450    by default. To import them:
451    
452        use Fuse ':xattr';
453    
454    or:
455    
456        use Fuse ':all';
457    
458    =head3 getxattr
459    
460    Arguments: Pathname, extended attribute's name
461    Returns an errno, 0 if there was no value, or the extended attribute's value.
462    
463    Called to get the value of the named extended attribute.
464    
465    =head3 listxattr
466    
467    Arguments: Pathname
468    Returns a list: 0 or more text strings (the extended attribute names), followed by a numeric errno (usually 0).
469    
470    =head3 removexattr
471    
472    Arguments: Pathname, extended attribute's name
473    Returns an errno or 0 on success.
474    
475  =head1 AUTHOR  =head1 AUTHOR
476    
477  Mark Glines, E<lt>mark@glines.orgE<gt>  Mark Glines, E<lt>mark@glines.orgE<gt>

Legend:
Removed from v.7  
changed lines
  Added in v.20

  ViewVC Help
Powered by ViewVC 1.1.26