Blob Blame History Raw
From 390500fc0c806ed347f76afcfe8a62a74653e81b Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 12 May 2020 10:12:26 -0400
Subject: [PATCH] notify-send: Give failing exit code if showing notification
 fails

Right now notify-send will quietly return a successful exit status
even if showing the notification fails.

This commit changes the behavior to instead fail on failure.

https://gitlab.gnome.org/GNOME/libnotify/-/merge_requests/13
---
 tools/notify-send.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/tools/notify-send.c b/tools/notify-send.c
index 67e0b03..52fa46a 100644
--- a/tools/notify-send.c
+++ b/tools/notify-send.c
@@ -105,61 +105,61 @@ notify_notification_set_hint_variant (NotifyNotification *notification,
                                       N_("Invalid hint type \"%s\". Valid types "
                                          "are int, double, string and byte."),
                                       type);
                 return FALSE;
         }
 
         if (conv_error) {
                 *error = g_error_new (G_OPTION_ERROR,
                                       G_OPTION_ERROR_BAD_VALUE,
                                       N_("Value \"%s\" of hint \"%s\" could not be "
                                          "parsed as type \"%s\"."), value, key,
                                       type);
                 return FALSE;
         }
 
         return TRUE;
 }
 
 int
 main (int argc, char *argv[])
 {
         static const char  *summary = NULL;
         char               *body;
         static const char  *type = NULL;
         static char        *app_name = NULL;
         static char        *icon_str = NULL;
         static char        *icons = NULL;
         static char       **n_text = NULL;
         static char       **hints = NULL;
         static gboolean     do_version = FALSE;
-        static gboolean     hint_error = FALSE;
+        static gboolean     hint_error = FALSE, show_error = FALSE;
         static glong        expire_timeout = NOTIFY_EXPIRES_DEFAULT;
         GOptionContext     *opt_ctx;
         NotifyNotification *notify;
         GError             *error = NULL;
         gboolean            retval;
 
         static const GOptionEntry entries[] = {
                 {"urgency", 'u', 0, G_OPTION_ARG_CALLBACK,
                  g_option_arg_urgency_cb,
                  N_("Specifies the urgency level (low, normal, critical)."),
                  N_("LEVEL")},
                 {"expire-time", 't', 0, G_OPTION_ARG_INT, &expire_timeout,
                  N_
                  ("Specifies the timeout in milliseconds at which to expire the "
                   "notification."), N_("TIME")},
                 {"app-name", 'a', 0, G_OPTION_ARG_STRING, &app_name,
                  N_("Specifies the app name for the icon"), N_("APP_NAME")},
                 {"icon", 'i', 0, G_OPTION_ARG_FILENAME, &icons,
                  N_("Specifies an icon filename or stock icon to display."),
                  N_("ICON[,ICON...]")},
                 {"category", 'c', 0, G_OPTION_ARG_FILENAME, &type,
                  N_("Specifies the notification category."),
                  N_("TYPE[,TYPE...]")},
                 {"hint", 'h', 0, G_OPTION_ARG_FILENAME_ARRAY, &hints,
                  N_
                  ("Specifies basic extra data to pass. Valid types are int, double, string and byte."),
                  N_("TYPE:NAME:VALUE")},
                 {"version", 'v', 0, G_OPTION_ARG_NONE, &do_version,
                  N_("Version of the package."),
                  NULL},
@@ -247,39 +247,49 @@ main (int argc, char *argv[])
 
                 while ((hint = hints[i++])) {
                         tokens = g_strsplit (hint, ":", 3);
                         l = g_strv_length (tokens);
 
                         if (l != 3) {
                                 fprintf (stderr, "%s\n",
                                          N_("Invalid hint syntax specified. "
                                             "Use TYPE:NAME:VALUE."));
                                 hint_error = TRUE;
                         } else {
                                 retval = notify_notification_set_hint_variant (notify,
                                                                                tokens[0],
                                                                                tokens[1],
                                                                                tokens[2],
                                                                                &error);
 
                                 if (!retval) {
                                         fprintf (stderr, "%s\n", error->message);
                                         g_error_free (error);
                                         hint_error = TRUE;
                                 }
                         }
 
                         g_strfreev (tokens);
                         if (hint_error)
                                 break;
                 }
         }
 
-        if (!hint_error)
-                notify_notification_show (notify, NULL);
+        if (!hint_error) {
+                retval = notify_notification_show (notify, &error);
+
+                if (!retval) {
+                        fprintf (stderr, "%s\n", error->message);
+                        g_error_free (error);
+                        show_error = TRUE;
+                }
+        }
 
         g_object_unref (G_OBJECT (notify));
 
         notify_uninit ();
 
-        exit (hint_error);
+        if (hint_error || show_error)
+                exit (1);
+
+        return 0;
 }
-- 
2.33.1