if (!netdev)
return ret_errno(EINVAL);
+ clr_config_net_type(key, lxc_conf, data);
if (lxc_config_value_empty(value))
- return clr_config_net_type(key, lxc_conf, data);
+ return 0;
if (strequal(value, "veth")) {
netdev->type = LXC_NET_VETH;
if (!netdev)
return ret_errno(EINVAL);
- netdev->type = -1;
+ lxc_clear_netdev(netdev);
return 0;
}
}
}
-static void lxc_free_netdev(struct lxc_netdev *netdev)
+void lxc_clear_netdev(struct lxc_netdev *netdev)
{
struct lxc_list *cur, *next;
+ ssize_t idx;
if (!netdev)
return;
- free(netdev->upscript);
- free(netdev->downscript);
- free(netdev->hwaddr);
- free(netdev->mtu);
+ idx = netdev->idx;
+
+ free_disarm(netdev->upscript);
+ free_disarm(netdev->downscript);
+ free_disarm(netdev->hwaddr);
+ free_disarm(netdev->mtu);
- free(netdev->ipv4_gateway);
+ free_disarm(netdev->ipv4_gateway);
lxc_list_for_each_safe(cur, &netdev->ipv4, next) {
lxc_list_del(cur);
free(cur->elem);
free(cur);
}
- free(netdev->ipv6_gateway);
+ free_disarm(netdev->ipv6_gateway);
lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
lxc_list_del(cur);
free(cur->elem);
}
}
- free(netdev);
+ memset(netdev, 0, sizeof(struct lxc_netdev));
+ lxc_list_init(&netdev->ipv4);
+ lxc_list_init(&netdev->ipv6);
+ netdev->type = -1;
+ netdev->idx = idx;
+}
+
+static void lxc_free_netdev(struct lxc_netdev *netdev)
+{
+ if (netdev) {
+ lxc_clear_netdev(netdev);
+ free(netdev);
+ }
}
bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx)
__hidden extern void lxc_log_configured_netdevs(const struct lxc_conf *conf);
__hidden extern bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx);
__hidden extern void lxc_free_networks(struct lxc_list *networks);
+__hidden extern void lxc_clear_netdev(struct lxc_netdev *netdev);
__hidden extern int lxc_veth_mode_to_flag(int *mode, const char *value);
__hidden extern char *lxc_veth_flag_to_mode(int mode);
__hidden extern int lxc_macvlan_mode_to_flag(int *mode, const char *value);