Unverified Commit 50cbe5eb by Tycho Andersen Committed by Christian Brauner

remember the exit code from the init process

error_num seems to be trying to remember the exit code of the init process, except that nothing actually keeps track of it anywhere. So, let's add a field to the handler, so that we can keep track of the process' exit status, and the propagate it to error_num in struct lxc_container so that people can use it. Note that this is a slight behavior change, essentially instead of making error_num always == the return code from start, now it contains slightly more useful information (the actual exit status). But, there is only one internal user of error_num which I'll fix in later in the series, so IMO this is ok. Signed-off-by: 's avatarTycho Andersen <tycho@tycho.ws>
parent 6f5d4e2e
...@@ -994,7 +994,7 @@ reboot: ...@@ -994,7 +994,7 @@ reboot:
ret = lxc_execute(c->name, argv, 1, handler, c->config_path, daemonize); ret = lxc_execute(c->name, argv, 1, handler, c->config_path, daemonize);
else else
ret = lxc_start(c->name, argv, handler, c->config_path, daemonize); ret = lxc_start(c->name, argv, handler, c->config_path, daemonize);
c->error_num = ret; c->error_num = handler->exit_status;
if (conf->reboot == 1) { if (conf->reboot == 1) {
INFO("Container requested reboot"); INFO("Container requested reboot");
......
...@@ -314,6 +314,27 @@ static int signal_handler(int fd, uint32_t events, void *data, ...@@ -314,6 +314,27 @@ static int signal_handler(int fd, uint32_t events, void *data,
if (ret == 0 && info.si_pid == hdlr->pid) if (ret == 0 && info.si_pid == hdlr->pid)
hdlr->init_died = true; hdlr->init_died = true;
/* Try to figure out a reasonable exit status to report. */
if (hdlr->init_died) {
switch (info.si_code) {
case CLD_EXITED:
hdlr->exit_status = info.si_status << 8;
break;
case CLD_KILLED:
case CLD_DUMPED:
case CLD_STOPPED:
hdlr->exit_status = info.si_status << 8 | 0x7f;
break;
case CLD_CONTINUED:
/* Huh? The waitid() told us it's dead *and* continued? */
WARN("Init %d dead and continued?", hdlr->pid);
hdlr->exit_status = 1;
break;
default:
ERROR("Unknown si_code: %d", hdlr->init_died);
}
}
/* More robustness, protect ourself from a SIGCHLD sent /* More robustness, protect ourself from a SIGCHLD sent
* by a process different from the container init. * by a process different from the container init.
*/ */
......
...@@ -109,6 +109,11 @@ struct lxc_handler { ...@@ -109,6 +109,11 @@ struct lxc_handler {
/* Current state of the container. */ /* Current state of the container. */
lxc_state_t state; lxc_state_t state;
/* The exit status of the container; not defined unless ->init_died ==
* true.
*/
int exit_status;
}; };
struct lxc_operations { struct lxc_operations {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment