use blib;
use Fuse;
use IO::File;
-use POSIX qw(ENOENT ENOSYS EEXIST EPERM O_RDONLY O_RDWR O_APPEND O_CREAT);
+use POSIX qw(ENOENT ENOSYS EEXIST EPERM O_RDONLY O_RDWR O_APPEND O_CREAT setsid);
use Fcntl qw(S_ISBLK S_ISCHR S_ISFIFO SEEK_SET S_ISREG S_ISFIFO S_IMODE S_ISCHR S_ISBLK S_ISSOCK);
use Getopt::Long;
use Lchown;
}
return 255,1000000,500000,1000000,500000,4096;
}
+
+# Required for some edge cases where a simple fork() won't do.
+# from http://perldoc.perl.org/perlipc.html#Complete-Dissociation-of-Child -from-Parent
+sub daemonize {
+ chdir("/") || die "can't chdir to /: $!";
+ open(STDIN, "< /dev/null") || die "can't read /dev/null: $!";
+ open(STDOUT, "> /dev/null") || die "can't write to /dev/null: $!";
+ defined(my $pid = fork()) || die "can't fork: $!";
+ exit if $pid; # non-zero now means I am the parent
+ (setsid() != -1) || die "Can't start a new session: $!";
+ open(STDERR, ">&STDOUT") || die "can't dup stdout: $!";
+
+ if ($pidfile) {
+ open(PIDFILE, '>', $pidfile);
+ print PIDFILE $$, "\n";
+ close(PIDFILE);
+ }
+}
+
my ($mountpoint) = '';
$mountpoint = shift(@ARGV) if @ARGV;
print STDERR "ERROR: attempted to mount to non-directory\n";
return -&ENOTDIR
}
-my $pid = fork();
-die("fork() failed: $!") unless defined $pid;
-if ($pid > 0) {
- # parent process
- exit(0);
-}
-if ($pidfile) {
- open(PIDFILE, '>', $pidfile);
- print PIDFILE $$, "\n";
- close(PIDFILE);
-}
+daemonize();
+
Fuse::main(
'mountpoint' => $mountpoint,
'getattr' => 'main::x_getattr',
@ISA = "Exporter";
@EXPORT_OK = qw($_loop $_opts $_point $_pidfile $_real);
my $tmp = -d '/private' ? '/private/tmp' : '/tmp';
-our($_loop, $_point, $_pidfile, $_real, $_opts) = ('examples/loopback.pl',"$tmp/fusemnt-".$ENV{LOGNAME},"test/s/mounted.pid","$tmp/fusetest-".$ENV{LOGNAME}, '');
+our($_loop, $_point, $_pidfile, $_real, $_opts) = ('examples/loopback.pl',"$tmp/fusemnt-".$ENV{LOGNAME},$ENV{'PWD'} . "/test/s/mounted.pid","$tmp/fusetest-".$ENV{LOGNAME}, '');
$_opts = '--pidfile ' . $_pidfile;
$_opts .= $Config{useithreads} ? ' --use-threads' : '';
if($0 !~ qr|s/u?mount\.t$|) {