aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-07-31 18:07:25 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-07-31 18:07:25 +0100
commit31c8886dc2adf4fb0bda8bb09b342080518e0fe4 (patch)
tree395720cba1d17a4e4f42aa29bde35bfe4a28cf52
parente40c413dc976d43067347109548bc02c6747eabe (diff)
downloadxen-31c8886dc2adf4fb0bda8bb09b342080518e0fe4.tar.gz
xen-31c8886dc2adf4fb0bda8bb09b342080518e0fe4.tar.bz2
xen-31c8886dc2adf4fb0bda8bb09b342080518e0fe4.zip
[BLKTAP] Properly daemonise the blktap control daemon. Fixes bug #709.
Signed-off-by: Harry Butterworth <butterwo@uk.ibm.com>
-rw-r--r--tools/blktap/drivers/blktapctrl.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/tools/blktap/drivers/blktapctrl.c b/tools/blktap/drivers/blktapctrl.c
index f4ade5b780..14a86d9088 100644
--- a/tools/blktap/drivers/blktapctrl.c
+++ b/tools/blktap/drivers/blktapctrl.c
@@ -622,6 +622,38 @@ static void print_drivers(void)
DPRINTF("Found driver: [%s]\n",dtypes[i]->name);
}
+/* Stevens. */
+static void daemonize(void)
+{
+ pid_t pid;
+
+ /* Separate from our parent via fork, so init inherits us. */
+ if ((pid = fork()) < 0)
+ DPRINTF("Failed to fork daemon\n");
+ if (pid != 0)
+ exit(0);
+
+ /* Session leader so ^C doesn't whack us. */
+ setsid();
+
+ /* Let session leader exit so child cannot regain CTTY */
+ if ((pid = fork()) < 0)
+ DPRINTF("Failed to fork daemon\n");
+ if (pid != 0)
+ exit(0);
+
+ /* Move off any mount points we might be in. */
+ if (chdir("/") == -1)
+ DPRINTF("Failed to chdir\n");
+
+ /* Discard our parent's old-fashioned umask prejudices. */
+ umask(0);
+
+ close(STDIN_FILENO);
+ close(STDOUT_FILENO);
+ close(STDERR_FILENO);
+}
+
int main(int argc, char *argv[])
{
char *devname;
@@ -633,6 +665,7 @@ int main(int argc, char *argv[])
__init_blkif();
openlog("BLKTAPCTRL", LOG_CONS|LOG_ODELAY, LOG_DAEMON);
+ daemonize();
print_drivers();
init_driver_list();