Based on e46b13c8c7f48f81d4e09912f2265daaa7f6d27e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 25 Oct 2014 20:30:51 -0400 Subject: [PATCH] manager: do not print anything while passwords are being queried https://bugs.freedesktop.org/show_bug.cgi?id=73942 --- src/core/manager.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/core/manager.h | 5 ++ 2 files changed, 109 insertions(+), 1 deletion(-) --- src/core/manager.c +++ src/core/manager.c 2014-10-29 14:31:18.984212089 +0000 @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include #include @@ -212,6 +214,96 @@ static void manager_print_jobs_in_progre } +static int have_ask_password(void) { + _cleanup_closedir_ DIR *dir; + + dir = opendir("/run/systemd/ask-password"); + if (!dir) { + if (errno == ENOENT) + return false; + else + return -errno; + } + + for (;;) { + struct dirent *de; + + errno = 0; + de = readdir(dir); + if (!de && errno != 0) + return -errno; + if (!de) + return false; + + if (startswith(de->d_name, "ask.")) + return true; + } +} + +static int manager_dispatch_ask_password_fd(sd_event_source *source, + int fd, uint32_t revents, void *userdata) { + Manager *m = userdata; + + assert(m); + + flush_fd(fd); + + m->have_ask_password = have_ask_password(); + if (m->have_ask_password < 0) + /* Log error but continue. Negative have_ask_password + * is treated as unknown status. */ + log_error("Failed to list /run/systemd/ask-password: %s", strerror(m->have_ask_password)); + + return 0; +} + +static void manager_close_ask_password(Manager *m) { + assert(m); + if (m->ask_password_inotify_fd >= 0) close_nointr_nofail(m->ask_password_inotify_fd); + m->ask_password_inotify_fd = -1; + m->ask_password_event_source = sd_event_source_unref(m->ask_password_event_source); + m->have_ask_password = -EINVAL; +} + +static int manager_check_ask_password(Manager *m) { + int r; + + assert(m); + + if (!m->ask_password_event_source) { + assert(m->ask_password_inotify_fd < 0); + + mkdir_p_label("/run/systemd/ask-password", 0755); + + m->ask_password_inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC); + if (m->ask_password_inotify_fd < 0) { + log_error("inotify_init1() failed: %m"); + return -errno; + } + + if (inotify_add_watch(m->ask_password_inotify_fd, "/run/systemd/ask-password", IN_CREATE|IN_DELETE|IN_MOVE) < 0) { + log_error("Failed to add watch on /run/systemd/ask-password: %m"); + manager_close_ask_password(m); + return -errno; + } + + r = sd_event_add_io(m->event, &m->ask_password_event_source, + m->ask_password_inotify_fd, EPOLLIN, + manager_dispatch_ask_password_fd, m); + if (r < 0) { + log_error("Failed to add event source for /run/systemd/ask-password: %m"); + manager_close_ask_password(m); + return -errno; + } + + /* Queries might have been added meanwhile... */ + manager_dispatch_ask_password_fd(m->ask_password_event_source, + m->ask_password_inotify_fd, EPOLLIN, m); + } + + return m->have_ask_password; +} + static int manager_watch_idle_pipe(Manager *m) { int r; @@ -470,6 +562,9 @@ int manager_new(SystemdRunningAs running m->pin_cgroupfs_fd = m->notify_fd = m->signal_fd = m->time_change_fd = m->dev_autofs_fd = m->private_listen_fd = m->kdbus_fd = -1; m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */ + m->ask_password_inotify_fd = -1; + m->have_ask_password = -EINVAL; /* we don't know */ + r = manager_default_environment(m); if (r < 0) goto fail; @@ -847,6 +942,8 @@ void manager_free(Manager *m) { if (m->kdbus_fd >= 0) close_nointr_nofail(m->kdbus_fd); + manager_close_ask_password(m); + manager_close_idle_pipe(m); udev_unref(m->udev); @@ -2526,6 +2623,9 @@ void manager_check_finished(Manager *m) /* Turn off confirm spawn now */ m->confirm_spawn = false; + /* No need to update ask password status when we're going non-interactive */ + manager_close_ask_password(m); + if (dual_timestamp_is_set(&m->finish_timestamp)) return; @@ -2843,12 +2943,15 @@ static bool manager_get_show_status(Mana if (m->no_console_output) return false; + /* If we cannot find out the status properly, just proceed. */ + if (manager_check_ask_password(m) > 0) + return false; + if (m->show_status > 0) return true; /* If Plymouth is running make sure we show the status, so * that there's something nice to see when people press Esc */ - return plymouth_running(); } --- src/core/manager.h +++ src/core/manager.h 2014-10-29 00:00:00.000000000 +0000 @@ -231,6 +231,11 @@ struct Manager { unsigned n_on_console; unsigned jobs_in_progress_iteration; + /* Do we have any outstanding password prompts? */ + int have_ask_password; + int ask_password_inotify_fd; + sd_event_source *ask_password_event_source; + /* Type=idle pipes */ int idle_pipe[4]; sd_event_source *idle_pipe_event_source;