On Wed, Jan 28, 2015 at 02:22:30PM +0100, Didier Roche wrote: > > From c60d4f41e279dd5ed7134d97d95549aac1f38e69 Mon Sep 17 00:00:00 2001 > From: Didier Roche <didro...@ubuntu.com> > Date: Mon, 26 Jan 2015 16:29:30 +0100 > Subject: [PATCH 05/12] Connect and send to plymouth progress report > > Try to connect and send to plymouth (if running) some check report progress, > using libplymouth. > > Update message is the following: > fsckd:<num_devices>:<progress>:<string> > > * num_devices corresponds to the current number of devices being checked (int) > * progress corresponds to the current minimum percentage of all devices being > checking (float, from 0 to 100) checked
> * string is a translated message ready to be displayed by the plymouth theme > displaying the information above. It can be overriden by plymouth themes > supporting i18n. > --- > src/fsckd/fsckd.c | 23 ++++++++++++++++++++++- > src/shared/plymouth.c | 15 +++++++++++++++ > src/shared/plymouth.h | 2 ++ > 3 files changed, 39 insertions(+), 1 deletion(-) > > diff --git a/src/fsckd/fsckd.c b/src/fsckd/fsckd.c > index e27cd6d..b516193 100644 > --- a/src/fsckd/fsckd.c > +++ b/src/fsckd/fsckd.c > @@ -39,6 +39,9 @@ > #include "log.h" > #include "list.h" > #include "macro.h" > +#ifdef HAVE_PLYMOUTH > +#include "plymouth.h" > +#endif > #include "sd-daemon.h" > #include "time-util.h" > #include "util.h" > @@ -95,6 +98,9 @@ static int handle_requests(int socket_fd) { > int new_client_fd = 0; > Clients *current; > _cleanup_free_ char *console_message = NULL; > +#ifdef HAVE_PLYMOUTH > + _cleanup_free_ char *fsck_message = NULL; > +#endif > double current_percent = 100; > int current_numdevices = 0, m = 0; > usec_t t; > @@ -155,6 +161,9 @@ static int handle_requests(int socket_fd) { > > asprintf(&console_message, "Checking in progress on > %d disks (%3.1f%% complete)", > numdevices, percent); > +#ifdef HAVE_PLYMOUTH > + asprintf(&fsck_message, "fsckd:%d:%3.1f:%s", > numdevices, percent, console_message); > +#endif oom check. > > /* write to console */ > if (show_progress) { > @@ -162,6 +171,11 @@ static int handle_requests(int socket_fd) { > fflush(console); > } > > +#ifdef HAVE_PLYMOUTH > + /* send to plymouth */ > + plymouth_update(fsck_message); > +#endif > + > if (m > clear) > clear = m; > } > @@ -187,6 +201,9 @@ static int handle_requests(int socket_fd) { > fputc('\r', console); > fflush(console); > } > +#ifdef HAVE_PLYMOUTH > + plymouth_disconnect(); > +#endif > > return 0; > } > @@ -218,7 +235,11 @@ static int create_socket(void) { > > static void help(void) { > printf("%s [OPTIONS...]\n\n" > - "Capture fsck progress and forward one stream to plymouth\n\n" > +#ifdef HAVE_PLYMOUTH > + "Capture fsck progress, log to console and forward one stream > to plymouth\n\n" > +#else > + "Capture fsck progress and log to console\n\n" > +#endif > " -h --help Show this help\n" > " --version Show package version\n", > program_invocation_short_name); > diff --git a/src/shared/plymouth.c b/src/shared/plymouth.c > index f7155c4..b43d355 100644 > --- a/src/shared/plymouth.c > +++ b/src/shared/plymouth.c > @@ -92,6 +92,21 @@ void plymouth_update(const char *message) { > ply_boot_client_flush(plymouth_client); > } > > +static void plymouth_key_pressed(void *callback, const char *pressed_key, > ply_boot_client_t *client) { > + ((keypress_callback)callback)(); > +} > + > +bool plymouth_watch_key(const char *keys, const char *message, > keypress_callback callback) { > + if (!plymouth_running() || !plymouth_connect()) > + return false; > + > + ply_boot_client_tell_daemon_to_display_message (plymouth_client, > message, NULL, > + > plymouth_update_failed, NULL); > + ply_boot_client_ask_daemon_to_watch_for_keystroke (plymouth_client, > keys, plymouth_key_pressed, > + NULL, callback); > + return true; > +} > + > void plymouth_delete_message(void) { > if (!plymouth_running() || !plymouth_client) > return; > diff --git a/src/shared/plymouth.h b/src/shared/plymouth.h > index 15cecb7..f5ea00c 100644 > --- a/src/shared/plymouth.h > +++ b/src/shared/plymouth.h > @@ -30,5 +30,7 @@ bool plymouth_connect(void); > void plymouth_disconnect(void); > void plymouth_update(const char *message); > > +typedef void (*keypress_callback)(void); > void plymouth_delete_message(void); > +bool plymouth_watch_key(const char *keys, const char *message, > keypress_callback callback); > #endif Zbyszek _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel