]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: rework lxc_list_net()
authorChristian Brauner <christian.brauner@ubuntu.com>
Thu, 10 Aug 2017 22:11:34 +0000 (00:11 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Thu, 10 Aug 2017 22:11:34 +0000 (00:11 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/confile.c
src/lxc/confile.h
src/lxc/lxccontainer.c

index cd77e875a52aead4a53b43d68d1e4461ca572b3f..91e90cac7b2ac642f08e8303236d5d1fe6d12267 100644 (file)
@@ -435,98 +435,6 @@ static int set_config_net_type(const char *key, const char *value,
        return 0;
 }
 
-/*
- * If you have p="lxc.net.0.link", pass it p+8
- * to get back '0' (the index of the nic).
- */
-static int get_network_netdev_idx(const char *key)
-{
-       int ret, idx;
-
-       if (*key < '0' || *key > '9')
-               return -1;
-
-       ret = sscanf(key, "%d", &idx);
-       if (ret != 1)
-               return -1;
-
-       return idx;
-}
-
-/*
- * If you have p="lxc.net.0", pass this p+8 and it will return
- * the netdev of the first configured nic.
- */
-static struct lxc_netdev *get_netdev_from_key(const char *key,
-                                             struct lxc_list *network)
-{
-       int idx;
-       struct lxc_list *it;
-       int i = 0;
-       struct lxc_netdev *netdev = NULL;
-
-       idx = get_network_netdev_idx(key);
-       if (idx == -1)
-               return NULL;
-
-       lxc_list_for_each(it, network) {
-               if (idx == i++) {
-                       netdev = it->elem;
-                       break;
-               }
-       }
-
-       return netdev;
-}
-
-extern int lxc_list_nicconfigs(struct lxc_conf *c, const char *key, char *retv,
-                              int inlen)
-{
-       struct lxc_netdev *netdev;
-       int len;
-       int fulllen = 0;
-
-       netdev = get_netdev_from_key(key + 8, &c->network);
-       if (!netdev)
-               return -1;
-
-       if (!retv)
-               inlen = 0;
-       else
-               memset(retv, 0, inlen);
-
-       strprint(retv, inlen, "type\n");
-       strprint(retv, inlen, "script.up\n");
-       strprint(retv, inlen, "script.down\n");
-       if (netdev->type != LXC_NET_EMPTY) {
-               strprint(retv, inlen, "flags\n");
-               strprint(retv, inlen, "link\n");
-               strprint(retv, inlen, "name\n");
-               strprint(retv, inlen, "hwaddr\n");
-               strprint(retv, inlen, "mtu\n");
-               strprint(retv, inlen, "ipv6.address\n");
-               strprint(retv, inlen, "ipv6.gateway\n");
-               strprint(retv, inlen, "ipv4.address\n");
-               strprint(retv, inlen, "ipv4.gateway\n");
-       }
-
-       switch (netdev->type) {
-       case LXC_NET_VETH:
-               strprint(retv, inlen, "veth.pair\n");
-               break;
-       case LXC_NET_MACVLAN:
-               strprint(retv, inlen, "macvlan.mode\n");
-               break;
-       case LXC_NET_VLAN:
-               strprint(retv, inlen, "vlan.id\n");
-               break;
-       case LXC_NET_PHYS:
-               break;
-       }
-
-       return fulllen;
-}
-
 static int set_config_net_flags(const char *key, const char *value,
                                struct lxc_conf *lxc_conf, void *data)
 {
@@ -3734,6 +3642,66 @@ on_error:
        return NULL;
 }
 
+int lxc_list_net(struct lxc_conf *c, const char *key, char *retv, int inlen)
+{
+       int len;
+       const char *idxstring;
+       struct lxc_config_t *config;
+       struct lxc_netdev *netdev;
+       int fulllen = 0;
+       ssize_t idx = -1;
+       char *deindexed_key = NULL;
+
+       idxstring = key + 8;
+       if (!isdigit(*idxstring))
+               return -1;
+
+       config = get_network_config_ops(key, c, &idx, &deindexed_key);
+       if (!config || idx < 0)
+               return -1;
+
+       netdev = lxc_get_netdev_by_idx(c, (unsigned int)idx, false);
+       free(deindexed_key);
+       if (!netdev)
+               return -1;
+
+       if (!retv)
+               inlen = 0;
+       else
+               memset(retv, 0, inlen);
+
+       strprint(retv, inlen, "type\n");
+       strprint(retv, inlen, "script.up\n");
+       strprint(retv, inlen, "script.down\n");
+       if (netdev->type != LXC_NET_EMPTY) {
+               strprint(retv, inlen, "flags\n");
+               strprint(retv, inlen, "link\n");
+               strprint(retv, inlen, "name\n");
+               strprint(retv, inlen, "hwaddr\n");
+               strprint(retv, inlen, "mtu\n");
+               strprint(retv, inlen, "ipv6.address\n");
+               strprint(retv, inlen, "ipv6.gateway\n");
+               strprint(retv, inlen, "ipv4.address\n");
+               strprint(retv, inlen, "ipv4.gateway\n");
+       }
+
+       switch (netdev->type) {
+       case LXC_NET_VETH:
+               strprint(retv, inlen, "veth.pair\n");
+               break;
+       case LXC_NET_MACVLAN:
+               strprint(retv, inlen, "macvlan.mode\n");
+               break;
+       case LXC_NET_VLAN:
+               strprint(retv, inlen, "vlan.id\n");
+               break;
+       case LXC_NET_PHYS:
+               break;
+       }
+
+       return fulllen;
+}
+
 /*
  * Config entry is something like "lxc.net.0.ipv4" the key 'lxc.net.'
  * was found.  So we make sure next comes an integer, find the right callback
index 8c4991f0eed38174509909530e5baa52977ecdee..a5c2e36bf06f0082c8f49549882aa42d8412b21d 100644 (file)
@@ -38,6 +38,7 @@ typedef int (*config_set_cb)(const char *, const char *, struct lxc_conf *,
 typedef int (*config_get_cb)(const char *, char *, int, struct lxc_conf *,
                             void *);
 typedef int (*config_clr_cb)(const char *, struct lxc_conf *c, void *data);
+
 struct lxc_config_t {
        char *name;
        config_set_cb set;
@@ -46,7 +47,13 @@ struct lxc_config_t {
 };
 
 extern struct lxc_config_t *lxc_getconfig(const char *key);
-extern int lxc_list_nicconfigs(struct lxc_conf *c, const char *key, char *retv, int inlen);
+
+/* List all configuration items associated with a given network. For example
+ * pass "lxc.net.[i]" to retrieve all configuration items associated with
+ * the network associated with index [i].
+ */
+extern int lxc_list_net(struct lxc_conf *c, const char *key, char *retv,
+                       int inlen);
 extern int lxc_listconfigs(char *retv, int inlen);
 extern int lxc_config_read(const char *file, struct lxc_conf *conf, bool from_include);
 extern int append_unexp_config_line(const char *line, struct lxc_conf *conf);
index 44b4068d2073a768edd8e19d094f287bd028e7ed..025ac4e17e286a86406def6be12531751fab477b 100644 (file)
@@ -2261,7 +2261,7 @@ static int do_lxcapi_get_keys(struct lxc_container *c, const char *key, char *re
                return -1;
        int ret = -1;
        if (strncmp(key, "lxc.net.", 8) == 0)
-               ret = lxc_list_nicconfigs(c->lxc_conf, key, retv, inlen);
+               ret = lxc_list_net(c->lxc_conf, key, retv, inlen);
        else if (strncmp(key, "lxc.network.", 12) == 0)
                ret = lxc_list_nicconfigs_legacy(c->lxc_conf, key, retv, inlen);
        container_mem_unlock(c);