From 4f5aafb71f3b8661311d0db4633142cf13294e77 Mon Sep 17 00:00:00 2001 From: Lukasz Skalski Date: Thu, 30 Apr 2015 18:35:29 +0000 Subject: [PATCH] [kdbus] Enable adding bloom filters items. Signals subscription refactoring. --- gio/gdbusconnection.c | 25 ++++----- gio/gkdbus.c | 148 +++++++++++++++++++++++++------------------------- gio/gkdbus.h | 9 +-- 3 files changed, 87 insertions(+), 95 deletions(-) diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c index d6e518f..065af0d 100644 --- a/gio/gdbusconnection.c +++ b/gio/gdbusconnection.c @@ -1353,6 +1353,12 @@ g_dbus_connection_flush_sync (GDBusConnection *connection, if (!check_unclosed (connection, 0, error)) goto out; + if (connection->kdbus_worker) + { + ret = TRUE; + goto out; + } + g_assert (connection->worker != NULL); ret = _g_dbus_worker_flush_sync (connection->worker, @@ -2996,7 +3002,7 @@ get_offered_capabilities_max (GDBusConnection *connection) GDBusCapabilityFlags ret; ret = G_DBUS_CAPABILITY_FLAGS_NONE; #ifdef G_OS_UNIX - if (G_IS_UNIX_CONNECTION (connection->stream)) + //if (G_IS_UNIX_CONNECTION (connection->stream)) ret |= G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING; #endif return ret; @@ -3086,6 +3092,7 @@ initable_init (GInitable *initable, /* [KDBUS] Skip authentication process for kdbus transport */ if (connection->kdbus_worker) { + connection->capabilities |= G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING; goto authenticated; } @@ -4081,7 +4088,7 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection, else if (g_strcmp0 (signal_data->member, "NameLost") == 0) _g_kdbus_subscribe_name_lost (connection->kdbus_worker, arg0, (guint64) subscriber.id); else if (g_strcmp0 (signal_data->member, "NameOwnerChanged") == 0) - g_error ("TODO: NameOwnerChanged signal subscription\n"); + _g_kdbus_subscribe_name_owner_changed (connection->kdbus_worker, arg0, (guint64) subscriber.id); } else _g_kdbus_AddMatch (connection->kdbus_worker, signal_data->rule, subscriber.id); @@ -4165,7 +4172,6 @@ unsubscribe_id_internal (GDBusConnection *connection, /* remove the match rule from the bus unless NameLost or NameAcquired (see subscribe()) */ if ((connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION) && - !is_signal_data_for_name_lost_or_acquired (signal_data) && !g_dbus_connection_is_closed (connection) && !connection->finalizing) { @@ -4178,17 +4184,8 @@ unsubscribe_id_internal (GDBusConnection *connection, if (connection->kdbus_worker) _g_kdbus_RemoveMatch (connection->kdbus_worker, subscription_id); else - remove_match_rule (connection, signal_data->rule); - } - else - { - if (connection->kdbus_worker) - { - if (g_strcmp0 (signal_data->member, "NameAcquired") == 0) - _g_kdbus_unsubscribe_name_acquired (connection->kdbus_worker, (guint64) subscription_id); - else if (g_strcmp0 (signal_data->member, "NameLost") == 0) - _g_kdbus_unsubscribe_name_lost (connection->kdbus_worker, (guint64) subscription_id); - } + if (!is_signal_data_for_name_lost_or_acquired (signal_data)) + remove_match_rule (connection, signal_data->rule); } signal_data_free (signal_data); diff --git a/gio/gkdbus.c b/gio/gkdbus.c index 8b2f66e..7127130 100644 --- a/gio/gkdbus.c +++ b/gio/gkdbus.c @@ -554,7 +554,8 @@ g_kdbus_worker_init (GKDBusWorker *kdbus) kdbus->kdbus_buffer = NULL; - kdbus->flags = 0; /* KDBUS_HELLO_ACCEPT_FD */ + //kdbus->flags = 0; /* KDBUS_HELLO_ACCEPT_FD */ + kdbus->flags = KDBUS_HELLO_ACCEPT_FD; kdbus->attach_flags_send = _KDBUS_ATTACH_ALL; kdbus->attach_flags_recv = _KDBUS_ATTACH_ALL; } @@ -687,7 +688,8 @@ _g_kdbus_Hello (GKDBusWorker *worker, GError **error) { struct kdbus_cmd_hello *cmd; - struct kdbus_item *item; + struct kdbus_bloom_parameter *bloom; + struct kdbus_item *item, *items; gchar *conn_name; size_t size, conn_name_size; @@ -745,8 +747,23 @@ _g_kdbus_Hello (GKDBusWorker *worker, asprintf(&worker->unique_name, ":1.%llu", (unsigned long long) cmd->id); /* read bloom filters parameters */ - //worker->bloom_size = (gsize) cmd->bloom.size; - //worker->bloom_n_hash = (guint) cmd->bloom.n_hash; + bloom = NULL; + items = (void*)(worker->kdbus_buffer + cmd->offset); + KDBUS_FOREACH(item, items, cmd->items_size) + { + switch (item->type) + { + case KDBUS_ITEM_BLOOM_PARAMETER: + bloom = &item->bloom_parameter; + break; + } + } + + if (bloom != NULL) + { + worker->bloom_size = (gsize) bloom->size; + worker->bloom_n_hash = (guint) bloom->n_hash; + } return g_variant_new ("(s)", worker->unique_name); } @@ -1293,6 +1310,7 @@ g_kdbus_bloom_add_data (GKDBusWorker *worker, guint64 bit_num; guint bytes_num = 0; guint cnt_1, cnt_2; + guint hash_index = 0; guint c = 0; guint64 p = 0; @@ -1304,11 +1322,11 @@ g_kdbus_bloom_add_data (GKDBusWorker *worker, for (cnt_1 = 0; cnt_1 < (worker->bloom_n_hash); cnt_1++) { - for (cnt_2 = 0; cnt_2 < bytes_num; cnt_2++) + for (cnt_2 = 0, hash_index = 0; cnt_2 < bytes_num; cnt_2++) { if (c <= 0) { - _g_siphash24(hash, data, n, hash_keys[cnt_1++]); + _g_siphash24(hash, data, n, hash_keys[hash_index++]); c += 8; } @@ -1530,6 +1548,7 @@ _g_kdbus_RemoveMatch (GKDBusWorker *worker, }; gint ret; + g_print ("Unsubscribe match entry with cookie - %d\n", (int)cookie); ret = ioctl(worker->fd, KDBUS_CMD_MATCH_REMOVE, &cmd); if (ret < 0) g_warning ("Error while removing a match: %d\n", errno); @@ -1537,15 +1556,15 @@ _g_kdbus_RemoveMatch (GKDBusWorker *worker, /** - * _g_kdbus_subscribe_name_acquired: + * _g_kdbus_subscribe_name_owner_changed_internal: * */ static void -_g_kdbus_subscribe_name_owner_changed (GKDBusWorker *worker, - const gchar *name, - const gchar *old_name, - const gchar *new_name, - guint cookie) +_g_kdbus_subscribe_name_owner_changed_internal (GKDBusWorker *worker, + const gchar *name, + const gchar *old_name, + const gchar *new_name, + guint64 cookie) { struct kdbus_item *item; struct kdbus_cmd_match *cmd; @@ -1660,7 +1679,7 @@ _g_kdbus_subscribe_name_acquired (GKDBusWorker *worker, if (ret < 0) g_warning ("ERROR - %d\n", (int) errno); - _g_kdbus_subscribe_name_owner_changed (worker, name, NULL, worker->unique_name, cookie); + _g_kdbus_subscribe_name_owner_changed_internal (worker, name, NULL, worker->unique_name, cookie); } @@ -1709,55 +1728,20 @@ _g_kdbus_subscribe_name_lost (GKDBusWorker *worker, if (ret < 0) g_warning ("ERROR - %d\n", (int) errno); - _g_kdbus_subscribe_name_owner_changed (worker, name, worker->unique_name, NULL, cookie); + _g_kdbus_subscribe_name_owner_changed_internal (worker, name, worker->unique_name, NULL, cookie); } /** - * _g_kdbus_unsubscribe_name_acquired: * - */ -void -_g_kdbus_unsubscribe_name_acquired (GKDBusWorker *worker, - guint64 cookie) -{ - g_print ("Unsubscribe 'NameAcquired': cookie - %d\n", (int)cookie); - _g_kdbus_RemoveMatch (worker, cookie); -} - - -/** - * _g_kdbus_unsubscribe_name_lost: * */ void -_g_kdbus_unsubscribe_name_lost (GKDBusWorker *worker, - guint64 cookie) -{ - g_print ("Unsubscribe 'NameLost': cookie - %d\n", (int)cookie); - _g_kdbus_RemoveMatch (worker, cookie); -} - - -/** - * g_kdbus_append_payload_bloom: - * - */ -static struct kdbus_bloom_filter * -g_kdbus_append_bloom (struct kdbus_item **item, - gsize size) +_g_kdbus_subscribe_name_owner_changed (GKDBusWorker *worker, + const gchar *name, + guint64 cookie) { - struct kdbus_item *bloom_item; - - bloom_item = KDBUS_ALIGN8_PTR(*item); - bloom_item->size = G_STRUCT_OFFSET (struct kdbus_item, bloom_filter) + - G_STRUCT_OFFSET (struct kdbus_bloom_filter, data) + - size; - - bloom_item->type = KDBUS_ITEM_BLOOM_FILTER; - - *item = KDBUS_ITEM_NEXT(bloom_item); - return &bloom_item->bloom_filter; + g_print ("NameOwnerChanged subscription\n"); } @@ -1973,20 +1957,6 @@ g_kdbus_decode_kernel_msg (GKDBusWorker *worker, g_warning ("Unknown field in kernel message - %lld", item->type); } } - -#if 0 - /* Override information from the user header with data from the kernel */ - g_string_printf (worker->msg_sender, "org.freedesktop.DBus"); - - /* for destination */ - if (worker->kmsg->dst_id == KDBUS_DST_ID_BROADCAST) - /* for broadcast messages we don't have to set destination */ - ; - else if (worker->kmsg->dst_id == KDBUS_DST_ID_NAME) - g_string_printf (worker->msg_destination, ":1.%" G_GUINT64_FORMAT, (guint64) worker->unique_id); - else - g_string_printf (worker->msg_destination, ":1.%" G_GUINT64_FORMAT, (guint64) worker->kmsg->dst_id); -#endif } @@ -2174,11 +2144,6 @@ g_kdbus_decode_dbus_msg (GKDBusWorker *worker, parts[1] = g_variant_get_child_value (body, 1); g_variant_unref (body); - body = g_variant_get_variant (parts[1]); - g_variant_unref (parts[1]); - g_dbus_message_set_body (message, body); - g_variant_unref (body); - g_variant_get (parts[0], "(yyyyuta{tv})", &endianness, &type, &flags, &version, NULL, &serial, &fields_iter); g_variant_unref (parts[0]); @@ -2189,6 +2154,14 @@ g_kdbus_decode_dbus_msg (GKDBusWorker *worker, g_dbus_message_set_serial (message, serial); g_dbus_message_set_message_type (message, type); + //if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE) != NULL) + // { + body = g_variant_get_variant (parts[1]); + g_dbus_message_set_body (message, body); + g_variant_unref (body); + // } + g_variant_unref (parts[1]); + //g_print ("Received:\n%s\n", g_dbus_message_print (message, 2)); (* worker->message_received_callback) (message, worker->user_data); @@ -2311,6 +2284,26 @@ g_kdbus_msg_append_payload_memfd (struct kdbus_msg *msg, return g_kdbus_msg_append_item (msg, KDBUS_ITEM_PAYLOAD_MEMFD, &mfd, sizeof mfd); } +static struct kdbus_bloom_filter * +g_kdbus_msg_append_bloom (struct kdbus_msg *msg, + gsize size) +{ + struct kdbus_item *bloom_item; + + /* align */ + msg->size += (-msg->size) & 7; + bloom_item = (struct kdbus_item *) ((guchar *) msg + msg->size); + + /* set size and type */ + bloom_item->size = G_STRUCT_OFFSET (struct kdbus_item, bloom_filter) + + G_STRUCT_OFFSET (struct kdbus_bloom_filter, data) + + size; + bloom_item->type = KDBUS_ITEM_BLOOM_FILTER; + + msg->size += bloom_item->size; + return &bloom_item->bloom_filter; +} + #if 0 #include "dbusheader.h" @@ -2616,15 +2609,19 @@ _g_kdbus_send (GKDBusWorker *kdbus, else msg->cookie_reply = g_dbus_message_get_reply_serial(message); + if (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_SIGNAL) + msg->flags |= KDBUS_MSG_SIGNAL; + /* - if (dst_id == KDBUS_DST_ID_BROADCAST) + * + */ + if (msg->dst_id == KDBUS_DST_ID_BROADCAST) { struct kdbus_bloom_filter *bloom_filter; - bloom_filter = g_kdbus_append_bloom (&item, kdbus->bloom_size); + bloom_filter = g_kdbus_msg_append_bloom (msg, kdbus->bloom_size); g_kdbus_setup_bloom (kdbus, message, bloom_filter); } - */ send.size = sizeof (send); send.flags = 0; @@ -2652,6 +2649,7 @@ _g_kdbus_send (GKDBusWorker *kdbus, } else { + g_error ("WTF? %d\n", errno); g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "%s", strerror(errno)); } diff --git a/gio/gkdbus.h b/gio/gkdbus.h index 5c9db7b..9230199 100644 --- a/gio/gkdbus.h +++ b/gio/gkdbus.h @@ -130,12 +130,9 @@ void _g_kdbus_subscribe_name_lost (GKD const gchar *name, guint64 cookie); -void _g_kdbus_unsubscribe_name_acquired (GKDBusWorker *worker, - guint64 cookie); - -void _g_kdbus_unsubscribe_name_lost (GKDBusWorker *worker, - guint64 cookie); - +void _g_kdbus_subscribe_name_owner_changed (GKDBusWorker *worker, + const gchar *name, + guint64 cookie); G_END_DECLS #endif /* __G_KDBUS_H__ */ -- 2.7.4