[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 7/9] xl: put daemonize code in it's own function
Move the daemonizer code from create_domain into it's own function that can be called from other places different than create_domain. This will be used to daemonize the driver domain backend handler. Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxl/xl_cmdimpl.c | 97 ++++++++++++++++++++++++++------------------- 1 files changed, 56 insertions(+), 41 deletions(-) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 1928424..2d147d4 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -402,6 +402,56 @@ out: if (ferror(stdout) || fflush(stdout)) { perror("stdout"); exit(-1); } } +static int do_daemonize(char *name) +{ + char *fullname; + pid_t child1, got_child; + int nullfd, ret = 0; + int status = 0; + + child1 = xl_fork(child_waitdaemon); + if (child1) { + for (;;) { + got_child = xl_waitpid(child_waitdaemon, &status, 0); + if (got_child == child1) break; + assert(got_child == -1); + perror("failed to wait for daemonizing child"); + ret = ERROR_FAIL; + goto out; + } + if (status) { + libxl_report_child_exitstatus(ctx, XTL_ERROR, + "daemonizing child", child1, status); + ret = ERROR_FAIL; + goto out; + } + ret = 1; + goto out; + } + + postfork(); + + ret = libxl_create_logfile(ctx, name, &fullname); + if (ret) { + LOG("failed to open logfile %s: %s",fullname,strerror(errno)); + exit(-1); + } + + CHK_ERRNO(( logfile = open(fullname, O_WRONLY|O_CREAT|O_APPEND, + 0644) )<0); + free(fullname); + + CHK_ERRNO(( nullfd = open("/dev/null", O_RDONLY) )<0); + dup2(nullfd, 0); + dup2(logfile, 1); + dup2(logfile, 2); + + CHK_ERRNO(daemon(0, 1) < 0); + +out: + return ret; +} + static int parse_action_on_shutdown(const char *buf, libxl_action_on_shutdown *a) { int i; @@ -1902,7 +1952,6 @@ static uint32_t create_domain(struct domain_create *dom_info) void *config_data = 0; int config_len = 0; int restore_fd = -1; - int status = 0; const libxl_asyncprogress_how *autoconnect_console_how; struct save_file_header hdr; @@ -2141,52 +2190,18 @@ start: autoconnect_vncviewer(domid, vncautopass); if (need_daemon) { - char *fullname, *name; - pid_t child1, got_child; - int nullfd; - - child1 = xl_fork(child_waitdaemon); - if (child1) { - got_child = xl_waitpid(child_waitdaemon, &status, 0); - if (got_child != child1) { - assert(got_child == -1); - perror("failed to wait for daemonizing child"); - ret = ERROR_FAIL; - goto out; - } - if (status) { - libxl_report_child_exitstatus(ctx, XTL_ERROR, - "daemonizing child", child1, status); - ret = ERROR_FAIL; - goto out; - } - ret = domid; - goto out; - } - - postfork(); + char *name; if (asprintf(&name, "xl-%s", d_config.c_info.name) < 0) { LOG("Failed to allocate memory in asprintf"); exit(1); } - rc = libxl_create_logfile(ctx, name, &fullname); - if (rc) { - LOG("failed to open logfile %s: %s",fullname,strerror(errno)); - exit(-1); - } - - CHK_ERRNO(( logfile = open(fullname, O_WRONLY|O_CREAT|O_APPEND, - 0644) )<0); - free(fullname); + ret = do_daemonize(name); free(name); - - CHK_ERRNO(( nullfd = open("/dev/null", O_RDONLY) )<0); - dup2(nullfd, 0); - dup2(logfile, 1); - dup2(logfile, 2); - - CHK_ERRNO(daemon(0, 1) < 0); + if (ret) { + ret = (ret == 1) ? domid : ret; + goto out; + } need_daemon = 0; } LOG("Waiting for domain %s (domid %d) to die [pid %ld]", -- 1.7.7.5 (Apple Git-26) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |