signed long *personality)
{
__do_free char *p = NULL;
+ int ret;
signed long per;
p = lxc_cmd_get_config_item(name, "lxc.arch", lxcpath);
return 0;
}
- per = lxc_config_parse_arch(p);
- if (per == LXC_ARCH_UNCHANGED)
- return ret_errno(EINVAL);
+ ret = lxc_config_parse_arch(p, &per);
+ if (ret < 0)
+ return syserror("Failed to parse personality");
*personality = per;
return 0;
static int set_config_personality(const char *key, const char *value,
struct lxc_conf *lxc_conf, void *data)
{
+ int ret;
signed long personality;
- personality = lxc_config_parse_arch(value);
- if (personality >= 0)
- lxc_conf->personality = personality;
- else
- WARN("Unsupported personality \"%s\"", value);
+ ret = lxc_config_parse_arch(value, &personality);
+ if (ret < 0)
+ return syserror("Unsupported personality \"%s\"", value);
+ lxc_conf->personality = personality;
return 0;
}
}
}
-signed long lxc_config_parse_arch(const char *arch)
+int lxc_config_parse_arch(const char *arch, signed long *persona)
{
static struct per_name {
char *name;
{ "s390x", PER_LINUX },
{ "x86_64", PER_LINUX },
};
- size_t len = sizeof(pername) / sizeof(pername[0]);
- for (int i = 0; i < len; i++)
- if (strequal(pername[i].name, arch))
- return pername[i].per;
+ for (int i = 0; i < ARRAY_SIZE(pername); i++) {
+ if (!strequal(pername[i].name, arch))
+ continue;
+
+ *persona = pername[i].per;
+ return 0;
+ }
- return LXC_ARCH_UNCHANGED;
+ return ret_errno(EINVAL);
}
int lxc_fill_elevated_privileges(char *flaglist, int *flags)
#define LXC_ARCH_UNCHANGED 0xffffffffL
/*
- * Parse personality of the container. Returns LXC_ARCH_UNCHANGED if the
- * personality is not know.
- * (Used during attach.)
+ * Parse personality of the container. Returns 0 if personality is valid,
+ * negative errno otherwise.
*/
-__hidden extern signed long lxc_config_parse_arch(const char *arch);
+__hidden extern int lxc_config_parse_arch(const char *arch, signed long *persona);
__hidden extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);
break;
case 'R': remount_sys_proc = 1; break;
case 'a':
- new_personality = lxc_config_parse_arch(arg);
- if (new_personality < 0) {
+ ret = lxc_config_parse_arch(arg, &new_personality);
+ if (ret < 0) {
ERROR("Invalid architecture specified: %s", arg);
return -1;
}