switchroot: Don't log if running as pid1, minor code style cleanups

If we're running as pid1, avoid printing anything in the normal
success paths as we don't want to affect the physical console by
default; the device may be using a splash screen, etc.

Also cleanup the code a bit to use a single variable
`running_as_pid1`, declare-and-initialize, use the
`bool` type, etc.

Closes: #1531
Approved by: jlebon
This commit is contained in:
Colin Walters 2018-04-03 16:22:31 -04:00 committed by Atomic Bot
parent a2dc731982
commit fea9277020
1 changed files with 24 additions and 12 deletions

View File

@ -39,6 +39,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
@ -48,6 +49,9 @@
#include "ostree-mount-util.h"
/* Initialized early in main */
static bool running_as_pid1;
static char*
resolve_deploy_path (const char * root_mountpoint)
{
@ -60,7 +64,6 @@ resolve_deploy_path (const char * root_mountpoint)
errx (EXIT_FAILURE, "No OSTree target; expected ostree=/ostree/boot.N/...");
snprintf (destpath, sizeof(destpath), "%s/%s", root_mountpoint, ostree_target);
printf ("Examining %s\n", destpath);
if (lstat (destpath, &stbuf) < 0)
err (EXIT_FAILURE, "Couldn't find specified OSTree root '%s'", destpath);
if (!S_ISLNK (stbuf.st_mode))
@ -68,7 +71,9 @@ resolve_deploy_path (const char * root_mountpoint)
deploy_path = realpath (destpath, NULL);
if (deploy_path == NULL)
err (EXIT_FAILURE, "realpath(%s) failed", destpath);
printf ("Resolved OSTree target to: %s\n", deploy_path);
/* Quiet logs if there's no journal */
if (!running_as_pid1)
printf ("Resolved OSTree target to: %s\n", deploy_path);
return deploy_path;
}
@ -81,13 +86,18 @@ pivot_root(const char * new_root, const char * put_old)
int
main(int argc, char *argv[])
{
const char *root_mountpoint = NULL, *root_arg = NULL;
char *deploy_path = NULL;
char srcpath[PATH_MAX];
struct stat stbuf;
int we_mounted_proc = 0;
/* If we're pid 1, that means there's no initramfs; in this situation
* various defaults change:
*
* - Assume that the target root is /
* - Quiet logging as there's no journal
* etc.
*/
running_as_pid1 = (getpid () == 1);
if (getpid() == 1)
const char *root_arg = NULL;
bool we_mounted_proc = false;
if (running_as_pid1)
{
root_arg = "/";
}
@ -98,6 +108,7 @@ main(int argc, char *argv[])
root_arg = argv[1];
}
struct stat stbuf;
if (stat ("/proc/cmdline", &stbuf) < 0)
{
if (errno != ENOENT)
@ -109,10 +120,10 @@ main(int argc, char *argv[])
we_mounted_proc = 1;
}
root_mountpoint = realpath (root_arg, NULL);
const char *root_mountpoint = realpath (root_arg, NULL);
if (root_mountpoint == NULL)
err (EXIT_FAILURE, "realpath(\"%s\")", root_arg);
deploy_path = resolve_deploy_path (root_mountpoint);
char *deploy_path = resolve_deploy_path (root_mountpoint);
if (we_mounted_proc)
{
@ -147,6 +158,7 @@ main(int argc, char *argv[])
err (EXIT_FAILURE, "failed to bind mount ../../var to var");
#endif
char srcpath[PATH_MAX];
/* If /boot is on the same partition, use a bind mount to make it visible
* at /boot inside the deployment. */
snprintf (srcpath, sizeof(srcpath), "%s/boot/loader", root_mountpoint);
@ -193,7 +205,7 @@ main(int argc, char *argv[])
* not pid 1. Otherwise it's handled later via ostree-remount.service.
* https://mail.gnome.org/archives/ostree-list/2018-March/msg00012.html
*/
if (getpid () != 1)
if (!running_as_pid1)
touch_run_ostree ();
if (strcmp(root_mountpoint, "/") == 0)
@ -246,7 +258,7 @@ main(int argc, char *argv[])
if (mount ("none", "sysroot", NULL, MS_PRIVATE, NULL) < 0)
err (EXIT_FAILURE, "remounting 'sysroot' private");
if (getpid() == 1)
if (running_as_pid1)
{
execl ("/sbin/init", "/sbin/init", NULL);
err (EXIT_FAILURE, "failed to exec init inside ostree");