sd-bus: introduce API for re-enqueuing incoming messages
When authorizing via PolicyKit we want to process incoming method calls twice: once to process and figure out that we need PK authentication, and a second time after we aquired PK authentication to actually execute the operation. With this new call sd_bus_enqueue_for_read() we have a way to put an incoming message back into the read queue for this purpose. This might have other uses too, for example debugging.
This commit is contained in:
parent
f4425c72c7
commit
1068447e69
|
@ -685,6 +685,7 @@ global:
|
||||||
|
|
||||||
LIBSYSTEMD_245 {
|
LIBSYSTEMD_245 {
|
||||||
global:
|
global:
|
||||||
|
sd_bus_enqeue_for_read;
|
||||||
sd_bus_message_dump;
|
sd_bus_message_dump;
|
||||||
sd_bus_message_sensitive;
|
sd_bus_message_sensitive;
|
||||||
sd_event_add_child_pidfd;
|
sd_event_add_child_pidfd;
|
||||||
|
|
|
@ -4207,3 +4207,27 @@ _public_ int sd_bus_get_close_on_exit(sd_bus *bus) {
|
||||||
|
|
||||||
return bus->close_on_exit;
|
return bus->close_on_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_public_ int sd_bus_enqeue_for_read(sd_bus *bus, sd_bus_message *m) {
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert_return(bus, -EINVAL);
|
||||||
|
assert_return(bus = bus_resolve(bus), -ENOPKG);
|
||||||
|
assert_return(m, -EINVAL);
|
||||||
|
assert_return(m->sealed, -EINVAL);
|
||||||
|
assert_return(!bus_pid_changed(bus), -ECHILD);
|
||||||
|
|
||||||
|
if (!BUS_IS_OPEN(bus->state))
|
||||||
|
return -ENOTCONN;
|
||||||
|
|
||||||
|
/* Re-enqeue a message for reading. This is primarily useful for PolicyKit-style authentication,
|
||||||
|
* where we want accept a message, then determine we need to interactively authenticate the user, and
|
||||||
|
* when we have that process the message again. */
|
||||||
|
|
||||||
|
r = bus_rqueue_make_room(bus);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
bus->rqueue[bus->rqueue_size++] = bus_message_ref_queued(m, bus);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -207,6 +207,7 @@ int sd_bus_process(sd_bus *bus, sd_bus_message **r);
|
||||||
int sd_bus_process_priority(sd_bus *bus, int64_t max_priority, sd_bus_message **r);
|
int sd_bus_process_priority(sd_bus *bus, int64_t max_priority, sd_bus_message **r);
|
||||||
int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec);
|
int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec);
|
||||||
int sd_bus_flush(sd_bus *bus);
|
int sd_bus_flush(sd_bus *bus);
|
||||||
|
int sd_bus_enqeue_for_read(sd_bus *bus, sd_bus_message *m);
|
||||||
|
|
||||||
sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus);
|
sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus);
|
||||||
sd_bus_message* sd_bus_get_current_message(sd_bus *bus);
|
sd_bus_message* sd_bus_get_current_message(sd_bus *bus);
|
||||||
|
|
Loading…
Reference in a new issue