X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnspawn%2Fnspawn.c;h=350dc93cf9f873dd934e6a4b4ae6350dc4363873;hb=ac45f971a12280de55b834a65237f72dcacfc099;hp=379ea92355e6f512c15b06ad04fcf3b66fd63f7e;hpb=3302da4667640ac130956d8d90be7c39fb39222f;p=elogind.git diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 379ea9235..350dc93cf 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -43,6 +43,7 @@ #include #include #include +#include #ifdef HAVE_SELINUX #include @@ -138,6 +139,7 @@ static bool arg_keep_unit = false; static char **arg_network_interfaces = NULL; static bool arg_network_veth = false; static char *arg_network_bridge = NULL; +static unsigned long arg_personality = 0xffffffffLU; static int help(void) { @@ -206,6 +208,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_NETWORK_INTERFACE, ARG_NETWORK_VETH, ARG_NETWORK_BRIDGE, + ARG_PERSONALITY, }; static const struct option options[] = { @@ -234,6 +237,7 @@ static int parse_argv(int argc, char *argv[]) { { "network-interface", required_argument, NULL, ARG_NETWORK_INTERFACE }, { "network-veth", no_argument, NULL, ARG_NETWORK_VETH }, { "network-bridge", required_argument, NULL, ARG_NETWORK_BRIDGE }, + { "personality", required_argument, NULL, ARG_PERSONALITY }, {} }; @@ -474,6 +478,16 @@ static int parse_argv(int argc, char *argv[]) { arg_keep_unit = true; break; + case ARG_PERSONALITY: + + arg_personality = personality_from_string(optarg); + if (arg_personality == 0xffffffffLU) { + log_error("Unknown or unsupported personality '%s'.", optarg); + return -EINVAL; + } + + break; + case '?': return -EINVAL; @@ -1983,6 +1997,13 @@ int main(int argc, char *argv[]) { setup_hostname(); + if (arg_personality != 0xffffffffLU) { + if (personality(arg_personality) < 0) { + log_error("personality() failed: %m"); + goto child_fail; + } + } + eventfd_read(sync_fd, &x); close_nointr_nofail(sync_fd); sync_fd = -1;