confile_utils: improve network parser

parent 19c8192f
...@@ -545,8 +545,8 @@ static int set_config_net_ipvlan_isolation(const char *key, const char *value, ...@@ -545,8 +545,8 @@ static int set_config_net_ipvlan_isolation(const char *key, const char *value,
static int set_config_net_hwaddr(const char *key, const char *value, static int set_config_net_hwaddr(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data) struct lxc_conf *lxc_conf, void *data)
{ {
__do_free char *new_value = NULL;
struct lxc_netdev *netdev = data; struct lxc_netdev *netdev = data;
char *new_value;
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_net_hwaddr(key, lxc_conf, data); return clr_config_net_hwaddr(key, lxc_conf, data);
...@@ -560,13 +560,10 @@ static int set_config_net_hwaddr(const char *key, const char *value, ...@@ -560,13 +560,10 @@ static int set_config_net_hwaddr(const char *key, const char *value,
rand_complete_hwaddr(new_value); rand_complete_hwaddr(new_value);
if (lxc_config_value_empty(new_value)) { if (lxc_config_value_empty(new_value))
free(new_value); free_disarm(netdev->hwaddr);
netdev->hwaddr = NULL; else
return 0; netdev->hwaddr = move_ptr(new_value);
}
netdev->hwaddr = new_value;
return 0; return 0;
} }
......
...@@ -169,7 +169,6 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail ...@@ -169,7 +169,6 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail
if (!netdev) if (!netdev)
return ret_set_errno(NULL, ENOMEM); return ret_set_errno(NULL, ENOMEM);
memset(netdev, 0, sizeof(*netdev));
lxc_list_init(&netdev->ipv4); lxc_list_init(&netdev->ipv4);
lxc_list_init(&netdev->ipv6); lxc_list_init(&netdev->ipv6);
...@@ -177,11 +176,9 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail ...@@ -177,11 +176,9 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail
netdev->idx = idx; netdev->idx = idx;
/* prepare new list */ /* prepare new list */
newlist = zalloc(sizeof(*newlist)); newlist = lxc_list_new();
if (!newlist) if (!newlist)
return ret_set_errno(NULL, ENOMEM); return ret_set_errno(NULL, ENOMEM);
lxc_list_init(newlist);
newlist->elem = netdev; newlist->elem = netdev;
if (tail) if (tail)
...@@ -199,25 +196,27 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail ...@@ -199,25 +196,27 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail
struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf, struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf,
unsigned int idx, bool allocate) unsigned int idx, bool allocate)
{ {
struct lxc_netdev *netdev = NULL;
struct lxc_list *networks = &conf->network; struct lxc_list *networks = &conf->network;
struct lxc_list *insert = networks; struct lxc_list *insert = networks;
/* lookup network */ /* lookup network */
if (!lxc_list_empty(networks)) { if (!lxc_list_empty(networks)) {
lxc_list_for_each(insert, networks) { lxc_list_for_each(insert, networks) {
netdev = insert->elem; struct lxc_netdev *netdev = insert->elem;
/* found network device */
if (netdev->idx == idx) if (netdev->idx == idx)
return netdev; return netdev;
else if (netdev->idx > idx)
if (netdev->idx > idx)
break; break;
} }
} }
if (!allocate) if (allocate)
return ret_set_errno(NULL, EINVAL);
return lxc_network_add(insert, idx, true); return lxc_network_add(insert, idx, true);
return NULL;
} }
void lxc_log_configured_netdevs(const struct lxc_conf *conf) void lxc_log_configured_netdevs(const struct lxc_conf *conf)
...@@ -452,19 +451,21 @@ static void lxc_free_netdev(struct lxc_netdev *netdev) ...@@ -452,19 +451,21 @@ static void lxc_free_netdev(struct lxc_netdev *netdev)
free(netdev); free(netdev);
} }
define_cleanup_function(struct lxc_netdev *, lxc_free_netdev);
bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx) bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx)
{ {
call_cleaner(lxc_free_netdev) struct lxc_netdev *netdev = NULL;
struct lxc_list *cur, *next; struct lxc_list *cur, *next;
if (lxc_list_empty(&conf->network))
return false;
lxc_list_for_each_safe(cur, &conf->network, next) { lxc_list_for_each_safe(cur, &conf->network, next) {
netdev = cur->elem; struct lxc_netdev *netdev = cur->elem;
if (netdev->idx != idx) if (netdev->idx != idx)
continue; continue;
lxc_list_del(cur); lxc_list_del(cur);
lxc_free_netdev(netdev);
return true; return true;
} }
......
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