[kdbus] Add initial support for receiving messages
[platform/upstream/glib.git] / gio / gkdbus.c
index 03c2d8e..cfb3996 100644 (file)
@@ -101,6 +101,8 @@ struct _GKdbusPrivate
   gint               fd;
 
   gchar             *kdbus_buffer;
+  struct kdbus_msg  *kmsg;
+
   gchar             *unique_name;
   guint64            unique_id;
 
@@ -677,6 +679,7 @@ _g_kdbus_RequestName (GDBusConnection     *connection,
   len = strlen(name) + 1;
   size = G_STRUCT_OFFSET (struct kdbus_cmd_name, items) + KDBUS_ITEM_SIZE(len);
   kdbus_name = g_alloca0 (size);
+  kdbus_name->size = size;
   kdbus_name->items[0].size = KDBUS_ITEM_HEADER_SIZE + len;
   kdbus_name->items[0].type = KDBUS_ITEM_NAME;
   kdbus_name->flags = kdbus_flags;
@@ -690,7 +693,13 @@ _g_kdbus_RequestName (GDBusConnection     *connection,
       else if (errno == EALREADY)
         status = G_BUS_REQUEST_NAME_REPLY_ALREADY_OWNER;
       else
-        return FALSE;
+        {
+          g_set_error (error, G_IO_ERROR,
+                       g_io_error_from_errno (errno),
+                       _("Error while acquiring name: %s"),
+                       g_strerror (errno));
+          return NULL;
+        }
     }
 
   if (kdbus_name->flags & KDBUS_NAME_IN_QUEUE)
@@ -750,6 +759,7 @@ _g_kdbus_ReleaseName (GDBusConnection     *connection,
   len = strlen(name) + 1;
   size = G_STRUCT_OFFSET (struct kdbus_cmd_name, items) + KDBUS_ITEM_SIZE(len);
   kdbus_name = g_alloca0 (size);
+  kdbus_name->size = size;
   kdbus_name->items[0].size = KDBUS_ITEM_HEADER_SIZE + len;
   kdbus_name->items[0].type = KDBUS_ITEM_NAME;
   memcpy (kdbus_name->items[0].str, name, len);
@@ -762,7 +772,13 @@ _g_kdbus_ReleaseName (GDBusConnection     *connection,
       else if (errno == EADDRINUSE)
         status = G_BUS_RELEASE_NAME_REPLY_NOT_OWNER;
       else
-        return FALSE;
+        {
+          g_set_error (error, G_IO_ERROR,
+                       g_io_error_from_errno (errno),
+                       _("Error while releasing name: %s"),
+                       g_strerror (errno));
+          return NULL;
+        }
     }
 
   result = g_variant_new ("(u)", status);
@@ -1234,3 +1250,44 @@ _g_kdbus_GetConnectionUnixUser (GDBusConnection  *connection,
                                        G_BUS_CREDS_UID,
                                        error);
 }
+
+
+/**
+ * _g_kdbus_receive:
+ *
+ */
+gssize
+_g_kdbus_receive (GKdbus        *kdbus,
+                  GCancellable  *cancellable,
+                  GError       **error)
+{
+  struct kdbus_cmd_recv recv = {};
+  gssize size = 0;
+
+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
+   return -1;
+
+  again:
+    if (ioctl(kdbus->priv->fd, KDBUS_CMD_MSG_RECV, &recv) < 0)
+     {
+        if (errno == EINTR || errno == EAGAIN)
+         goto again;
+
+       g_set_error (error, G_IO_ERROR, g_io_error_from_errno(errno),_("Error receiving message - KDBUS_CMD_MSG_RECV error"));
+       return -1;
+     }
+
+   kdbus->priv->kmsg = (struct kdbus_msg *)((guint8 *)kdbus->priv->kdbus_buffer + recv.offset);
+
+   if (kdbus->priv->kmsg->payload_type == KDBUS_PAYLOAD_DBUS)
+     //size = g_kdbus_decode_dbus_msg (kdbus);
+     g_print ("Standard message\n");
+   else if (kdbus->priv->kmsg->payload_type == KDBUS_PAYLOAD_KERNEL)
+     //size = g_kdbus_decode_kernel_msg (kdbus);
+     g_print ("Message from kernel\n");
+   else
+     //g_set_error
+     g_error ("Unknown payload type: %llu", kdbus->priv->kmsg->payload_type);
+
+   return size;
+}