summaryrefslogtreecommitdiff
path: root/src/core/main.c
diff options
context:
space:
mode:
authorHarald Hoyer <harald@redhat.com>2012-05-16 14:22:42 +0200
committerLennart Poettering <lennart@poettering.net>2012-05-21 18:50:06 +0200
commitd03bc1b814b853497120c35a9a8d6a66925963ff (patch)
treedc0de1a54b3736536b4413d25b2a87062eb4d30d /src/core/main.c
parentf38ed060600d124a68332694ab497c344bd8e089 (diff)
core/main.c: add "--switchedroot" parameter
If systemd serializes from a switch_root, it adds "--switchedroot" to the systemd in the real root. If "--switchedroot" is found, then we do not skip all the stuff, which is skipped for normal rexecs.
Diffstat (limited to 'src/core/main.c')
-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;