[daemon-dev] Added option to create bus with sbb offset
authorRadoslaw Pajak <r.pajak@samsung.com>
Tue, 26 Nov 2013 08:18:01 +0000 (09:18 +0100)
committerRadoslaw Pajak <r.pajak@samsung.com>
Tue, 26 Nov 2013 08:18:01 +0000 (09:18 +0100)
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>
bus/bus.c
bus/kdbus-d.c
bus/kdbus-d.h
dbus/kdbus.h

index 3b734a7..485a6fd 100644 (file)
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -433,7 +433,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;
@@ -446,7 +446,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;
 
@@ -993,7 +993,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");
index be9fccc..3e247be 100644 (file)
@@ -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;
 
index 0423221..eaa1830 100644 (file)
@@ -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);
index c6a58ef..8195cfd 100644 (file)
@@ -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