chiark / gitweb /
bus: add sd_bus_process_priority() to support prioq mode of kdbus
[elogind.git] / src / libsystemd / sd-bus / bus-kernel.c
index 833ea5574ddbde16fc180ace3973815287e3ec95..27c2e0efcf71c11629aa7e15920ddbb0b1a43eb5 100644 (file)
@@ -260,6 +260,7 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
                 m->destination ? unique : KDBUS_DST_ID_BROADCAST;
         m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS;
         m->kdbus->cookie = m->header->serial;
+        m->kdbus->priority = m->priority;
 
         if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
                 m->kdbus->cookie_reply = m->reply_cookie;
@@ -500,9 +501,13 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                         break;
 
                 case KDBUS_ITEM_TIMESTAMP:
-                        m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC;
-                        m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC;
-                        m->seqnum = d->timestamp.seqnum;
+
+                        if (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
+                                m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC;
+                                m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC;
+                                m->seqnum = d->timestamp.seqnum;
+                        }
+
                         break;
 
                 case KDBUS_ITEM_PID_COMM:
@@ -568,6 +573,11 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                                 goto fail;
                         break;
 
+                case KDBUS_ITEM_CONN_NAME:
+                        m->creds.conn_name = d->str;
+                        m->creds.mask |= SD_BUS_CREDS_CONNECTION_NAME & bus->creds_mask;
+                        break;
+
                 case KDBUS_ITEM_FDS:
                 case KDBUS_ITEM_SECLABEL:
                         break;
@@ -1029,7 +1039,7 @@ static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) {
         return translate[found->type - _KDBUS_ITEM_KERNEL_BASE](bus, k, found);
 }
 
-int bus_kernel_read_message(sd_bus *bus) {
+int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
         struct kdbus_cmd_recv recv = {};
         struct kdbus_msg *k;
         int r;
@@ -1040,6 +1050,11 @@ int bus_kernel_read_message(sd_bus *bus) {
         if (r < 0)
                 return r;
 
+        if (hint_priority) {
+                recv.flags |= KDBUS_RECV_USE_PRIORITY;
+                recv.priority = priority;
+        }
+
         r = ioctl(bus->input_fd, KDBUS_CMD_MSG_RECV, &recv);
         if (r < 0) {
                 if (errno == EAGAIN)
@@ -1240,6 +1255,9 @@ int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) {
         if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES)
                 m |= KDBUS_ATTACH_NAMES;
 
+        if (mask & SD_BUS_CREDS_CONNECTION_NAME)
+                m |= KDBUS_ATTACH_CONN_NAME;
+
         *kdbus_mask = m;
         return 0;
 }