diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2004-11-11 15:20:05 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2004-11-11 15:20:05 +0000 |
commit | 30e8eb3e135291717eceaae69162fceb91d30aa1 (patch) | |
tree | 1db0567746719aeebe993981e2744d0340cfcc3e /perl/Fuse.pm | |
parent | 3d60e7641b52ac98d789ab091c6ada143dba5f69 (diff) | |
download | libfuse-30e8eb3e135291717eceaae69162fceb91d30aa1.tar.gz |
move perl python and lufis directories one level up
Diffstat (limited to 'perl/Fuse.pm')
-rw-r--r-- | perl/Fuse.pm | 360 |
1 files changed, 0 insertions, 360 deletions
diff --git a/perl/Fuse.pm b/perl/Fuse.pm deleted file mode 100644 index 6a01677..0000000 --- a/perl/Fuse.pm +++ /dev/null @@ -1,360 +0,0 @@ -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 |