network: preserve backwards compatibility

The new network parser will support specifying multiple networks in the old format where each new non-indexed "lxc.network.type" line starts a new network configuration. This way we don't break users. For now, we just print a deprecation warning. We will KILL this in LXC 3.0. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 8c582655
...@@ -2508,11 +2508,13 @@ static int setup_netdev(struct lxc_netdev *netdev) ...@@ -2508,11 +2508,13 @@ static int setup_netdev(struct lxc_netdev *netdev)
return 0; return 0;
} }
static int setup_network(struct lxc_list *network) static int setup_network(const struct lxc_conf *conf, struct lxc_list *network)
{ {
struct lxc_list *iterator; struct lxc_list *iterator;
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
lxc_log_configured_netdevs(conf);
lxc_list_for_each(iterator, network) { lxc_list_for_each(iterator, network) {
netdev = iterator->elem; netdev = iterator->elem;
...@@ -3044,8 +3046,6 @@ int lxc_create_network(struct lxc_handler *handler) ...@@ -3044,8 +3046,6 @@ int lxc_create_network(struct lxc_handler *handler)
if (!am_root) if (!am_root)
return 0; return 0;
lxc_log_configured_netdevs(handler->conf);
lxc_list_for_each(iterator, network) { lxc_list_for_each(iterator, network) {
netdev = iterator->elem; netdev = iterator->elem;
...@@ -4110,7 +4110,7 @@ int lxc_setup(struct lxc_handler *handler) ...@@ -4110,7 +4110,7 @@ int lxc_setup(struct lxc_handler *handler)
} }
} }
if (setup_network(&lxc_conf->network)) { if (setup_network(lxc_conf, &lxc_conf->network)) {
ERROR("failed to setup the network for '%s'", name); ERROR("failed to setup the network for '%s'", name);
return -1; return -1;
} }
...@@ -4504,7 +4504,7 @@ void lxc_conf_free(struct lxc_conf *conf) ...@@ -4504,7 +4504,7 @@ void lxc_conf_free(struct lxc_conf *conf)
free(conf->unexpanded_config); free(conf->unexpanded_config);
free(conf->pty_names); free(conf->pty_names);
free(conf->syslog); free(conf->syslog);
lxc_free_networks(conf); lxc_free_networks(&conf->network);
free(conf->lsm_aa_profile); free(conf->lsm_aa_profile);
free(conf->lsm_se_context); free(conf->lsm_se_context);
lxc_seccomp_free(conf); lxc_seccomp_free(conf);
......
...@@ -124,7 +124,7 @@ union netdev_p { ...@@ -124,7 +124,7 @@ union netdev_p {
* @idx : network counter * @idx : network counter
*/ */
struct lxc_netdev { struct lxc_netdev {
unsigned int idx; ssize_t idx;
int type; int type;
int flags; int flags;
int ifindex; int ifindex;
......
...@@ -695,11 +695,29 @@ static int set_config_network_type(const char *key, const char *value, ...@@ -695,11 +695,29 @@ static int set_config_network_type(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_type(key, lxc_conf, data); return clr_config_network_type(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
/* We maintain a negative count for legacy network devices. */
ssize_t negidx = -1;
WARN("WARNING: using \"lxc.network.type\" without an index " WARN("WARNING: using \"lxc.network.type\" without an index "
"(e.g.\"lxc.network.0.type\") is DEPRECATED."); "(e.g.\"lxc.network.0.type\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); if (!lxc_list_empty(&lxc_conf->network)) {
struct lxc_netdev *ndv;
ndv = lxc_list_first_elem(&lxc_conf->network);
if (ndv->idx < 0) {
negidx = ndv->idx;
negidx--;
}
}
if (negidx == INT_MIN) {
SYSERROR("number of configured networks would overflow "
"the counter... what are you doing?");
return -1;
}
netdev = lxc_network_add(&lxc_conf->network, negidx, false);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -917,11 +935,13 @@ static int set_config_network_flags(const char *key, const char *value, ...@@ -917,11 +935,13 @@ static int set_config_network_flags(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_flags(key, lxc_conf, data); return clr_config_network_flags(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.flags\" without an index " WARN("WARNING: using \"lxc.network.flags\" without an index "
"(e.g.\"lxc.network.0.flags\") is DEPRECATED."); "(e.g.\"lxc.network.0.flags\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -933,22 +953,6 @@ static int set_config_network_flags(const char *key, const char *value, ...@@ -933,22 +953,6 @@ static int set_config_network_flags(const char *key, const char *value,
return 0; return 0;
} }
static int set_network_link(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true);
else
netdev = data;
if (!netdev)
return -1;
return network_ifname(&netdev->link, value);
}
static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf, static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf,
struct lxc_netdev *netdev) struct lxc_netdev *netdev)
{ {
...@@ -974,8 +978,8 @@ static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf, ...@@ -974,8 +978,8 @@ static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf,
ret = set_config_network_type(type_key, tmpvalue, ret = set_config_network_type(type_key, tmpvalue,
lxc_conf, netdev); lxc_conf, netdev);
if (!ret) { if (!ret) {
ret = set_network_link(link_key, ifa->ifa_name, ret = set_config_network_link(
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;
...@@ -1002,11 +1006,13 @@ static int set_config_network_link(const char *key, const char *value, ...@@ -1002,11 +1006,13 @@ static int set_config_network_link(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_link(key, lxc_conf, data); return clr_config_network_link(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.link\" without an index " WARN("WARNING: using \"lxc.network.link\" without an index "
"(e.g.\"lxc.network.0.link\") is DEPRECATED."); "(e.g.\"lxc.network.0.link\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1029,11 +1035,13 @@ static int set_config_network_name(const char *key, const char *value, ...@@ -1029,11 +1035,13 @@ static int set_config_network_name(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_name(key, lxc_conf, data); return clr_config_network_name(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.name\" without an index " WARN("WARNING: using \"lxc.network.name\" without an index "
"(e.g.\"lxc.network.0.name\") is DEPRECATED."); "(e.g.\"lxc.network.0.name\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1051,11 +1059,13 @@ static int set_config_network_veth_pair(const char *key, const char *value, ...@@ -1051,11 +1059,13 @@ static int set_config_network_veth_pair(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_veth_pair(key, lxc_conf, data); return clr_config_network_veth_pair(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.veth.pair\" without an " WARN("WARNING: using \"lxc.network.veth.pair\" without an "
"index (e.g. \"lxc.network.0.veth.pair\") is DEPRECATED."); "index (e.g. \"lxc.network.0.veth.pair\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1076,10 +1086,13 @@ static int set_config_network_macvlan_mode(const char *key, const char *value, ...@@ -1076,10 +1086,13 @@ static int set_config_network_macvlan_mode(const char *key, const char *value,
/* lxc.network.* without an index */ /* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.macvlan.mode\" without an " WARN("WARNING: using \"lxc.network.macvlan.mode\" without an "
"index (e.g. \"lxc.network.0.macvlan.mode\" is " "index (e.g. \"lxc.network.0.macvlan.mode\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1098,11 +1111,13 @@ static int set_config_network_hwaddr(const char *key, const char *value, ...@@ -1098,11 +1111,13 @@ static int set_config_network_hwaddr(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_hwaddr(key, lxc_conf, data); return clr_config_network_hwaddr(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.hwaddr\" without an index " WARN("WARNING: using \"lxc.network.hwaddr\" without an index "
"(e.g. \"lxc.network.0.hwaddr\") is DEPRECATED."); "(e.g. \"lxc.network.0.hwaddr\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1134,11 +1149,13 @@ static int set_config_network_vlan_id(const char *key, const char *value, ...@@ -1134,11 +1149,13 @@ static int set_config_network_vlan_id(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_vlan_id(key, lxc_conf, data); return clr_config_network_vlan_id(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.vlan.id\" without an index " WARN("WARNING: using \"lxc.network.vlan.id\" without an index "
"(e.g. \"lxc.network.0.vlan.id\") is DEPRECATED."); "(e.g. \"lxc.network.0.vlan.id\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1159,11 +1176,13 @@ static int set_config_network_mtu(const char *key, const char *value, ...@@ -1159,11 +1176,13 @@ static int set_config_network_mtu(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_mtu(key, lxc_conf, data); return clr_config_network_mtu(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.mtu\" without an index " WARN("WARNING: using \"lxc.network.mtu\" without an index "
"(e.g. \"lxc.network.0.mtu\") is DEPRECATED."); "(e.g. \"lxc.network.0.mtu\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1185,11 +1204,13 @@ static int set_config_network_ipv4(const char *key, const char *value, ...@@ -1185,11 +1204,13 @@ static int set_config_network_ipv4(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_ipv4(key, lxc_conf, data); return clr_config_network_ipv4(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv4\" without an index " WARN("WARNING: using \"lxc.network.ipv4\" without an index "
"(e.g. \"lxc.network.0.ipv4\") is DEPRECATED."); "(e.g. \"lxc.network.0.ipv4\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1281,12 +1302,14 @@ static int set_config_network_ipv4_gateway(const char *key, const char *value, ...@@ -1281,12 +1302,14 @@ static int set_config_network_ipv4_gateway(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_ipv4_gateway(key, lxc_conf, data); return clr_config_network_ipv4_gateway(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv4.gateway\" without an " WARN("WARNING: using \"lxc.network.ipv4.gateway\" without an "
"index (e.g. \"lxc.network.0.ipv4.gateway\" is " "index (e.g. \"lxc.network.0.ipv4.gateway\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1333,11 +1356,13 @@ static int set_config_network_ipv6(const char *key, const char *value, ...@@ -1333,11 +1356,13 @@ static int set_config_network_ipv6(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_ipv6(key, lxc_conf, data); return clr_config_network_ipv6(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv6\" without an index " WARN("WARNING: using \"lxc.network.ipv6\" without an index "
"(e.g. \"lxc.network.0.ipv6\") is DEPRECATED."); "(e.g. \"lxc.network.0.ipv6\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1401,12 +1426,14 @@ static int set_config_network_ipv6_gateway(const char *key, const char *value, ...@@ -1401,12 +1426,14 @@ static int set_config_network_ipv6_gateway(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_ipv6_gateway(key, lxc_conf, data); return clr_config_network_ipv6_gateway(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv6.gateway\" without an " WARN("WARNING: using \"lxc.network.ipv6.gateway\" without an "
"index (e.g. \"lxc.network.0.ipv6.gateway\" is " "index (e.g. \"lxc.network.0.ipv6.gateway\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1450,12 +1477,14 @@ static int set_config_network_script_up(const char *key, const char *value, ...@@ -1450,12 +1477,14 @@ static int set_config_network_script_up(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_script_up(key, lxc_conf, data); return clr_config_network_script_up(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.script.up\" without an " WARN("WARNING: using \"lxc.network.script.up\" without an "
"index (e.g. \"lxc.network.0.script.up\" is " "index (e.g. \"lxc.network.0.script.up\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -1473,12 +1502,14 @@ static int set_config_network_script_down(const char *key, const char *value, ...@@ -1473,12 +1502,14 @@ static int set_config_network_script_down(const char *key, const char *value,
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_network_script_down(key, lxc_conf, data); return clr_config_network_script_down(key, lxc_conf, data);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.script.down\" without an " WARN("WARNING: using \"lxc.network.script.down\" without an "
"index (e.g. \"lxc.network.0.script.down\" is " "index (e.g. \"lxc.network.0.script.down\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, true); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4103,7 +4134,8 @@ static inline int clr_config_hooks(const char *key, struct lxc_conf *c, ...@@ -4103,7 +4134,8 @@ static inline int clr_config_hooks(const char *key, struct lxc_conf *c,
static inline int clr_config_network(const char *key, struct lxc_conf *c, static inline int clr_config_network(const char *key, struct lxc_conf *c,
void *data) void *data)
{ {
lxc_free_networks(c); lxc_free_networks(&c->network);
return 0; return 0;
} }
...@@ -4305,8 +4337,9 @@ get_network_config_ops(const char *key, struct lxc_conf *lxc_conf, ssize_t *idx) ...@@ -4305,8 +4337,9 @@ get_network_config_ops(const char *key, struct lxc_conf *lxc_conf, ssize_t *idx)
/* This, of course is utterly nonsensical on so many levels, but /* This, of course is utterly nonsensical on so many levels, but
* better safe than sorry. * better safe than sorry.
* (Checking for INT_MAX here is intentional.)
*/ */
if (tmpidx == UINT_MAX) { if (tmpidx == INT_MAX) {
SYSERROR( SYSERROR(
"number of configured networks would overflow the " "number of configured networks would overflow the "
"counter... what are you doing?"); "counter... what are you doing?");
...@@ -4409,11 +4442,13 @@ static int clr_config_network_type(const char *key, struct lxc_conf *lxc_conf, ...@@ -4409,11 +4442,13 @@ static int clr_config_network_type(const char *key, struct lxc_conf *lxc_conf,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.type\" without an index " WARN("WARNING: using \"lxc.network.type\" without an index "
"(e.g. \"lxc.network.0.type\") is DEPRECATED."); "(e.g. \"lxc.network.0.type\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4430,11 +4465,13 @@ static int clr_config_network_name(const char *key, struct lxc_conf *lxc_conf, ...@@ -4430,11 +4465,13 @@ static int clr_config_network_name(const char *key, struct lxc_conf *lxc_conf,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.name\" without an index " WARN("WARNING: using \"lxc.network.name\" without an index "
"(e.g. \"lxc.network.0.name\") is DEPRECATED."); "(e.g. \"lxc.network.0.name\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4453,11 +4490,13 @@ static int clr_config_network_flags(const char *key, struct lxc_conf *lxc_conf, ...@@ -4453,11 +4490,13 @@ static int clr_config_network_flags(const char *key, struct lxc_conf *lxc_conf,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.flags\" without an index " WARN("WARNING: using \"lxc.network.flags\" without an index "
"(e.g. \"lxc.network.0.flags\") is DEPRECATED."); "(e.g. \"lxc.network.0.flags\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4474,11 +4513,13 @@ static int clr_config_network_link(const char *key, struct lxc_conf *lxc_conf, ...@@ -4474,11 +4513,13 @@ static int clr_config_network_link(const char *key, struct lxc_conf *lxc_conf,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.link\" without an index " WARN("WARNING: using \"lxc.network.link\" without an index "
"(e.g. \"lxc.network.0.link\") is DEPRECATED."); "(e.g. \"lxc.network.0.link\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4497,12 +4538,14 @@ static int clr_config_network_macvlan_mode(const char *key, ...@@ -4497,12 +4538,14 @@ static int clr_config_network_macvlan_mode(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.macvlan.mode\" without an " WARN("WARNING: using \"lxc.network.macvlan.mode\" without an "
"index (e.g. \"lxc.network.0.macvlan.mode\" is " "index (e.g. \"lxc.network.0.macvlan.mode\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4522,12 +4565,14 @@ static int clr_config_network_veth_pair(const char *key, ...@@ -4522,12 +4565,14 @@ static int clr_config_network_veth_pair(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.veth.pair\" without an " WARN("WARNING: using \"lxc.network.veth.pair\" without an "
"index (e.g. \"lxc.network.0.veth.pair\" is " "index (e.g. \"lxc.network.0.veth.pair\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4545,12 +4590,14 @@ static int clr_config_network_script_up(const char *key, ...@@ -4545,12 +4590,14 @@ static int clr_config_network_script_up(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.script.up\" without an " WARN("WARNING: using \"lxc.network.script.up\" without an "
"index (e.g. \"lxc.network.0.script.up\" is " "index (e.g. \"lxc.network.0.script.up\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4568,12 +4615,14 @@ static int clr_config_network_script_down(const char *key, ...@@ -4568,12 +4615,14 @@ static int clr_config_network_script_down(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.script.down\" without an " WARN("WARNING: using \"lxc.network.script.down\" without an "
"index (e.g. \"lxc.network.0.script.down\" is " "index (e.g. \"lxc.network.0.script.down\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4591,11 +4640,13 @@ static int clr_config_network_hwaddr(const char *key, struct lxc_conf *lxc_conf, ...@@ -4591,11 +4640,13 @@ static int clr_config_network_hwaddr(const char *key, struct lxc_conf *lxc_conf,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.hwaddr\" without an index " WARN("WARNING: using \"lxc.network.hwaddr\" without an index "
"(e.g. \"lxc.network.0.hwaddr\") is DEPRECATED."); "(e.g. \"lxc.network.0.hwaddr\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4613,11 +4664,13 @@ static int clr_config_network_mtu(const char *key, struct lxc_conf *lxc_conf, ...@@ -4613,11 +4664,13 @@ static int clr_config_network_mtu(const char *key, struct lxc_conf *lxc_conf,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.mtu\" without an index " WARN("WARNING: using \"lxc.network.mtu\" without an index "
"(e.g. \"lxc.network.0.mtu\") is DEPRECATED."); "(e.g. \"lxc.network.0.mtu\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4635,11 +4688,13 @@ static int clr_config_network_vlan_id(const char *key, ...@@ -4635,11 +4688,13 @@ static int clr_config_network_vlan_id(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.vlan.id\" without an index " WARN("WARNING: using \"lxc.network.vlan.id\" without an index "
"(e.g. \"lxc.network.0.vlan.id\") is DEPRECATED."); "(e.g. \"lxc.network.0.vlan.id\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4657,12 +4712,14 @@ static int clr_config_network_ipv4_gateway(const char *key, ...@@ -4657,12 +4712,14 @@ static int clr_config_network_ipv4_gateway(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv4.gateway\" without an " WARN("WARNING: using \"lxc.network.ipv4.gateway\" without an "
"index (e.g. \"lxc.network.0.ipv4.gateway\" is " "index (e.g. \"lxc.network.0.ipv4.gateway\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4681,11 +4738,13 @@ static int clr_config_network_ipv4(const char *key, struct lxc_conf *lxc_conf, ...@@ -4681,11 +4738,13 @@ static int clr_config_network_ipv4(const char *key, struct lxc_conf *lxc_conf,
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
struct lxc_list *cur, *next; struct lxc_list *cur, *next;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv4\" without an index " WARN("WARNING: using \"lxc.network.ipv4\" without an index "
"(e.g. \"lxc.network.0.ipv4\") is DEPRECATED."); "(e.g. \"lxc.network.0.ipv4\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4707,12 +4766,14 @@ static int clr_config_network_ipv6_gateway(const char *key, ...@@ -4707,12 +4766,14 @@ static int clr_config_network_ipv6_gateway(const char *key,
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv6.gateway\" without an " WARN("WARNING: using \"lxc.network.ipv6.gateway\" without an "
"index (e.g. \"lxc.network.0.ipv6.gateway\" is " "index (e.g. \"lxc.network.0.ipv6.gateway\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4731,11 +4792,13 @@ static int clr_config_network_ipv6(const char *key, struct lxc_conf *lxc_conf, ...@@ -4731,11 +4792,13 @@ static int clr_config_network_ipv6(const char *key, struct lxc_conf *lxc_conf,
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
struct lxc_list *cur, *next; struct lxc_list *cur, *next;
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv6\" without an index " WARN("WARNING: using \"lxc.network.ipv6\" without an index "
"(e.g. \"lxc.network.0.ipv6\") is DEPRECATED."); "(e.g. \"lxc.network.0.ipv6\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(lxc_conf, 0, false); netdev = lxc_list_first_elem(&lxc_conf->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4780,11 +4843,13 @@ static int get_config_network_type(const char *key, char *retv, int inlen, ...@@ -4780,11 +4843,13 @@ static int get_config_network_type(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.type\" without an index " WARN("WARNING: using \"lxc.network.type\" without an index "
"(e.g. \"lxc.network.0.type\") is DEPRECATED."); "(e.g. \"lxc.network.0.type\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4807,11 +4872,13 @@ static int get_config_network_flags(const char *key, char *retv, int inlen, ...@@ -4807,11 +4872,13 @@ static int get_config_network_flags(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.flags\" without an index " WARN("WARNING: using \"lxc.network.flags\" without an index "
"(e.g. \"lxc.network.0.flags\") is DEPRECATED."); "(e.g. \"lxc.network.0.flags\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4835,11 +4902,13 @@ static int get_config_network_link(const char *key, char *retv, int inlen, ...@@ -4835,11 +4902,13 @@ static int get_config_network_link(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.link\" without an index " WARN("WARNING: using \"lxc.network.link\" without an index "
"(e.g. \"lxc.network.0.link\") is DEPRECATED."); "(e.g. \"lxc.network.0.link\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4863,11 +4932,13 @@ static int get_config_network_name(const char *key, char *retv, int inlen, ...@@ -4863,11 +4932,13 @@ static int get_config_network_name(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.name\" without an index " WARN("WARNING: using \"lxc.network.name\" without an index "
"(e.g. \"lxc.network.0.name\") is DEPRECATED."); "(e.g. \"lxc.network.0.name\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4893,12 +4964,14 @@ static int get_config_network_macvlan_mode(const char *key, char *retv, ...@@ -4893,12 +4964,14 @@ static int get_config_network_macvlan_mode(const char *key, char *retv,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.macvlan.mode\" without an " WARN("WARNING: using \"lxc.network.macvlan.mode\" without an "
"index (e.g. \"lxc.network.0.macvlan.mode\" is " "index (e.g. \"lxc.network.0.macvlan.mode\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4942,12 +5015,14 @@ static int get_config_network_veth_pair(const char *key, char *retv, int inlen, ...@@ -4942,12 +5015,14 @@ static int get_config_network_veth_pair(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.veth.pair\" without an " WARN("WARNING: using \"lxc.network.veth.pair\" without an "
"index (e.g. \"lxc.network.0.veth.pair\" is " "index (e.g. \"lxc.network.0.veth.pair\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -4975,12 +5050,14 @@ static int get_config_network_script_up(const char *key, char *retv, int inlen, ...@@ -4975,12 +5050,14 @@ static int get_config_network_script_up(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.script.up\" without an " WARN("WARNING: using \"lxc.network.script.up\" without an "
"index (e.g. \"lxc.network.0.script.up\" is " "index (e.g. \"lxc.network.0.script.up\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5005,12 +5082,14 @@ static int get_config_network_script_down(const char *key, char *retv, ...@@ -5005,12 +5082,14 @@ static int get_config_network_script_down(const char *key, char *retv,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.script.down\" without an " WARN("WARNING: using \"lxc.network.script.down\" without an "
"index (e.g. \"lxc.network.0.script.down\" is " "index (e.g. \"lxc.network.0.script.down\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5034,11 +5113,13 @@ static int get_config_network_hwaddr(const char *key, char *retv, int inlen, ...@@ -5034,11 +5113,13 @@ static int get_config_network_hwaddr(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.hwaddr\" without an index " WARN("WARNING: using \"lxc.network.hwaddr\" without an index "
"(e.g. \"lxc.network.0.hwaddr\") is DEPRECATED."); "(e.g. \"lxc.network.0.hwaddr\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5062,11 +5143,13 @@ static int get_config_network_mtu(const char *key, char *retv, int inlen, ...@@ -5062,11 +5143,13 @@ static int get_config_network_mtu(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.mtu\" without an index " WARN("WARNING: using \"lxc.network.mtu\" without an index "
"(e.g. \"lxc.network.0.mtu\") is DEPRECATED."); "(e.g. \"lxc.network.0.mtu\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5090,11 +5173,13 @@ static int get_config_network_vlan_id(const char *key, char *retv, int inlen, ...@@ -5090,11 +5173,13 @@ static int get_config_network_vlan_id(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.vlan.id\" without an index " WARN("WARNING: using \"lxc.network.vlan.id\" without an index "
"(e.g. \"lxc.network.0.vlan.id\") is DEPRECATED."); "(e.g. \"lxc.network.0.vlan.id\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5122,12 +5207,14 @@ static int get_config_network_ipv4_gateway(const char *key, char *retv, ...@@ -5122,12 +5207,14 @@ static int get_config_network_ipv4_gateway(const char *key, char *retv,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv4.gateway\" without an " WARN("WARNING: using \"lxc.network.ipv4.gateway\" without an "
"index (e.g. \"lxc.network.0.ipv4.gateway\" is " "index (e.g. \"lxc.network.0.ipv4.gateway\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5158,11 +5245,13 @@ static int get_config_network_ipv4(const char *key, char *retv, int inlen, ...@@ -5158,11 +5245,13 @@ static int get_config_network_ipv4(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv4\" without an index " WARN("WARNING: using \"lxc.network.ipv4\" without an index "
"(e.g. \"lxc.network.0.ipv4\") is DEPRECATED."); "(e.g. \"lxc.network.0.ipv4\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5193,12 +5282,14 @@ static int get_config_network_ipv6_gateway(const char *key, char *retv, ...@@ -5193,12 +5282,14 @@ static int get_config_network_ipv6_gateway(const char *key, char *retv,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv6.gateway\" without an " WARN("WARNING: using \"lxc.network.ipv6.gateway\" without an "
"index (e.g. \"lxc.network.0.ipv6.gateway\" is " "index (e.g. \"lxc.network.0.ipv6.gateway\" is "
"DEPRECATED."); "DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
...@@ -5229,11 +5320,13 @@ static int get_config_network_ipv6(const char *key, char *retv, int inlen, ...@@ -5229,11 +5320,13 @@ static int get_config_network_ipv6(const char *key, char *retv, int inlen,
else else
memset(retv, 0, inlen); memset(retv, 0, inlen);
/* lxc.network.* without an index */
if (!data) { if (!data) {
/* REMOVE IN LXC 3.0:
* lxc.network.* without an index
*/
WARN("WARNING: using \"lxc.network.ipv6\" without an index " WARN("WARNING: using \"lxc.network.ipv6\" without an index "
"(e.g. \"lxc.network.0.ipv6\") is DEPRECATED."); "(e.g. \"lxc.network.0.ipv6\") is DEPRECATED.");
netdev = lxc_get_netdev_by_idx(c, 0, false); netdev = lxc_list_first_elem(&c->network);
} else { } else {
netdev = data; netdev = data;
} }
......
...@@ -166,32 +166,10 @@ bool lxc_config_value_empty(const char *value) ...@@ -166,32 +166,10 @@ bool lxc_config_value_empty(const char *value)
return true; return true;
} }
/* Takes care of finding the correct netdev struct in the networks list or struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail)
* allocates a new one if it couldn't be found.
*/
struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf,
unsigned int idx, bool allocate)
{ {
struct lxc_list *newlist; struct lxc_list *newlist;
struct lxc_netdev *netdev = NULL; struct lxc_netdev *netdev = NULL;
struct lxc_list *networks = &conf->network;
struct lxc_list *insert = networks;
/* lookup network */
if (!lxc_list_empty(networks)) {
lxc_list_for_each(insert, networks) {
netdev = insert->elem;
if (netdev->idx >= idx)
break;
}
/* network already exists */
if (netdev->idx == idx)
return netdev;
}
if (!allocate)
return NULL;
/* network does not exist */ /* network does not exist */
netdev = malloc(sizeof(*netdev)); netdev = malloc(sizeof(*netdev));
...@@ -215,14 +193,40 @@ struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf, ...@@ -215,14 +193,40 @@ struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf,
lxc_list_init(newlist); lxc_list_init(newlist);
newlist->elem = netdev; newlist->elem = netdev;
/* Insert will now point to the correct position to insert the new if (tail)
* netdev. lxc_list_add_tail(networks, newlist);
*/ else
lxc_list_add_tail(insert, newlist); lxc_list_add(networks, newlist);
return netdev; return netdev;
} }
/* Takes care of finding the correct netdev struct in the networks list or
* allocates a new one if it couldn't be found.
*/
struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf,
unsigned int idx, bool allocate)
{
struct lxc_netdev *netdev = NULL;
struct lxc_list *networks = &conf->network;
struct lxc_list *insert = networks;
/* lookup network */
if (!lxc_list_empty(networks)) {
lxc_list_for_each(insert, networks) {
netdev = insert->elem;
if (netdev->idx == idx)
return netdev;
else if (netdev->idx > idx)
break;
}
}
if (!allocate)
return NULL;
return lxc_network_add(insert, idx, true);
}
void lxc_log_configured_netdevs(const struct lxc_conf *conf) void lxc_log_configured_netdevs(const struct lxc_conf *conf)
{ {
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
...@@ -240,7 +244,7 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf) ...@@ -240,7 +244,7 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf)
lxc_list_for_each(it, &conf->network) { lxc_list_for_each(it, &conf->network) {
netdev = it->elem; netdev = it->elem;
TRACE("index: %d", netdev->idx); TRACE("index: %zd", netdev->idx);
switch (netdev->type) { switch (netdev->type) {
case LXC_NET_VETH: case LXC_NET_VETH:
TRACE("type: veth"); TRACE("type: veth");
...@@ -336,17 +340,17 @@ bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx) ...@@ -336,17 +340,17 @@ bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx)
return true; return true;
} }
void lxc_free_networks(struct lxc_conf *conf) void lxc_free_networks(struct lxc_list *networks)
{ {
struct lxc_list *cur, *next; struct lxc_list *cur, *next;
struct lxc_netdev *netdev; struct lxc_netdev *netdev;
lxc_list_for_each_safe(cur, &conf->network, next) { lxc_list_for_each_safe(cur, networks, next) {
netdev = cur->elem; netdev = cur->elem;
lxc_free_netdev(netdev); lxc_free_netdev(netdev);
free(cur); free(cur);
} }
/* prevent segfaults */ /* prevent segfaults */
lxc_list_init(&conf->network); lxc_list_init(networks);
} }
...@@ -28,10 +28,12 @@ extern int parse_idmaps(const char *idmap, char *type, unsigned long *nsid, ...@@ -28,10 +28,12 @@ extern int parse_idmaps(const char *idmap, char *type, unsigned long *nsid,
unsigned long *hostid, unsigned long *range); unsigned long *hostid, unsigned long *range);
extern bool lxc_config_value_empty(const char *value); extern bool lxc_config_value_empty(const char *value);
extern struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx,
bool tail);
extern struct lxc_netdev * extern struct lxc_netdev *
lxc_get_netdev_by_idx(struct lxc_conf *conf, unsigned int idx, bool allocate); lxc_get_netdev_by_idx(struct lxc_conf *conf, unsigned int idx, bool allocate);
extern void lxc_log_configured_netdevs(const struct lxc_conf *conf); extern void lxc_log_configured_netdevs(const struct lxc_conf *conf);
extern bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx); extern bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx);
extern void lxc_free_networks(struct lxc_conf *conf); extern void lxc_free_networks(struct lxc_list *networks);
#endif /* __LXC_CONFILE_UTILS_H */ #endif /* __LXC_CONFILE_UTILS_H */
...@@ -298,7 +298,7 @@ int main(int argc, char *argv[]) ...@@ -298,7 +298,7 @@ int main(int argc, char *argv[])
} }
printf("%d: get_config_item(lxc.network) returned %d %s\n", __LINE__, ret, v2); printf("%d: get_config_item(lxc.network) returned %d %s\n", __LINE__, ret, v2);
if (!c->set_config_item(c, "lxc.network.ipv4", "10.2.3.4")) { if (!c->set_config_item(c, "lxc.network.0.ipv4", "10.2.3.4")) {
fprintf(stderr, "%d: failed to set ipv4\n", __LINE__); fprintf(stderr, "%d: failed to set ipv4\n", __LINE__);
goto out; goto out;
} }
...@@ -318,7 +318,7 @@ int main(int argc, char *argv[]) ...@@ -318,7 +318,7 @@ int main(int argc, char *argv[])
goto out; goto out;
} }
if (!c->set_config_item(c, "lxc.network.ipv4.gateway", "10.2.3.254")) { if (!c->set_config_item(c, "lxc.network.0.ipv4.gateway", "10.2.3.254")) {
fprintf(stderr, "%d: failed to set ipv4.gateway\n", __LINE__); fprintf(stderr, "%d: failed to set ipv4.gateway\n", __LINE__);
goto out; goto out;
} }
......
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