From 5807bb011110e8ac1d753d79b75c7a6d983d6333 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 24 Jun 2016 12:27:09 +1200 Subject: [PATCH] Set GError values on greeter method failures --- liblightdm-gobject/greeter.c | 55 ++++++++++++++++++++++------ liblightdm-gobject/lightdm/greeter.h | 17 +++++++++ tests/src/test-gobject-greeter.c | 2 +- tests/src/test-python-greeter | 12 ++++-- 4 files changed, 70 insertions(+), 16 deletions(-) diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 5e6996d3..7db92c02 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -16,6 +16,8 @@ #include "lightdm/greeter.h" +G_DEFINE_QUARK (lightdm_greeter_error, lightdm_greeter_error) + enum { PROP_0, PROP_DEFAULT_SESSION_HINT, @@ -129,6 +131,7 @@ typedef struct GAsyncReadyCallback callback; gpointer user_data; gboolean complete; + gboolean connected; guint32 return_code; gchar *dir; } Request; @@ -141,6 +144,23 @@ static void request_iface_init (GAsyncResultIface *iface); #define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request)) G_DEFINE_TYPE_WITH_CODE (Request, request, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, request_iface_init)); +GType +lightdm_greeter_error_get_type (void) +{ + static GType enum_type = 0; + + if (G_UNLIKELY(enum_type == 0)) { + static const GEnumValue values[] = { + { LIGHTDM_GREETER_ERROR_CONNECTION_FAILED, "LIGHTDM_GREETER_ERROR_CONNECTION_FAILED", "connection-failed" }, + { LIGHTDM_GREETER_ERROR_SESSION_FAILED, "LIGHTDM_GREETER_ERROR_SESSION_FAILED", "session-failed" }, + { 0, NULL, NULL } + }; + enum_type = g_enum_register_static (g_intern_static_string ("LightDMGreeterError"), values); + } + + return enum_type; +} + GType lightdm_prompt_type_get_type (void) { @@ -434,6 +454,7 @@ handle_connected (LightDMGreeter *greeter, guint8 *message, gsize message_length request = g_list_nth_data (priv->connect_requests, 0); if (request) { + request->connected = TRUE; request_complete (request, G_OBJECT (greeter)); priv->connect_requests = g_list_remove (priv->connect_requests, request); g_object_unref (request); @@ -813,8 +834,17 @@ lightdm_greeter_connect_to_daemon (LightDMGreeter *greeter, GCancellable *cancel gboolean lightdm_greeter_connect_to_daemon_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error) { + Request *request = REQUEST (result); + g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); - return REQUEST (result)->complete; + + if (request->connected) + return TRUE; + else + { + g_set_error_literal (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_CONNECTION_FAILED, "Failed to connect to daemon"); + return FALSE; + } } /** @@ -831,7 +861,6 @@ lightdm_greeter_connect_to_daemon_sync (LightDMGreeter *greeter, GError **error) { LightDMGreeterPrivate *priv; Request *request; - gboolean result; g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); @@ -853,10 +882,7 @@ lightdm_greeter_connect_to_daemon_sync (LightDMGreeter *greeter, GError **error) g_free (message); } while (!request->complete); - result = request->complete; - g_object_unref (request); - - return result; + return lightdm_greeter_connect_to_daemon_finish (greeter, G_ASYNC_RESULT (request), error); } /** @@ -1433,8 +1459,17 @@ lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session, GC gboolean lightdm_greeter_start_session_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error) { + Request *request = REQUEST (result); + g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); - return REQUEST (result)->return_code == 0; + + if (request->return_code == 0) + return TRUE; + else + { + g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_SESSION_FAILED, "Session returned error code %d", request->return_code); + return FALSE; + } } /** @@ -1452,7 +1487,6 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio { LightDMGreeterPrivate *priv; Request *request; - guint32 return_code; g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); @@ -1477,10 +1511,7 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio g_free (message); } while (!request->complete); - return_code = request->return_code; - g_object_unref (request); - - return return_code == 0; + return lightdm_greeter_start_session_finish (greeter, G_ASYNC_RESULT (request), error); } /** diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index f915601e..aac67e96 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -23,6 +23,8 @@ G_BEGIN_DECLS #define LIGHTDM_IS_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_GREETER)) #define LIGHTDM_GREETER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeterClass)) +#define LIGHTDM_GREETER_ERROR lightdm_greeter_error_quark () + #define LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT "show-prompt" #define LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE "show-message" #define LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE "authentication-complete" @@ -87,6 +89,21 @@ static inline void glib_autoptr_cleanup_LightDMGreeter (LightDMGreeter **_ptr) } #endif +/** + * LightDMGreeterError: + * @LIGHTDM_GREETER_ERROR_CONNECTION_FAILED: Failed to connect to the daemon + * @LIGHTDM_GREETER_ERROR_SESSION_FAILED: Requested session failed to start + */ +typedef enum +{ + LIGHTDM_GREETER_ERROR_CONNECTION_FAILED, + LIGHTDM_GREETER_ERROR_SESSION_FAILED +} LightDMGreeterError; + +GQuark lightdm_greeter_error_quark (void); + +GType lightdm_greeter_error_get_type (void); + GType lightdm_greeter_get_type (void); LightDMGreeter *lightdm_greeter_new (void); diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index 0b67e80f..92c9acaa 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -125,7 +125,7 @@ start_session_finished (GObject *object, GAsyncResult *result, gpointer data) GError *error = NULL; if (!lightdm_greeter_start_session_finish (greeter, result, &error)) - status_notify ("%s SESSION-FAILED", greeter_id); + status_notify ("%s SESSION-FAILED ERROR=%s", greeter_id, error->message); g_clear_error (&error); } diff --git a/tests/src/test-python-greeter b/tests/src/test-python-greeter index 18385817..e2b1180d 100755 --- a/tests/src/test-python-greeter +++ b/tests/src/test-python-greeter @@ -76,12 +76,16 @@ def request_cb (channel, condition): r = '%s START-SESSION' % greeter_id if request == r: - if not greeter.start_session_sync (None): + try: + greeter.start_session_sync (None) + except: status_notify ('%s SESSION-FAILED' % greeter_id) r = '%s START-SESSION SESSION=' % greeter_id if request.startswith (r): - if not greeter.start_session_sync (request[len(r):]): + try: + greeter.start_session_sync (request[len(r):]) + except: status_notify ('%s SESSION-FAILED' % greeter_id) r = '%s LOG-USER-LIST-LENGTH' % greeter_id @@ -291,7 +295,9 @@ if log_user_changes: LightDM.UserList.get_instance ().connect ('user-removed', user_removed_cb) status_notify ('%s CONNECT-TO-DAEMON' % greeter_id) -if not greeter.connect_to_daemon_sync (): +try: + greeter.connect_to_daemon_sync () +except: status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id) exit (1) -- 2.39.2