sd-bus: add new API sd_bus_match_signal() + sd_bus_match_signal_asnyc()
These are convenience helpers that hide the match string logic (which we probably should never have exposed), and instead just takes regular C arguments.
This commit is contained in:
parent
7593c7a495
commit
b423e4fb73
|
@ -538,4 +538,6 @@ global:
|
||||||
sd_bus_request_name_async;
|
sd_bus_request_name_async;
|
||||||
sd_bus_release_name_async;
|
sd_bus_release_name_async;
|
||||||
sd_bus_add_match_async;
|
sd_bus_add_match_async;
|
||||||
|
sd_bus_match_signal;
|
||||||
|
sd_bus_match_signal_async;
|
||||||
} LIBSYSTEMD_236;
|
} LIBSYSTEMD_236;
|
||||||
|
|
|
@ -615,3 +615,69 @@ _public_ int sd_bus_query_sender_privilege(sd_bus_message *call, int capability)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define make_expression(sender, path, interface, member) \
|
||||||
|
strjoina( \
|
||||||
|
"type='signal'", \
|
||||||
|
sender ? ",sender='" : "", \
|
||||||
|
sender ?: "", \
|
||||||
|
sender ? "'" : "", \
|
||||||
|
path ? ",path='" : "", \
|
||||||
|
path ?: "", \
|
||||||
|
path ? "'" : "", \
|
||||||
|
interface ? ",interface='" : "", \
|
||||||
|
interface ?: "", \
|
||||||
|
interface ? "'" : "", \
|
||||||
|
member ? ",member='" : "", \
|
||||||
|
member ?: "", \
|
||||||
|
member ? "'" : "" \
|
||||||
|
)
|
||||||
|
|
||||||
|
_public_ int sd_bus_match_signal(
|
||||||
|
sd_bus *bus,
|
||||||
|
sd_bus_slot **ret,
|
||||||
|
const char *sender,
|
||||||
|
const char *path,
|
||||||
|
const char *interface,
|
||||||
|
const char *member,
|
||||||
|
sd_bus_message_handler_t callback,
|
||||||
|
void *userdata) {
|
||||||
|
|
||||||
|
const char *expression;
|
||||||
|
|
||||||
|
assert_return(bus, -EINVAL);
|
||||||
|
assert_return(!bus_pid_changed(bus), -ECHILD);
|
||||||
|
assert_return(!sender || service_name_is_valid(sender), -EINVAL);
|
||||||
|
assert_return(!path || object_path_is_valid(path), -EINVAL);
|
||||||
|
assert_return(!interface || interface_name_is_valid(interface), -EINVAL);
|
||||||
|
assert_return(!member || member_name_is_valid(member), -EINVAL);
|
||||||
|
|
||||||
|
expression = make_expression(sender, path, interface, member);
|
||||||
|
|
||||||
|
return sd_bus_add_match(bus, ret, expression, callback, userdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
_public_ int sd_bus_match_signal_async(
|
||||||
|
sd_bus *bus,
|
||||||
|
sd_bus_slot **ret,
|
||||||
|
const char *sender,
|
||||||
|
const char *path,
|
||||||
|
const char *interface,
|
||||||
|
const char *member,
|
||||||
|
sd_bus_message_handler_t callback,
|
||||||
|
sd_bus_message_handler_t install_callback,
|
||||||
|
void *userdata) {
|
||||||
|
|
||||||
|
const char *expression;
|
||||||
|
|
||||||
|
assert_return(bus, -EINVAL);
|
||||||
|
assert_return(!bus_pid_changed(bus), -ECHILD);
|
||||||
|
assert_return(!sender || service_name_is_valid(sender), -EINVAL);
|
||||||
|
assert_return(!path || object_path_is_valid(path), -EINVAL);
|
||||||
|
assert_return(!interface || interface_name_is_valid(interface), -EINVAL);
|
||||||
|
assert_return(!member || member_name_is_valid(member), -EINVAL);
|
||||||
|
|
||||||
|
expression = make_expression(sender, path, interface, member);
|
||||||
|
|
||||||
|
return sd_bus_add_match_async(bus, ret, expression, callback, install_callback, userdata);
|
||||||
|
}
|
||||||
|
|
|
@ -341,6 +341,9 @@ int sd_bus_emit_interfaces_removed(sd_bus *bus, const char *path, const char *in
|
||||||
int sd_bus_query_sender_creds(sd_bus_message *call, uint64_t mask, sd_bus_creds **creds);
|
int sd_bus_query_sender_creds(sd_bus_message *call, uint64_t mask, sd_bus_creds **creds);
|
||||||
int sd_bus_query_sender_privilege(sd_bus_message *call, int capability);
|
int sd_bus_query_sender_privilege(sd_bus_message *call, int capability);
|
||||||
|
|
||||||
|
int sd_bus_match_signal(sd_bus *bus, sd_bus_slot **ret, const char *sender, const char *path, const char *interface, const char *member, sd_bus_message_handler_t callback, void *userdata);
|
||||||
|
int sd_bus_match_signal_async(sd_bus *bus, sd_bus_slot **ret, const char *sender, const char *path, const char *interface, const char *member, sd_bus_message_handler_t match_callback, sd_bus_message_handler_t add_callback, void *userdata);
|
||||||
|
|
||||||
/* Credential handling */
|
/* Credential handling */
|
||||||
|
|
||||||
int sd_bus_creds_new_from_pid(sd_bus_creds **ret, pid_t pid, uint64_t creds_mask);
|
int sd_bus_creds_new_from_pid(sd_bus_creds **ret, pid_t pid, uint64_t creds_mask);
|
||||||
|
|
Loading…
Reference in a new issue