summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadoslaw Pajak <r.pajak@samsung.com>2013-11-26 09:18:01 +0100
committerLubomir Rintel <lkundrak@v3.sk>2015-02-11 11:55:10 +0100
commit9703abd5a96888443ce15e0c8f61d627533127aa (patch)
treec412386ca39ef31cec4700788dc48546a0d0640b
parent59678da1339cc92255607cbfcf8a614de03805db (diff)
[daemon-dev] Added option to create bus with sbb offset
When address passed to daemon is kdbus:sbb than bus is created with KDBUS_MAKE_SBB_OFFSET flag, which adds offset to unique ids given by bus to all clients including daemon. Change-Id: Ib31854b1bdfeb9a4b117cb4b050b4e5c455e8b73 Signed-off-by: Radoslaw Pajak <r.pajak@samsung.com>
-rw-r--r--bus/bus.c6
-rw-r--r--bus/kdbus-d.c25
-rw-r--r--bus/kdbus-d.h2
-rw-r--r--dbus/kdbus.h22
4 files changed, 41 insertions, 14 deletions
diff --git a/bus/bus.c b/bus/bus.c
index c83f0786..19a6f0c5 100644
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -436,7 +436,7 @@ process_config_first_time_only (BusContext *context,
if (address)
{
#ifdef ENABLE_KDBUS_TRANSPORT
- if(!strcmp(_dbus_string_get_const_data(address), "kdbus:"))
+ if(strcmp(_dbus_string_get_const_data(address), "kdbus:") >= 0)
{
DBusBusType type;
DBusServer* server;
@@ -449,7 +449,7 @@ process_config_first_time_only (BusContext *context,
else
type = DBUS_BUS_STARTER;
- bus_address = make_kdbus_bus(type, error);
+ bus_address = make_kdbus_bus(type, _dbus_string_get_const_data(address), error);
if(bus_address == NULL)
goto failed;
@@ -1029,7 +1029,7 @@ bus_context_new (const DBusString *config_file,
goto failed;
}
dbus_connection_set_route_peer_messages (context->myKdbusConnection, FALSE);
- _dbus_string_init_const (&unique_name, ":1.1"); //dbus_bus_get_unique_name(context->myConnection)); this is without :1.
+ _dbus_string_init_const (&unique_name, dbus_bus_get_unique_name(context->myKdbusConnection));
if(!bus_connection_complete (context->myKdbusConnection, &unique_name, error))
{
_dbus_verbose ("Bus connection complete failed for myKdbusConnection!\n");
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;
diff --git a/bus/kdbus-d.h b/bus/kdbus-d.h
index 04232213..eaa18300 100644
--- a/bus/kdbus-d.h
+++ b/bus/kdbus-d.h
@@ -35,7 +35,7 @@
#include <dbus/dbus-transport-kdbus.h>
__u64 sender_name_to_id(const char* name, DBusError* error);
-char* make_kdbus_bus(DBusBusType type, DBusError *error);
+char* make_kdbus_bus(DBusBusType type, const char* address, DBusError *error);
DBusServer* empty_server_init(char* address);
dbus_bool_t kdbus_register_policy (const DBusString *service_name, DBusConnection* connection);
diff --git a/dbus/kdbus.h b/dbus/kdbus.h
index c6a58ef3..8195cfd1 100644
--- a/dbus/kdbus.h
+++ b/dbus/kdbus.h
@@ -121,6 +121,11 @@ enum {
KDBUS_MSG_SRC_SECLABEL, /* NUL terminated string, in .str */
KDBUS_MSG_SRC_AUDIT, /* .audit */
+#ifdef KDBUS_FOR_SBB
+ KDBUS_MSG_SBB_DST_NAME, /* destination name for sbb agent purpose */
+ KDBUS_MSG_SBB_BLOOM,
+#endif
+
/* Special messages from kernel, consisting of one and only one of these data blocks */
KDBUS_MSG_NAME_ADD = 0x800,/* .name_change */
KDBUS_MSG_NAME_REMOVE, /* .name_change */
@@ -255,6 +260,11 @@ enum {
KDBUS_HELLO_ATTACH_CAPS = 1 << 14,
KDBUS_HELLO_ATTACH_SECLABEL = 1 << 15,
KDBUS_HELLO_ATTACH_AUDIT = 1 << 16,
+
+#ifdef KDBUS_FOR_SBB
+ /*Flags for SBB*/
+ KDBUS_HELLO_IAMAGENT = 1 << 30,
+#endif
};
struct kdbus_cmd_hello {
@@ -286,15 +296,16 @@ enum {
KDBUS_MAKE_ACCESS_GROUP = 1 << 0,
KDBUS_MAKE_ACCESS_WORLD = 1 << 1,
KDBUS_MAKE_POLICY_OPEN = 1 << 2,
+
+#ifdef KDBUS_FOR_SBB
+ KDBUS_MAKE_SBB_OFFSET = ((__u64)1 << 31),
+#endif
};
/* Items to append to kdbus_cmd_{bus,ep,ns}_make */
enum {
_KDBUS_MAKE_NULL,
KDBUS_MAKE_NAME,
- KDBUS_MAKE_CGROUP, /* the cgroup hierarchy ID for which to attach
- * cgroup membership paths to messages.
- * FIXME: remove, use *the* hierarchy */
KDBUS_MAKE_CRED, /* allow translator services which connect
* to the bus on behalf of somebody else,
* allow specifiying the credentials of the
@@ -448,4 +459,9 @@ enum {
KDBUS_CMD_MEMFD_SEAL_GET = _IOR(KDBUS_IOC_MAGIC, 0x83, int *),
KDBUS_CMD_MEMFD_SEAL_SET = _IO(KDBUS_IOC_MAGIC, 0x84),
};
+
+#ifdef KDBUS_FOR_SBB
+#define SBB_AGENT_ID_MASK ((__u64)1 << 63)
+//FIXME KDBUS_DST_ID_BROADCAST has "remote" mask
+#endif
#endif