chiark / gitweb /
core/main.c: add "--switchedroot" parameter
authorHarald Hoyer <harald@redhat.com>
Wed, 16 May 2012 12:22:42 +0000 (14:22 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 21 May 2012 16:50:06 +0000 (18:50 +0200)
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.

src/core/main.c

index ea06dc80146ee4a86eeec5151826b4084bd03c59..747121461d0568414d835db5cbb1515e01bd1501 100644 (file)
@@ -746,6 +746,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_SHOW_STATUS,
                 ARG_SYSV_CONSOLE,
                 ARG_DESERIALIZE,
                 ARG_SHOW_STATUS,
                 ARG_SYSV_CONSOLE,
                 ARG_DESERIALIZE,
+                ARG_SWITCHEDROOT,
                 ARG_INTROSPECT,
                 ARG_DEFAULT_STD_OUTPUT,
                 ARG_DEFAULT_STD_ERROR
                 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              },
                 { "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,       },
                 { "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;
                 }
 
                         break;
                 }
 
+                case ARG_SWITCHEDROOT:
+                        /* Nothing special yet */
+                        break;
+
                 case ARG_INTROSPECT: {
                         const char * const * i = NULL;
 
                 case ARG_INTROSPECT: {
                         const char * const * i = NULL;
 
@@ -1278,6 +1284,13 @@ int main(int argc, char *argv[]) {
                         break;
                 }
 
                         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
         /* 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);
 
                 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) {
                 args = newa(const char*, args_size);
 
                 if (!switch_root_init) {
@@ -1712,6 +1725,8 @@ finish:
 
                         i = 0;
                         args[i++] = SYSTEMD_BINARY_PATH;
 
                         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;
                         args[i++] = arg_running_as == MANAGER_SYSTEM ? "--system" : "--user";
                         args[i++] = "--deserialize";
                         args[i++] = sfd;