14 our @ISA = qw(Exporter DynaLoader);
16 # Items to export into callers namespace by default. Note: do not export
17 # names by default without a very good reason. Use EXPORT_OK instead.
18 # Do not simply export all your public functions/methods/constants.
20 # This allows declaration use Fuse ':all';
21 # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
24 'all' => [ qw(XATTR_CREATE XATTR_REPLACE fuse_get_context) ],
25 'xattr' => [ qw(XATTR_CREATE XATTR_REPLACE) ]
28 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
31 our $VERSION = '0.09_4';
34 # This AUTOLOAD is used to 'autoload' constants from the constant()
35 # XS function. If a constant is not found then control is passed
36 # to the AUTOLOAD in AutoLoader.
40 ($constname = $AUTOLOAD) =~ s/.*:://;
41 croak "& not defined" if $constname eq 'constant';
42 my $val = constant($constname, @_ ? $_[0] : 0);
45 $AutoLoader::AUTOLOAD = $AUTOLOAD;
46 goto &AutoLoader::AUTOLOAD;
49 croak "Your vendor has not defined Fuse macro $constname";
54 # Fixed between 5.005_53 and 5.005_61
56 *$AUTOLOAD = sub () { $val };
59 *$AUTOLOAD = sub { $val };
75 bootstrap Fuse $VERSION;
78 my @names = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink
79 rename link chmod chown truncate utime open read write statfs
80 flush release fsync setxattr getxattr listxattr removexattr);
81 my @subs = map {undef} @names;
83 my %mapping = map { $_ => $tmp++ } @names;
84 my @otherargs = qw(debug threaded mountpoint mountopts);
85 my %otherargs = (debug=>0, threaded=>0, mountpoint=>"", mountopts=>"");
86 while(my $name = shift) {
88 if(exists($otherargs{$name})) {
89 $otherargs{$name} = $subref;
91 croak "There is no function $name" unless exists($mapping{$name});
92 croak "Usage: Fuse::main(getattr => \"main::my_getattr\", ...)" unless $subref;
93 $subs[$mapping{$name}] = $subref;
96 if($otherargs{threaded}) {
97 # make sure threads are both available, and loaded.
98 if($Config{useithreads}) {
99 if(exists($threads::{VERSION})) {
100 if(exists($threads::shared::{VERSION})) {
103 carp("Thread support requires you to use threads::shared.\nThreads are disabled.\n");
104 $otherargs{threaded} = 0;
107 carp("Thread support requires you to use threads and threads::shared.\nThreads are disabled.\n");
108 $otherargs{threaded} = 0;
111 carp("Thread support was not compiled into this build of perl.\nThreads are disabled.\n");
112 $otherargs{threaded} = 0;
115 perl_fuse_main(@otherargs{@otherargs},@subs);
118 # Autoload methods go after =cut, and are processed by the autosplit program.
125 Fuse - write filesystems in Perl using FUSE
130 my ($mountpoint) = "";
131 $mountpoint = shift(@ARGV) if @ARGV;
132 Fuse::main(mountpoint=>$mountpoint, getattr=>"main::my_getattr", getdir=>"main::my_getdir", ...);
136 This lets you implement filesystems in perl, through the FUSE
137 (Filesystem in USErspace) kernel/lib interface.
139 FUSE expects you to implement callbacks for the various functions.
141 In the following definitions, "errno" can be 0 (for a success),
142 -EINVAL, -ENOENT, -EONFIRE, any integer less than 1 really.
144 You can import standard error constants by saying something like
145 "use POSIX qw(EDOTDOT ENOANO);".
147 Every constant you need (file types, open() flags, error values,
148 etc) can be imported either from POSIX or from Fcntl, often both.
149 See their respective documentations, for more information.
151 =head2 EXPORTED SYMBOLS
155 You can request all exportable symbols by using the tag ":all".
157 You can request the extended attribute symbols by using the tag ":xattr".
158 This will export XATTR_CREATE and XATTR_REPLACE.
164 Takes arguments in the form of hash key=>value pairs. There are
165 many valid keys. Most of them correspond with names of callback
166 functions, as described in section 'FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT'.
167 A few special keys also exist:
174 This turns FUSE call tracing on and off. Default is 0 (which means off).
182 The point at which to mount this filesystem. There is no default, you must
183 specify this. An example would be '/mnt'.
191 This is a comma seperated list of mount options to pass to the FUSE kernel
194 At present, it allows the specification of the allow_other
195 argument when mounting the new FUSE filesystem. To use this, you will also
196 need 'user_allow_other' in /etc/fuse.conf as per the FUSE documention
198 mountopts => "allow_other" or
207 This turns FUSE multithreading on and off. The default is 0, meaning your FUSE
208 script will run in single-threaded mode. Note that single-threaded mode also
209 means that you will not have to worry about reentrancy, though you will have to
210 worry about recursive lookups. In single-threaded mode, FUSE holds a global
211 lock on your filesystem, and will wait for one callback to return before
212 calling another. This can lead to deadlocks, if your script makes any attempt
213 to access files or directories in the filesystem it is providing. (This
214 includes calling stat() on the mount-point, statfs() calls from the 'df'
215 command, and so on and so forth.) It is worth paying a little attention and
216 being careful about this.
218 Enabling multithreading will cause FUSE to make multiple simultaneous calls
219 into the various callback functions of your perl script. If you enable
220 threaded mode, you can enjoy all the parallel execution and interactive
221 response benefits of threads, and you get to enjoy all the benefits of race
222 conditions and locking bugs, too. Please also ensure any other perl modules
223 you're using are also thread-safe.
225 (If enabled, this option will cause a warning if your perl interpreter was not
226 built with USE_ITHREADS, or if you have failed to use threads or
231 =head3 Fuse::fuse_get_context
233 use Fuse "fuse_get_context";
234 my $caller_uid = fuse_get_context()->{"uid"};
235 my $caller_gid = fuse_get_context()->{"gid"};
236 my $caller_pid = fuse_get_context()->{"pid"};
238 Access context information about the current Fuse operation.
240 =head2 FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT
245 Returns a list, very similar to the 'stat' function (see
246 perlfunc). On error, simply return a single numeric scalar
247 value (e.g. "return -ENOENT();").
249 FIXME: the "ino" field is currently ignored. I tried setting it to 0
250 in an example script, which consistently caused segfaults.
252 Fields (the following was stolen from perlfunc(1) with apologies):
254 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
255 $atime,$mtime,$ctime,$blksize,$blocks)
256 = getattr($filename);
258 Here are the meaning of the fields:
260 0 dev device number of filesystem
262 2 mode file mode (type and permissions)
263 3 nlink number of (hard) links to the file
264 4 uid numeric user ID of file's owner
265 5 gid numeric group ID of file's owner
266 6 rdev the device identifier (special files only)
267 7 size total size of file, in bytes
268 8 atime last access time in seconds since the epoch
269 9 mtime last modify time in seconds since the epoch
270 10 ctime inode change time (NOT creation time!) in seconds
272 11 blksize preferred block size for file system I/O
273 12 blocks actual number of blocks allocated
275 (The epoch was at 00:00 January 1, 1970 GMT.)
279 Arguments: link pathname.
280 Returns a scalar: either a numeric constant, or a text string.
282 This is called when dereferencing symbolic links, to learn the target.
284 example rv: return "/proc/self/fd/stdin";
288 Arguments: Containing directory name.
289 Returns a list: 0 or more text strings (the filenames), followed by a numeric errno (usually 0).
291 This is used to obtain directory listings. It's opendir(), readdir(), filldir() and closedir() all in one call.
293 example rv: return ('.', 'a', 'b', 0);
297 Arguments: Filename, numeric modes, numeric device
298 Returns an errno (0 upon success, as usual).
300 This function is called for all non-directory, non-symlink nodes,
305 Arguments: New directory pathname, numeric modes.
308 Called to create a directory.
315 Called to remove a file, device, or symlink.
322 Called to remove a directory.
326 Arguments: Existing filename, symlink name.
329 Called to create a symbolic link.
333 Arguments: old filename, new filename.
336 Called to rename a file, and/or move a file from one directory to another.
340 Arguments: Existing filename, hardlink name.
343 Called to create hard links.
347 Arguments: Pathname, numeric modes.
350 Called to change permissions on a file/directory/device/symlink.
354 Arguments: Pathname, numeric uid, numeric gid.
357 Called to change ownership of a file/directory/device/symlink.
361 Arguments: Pathname, numeric offset.
364 Called to truncate a file, at the given offset.
368 Arguments: Pathname, numeric actime, numeric modtime.
371 Called to change access/modification times for a file/directory/device/symlink.
375 Arguments: Pathname, numeric flags (which is an OR-ing of stuff like O_RDONLY
376 and O_SYNC, constants you can import from POSIX), fileinfo hash reference.
377 Returns an errno, a file handle (optional).
379 No creation, or trunctation flags (O_CREAT, O_EXCL, O_TRUNC) will be passed to open().
380 The fileinfo hash reference contains flags from the Fuse open call which may be modified by the module. The only fields presently supported are:
381 direct_io (version 2.4 onwards)
382 keep_cache (version 2.4 onwards)
383 nonseekable (version 2.9 onwards)
384 Your open() method needs only check if the operation is permitted for the given flags, and return 0 for success.
385 Optionally a file handle may be returned, which will be passed to subsequent read, write, flush, fsync and release calls.
389 Arguments: Pathname, numeric requested size, numeric offset, file handle
390 Returns a numeric errno, or a string scalar with up to $requestedsize bytes of data.
392 Called in an attempt to fetch a portion of the file.
396 Arguments: Pathname, scalar buffer, numeric offset, file handle. You can use length($buffer) to
398 Returns length($buffer) if successful (number of bytes written).
400 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.
405 Returns any of the following:
411 $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
415 -ENOANO(), $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
419 Arguments: Pathname, file handle
420 Returns an errno or 0 on success.
422 Called to synchronise any cached data. This is called before the file
423 is closed. It may be called multiple times before a file is closed.
427 Arguments: Pathname, numeric flags passed to open, file handle
428 Returns an errno or 0 on success.
430 Called to indicate that there are no more references to the file. Called once
431 for every file with the same pathname and flags as were passed to open.
435 Arguments: Pathname, numeric flags
436 Returns an errno or 0 on success.
438 Called to synchronise the file's contents. If flags is non-zero,
439 only synchronise the user data. Otherwise synchronise the user and meta data.
443 Arguments: Pathname, extended attribute's name, extended attribute's value, numeric flags (which is an OR-ing of XATTR_CREATE and XATTR_REPLACE
444 Returns an errno or 0 on success.
446 Called to set the value of the named extended attribute.
448 If you wish to reject setting of a particular form of extended attribute name
449 (e.g.: regexps matching user\..* or security\..*), then return - EOPNOTSUPP.
451 If flags is set to XATTR_CREATE and the extended attribute already exists,
452 this should fail with - EEXIST. If flags is set to XATTR_REPLACE
453 and the extended attribute doesn't exist, this should fail with - ENOATTR.
455 XATTR_CREATE and XATTR_REPLACE are provided by this module, but not exported
456 by default. To import them:
466 Arguments: Pathname, extended attribute's name
467 Returns an errno, 0 if there was no value, or the extended attribute's value.
469 Called to get the value of the named extended attribute.
474 Returns a list: 0 or more text strings (the extended attribute names), followed by a numeric errno (usually 0).
478 Arguments: Pathname, extended attribute's name
479 Returns an errno or 0 on success.
483 Mark Glines, E<lt>mark@glines.orgE<gt>
487 L<perl>, the FUSE documentation.