diff options
author | Radoslaw Pajak <r.pajak@samsung.com> | 2013-11-26 09:18:01 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2015-02-11 11:55:10 +0100 |
commit | 9703abd5a96888443ce15e0c8f61d627533127aa (patch) | |
tree | c412386ca39ef31cec4700788dc48546a0d0640b | |
parent | 59678da1339cc92255607cbfcf8a614de03805db (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.c | 6 | ||||
-rw-r--r-- | bus/kdbus-d.c | 25 | ||||
-rw-r--r-- | bus/kdbus-d.h | 2 | ||||
-rw-r--r-- | dbus/kdbus.h | 22 |
4 files changed, 41 insertions, 14 deletions
@@ -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 |