Add sessiond unavailability detection 05/274705/2
authorMateusz Majewski <m.majewski2@samsung.com>
Fri, 6 May 2022 10:41:45 +0000 (12:41 +0200)
committerMateusz Majewski <m.majewski2@samsung.com>
Fri, 6 May 2022 10:53:51 +0000 (12:53 +0200)
Change-Id: If7b2cfb4852dfa2550659e2eeadee83073261e0f

libsessiond/src/lib.c

index 52d802654df08c8a933c5cc36bcfe7441f99bc59..9e0c42ce54cf4cc8200bc57b00e83dbead20dff4 100644 (file)
@@ -146,6 +146,17 @@ typedef struct {
        int signal_subscribed;
 } signal_client_data_t;
 
+int map_dbus_call_error_to_return_value(const GError *error) {
+
+       g_assert(error);
+
+       if (error->domain == G_DBUS_ERROR)
+               if (error->code == G_DBUS_ERROR_NAME_HAS_NO_OWNER || error->code == G_DBUS_ERROR_SERVICE_UNKNOWN)
+                       return SUBSESSION_ERROR_NOT_SUPPORTED;
+
+       return SUBSESSION_ERROR_IO_ERROR;
+}
+
 signal_client_data_t *make_new_signal_callback_client_data(void *client_callback, void *client_callback_data, GVariant *params) {
 
        signal_client_data_t *signal_data = (signal_client_data_t *)malloc(sizeof(signal_client_data_t));
@@ -465,9 +476,9 @@ int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_nam
        );
 
        if (!retgv || call_sync_error) {
+               int ret = map_dbus_call_error_to_return_value(call_sync_error);
                g_error_free(call_sync_error);
-
-               return -EFAULT;
+               return ret;
        }
        g_variant_unref(retgv);
 
@@ -501,8 +512,9 @@ int method_call_no_signal(gchar *method, GVariant *params) {
        );
 
        if (!retgv || call_sync_error) {
+               int ret = map_dbus_call_error_to_return_value(call_sync_error);
                g_error_free(call_sync_error);
-               return -EFAULT;
+               return ret;
        }
        g_variant_unref(retgv);
        return 0;
@@ -535,8 +547,9 @@ int method_call_no_signal_return(gchar *method, GVariant *params, const GVariant
        );
 
        if (!retgv || call_sync_error) {
+               int ret = map_dbus_call_error_to_return_value(call_sync_error);
                g_error_free(call_sync_error);
-               return -EFAULT;
+               return ret;
        }
 
        *out = retgv;