mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-03 23:01:58 +00:00
Merge pull request #2171 from brauner/2018-02-16/rework_hooks
conf: fix run_script_argv()
This commit is contained in:
commit
3d7868ae53
@ -354,10 +354,11 @@ static int run_buffer(char *buffer)
|
||||
|
||||
int run_script_argv(const char *name, unsigned int hook_version,
|
||||
const char *section, const char *script,
|
||||
const char *hookname, char **argsin)
|
||||
const char *hookname, char **argv)
|
||||
{
|
||||
int buf_pos, i, ret;
|
||||
char *buffer;
|
||||
int fret = -1;
|
||||
size_t size = 0;
|
||||
|
||||
if (hook_version == 0)
|
||||
@ -366,8 +367,8 @@ int run_script_argv(const char *name, unsigned int hook_version,
|
||||
else
|
||||
INFO("Executing script \"%s\" for container \"%s\"", script, name);
|
||||
|
||||
for (i = 0; argsin && argsin[i]; i++)
|
||||
size += strlen(argsin[i]) + 1;
|
||||
for (i = 0; argv && argv[i]; i++)
|
||||
size += strlen(argv[i]) + 1;
|
||||
|
||||
size += sizeof("exec");
|
||||
size += strlen(script);
|
||||
@ -376,8 +377,6 @@ int run_script_argv(const char *name, unsigned int hook_version,
|
||||
if (size > INT_MAX)
|
||||
return -EFBIG;
|
||||
|
||||
buffer = alloca(size);
|
||||
|
||||
if (hook_version == 0) {
|
||||
size += strlen(hookname);
|
||||
size++;
|
||||
@ -390,24 +389,27 @@ int run_script_argv(const char *name, unsigned int hook_version,
|
||||
|
||||
if (size > INT_MAX)
|
||||
return -EFBIG;
|
||||
}
|
||||
|
||||
buffer = malloc(size);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
if (hook_version == 0)
|
||||
buf_pos = snprintf(buffer, size, "exec %s %s %s %s", script, name, section, hookname);
|
||||
if (buf_pos < 0 || (size_t)buf_pos >= size) {
|
||||
ERROR("Failed to create command line for script \"%s\"", script);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
else
|
||||
buf_pos = snprintf(buffer, size, "exec %s", script);
|
||||
if (buf_pos < 0 || (size_t)buf_pos >= size) {
|
||||
ERROR("Failed to create command line for script \"%s\"", script);
|
||||
return -1;
|
||||
}
|
||||
if (buf_pos < 0 || (size_t)buf_pos >= size) {
|
||||
ERROR("Failed to create command line for script \"%s\"", script);
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
if (hook_version == 1) {
|
||||
ret = setenv("LXC_HOOK_TYPE", hookname, 1);
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment variable: "
|
||||
"LXC_HOOK_TYPE=%s", hookname);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_HOOK_TYPE=%s", hookname);
|
||||
|
||||
@ -415,50 +417,50 @@ int run_script_argv(const char *name, unsigned int hook_version,
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment variable: "
|
||||
"LXC_HOOK_SECTION=%s", section);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_HOOK_SECTION=%s", section);
|
||||
|
||||
if (strcmp(section, "net") == 0) {
|
||||
char *parent;
|
||||
|
||||
if (!argsin[0])
|
||||
return -EINVAL;
|
||||
if (!argv || !argv[0])
|
||||
goto on_error;
|
||||
|
||||
ret = setenv("LXC_NET_TYPE", argsin[0], 1);
|
||||
ret = setenv("LXC_NET_TYPE", argv[0], 1);
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment variable: "
|
||||
"LXC_NET_TYPE=%s", argsin[0]);
|
||||
return -1;
|
||||
"LXC_NET_TYPE=%s", argv[0]);
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_NET_TYPE=%s", argsin[0]);
|
||||
TRACE("Set environment variable: LXC_NET_TYPE=%s", argv[0]);
|
||||
|
||||
parent = argsin[1] ? argsin[1] : "";
|
||||
parent = argv[1] ? argv[1] : "";
|
||||
|
||||
if (strcmp(argsin[0], "macvlan")) {
|
||||
if (strcmp(argv[0], "macvlan")) {
|
||||
ret = setenv("LXC_NET_PARENT", parent, 1);
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment "
|
||||
"variable: LXC_NET_PARENT=%s", parent);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_NET_PARENT=%s", parent);
|
||||
} else if (strcmp(argsin[0], "phys")) {
|
||||
} else if (strcmp(argv[0], "phys")) {
|
||||
ret = setenv("LXC_NET_PARENT", parent, 1);
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment "
|
||||
"variable: LXC_NET_PARENT=%s", parent);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_NET_PARENT=%s", parent);
|
||||
} else if (strcmp(argsin[0], "veth")) {
|
||||
char *peer = argsin[2] ? argsin[2] : "";
|
||||
} else if (strcmp(argv[0], "veth")) {
|
||||
char *peer = argv[2] ? argv[2] : "";
|
||||
|
||||
ret = setenv("LXC_NET_PEER", peer, 1);
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment "
|
||||
"variable: LXC_NET_PEER=%s", peer);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_NET_PEER=%s", peer);
|
||||
|
||||
@ -466,25 +468,29 @@ int run_script_argv(const char *name, unsigned int hook_version,
|
||||
if (ret < 0) {
|
||||
SYSERROR("Failed to set environment "
|
||||
"variable: LXC_NET_PARENT=%s", parent);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
TRACE("Set environment variable: LXC_NET_PARENT=%s", parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; argsin && argsin[i]; i++) {
|
||||
for (i = 0; argv && argv[i]; i++) {
|
||||
size_t len = size - buf_pos;
|
||||
|
||||
ret = snprintf(buffer + buf_pos, len, " %s", argsin[i]);
|
||||
ret = snprintf(buffer + buf_pos, len, " %s", argv[i]);
|
||||
if (ret < 0 || (size_t)ret >= len) {
|
||||
ERROR("Failed to create command line for script \"%s\"", script);
|
||||
return -1;
|
||||
goto on_error;
|
||||
}
|
||||
buf_pos += ret;
|
||||
}
|
||||
|
||||
return run_buffer(buffer);
|
||||
fret = run_buffer(buffer);
|
||||
|
||||
on_error:
|
||||
free(buffer);
|
||||
return fret;
|
||||
}
|
||||
|
||||
int run_script(const char *name, const char *section, const char *script, ...)
|
||||
|
@ -215,16 +215,20 @@ int lxc_console_cb_con(int fd, uint32_t events, void *data,
|
||||
if (r <= 0) {
|
||||
INFO("Console client on fd %d has exited", fd);
|
||||
lxc_mainloop_del_handler(descr, fd);
|
||||
if (fd == console->peer) {
|
||||
|
||||
if (fd == console->master) {
|
||||
console->master = -EBADF;
|
||||
} else if (fd == console->peer) {
|
||||
if (console->tty_state) {
|
||||
lxc_console_signal_fini(console->tty_state);
|
||||
console->tty_state = NULL;
|
||||
}
|
||||
console->peer = -1;
|
||||
close(fd);
|
||||
return 0;
|
||||
console->peer = -EBADF;
|
||||
} else {
|
||||
ERROR("Handler received unexpected file descriptor");
|
||||
}
|
||||
close(fd);
|
||||
|
||||
return LXC_MAINLOOP_CLOSE;
|
||||
}
|
||||
|
||||
|
@ -628,7 +628,7 @@ void lxc_free_handler(struct lxc_handler *handler)
|
||||
lxc_put_nsfds(handler);
|
||||
|
||||
if (handler->conf && handler->conf->reboot == 0)
|
||||
if (handler->conf->maincmd_fd)
|
||||
if (handler->conf->maincmd_fd >= 0)
|
||||
close(handler->conf->maincmd_fd);
|
||||
|
||||
if (handler->state_socket_pair[0] >= 0)
|
||||
|
Loading…
Reference in New Issue
Block a user