1e3573d7443a127c478838be9f65200a0dfa0761
[perl-fuse.git] / Fuse.pm
1 package Fuse;
2
3 use 5.006;
4 use strict;
5 use warnings;
6 use Errno;
7 use Carp;
8 use Config;
9
10 require Exporter;
11 require DynaLoader;
12 use AutoLoader;
13 our @ISA = qw(Exporter DynaLoader);
14
15 # Items to export into callers namespace by default. Note: do not export
16 # names by default without a very good reason. Use EXPORT_OK instead.
17 # Do not simply export all your public functions/methods/constants.
18
19 # This allows declaration       use Fuse ':all';
20 # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
21 # will save memory.
22 our %EXPORT_TAGS = (
23                     'all' => [ qw(XATTR_CREATE XATTR_REPLACE fuse_get_context fuse_version) ],
24                     'xattr' => [ qw(XATTR_CREATE XATTR_REPLACE) ]
25                     );
26
27 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
28
29 our @EXPORT = ();
30 our $VERSION = '0.14';
31
32 sub AUTOLOAD {
33     # This AUTOLOAD is used to 'autoload' constants from the constant()
34     # XS function.  If a constant is not found then control is passed
35     # to the AUTOLOAD in AutoLoader.
36
37     my $constname;
38     our $AUTOLOAD;
39     ($constname = $AUTOLOAD) =~ s/.*:://;
40     croak "& not defined" if $constname eq 'constant';
41     my $val = constant($constname, @_ ? $_[0] : 0);
42     if ($! != 0) {
43         if ($!{EINVAL}) {
44             $AutoLoader::AUTOLOAD = $AUTOLOAD;
45             goto &AutoLoader::AUTOLOAD;
46         }
47         else {
48             croak "Your vendor has not defined Fuse macro $constname";
49         }
50     }
51     {
52         no strict 'refs';
53         # Fixed between 5.005_53 and 5.005_61
54         if ($] >= 5.00561) {
55             *$AUTOLOAD = sub () { $val };
56         }
57         else {
58             *$AUTOLOAD = sub { $val };
59         }
60     }
61     goto &$AUTOLOAD;
62 }
63
64 bootstrap Fuse $VERSION;
65
66 sub main {
67         my @names = qw(getattr readlink getdir mknod mkdir unlink rmdir symlink
68                         rename link chmod chown truncate utime open read write statfs
69                         flush release fsync setxattr getxattr listxattr removexattr);
70         my $fuse_version = fuse_version();
71         if ($fuse_version >= 2.3) {
72                 push(@names, qw/opendir readdir releasedir fsyncdir init destroy/);
73         }
74         if ($fuse_version >= 2.5) {
75                 push(@names, qw/access create ftruncate fgetattr/);
76         }
77         if ($fuse_version >= 2.6) {
78                 push(@names, qw/lock utimens bmap/);
79         }
80         if ($fuse_version >= 2.8) {
81                 # junk doesn't contain a function pointer, and hopefully
82                 # never will; it's a "dead" zone in the struct
83                 # fuse_operations where a flag bit is declared. we don't
84                 # need to concern ourselves with it, and it appears any
85                 # arch with a 64 bit pointer will align everything to
86                 # 8 bytes, making the question of pointer alignment for
87                 # the last 2 wrapper functions no big thing.
88                 push(@names, qw/junk ioctl/);
89 #               push(@names, qw/junk ioctl poll/);
90         }
91         my @subs = map {undef} @names;
92         my $tmp = 0;
93         my %mapping = map { $_ => $tmp++ } @names;
94         my @otherargs = qw(debug threaded mountpoint mountopts nullpath_ok);
95         my %otherargs = (
96                           debug         => 0,
97                           threaded      => 0,
98                           mountpoint    => "",
99                           mountopts     => "",
100                           nullpath_ok   => 0,
101                         );
102         while(my $name = shift) {
103                 my ($subref) = shift;
104                 if(exists($otherargs{$name})) {
105                         $otherargs{$name} = $subref;
106                 } else {
107                         croak "There is no function $name" unless exists($mapping{$name});
108                         croak "Usage: Fuse::main(getattr => \"main::my_getattr\", ...)" unless $subref;
109                         $subs[$mapping{$name}] = $subref;
110                 }
111         }
112         if($otherargs{threaded}) {
113                 # make sure threads are both available, and loaded.
114                 if($Config{useithreads}) {
115                         if(exists($threads::{VERSION})) {
116                                 if(exists($threads::shared::{VERSION})) {
117                                         # threads will work.
118                                 } else {
119                                         carp("Thread support requires you to use threads::shared.\nThreads are disabled.\n");
120                                         $otherargs{threaded} = 0;
121                                 }
122                         } else {
123                                 carp("Thread support requires you to use threads and threads::shared.\nThreads are disabled.\n");
124                                 $otherargs{threaded} = 0;
125                         }
126                 } else {
127                         carp("Thread support was not compiled into this build of perl.\nThreads are disabled.\n");
128                         $otherargs{threaded} = 0;
129                 }
130         }
131         perl_fuse_main(@otherargs{@otherargs},@subs);
132 }
133
134 # Autoload methods go after =cut, and are processed by the autosplit program.
135
136 1;
137 __END__
138
139 =head1 NAME
140
141 Fuse - write filesystems in Perl using FUSE
142
143 =head1 SYNOPSIS
144
145   use Fuse;
146   my ($mountpoint) = "";
147   $mountpoint = shift(@ARGV) if @ARGV;
148   Fuse::main(mountpoint=>$mountpoint, getattr=>"main::my_getattr", getdir=>"main::my_getdir", ...);
149
150 =head1 DESCRIPTION
151
152 This lets you implement filesystems in perl, through the FUSE
153 (Filesystem in USErspace) kernel/lib interface.
154
155 FUSE expects you to implement callbacks for the various functions.
156
157 In the following definitions, "errno" can be 0 (for a success),
158 -EINVAL, -ENOENT, -EONFIRE, any integer less than 1 really.
159
160 You can import standard error constants by saying something like
161 "use POSIX qw(EDOTDOT ENOANO);".
162
163 Every constant you need (file types, open() flags, error values,
164 etc) can be imported either from POSIX or from Fcntl, often both.
165 See their respective documentations, for more information.
166
167 =head2 EXPORTED SYMBOLS
168
169 None by default.
170
171 You can request all exportable symbols by using the tag ":all".
172
173 You can request the extended attribute symbols by using the tag ":xattr".
174 This will export XATTR_CREATE and XATTR_REPLACE.
175
176 =head2 FUNCTIONS
177
178 =head3 Fuse::main
179
180 Takes arguments in the form of hash key=>value pairs.  There are
181 many valid keys.  Most of them correspond with names of callback
182 functions, as described in section 'FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT'.
183 A few special keys also exist:
184
185
186 debug => boolean
187
188 =over 1
189
190 This turns FUSE call tracing on and off.  Default is 0 (which means off).
191
192 =back
193
194 mountpoint => string
195
196 =over 1
197
198 The point at which to mount this filesystem.  There is no default, you must
199 specify this.  An example would be '/mnt'.
200
201 =back
202
203 mountopts => string
204
205 =over 1
206
207 This is a comma seperated list of mount options to pass to the FUSE kernel
208 module.
209
210 At present, it allows the specification of the allow_other
211 argument when mounting the new FUSE filesystem. To use this, you will also
212 need 'user_allow_other' in /etc/fuse.conf as per the FUSE documention
213
214   mountopts => "allow_other" or
215   mountopts => ""
216
217 =back
218
219 threaded => boolean
220
221 =over 1
222
223 This turns FUSE multithreading on and off.  The default is 0, meaning your FUSE
224 script will run in single-threaded mode.  Note that single-threaded mode also
225 means that you will not have to worry about reentrancy, though you will have to
226 worry about recursive lookups.  In single-threaded mode, FUSE holds a global
227 lock on your filesystem, and will wait for one callback to return before
228 calling another.  This can lead to deadlocks, if your script makes any attempt
229 to access files or directories in the filesystem it is providing.  (This
230 includes calling stat() on the mount-point, statfs() calls from the 'df'
231 command, and so on and so forth.)  It is worth paying a little attention and
232 being careful about this.
233
234 Enabling multithreading will cause FUSE to make multiple simultaneous calls
235 into the various callback functions of your perl script.  If you enable 
236 threaded mode, you can enjoy all the parallel execution and interactive
237 response benefits of threads, and you get to enjoy all the benefits of race
238 conditions and locking bugs, too.  Please also ensure any other perl modules
239 you're using are also thread-safe.
240
241 (If enabled, this option will cause a warning if your perl interpreter was not
242 built with USE_ITHREADS, or if you have failed to use threads or
243 threads::shared.)
244
245 =back
246
247 nullpath_ok => boolean
248
249 =over 1
250
251 This flag tells Fuse to not pass paths for functions that operate on file
252 or directory handles. This will yield empty path parameters for functions
253 including read, write, flush, release, fsync, readdir, releasedir,
254 fsyncdir, truncate, fgetattr and lock. If you use this, you must return
255 file/directory handles from open, opendir and create. Default is 0 (off).
256 Only effective on Fuse 2.8 and up; with earlier versions, this does nothing.
257
258 =back
259
260 =head3 Fuse::fuse_get_context
261  
262  use Fuse "fuse_get_context";
263  my $caller_uid = fuse_get_context()->{"uid"};
264  my $caller_gid = fuse_get_context()->{"gid"};
265  my $caller_pid = fuse_get_context()->{"pid"};
266  
267 Access context information about the current Fuse operation. 
268
269 =head3 Fuse::fuse_version
270
271 Indicates the Fuse version in use; more accurately, indicates the version
272 of the Fuse API in use at build time. Returned as a decimal value; i.e.,
273 for Fuse API v2.6, will return "2.6".
274
275 =head2 FUNCTIONS YOUR FILESYSTEM MAY IMPLEMENT
276
277 =head3 getattr
278
279 Arguments:  filename.
280
281 Returns a list, very similar to the 'stat' function (see
282 perlfunc).  On error, simply return a single numeric scalar
283 value (e.g. "return -ENOENT();").
284
285 FIXME: the "ino" field is currently ignored.  I tried setting it to 0
286 in an example script, which consistently caused segfaults.
287
288 Fields (the following was stolen from perlfunc(1) with apologies):
289
290 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
291         $atime,$mtime,$ctime,$blksize,$blocks)
292                          = getattr($filename);
293
294 Here are the meaning of the fields:
295
296  0 dev      device number of filesystem
297  1 ino      inode number
298  2 mode     file mode  (type and permissions)
299  3 nlink    number of (hard) links to the file
300  4 uid      numeric user ID of file's owner
301  5 gid      numeric group ID of file's owner
302  6 rdev     the device identifier (special files only)
303  7 size     total size of file, in bytes
304  8 atime    last access time in seconds since the epoch
305  9 mtime    last modify time in seconds since the epoch
306 10 ctime    inode change time (NOT creation time!) in seconds
307             since the epoch
308 11 blksize  preferred block size for file system I/O
309 12 blocks   actual number of blocks allocated
310
311 (The epoch was at 00:00 January 1, 1970 GMT.)
312
313 =head3 readlink
314
315 Arguments:  link pathname.
316
317 Returns a scalar: either a numeric constant, or a text string.
318
319 This is called when dereferencing symbolic links, to learn the target.
320
321 example rv: return "/proc/self/fd/stdin";
322
323 =head3 getdir
324
325 Arguments:  Containing directory name.
326
327 Returns a list: 0 or more text strings (the filenames), followed by a numeric errno (usually 0).
328
329 This is used to obtain directory listings.  It's opendir(), readdir(), filldir() and closedir() all in one call.
330
331 example rv: return ('.', 'a', 'b', 0);
332
333 =head3 mknod
334
335 Arguments:  Filename, numeric modes, numeric device
336
337 Returns an errno (0 upon success, as usual).
338
339 This function is called for all non-directory, non-symlink nodes,
340 not just devices.
341
342 =head3 mkdir
343
344 Arguments:  New directory pathname, numeric modes.
345
346 Returns an errno.
347
348 Called to create a directory.
349
350 =head3 unlink
351
352 Arguments:  Filename.
353
354 Returns an errno.
355
356 Called to remove a file, device, or symlink.
357
358 =head3 rmdir
359
360 Arguments:  Pathname.
361
362 Returns an errno.
363
364 Called to remove a directory.
365
366 =head3 symlink
367
368 Arguments:  Existing filename, symlink name.
369
370 Returns an errno.
371
372 Called to create a symbolic link.
373
374 =head3 rename
375
376 Arguments:  old filename, new filename.
377
378 Returns an errno.
379
380 Called to rename a file, and/or move a file from one directory to another.
381
382 =head3 link
383
384 Arguments:  Existing filename, hardlink name.
385
386 Returns an errno.
387
388 Called to create hard links.
389
390 =head3 chmod
391
392 Arguments:  Pathname, numeric modes.
393
394 Returns an errno.
395
396 Called to change permissions on a file/directory/device/symlink.
397
398 =head3 chown
399
400 Arguments:  Pathname, numeric uid, numeric gid.
401
402 Returns an errno.
403
404 Called to change ownership of a file/directory/device/symlink.
405
406 =head3 truncate
407
408 Arguments:  Pathname, numeric offset.
409
410 Returns an errno.
411
412 Called to truncate a file, at the given offset.
413
414 =head3 utime
415
416 Arguments:  Pathname, numeric actime, numeric modtime.
417
418 Returns an errno.
419
420 Called to change access/modification times for a file/directory/device/symlink.
421
422 =head3 open
423
424 Arguments:  Pathname, numeric flags (which is an OR-ing of stuff like O_RDONLY
425 and O_SYNC, constants you can import from POSIX), fileinfo hash reference.
426
427 Returns an errno, a file handle (optional).
428
429 No creation, or trunctation flags (O_CREAT, O_EXCL, O_TRUNC) will be passed to open().
430 The fileinfo hash reference contains flags from the Fuse open call which may be modified by the module. The only fields presently supported are:
431  direct_io (version 2.4 onwards)
432  keep_cache (version 2.4 onwards)
433  nonseekable (version 2.9 onwards)
434 Your open() method needs only check if the operation is permitted for the given flags, and return 0 for success.
435 Optionally a file handle may be returned, which will be passed to subsequent read, write, flush, fsync and release calls.
436
437 =head3 read
438
439 Arguments:  Pathname, numeric requested size, numeric offset, file handle
440
441 Returns a numeric errno, or a string scalar with up to $requestedsize bytes of data.
442
443 Called in an attempt to fetch a portion of the file.
444
445 =head3 write
446
447 Arguments:  Pathname, scalar buffer, numeric offset, file handle.  You can use length($buffer) to
448 find the buffersize.
449 Returns length($buffer) if successful (number of bytes written).
450
451 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.
452
453 =head3 statfs
454
455 Arguments:  none
456
457 Returns any of the following:
458
459 -ENOANO()
460
461 or
462
463 $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
464
465 or
466
467 -ENOANO(), $namelen, $files, $files_free, $blocks, $blocks_avail, $blocksize
468
469 =head3 flush
470
471 Arguments: Pathname, file handle
472
473 Returns an errno or 0 on success.
474
475 Called to synchronise any cached data. This is called before the file
476 is closed. It may be called multiple times before a file is closed.
477
478 =head3 release
479
480 Arguments: Pathname, numeric flags passed to open, file handle
481 Returns an errno or 0 on success.
482
483 Called to indicate that there are no more references to the file. Called once
484 for every file with the same pathname and flags as were passed to open.
485
486 =head3 fsync
487
488 Arguments: Pathname, numeric flags
489
490 Returns an errno or 0 on success.
491
492 Called to synchronise the file's contents. If flags is non-zero,
493 only synchronise the user data. Otherwise synchronise the user and meta data.
494
495 =head3 setxattr
496
497 Arguments: Pathname, extended attribute's name, extended attribute's value, numeric flags (which is an OR-ing of XATTR_CREATE and XATTR_REPLACE 
498
499 Returns an errno or 0 on success.
500
501 Called to set the value of the named extended attribute.
502
503 If you wish to reject setting of a particular form of extended attribute name
504 (e.g.: regexps matching user\..* or security\..*), then return - EOPNOTSUPP.
505
506 If flags is set to XATTR_CREATE and the extended attribute already exists,
507 this should fail with - EEXIST. If flags is set to XATTR_REPLACE
508 and the extended attribute doesn't exist, this should fail with - ENOATTR.
509
510 XATTR_CREATE and XATTR_REPLACE are provided by this module, but not exported
511 by default. To import them:
512
513     use Fuse ':xattr';
514
515 or:
516
517     use Fuse ':all';
518
519 =head3 getxattr
520
521 Arguments: Pathname, extended attribute's name
522
523 Returns an errno, 0 if there was no value, or the extended attribute's value.
524
525 Called to get the value of the named extended attribute.
526
527 =head3 listxattr
528
529 Arguments: Pathname
530
531 Returns a list: 0 or more text strings (the extended attribute names), followed by a numeric errno (usually 0).
532
533 =head3 removexattr
534
535 Arguments: Pathname, extended attribute's name
536
537 Returns an errno or 0 on success.
538
539 =head3 opendir
540
541 Arguments: Pathname of a directory
542 Returns an errno, and a directory handle (optional)
543
544 Called when opening a directory for reading. If special handling is
545 required to open a directory, this operation can be implemented to handle
546 that.
547
548 =head3 readdir
549
550 Arguments: Pathname of a directory, numeric offset, (optional) directory handle
551
552 Returns a list of 0 or more entries, followed by a numeric errno (usually 0).
553 The entries can be simple strings (filenames), or arrays containing an
554 offset number, the filename, and optionally an array ref containing the
555 stat values (as would be returned from getattr()).
556
557 This is used to read entries from a directory. It can be used to return just
558 entry names like getdir(), or can get a segment of the available entries,
559 which requires using array refs and the 2- or 3-item form, with offset values
560 starting from 1. If you wish to return the parameters to fill each entry's
561 struct stat, but do not wish to do partial entry lists/entry counting, set
562 the first element of each array to 0 always.
563
564 Note that if this call is implemented, it overrides getdir() ALWAYS.
565
566 =head3 releasedir
567
568 Arguments: Pathname of a directory, (optional) directory handle
569
570 Returns an errno or 0 on success
571
572 Called when there are no more references to an opened directory. Called once
573 for each pathname or handle passed to opendir(). Similar to release(), but
574 for directories. Accepts a return value, but like release(), the response
575 code will not propagate to any corresponding closedir() calls.
576
577 =head3 fsyncdir
578
579 Arguments: Pathname of a directory, numeric flags, (optional) directory handle
580
581 Returns an errno or 0 on success.
582
583 Called to synchronize any changes to a directory's contents. If flag is
584 non-zero, only synchronize user data, otherwise synchronize user data and
585 metadata.
586
587 =head3 init
588
589 Arguments: None.
590
591 Returns (optionally) an SV to be passed as private_data via fuse_get_context().
592
593 =head3 destroy
594
595 Arguments: (optional) private data SV returned from init(), if any.
596
597 Returns nothing.
598
599 =head3 access
600
601 Arguments: Pathname, access mode flags
602
603 Returns an errno or 0 on success.
604
605 Determine if the user attempting to access the indicated file has access to
606 perform the requested actions. The user ID can be determined by calling
607 fuse_get_context(). See access(2) for more information.
608
609 =head3 create
610
611 Arguments: Pathname, create mask, open mode flags
612
613 Returns errno or 0 on success, and (optional) file handle.
614
615 Create a file with the path indicated, then open a handle for reading and/or
616 writing with the supplied mode flags. Can also return a file handle like
617 open() as part of the call.
618
619 =head3 ftruncate
620
621 Arguments: Pathname, numeric offset, (optional) file handle
622
623 Returns errno or 0 on success
624
625 Like truncate(), but on an opened file.
626
627 =head3 fgetattr
628
629 Arguments: Pathname, (optional) file handle
630
631 Returns a list, very similar to the 'stat' function (see
632 perlfunc).  On error, simply return a single numeric scalar
633 value (e.g. "return -ENOENT();").
634
635 Like getattr(), but on an opened file.
636
637 =head3 lock
638
639 Arguments: Pathname, numeric command code, hashref containing lock parameters, (optional) file handle
640
641 Returns errno or 0 on success
642
643 Used to lock or unlock regions of a file. Locking is handled locally, but this
644 allows (especially for networked file systems) for protocol-level locking
645 semantics to also be employed, if any are available.
646
647 See the Fuse documentation for more explanation of lock(). The needed symbols
648 for the lock constants can be obtained by importing Fcntl.
649
650 =head3 utimens
651
652 Arguments: Pathname, last accessed time, last modified time
653
654 Returns errno or 0 on success
655
656 Like utime(), but allows time resolution down to the nanosecond. Currently
657 times are passed as "numeric" (internally I believe these are represented
658 typically as "long double"), so the sub-second portion is represented as
659 fractions of a second.
660
661 Note that if this call is implemented, it overrides utime() ALWAYS.
662
663 =head3 bmap
664
665 Arguments: Pathname, numeric blocksize, numeric block number
666
667 Returns errno or 0 on success, and physical block number if successful
668
669 Used to map a block number offset in a file to the physical block offset
670 on the block device backing the file system. This is intended for
671 filesystems that are stored on an actual block device, with the 'blkdev'
672 option passed.
673
674 =head3 ioctl
675
676 Arguments: Pathname, (signed) ioctl command code, flags, data if ioctl op is a write, (optional) file handle
677
678 Returns errno or 0 on success, and data if ioctl op is a read
679
680 Used to handle ioctl() operations on files. See ioctl(2) for more
681 information on the fine details of ioctl operation numbers. May need to
682 h2ph system headers to get the necessary macros; keep in mind the macros
683 are highly OS-dependent.
684
685 Keep in mind that read and write are from the client perspective, so
686 read from our end means data is going *out*, and write means data is
687 coming *in*. It can be slightly confusing.
688
689 =head1 AUTHOR
690
691 Mark Glines, E<lt>mark@glines.orgE<gt>
692
693 =head1 SEE ALSO
694
695 L<perl>, the FUSE documentation.
696
697 =cut