Skip to content

Commit

Permalink
confile_utils: improve network parser
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Mar 29, 2021
1 parent 19c8192 commit 05eac3f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 22 deletions.
13 changes: 5 additions & 8 deletions src/lxc/confile.c
Expand Up @@ -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,
struct lxc_conf *lxc_conf, void *data)
{
__do_free char *new_value = NULL;
struct lxc_netdev *netdev = data;
char *new_value;

if (lxc_config_value_empty(value))
return clr_config_net_hwaddr(key, lxc_conf, data);
Expand All @@ -560,13 +560,10 @@ static int set_config_net_hwaddr(const char *key, const char *value,

rand_complete_hwaddr(new_value);

if (lxc_config_value_empty(new_value)) {
free(new_value);
netdev->hwaddr = NULL;
return 0;
}

netdev->hwaddr = new_value;
if (lxc_config_value_empty(new_value))
free_disarm(netdev->hwaddr);
else
netdev->hwaddr = move_ptr(new_value);

return 0;
}
Expand Down
29 changes: 15 additions & 14 deletions src/lxc/confile_utils.c
Expand Up @@ -169,19 +169,16 @@ struct lxc_netdev *lxc_network_add(struct lxc_list *networks, int idx, bool tail
if (!netdev)
return ret_set_errno(NULL, ENOMEM);

memset(netdev, 0, sizeof(*netdev));
lxc_list_init(&netdev->ipv4);
lxc_list_init(&netdev->ipv6);

/* give network a unique index */
netdev->idx = idx;

/* prepare new list */
newlist = zalloc(sizeof(*newlist));
newlist = lxc_list_new();
if (!newlist)
return ret_set_errno(NULL, ENOMEM);

lxc_list_init(newlist);
newlist->elem = netdev;

if (tail)
Expand All @@ -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,
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;
struct lxc_netdev *netdev = insert->elem;

/* found network device */
if (netdev->idx == idx)
return netdev;
else if (netdev->idx > idx)

if (netdev->idx > idx)
break;
}
}

if (!allocate)
return ret_set_errno(NULL, EINVAL);
if (allocate)
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)
Expand Down Expand Up @@ -452,19 +451,21 @@ static void lxc_free_netdev(struct lxc_netdev *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)
{
call_cleaner(lxc_free_netdev) struct lxc_netdev *netdev = NULL;
struct lxc_list *cur, *next;

if (lxc_list_empty(&conf->network))
return false;

lxc_list_for_each_safe(cur, &conf->network, next) {
netdev = cur->elem;
struct lxc_netdev *netdev = cur->elem;

if (netdev->idx != idx)
continue;

lxc_list_del(cur);
lxc_free_netdev(netdev);
return true;
}

Expand Down

0 comments on commit 05eac3f

Please sign in to comment.