]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: add lxc_get_idmaps()
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 30 May 2017 15:30:01 +0000 (17:30 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 30 May 2017 16:43:08 +0000 (18:43 +0200)
lxc_get_idmaps() retrieves the idmaps defined for the container. If multiple id
mappings are defined they will be separated by newlines.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/confile.c

index a542912d9456cab16e9d127763083ddbadc1b62b..61745c0e5b8c22066cc8ba8e8faa7750dd3e7e72 100644 (file)
@@ -2967,6 +2967,54 @@ static int lxc_get_item_network(struct lxc_conf *c, char *retv, int inlen)
        return fulllen;
 }
 
+static int lxc_get_idmaps(struct lxc_conf *c, char *retv, int inlen)
+{
+       struct lxc_list *it;
+       int len, listlen, ret;
+       int fulllen = 0;
+/* "u 1000 1000000 65536"
+ *
+ * let's render this as
+ *
+ * sizeof(char)
+ * +
+ * sizeof(" ")
+ * +
+ * sizeof(uint64_t)
+ * +
+ * sizeof(" ")
+ * +
+ * sizeof(uint64_t)
+ * +
+ * sizeof(" ")
+ * +
+ * sizeof(uint64_t)
+ * +
+ * \0
+ */
+#define __LXC_IDMAP_STR_BUF (3 * LXC_NUMSTRLEN64 + 3 + 1 + 1)
+       char buf[__LXC_IDMAP_STR_BUF];
+
+       if (!retv)
+               inlen = 0;
+       else
+               memset(retv, 0, inlen);
+
+       listlen = lxc_list_len(&c->id_map);
+       lxc_list_for_each(it, &c->id_map)
+       {
+               struct id_map *map = it->elem;
+               ret = snprintf(buf, __LXC_IDMAP_STR_BUF, "%c %lu %lu %lu",
+                              (map->idtype == ID_TYPE_UID) ? 'u' : 'g',
+                              map->nsid, map->hostid, map->range);
+               if (ret < 0 || ret >= __LXC_IDMAP_STR_BUF)
+                       return -1;
+
+               strprint(retv, inlen, "%s%s", buf, (listlen-- > 1) ? "\n" : "");
+       }
+       return fulllen;
+}
+
 int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv,
                        int inlen)
 {
@@ -3054,6 +3102,8 @@ int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv,
                return lxc_get_limit_entry(c, retv, inlen, "all");
        else if (strncmp(key, "lxc.limit.", 10) == 0) // specific limit
                return lxc_get_limit_entry(c, retv, inlen, key + 10);
+       else if (strcmp(key, "lxc.id_map") == 0)
+               return lxc_get_idmaps(c, retv, inlen);
        else return -1;
 
        if (!v)