From e344997f56cfe3f2cd9682b9b0c70b5b36050623 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Wed, 21 Jun 2017 10:57:17 +0200 Subject: [PATCH] Prep v231.2: Fix missing/double wall msgs on scheduled shutdown/reboot - Do not do anything in manager_setup_wall_message_timer() if wall messages are disabled anyway. - Set up a wall timer in any case there is time left. The original sources would not even set up a timer if the next messages would be now. As time is measured in USEC, that's pretty rare, but possible. - If less than 1 Second is left to the first message, delay it. - systemd would print out a message at once, if less than 15 minutes are left to the event. Do this only, if the next scheduled message wouldn't come within the next 3 seconds, or it might come to awkward double messages. --- src/login/logind-utmp.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/login/logind-utmp.c b/src/login/logind-utmp.c index d959a4a45..917aa72aa 100644 --- a/src/login/logind-utmp.c +++ b/src/login/logind-utmp.c @@ -74,7 +74,7 @@ bool logind_wall_tty_filter(const char *tty, void *userdata) { static int warn_wall(Manager *m, usec_t n) { char date[FORMAT_TIMESTAMP_MAX] = {}; _cleanup_free_ char *l = NULL; - usec_t left; + bool left; int r; assert(m); @@ -136,10 +136,19 @@ static int wall_message_timeout_handler( int manager_setup_wall_message_timer(Manager *m) { usec_t n, elapse; +#if 1 /// let's fix double wall messages in elogind - they suck. + usec_t left; +#endif // 1 int r; assert(m); +#if 1 /// Make elogind more aware of the possibility to disable wall messages + /* Do not do anything if wall messages aren't enabled */ + if (!m->enable_wall_messages) + return 0; +#endif // 1 + n = now(CLOCK_REALTIME); elapse = m->scheduled_shutdown_timeout; @@ -153,6 +162,7 @@ int manager_setup_wall_message_timer(Manager *m) { if (elapse < n) return 0; +#if 0 /// let's fix double wall messages in elogind - they suck. /* Warn immediately if less than 15 minutes are left */ if (elapse - n < 15 * USEC_PER_MINUTE) { r = warn_wall(m, n); @@ -163,6 +173,23 @@ int manager_setup_wall_message_timer(Manager *m) { elapse = when_wall(n, elapse); if (elapse == 0) return 0; +#else + left = elapse - n; + elapse = when_wall(n, elapse); + + /* Warn immediately if less than 15 minutes are left, but not if + * there aren't more than three seconds to the next timeout. */ + if ( (left < 15 * USEC_PER_MINUTE) + && (elapse > 3 * USEC_PER_SEC) ) { + r = warn_wall(m, n); + if (r == 0) + return 0; + } + + /* If the next timeout is within on second, delay it by 3 seconds */ + if (USEC_PER_SEC > elapse) + elapse = 3 * USEC_PER_SEC; +#endif // 0 if (m->wall_message_timeout_source) { r = sd_event_source_set_time(m->wall_message_timeout_source, n + elapse); -- 2.30.2