conf = c->lxc_conf;
/* initialize handler */
- handler = lxc_init_handler(c->name, conf, c->config_path, c->daemonize);
+ handler = lxc_init_handler(NULL, c->name, conf, c->config_path, c->daemonize);
container_mem_unlock(c);
if (!handler)
if (!argv) {
if (useinit) {
ERROR("No valid init detected");
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
return false;
}
argv = default_args;
pid_first = fork();
if (pid_first < 0) {
free_init_cmd(init_cmd);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
return false;
}
started = wait_on_daemonized_start(handler, pid_first);
free_init_cmd(init_cmd);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
return started;
}
/* second parent */
if (pid_second != 0) {
free_init_cmd(init_cmd);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
_exit(EXIT_SUCCESS);
}
} else if (!am_single_threaded()) {
ERROR("Cannot start non-daemonized container when threaded");
free_init_cmd(init_cmd);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
return false;
}
w = snprintf(pidstr, sizeof(pidstr), "%d", lxc_raw_getpid());
if (w < 0 || (size_t)w >= sizeof(pidstr)) {
free_init_cmd(init_cmd);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
SYSERROR("Failed to write monitor pid to \"%s\"", c->pidfile);
ret = lxc_write_to_file(c->pidfile, pidstr, w, false, 0600);
if (ret < 0) {
free_init_cmd(init_cmd);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
SYSERROR("Failed to write monitor pid to \"%s\"", c->pidfile);
ret = unshare(CLONE_NEWNS);
if (ret < 0) {
SYSERROR("Failed to unshare mount namespace");
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
ret = 1;
goto on_error;
}
ret = mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL);
if (ret < 0) {
SYSERROR("Failed to make / rslave at startup");
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
ret = 1;
goto on_error;
}
reboot:
if (conf->reboot == REBOOT_INIT) {
/* initialize handler */
- handler = lxc_init_handler(c->name, conf, c->config_path, c->daemonize);
+ handler = lxc_init_handler(handler, c->name, conf, c->config_path, c->daemonize);
if (!handler) {
ret = 1;
goto on_error;
}
+ } else {
+ keepfds[1] = handler->state_socket_pair[0];
+ keepfds[2] = handler->state_socket_pair[1];
}
keepfds[0] = handler->conf->maincmd_fd;
- keepfds[1] = handler->state_socket_pair[0];
- keepfds[2] = handler->state_socket_pair[1];
ret = lxc_check_inherited(conf, c->daemonize, keepfds, ARRAY_SIZE(keepfds));
if (ret < 0) {
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
ret = 1;
goto on_error;
}
return ret;
}
-void lxc_free_handler(struct lxc_handler *handler)
+void lxc_put_handler(struct lxc_handler *handler)
{
close_prot_errno_disarm(handler->pinfd);
close_prot_errno_disarm(handler->pidfd);
close_prot_errno_disarm(handler->state_socket_pair[0]);
close_prot_errno_disarm(handler->state_socket_pair[1]);
cgroup_exit(handler->cgroup_ops);
- handler->conf = NULL;
- free_disarm(handler);
+ if (handler->conf && handler->conf->reboot == REBOOT_NONE)
+ free_disarm(handler);
+ else
+ handler->conf = NULL;
}
-struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf,
+struct lxc_handler *lxc_init_handler(struct lxc_handler *old,
+ const char *name, struct lxc_conf *conf,
const char *lxcpath, bool daemonize)
{
int ret;
struct lxc_handler *handler;
- handler = malloc(sizeof(*handler));
+ if (!old)
+ handler = zalloc(sizeof(*handler));
+ else
+ handler = old;
if (!handler)
return NULL;
- memset(handler, 0, sizeof(*handler));
-
/* Note that am_guest_unpriv() checks the effective uid. We
* probably don't care if we are real root only if we are running
* as root so this should be fine.
return handler;
on_error:
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
return NULL;
}
if (handler->conf->ephemeral == 1 && handler->conf->reboot != REBOOT_REQ)
lxc_destroy_container_on_signal(handler, name);
- lxc_free_handler(handler);
+ lxc_put_handler(handler);
}
void lxc_abort(struct lxc_handler *handler)
struct lxc_handler *handler,
lxc_state_t state);
extern void lxc_abort(struct lxc_handler *handler);
-extern struct lxc_handler *lxc_init_handler(const char *name,
+extern struct lxc_handler *lxc_init_handler(struct lxc_handler *old,
+ const char *name,
struct lxc_conf *conf,
- const char *lxcpath,
- bool daemonize);
-extern void lxc_free_handler(struct lxc_handler *handler);
+ const char *lxcpath, bool daemonize);
+extern void lxc_put_handler(struct lxc_handler *handler);
extern int lxc_init(const char *name, struct lxc_handler *handler);
extern void lxc_end(struct lxc_handler *handler);