From 31c8886dc2adf4fb0bda8bb09b342080518e0fe4 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 31 Jul 2006 18:07:25 +0100 Subject: [BLKTAP] Properly daemonise the blktap control daemon. Fixes bug #709. Signed-off-by: Harry Butterworth --- tools/blktap/drivers/blktapctrl.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) 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(); -- cgit v1.2.3