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=bebb2c2fac37ec2aee4c96b8605d1a1381670959;hp=3dceb8a5da8566e4930aaa4af06e1a6301082ac5;hb=c0765ddb74f20046c406a3ac99f34719d767f151;hpb=09365592341b4ba4ceca677bb551dcde811e0333 diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h index 3dceb8a5d..bebb2c2fa 100644 --- a/src/libsystemd/sd-bus/bus-internal.h +++ b/src/libsystemd/sd-bus/bus-internal.h @@ -31,6 +31,7 @@ #include "list.h" #include "util.h" #include "refcnt.h" +#include "socket-util.h" #include "sd-bus.h" #include "bus-error.h" @@ -40,7 +41,6 @@ struct reply_callback { sd_bus_message_handler_t callback; - void *userdata; usec_t timeout; uint64_t cookie; unsigned prioq_idx; @@ -48,13 +48,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 +74,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 +82,6 @@ struct node_callback { bool is_fallback; sd_bus_message_handler_t callback; - void *userdata; unsigned last_iteration; @@ -84,20 +92,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 +126,38 @@ 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; + 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, @@ -163,9 +207,11 @@ struct sd_bus { bool nodes_modified:1; bool trusted:1; bool fake_creds_valid:1; + bool fake_pids_valid:1; bool manual_peer_interface:1; bool is_system:1; bool is_user:1; + bool allow_interactive_authorization:1; int use_memfd; @@ -188,23 +234,19 @@ 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; char *machine; + pid_t nspid; sd_id128_t server_id; @@ -231,7 +273,6 @@ struct sd_bus { char *exec_path; char **exec_argv; - uint64_t hello_cookie; unsigned iteration_counter; void *kdbus_buffer; @@ -260,22 +301,28 @@ 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; struct kdbus_creds fake_creds; + struct kdbus_pids fake_pids; char *fake_label; 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)) @@ -298,6 +345,7 @@ struct sd_bus { 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_; @@ -339,4 +387,8 @@ char *bus_address_escape(const char *v); 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_set_address_system_machine(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);