xl_ctx_alloc();
}
-pid_t xl_fork(xlchildnum child) {
+pid_t xl_fork(xlchildnum child, const char *description) {
xlchild *ch = &children[child];
int i;
assert(!ch->pid);
ch->reaped = 0;
+ ch->description = description;
ch->pid = fork();
if (ch->pid == -1) {
return ch->pid;
}
+void xl_report_child_exitstatus(xentoollog_level level,
+ xlchildnum child, pid_t pid, int status)
+{
+ libxl_report_child_exitstatus(ctx, level, children[child].description,
+ pid, status);
+}
+
static int xl_reaped_callback(pid_t got, int status, void *user)
{
int i;
pid_t pid; /* 0: not in use */
int reaped; /* valid iff pid!=0 */
int status; /* valid iff reaped */
+ const char *description; /* valid iff pid!=0 */
} xlchild;
typedef enum {
extern xlchild children[child_max];
-pid_t xl_fork(xlchildnum); /* like fork, but prints and dies if it fails */
+pid_t xl_fork(xlchildnum, const char *description);
+ /* like fork, but prints and dies if it fails */
void postfork(void); /* needed only if we aren't going to exec right away */
/* Handles EINTR. Clears out the xlchild so it can be reused. */
int xl_child_pid(xlchildnum); /* returns 0 if child struct is not in use */
+void xl_report_child_exitstatus(xentoollog_level level,
+ xlchildnum child, pid_t pid, int status);
+ /* like libxl_report_child_exitstatus, but uses children[].description */
+
/* global options */
extern int autoballoon;
extern int run_hotplug_scripts;
if (got < 0)
perror("xl: warning, failed to waitpid for vncviewer child");
else if (status)
- libxl_report_child_exitstatus(ctx, XTL_ERROR, "vncviewer child",
- xl_child_pid(child_vncviewer), status);
+ xl_report_child_exitstatus(XTL_ERROR, child_vncviewer,
+ got, status);
}
}
{
vncviewer_child_report();
- pid_t pid = xl_fork(child_vncviewer);
+ pid_t pid = xl_fork(child_vncviewer, "vncviewer child");
if (pid)
return;
int nullfd, ret = 0;
int status = 0;
- child1 = xl_fork(child_waitdaemon);
+ child1 = xl_fork(child_waitdaemon, "domain monitoring daemon");
if (child1) {
got_child = xl_waitpid(child_waitdaemon, &status, 0);
if (got_child != child1) {
if (got < 0)
perror("xl: warning, failed to waitpid for console child");
else if (status)
- libxl_report_child_exitstatus(ctx, XTL_ERROR, "console child",
- xl_child_pid(child_console), status);
+ xl_report_child_exitstatus(XTL_ERROR, child_console,
+ got, status);
}
}
console_child_report();
- pid_t pid = xl_fork(child_console);
+ pid_t pid = xl_fork(child_console, "console child");
if (pid)
return;
MUST( libxl_pipe(ctx, sendpipe) );
MUST( libxl_pipe(ctx, recvpipe) );
- child = xl_fork(child_migration);
+ child = xl_fork(child_migration, "migration transport process");
if (!child) {
dup2(sendpipe[0], 0);
if (child == migration_child) {
if (status)
- libxl_report_child_exitstatus(ctx, XTL_INFO,
- "migration target process",
- migration_child, status);
+ xl_report_child_exitstatus(XTL_INFO, child_migration,
+ migration_child, status);
break;
}
if (child == -1) {