From 40db5d2f960351baa63f8cc8db84281b314a867a Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Thu, 15 Jun 2017 17:22:17 +0200 Subject: [PATCH] network: abstract network handling Signed-off-by: Christian Brauner --- src/lxc/confile.c | 173 ++++++++++++++++++++++++---------------------- 1 file changed, 90 insertions(+), 83 deletions(-) diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 863417da7..039004fa7 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -576,89 +576,6 @@ static int set_config_path_item(char **conf_item, const char *value) return set_config_string_item_max(conf_item, value, PATH_MAX); } -/* - * Config entry is something like "lxc.network.0.ipv4" the key 'lxc.network.' - * was found. So we make sure next comes an integer, find the right callback - * (by rewriting the key), and call it. - */ -static int set_config_network_nic(const char *key, const char *value, - struct lxc_conf *lxc_conf, void *data) -{ - char *copy, *idx_start, *idx_end; - unsigned int idx; - struct lxc_config_t *config; - size_t numstrlen; - int ret = -1; - struct lxc_netdev *netdev = NULL; - - copy = strdup(key); - if (!copy) { - SYSERROR("failed to allocate memory"); - return -1; - } - - /* - * Ok we know that to get here we've got "lxc.network." - * and it isn't any of the other network entries. So - * after the second . Should come an integer (# of defined - * nic) followed by a valid entry. - */ - if (*(key + 12) < '0' || *(key + 12) > '9') - goto on_error; - - /* beginning index string */ - idx_start = (copy + 11); - /* temporarily \o-terminate */ - *idx_start = '\0'; - - idx_end = strchr((copy + 12), '.'); - if (!idx_end) - goto on_error; - - /* temporarily \o-terminate */ - *idx_end = '\0'; - - /* parse current index */ - if (lxc_safe_uint((idx_start + 1), &idx) < 0) - goto on_error; - - numstrlen = strlen((idx_start + 1)); - - /* repair configuration key */ - *idx_start = '.'; - *idx_end = '.'; - - /* lookup network key in jump table */ - memmove(copy + 12, idx_end + 1, strlen(idx_end + 1)); - copy[strlen(key) - numstrlen + 1] = '\0'; - config = lxc_getconfig(copy); - if (!config) { - ERROR("unknown key %s", key); - goto on_error; - } - - /* This, of course is utterly nonsensical on so many levels, but better - * safe than sorry. - */ - if (idx == UINT_MAX) { - SYSERROR("number of configured networks would overflow the " - "counter... what are you doing?"); - goto on_error; - } - - /* get netdev */ - netdev = lxc_get_netdev_by_idx(lxc_conf, idx); - if (!netdev) - goto on_error; - - /* set config item */ - ret = config->set(key, value, lxc_conf, netdev); - -on_error: - free(copy); - return ret; -} - static int set_config_network(const char *key, const char *value, struct lxc_conf *lxc_conf, void *data) { @@ -4309,3 +4226,93 @@ static int get_config_includefiles(const char *key, char *retv, int inlen, { return -ENOSYS; } + +static struct lxc_config_t * +get_network_config_ops(const char *key, struct lxc_conf *lxc_conf, ssize_t *idx) +{ + char *copy, *idx_start, *idx_end; + struct lxc_config_t *config = NULL; + + /* check that this is a sensible network key */ + if (strncmp("lxc.network.", key, 12)) + return NULL; + + copy = strdup(key); + if (!copy) + return NULL; + + if (isdigit(*(key + 12))) { + int ret; + unsigned int tmpidx; + size_t numstrlen; + + /* beginning of index string */ + idx_start = (copy + 11); + *idx_start = '\0'; + + /* end of index string */ + idx_end = strchr((copy + 12), '.'); + if (!idx_end) + goto on_error; + *idx_end = '\0'; + + /* parse current index */ + ret = lxc_safe_uint((idx_start + 1), &tmpidx); + if (ret < 0) { + *idx = ret; + goto on_error; + } + + /* This, of course is utterly nonsensical on so many levels, but + * better + * safe than sorry. + */ + if (tmpidx == UINT_MAX) { + SYSERROR( + "number of configured networks would overflow the " + "counter... what are you doing?"); + goto on_error; + } + *idx = tmpidx; + + numstrlen = strlen((idx_start + 1)); + + /* repair configuration key */ + *idx_start = '.'; + *idx_end = '.'; + + memmove(copy + 12, idx_end + 1, strlen(idx_end + 1)); + copy[strlen(key) - numstrlen + 1] = '\0'; + } + + config = lxc_getconfig(copy); + if (!config) + ERROR("unknown network configuration key %s", key); + +on_error: + free(copy); + return config; +} + +/* + * Config entry is something like "lxc.network.0.ipv4" the key 'lxc.network.' + * was found. So we make sure next comes an integer, find the right callback + * (by rewriting the key), and call it. + */ +static int set_config_network_nic(const char *key, const char *value, + struct lxc_conf *lxc_conf, void *data) +{ + struct lxc_config_t *config; + struct lxc_netdev *netdev; + ssize_t idx = -1; + + config = get_network_config_ops(key, lxc_conf, &idx); + if (!config || idx < 0) + return -1; + + netdev = lxc_get_netdev_by_idx(lxc_conf, (unsigned int)idx); + if (!netdev) + return -1; + + return config->set(key, value, lxc_conf, netdev); +} -- 2.47.3