mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
xl: Remove clone-and-hack in do_daemonize
do_daemonize had open-coded handling of the results from xl_waitpid. Instead, break out the meat of console_child_report into a new function child_report (which returns an error code), and use it. No functional change other than a change to the message printed if forking the daemonic child fails. Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> Acked-by: Ian Campbell <Ian.Campbell@citrix.com>
This commit is contained in:
1 parent
242e0ee792
commit
7ac8aae001
2 files changed
+26
-26
No files matched your search
@@ -153,6 +153,10 @@ void xl_report_child_exitstatus(xentoollog_level level,
|
||||
xlchildnum child, pid_t pid, int status);
|
||||
/* like libxl_report_child_exitstatus, but uses children[].description */
|
||||
|
||||
int child_report(xlchildnum child);
|
||||
/* waits and expects child to exit status 0.
|
||||
* otherwise, logs and returns ERROR_FAIL */
|
||||
|
||||
/* global options */
|
||||
extern int autoballoon;
|
||||
extern int run_hotplug_scripts;
|
||||
|
||||
+22
-26
@@ -205,17 +205,26 @@ static uint32_t find_domain(const char *p)
|
||||
return domid;
|
||||
}
|
||||
|
||||
int child_report(xlchildnum child)
|
||||
{
|
||||
int status;
|
||||
pid_t got = xl_waitpid(child, &status, 0);
|
||||
if (got < 0) {
|
||||
fprintf(stderr, "xl: warning, failed to waitpid for %s: %s\n",
|
||||
children[child].description, strerror(errno));
|
||||
return ERROR_FAIL;
|
||||
} else if (status) {
|
||||
xl_report_child_exitstatus(XTL_ERROR, child, got, status);
|
||||
return ERROR_FAIL;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void console_child_report(xlchildnum child)
|
||||
{
|
||||
if (xl_child_pid(child)) {
|
||||
int status;
|
||||
pid_t got = xl_waitpid(child, &status, 0);
|
||||
if (got < 0)
|
||||
fprintf(stderr, "xl: warning, failed to waitpid for %s: %s\n",
|
||||
children[child].description, strerror(errno));
|
||||
else if (status)
|
||||
xl_report_child_exitstatus(XTL_ERROR, child, got, status);
|
||||
}
|
||||
if (xl_child_pid(child))
|
||||
child_report(child);
|
||||
}
|
||||
|
||||
static int vncviewer(uint32_t domid, int autopass)
|
||||
@@ -431,26 +440,13 @@ out:
|
||||
static int do_daemonize(char *name)
|
||||
{
|
||||
char *fullname;
|
||||
pid_t child1, got_child;
|
||||
pid_t child1;
|
||||
int nullfd, ret = 0;
|
||||
int status = 0;
|
||||
|
||||
child1 = xl_fork(child_waitdaemon, "domain monitoring daemon");
|
||||
child1 = xl_fork(child_waitdaemon, "domain monitoring daemonizing child");
|
||||
if (child1) {
|
||||
got_child = xl_waitpid(child_waitdaemon, &status, 0);
|
||||
if (got_child != child1) {
|
||||
assert(got_child == -1);
|
||||
LOG("failed to wait for daemonizing child: %s", strerror(errno));
|
||||
ret = ERROR_FAIL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (status) {
|
||||
libxl_report_child_exitstatus(ctx, XTL_ERROR,
|
||||
"daemonizing child", child1, status);
|
||||
ret = ERROR_FAIL;
|
||||
goto out;
|
||||
}
|
||||
ret = child_report(child_waitdaemon);
|
||||
if (ret) goto out;
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||