mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-28 11:06:51 +00:00
commit
b8ab484943
@ -1212,7 +1212,7 @@ static int lxc_cmd_accept(int fd, uint32_t events, void *data,
|
|||||||
|
|
||||||
connection = accept(fd, NULL, 0);
|
connection = accept(fd, NULL, 0);
|
||||||
if (connection < 0) {
|
if (connection < 0) {
|
||||||
SYSERROR("Failed to accept connection to run command.");
|
SYSERROR("Failed to accept connection to run command");
|
||||||
return LXC_MAINLOOP_ERROR;
|
return LXC_MAINLOOP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ int lxc_make_abstract_socket_name(char *path, size_t pathlen,
|
|||||||
* Although null termination isn't required by the API, we do it anyway
|
* Although null termination isn't required by the API, we do it anyway
|
||||||
* because we print the sockname out sometimes.
|
* because we print the sockname out sometimes.
|
||||||
*/
|
*/
|
||||||
len = pathlen -2;
|
len = pathlen - 2;
|
||||||
|
|
||||||
name = lxcname;
|
name = lxcname;
|
||||||
if (!name)
|
if (!name)
|
||||||
@ -220,6 +220,6 @@ int lxc_add_state_client(int state_client_fd, struct lxc_handler *handler,
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("added state client %d to state client list", state_client_fd);
|
TRACE("Added state client %d to state client list", state_client_fd);
|
||||||
return MAX_STATE;
|
return MAX_STATE;
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ static int set_config_net_type(const char *key, const char *value,
|
|||||||
} else if (!strcmp(value, "none")) {
|
} else if (!strcmp(value, "none")) {
|
||||||
netdev->type = LXC_NET_NONE;
|
netdev->type = LXC_NET_NONE;
|
||||||
} else {
|
} else {
|
||||||
ERROR("invalid network type %s", value);
|
ERROR("Invalid network type %s", value);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,13 +330,14 @@ static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf,
|
|||||||
const char *tmpvalue = "phys";
|
const char *tmpvalue = "phys";
|
||||||
|
|
||||||
if (netns_getifaddrs(&ifaddr, -1, &(bool){false}) < 0) {
|
if (netns_getifaddrs(&ifaddr, -1, &(bool){false}) < 0) {
|
||||||
SYSERROR("Get network interfaces failed");
|
SYSERROR("Failed to get network interfaces");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
|
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
|
||||||
if (!ifa->ifa_addr)
|
if (!ifa->ifa_addr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ifa->ifa_addr->sa_family != AF_PACKET)
|
if (ifa->ifa_addr->sa_family != AF_PACKET)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -347,11 +348,11 @@ static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf,
|
|||||||
ret = set_config_net_link(
|
ret = set_config_net_link(
|
||||||
link_key, ifa->ifa_name, lxc_conf, netdev);
|
link_key, ifa->ifa_name, lxc_conf, netdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ERROR("failed to create matched ifnames");
|
ERROR("Failed to create matched ifnames");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ERROR("failed to create matched ifnames");
|
ERROR("Failed to create matched ifnames");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -450,6 +451,7 @@ static int set_config_net_hwaddr(const char *key, const char *value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
netdev->hwaddr = new_value;
|
netdev->hwaddr = new_value;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,7 +507,6 @@ static int set_config_net_ipv4_address(const char *key, const char *value,
|
|||||||
inetdev = malloc(sizeof(*inetdev));
|
inetdev = malloc(sizeof(*inetdev));
|
||||||
if (!inetdev)
|
if (!inetdev)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
memset(inetdev, 0, sizeof(*inetdev));
|
memset(inetdev, 0, sizeof(*inetdev));
|
||||||
|
|
||||||
list = malloc(sizeof(*list));
|
list = malloc(sizeof(*list));
|
||||||
@ -579,8 +580,8 @@ static int set_config_net_ipv4_address(const char *key, const char *value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
lxc_list_add_tail(&netdev->ipv4, list);
|
lxc_list_add_tail(&netdev->ipv4, list);
|
||||||
|
|
||||||
free(addr);
|
free(addr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,7 +641,6 @@ static int set_config_net_ipv6_address(const char *key, const char *value,
|
|||||||
inet6dev = malloc(sizeof(*inet6dev));
|
inet6dev = malloc(sizeof(*inet6dev));
|
||||||
if (!inet6dev)
|
if (!inet6dev)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
memset(inet6dev, 0, sizeof(*inet6dev));
|
memset(inet6dev, 0, sizeof(*inet6dev));
|
||||||
|
|
||||||
list = malloc(sizeof(*list));
|
list = malloc(sizeof(*list));
|
||||||
@ -664,6 +664,7 @@ static int set_config_net_ipv6_address(const char *key, const char *value,
|
|||||||
if (slash) {
|
if (slash) {
|
||||||
*slash = '\0';
|
*slash = '\0';
|
||||||
netmask = slash + 1;
|
netmask = slash + 1;
|
||||||
|
|
||||||
ret = lxc_safe_uint(netmask, &inet6dev->prefix);
|
ret = lxc_safe_uint(netmask, &inet6dev->prefix);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(list);
|
free(list);
|
||||||
@ -683,8 +684,8 @@ static int set_config_net_ipv6_address(const char *key, const char *value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
lxc_list_add_tail(&netdev->ipv6, list);
|
lxc_list_add_tail(&netdev->ipv6, list);
|
||||||
|
|
||||||
free(valdup);
|
free(valdup);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -766,6 +767,7 @@ static int add_hook(struct lxc_conf *lxc_conf, int which, char *hook)
|
|||||||
|
|
||||||
hooklist->elem = hook;
|
hooklist->elem = hook;
|
||||||
lxc_list_add_tail(&lxc_conf->hooks[which], hooklist);
|
lxc_list_add_tail(&lxc_conf->hooks[which], hooklist);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -868,6 +870,7 @@ static int set_config_hooks(const char *key, const char *value,
|
|||||||
return add_hook(lxc_conf, LXCHOOK_DESTROY, copy);
|
return add_hook(lxc_conf, LXCHOOK_DESTROY, copy);
|
||||||
|
|
||||||
free(copy);
|
free(copy);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -891,6 +894,7 @@ static int set_config_hooks_version(const char *key, const char *value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
lxc_conf->hooks_version = tmp;
|
lxc_conf->hooks_version = tmp;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -923,6 +927,7 @@ static int set_config_pty_max(const char *key, const char *value,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lxc_conf->pty_max = max;
|
lxc_conf->pty_max = max;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1041,6 +1046,7 @@ static int set_config_group(const char *key, const char *value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(groups);
|
free(groups);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1081,6 +1087,7 @@ static int set_config_environment(const char *key, const char *value,
|
|||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
free(list_item);
|
free(list_item);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1100,6 +1107,7 @@ static int set_config_tty_max(const char *key, const char *value,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lxc_conf->ttys.max = nbtty;
|
lxc_conf->ttys.max = nbtty;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1229,6 +1237,7 @@ static int set_config_log_level(const char *key, const char *value,
|
|||||||
* current logging.
|
* current logging.
|
||||||
*/
|
*/
|
||||||
lxc_conf->loglevel = newlevel;
|
lxc_conf->loglevel = newlevel;
|
||||||
|
|
||||||
return lxc_log_set_level(&lxc_conf->loglevel, newlevel);
|
return lxc_log_set_level(&lxc_conf->loglevel, newlevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1443,6 +1452,7 @@ static int set_config_prlimit(const char *key, const char *value,
|
|||||||
/* soft limit comes first in the value */
|
/* soft limit comes first in the value */
|
||||||
if (!parse_limit_value(&value, &limit_value))
|
if (!parse_limit_value(&value, &limit_value))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
limit.rlim_cur = limit_value;
|
limit.rlim_cur = limit_value;
|
||||||
|
|
||||||
/* skip spaces and a colon */
|
/* skip spaces and a colon */
|
||||||
@ -1461,6 +1471,7 @@ static int set_config_prlimit(const char *key, const char *value,
|
|||||||
if (*value) {
|
if (*value) {
|
||||||
if (!parse_limit_value(&value, &limit_value))
|
if (!parse_limit_value(&value, &limit_value))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
limit.rlim_max = limit_value;
|
limit.rlim_max = limit_value;
|
||||||
|
|
||||||
/* check for trailing garbage */
|
/* check for trailing garbage */
|
||||||
@ -1496,20 +1507,21 @@ static int set_config_prlimit(const char *key, const char *value,
|
|||||||
limelem->resource = strdup(key);
|
limelem->resource = strdup(key);
|
||||||
if (!limelem->resource)
|
if (!limelem->resource)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
limelem->limit = limit;
|
limelem->limit = limit;
|
||||||
|
|
||||||
lxc_list_add_elem(limlist, limelem);;
|
lxc_list_add_elem(limlist, limelem);;
|
||||||
|
|
||||||
lxc_list_add_tail(&lxc_conf->limits, limlist);
|
lxc_list_add_tail(&lxc_conf->limits, limlist);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
free(limlist);
|
free(limlist);
|
||||||
|
|
||||||
if (limelem) {
|
if (limelem) {
|
||||||
free(limelem->resource);
|
free(limelem->resource);
|
||||||
free(limelem);
|
free(limelem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1542,6 +1554,7 @@ static int set_config_sysctl(const char *key, const char *value,
|
|||||||
|
|
||||||
free(sysctl_elem->value);
|
free(sysctl_elem->value);
|
||||||
sysctl_elem->value = replace_value;
|
sysctl_elem->value = replace_value;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1564,18 +1577,19 @@ static int set_config_sysctl(const char *key, const char *value,
|
|||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
lxc_list_add_elem(sysctl_list, sysctl_elem);
|
lxc_list_add_elem(sysctl_list, sysctl_elem);
|
||||||
|
|
||||||
lxc_list_add_tail(&lxc_conf->sysctls, sysctl_list);
|
lxc_list_add_tail(&lxc_conf->sysctls, sysctl_list);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
free(sysctl_list);
|
free(sysctl_list);
|
||||||
|
|
||||||
if (sysctl_elem) {
|
if (sysctl_elem) {
|
||||||
free(sysctl_elem->key);
|
free(sysctl_elem->key);
|
||||||
free(sysctl_elem->value);
|
free(sysctl_elem->value);
|
||||||
free(sysctl_elem);
|
free(sysctl_elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1619,6 +1633,7 @@ static int set_config_proc(const char *key, const char *value,
|
|||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
free(proclist);
|
free(proclist);
|
||||||
|
|
||||||
if (procelem) {
|
if (procelem) {
|
||||||
free(procelem->filename);
|
free(procelem->filename);
|
||||||
free(procelem->value);
|
free(procelem->value);
|
||||||
@ -1673,7 +1688,6 @@ static int set_config_idmaps(const char *key, const char *value,
|
|||||||
if (idmap->nsid == 0)
|
if (idmap->nsid == 0)
|
||||||
lxc_conf->root_nsuid_map = idmap;
|
lxc_conf->root_nsuid_map = idmap;
|
||||||
|
|
||||||
|
|
||||||
if (!lxc_conf->root_nsgid_map && idmap->idtype == ID_TYPE_GID)
|
if (!lxc_conf->root_nsgid_map && idmap->idtype == ID_TYPE_GID)
|
||||||
if (idmap->nsid == 0)
|
if (idmap->nsid == 0)
|
||||||
lxc_conf->root_nsgid_map = idmap;
|
lxc_conf->root_nsgid_map = idmap;
|
||||||
@ -1772,6 +1786,7 @@ static int set_config_mount_auto(const char *key, const char *value,
|
|||||||
|
|
||||||
lxc_conf->auto_mounts &= ~allowed_auto_mounts[i].mask;
|
lxc_conf->auto_mounts &= ~allowed_auto_mounts[i].mask;
|
||||||
lxc_conf->auto_mounts |= allowed_auto_mounts[i].flag;
|
lxc_conf->auto_mounts |= allowed_auto_mounts[i].flag;
|
||||||
|
|
||||||
if (is_shmounts) {
|
if (is_shmounts) {
|
||||||
lxc_conf->shmount.path_host = strdup(token + STRLITERALLEN("shmounts:"));
|
lxc_conf->shmount.path_host = strdup(token + STRLITERALLEN("shmounts:"));
|
||||||
if (!lxc_conf->shmount.path_host) {
|
if (!lxc_conf->shmount.path_host) {
|
||||||
@ -1986,6 +2001,7 @@ static int set_config_console_buffer_size(const char *key, const char *value,
|
|||||||
"next power of two: %" PRIu64 " bytes", buffer_size);
|
"next power of two: %" PRIu64 " bytes", buffer_size);
|
||||||
|
|
||||||
lxc_conf->console.buffer_size = buffer_size;
|
lxc_conf->console.buffer_size = buffer_size;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2033,6 +2049,7 @@ static int set_config_console_size(const char *key, const char *value,
|
|||||||
"next power of two: %" PRIu64 " bytes", log_size);
|
"next power of two: %" PRIu64 " bytes", log_size);
|
||||||
|
|
||||||
lxc_conf->console.log_size = log_size;
|
lxc_conf->console.log_size = log_size;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2148,11 +2165,13 @@ static int set_config_rootfs_path(const char *key, const char *value,
|
|||||||
tmp = strchr(dup, ':');
|
tmp = strchr(dup, ':');
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
*tmp = '\0';
|
*tmp = '\0';
|
||||||
|
|
||||||
ret = set_config_path_item(&lxc_conf->rootfs.bdev_type, dup);
|
ret = set_config_path_item(&lxc_conf->rootfs.bdev_type, dup);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(dup);
|
free(dup);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp++;
|
tmp++;
|
||||||
container_path = tmp;
|
container_path = tmp;
|
||||||
} else {
|
} else {
|
||||||
@ -2161,6 +2180,7 @@ static int set_config_rootfs_path(const char *key, const char *value,
|
|||||||
|
|
||||||
ret = set_config_path_item(&lxc_conf->rootfs.path, container_path);
|
ret = set_config_path_item(&lxc_conf->rootfs.path, container_path);
|
||||||
free(dup);
|
free(dup);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2422,6 +2442,7 @@ static int parse_line(char *buffer, void *data)
|
|||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
free(linep);
|
free(linep);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2522,6 +2543,7 @@ int lxc_config_define_add(struct lxc_list *defines, char *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lxc_list_add_tail(defines, dent);
|
lxc_list_add_tail(defines, dent);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2538,6 +2560,7 @@ bool lxc_config_define_load(struct lxc_list *defines, struct lxc_container *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lxc_config_define_free(defines);
|
lxc_config_define_free(defines);
|
||||||
|
|
||||||
return bret;
|
return bret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2693,14 +2716,17 @@ void clear_unexp_config_line(struct lxc_conf *conf, const char *key,
|
|||||||
while (*lstart) {
|
while (*lstart) {
|
||||||
lend = strchr(lstart, '\n');
|
lend = strchr(lstart, '\n');
|
||||||
char v;
|
char v;
|
||||||
|
|
||||||
if (!lend)
|
if (!lend)
|
||||||
lend = lstart + strlen(lstart);
|
lend = lstart + strlen(lstart);
|
||||||
else
|
else
|
||||||
lend++;
|
lend++;
|
||||||
|
|
||||||
if (strncmp(lstart, key, strlen(key)) != 0) {
|
if (strncmp(lstart, key, strlen(key)) != 0) {
|
||||||
lstart = lend;
|
lstart = lend;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rm_subkeys) {
|
if (!rm_subkeys) {
|
||||||
v = lstart[strlen(key)];
|
v = lstart[strlen(key)];
|
||||||
if (!isspace(v) && v != '=') {
|
if (!isspace(v) && v != '=') {
|
||||||
@ -2708,11 +2734,14 @@ void clear_unexp_config_line(struct lxc_conf *conf, const char *key,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
conf->unexpanded_len -= (lend - lstart);
|
conf->unexpanded_len -= (lend - lstart);
|
||||||
|
|
||||||
if (*lend == '\0') {
|
if (*lend == '\0') {
|
||||||
*lstart = '\0';
|
*lstart = '\0';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memmove(lstart, lend, strlen(lend) + 1);
|
memmove(lstart, lend, strlen(lend) + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2784,9 +2813,10 @@ bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const char *oldpath,
|
|||||||
if (olddirlen >= newdirlen) {
|
if (olddirlen >= newdirlen) {
|
||||||
size_t diff = olddirlen - newdirlen;
|
size_t diff = olddirlen - newdirlen;
|
||||||
memcpy(q, newdir, newdirlen);
|
memcpy(q, newdir, newdirlen);
|
||||||
|
|
||||||
if (olddirlen != newdirlen) {
|
if (olddirlen != newdirlen) {
|
||||||
memmove(q + newdirlen, q + newdirlen + diff,
|
memmove(q + newdirlen, q + newdirlen + diff,
|
||||||
strlen(q) - newdirlen - diff + 1);
|
strlen(q) - newdirlen - diff + 1);
|
||||||
lend -= diff;
|
lend -= diff;
|
||||||
conf->unexpanded_len -= diff;
|
conf->unexpanded_len -= diff;
|
||||||
}
|
}
|
||||||
@ -2805,15 +2835,18 @@ bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const char *oldpath,
|
|||||||
conf->unexpanded_alloced = newlen + 1;
|
conf->unexpanded_alloced = newlen + 1;
|
||||||
new[newlen - 1] = '\0';
|
new[newlen - 1] = '\0';
|
||||||
lend = new + (lend - conf->unexpanded_config);
|
lend = new + (lend - conf->unexpanded_config);
|
||||||
|
|
||||||
/* Move over the remainder to make room for the newdir.
|
/* Move over the remainder to make room for the newdir.
|
||||||
*/
|
*/
|
||||||
memmove(new + poffset + newdirlen,
|
memmove(new + poffset + newdirlen,
|
||||||
new + poffset + olddirlen,
|
new + poffset + olddirlen,
|
||||||
oldlen - poffset - olddirlen + 1);
|
oldlen - poffset - olddirlen + 1);
|
||||||
conf->unexpanded_config = new;
|
conf->unexpanded_config = new;
|
||||||
|
|
||||||
memcpy(new + poffset, newdir, newdirlen);
|
memcpy(new + poffset, newdir, newdirlen);
|
||||||
lend += diff;
|
lend += diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
next:
|
next:
|
||||||
lstart = lend;
|
lstart = lend;
|
||||||
}
|
}
|
||||||
@ -2874,9 +2907,10 @@ bool clone_update_unexp_hooks(struct lxc_conf *conf, const char *oldpath,
|
|||||||
if (olddirlen >= newdirlen) {
|
if (olddirlen >= newdirlen) {
|
||||||
size_t diff = olddirlen - newdirlen;
|
size_t diff = olddirlen - newdirlen;
|
||||||
memcpy(p, newdir, newdirlen);
|
memcpy(p, newdir, newdirlen);
|
||||||
|
|
||||||
if (olddirlen != newdirlen) {
|
if (olddirlen != newdirlen) {
|
||||||
memmove(p + newdirlen, p + newdirlen + diff,
|
memmove(p + newdirlen, p + newdirlen + diff,
|
||||||
strlen(p) - newdirlen - diff + 1);
|
strlen(p) - newdirlen - diff + 1);
|
||||||
lend -= diff;
|
lend -= diff;
|
||||||
conf->unexpanded_len -= diff;
|
conf->unexpanded_len -= diff;
|
||||||
}
|
}
|
||||||
@ -2895,15 +2929,18 @@ bool clone_update_unexp_hooks(struct lxc_conf *conf, const char *oldpath,
|
|||||||
conf->unexpanded_alloced = newlen + 1;
|
conf->unexpanded_alloced = newlen + 1;
|
||||||
new[newlen - 1] = '\0';
|
new[newlen - 1] = '\0';
|
||||||
lend = new + (lend - conf->unexpanded_config);
|
lend = new + (lend - conf->unexpanded_config);
|
||||||
|
|
||||||
/* Move over the remainder to make room for the newdir.
|
/* Move over the remainder to make room for the newdir.
|
||||||
*/
|
*/
|
||||||
memmove(new + poffset + newdirlen,
|
memmove(new + poffset + newdirlen,
|
||||||
new + poffset + olddirlen,
|
new + poffset + olddirlen,
|
||||||
oldlen - poffset - olddirlen + 1);
|
oldlen - poffset - olddirlen + 1);
|
||||||
conf->unexpanded_config = new;
|
conf->unexpanded_config = new;
|
||||||
|
|
||||||
memcpy(new + poffset, newdir, newdirlen);
|
memcpy(new + poffset, newdir, newdirlen);
|
||||||
lend += diff;
|
lend += diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
next:
|
next:
|
||||||
lstart = lend;
|
lstart = lend;
|
||||||
}
|
}
|
||||||
@ -3026,6 +3063,7 @@ static int set_config_log_syslog(const char *key, const char *value,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lxc_log_syslog(facility);
|
lxc_log_syslog(facility);
|
||||||
|
|
||||||
return set_config_string_item(&lxc_conf->syslog, value);
|
return set_config_string_item(&lxc_conf->syslog, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3195,9 +3233,9 @@ static int __get_config_cgroup_controller(const char *key, char *retv,
|
|||||||
if (version != cg->version)
|
if (version != cg->version)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
strprint(retv, inlen, "%s.%s = %s\n",
|
strprint(retv, inlen, "%s.%s = %s\n", global_token,
|
||||||
global_token, cg->subsystem, cg->value);
|
cg->subsystem, cg->value);
|
||||||
} else if (!strcmp(cg->subsystem, key)) {
|
} else if (strcmp(cg->subsystem, key) == 0) {
|
||||||
strprint(retv, inlen, "%s\n", cg->value);
|
strprint(retv, inlen, "%s\n", cg->value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3288,6 +3326,7 @@ static int get_config_idmaps(const char *key, char *retv, int inlen,
|
|||||||
|
|
||||||
strprint(retv, inlen, "%s%s", buf, (listlen-- > 1) ? "\n" : "");
|
strprint(retv, inlen, "%s%s", buf, (listlen-- > 1) ? "\n" : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
return fulllen;
|
return fulllen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3446,19 +3485,21 @@ static int get_config_hooks(const char *key, char *retv, int inlen,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
subkey = strchr(key, '.');
|
subkey = strchr(key, '.');
|
||||||
if (subkey)
|
|
||||||
subkey = strchr(subkey + 1, '.');
|
|
||||||
if (!subkey)
|
if (!subkey)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
subkey = strchr(subkey + 1, '.');
|
||||||
subkey++;
|
subkey++;
|
||||||
if (!*subkey)
|
if (!*subkey)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < NUM_LXC_HOOKS; i++) {
|
for (i = 0; i < NUM_LXC_HOOKS; i++) {
|
||||||
if (strcmp(lxchook_names[i], subkey) == 0) {
|
if (strcmp(lxchook_names[i], subkey) == 0) {
|
||||||
found = i;
|
found = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found == -1)
|
if (found == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -3470,6 +3511,7 @@ static int get_config_hooks(const char *key, char *retv, int inlen,
|
|||||||
lxc_list_for_each(it, &c->hooks[found]) {
|
lxc_list_for_each(it, &c->hooks[found]) {
|
||||||
strprint(retv, inlen, "%s\n", (char *)it->elem);
|
strprint(retv, inlen, "%s\n", (char *)it->elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return fulllen;
|
return fulllen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3713,7 +3755,7 @@ static int get_config_no_new_privs(const char *key, char *retv, int inlen,
|
|||||||
* printed, in 'lxc.prlimit.resource = value' format.
|
* printed, in 'lxc.prlimit.resource = value' format.
|
||||||
*/
|
*/
|
||||||
static int get_config_prlimit(const char *key, char *retv, int inlen,
|
static int get_config_prlimit(const char *key, char *retv, int inlen,
|
||||||
struct lxc_conf *c, void *data)
|
struct lxc_conf *c, void *data)
|
||||||
{
|
{
|
||||||
int fulllen = 0, len;
|
int fulllen = 0, len;
|
||||||
bool get_all = false;
|
bool get_all = false;
|
||||||
@ -3744,6 +3786,7 @@ static int get_config_prlimit(const char *key, char *retv, int inlen,
|
|||||||
partlen = sprintf(buf, "%" PRIu64,
|
partlen = sprintf(buf, "%" PRIu64,
|
||||||
(uint64_t)lim->limit.rlim_cur);
|
(uint64_t)lim->limit.rlim_cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lim->limit.rlim_cur != lim->limit.rlim_max) {
|
if (lim->limit.rlim_cur != lim->limit.rlim_max) {
|
||||||
if (lim->limit.rlim_max == RLIM_INFINITY)
|
if (lim->limit.rlim_max == RLIM_INFINITY)
|
||||||
memcpy(buf + partlen, ":unlimited",
|
memcpy(buf + partlen, ":unlimited",
|
||||||
@ -3756,7 +3799,7 @@ static int get_config_prlimit(const char *key, char *retv, int inlen,
|
|||||||
if (get_all) {
|
if (get_all) {
|
||||||
strprint(retv, inlen, "lxc.prlimit.%s = %s\n",
|
strprint(retv, inlen, "lxc.prlimit.%s = %s\n",
|
||||||
lim->resource, buf);
|
lim->resource, buf);
|
||||||
} else if (!strcmp(lim->resource, key)) {
|
} else if (strcmp(lim->resource, key) == 0) {
|
||||||
strprint(retv, inlen, "%s", buf);
|
strprint(retv, inlen, "%s", buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3769,7 +3812,7 @@ static int get_config_prlimit(const char *key, char *retv, int inlen,
|
|||||||
* entries will be printed, in 'lxc.sysctl.key = value' format.
|
* entries will be printed, in 'lxc.sysctl.key = value' format.
|
||||||
*/
|
*/
|
||||||
static int get_config_sysctl(const char *key, char *retv, int inlen,
|
static int get_config_sysctl(const char *key, char *retv, int inlen,
|
||||||
struct lxc_conf *c, void *data)
|
struct lxc_conf *c, void *data)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
struct lxc_list *it;
|
struct lxc_list *it;
|
||||||
@ -3791,8 +3834,8 @@ static int get_config_sysctl(const char *key, char *retv, int inlen,
|
|||||||
lxc_list_for_each(it, &c->sysctls) {
|
lxc_list_for_each(it, &c->sysctls) {
|
||||||
struct lxc_sysctl *elem = it->elem;
|
struct lxc_sysctl *elem = it->elem;
|
||||||
if (get_all) {
|
if (get_all) {
|
||||||
strprint(retv, inlen, "lxc.sysctl.%s = %s\n",
|
strprint(retv, inlen, "lxc.sysctl.%s = %s\n", elem->key,
|
||||||
elem->key, elem->value);
|
elem->value);
|
||||||
} else if (strcmp(elem->key, key) == 0) {
|
} else if (strcmp(elem->key, key) == 0) {
|
||||||
strprint(retv, inlen, "%s", elem->value);
|
strprint(retv, inlen, "%s", elem->value);
|
||||||
}
|
}
|
||||||
@ -3802,7 +3845,7 @@ static int get_config_sysctl(const char *key, char *retv, int inlen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int get_config_proc(const char *key, char *retv, int inlen,
|
static int get_config_proc(const char *key, char *retv, int inlen,
|
||||||
struct lxc_conf *c, void *data)
|
struct lxc_conf *c, void *data)
|
||||||
{
|
{
|
||||||
struct lxc_list *it;
|
struct lxc_list *it;
|
||||||
int len;
|
int len;
|
||||||
@ -3826,7 +3869,7 @@ static int get_config_proc(const char *key, char *retv, int inlen,
|
|||||||
|
|
||||||
if (get_all) {
|
if (get_all) {
|
||||||
strprint(retv, inlen, "lxc.proc.%s = %s\n",
|
strprint(retv, inlen, "lxc.proc.%s = %s\n",
|
||||||
proc->filename, proc->value);
|
proc->filename, proc->value);
|
||||||
} else if (strcmp(proc->filename, key) == 0) {
|
} else if (strcmp(proc->filename, key) == 0) {
|
||||||
strprint(retv, inlen, "%s", proc->value);
|
strprint(retv, inlen, "%s", proc->value);
|
||||||
}
|
}
|
||||||
@ -4401,7 +4444,7 @@ static struct lxc_config_t *get_network_config_ops(const char *key,
|
|||||||
*/
|
*/
|
||||||
if (tmpidx == INT_MAX) {
|
if (tmpidx == INT_MAX) {
|
||||||
SYSERROR("Number of configured networks would overflow the "
|
SYSERROR("Number of configured networks would overflow the "
|
||||||
"counter");
|
"counter");
|
||||||
goto on_error;
|
goto on_error;
|
||||||
}
|
}
|
||||||
*idx = tmpidx;
|
*idx = tmpidx;
|
||||||
@ -4472,6 +4515,7 @@ static int set_config_net_nic(const char *key, const char *value,
|
|||||||
|
|
||||||
ret = config->set(deindexed_key, value, lxc_conf, netdev);
|
ret = config->set(deindexed_key, value, lxc_conf, netdev);
|
||||||
free(deindexed_key);
|
free(deindexed_key);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4517,6 +4561,7 @@ static int clr_config_net_nic(const char *key, struct lxc_conf *lxc_conf,
|
|||||||
|
|
||||||
ret = config->clr(deindexed_key, lxc_conf, netdev);
|
ret = config->clr(deindexed_key, lxc_conf, netdev);
|
||||||
free(deindexed_key);
|
free(deindexed_key);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4760,6 +4805,7 @@ static int get_config_net_nic(const char *key, char *retv, int inlen,
|
|||||||
|
|
||||||
ret = config->get(deindexed_key, retv, inlen, c, netdev);
|
ret = config->get(deindexed_key, retv, inlen, c, netdev);
|
||||||
free(deindexed_key);
|
free(deindexed_key);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5066,6 +5112,7 @@ static int get_config_net_ipv4_address(const char *key, char *retv, int inlen,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
listlen = lxc_list_len(&netdev->ipv4);
|
listlen = lxc_list_len(&netdev->ipv4);
|
||||||
|
|
||||||
lxc_list_for_each(it, &netdev->ipv4) {
|
lxc_list_for_each(it, &netdev->ipv4) {
|
||||||
struct lxc_inetdev *i = it->elem;
|
struct lxc_inetdev *i = it->elem;
|
||||||
inet_ntop(AF_INET, &i->addr, buf, sizeof(buf));
|
inet_ntop(AF_INET, &i->addr, buf, sizeof(buf));
|
||||||
@ -5121,6 +5168,7 @@ static int get_config_net_ipv6_address(const char *key, char *retv, int inlen,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
listlen = lxc_list_len(&netdev->ipv6);
|
listlen = lxc_list_len(&netdev->ipv6);
|
||||||
|
|
||||||
lxc_list_for_each(it, &netdev->ipv6) {
|
lxc_list_for_each(it, &netdev->ipv6) {
|
||||||
struct lxc_inet6dev *i = it->elem;
|
struct lxc_inet6dev *i = it->elem;
|
||||||
inet_ntop(AF_INET6, &i->addr, buf, sizeof(buf));
|
inet_ntop(AF_INET6, &i->addr, buf, sizeof(buf));
|
||||||
@ -5248,6 +5296,7 @@ int lxc_list_net(struct lxc_conf *c, const char *key, char *retv, int inlen)
|
|||||||
strprint(retv, inlen, "type\n");
|
strprint(retv, inlen, "type\n");
|
||||||
strprint(retv, inlen, "script.up\n");
|
strprint(retv, inlen, "script.up\n");
|
||||||
strprint(retv, inlen, "script.down\n");
|
strprint(retv, inlen, "script.down\n");
|
||||||
|
|
||||||
if (netdev->type != LXC_NET_EMPTY) {
|
if (netdev->type != LXC_NET_EMPTY) {
|
||||||
strprint(retv, inlen, "flags\n");
|
strprint(retv, inlen, "flags\n");
|
||||||
strprint(retv, inlen, "link\n");
|
strprint(retv, inlen, "link\n");
|
||||||
|
@ -79,7 +79,7 @@ int lxc_monitor_fifo_name(const char *lxcpath, char *fifo_path, size_t fifo_path
|
|||||||
}
|
}
|
||||||
ret = mkdir_p(fifo_path, 0755);
|
ret = mkdir_p(fifo_path, 0755);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ERROR("Unable to create monitor fifo directory %s.", fifo_path);
|
ERROR("Unable to create monitor fifo directory %s", fifo_path);
|
||||||
free(rundir);
|
free(rundir);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,6 @@ int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[],
|
|||||||
*/
|
*/
|
||||||
pid_t lxc_raw_clone(unsigned long flags)
|
pid_t lxc_raw_clone(unsigned long flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These flags don't interest at all so we don't jump through any hoopes
|
* These flags don't interest at all so we don't jump through any hoopes
|
||||||
* of retrieving them and passing them to the kernel.
|
* of retrieving them and passing them to the kernel.
|
||||||
|
Loading…
Reference in New Issue
Block a user