diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-07-31 18:07:25 +0100 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-07-31 18:07:25 +0100 |
commit | 31c8886dc2adf4fb0bda8bb09b342080518e0fe4 (patch) | |
tree | 395720cba1d17a4e4f42aa29bde35bfe4a28cf52 | |
parent | e40c413dc976d43067347109548bc02c6747eabe (diff) | |
download | xen-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.c | 33 |
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(); |