struct reply_callback {
sd_bus_message_handler_t callback;
- void *userdata;
usec_t timeout;
uint64_t cookie;
unsigned prioq_idx;
struct filter_callback {
sd_bus_message_handler_t callback;
- void *userdata;
unsigned last_iteration;
LIST_FIELDS(struct filter_callback, callbacks);
};
+struct match_callback {
+ sd_bus_message_handler_t callback;
+
+ uint64_t cookie;
+ unsigned last_iteration;
+
+ char *match_string;
+
+ struct bus_match_node *match_node;
+};
+
struct node {
char *path;
struct node *parent;
LIST_HEAD(struct node_callback, callbacks);
LIST_HEAD(struct node_vtable, vtables);
LIST_HEAD(struct node_enumerator, enumerators);
-
- bool object_manager;
+ LIST_HEAD(struct node_object_manager, object_managers);
};
struct node_callback {
bool is_fallback;
sd_bus_message_handler_t callback;
- void *userdata;
unsigned last_iteration;
struct node *node;
sd_bus_node_enumerator_t callback;
- void *userdata;
unsigned last_iteration;
LIST_FIELDS(struct node_enumerator, enumerators);
};
+struct node_object_manager {
+ struct node *node;
+
+ LIST_FIELDS(struct node_object_manager, object_managers);
+};
+
struct node_vtable {
struct node *node;
char *interface;
bool is_fallback;
const sd_bus_vtable *vtable;
- void *userdata;
sd_bus_object_find_t find;
unsigned last_iteration;
const sd_bus_vtable *vtable;
};
+typedef enum BusSlotType {
+ BUS_REPLY_CALLBACK,
+ BUS_FILTER_CALLBACK,
+ BUS_MATCH_CALLBACK,
+ BUS_NODE_CALLBACK,
+ BUS_NODE_ENUMERATOR,
+ BUS_NODE_VTABLE,
+ BUS_NODE_OBJECT_MANAGER,
+ _BUS_SLOT_INVALID = -1,
+} BusSlotType;
+
+struct sd_bus_slot {
+ unsigned n_ref;
+ sd_bus *bus;
+ void *userdata;
+ BusSlotType type:5;
+ bool floating:1;
+ char *description;
+
+ LIST_FIELDS(sd_bus_slot, slots);
+
+ union {
+ struct reply_callback reply_callback;
+ struct filter_callback filter_callback;
+ struct match_callback match_callback;
+ struct node_callback node_callback;
+ struct node_enumerator node_enumerator;
+ struct node_object_manager node_object_manager;
+ struct node_vtable node_vtable;
+ };
+};
+
enum bus_state {
BUS_UNSET,
BUS_OPENING,
struct bus_match_node match_callbacks;
Prioq *reply_callbacks_prioq;
- Hashmap *reply_callbacks;
+ OrderedHashmap *reply_callbacks;
LIST_HEAD(struct filter_callback, filter_callbacks);
Hashmap *nodes;
Hashmap *vtable_methods;
Hashmap *vtable_properties;
- union {
- struct sockaddr sa;
- struct sockaddr_un un;
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
- } sockaddr;
+ union sockaddr_union sockaddr;
socklen_t sockaddr_size;
char *kernel;
char *exec_path;
char **exec_argv;
- uint64_t hello_cookie;
unsigned iteration_counter;
void *kdbus_buffer;
sd_event *event;
int event_priority;
- sd_bus_message *current;
+ sd_bus_message *current_message;
+ sd_bus_slot *current_slot;
+ sd_bus_message_handler_t current_handler;
+ void *current_userdata;
sd_bus **default_bus_ptr;
pid_t tid;
char *cgroup_root;
- char *connection_name;
+ char *description;
size_t bloom_size;
unsigned bloom_n_hash;
sd_bus_track *track_queue;
+
+ LIST_HEAD(sd_bus_slot, slots);
};
#define BUS_DEFAULT_TIMEOUT ((usec_t) (25 * USEC_PER_SEC))
bool interface_name_is_valid(const char *p) _pure_;
bool service_name_is_valid(const char *p) _pure_;
+char* service_name_startswith(const char *a, const char *b);
bool member_name_is_valid(const char *p) _pure_;
bool object_path_is_valid(const char *p) _pure_;
char *object_path_startswith(const char *a, const char *b) _pure_;
* on */
#define BUS_DONT_DESTROY(bus) \
_cleanup_bus_unref_ _unused_ sd_bus *_dont_destroy_##bus = sd_bus_ref(bus)
+
+int bus_set_address_system(sd_bus *bus);
+int bus_set_address_user(sd_bus *bus);
+int bus_set_address_system_remote(sd_bus *b, const char *host);
+int bus_set_address_system_container(sd_bus *b, const char *machine);
+
+int bus_remove_match_by_string(sd_bus *bus, const char *match, sd_bus_message_handler_t callback, void *userdata);
+
+int bus_get_root_path(sd_bus *bus);