#include "sd-bus.h"
#include "sd-id128.h"
+#include "sd-varlink.h"
#include "alloc-util.h"
#include "ask-password-api.h"
static bool arg_reset = false;
static ImagePolicy *arg_image_policy = NULL;
static bool arg_chrome = true;
+static bool arg_mute_console = false;
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
STATIC_DESTRUCTOR_REGISTER(arg_image, freep);
STATIC_DESTRUCTOR_REGISTER(arg_kernel_cmdline, freep);
STATIC_DESTRUCTOR_REGISTER(arg_image_policy, image_policy_freep);
-static void print_welcome(int rfd) {
+static void print_welcome(int rfd, sd_varlink **mute_console_link) {
_cleanup_free_ char *pretty_name = NULL, *os_name = NULL, *ansi_color = NULL;
static bool done = false;
const char *pn, *ac;
int r;
assert(rfd >= 0);
+ assert(mute_console_link);
+
+ if (!*mute_console_link && arg_mute_console)
+ (void) mute_console(mute_console_link);
if (!arg_welcome)
return;
return r != 0 ? locale_is_installed(name) > 0 : locale_is_valid(name);
}
-static int prompt_locale(int rfd) {
+static int prompt_locale(int rfd, sd_varlink **mute_console_link) {
_cleanup_strv_free_ char **locales = NULL;
bool acquired_from_creds = false;
int r;
/* Not setting arg_locale_message here, since it defaults to LANG anyway */
}
} else {
- print_welcome(rfd);
+ print_welcome(rfd, mute_console_link);
r = prompt_loop("Please enter the new system locale name or number",
GLYPH_WORLD,
return 0;
}
-static int process_locale(int rfd) {
+static int process_locale(int rfd, sd_varlink **mute_console_link) {
_cleanup_close_ int pfd = -EBADF;
_cleanup_free_ char *f = NULL;
char* locales[3];
}
}
- r = prompt_locale(rfd);
+ r = prompt_locale(rfd, mute_console_link);
if (r < 0)
return r;
return r != 0 ? keymap_exists(name) > 0 : keymap_is_valid(name);
}
-static int prompt_keymap(int rfd) {
+static int prompt_keymap(int rfd, sd_varlink **mute_console_link) {
_cleanup_strv_free_ char **kmaps = NULL;
int r;
if (r < 0)
return log_error_errno(r, "Failed to read keymaps: %m");
- print_welcome(rfd);
+ print_welcome(rfd, mute_console_link);
return prompt_loop(
"Please enter the new keymap name or number",
&arg_keymap);
}
-static int process_keymap(int rfd) {
+static int process_keymap(int rfd, sd_varlink **mute_console_link) {
_cleanup_close_ int pfd = -EBADF;
_cleanup_free_ char *f = NULL;
_cleanup_strv_free_ char **keymap = NULL;
}
}
- r = prompt_keymap(rfd);
+ r = prompt_keymap(rfd, mute_console_link);
if (r == -ENOENT)
return 0; /* don't fail if no keymaps are installed */
if (r < 0)
return timezone_is_valid(name, LOG_DEBUG);
}
-static int prompt_timezone(int rfd) {
+static int prompt_timezone(int rfd, sd_varlink **mute_console_link) {
_cleanup_strv_free_ char **zones = NULL;
int r;
if (r < 0)
return log_error_errno(r, "Cannot query timezone list: %m");
- print_welcome(rfd);
+ print_welcome(rfd, mute_console_link);
return prompt_loop(
"Please enter the new timezone name or number",
&arg_timezone);
}
-static int process_timezone(int rfd) {
+static int process_timezone(int rfd, sd_varlink **mute_console_link) {
_cleanup_close_ int pfd = -EBADF;
_cleanup_free_ char *f = NULL, *relpath = NULL;
const char *e;
}
}
- r = prompt_timezone(rfd);
+ r = prompt_timezone(rfd, mute_console_link);
if (r < 0)
return r;
return hostname_is_valid(name, VALID_HOSTNAME_TRAILING_DOT);
}
-static int prompt_hostname(int rfd) {
+static int prompt_hostname(int rfd, sd_varlink **mute_console_link) {
int r;
assert(rfd >= 0);
return 0;
}
- print_welcome(rfd);
+ print_welcome(rfd, mute_console_link);
r = prompt_loop("Please enter the new hostname",
GLYPH_LABEL,
return 0;
}
-static int process_hostname(int rfd) {
+static int process_hostname(int rfd, sd_varlink **mute_console_link) {
_cleanup_close_ int pfd = -EBADF;
_cleanup_free_ char *f = NULL;
int r;
if (r <= 0)
return r;
- r = prompt_hostname(rfd);
+ r = prompt_hostname(rfd, mute_console_link);
if (r < 0)
return r;
return 0;
}
-static int prompt_root_password(int rfd) {
+static int prompt_root_password(int rfd, sd_varlink **mute_console_link) {
const char *msg1, *msg2;
int r;
return 0;
}
- print_welcome(rfd);
+ print_welcome(rfd, mute_console_link);
msg1 = strjoina("Please enter the new root password (empty to skip):");
msg2 = strjoina("Please enter the new root password again:");
return find_shell(rfd, path) >= 0;
}
-static int prompt_root_shell(int rfd) {
+static int prompt_root_shell(int rfd, sd_varlink **mute_console_link) {
int r;
assert(rfd >= 0);
return 0;
}
- print_welcome(rfd);
+ print_welcome(rfd, mute_console_link);
return prompt_loop(
"Please enter the new root shell",
return 0;
}
-static int process_root_account(int rfd) {
+static int process_root_account(int rfd, sd_varlink **mute_console_link) {
_cleanup_close_ int pfd = -EBADF;
_cleanup_(release_lock_file) LockFile lock = LOCK_FILE_INIT;
_cleanup_(erase_and_freep) char *_hashed_password = NULL;
return log_oom();
}
- r = prompt_root_shell(rfd);
+ r = prompt_root_shell(rfd, mute_console_link);
if (r < 0)
return r;
arg_root_password_is_hashed = true;
}
- r = prompt_root_password(rfd);
+ r = prompt_root_password(rfd, mute_console_link);
if (r < 0)
return r;
" --welcome=no Disable the welcome text\n"
" --chrome=no Don't show color bar at top and bottom of\n"
" terminal\n"
+ " --mute-console=yes Tell kernel/PID 1 to not write to the console\n"
+ " while running\n"
" --reset Remove existing files\n"
"\nSee the %2$s for details.\n",
program_invocation_short_name,
ARG_WELCOME,
ARG_CHROME,
ARG_RESET,
+ ARG_MUTE_CONSOLE,
};
static const struct option options[] = {
{ "welcome", required_argument, NULL, ARG_WELCOME },
{ "chrome", required_argument, NULL, ARG_CHROME },
{ "reset", no_argument, NULL, ARG_RESET },
+ { "mute-console", required_argument, NULL, ARG_MUTE_CONSOLE },
{}
};
arg_reset = true;
break;
+ case ARG_MUTE_CONSOLE:
+ r = parse_boolean_argument("--mute-console=", optarg, &arg_mute_console);
+ if (r < 0)
+ return r;
+
+ break;
+
case '?':
return -EINVAL;
if (r < 0)
return r;
- r = process_locale(rfd);
+ _cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *mute_console_link = NULL;
+ r = process_locale(rfd, &mute_console_link);
if (r < 0)
return r;
if (r > 0 && !offline)
(void) reload_system_manager(&bus);
- r = process_keymap(rfd);
+ r = process_keymap(rfd, &mute_console_link);
if (r < 0)
return r;
if (r > 0 && !offline)
(void) reload_vconsole(&bus);
- r = process_timezone(rfd);
+ r = process_timezone(rfd, &mute_console_link);
if (r < 0)
return r;
- r = process_hostname(rfd);
+ r = process_hostname(rfd, &mute_console_link);
if (r < 0)
return r;
- r = process_root_account(rfd);
+ r = process_root_account(rfd, &mute_console_link);
if (r < 0)
return r;