summaryrefslogtreecommitdiff
path: root/bus/kdbus-d.c
diff options
context:
space:
mode:
Diffstat (limited to 'bus/kdbus-d.c')
-rw-r--r--bus/kdbus-d.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/bus/kdbus-d.c b/bus/kdbus-d.c
index be9fccc4..3e247bea 100644
--- a/bus/kdbus-d.c
+++ b/bus/kdbus-d.c
@@ -26,6 +26,7 @@
#include <dbus/dbus-connection-internal.h>
#include "kdbus-d.h"
+#define KDBUS_FOR_SBB
#include <dbus/kdbus.h>
#include <dbus/dbus-bus.h>
#include "dispatch.h"
@@ -306,7 +307,7 @@ int kdbus_NameQuery(const char* name, DBusTransport* transport, struct nameInfo*
/*
* Creates kdbus bus of given type.
*/
-char* make_kdbus_bus(DBusBusType type, DBusError *error)
+char* make_kdbus_bus(DBusBusType type, const char* address, DBusError *error)
{
struct {
struct kdbus_cmd_bus_make head;
@@ -317,6 +318,7 @@ char* make_kdbus_bus(DBusBusType type, DBusError *error)
int fdc, ret;
char *bus;
+ char *addr_value;
_dbus_verbose("Opening /dev/kdbus/control\n");
fdc = open("/dev/kdbus/control", O_RDWR|O_CLOEXEC);
@@ -327,9 +329,13 @@ char* make_kdbus_bus(DBusBusType type, DBusError *error)
return NULL;
}
+ addr_value = strchr(address, ':') + 1;
+
memset(&bus_make, 0, sizeof(bus_make));
bus_make.head.bloom_size = 64;
bus_make.head.flags = KDBUS_MAKE_ACCESS_WORLD;
+ if(!strcmp(addr_value, "sbb"))
+ bus_make.head.flags |= KDBUS_MAKE_SBB_OFFSET;
if(type == DBUS_BUS_SYSTEM)
snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus-%s", getuid(), "system");
@@ -369,12 +375,16 @@ DBusServer* empty_server_init(char* address)
return dbus_server_init_mini(address);
}
-static dbus_bool_t add_matches_for_kdbus_broadcasts(DBusTransport* transport)
+static dbus_bool_t add_matches_for_kdbus_broadcasts(DBusConnection* connection)
{
struct kdbus_cmd_match* pCmd_match;
struct kdbus_item *pItem;
uint64_t size;
int fd;
+ DBusTransport *transport;
+ const char* unique_name;
+
+ transport = dbus_connection_get_transport(connection);
if(!_dbus_transport_get_socket_fd(transport, &fd))
{
@@ -382,7 +392,6 @@ static dbus_bool_t add_matches_for_kdbus_broadcasts(DBusTransport* transport)
return FALSE;
}
-
size = sizeof(struct kdbus_cmd_match);
size += KDBUS_ITEM_SIZE(1)*3 + KDBUS_ITEM_SIZE(sizeof(__u64))*2; /*3 name related items plus 2 id related items*/
@@ -393,7 +402,9 @@ static dbus_bool_t add_matches_for_kdbus_broadcasts(DBusTransport* transport)
return FALSE;
}
- pCmd_match->id = 1;
+ unique_name = dbus_bus_get_unique_name(connection);
+
+ pCmd_match->id = strtoull(&unique_name[3], NULL, 10);
pCmd_match->cookie = 1;
pCmd_match->size = size;
@@ -439,7 +450,7 @@ DBusConnection* daemon_as_client(DBusBusType type, char* address, DBusError *err
if(connection == NULL)
return NULL;
- if(!add_matches_for_kdbus_broadcasts(dbus_connection_get_transport(connection)))
+ if(!add_matches_for_kdbus_broadcasts(connection))
{
dbus_set_error (error, _dbus_error_from_errno (errno), "Could not add match for daemon, %s", _dbus_strerror_from_errno ());
goto failed;
@@ -1075,7 +1086,7 @@ void handleNameOwnerChanged(DBusMessage *msg, BusTransaction *transaction, DBusC
}
else //it is well-known name
{
- if((*old != 0) && (strcmp(old, ":1.1")))
+ if((*old != 0) && (strcmp(old, bus_connection_get_name(connection))))
{
DBusMessage *message;
@@ -1100,7 +1111,7 @@ void handleNameOwnerChanged(DBusMessage *msg, BusTransaction *transaction, DBusC
dbus_message_unref (message);
}
next:
- if((*new != 0) && (strcmp(new, ":1.1")))
+ if((*new != 0) && (strcmp(new, bus_connection_get_name(connection))))
{
DBusMessage *message;