/[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 16 by dpavlin, Wed Jun 22 16:15:17 2005 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 20  our @ISA = qw(Exporter DynaLoader); Line 21  our @ISA = qw(Exporter DynaLoader);
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 = (  our %EXPORT_TAGS = (
24                      'all' => [ qw(FUSE_DEBUG XATTR_CREATE XATTR_REPLACE) ],                      'all' => [ qw(XATTR_CREATE XATTR_REPLACE) ],
                     'debug' => [ qw(FUSE_DEBUG) ],  
25                      'xattr' => [ qw(XATTR_CREATE XATTR_REPLACE) ]                      '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.06';  
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 77  sub XATTR_REPLACE { Line 75  sub XATTR_REPLACE {
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,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);                           flush release fsync setxattr getxattr listxattr removexattr);
# Line 85  sub main { Line 85  sub main {
85          my ($tmp) = 0;          my ($tmp) = 0;
86          my (%mapping) = map { $_ => $tmp++ } (@names);          my (%mapping) = map { $_ => $tmp++ } (@names);
87          my (%optmap) = map { $_ => 1 } (@validOpts);          my (%optmap) = map { $_ => 1 } (@validOpts);
88          my (%otherargs) = (debug=>0, mountpoint=>"", mountopts=>"");          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          foreach my $opt ( split(/,/,$otherargs{mountopts}) ) {          foreach my $opt ( split(/,/,$otherargs{mountopts}) ) {
100            if ( ! exists($optmap{$opt}) ) {                  if ( ! exists($optmap{$opt}) ) {
101              croak "Use of an invalid mountopt argument";                          croak "Use of an invalid mountopt argument";
102            }                  }
103          }          }
104          perl_fuse_main($otherargs{debug},$otherargs{mountpoint},$otherargs{mountopts},@subs);          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 120  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 129  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 144  See their respective documentations, for Line 158  See their respective documentations, for
158    
159  =head2 EXPORTED SYMBOLS  =head2 EXPORTED SYMBOLS
160    
161  FUSE_DEBUG by default.  None by default.
162    
163  You can request all exportable symbols by using the tag ":all".  You can request all exportable symbols by using the tag ":all".
164    
 You can request all debug symbols by using the tag ":debug".  
 This will export FUSE_DEBUG.  
   
165  You can request the extended attribute symbols by using the tag ":xattr".  You can request the extended attribute symbols by using the tag ":xattr".
166  This will export XATTR_CREATE and XATTR_REPLACE.  This will export XATTR_CREATE and XATTR_REPLACE.
167    
# Line 197  need 'user_allow_other' in /etc/fuse.con Line 208  need 'user_allow_other' in /etc/fuse.con
208    
209  =back  =back
210    
211  unthreaded => boolean  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    

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

  ViewVC Help
Powered by ViewVC 1.1.26