summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/main.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/core/main.c b/src/core/main.c
index ea06dc8014..747121461d 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -746,6 +746,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_SHOW_STATUS,
ARG_SYSV_CONSOLE,
ARG_DESERIALIZE,
+ ARG_SWITCHEDROOT,
ARG_INTROSPECT,
ARG_DEFAULT_STD_OUTPUT,
ARG_DEFAULT_STD_ERROR
@@ -770,6 +771,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "sysv-console", optional_argument, NULL, ARG_SYSV_CONSOLE },
#endif
{ "deserialize", required_argument, NULL, ARG_DESERIALIZE },
+ { "switchedroot", no_argument, NULL, ARG_SWITCHEDROOT },
{ "introspect", optional_argument, NULL, ARG_INTROSPECT },
{ "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
{ "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
@@ -941,6 +943,10 @@ static int parse_argv(int argc, char *argv[]) {
break;
}
+ case ARG_SWITCHEDROOT:
+ /* Nothing special yet */
+ break;
+
case ARG_INTROSPECT: {
const char * const * i = NULL;
@@ -1278,6 +1284,13 @@ int main(int argc, char *argv[]) {
break;
}
+ /* If we have switched root, do all the special things */
+ for (j = 1; j < argc; j++)
+ if (streq(argv[j], "--switchedroot")) {
+ is_reexec = false;
+ break;
+ }
+
/* If we get started via the /sbin/init symlink then we are
called 'init'. After a subsequent reexecution we are then
called 'systemd'. That is confusing, hence let's call us
@@ -1693,7 +1706,7 @@ finish:
if (switch_root)
do_switch_root(switch_root);
- args_size = MAX(5, argc+1);
+ args_size = MAX(6, argc+1);
args = newa(const char*, args_size);
if (!switch_root_init) {
@@ -1712,6 +1725,8 @@ finish:
i = 0;
args[i++] = SYSTEMD_BINARY_PATH;
+ if (switch_root)
+ args[i++] = "--switchedroot";
args[i++] = arg_running_as == MANAGER_SYSTEM ? "--system" : "--user";
args[i++] = "--deserialize";
args[i++] = sfd;