[systemd-devel] [PATCH 04/12] Add some plymouth functionality to connect and send, messages

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Wed Jan 28 06:44:45 PST 2015


On Wed, Jan 28, 2015 at 02:22:04PM +0100, Didier Roche wrote:
> 

> From 7afe9270e3210668053089caaff8a1dd790a48f5 Mon Sep 17 00:00:00 2001
> From: Didier Roche <didrocks at ubuntu.com>
> Date: Mon, 26 Jan 2015 17:07:32 +0100
> Subject: [PATCH 04/12] Add some plymouth functionality to connect and send
>  messages
> 
> Connect to plymouth (if running).
> Automatic reconnect if plymouth was disconnected (or respawned)
> when trying to send a subsequent message.
> ---
>  Makefile.am           |  2 ++
>  configure.ac          | 12 ++++++++
>  src/shared/plymouth.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/shared/plymouth.h |  8 +++++
>  4 files changed, 105 insertions(+)
> 
> diff --git a/Makefile.am b/Makefile.am
> index 18be607..a9d61f1 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -929,10 +929,12 @@ libsystemd_shared_la_CFLAGS = \
>  	$(AM_CFLAGS) \
>  	$(CAP_CFLAGS) \
>  	$(SECCOMP_CFLAGS) \
> +	$(PLYMOUTH_CFLAGS) \
>  	-pthread
>  
>  libsystemd_shared_la_LIBADD = \
>  	$(CAP_LIBS) \
> +	$(PLYMOUTH_LIBS) \
>  	-lm
>  
>  # ------------------------------------------------------------------------------
> diff --git a/configure.ac b/configure.ac
> index 12e4ab2..62f1eef 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -857,6 +857,18 @@ fi
>  AM_CONDITIONAL(HAVE_MICROHTTPD, [test "$have_microhttpd" = "yes"])
>  
>  # ------------------------------------------------------------------------------
> +have_plymouth=no
> +AC_ARG_ENABLE(plymouth, AS_HELP_STRING([--disable-plymouth], [disable plymouth integration]))
> +if test "x$enable_plymouth" != "xno"; then
> +        PKG_CHECK_MODULES([PLYMOUTH], [ply-boot-client >= 0.8.0],
> +                [AC_DEFINE(HAVE_PLYMOUTH, 1, [Define if plymouth is available]) have_plymouth=yes], have_plymouth=no)
> +        if test "x$have_plymouth" = xno -a "x$enable_plymouth" = xyes; then
> +                AC_MSG_ERROR([*** plymouth integration requested but libraries not found])
> +        fi
> +fi
> +AM_CONDITIONAL(HAVE_PLYMOUTH, [test "$have_plymouth" = "yes"])
> +
> +# ------------------------------------------------------------------------------
>  have_gnutls=no
>  AC_ARG_ENABLE(gnutls, AS_HELP_STRING([--disable-gnutls], [disable gnutls support]))
>  if test "x$enable_gnutls" != "xno"; then
> diff --git a/src/shared/plymouth.c b/src/shared/plymouth.c
> index c4865dd..f7155c4 100644
> --- a/src/shared/plymouth.c
> +++ b/src/shared/plymouth.c
> @@ -19,13 +19,96 @@
>    along with systemd; If not, see <http://www.gnu.org/licenses/>.
>  ***/
>  
> +#ifdef HAVE_PLYMOUTH
> +#include <ply-boot-client.h>
> +#endif
> +
>  #include <stdbool.h>
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <unistd.h>
>  
> +#include "log.h"
>  #include "plymouth.h"
>  
> +#ifdef HAVE_PLYMOUTH
> +void plymouth_disconnected (void *user_data, ply_boot_client_t *client);
> +void plymouth_update_failed(void *user_data, ply_boot_client_t *client);
> +
> +static ply_boot_client_t *plymouth_client = NULL;
> +static ply_event_loop_t *plymouth_event_loop = NULL;
> +#endif
> +
>  bool plymouth_running(void) {
>          return access("/run/plymouth/pid", F_OK) >= 0;
>  }
> +
> +#ifdef HAVE_PLYMOUTH
> +bool plymouth_connect(void) {
Is there a particular reason why this cannot return a normal int code?

> +
> +        /* Keep existing connection */
> +        if (plymouth_client)
> +                return true;
> +
> +        /* Create the event loop */
> +        if (!plymouth_event_loop)
Please make this {

> +                plymouth_event_loop = ply_event_loop_new();
> +
> +        if (!plymouth_event_loop) {
> +                log_error("Couldn't create event loop for plymouth");
> +                return false;
> +        }

} a subclause of the if. It looks weird otherwise.

> +
> +        plymouth_client = ply_boot_client_new();
> +
> +        if (!ply_boot_client_connect(plymouth_client, plymouth_disconnected, NULL)) {
> +                log_error("Couldn't connect to plymouth");
> +                ply_boot_client_free(plymouth_client);
> +                plymouth_client = NULL;
> +                plymouth_event_loop = NULL;
> +                return false;
> +        }
> +
> +        /* attach event loop after being connected to plymouth or the disconnect handler won't be registered
> +           and flush all events that may exists from an older connection if we are reconnected */
> +        ply_boot_client_attach_to_event_loop(plymouth_client, plymouth_event_loop);
> +        ply_boot_client_flush(plymouth_client);
> +
> +        return true;
> +}
> +
> +void plymouth_disconnect(void) {
> +        if (!plymouth_client)
> +                 return;
> +        ply_boot_client_disconnect(plymouth_client);
> +        ply_boot_client_flush(plymouth_client);
> +}
> +
> +void plymouth_update(const char *message) {
> +        if (!plymouth_running() || !plymouth_connect())
> +                return;
> +
> +        ply_boot_client_update_daemon(plymouth_client, message, NULL, NULL, NULL);
> +        ply_boot_client_flush(plymouth_client);
> +}
> +
> +void plymouth_delete_message(void) {
> +        if (!plymouth_running() || !plymouth_client)
> +                return;
> +
> +        ply_boot_client_tell_daemon_to_display_message (plymouth_client, "", NULL, plymouth_update_failed, NULL);
> +        ply_boot_client_flush(plymouth_client);
> +}
> +
> +void plymouth_update_failed(void *user_data, ply_boot_client_t *client) {
> +        log_error("Couldn't send message to plymouth");
> +}
> +
> +void plymouth_disconnected (void *user_data, ply_boot_client_t *client) {
Those functions which are not defined in plymouth.h should be static.

> +        log_warning("Plymouth disconnected");
> +        plymouth_delete_message();
> +        ply_boot_client_disconnect(plymouth_client);
> +        ply_boot_client_free(plymouth_client);
> +        plymouth_client = NULL;
> +}
> +#endif
> diff --git a/src/shared/plymouth.h b/src/shared/plymouth.h
> index 39c8c37..15cecb7 100644
> --- a/src/shared/plymouth.h
> +++ b/src/shared/plymouth.h
> @@ -24,3 +24,11 @@
>  #include <stdbool.h>
>  
>  bool plymouth_running(void);
> +
> +#ifdef HAVE_PLYMOUTH
> +bool plymouth_connect(void);
> +void plymouth_disconnect(void);
> +void plymouth_update(const char *message);
> +
> +void plymouth_delete_message(void);
> +#endif

Zbyszek


More information about the systemd-devel mailing list