_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 = bus_resolve(bus), -ENOPKG); 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); }
char* object_path_startswith(const char *a, const char *b) { const char *p; if (!object_path_is_valid(a) || !object_path_is_valid(b)) return NULL; if (streq(b, "/")) return (char*) a + 1; p = startswith(a, b); if (!p) return NULL; if (*p == 0) return (char*) p; if (*p == '/') return (char*) p + 1; return NULL; }