X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-internal.h;h=b1310a8640c4148829353aaa703588aa7ab5e265;hp=3dceb8a5da8566e4930aaa4af06e1a6301082ac5;hb=455971c1493fc6dc3125d235cf4ea6102cac626d;hpb=09365592341b4ba4ceca677bb551dcde811e0333 diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h index 3dceb8a5d..b1310a864 100644 --- a/src/libsystemd/sd-bus/bus-internal.h +++ b/src/libsystemd/sd-bus/bus-internal.h @@ -40,7 +40,6 @@ struct reply_callback { sd_bus_message_handler_t callback; - void *userdata; usec_t timeout; uint64_t cookie; unsigned prioq_idx; @@ -48,13 +47,23 @@ struct reply_callback { 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; @@ -64,8 +73,7 @@ struct node { 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 { @@ -73,7 +81,6 @@ struct node_callback { bool is_fallback; sd_bus_message_handler_t callback; - void *userdata; unsigned last_iteration; @@ -84,20 +91,24 @@ struct node_enumerator { 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; @@ -114,6 +125,37 @@ struct vtable_member { 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; + + 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, @@ -188,19 +230,14 @@ struct sd_bus { 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; @@ -231,7 +268,6 @@ struct sd_bus { char *exec_path; char **exec_argv; - uint64_t hello_cookie; unsigned iteration_counter; void *kdbus_buffer; @@ -260,7 +296,10 @@ struct sd_bus { 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; @@ -270,12 +309,14 @@ struct sd_bus { 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)) @@ -340,3 +381,7 @@ 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);