From 39b9a017017c805f0421f9d8b55788ccb1ec8516 Mon Sep 17 00:00:00 2001 From: LinuxMercedes Date: Mon, 9 Jan 2012 16:27:57 -0600 Subject: [PATCH] Added a daemonize() function to account for certain conditions where the forked process would still die (e.g. if mounted as a home directory and the user logs in multiple times). --- examples/loopback.pl | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/examples/loopback.pl b/examples/loopback.pl index 88d81b9..b81ec08 100755 --- a/examples/loopback.pl +++ b/examples/loopback.pl @@ -175,6 +175,25 @@ sub x_statfs { } 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; @@ -182,18 +201,9 @@ if (! -d $mountpoint) { 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', -- 2.20.1