confile: add getter for lxc.id_map

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2017-05-31 06:26:59 +02:00
parent b863bf92ac
commit 5014ff2ee8
No known key found for this signature in database
GPG Key ID: 8EB056D53EECB12D

View File

@ -91,7 +91,9 @@ static int get_config_lsm_se_context(struct lxc_container *, const char *, char
static int set_config_cgroup(const char *, const char *, struct lxc_conf *);
static int get_config_cgroup(struct lxc_container *, const char *, char *, int);
static int set_config_idmap(const char *, const char *, struct lxc_conf *);
static int set_config_idmaps(const char *, const char *, struct lxc_conf *);
static int get_config_idmaps(struct lxc_container *, const char *, char *, int);
static int set_config_loglevel(const char *, const char *, struct lxc_conf *);
static int set_config_logfile(const char *, const char *, struct lxc_conf *);
static int set_config_mount(const char *, const char *, struct lxc_conf *);
@ -153,7 +155,7 @@ static struct lxc_config_t config[] = {
{ "lxc.aa_allow_incomplete", set_config_lsm_aa_incomplete, get_config_lsm_aa_incomplete, NULL},
{ "lxc.se_context", set_config_lsm_se_context, get_config_lsm_se_context, NULL},
{ "lxc.cgroup", set_config_cgroup, get_config_cgroup, NULL},
{ "lxc.id_map", set_config_idmap, NULL, NULL},
{ "lxc.id_map", set_config_idmaps, get_config_idmaps, NULL},
{ "lxc.loglevel", set_config_loglevel, NULL, NULL},
{ "lxc.logfile", set_config_logfile, NULL, NULL},
{ "lxc.mount.entry", set_config_mount, NULL, NULL},
@ -1815,7 +1817,8 @@ out:
return -1;
}
static int set_config_idmap(const char *key, const char *value, struct lxc_conf *lxc_conf)
static int set_config_idmaps(const char *key, const char *value,
struct lxc_conf *lxc_conf)
{
unsigned long hostid, nsid, range;
char type;
@ -2928,54 +2931,6 @@ 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)
{
@ -3045,8 +3000,6 @@ 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 if (strcmp(key, "lxc.haltsignal") == 0)
return lxc_get_conf_int(c, retv, inlen, c->haltsignal);
else if (strcmp(key, "lxc.rebootsignal") == 0)
@ -3753,3 +3706,52 @@ static int get_config_cgroup(struct lxc_container *c, const char *key,
return fulllen;
}
static int get_config_idmaps(struct lxc_container *c, const char *key,
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->lxc_conf->id_map);
lxc_list_for_each(it, &c->lxc_conf->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;
}