return zalloc(sizeof(struct attach_context));
}
-static signed long get_personality(const char *name, const char *lxcpath)
+static int get_personality(const char *name, const char *lxcpath,
+ signed long *personality)
{
__do_free char *p = NULL;
+ signed long per;
p = lxc_cmd_get_config_item(name, "lxc.arch", lxcpath);
- if (!p)
- return -1;
+ if (!p) {
+ *personality = LXC_ARCH_UNCHANGED;
+ return 0;
+ }
+
+ per = lxc_config_parse_arch(p);
+ if (per == LXC_ARCH_UNCHANGED)
+ return ret_errno(EINVAL);
- return lxc_config_parse_arch(p);
+ *personality = per;
+ return 0;
}
static int get_attach_context(struct attach_context *ctx,
for (int i = 0; i < LXC_NS_MAX; i++)
ctx->ns_fd[i] = -EBADF;
- ctx->personality = get_personality(container->name, container->config_path);
- if (ctx->personality < 0)
- return log_error_errno(-ENOENT, ENOENT, "Failed to get personality of the container");
+ ret = get_personality(container->name, container->config_path, &ctx->personality);
+ if (ret)
+ return log_error_errno(ret, errno, "Failed to get personality of the container");
if (!ctx->container->lxc_conf) {
ctx->container->lxc_conf = lxc_conf_init();
else
new_personality = options->personality;
- ret = personality(new_personality);
- if (ret < 0)
- goto on_error;
+ if (new_personality != LXC_ARCH_UNCHANGED) {
+ ret = personality(new_personality);
+ if (ret < 0)
+ goto on_error;
- TRACE("Set new personality");
+ TRACE("Set new personality");
+ }
}
#endif
{ \
/* .attach_flags = */ LXC_ATTACH_DEFAULT, \
/* .namespaces = */ -1, \
- /* .personality = */ -1, \
+ /* .personality = */ 0xffffffff, \
/* .initial_cwd = */ NULL, \
/* .uid = */ (uid_t)-1, \
/* .gid = */ (gid_t)-1, \
__hidden extern void lxc_config_define_free(struct lxc_list *defines);
-/* needed for lxc-attach */
+#define LXC_ARCH_UNCHANGED 0xffffffffL
+/*
+ * Parse personality of the container. Returns LXC_ARCH_UNCHANGED if the
+ * personality is not know.
+ * (Used during attach.)
+ */
__hidden extern signed long lxc_config_parse_arch(const char *arch);
__hidden extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);