Permalink
Browse files

Initial revision

git-svn-id: svn+ssh://llin/home/dpavlin/private/svn/fuse/perl/trunk@4 6e4b0b00-1209-0410-87b2-b275959b5705
  • Loading branch information...
1 parent a678616 commit 06dd8ebb4bc96acd173c00b24251546d74762990 @szmi szmi committed Nov 11, 2004
Showing with 1,908 additions and 0 deletions.
  1. +1 −0 .cvsignore
  2. +4 −0 AUTHORS
  3. +12 −0 Changes
  4. +360 −0 Fuse.pm
  5. +572 −0 Fuse.xs
  6. +7 −0 MANIFEST
  7. +17 −0 Makefile.PL
  8. +69 −0 README
  9. +90 −0 examples/example.pl
  10. +136 −0 examples/loopback.pl
  11. +82 −0 examples/rmount.pl
  12. +143 −0 examples/rmount_remote.pl
  13. +8 −0 test.pl
  14. +11 −0 test/chmod.t
  15. +14 −0 test/chown.t
  16. +42 −0 test/getattr.t
  17. +33 −0 test/getdir.t
  18. +23 −0 test/helper.pm
  19. +16 −0 test/link.t
  20. +11 −0 test/mkdir.t
  21. +37 −0 test/mknod.t
  22. +10 −0 test/open.t
  23. +13 −0 test/read.t
  24. +11 −0 test/readlink.t
  25. +12 −0 test/rename.t
  26. +13 −0 test/rmdir.t
  27. +25 −0 test/s/mount.t
  28. +7 −0 test/s/umount.t
  29. +21 −0 test/statfs.t
  30. +19 −0 test/symlink.t
  31. +5 −0 test/test-template
  32. +12 −0 test/truncate.t
  33. +14 −0 test/unlink.t
  34. +13 −0 test/utime.t
  35. +45 −0 test/write.t
View
@@ -0,0 +1 @@
+Fuse.bs Fuse.c Makefile blib pm_to_blib
View
@@ -0,0 +1,4 @@
+Perl bindings
+-------------
+
+Mark Glines <mark@glines.org>
View
12 Changes
@@ -0,0 +1,12 @@
+Revision history for Perl extension Fuse.
+
+0.01 Wed Nov 28 21:45:20 2001
+ - original version; created by h2xs 1.21 with options
+ include/fuse.h
+
+0.02 Sun Dec 2 18:59:56 2001
+ - works well enough to release, but still needs testing
+
+0.03 Wed Dec 5 02:17:52 2001
+ - changed getattr() to smell like perl's stat()
+ - fleshed out the documentation a bit
View
360 Fuse.pm
@@ -0,0 +1,360 @@
+package Fuse;
+
+use 5.006;
+use strict;
+use warnings;
+use Errno;
+use Carp;
+
+require Exporter;
+require DynaLoader;
+use AutoLoader;
+use Data::Dumper;
+our @ISA = qw(Exporter DynaLoader);
+
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+
+# This allows declaration use Fuse ':all';
+# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
+# will save memory.
+our %EXPORT_TAGS = ( 'all' => [ qw(
+ FUSE_DEBUG
+) ] );
+
+our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
+
+our @EXPORT = qw(
+ FUSE_DEBUG
+);
+our $VERSION = '0.01';
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my $constname;
+ our $AUTOLOAD;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ croak "& not defined" if $constname eq 'constant';
+ my $val = constant($constname, @_ ? $_[0] : 0);
+ if ($! != 0) {
+ if ($!{EINVAL}) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ croak "Your vendor has not defined Fuse macro $constname";
+ }
+ }
+ {
+ no strict 'refs';
+ # Fixed between 5.005_53 and 5.005_61
+ if ($] >= 5.00561) {
+ *$AUTOLOAD = sub () { $val };
+ }
+ else {
+ *$AUTOLOAD = sub { $val };
+ }
+ }
+ goto &$AUTOLOAD;
+}
+
+bootstrap Fuse $VERSION;
+
+sub main {
+ my (@subs) = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+ my (@names) = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink
+ rename link chmod chown truncate utime open read write statfs);
+ my ($tmp) = 0;
+ my (%mapping) = map { $_ => $tmp++ } (@names);
+ my (%otherargs) = (debug=>0, mountpoint=>"");
+ while(my $name = shift) {
+ my ($subref) = shift;
+ if(exists($otherargs{$name})) {
+ $otherargs{$name} = $subref;
+ } else {
+ croak "There is no function $name" unless exists($mapping{$name});
+ croak "Usage: Fuse::main(getattr => &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";
+ $subs[$mapping{$name}] = $subref;
+ }
+ }
+ perl_fuse_main($otherargs{debug},$otherargs{mountpoint},@subs);
+}
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+
+=head1 NAME
+
+Fuse - write filesystems in Perl using FUSE
+
+=head1 SYNOPSIS
+
+ use Fuse;
+ my ($mountpoint) = "";
+ $mountpoint = shift(@ARGV) if @ARGV;
+ Fuse::main(mountpoint=>$mountpoint, getattr=>\&my_getattr, getdir=>\&my_getdir, ...);
+
+=head1 DESCRIPTION
+
+This lets you implement filesystems in perl, through the FUSE
+(Filesystem in USErspace) kernel/lib interface.
+
+FUSE expects you to implement callbacks for the various functions.
+
+NOTE: I have only tested the things implemented in example.pl!
+It should work, but some things may not.
+
+In the following definitions, "errno" can be 0 (for a success),
+-EINVAL, -ENOENT, -EONFIRE, any integer less than 1 really.
+
+You can import standard error constants by saying something like
+"use POSIX qw(EDOTDOT ENOANO);".
+
+Every constant you need (file types, open() flags, error values,
+etc) can be imported either from POSIX or from Fcntl, often both.
+See their respective documentations, for more information.
+
+=head2 EXPORT
+
+None by default.
+
+=head2 EXPORTABLE CONSTANTS
+
+None.
+
+=head2 FUNCTIONS
+
+=head3 Fuse::main
+
+Takes arguments in the form of hash key=>value pairs. There are
+many valid keys. Most of them correspond with names of callback
+functions, as described in section 'FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT'.
+A few special keys also exist:
+
+
+debug => boolean
+
+=over 1
+
+This turns FUSE call tracing on and off. Default is 0 (which means off).
+
+=back
+
+mountpoint => string
+
+=over 1
+
+The point at which to mount this filesystem. There is no default, you must
+specify this. An example would be '/mnt'.
+
+=back
+
+unthreaded => boolean
+
+=over 1
+
+This turns FUSE multithreading off and on. NOTE: This perlmodule does not
+currently work properly in multithreaded mode! The author is unfortunately
+not familiar enough with perl-threads internals, and according to the
+documentation available at time of writing (2002-03-08), those internals are
+subject to changing anyway. Note that singlethreaded mode also means that
+you will not have to worry about reentrancy, though you will have to worry
+about recursive lookups (since the kernel holds a global lock on your
+filesystem and blocks waiting for one callback to complete before calling
+another).
+
+I hope to add full multithreading functionality later, but for now, I
+recommend you leave this option at the default, 1 (which means
+unthreaded, no threads will be used and no reentrancy is needed).
+
+=back
+
+=head2 FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT
+
+=head3 getattr
+
+Arguments: filename.
+Returns a list, very similar to the 'stat' function (see
+perlfunc). On error, simply return a single numeric scalar
+value (e.g. "return -ENOENT();").
+
+FIXME: the "ino" field is currently ignored. I tried setting it to 0
+in an example script, which consistently caused segfaults.
+
+Fields (the following was stolen from perlfunc(1) with apologies):
+
+($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks)
+ = getattr($filename);
+
+Here are the meaning of the fields:
+
+ 0 dev device number of filesystem
+ 1 ino inode number
+ 2 mode file mode (type and permissions)
+ 3 nlink number of (hard) links to the file
+ 4 uid numeric user ID of file's owner
+ 5 gid numeric group ID of file's owner
+ 6 rdev the device identifier (special files only)
+ 7 size total size of file, in bytes
+ 8 atime last access time in seconds since the epoch
+ 9 mtime last modify time in seconds since the epoch
+10 ctime inode change time (NOT creation time!) in seconds
+ since the epoch
+11 blksize preferred block size for file system I/O
+12 blocks actual number of blocks allocated
+
+(The epoch was at 00:00 January 1, 1970 GMT.)
+
+=head3 readlink
+
+Arguments: link pathname.
+Returns a scalar: either a numeric constant, or a text string.
+
+This is called when dereferencing symbolic links, to learn the target.
+
+example rv: return "/proc/self/fd/stdin";
+
+=head3 getdir
+
+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.
+
+example rv: return ('.', 'a', 'b', 0);
+
+=head3 mknod
+
+Arguments: Filename, numeric modes, numeric device
+Returns an errno (0 upon success, as usual).
+
+This function is called for all non-directory, non-symlink nodes,
+not just devices.
+
+=head3 mkdir
+
+Arguments: New directory pathname, numeric modes.
+Returns an errno.
+
+Called to create a directory.
+
+=head3 unlink
+
+Arguments: Filename.
+Returns an errno.
+
+Called to remove a file, device, or symlink.
+
+=head3 rmdir
+
+Arguments: Pathname.
+Returns an errno.
+
+Called to remove a directory.
+
+=head3 symlink
+
+Arguments: Existing filename, symlink name.
+Returns an errno.
+
+Called to create a symbolic link.
+
+=head3 rename
+
+Arguments: old filename, new filename.
+Returns an errno.
+
+Called to rename a file, and/or move a file from one directory to another.
+
+=head3 link
+
+Arguments: Existing filename, hardlink name.
+Returns an errno.
+
+Called to create hard links.
+
+=head3 chmod
+
+Arguments: Pathname, numeric modes.
+Returns an errno.
+
+Called to change permissions on a file/directory/device/symlink.
+
+=head3 chown
+
+Arguments: Pathname, numeric uid, numeric gid.
+Returns an errno.
+
+Called to change ownership of a file/directory/device/symlink.
+
+=head3 truncate
+
+Arguments: Pathname, numeric offset.
+Returns an errno.
+
+Called to truncate a file, at the given offset.
+
+=head3 utime
+
+Arguments: Pathname, numeric actime, numeric modtime.
+Returns an errno.
+
+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.
+
+No creation, or trunctation flags (O_CREAT, O_EXCL, O_TRUNC) will be passed to open().
+Your open() method needs only check if the operation is permitted for the given flags, and return 0 for success.
+
+=head3 read
+
+Arguments: Pathname, numeric requestedsize, numeric offset.
+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
+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.
+
+=head3 statfs
+
+Arguments: none
+Returns any of the following:
+
+-ENOANO()
+
+or
+
+$namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
+
+or
+
+-ENOANO(), $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
+
+=head1 AUTHOR
+
+Mark Glines, E<lt>mark@glines.orgE<gt>
+
+=head1 SEE ALSO
+
+L<perl>, the FUSE documentation.
+
+=cut
Oops, something went wrong.

0 comments on commit 06dd8eb

Please sign in to comment.