1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2013 Samsung Electronics
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Author: Michal Eljasiewicz <m.eljasiewic@samsung.com>
21 * Author: Lukasz Skalski <l.skalski@samsung.com>
26 #include "glib-unix.h"
29 #include "gkdbusconnection.h"
35 #include <sys/ioctl.h>
38 #ifdef HAVE_SYS_FILIO_H
39 # include <sys/filio.h>
46 #define KDBUS_POOL_SIZE (16 * 1024LU * 1024LU)
47 #define KDBUS_ALIGN8(l) (((l) + 7) & ~7)
48 #define KDBUS_ALIGN8_PTR(p) ((void*) (uintptr_t)(p))
50 #define KDBUS_ITEM_HEADER_SIZE G_STRUCT_OFFSET(struct kdbus_item, data)
51 #define KDBUS_ITEM_SIZE(s) KDBUS_ALIGN8((s) + KDBUS_ITEM_HEADER_SIZE)
53 #define KDBUS_ITEM_NEXT(item) \
54 (typeof(item))(((guint8 *)item) + KDBUS_ALIGN8((item)->size))
55 #define KDBUS_ITEM_FOREACH(item, head, first) \
56 for (item = (head)->first; \
57 (guint8 *)(item) < (guint8 *)(head) + (head)->size; \
58 item = KDBUS_ITEM_NEXT(item))
60 #define g_alloca0(x) memset(g_alloca(x), '\0', (x))
62 static void g_kdbus_initable_iface_init (GInitableIface *iface);
63 static gboolean g_kdbus_initable_init (GInitable *initable,
64 GCancellable *cancellable,
67 #define g_kdbus_get_type _g_kdbus_get_type
68 G_DEFINE_TYPE_WITH_CODE (GKdbus, g_kdbus, G_TYPE_OBJECT,
69 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
70 g_kdbus_initable_iface_init));
72 /* GBusCredentialsFlags */
77 G_BUS_CREDS_UNIQUE_NAME = 3,
78 G_BUS_CREDS_SELINUX_CONTEXT = 4
79 } GBusCredentialsFlags;
81 /* GKdbusPrivate struct */
87 struct kdbus_msg *kmsg;
93 guint64 attach_flags_send;
94 guint64 attach_flags_recv;
104 /* GKdbusSource struct */
109 GIOCondition condition;
110 GCancellable *cancellable;
111 GPollFD cancel_pollfd;
116 typedef gboolean (*GKdbusSourceFunc) (GKdbus *kdbus,
117 GIOCondition condition,
125 g_kdbus_finalize (GObject *object)
127 GKdbus *kdbus = G_KDBUS (object);
129 if (kdbus->priv->kdbus_buffer != NULL)
130 munmap (kdbus->priv->kdbus_buffer, KDBUS_POOL_SIZE);
132 kdbus->priv->kdbus_buffer = NULL;
134 if (kdbus->priv->fd != -1 && !kdbus->priv->closed)
135 _g_kdbus_close (kdbus, NULL);
137 if (G_OBJECT_CLASS (g_kdbus_parent_class)->finalize)
138 (*G_OBJECT_CLASS (g_kdbus_parent_class)->finalize) (object);
143 * g_kdbus_class_init:
147 g_kdbus_class_init (GKdbusClass *klass)
149 GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass);
151 g_type_class_add_private (klass, sizeof (GKdbusPrivate));
152 gobject_class->finalize = g_kdbus_finalize;
157 * g_kdbus_initable_iface_init:
161 g_kdbus_initable_iface_init (GInitableIface *iface)
163 iface->init = g_kdbus_initable_init;
172 g_kdbus_init (GKdbus *kdbus)
174 kdbus->priv = G_TYPE_INSTANCE_GET_PRIVATE (kdbus, G_TYPE_KDBUS, GKdbusPrivate);
176 kdbus->priv->fd = -1;
178 kdbus->priv->unique_id = -1;
179 kdbus->priv->unique_name = NULL;
181 kdbus->priv->kdbus_buffer = NULL;
183 kdbus->priv->flags = 0; /* KDBUS_HELLO_ACCEPT_FD */
184 kdbus->priv->attach_flags_send = _KDBUS_ATTACH_ALL;
185 kdbus->priv->attach_flags_recv = _KDBUS_ATTACH_ALL;
190 * g_kdbus_initable_init:
194 g_kdbus_initable_init (GInitable *initable,
195 GCancellable *cancellable,
200 g_return_val_if_fail (G_IS_KDBUS (initable), FALSE);
202 kdbus = G_KDBUS (initable);
204 if (cancellable != NULL)
206 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
207 _("Cancellable initialization not supported"));
211 kdbus->priv->inited = TRUE;
218 * kdbus_source_prepare:
222 kdbus_source_prepare (GSource *source,
225 GKdbusSource *kdbus_source = (GKdbusSource *)source;
227 if (g_cancellable_is_cancelled (kdbus_source->cancellable))
230 if (kdbus_source->timeout_time)
234 now = g_source_get_time (source);
236 *timeout = (kdbus_source->timeout_time - now + 999) / 1000;
239 kdbus_source->kdbus->priv->timed_out = TRUE;
247 if ((kdbus_source->condition & kdbus_source->pollfd.revents) != 0)
255 * kdbus_source_check:
259 kdbus_source_check (GSource *source)
263 return kdbus_source_prepare (source, &timeout);
268 * kdbus_source_dispatch
272 kdbus_source_dispatch (GSource *source,
273 GSourceFunc callback,
276 GKdbusSourceFunc func = (GKdbusSourceFunc)callback;
277 GKdbusSource *kdbus_source = (GKdbusSource *)source;
278 GKdbus *kdbus = kdbus_source->kdbus;
281 if (kdbus_source->kdbus->priv->timed_out)
282 kdbus_source->pollfd.revents |= kdbus_source->condition & (G_IO_IN | G_IO_OUT);
284 ret = (*func) (kdbus,
285 kdbus_source->pollfd.revents & kdbus_source->condition,
288 if (kdbus->priv->timeout)
289 kdbus_source->timeout_time = g_get_monotonic_time ()
290 + kdbus->priv->timeout * 1000000;
293 kdbus_source->timeout_time = 0;
300 * kdbus_source_finalize
304 kdbus_source_finalize (GSource *source)
306 GKdbusSource *kdbus_source = (GKdbusSource *)source;
309 kdbus = kdbus_source->kdbus;
311 g_object_unref (kdbus);
313 if (kdbus_source->cancellable)
315 g_cancellable_release_fd (kdbus_source->cancellable);
316 g_object_unref (kdbus_source->cancellable);
322 * kdbus_source_closure_callback:
326 kdbus_source_closure_callback (GKdbus *kdbus,
327 GIOCondition condition,
330 GClosure *closure = data;
331 GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT };
332 GValue result_value = G_VALUE_INIT;
335 g_value_init (&result_value, G_TYPE_BOOLEAN);
337 g_value_init (¶ms[0], G_TYPE_KDBUS);
338 g_value_set_object (¶ms[0], kdbus);
339 g_value_init (¶ms[1], G_TYPE_IO_CONDITION);
340 g_value_set_flags (¶ms[1], condition);
342 g_closure_invoke (closure, &result_value, 2, params, NULL);
344 result = g_value_get_boolean (&result_value);
345 g_value_unset (&result_value);
346 g_value_unset (¶ms[0]);
347 g_value_unset (¶ms[1]);
353 static GSourceFuncs kdbus_source_funcs =
355 kdbus_source_prepare,
357 kdbus_source_dispatch,
358 kdbus_source_finalize,
359 (GSourceFunc)kdbus_source_closure_callback,
368 kdbus_source_new (GKdbus *kdbus,
369 GIOCondition condition,
370 GCancellable *cancellable)
373 GKdbusSource *kdbus_source;
375 source = g_source_new (&kdbus_source_funcs, sizeof (GKdbusSource));
376 g_source_set_name (source, "GKdbus");
377 kdbus_source = (GKdbusSource *)source;
379 kdbus_source->kdbus = g_object_ref (kdbus);
380 kdbus_source->condition = condition;
382 if (g_cancellable_make_pollfd (cancellable,
383 &kdbus_source->cancel_pollfd))
385 kdbus_source->cancellable = g_object_ref (cancellable);
386 g_source_add_poll (source, &kdbus_source->cancel_pollfd);
389 kdbus_source->pollfd.fd = kdbus->priv->fd;
390 kdbus_source->pollfd.events = condition;
391 kdbus_source->pollfd.revents = 0;
392 g_source_add_poll (source, &kdbus_source->pollfd);
394 if (kdbus->priv->timeout)
395 kdbus_source->timeout_time = g_get_monotonic_time ()
396 + kdbus->priv->timeout * 1000000;
398 kdbus_source->timeout_time = 0;
405 * _g_kdbus_create_source:
409 _g_kdbus_create_source (GKdbus *kdbus,
410 GIOCondition condition,
411 GCancellable *cancellable)
413 g_return_val_if_fail (G_IS_KDBUS (kdbus) && (cancellable == NULL || G_IS_CANCELLABLE (cancellable)), NULL);
415 return kdbus_source_new (kdbus, condition, cancellable);
424 _g_kdbus_open (GKdbus *kdbus,
425 const gchar *address,
428 g_return_val_if_fail (G_IS_KDBUS (kdbus), FALSE);
430 kdbus->priv->fd = open(address, O_RDWR|O_NOCTTY|O_CLOEXEC);
431 if (kdbus->priv->fd<0)
433 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Can't open kdbus endpoint"));
437 kdbus->priv->closed = FALSE;
448 g_kdbus_free_data (GKdbus *kdbus,
451 struct kdbus_cmd_free cmd;
457 ret = ioctl (kdbus->priv->fd, KDBUS_CMD_FREE, &cmd);
466 * g_kdbus_translate_nameowner_flags:
470 g_kdbus_translate_nameowner_flags (GBusNameOwnerFlags flags,
471 guint64 *kdbus_flags)
477 if (flags & G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT)
478 new_flags |= KDBUS_NAME_ALLOW_REPLACEMENT;
480 if (flags & G_BUS_NAME_OWNER_FLAGS_REPLACE)
481 new_flags |= KDBUS_NAME_REPLACE_EXISTING;
483 if (!(flags & G_BUS_NAME_OWNER_FLAGS_DO_NOT_QUEUE))
484 new_flags |= KDBUS_NAME_QUEUE;
486 *kdbus_flags = new_flags;
495 _g_kdbus_close (GKdbus *kdbus,
500 g_return_val_if_fail (G_IS_KDBUS (kdbus), FALSE);
502 if (kdbus->priv->closed)
507 res = close (kdbus->priv->fd);
514 g_set_error (error, G_IO_ERROR,
515 g_io_error_from_errno (errno),
516 _("Error closing kdbus fd: %s"),
523 kdbus->priv->closed = TRUE;
524 kdbus->priv->fd = -1;
531 * _g_kdbus_is_closed:
535 _g_kdbus_is_closed (GKdbus *kdbus)
537 g_return_val_if_fail (G_IS_KDBUS (kdbus), FALSE);
539 return kdbus->priv->closed;
548 _g_kdbus_Hello (GIOStream *stream,
552 struct kdbus_cmd_hello *hello;
553 struct kdbus_item *item;
556 size_t size, conn_name_size;
558 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (stream));
560 conn_name = "gdbus-kdbus";
561 conn_name_size = strlen (conn_name);
563 size = KDBUS_ALIGN8 (G_STRUCT_OFFSET (struct kdbus_cmd_hello, items)) +
564 KDBUS_ALIGN8 (G_STRUCT_OFFSET (struct kdbus_item, str) + conn_name_size + 1);
566 hello = g_alloca0 (size);
567 hello->flags = kdbus->priv->flags;
568 hello->attach_flags_send = kdbus->priv->attach_flags_send;
569 hello->attach_flags_recv = kdbus->priv->attach_flags_recv;
571 hello->pool_size = KDBUS_POOL_SIZE;
574 item->size = G_STRUCT_OFFSET (struct kdbus_item, str) + conn_name_size + 1;
575 item->type = KDBUS_ITEM_CONN_DESCRIPTION;
576 memcpy (item->str, conn_name, conn_name_size+1);
577 item = KDBUS_ITEM_NEXT (item);
579 if (ioctl(kdbus->priv->fd, KDBUS_CMD_HELLO, hello))
581 g_set_error (error, G_IO_ERROR,
582 g_io_error_from_errno (errno),
583 _("Failed to send HELLO: %s"),
588 kdbus->priv->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, kdbus->priv->fd, 0);
589 if (kdbus->priv->kdbus_buffer == MAP_FAILED)
591 g_set_error (error, G_IO_ERROR,
592 g_io_error_from_errno (errno),
598 if (hello->bus_flags > 0xFFFFFFFFULL)
600 g_set_error_literal (error,
603 _("Incompatible HELLO flags"));
607 memcpy (kdbus->priv->bus_id, hello->id128, 16);
609 kdbus->priv->unique_id = hello->id;
610 asprintf(&kdbus->priv->unique_name, ":1.%llu", (unsigned long long) hello->id);
612 return g_variant_new ("(s)", kdbus->priv->unique_name);
617 * _g_kdbus_RequestName:
621 _g_kdbus_RequestName (GDBusConnection *connection,
623 GBusNameOwnerFlags flags,
628 struct kdbus_cmd_name *kdbus_name;
633 status = G_BUS_REQUEST_NAME_FLAGS_PRIMARY_OWNER;
635 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
638 g_set_error_literal (error,
640 G_DBUS_ERROR_IO_ERROR,
641 _("The connection is closed"));
645 if (!g_dbus_is_name (name))
649 G_DBUS_ERROR_INVALID_ARGS,
650 "Given bus name \"%s\" is not valid", name);
658 G_DBUS_ERROR_INVALID_ARGS,
659 "Cannot acquire a service starting with ':' such as \"%s\"", name);
663 g_kdbus_translate_nameowner_flags (flags, &kdbus_flags);
665 len = strlen(name) + 1;
666 size = G_STRUCT_OFFSET (struct kdbus_cmd_name, items) + KDBUS_ITEM_SIZE(len);
667 kdbus_name = g_alloca0 (size);
668 kdbus_name->size = size;
669 kdbus_name->items[0].size = KDBUS_ITEM_HEADER_SIZE + len;
670 kdbus_name->items[0].type = KDBUS_ITEM_NAME;
671 kdbus_name->flags = kdbus_flags;
672 memcpy (kdbus_name->items[0].str, name, len);
674 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_NAME_ACQUIRE, kdbus_name);
678 status = G_BUS_REQUEST_NAME_FLAGS_EXISTS;
679 else if (errno == EALREADY)
680 status = G_BUS_REQUEST_NAME_FLAGS_ALREADY_OWNER;
683 g_set_error (error, G_IO_ERROR,
684 g_io_error_from_errno (errno),
685 _("Error while acquiring name: %s"),
691 if (kdbus_name->flags & KDBUS_NAME_IN_QUEUE)
692 status = G_BUS_REQUEST_NAME_FLAGS_IN_QUEUE;
694 result = g_variant_new ("(u)", status);
701 * _g_kdbus_ReleaseName:
705 _g_kdbus_ReleaseName (GDBusConnection *connection,
711 struct kdbus_cmd_name *kdbus_name;
715 status = G_BUS_RELEASE_NAME_FLAGS_RELEASED;
717 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
720 g_set_error_literal (error,
722 G_DBUS_ERROR_IO_ERROR,
723 _("The connection is closed"));
727 if (!g_dbus_is_name (name))
731 G_DBUS_ERROR_INVALID_ARGS,
732 "Given bus name \"%s\" is not valid", name);
740 G_DBUS_ERROR_INVALID_ARGS,
741 "Cannot release a service starting with ':' such as \"%s\"", name);
745 len = strlen(name) + 1;
746 size = G_STRUCT_OFFSET (struct kdbus_cmd_name, items) + KDBUS_ITEM_SIZE(len);
747 kdbus_name = g_alloca0 (size);
748 kdbus_name->size = size;
749 kdbus_name->items[0].size = KDBUS_ITEM_HEADER_SIZE + len;
750 kdbus_name->items[0].type = KDBUS_ITEM_NAME;
751 memcpy (kdbus_name->items[0].str, name, len);
753 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_NAME_RELEASE, kdbus_name);
757 status = G_BUS_RELEASE_NAME_FLAGS_NON_EXISTENT;
758 else if (errno == EADDRINUSE)
759 status = G_BUS_RELEASE_NAME_FLAGS_NOT_OWNER;
762 g_set_error (error, G_IO_ERROR,
763 g_io_error_from_errno (errno),
764 _("Error while releasing name: %s"),
770 result = g_variant_new ("(u)", status);
781 _g_kdbus_GetBusId (GDBusConnection *connection,
789 result_str = g_string_new (NULL);
790 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
793 g_set_error_literal (error,
795 G_DBUS_ERROR_IO_ERROR,
796 _("The connection is closed"));
797 g_string_free (result_str, TRUE);
801 for (cnt=0; cnt<16; cnt++)
802 g_string_append_printf (result_str, "%02x", kdbus->priv->bus_id[cnt]);
804 result = g_variant_new ("(s)", result_str->str);
805 g_string_free (result_str, TRUE);
812 * _g_kdbus_GetListNames:
816 _g_kdbus_GetListNames (GDBusConnection *connection,
817 guint list_name_type,
822 GVariantBuilder *builder;
824 struct kdbus_cmd_name_list cmd = {};
825 struct kdbus_name_list *name_list;
826 struct kdbus_name_info *name;
832 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
835 g_set_error_literal (error,
837 G_DBUS_ERROR_IO_ERROR,
838 _("The connection is closed"));
843 cmd.flags = KDBUS_NAME_LIST_ACTIVATORS; /* ListActivatableNames */
845 cmd.flags = KDBUS_NAME_LIST_UNIQUE | KDBUS_NAME_LIST_NAMES; /* ListNames */
847 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_NAME_LIST, &cmd);
853 _("Error listing names"));
857 name_list = (struct kdbus_name_list *) ((guint8 *) kdbus->priv->kdbus_buffer + cmd.offset);
858 builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
860 KDBUS_ITEM_FOREACH(name, name_list, names)
862 struct kdbus_item *item;
863 const gchar *item_name = "";
865 if ((cmd.flags & KDBUS_NAME_LIST_UNIQUE) && name->owner_id != prev_id)
867 GString *unique_name;
869 unique_name = g_string_new (NULL);
870 g_string_printf (unique_name, ":1.%llu", name->owner_id);
871 g_variant_builder_add (builder, "s", unique_name->str);
872 g_string_free (unique_name,TRUE);
873 prev_id = name->owner_id;
876 KDBUS_ITEM_FOREACH(item, name, items)
877 if (item->type == KDBUS_ITEM_OWNED_NAME)
878 item_name = item->name.name;
880 if (g_dbus_is_name (item_name))
881 g_variant_builder_add (builder, "s", item_name);
884 result = g_variant_new ("(as)", builder);
885 g_variant_builder_unref (builder);
887 g_kdbus_free_data (kdbus, cmd.offset);
893 * _g_kdbus_NameHasOwner_internal:
897 g_kdbus_NameHasOwner_internal (GKdbus *kdbus,
901 struct kdbus_cmd_info *cmd;
905 if (g_dbus_is_unique_name(name))
907 size = G_STRUCT_OFFSET (struct kdbus_cmd_info, items);
908 cmd = g_alloca0 (size);
909 cmd->id = g_ascii_strtoull (name+3, NULL, 10);
913 len = strlen(name) + 1;
914 size = G_STRUCT_OFFSET (struct kdbus_cmd_info, items) + KDBUS_ITEM_SIZE(len);
915 cmd = g_alloca0 (size);
916 cmd->items[0].size = KDBUS_ITEM_HEADER_SIZE + len;
917 cmd->items[0].type = KDBUS_ITEM_NAME;
918 memcpy (cmd->items[0].str, name, len);
922 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_CONN_INFO, cmd);
923 g_kdbus_free_data (kdbus, cmd->offset);
933 * _g_kdbus_GetListQueuedOwners:
937 _g_kdbus_GetListQueuedOwners (GDBusConnection *connection,
943 GVariantBuilder *builder;
944 GString *unique_name;
947 struct kdbus_cmd_name_list cmd = {};
948 struct kdbus_name_list *name_list;
949 struct kdbus_name_info *kname;
951 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
954 g_set_error_literal (error,
956 G_DBUS_ERROR_IO_ERROR,
957 _("The connection is closed"));
961 if (!g_dbus_is_name (name))
965 G_DBUS_ERROR_INVALID_ARGS,
966 "Given bus name \"%s\" is not valid", name);
970 if (!g_kdbus_NameHasOwner_internal (kdbus, name, error))
974 G_DBUS_ERROR_NAME_HAS_NO_OWNER,
975 "Could not get owner of name '%s': no such name", name);
979 cmd.flags = KDBUS_NAME_LIST_QUEUED;
980 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_NAME_LIST, &cmd);
986 _("Error listing names"));
990 name_list = (struct kdbus_name_list *) ((guint8 *) kdbus->priv->kdbus_buffer + cmd.offset);
992 unique_name = g_string_new (NULL);
993 builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
994 KDBUS_ITEM_FOREACH(kname, name_list, names)
996 struct kdbus_item *item;
997 const char *item_name = "";
999 KDBUS_ITEM_FOREACH(item, kname, items)
1000 if (item->type == KDBUS_ITEM_NAME)
1001 item_name = item->str;
1003 if (strcmp(item_name, name))
1006 g_string_printf (unique_name, ":1.%llu", kname->owner_id);
1007 g_variant_builder_add (builder, "s", item_name);
1010 result = g_variant_new ("(as)", builder);
1011 g_variant_builder_unref (builder);
1012 g_string_free (unique_name,TRUE);
1014 g_kdbus_free_data (kdbus, cmd.offset);
1020 * _g_kdbus_NameHasOwner:
1024 _g_kdbus_NameHasOwner (GDBusConnection *connection,
1031 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
1034 g_set_error_literal (error,
1036 G_DBUS_ERROR_IO_ERROR,
1037 _("The connection is closed"));
1041 if (!g_dbus_is_name (name))
1045 G_DBUS_ERROR_INVALID_ARGS,
1046 "Given bus name \"%s\" is not valid", name);
1050 if (!g_kdbus_NameHasOwner_internal (kdbus, name, error))
1051 result = g_variant_new ("(b)", FALSE);
1053 result = g_variant_new ("(b)", TRUE);
1060 * g_kdbus_GetConnInfo_internal:
1064 g_kdbus_GetConnInfo_internal (GDBusConnection *connection,
1072 struct kdbus_cmd_info *cmd;
1073 struct kdbus_info *conn_info;
1074 struct kdbus_item *item;
1079 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
1082 g_set_error_literal (error,
1084 G_DBUS_ERROR_IO_ERROR,
1085 _("The connection is closed"));
1089 if (!g_dbus_is_name (name))
1093 G_DBUS_ERROR_INVALID_ARGS,
1094 "Given bus name \"%s\" is not valid", name);
1098 if (!g_kdbus_NameHasOwner_internal (kdbus, name, error))
1102 G_DBUS_ERROR_NAME_HAS_NO_OWNER,
1103 "Could not get owner of name '%s': no such name", name);
1107 if (g_dbus_is_unique_name(name))
1109 size = G_STRUCT_OFFSET (struct kdbus_cmd_info, items);
1110 cmd = g_alloca0 (size);
1111 cmd->id = g_ascii_strtoull (name+3, NULL, 10);
1115 len = strlen(name) + 1;
1116 size = G_STRUCT_OFFSET (struct kdbus_cmd_info, items) + KDBUS_ITEM_SIZE(len);
1117 cmd = g_alloca0 (size);
1118 cmd->items[0].size = KDBUS_ITEM_HEADER_SIZE + len;
1119 cmd->items[0].type = KDBUS_ITEM_NAME;
1120 memcpy (cmd->items[0].str, name, len);
1123 cmd->flags = _KDBUS_ATTACH_ALL;
1126 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_CONN_INFO, cmd);
1131 G_DBUS_ERROR_FAILED,
1132 _("Could not get connection info"));
1136 conn_info = (struct kdbus_info *) ((guint8 *) kdbus->priv->kdbus_buffer + cmd->offset);
1139 if (conn_info->flags & KDBUS_HELLO_ACTIVATOR)
1143 if (flag == G_BUS_CREDS_UNIQUE_NAME)
1145 GString *unique_name;
1147 unique_name = g_string_new (NULL);
1148 g_string_printf (unique_name, ":1.%llu", (unsigned long long) conn_info->id);
1149 result = g_variant_new ("(s)", unique_name->str);
1150 g_string_free (unique_name,TRUE);
1154 KDBUS_ITEM_FOREACH(item, conn_info, items)
1158 case KDBUS_ITEM_CREDS:
1160 if (flag == G_BUS_CREDS_PID)
1162 guint pid = item->creds.pid;
1163 result = g_variant_new ("(u)", pid);
1167 if (flag == G_BUS_CREDS_UID)
1169 guint uid = item->creds.uid;
1170 result = g_variant_new ("(u)", uid);
1174 case KDBUS_ITEM_SECLABEL:
1175 case KDBUS_ITEM_PID_COMM:
1176 case KDBUS_ITEM_TID_COMM:
1177 case KDBUS_ITEM_EXE:
1178 case KDBUS_ITEM_CMDLINE:
1179 case KDBUS_ITEM_CGROUP:
1180 case KDBUS_ITEM_CAPS:
1181 case KDBUS_ITEM_NAME:
1182 case KDBUS_ITEM_AUDIT:
1188 g_kdbus_free_data (kdbus, cmd->offset);
1194 * _g_kdbus_GetNameOwner:
1198 _g_kdbus_GetNameOwner (GDBusConnection *connection,
1202 return g_kdbus_GetConnInfo_internal (connection,
1204 G_BUS_CREDS_UNIQUE_NAME,
1210 * _g_kdbus_GetConnectionUnixProcessID:
1214 _g_kdbus_GetConnectionUnixProcessID (GDBusConnection *connection,
1218 return g_kdbus_GetConnInfo_internal (connection,
1226 * _g_kdbus_GetConnectionUnixUser:
1230 _g_kdbus_GetConnectionUnixUser (GDBusConnection *connection,
1234 return g_kdbus_GetConnInfo_internal (connection,
1242 * _g_kdbus_match_remove:
1246 _g_kdbus_match_remove (GDBusConnection *connection,
1250 struct kdbus_cmd_match cmd_match = {};
1253 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
1255 cmd_match.size = sizeof (cmd_match);
1256 cmd_match.cookie = cookie;
1258 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_MATCH_REMOVE, &cmd_match);
1260 g_warning ("ERROR - %d\n", (int) errno);
1265 * _g_kdbus_subscribe_name_acquired:
1269 _g_kdbus_subscribe_name_owner_changed (GDBusConnection *connection,
1271 const gchar *old_name,
1272 const gchar *new_name,
1276 struct kdbus_item *item;
1277 struct kdbus_cmd_match *cmd_match;
1281 guint64 new_id = KDBUS_MATCH_ID_ANY;
1283 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
1285 len = strlen(name) + 1;
1286 size = KDBUS_ALIGN8(G_STRUCT_OFFSET (struct kdbus_cmd_match, items) +
1287 G_STRUCT_OFFSET (struct kdbus_item, name_change) +
1288 G_STRUCT_OFFSET (struct kdbus_notify_name_change, name) + len);
1290 cmd_match = g_alloca0 (size);
1291 cmd_match->size = size;
1292 cmd_match->cookie = cookie;
1293 item = cmd_match->items;
1295 if (old_name[0] == 0)
1297 old_id = KDBUS_MATCH_ID_ANY;
1301 if (g_dbus_is_unique_name(old_name))
1307 if (new_name[0] == 0)
1309 new_id = KDBUS_MATCH_ID_ANY;
1313 if (g_dbus_is_unique_name(new_name))
1319 cmd_match = g_alloca0 (size);
1320 cmd_match->size = size;
1321 cmd_match->cookie = cookie;
1322 item = cmd_match->items;
1324 /* KDBUS_ITEM_NAME_CHANGE */
1325 item->type = KDBUS_ITEM_NAME_CHANGE;
1326 item->name_change.old_id.id = old_id;
1327 item->name_change.new_id.id = new_id;
1328 memcpy(item->name_change.name, name, len);
1329 item->size = G_STRUCT_OFFSET (struct kdbus_item, name_change) +
1330 G_STRUCT_OFFSET(struct kdbus_notify_name_change, name) + len;
1331 item = KDBUS_ITEM_NEXT(item);
1333 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_MATCH_ADD, cmd_match);
1335 g_warning ("ERROR - %d\n", (int) errno);
1340 * _g_kdbus_subscribe_name_acquired:
1344 _g_kdbus_subscribe_name_acquired (GDBusConnection *connection,
1348 struct kdbus_item *item;
1349 struct kdbus_cmd_match *cmd_match;
1354 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
1356 len = strlen(name) + 1;
1357 size = KDBUS_ALIGN8(G_STRUCT_OFFSET (struct kdbus_cmd_match, items) +
1358 G_STRUCT_OFFSET (struct kdbus_item, name_change) +
1359 G_STRUCT_OFFSET (struct kdbus_notify_name_change, name) + len);
1361 cookie = 0xbeefbeefbeefbeef;
1362 cmd_match = g_alloca0 (size);
1363 cmd_match->size = size;
1364 cmd_match->cookie = cookie;
1365 item = cmd_match->items;
1367 /* KDBUS_ITEM_NAME_ADD */
1368 item->type = KDBUS_ITEM_NAME_ADD;
1369 item->name_change.old_id.id = KDBUS_MATCH_ID_ANY;
1370 item->name_change.new_id.id = kdbus->priv->unique_id;
1371 memcpy(item->name_change.name, name, len);
1372 item->size = G_STRUCT_OFFSET (struct kdbus_item, name_change) +
1373 G_STRUCT_OFFSET(struct kdbus_notify_name_change, name) + len;
1374 item = KDBUS_ITEM_NEXT(item);
1376 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_MATCH_ADD, cmd_match);
1378 g_warning ("ERROR - %d\n", (int) errno);
1380 _g_kdbus_subscribe_name_owner_changed (connection, name, "", kdbus->priv->unique_name, cookie);
1385 * _g_kdbus_subscribe_name_lost:
1389 _g_kdbus_subscribe_name_lost (GDBusConnection *connection,
1393 struct kdbus_item *item;
1394 struct kdbus_cmd_match *cmd_match;
1399 kdbus = _g_kdbus_connection_get_kdbus (G_KDBUS_CONNECTION (g_dbus_connection_get_stream (connection)));
1401 len = strlen(name) + 1;
1402 size = KDBUS_ALIGN8(G_STRUCT_OFFSET (struct kdbus_cmd_match, items) +
1403 G_STRUCT_OFFSET (struct kdbus_item, name_change) +
1404 G_STRUCT_OFFSET (struct kdbus_notify_name_change, name) + len);
1406 cookie = 0xdeafdeafdeafdeaf;
1407 cmd_match = g_alloca0 (size);
1408 cmd_match->size = size;
1409 cmd_match->cookie = cookie;
1410 item = cmd_match->items;
1412 /* KDBUS_ITEM_NAME_REMOVE */
1413 item->type = KDBUS_ITEM_NAME_REMOVE;
1414 item->name_change.old_id.id = kdbus->priv->unique_id;
1415 item->name_change.new_id.id = KDBUS_MATCH_ID_ANY;
1416 memcpy(item->name_change.name, name, len);
1417 item->size = G_STRUCT_OFFSET (struct kdbus_item, name_change) +
1418 G_STRUCT_OFFSET(struct kdbus_notify_name_change, name) + len;
1419 item = KDBUS_ITEM_NEXT(item);
1421 ret = ioctl(kdbus->priv->fd, KDBUS_CMD_MATCH_ADD, cmd_match);
1423 g_warning ("ERROR - %d\n", (int) errno);
1425 _g_kdbus_subscribe_name_owner_changed (connection, name, kdbus->priv->unique_name, "", cookie);
1430 * _g_kdbus_unsubscribe_name_acquired:
1434 _g_kdbus_unsubscribe_name_acquired (GDBusConnection *connection)
1438 cookie = 0xbeefbeefbeefbeef;
1439 _g_kdbus_match_remove (connection, cookie);
1444 * _g_kdbus_unsubscribe_name_lost:
1448 _g_kdbus_unsubscribe_name_lost (GDBusConnection *connection)
1452 cookie = 0xdeafdeafdeafdeaf;
1453 _g_kdbus_match_remove (connection, cookie);
1458 * g_kdbus_decode_kernel_msg:
1462 g_kdbus_decode_kernel_msg (GKdbus *kdbus)
1464 struct kdbus_item *item = NULL;
1467 KDBUS_ITEM_FOREACH(item, kdbus->priv->kmsg, items)
1471 case KDBUS_ITEM_ID_ADD:
1472 case KDBUS_ITEM_ID_REMOVE:
1473 case KDBUS_ITEM_NAME_ADD:
1474 case KDBUS_ITEM_NAME_REMOVE:
1475 case KDBUS_ITEM_NAME_CHANGE:
1476 //size = g_kdbus_NameOwnerChanged_generate (kdbus, item);
1477 g_error ("'NameOwnerChanged'");
1480 case KDBUS_ITEM_REPLY_TIMEOUT:
1481 case KDBUS_ITEM_REPLY_DEAD:
1482 //size = g_kdbus_KernelMethodError_generate (kdbus, item);
1483 g_error ("'KernelMethodError'");
1487 g_warning ("Unknown field in kernel message - %lld", item->type);
1492 /* Override information from the user header with data from the kernel */
1493 g_string_printf (kdbus->priv->msg_sender, "org.freedesktop.DBus");
1495 /* for destination */
1496 if (kdbus->priv->kmsg->dst_id == KDBUS_DST_ID_BROADCAST)
1497 /* for broadcast messages we don't have to set destination */
1499 else if (kdbus->priv->kmsg->dst_id == KDBUS_DST_ID_NAME)
1500 g_string_printf (kdbus->priv->msg_destination, ":1.%" G_GUINT64_FORMAT, (guint64) kdbus->priv->unique_id);
1502 g_string_printf (kdbus->priv->msg_destination, ":1.%" G_GUINT64_FORMAT, (guint64) kdbus->priv->kmsg->dst_id);
1514 _g_kdbus_receive (GKdbus *kdbus,
1515 GCancellable *cancellable,
1518 struct kdbus_cmd_recv recv = {};
1521 if (g_cancellable_set_error_if_cancelled (cancellable, error))
1525 if (ioctl(kdbus->priv->fd, KDBUS_CMD_MSG_RECV, &recv) < 0)
1527 if (errno == EINTR || errno == EAGAIN)
1530 g_set_error (error, G_IO_ERROR,
1531 g_io_error_from_errno (errno),
1532 _("Error while receiving message: %s"),
1533 g_strerror (errno));
1537 kdbus->priv->kmsg = (struct kdbus_msg *)((guint8 *)kdbus->priv->kdbus_buffer + recv.offset);
1539 if (kdbus->priv->kmsg->payload_type == KDBUS_PAYLOAD_DBUS)
1540 g_error ("Received standard dbus message - not supported yet");
1541 else if (kdbus->priv->kmsg->payload_type == KDBUS_PAYLOAD_KERNEL)
1542 size = g_kdbus_decode_kernel_msg (kdbus);
1547 G_DBUS_ERROR_FAILED,
1548 _("Received unknown payload type"));