sd-bus: let sd_bus_call() use the synchronous kdbus method
This commit is contained in:
parent
cb67f7184e
commit
021b89861d
|
@ -251,7 +251,8 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
|
||||||
|
|
||||||
m->kdbus->flags =
|
m->kdbus->flags =
|
||||||
((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
|
((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
|
||||||
((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0);
|
((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0) |
|
||||||
|
(m->reply_sync ? KDBUS_MSG_FLAGS_SYNC_REPLY : 0);
|
||||||
m->kdbus->dst_id =
|
m->kdbus->dst_id =
|
||||||
well_known ? 0 :
|
well_known ? 0 :
|
||||||
m->destination ? unique : KDBUS_DST_ID_BROADCAST;
|
m->destination ? unique : KDBUS_DST_ID_BROADCAST;
|
||||||
|
@ -788,6 +789,39 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m->reply_sync) {
|
||||||
|
struct kdbus_msg *k;
|
||||||
|
|
||||||
|
k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + m->kdbus->offset_reply);
|
||||||
|
r = bus_kernel_make_message(bus, k);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bus_call_kernel(
|
||||||
|
sd_bus *bus,
|
||||||
|
sd_bus_message *m,
|
||||||
|
uint64_t usec,
|
||||||
|
sd_bus_error *error,
|
||||||
|
sd_bus_message **reply) {
|
||||||
|
|
||||||
|
int r;
|
||||||
|
uint64_t cookie;
|
||||||
|
|
||||||
|
m->reply_sync = !!reply;
|
||||||
|
|
||||||
|
r = sd_bus_send(bus, m, &cookie);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (reply) {
|
||||||
|
assert(bus->rqueue_size > 0);
|
||||||
|
*reply = bus->rqueue[--bus->rqueue_size];
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@ int bus_kernel_take_fd(sd_bus *b);
|
||||||
|
|
||||||
int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m);
|
int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m);
|
||||||
int bus_kernel_read_message(sd_bus *bus);
|
int bus_kernel_read_message(sd_bus *bus);
|
||||||
|
int bus_call_kernel(sd_bus *bus, sd_bus_message *m, uint64_t usec, sd_bus_error *error, sd_bus_message **reply);
|
||||||
|
|
||||||
int bus_kernel_create_bus(const char *name, bool world, char **s);
|
int bus_kernel_create_bus(const char *name, bool world, char **s);
|
||||||
int bus_kernel_create_namespace(const char *name, char **s);
|
int bus_kernel_create_namespace(const char *name, char **s);
|
||||||
|
|
|
@ -107,6 +107,7 @@ struct sd_bus_message {
|
||||||
bool free_fds:1;
|
bool free_fds:1;
|
||||||
bool release_kdbus:1;
|
bool release_kdbus:1;
|
||||||
bool poisoned:1;
|
bool poisoned:1;
|
||||||
|
bool reply_sync:1;
|
||||||
|
|
||||||
struct bus_header *header;
|
struct bus_header *header;
|
||||||
struct bus_body_part body;
|
struct bus_body_part body;
|
||||||
|
|
|
@ -1720,41 +1720,19 @@ int bus_ensure_running(sd_bus *bus) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_bus_call(
|
static int bus_call_dbus1(
|
||||||
sd_bus *bus,
|
sd_bus *bus,
|
||||||
sd_bus_message *_m,
|
sd_bus_message *m,
|
||||||
uint64_t usec,
|
uint64_t usec,
|
||||||
sd_bus_error *error,
|
sd_bus_error *error,
|
||||||
sd_bus_message **reply) {
|
sd_bus_message **reply) {
|
||||||
|
|
||||||
_cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
|
|
||||||
usec_t timeout;
|
usec_t timeout;
|
||||||
uint64_t cookie;
|
uint64_t cookie;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert_return(bus, -EINVAL);
|
|
||||||
assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
|
|
||||||
assert_return(m, -EINVAL);
|
|
||||||
assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
|
|
||||||
assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
|
|
||||||
assert_return(!bus_error_is_dirty(error), -EINVAL);
|
|
||||||
assert_return(!bus_pid_changed(bus), -ECHILD);
|
|
||||||
|
|
||||||
r = bus_ensure_running(bus);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
i = bus->rqueue_size;
|
i = bus->rqueue_size;
|
||||||
|
|
||||||
r = bus_seal_message(bus, m, usec);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = bus_remarshal_message(bus, &m);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = sd_bus_send(bus, m, &cookie);
|
r = sd_bus_send(bus, m, &cookie);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
@ -1853,6 +1831,42 @@ _public_ int sd_bus_call(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_public_ int sd_bus_call(
|
||||||
|
sd_bus *bus,
|
||||||
|
sd_bus_message *_m,
|
||||||
|
uint64_t usec,
|
||||||
|
sd_bus_error *error,
|
||||||
|
sd_bus_message **reply) {
|
||||||
|
|
||||||
|
_cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert_return(bus, -EINVAL);
|
||||||
|
assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
|
||||||
|
assert_return(m, -EINVAL);
|
||||||
|
assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
|
||||||
|
assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
|
||||||
|
assert_return(!bus_error_is_dirty(error), -EINVAL);
|
||||||
|
assert_return(!bus_pid_changed(bus), -ECHILD);
|
||||||
|
|
||||||
|
r = bus_ensure_running(bus);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = bus_seal_message(bus, m, usec);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = bus_remarshal_message(bus, &m);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (bus->is_kernel)
|
||||||
|
return bus_call_kernel(bus, m, usec, error, reply);
|
||||||
|
else
|
||||||
|
return bus_call_dbus1(bus, m, usec, error, reply);
|
||||||
|
}
|
||||||
|
|
||||||
_public_ int sd_bus_get_fd(sd_bus *bus) {
|
_public_ int sd_bus_get_fd(sd_bus *bus) {
|
||||||
|
|
||||||
assert_return(bus, -EINVAL);
|
assert_return(bus, -EINVAL);
|
||||||
|
|
Loading…
Reference in a new issue