Merge changes I795ea4d7,I4871ee62
[platform/upstream/dbus.git] / dbus / dbus-transport-kdbus.c
index a26f45d..902116d 100644 (file)
@@ -84,7 +84,7 @@ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string))   \
 }\
 
 #define MSG_ITEM_BUILD_VEC(data, datasize)                                    \
-       item->type = KDBUS_MSG_PAYLOAD_VEC;                                     \
+       item->type = KDBUS_ITEM_PAYLOAD_VEC;                                    \
         item->size = KDBUS_PART_HEADER_SIZE + sizeof(struct kdbus_vec);                \
         item->vec.address = (unsigned long) data;                              \
         item->vec.size = datasize;
@@ -136,6 +136,17 @@ __u64 dbus_transport_get_bloom_size(DBusTransport* transport)
 }
 
 /**
+ *  Gets pointer to the memory pool, wher received messages are
+ *  placed and some ioctls return their info
+ *  @param transport transport
+ *  @returns pointer to the pool
+ */
+void* dbus_transport_get_pool_pointer(DBusTransport* transport)
+{
+  return ((DBusTransportKdbus*)transport)->kdbus_mmap_ptr;
+}
+
+/**
  * Puts locally generated message into received messages queue
  * @param message message that will be added
  * @param connection connection to which message will be added
@@ -274,24 +285,24 @@ static struct kdbus_msg* kdbus_init_msg(const char* name, __u64 dst_id, uint64_t
     msg_size = sizeof(struct kdbus_msg);
 
     if(use_memfd == TRUE)  // bulk data - memfd
-        msg_size += KDBUS_ITEM_SIZE(sizeof(struct kdbus_memfd));
+        msg_size += KDBUS_PART_SIZE(sizeof(struct kdbus_memfd));
     else
       {
-        msg_size += KDBUS_ITEM_SIZE(sizeof(struct kdbus_vec));  //header is a must
+        msg_size += KDBUS_PART_SIZE(sizeof(struct kdbus_vec));  //header is a must
         while(body_size > KDBUS_MSG_MAX_PAYLOAD_VEC_SIZE)
           {
-            msg_size += KDBUS_ITEM_SIZE(sizeof(struct kdbus_vec));
+            msg_size += KDBUS_PART_SIZE(sizeof(struct kdbus_vec));
             body_size -= KDBUS_MSG_MAX_PAYLOAD_VEC_SIZE;
           }
         if(body_size)
-          msg_size += KDBUS_ITEM_SIZE(sizeof(struct kdbus_vec));
+          msg_size += KDBUS_PART_SIZE(sizeof(struct kdbus_vec));
       }
 
     if(fds_count)
-       msg_size += KDBUS_ITEM_SIZE(sizeof(int)*fds_count);
+       msg_size += KDBUS_PART_SIZE(sizeof(int)*fds_count);
 
     if (name)
-       msg_size += KDBUS_ITEM_SIZE(strlen(name) + 1);
+       msg_size += KDBUS_PART_SIZE(strlen(name) + 1);
     else if (dst_id == KDBUS_DST_ID_BROADCAST)
        msg_size += KDBUS_PART_HEADER_SIZE + transport->bloom_size;
 
@@ -304,7 +315,7 @@ static struct kdbus_msg* kdbus_init_msg(const char* name, __u64 dst_id, uint64_t
 
     memset(msg, 0, msg_size);
     msg->size = msg_size;
-    msg->payload_type = KDBUS_PAYLOAD_DBUS1;
+    msg->payload_type = KDBUS_PAYLOAD_DBUS;
     msg->dst_id = name ? 0 : dst_id;
     msg->src_id = strtoull(dbus_bus_get_unique_name(transport->base.connection), NULL , 10);
 
@@ -342,7 +353,7 @@ static int kdbus_write_msg(DBusTransportKdbus *transport, DBusMessage *message,
   // determine destination and destination id
   if(destination)
     {
-      dst_id = KDBUS_DST_ID_WELL_KNOWN_NAME;
+      dst_id = KDBUS_DST_ID_NAME;
       if((destination[0] == ':') && (destination[1] == '1') && (destination[2] == '.'))  /* if name starts with ":1." it is a unique name and should be send as number */
         {
           dst_id = strtoull(&destination[3], NULL, 10);
@@ -407,7 +418,7 @@ static int kdbus_write_msg(DBusTransportKdbus *transport, DBusMessage *message,
           goto out;
       }
 
-      item->type = KDBUS_MSG_PAYLOAD_MEMFD;
+      item->type = KDBUS_ITEM_PAYLOAD_MEMFD;
       item->size = KDBUS_PART_HEADER_SIZE + sizeof(struct kdbus_memfd);
       item->memfd.size = ret_size;
       item->memfd.fd = transport->memfd;
@@ -442,7 +453,7 @@ static int kdbus_write_msg(DBusTransportKdbus *transport, DBusMessage *message,
   if(fds_count)
     {
       item = KDBUS_PART_NEXT(item);
-      item->type = KDBUS_MSG_FDS;
+      item->type = KDBUS_ITEM_FDS;
       item->size = KDBUS_PART_HEADER_SIZE + (sizeof(int) * fds_count);
       memcpy(item->fds, unix_fds, sizeof(int) * fds_count);
     }
@@ -450,14 +461,14 @@ static int kdbus_write_msg(DBusTransportKdbus *transport, DBusMessage *message,
   if (destination)
     {
       item = KDBUS_PART_NEXT(item);
-      item->type = KDBUS_MSG_DST_NAME;
+      item->type = KDBUS_ITEM_DST_NAME;
       item->size = KDBUS_PART_HEADER_SIZE + strlen(destination) + 1;
       memcpy(item->str, destination, item->size - KDBUS_PART_HEADER_SIZE);
     }
   else if (dst_id == KDBUS_DST_ID_BROADCAST)
     {
       item = KDBUS_PART_NEXT(item);
-      item->type = KDBUS_MSG_BLOOM;
+      item->type = KDBUS_ITEM_BLOOM;
       item->size = KDBUS_PART_HEADER_SIZE + transport->bloom_size;
       strncpy(item->data, dbus_message_get_interface(message), transport->bloom_size);
     }
@@ -507,6 +518,7 @@ static int kdbus_write_msg(DBusTransportKdbus *transport, DBusMessage *message,
 static dbus_bool_t bus_register_kdbus(char* name, DBusTransportKdbus* transportS)
 {
        struct kdbus_cmd_hello __attribute__ ((__aligned__(8))) hello;
+       memset(&hello, 0, sizeof(hello));
 
        hello.conn_flags = KDBUS_HELLO_ACCEPT_FD/* |
                           KDBUS_HELLO_ATTACH_COMM |
@@ -567,9 +579,10 @@ static int capture_hello_message(DBusTransport *transport, const char* destinati
               strcpy(name, ":1.");
               if(!bus_register_kdbus(&name[3], (DBusTransportKdbus*)transport))
                 goto out;
+#ifdef POLICY_TO_KDBUS
               if(!register_kdbus_policy(&name[3], transport, geteuid()))
                 goto out;
-
+#endif
               ((DBusTransportKdbus*)transport)->sender = name;
 
               if(!reply_1_data(message, DBUS_TYPE_STRING, &name, transport->connection))
@@ -615,38 +628,37 @@ struct kdbus_enum_table {
        }
 const char *enum_MSG(long long id);
 TABLE(MSG) = {
-       ENUM(_KDBUS_MSG_NULL),
-       ENUM(KDBUS_MSG_PAYLOAD_VEC),
-       ENUM(KDBUS_MSG_PAYLOAD_OFF),
-       ENUM(KDBUS_MSG_PAYLOAD_MEMFD),
-       ENUM(KDBUS_MSG_FDS),
-       ENUM(KDBUS_MSG_BLOOM),
-       ENUM(KDBUS_MSG_DST_NAME),
-       ENUM(KDBUS_MSG_SRC_CREDS),
-       ENUM(KDBUS_MSG_SRC_PID_COMM),
-       ENUM(KDBUS_MSG_SRC_TID_COMM),
-       ENUM(KDBUS_MSG_SRC_EXE),
-       ENUM(KDBUS_MSG_SRC_CMDLINE),
-       ENUM(KDBUS_MSG_SRC_CGROUP),
-       ENUM(KDBUS_MSG_SRC_CAPS),
-       ENUM(KDBUS_MSG_SRC_SECLABEL),
-       ENUM(KDBUS_MSG_SRC_AUDIT),
-       ENUM(KDBUS_MSG_SRC_NAMES),
-       ENUM(KDBUS_MSG_TIMESTAMP),
-       ENUM(KDBUS_MSG_NAME_ADD),
-       ENUM(KDBUS_MSG_NAME_REMOVE),
-       ENUM(KDBUS_MSG_NAME_CHANGE),
-       ENUM(KDBUS_MSG_ID_ADD),
-       ENUM(KDBUS_MSG_ID_REMOVE),
-       ENUM(KDBUS_MSG_REPLY_TIMEOUT),
-       ENUM(KDBUS_MSG_REPLY_DEAD),
+       ENUM(_KDBUS_ITEM_NULL),
+       ENUM(KDBUS_ITEM_PAYLOAD_VEC),
+       ENUM(KDBUS_ITEM_PAYLOAD_OFF),
+       ENUM(KDBUS_ITEM_PAYLOAD_MEMFD),
+       ENUM(KDBUS_ITEM_FDS),
+       ENUM(KDBUS_ITEM_BLOOM),
+       ENUM(KDBUS_ITEM_DST_NAME),
+       ENUM(KDBUS_ITEM_CREDS),
+       ENUM(KDBUS_ITEM_PID_COMM),
+       ENUM(KDBUS_ITEM_TID_COMM),
+       ENUM(KDBUS_ITEM_EXE),
+       ENUM(KDBUS_ITEM_CMDLINE),
+       ENUM(KDBUS_ITEM_CGROUP),
+       ENUM(KDBUS_ITEM_CAPS),
+       ENUM(KDBUS_ITEM_SECLABEL),
+       ENUM(KDBUS_ITEM_AUDIT),
+       ENUM(KDBUS_ITEM_NAME),
+       ENUM(KDBUS_ITEM_TIMESTAMP),
+       ENUM(KDBUS_ITEM_NAME_ADD),
+       ENUM(KDBUS_ITEM_NAME_REMOVE),
+       ENUM(KDBUS_ITEM_NAME_CHANGE),
+       ENUM(KDBUS_ITEM_ID_ADD),
+       ENUM(KDBUS_ITEM_ID_REMOVE),
+       ENUM(KDBUS_ITEM_REPLY_TIMEOUT),
+       ENUM(KDBUS_ITEM_REPLY_DEAD),
 };
 LOOKUP(MSG);
 const char *enum_PAYLOAD(long long id);
 TABLE(PAYLOAD) = {
        ENUM(KDBUS_PAYLOAD_KERNEL),
-       ENUM(KDBUS_PAYLOAD_DBUS1),
-       ENUM(KDBUS_PAYLOAD_GVARIANT),
+       ENUM(KDBUS_PAYLOAD_DBUS),
 };
 LOOKUP(PAYLOAD);
 
@@ -698,10 +710,10 @@ static int kdbus_message_size(const struct kdbus_msg* msg)
                }
                switch (item->type)
                {
-                       case KDBUS_MSG_PAYLOAD_OFF:
+                       case KDBUS_ITEM_PAYLOAD_OFF:
                                ret_size += item->vec.size;
                                break;
-                       case KDBUS_MSG_PAYLOAD_MEMFD:
+                       case KDBUS_ITEM_PAYLOAD_MEMFD:
                                ret_size += item->memfd.size;
                                break;
                        default:
@@ -758,7 +770,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
 
                switch (item->type)
                {
-                       case KDBUS_MSG_PAYLOAD_OFF:
+                       case KDBUS_ITEM_PAYLOAD_OFF:
                                memcpy(data, (char *)kdbus_transport->kdbus_mmap_ptr + item->vec.offset, item->vec.size);
                                data += item->vec.size;
                                ret_size += item->vec.size;
@@ -769,7 +781,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                        (unsigned long long)item->vec.size);
                        break;
 
-                       case KDBUS_MSG_PAYLOAD_MEMFD:
+                       case KDBUS_ITEM_PAYLOAD_MEMFD:
                        {
                                char *buf;
                                uint64_t size;
@@ -797,7 +809,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                        break;
                        }
 
-                       case KDBUS_MSG_FDS:
+                       case KDBUS_ITEM_FDS:
                        {
                                int i;
 
@@ -809,7 +821,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                        }
 
 #if KDBUS_MSG_DECODE_DEBUG == 1
-                       case KDBUS_MSG_SRC_CREDS:
+                       case KDBUS_ITEM_CREDS:
                                _dbus_verbose("  +%s (%llu bytes) uid=%lld, gid=%lld, pid=%lld, tid=%lld, starttime=%lld\n",
                                        enum_MSG(item->type), item->size,
                                        item->creds.uid, item->creds.gid,
@@ -817,18 +829,18 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                        item->creds.starttime);
                        break;
 
-                       case KDBUS_MSG_SRC_PID_COMM:
-                       case KDBUS_MSG_SRC_TID_COMM:
-                       case KDBUS_MSG_SRC_EXE:
-                       case KDBUS_MSG_SRC_CGROUP:
-                       case KDBUS_MSG_SRC_SECLABEL:
-                       case KDBUS_MSG_DST_NAME:
+                       case KDBUS_ITEM_PID_COMM:
+                       case KDBUS_ITEM_TID_COMM:
+                       case KDBUS_ITEM_EXE:
+                       case KDBUS_ITEM_CGROUP:
+                       case KDBUS_ITEM_SECLABEL:
+                       case KDBUS_ITEM_DST_NAME:
                                _dbus_verbose("  +%s (%llu bytes) '%s' (%zu)\n",
                                           enum_MSG(item->type), item->size, item->str, strlen(item->str));
                                break;
 
-                       case KDBUS_MSG_SRC_CMDLINE:
-                       case KDBUS_MSG_SRC_NAMES: {
+                       case KDBUS_ITEM_CMDLINE:
+                       case KDBUS_ITEM_NAME: {
                                __u64 size = item->size - KDBUS_PART_HEADER_SIZE;
                                const char *str = item->str;
                                int count = 0;
@@ -845,14 +857,14 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                break;
                        }
 
-                       case KDBUS_MSG_SRC_AUDIT:
+                       case KDBUS_ITEM_AUDIT:
                                _dbus_verbose("  +%s (%llu bytes) loginuid=%llu sessionid=%llu\n",
                                           enum_MSG(item->type), item->size,
                                           (unsigned long long)item->data64[0],
                                           (unsigned long long)item->data64[1]);
                                break;
 
-                       case KDBUS_MSG_SRC_CAPS: {
+                       case KDBUS_ITEM_CAPS: {
                                int n;
                                const uint32_t *cap;
                                int i;
@@ -883,7 +895,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                break;
                        }
 
-                       case KDBUS_MSG_TIMESTAMP:
+                       case KDBUS_ITEM_TIMESTAMP:
                                _dbus_verbose("  +%s (%llu bytes) realtime=%lluns monotonic=%lluns\n",
                                           enum_MSG(item->type), item->size,
                                           (unsigned long long)item->timestamp.realtime_ns,
@@ -891,7 +903,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                break;
 #endif
 
-                       case KDBUS_MSG_REPLY_TIMEOUT:
+                       case KDBUS_ITEM_REPLY_TIMEOUT:
                                _dbus_verbose("  +%s (%llu bytes) cookie=%llu\n",
                                           enum_MSG(item->type), item->size, msg->cookie_reply);
 
@@ -905,7 +917,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                ret_size = put_message_into_data(message, data);
                        break;
 
-                       case KDBUS_MSG_REPLY_DEAD:
+                       case KDBUS_ITEM_REPLY_DEAD:
                                _dbus_verbose("  +%s (%llu bytes) cookie=%llu\n",
                                           enum_MSG(item->type), item->size, msg->cookie_reply);
 
@@ -919,11 +931,12 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                ret_size = put_message_into_data(message, data);
                        break;
 
-                       case KDBUS_MSG_NAME_ADD:
-                               _dbus_verbose("  +%s (%llu bytes) '%s', old id=%lld, new id=%lld, flags=0x%llx\n",
+                       case KDBUS_ITEM_NAME_ADD:
+                               _dbus_verbose("  +%s (%llu bytes) '%s', old id=%lld, new id=%lld, old flags=0x%llx, new flags=0x%llx\n",
                                        enum_MSG(item->type), (unsigned long long) item->size,
                                        item->name_change.name, item->name_change.old_id,
-                                       item->name_change.new_id, item->name_change.flags);
+                                       item->name_change.new_id, item->name_change.old_flags,
+                                       item->name_change.new_flags);
 
                                message = dbus_message_new_signal(DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "NameOwnerChanged");
                                if(message == NULL)
@@ -944,11 +957,12 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                ret_size = put_message_into_data(message, data);
                        break;
 
-                       case KDBUS_MSG_NAME_REMOVE:
-                               _dbus_verbose("  +%s (%llu bytes) '%s', old id=%lld, new id=%lld, flags=0x%llx\n",
+                       case KDBUS_ITEM_NAME_REMOVE:
+                               _dbus_verbose("  +%s (%llu bytes) '%s', old id=%lld, new id=%lld, old flags=0x%llx, new flags=0x%llx\n",
                                        enum_MSG(item->type), (unsigned long long) item->size,
                                        item->name_change.name, item->name_change.old_id,
-                                       item->name_change.new_id, item->name_change.flags);
+                                       item->name_change.new_id, item->name_change.old_flags,
+                                       item->name_change.new_flags);
 
                                message = dbus_message_new_signal(DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "NameOwnerChanged"); // name of the signal
                                if(message == NULL)
@@ -969,11 +983,12 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                ret_size = put_message_into_data(message, data);
                        break;
 
-                       case KDBUS_MSG_NAME_CHANGE:
-                               _dbus_verbose("  +%s (%llu bytes) '%s', old id=%lld, new id=%lld, flags=0x%llx\n",
+                       case KDBUS_ITEM_NAME_CHANGE:
+                               _dbus_verbose("  +%s (%llu bytes) '%s', old id=%lld, new id=%lld, old flags=0x%llx, new flags=0x%llx\n",
                                        enum_MSG(item->type), (unsigned long long) item->size,
                                        item->name_change.name, item->name_change.old_id,
-                                       item->name_change.new_id, item->name_change.flags);
+                                       item->name_change.new_id, item->name_change.old_flags,
+                                       item->name_change.new_flags);
 
                                message = dbus_message_new_signal(DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "NameOwnerChanged");
                                if(message == NULL)
@@ -996,7 +1011,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                ret_size = put_message_into_data(message, data);
                        break;
 
-                       case KDBUS_MSG_ID_ADD:
+                       case KDBUS_ITEM_ID_ADD:
                                _dbus_verbose("  +%s (%llu bytes) id=%llu flags=%llu\n",
                                           enum_MSG(item->type), (unsigned long long) item->size,
                                           (unsigned long long) item->id_change.id,
@@ -1019,7 +1034,7 @@ static int kdbus_decode_msg(const struct kdbus_msg* msg, char *data, DBusTranspo
                                ret_size = put_message_into_data(message, data);
                        break;
 
-                       case KDBUS_MSG_ID_REMOVE:
+                       case KDBUS_ITEM_ID_REMOVE:
                                _dbus_verbose("  +%s (%llu bytes) id=%llu flags=%llu\n",
                                           enum_MSG(item->type), (unsigned long long) item->size,
                                           (unsigned long long) item->id_change.id,
@@ -1123,7 +1138,7 @@ static int kdbus_read_message(DBusTransportKdbus *kdbus_transport, DBusString *b
        }
 
        again2:
-       if (ioctl(kdbus_transport->fd, KDBUS_CMD_MSG_RELEASE, &offset) < 0)
+       if (ioctl(kdbus_transport->fd, KDBUS_CMD_FREE, &offset) < 0)
        {
                if(errno == EINTR)
                        goto again2;