File: | build-scan/../src/basic/alloc-util.h |
Warning: | line 34, column 9 Argument to free() is a constant address (3), which is not memory allocated by malloc() |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* SPDX-License-Identifier: LGPL-2.1+ */ | ||||
2 | /*** | ||||
3 | ***/ | ||||
4 | |||||
5 | #include <endian.h> | ||||
6 | #include <netdb.h> | ||||
7 | #include <poll.h> | ||||
8 | #include <pthread.h> | ||||
9 | #include <signal.h> | ||||
10 | #include <stdlib.h> | ||||
11 | #include <sys/mman.h> | ||||
12 | #include <sys/wait.h> | ||||
13 | #include <unistd.h> | ||||
14 | |||||
15 | #include "sd-bus.h" | ||||
16 | |||||
17 | #include "alloc-util.h" | ||||
18 | #include "bus-container.h" | ||||
19 | #include "bus-control.h" | ||||
20 | #include "bus-internal.h" | ||||
21 | #include "bus-kernel.h" | ||||
22 | #include "bus-label.h" | ||||
23 | #include "bus-message.h" | ||||
24 | #include "bus-objects.h" | ||||
25 | #include "bus-protocol.h" | ||||
26 | #include "bus-slot.h" | ||||
27 | #include "bus-socket.h" | ||||
28 | #include "bus-track.h" | ||||
29 | #include "bus-type.h" | ||||
30 | #include "bus-util.h" | ||||
31 | #include "cgroup-util.h" | ||||
32 | #include "def.h" | ||||
33 | #include "fd-util.h" | ||||
34 | #include "hexdecoct.h" | ||||
35 | #include "hostname-util.h" | ||||
36 | #include "macro.h" | ||||
37 | #include "missing.h" | ||||
38 | #include "parse-util.h" | ||||
39 | #include "process-util.h" | ||||
40 | #include "string-util.h" | ||||
41 | #include "strv.h" | ||||
42 | #include "util.h" | ||||
43 | |||||
44 | #define log_debug_bus_message(m)do { sd_bus_message *_mm = (m); ({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm (_realm) >= ((_level) & 0x07)) ? log_internal_realm((( _realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c" , 44, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }); } while (0) \ | ||||
45 | do { \ | ||||
46 | sd_bus_message *_mm = (m); \ | ||||
47 | log_debug("Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s", \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
48 | bus_message_type_to_string(_mm->header->type), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
49 | strna(sd_bus_message_get_sender(_mm)), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
50 | strna(sd_bus_message_get_destination(_mm)), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
51 | strna(sd_bus_message_get_path(_mm)), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
52 | strna(sd_bus_message_get_interface(_mm)), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
53 | strna(sd_bus_message_get_member(_mm)), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
54 | BUS_MESSAGE_COOKIE(_mm), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
55 | _mm->reply_cookie, \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
56 | strna(_mm->root_container.signature), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
57 | strna(_mm->error.name), \({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }) | ||||
58 | strna(_mm->error.message))({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 58, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }); \ | ||||
59 | } while (false0) | ||||
60 | |||||
61 | static int bus_poll(sd_bus *bus, bool_Bool need_more, uint64_t timeout_usec); | ||||
62 | static void bus_detach_io_events(sd_bus *b); | ||||
63 | static void bus_detach_inotify_event(sd_bus *b); | ||||
64 | |||||
65 | static thread_local__thread sd_bus *default_system_bus = NULL((void*)0); | ||||
66 | static thread_local__thread sd_bus *default_user_bus = NULL((void*)0); | ||||
67 | static thread_local__thread sd_bus *default_starter_bus = NULL((void*)0); | ||||
68 | |||||
69 | static sd_bus **bus_choose_default(int (**bus_open)(sd_bus **)) { | ||||
70 | const char *e; | ||||
71 | |||||
72 | /* Let's try our best to reuse another cached connection. If | ||||
73 | * the starter bus type is set, connect via our normal | ||||
74 | * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that | ||||
75 | * we can share the connection with the user/system default | ||||
76 | * bus. */ | ||||
77 | |||||
78 | e = secure_getenv("DBUS_STARTER_BUS_TYPE"); | ||||
79 | if (e) { | ||||
80 | if (streq(e, "system")(strcmp((e),("system")) == 0)) { | ||||
81 | if (bus_open) | ||||
82 | *bus_open = sd_bus_open_system; | ||||
83 | return &default_system_bus; | ||||
84 | } else if (STR_IN_SET(e, "user", "session")(!!strv_find((((char**) ((const char*[]) { "user", "session", ((void*)0) }))), (e)))) { | ||||
85 | if (bus_open) | ||||
86 | *bus_open = sd_bus_open_user; | ||||
87 | return &default_user_bus; | ||||
88 | } | ||||
89 | } | ||||
90 | |||||
91 | /* No type is specified, so we have not other option than to | ||||
92 | * use the starter address if it is set. */ | ||||
93 | e = secure_getenv("DBUS_STARTER_ADDRESS"); | ||||
94 | if (e) { | ||||
95 | if (bus_open) | ||||
96 | *bus_open = sd_bus_open; | ||||
97 | return &default_starter_bus; | ||||
98 | } | ||||
99 | |||||
100 | /* Finally, if nothing is set use the cached connection for | ||||
101 | * the right scope */ | ||||
102 | |||||
103 | if (cg_pid_get_owner_uid(0, NULL((void*)0)) >= 0) { | ||||
104 | if (bus_open) | ||||
105 | *bus_open = sd_bus_open_user; | ||||
106 | return &default_user_bus; | ||||
107 | } else { | ||||
108 | if (bus_open) | ||||
109 | *bus_open = sd_bus_open_system; | ||||
110 | return &default_system_bus; | ||||
111 | } | ||||
112 | } | ||||
113 | |||||
114 | sd_bus *bus_resolve(sd_bus *bus) { | ||||
115 | switch ((uintptr_t) bus) { | ||||
116 | case (uintptr_t) SD_BUS_DEFAULT((sd_bus *) 1): | ||||
117 | return *(bus_choose_default(NULL((void*)0))); | ||||
118 | case (uintptr_t) SD_BUS_DEFAULT_USER((sd_bus *) 2): | ||||
119 | return default_user_bus; | ||||
120 | case (uintptr_t) SD_BUS_DEFAULT_SYSTEM((sd_bus *) 3): | ||||
121 | return default_system_bus; | ||||
122 | default: | ||||
123 | return bus; | ||||
124 | } | ||||
125 | } | ||||
126 | |||||
127 | void bus_close_io_fds(sd_bus *b) { | ||||
128 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 128, __PRETTY_FUNCTION__); } while (0); | ||||
129 | |||||
130 | bus_detach_io_events(b); | ||||
131 | |||||
132 | if (b->input_fd != b->output_fd) | ||||
133 | safe_close(b->output_fd); | ||||
134 | b->output_fd = b->input_fd = safe_close(b->input_fd); | ||||
135 | } | ||||
136 | |||||
137 | void bus_close_inotify_fd(sd_bus *b) { | ||||
138 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 138, __PRETTY_FUNCTION__); } while (0); | ||||
139 | |||||
140 | bus_detach_inotify_event(b); | ||||
141 | |||||
142 | b->inotify_fd = safe_close(b->inotify_fd); | ||||
143 | b->inotify_watches = mfree(b->inotify_watches); | ||||
144 | b->n_inotify_watches = 0; | ||||
145 | } | ||||
146 | |||||
147 | static void bus_reset_queues(sd_bus *b) { | ||||
148 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 148, __PRETTY_FUNCTION__); } while (0); | ||||
149 | |||||
150 | while (b->rqueue_size > 0) | ||||
151 | bus_message_unref_queued(b->rqueue[--b->rqueue_size], b); | ||||
152 | |||||
153 | b->rqueue = mfree(b->rqueue); | ||||
154 | b->rqueue_allocated = 0; | ||||
155 | |||||
156 | while (b->wqueue_size > 0) | ||||
157 | bus_message_unref_queued(b->wqueue[--b->wqueue_size], b); | ||||
158 | |||||
159 | b->wqueue = mfree(b->wqueue); | ||||
160 | b->wqueue_allocated = 0; | ||||
161 | } | ||||
162 | |||||
163 | static sd_bus* bus_free(sd_bus *b) { | ||||
164 | sd_bus_slot *s; | ||||
165 | |||||
166 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 166, __PRETTY_FUNCTION__); } while (0); | ||||
167 | assert(!b->track_queue)do { if ((__builtin_expect(!!(!(!b->track_queue)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("!b->track_queue"), "../src/libsystemd/sd-bus/sd-bus.c" , 167, __PRETTY_FUNCTION__); } while (0); | ||||
168 | assert(!b->tracks)do { if ((__builtin_expect(!!(!(!b->tracks)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("!b->tracks"), "../src/libsystemd/sd-bus/sd-bus.c" , 168, __PRETTY_FUNCTION__); } while (0); | ||||
169 | |||||
170 | b->state = BUS_CLOSED; | ||||
171 | |||||
172 | sd_bus_detach_event(b); | ||||
173 | |||||
174 | while ((s = b->slots)) { | ||||
175 | /* At this point only floating slots can still be | ||||
176 | * around, because the non-floating ones keep a | ||||
177 | * reference to the bus, and we thus couldn't be | ||||
178 | * destructing right now... We forcibly disconnect the | ||||
179 | * slots here, so that they still can be referenced by | ||||
180 | * apps, but are dead. */ | ||||
181 | |||||
182 | assert(s->floating)do { if ((__builtin_expect(!!(!(s->floating)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("s->floating"), "../src/libsystemd/sd-bus/sd-bus.c" , 182, __PRETTY_FUNCTION__); } while (0); | ||||
183 | bus_slot_disconnect(s); | ||||
184 | sd_bus_slot_unref(s); | ||||
185 | } | ||||
186 | |||||
187 | if (b->default_bus_ptr) | ||||
188 | *b->default_bus_ptr = NULL((void*)0); | ||||
189 | |||||
190 | bus_close_io_fds(b); | ||||
191 | bus_close_inotify_fd(b); | ||||
192 | |||||
193 | free(b->label); | ||||
194 | free(b->groups); | ||||
195 | free(b->rbuffer); | ||||
196 | free(b->unique_name); | ||||
197 | free(b->auth_buffer); | ||||
198 | free(b->address); | ||||
199 | free(b->machine); | ||||
200 | free(b->cgroup_root); | ||||
201 | free(b->description); | ||||
202 | free(b->patch_sender); | ||||
203 | |||||
204 | free(b->exec_path); | ||||
205 | strv_free(b->exec_argv); | ||||
206 | |||||
207 | close_many(b->fds, b->n_fds); | ||||
208 | free(b->fds); | ||||
209 | |||||
210 | bus_reset_queues(b); | ||||
211 | |||||
212 | ordered_hashmap_free_free(b->reply_callbacks); | ||||
213 | prioq_free(b->reply_callbacks_prioq); | ||||
214 | |||||
215 | assert(b->match_callbacks.type == BUS_MATCH_ROOT)do { if ((__builtin_expect(!!(!(b->match_callbacks.type == BUS_MATCH_ROOT)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD , ("b->match_callbacks.type == BUS_MATCH_ROOT"), "../src/libsystemd/sd-bus/sd-bus.c" , 215, __PRETTY_FUNCTION__); } while (0); | ||||
216 | bus_match_free(&b->match_callbacks); | ||||
217 | |||||
218 | hashmap_free_free(b->vtable_methods); | ||||
219 | hashmap_free_free(b->vtable_properties); | ||||
220 | |||||
221 | assert(hashmap_isempty(b->nodes))do { if ((__builtin_expect(!!(!(hashmap_isempty(b->nodes)) ),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("hashmap_isempty(b->nodes)" ), "../src/libsystemd/sd-bus/sd-bus.c", 221, __PRETTY_FUNCTION__ ); } while (0); | ||||
222 | hashmap_free(b->nodes); | ||||
223 | |||||
224 | bus_flush_memfd(b); | ||||
225 | |||||
226 | assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0)do { if ((__builtin_expect(!!(!(pthread_mutex_destroy(&b-> memfd_cache_mutex) == 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD , ("pthread_mutex_destroy(&b->memfd_cache_mutex) == 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 226, __PRETTY_FUNCTION__ ); } while (0); | ||||
227 | |||||
228 | return mfree(b); | ||||
229 | } | ||||
230 | |||||
231 | DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, bus_free)static inline void bus_freep(sd_bus* *p) { if (*p) bus_free(* p); }; | ||||
232 | |||||
233 | _public___attribute__ ((visibility("default"))) int sd_bus_new(sd_bus **ret) { | ||||
234 | _cleanup_free___attribute__((cleanup(freep))) sd_bus *b = NULL((void*)0); | ||||
235 | |||||
236 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 236, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
237 | |||||
238 | b = new0(sd_bus, 1)((sd_bus*) calloc((1), sizeof(sd_bus))); | ||||
239 | if (!b) | ||||
240 | return -ENOMEM12; | ||||
241 | |||||
242 | b->n_ref = REFCNT_INIT((RefCount) { ._value = 1 }); | ||||
243 | b->input_fd = b->output_fd = -1; | ||||
244 | b->inotify_fd = -1; | ||||
245 | b->message_version = 1; | ||||
246 | b->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME; | ||||
247 | b->accept_fd = true1; | ||||
248 | b->original_pid = getpid_cached(); | ||||
249 | b->n_groups = (size_t) -1; | ||||
250 | |||||
251 | /* We guarantee that wqueue always has space for at least one entry */ | ||||
252 | if (!GREEDY_REALLOC(b->wqueue, b->wqueue_allocated, 1)greedy_realloc((void**) &(b->wqueue), &(b->wqueue_allocated ), (1), sizeof((b->wqueue)[0]))) | ||||
253 | return -ENOMEM12; | ||||
254 | |||||
255 | assert_se(pthread_mutex_init(&b->memfd_cache_mutex, NULL) == 0)do { if ((__builtin_expect(!!(!(pthread_mutex_init(&b-> memfd_cache_mutex, ((void*)0)) == 0)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("pthread_mutex_init(&b->memfd_cache_mutex, NULL) == 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 255, __PRETTY_FUNCTION__ ); } while (0); | ||||
256 | |||||
257 | *ret = TAKE_PTR(b)({ typeof(b) _ptr_ = (b); (b) = ((void*)0); _ptr_; }); | ||||
258 | return 0; | ||||
259 | } | ||||
260 | |||||
261 | _public___attribute__ ((visibility("default"))) int sd_bus_set_address(sd_bus *bus, const char *address) { | ||||
262 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 262, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
263 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 263, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
264 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 264, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
265 | assert_return(address, -EINVAL)do { if (!(((__builtin_expect(!!(address),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("address"), "../src/libsystemd/sd-bus/sd-bus.c" , 265, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
266 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 266, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
267 | |||||
268 | return free_and_strdup(&bus->address, address); | ||||
269 | } | ||||
270 | |||||
271 | _public___attribute__ ((visibility("default"))) int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) { | ||||
272 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 272, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
273 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 273, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
274 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 274, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
275 | assert_return(input_fd >= 0, -EBADF)do { if (!(((__builtin_expect(!!(input_fd >= 0),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("input_fd >= 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 275, __PRETTY_FUNCTION__ ), 0))) return (-9); } while (0); | ||||
276 | assert_return(output_fd >= 0, -EBADF)do { if (!(((__builtin_expect(!!(output_fd >= 0),1))) ? (1 ) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("output_fd >= 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 276, __PRETTY_FUNCTION__ ), 0))) return (-9); } while (0); | ||||
277 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 277, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
278 | |||||
279 | bus->input_fd = input_fd; | ||||
280 | bus->output_fd = output_fd; | ||||
281 | return 0; | ||||
282 | } | ||||
283 | |||||
284 | _public___attribute__ ((visibility("default"))) int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) { | ||||
285 | _cleanup_strv_free___attribute__((cleanup(strv_freep))) char **a = NULL((void*)0); | ||||
286 | int r; | ||||
287 | |||||
288 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 288, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
289 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 289, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
290 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 290, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
291 | assert_return(path, -EINVAL)do { if (!(((__builtin_expect(!!(path),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("path"), "../src/libsystemd/sd-bus/sd-bus.c" , 291, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
292 | assert_return(!strv_isempty(argv), -EINVAL)do { if (!(((__builtin_expect(!!(!strv_isempty(argv)),1))) ? ( 1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!strv_isempty(argv)" ), "../src/libsystemd/sd-bus/sd-bus.c", 292, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
293 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 293, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
294 | |||||
295 | a = strv_copy(argv); | ||||
296 | if (!a) | ||||
297 | return -ENOMEM12; | ||||
298 | |||||
299 | r = free_and_strdup(&bus->exec_path, path); | ||||
300 | if (r < 0) | ||||
301 | return r; | ||||
302 | |||||
303 | return strv_free_and_replace(bus->exec_argv, a)({ strv_free(bus->exec_argv); (bus->exec_argv) = (a); ( a) = ((void*)0); 0; }); | ||||
304 | } | ||||
305 | |||||
306 | _public___attribute__ ((visibility("default"))) int sd_bus_set_bus_client(sd_bus *bus, int b) { | ||||
307 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 307, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
308 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 308, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
309 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 309, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
310 | assert_return(!bus->patch_sender, -EPERM)do { if (!(((__builtin_expect(!!(!bus->patch_sender),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus->patch_sender" ), "../src/libsystemd/sd-bus/sd-bus.c", 310, __PRETTY_FUNCTION__ ), 0))) return (-1); } while (0); | ||||
311 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 311, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
312 | |||||
313 | bus->bus_client = !!b; | ||||
314 | return 0; | ||||
315 | } | ||||
316 | |||||
317 | _public___attribute__ ((visibility("default"))) int sd_bus_set_monitor(sd_bus *bus, int b) { | ||||
318 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 318, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
319 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 319, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
320 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 320, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
321 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 321, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
322 | |||||
323 | bus->is_monitor = !!b; | ||||
324 | return 0; | ||||
325 | } | ||||
326 | |||||
327 | _public___attribute__ ((visibility("default"))) int sd_bus_negotiate_fds(sd_bus *bus, int b) { | ||||
328 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 328, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
329 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 329, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
330 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 330, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
331 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 331, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
332 | |||||
333 | bus->accept_fd = !!b; | ||||
334 | return 0; | ||||
335 | } | ||||
336 | |||||
337 | _public___attribute__ ((visibility("default"))) int sd_bus_negotiate_timestamp(sd_bus *bus, int b) { | ||||
338 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 338, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
339 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 339, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
340 | assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM)do { if (!(((__builtin_expect(!!(!({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){BUS_CLOSING, BUS_CLOSED})/sizeof(int)]; switch (bus->state) { case BUS_CLOSING: case BUS_CLOSED: _found = 1; break; default: break; } _found; })),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED)" ), "../src/libsystemd/sd-bus/sd-bus.c", 340, __PRETTY_FUNCTION__ ), 0))) return (-1); } while (0); | ||||
341 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 341, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
342 | |||||
343 | /* This is not actually supported by any of our transports these days, but we do honour it for synthetic | ||||
344 | * replies, and maybe one day classic D-Bus learns this too */ | ||||
345 | bus->attach_timestamp = !!b; | ||||
346 | |||||
347 | return 0; | ||||
348 | } | ||||
349 | |||||
350 | _public___attribute__ ((visibility("default"))) int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) { | ||||
351 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 351, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
352 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 352, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
353 | assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL)do { if (!(((__builtin_expect(!!(mask <= _SD_BUS_CREDS_ALL ),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("mask <= _SD_BUS_CREDS_ALL"), "../src/libsystemd/sd-bus/sd-bus.c" , 353, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
354 | assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM)do { if (!(((__builtin_expect(!!(!({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){BUS_CLOSING, BUS_CLOSED})/sizeof(int)]; switch (bus->state) { case BUS_CLOSING: case BUS_CLOSED: _found = 1; break; default: break; } _found; })),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED)" ), "../src/libsystemd/sd-bus/sd-bus.c", 354, __PRETTY_FUNCTION__ ), 0))) return (-1); } while (0); | ||||
355 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 355, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
356 | |||||
357 | SET_FLAG(bus->creds_mask, mask, b)(bus->creds_mask) = (b) ? ((bus->creds_mask) | (mask)) : ((bus->creds_mask) & ~(mask)); | ||||
358 | |||||
359 | /* The well knowns we need unconditionally, so that matches can work */ | ||||
360 | bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME; | ||||
361 | |||||
362 | return 0; | ||||
363 | } | ||||
364 | |||||
365 | _public___attribute__ ((visibility("default"))) int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) { | ||||
366 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 366, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
367 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 367, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
368 | assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL)do { if (!(((__builtin_expect(!!(b || sd_id128_equal(server_id , ((const sd_id128_t) { .qwords = { 0, 0 }}))),1))) ? (1) : ( log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("b || sd_id128_equal(server_id, SD_ID128_NULL)" ), "../src/libsystemd/sd-bus/sd-bus.c", 368, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
369 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 369, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
370 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 370, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
371 | |||||
372 | bus->is_server = !!b; | ||||
373 | bus->server_id = server_id; | ||||
374 | return 0; | ||||
375 | } | ||||
376 | |||||
377 | _public___attribute__ ((visibility("default"))) int sd_bus_set_anonymous(sd_bus *bus, int b) { | ||||
378 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 378, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
379 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 379, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
380 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 380, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
381 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 381, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
382 | |||||
383 | bus->anonymous_auth = !!b; | ||||
384 | return 0; | ||||
385 | } | ||||
386 | |||||
387 | _public___attribute__ ((visibility("default"))) int sd_bus_set_trusted(sd_bus *bus, int b) { | ||||
388 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 388, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
389 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 389, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
390 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 390, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
391 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 391, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
392 | |||||
393 | bus->trusted = !!b; | ||||
394 | return 0; | ||||
395 | } | ||||
396 | |||||
397 | _public___attribute__ ((visibility("default"))) int sd_bus_set_description(sd_bus *bus, const char *description) { | ||||
398 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 398, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
399 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 399, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
400 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 400, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
401 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 401, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
402 | |||||
403 | return free_and_strdup(&bus->description, description); | ||||
404 | } | ||||
405 | |||||
406 | _public___attribute__ ((visibility("default"))) int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) { | ||||
407 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 407, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
408 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 408, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
409 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 409, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
410 | |||||
411 | bus->allow_interactive_authorization = !!b; | ||||
412 | return 0; | ||||
413 | } | ||||
414 | |||||
415 | _public___attribute__ ((visibility("default"))) int sd_bus_get_allow_interactive_authorization(sd_bus *bus) { | ||||
416 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 416, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
417 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 417, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
418 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 418, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
419 | |||||
420 | return bus->allow_interactive_authorization; | ||||
421 | } | ||||
422 | |||||
423 | _public___attribute__ ((visibility("default"))) int sd_bus_set_watch_bind(sd_bus *bus, int b) { | ||||
424 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 424, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
425 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 425, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
426 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 426, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
427 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 427, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
428 | |||||
429 | bus->watch_bind = !!b; | ||||
430 | return 0; | ||||
431 | } | ||||
432 | |||||
433 | _public___attribute__ ((visibility("default"))) int sd_bus_get_watch_bind(sd_bus *bus) { | ||||
434 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 434, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
435 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 435, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
436 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 436, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
437 | |||||
438 | return bus->watch_bind; | ||||
439 | } | ||||
440 | |||||
441 | _public___attribute__ ((visibility("default"))) int sd_bus_set_connected_signal(sd_bus *bus, int b) { | ||||
442 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 442, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
443 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 443, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
444 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 444, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
445 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 445, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
446 | |||||
447 | bus->connected_signal = !!b; | ||||
448 | return 0; | ||||
449 | } | ||||
450 | |||||
451 | _public___attribute__ ((visibility("default"))) int sd_bus_get_connected_signal(sd_bus *bus) { | ||||
452 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 452, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
453 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 453, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
454 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 454, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
455 | |||||
456 | return bus->connected_signal; | ||||
457 | } | ||||
458 | |||||
459 | static int synthesize_connected_signal(sd_bus *bus) { | ||||
460 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = NULL((void*)0); | ||||
461 | int r; | ||||
462 | |||||
463 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 463, __PRETTY_FUNCTION__); } while (0); | ||||
464 | |||||
465 | /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called | ||||
466 | * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the | ||||
467 | * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state. | ||||
468 | * | ||||
469 | * This is useful so that clients can start doing stuff whenver the connection is fully established in a way | ||||
470 | * that works independently from whether we connected to a full bus or just a direct connection. */ | ||||
471 | |||||
472 | if (!bus->connected_signal) | ||||
473 | return 0; | ||||
474 | |||||
475 | r = sd_bus_message_new_signal( | ||||
476 | bus, | ||||
477 | &m, | ||||
478 | "/org/freedesktop/DBus/Local", | ||||
479 | "org.freedesktop.DBus.Local", | ||||
480 | "Connected"); | ||||
481 | if (r < 0) | ||||
482 | return r; | ||||
483 | |||||
484 | bus_message_set_sender_local(bus, m); | ||||
485 | |||||
486 | r = bus_seal_synthetic_message(bus, m); | ||||
487 | if (r < 0) | ||||
488 | return r; | ||||
489 | |||||
490 | r = bus_rqueue_make_room(bus); | ||||
491 | if (r < 0) | ||||
492 | return r; | ||||
493 | |||||
494 | /* Insert at the very front */ | ||||
495 | memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size); | ||||
496 | bus->rqueue[0] = bus_message_ref_queued(m, bus); | ||||
497 | bus->rqueue_size++; | ||||
498 | |||||
499 | return 0; | ||||
500 | } | ||||
501 | |||||
502 | void bus_set_state(sd_bus *bus, enum bus_state state) { | ||||
503 | |||||
504 | static const char * const table[_BUS_STATE_MAX] = { | ||||
505 | [BUS_UNSET] = "UNSET", | ||||
506 | [BUS_WATCH_BIND] = "WATCH_BIND", | ||||
507 | [BUS_OPENING] = "OPENING", | ||||
508 | [BUS_AUTHENTICATING] = "AUTHENTICATING", | ||||
509 | [BUS_HELLO] = "HELLO", | ||||
510 | [BUS_RUNNING] = "RUNNING", | ||||
511 | [BUS_CLOSING] = "CLOSING", | ||||
512 | [BUS_CLOSED] = "CLOSED", | ||||
513 | }; | ||||
514 | |||||
515 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 515, __PRETTY_FUNCTION__); } while (0); | ||||
516 | assert(state < _BUS_STATE_MAX)do { if ((__builtin_expect(!!(!(state < _BUS_STATE_MAX)),0 ))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("state < _BUS_STATE_MAX" ), "../src/libsystemd/sd-bus/sd-bus.c", 516, __PRETTY_FUNCTION__ ); } while (0); | ||||
517 | |||||
518 | if (state == bus->state) | ||||
519 | return; | ||||
520 | |||||
521 | log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state])({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 521, __func__, "Bus %s: changing state %s → %s" , strna(bus->description), table[bus->state], table[state ]) : -abs(_e); }); | ||||
522 | bus->state = state; | ||||
523 | } | ||||
524 | |||||
525 | static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) { | ||||
526 | const char *s; | ||||
527 | sd_bus *bus; | ||||
528 | int r; | ||||
529 | |||||
530 | assert(reply)do { if ((__builtin_expect(!!(!(reply)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("reply"), "../src/libsystemd/sd-bus/sd-bus.c" , 530, __PRETTY_FUNCTION__); } while (0); | ||||
531 | bus = reply->bus; | ||||
532 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 532, __PRETTY_FUNCTION__); } while (0); | ||||
533 | assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING))do { if ((__builtin_expect(!!(!(({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){BUS_HELLO, BUS_CLOSING})/sizeof(int)]; switch (bus->state) { case BUS_HELLO: case BUS_CLOSING: _found = 1 ; break; default: break; } _found; }))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("IN_SET(bus->state, BUS_HELLO, BUS_CLOSING)" ), "../src/libsystemd/sd-bus/sd-bus.c", 533, __PRETTY_FUNCTION__ ); } while (0); | ||||
534 | |||||
535 | r = sd_bus_message_get_errno(reply); | ||||
536 | if (r > 0) | ||||
537 | return -r; | ||||
538 | |||||
539 | r = sd_bus_message_read(reply, "s", &s); | ||||
540 | if (r < 0) | ||||
541 | return r; | ||||
542 | |||||
543 | if (!service_name_is_valid(s) || s[0] != ':') | ||||
544 | return -EBADMSG74; | ||||
545 | |||||
546 | r = free_and_strdup(&bus->unique_name, s); | ||||
547 | if (r < 0) | ||||
548 | return r; | ||||
549 | |||||
550 | if (bus->state == BUS_HELLO) { | ||||
551 | bus_set_state(bus, BUS_RUNNING); | ||||
552 | |||||
553 | r = synthesize_connected_signal(bus); | ||||
554 | if (r < 0) | ||||
555 | return r; | ||||
556 | } | ||||
557 | |||||
558 | return 1; | ||||
559 | } | ||||
560 | |||||
561 | static int bus_send_hello(sd_bus *bus) { | ||||
562 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = NULL((void*)0); | ||||
563 | int r; | ||||
564 | |||||
565 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 565, __PRETTY_FUNCTION__); } while (0); | ||||
566 | |||||
567 | if (!bus->bus_client) | ||||
568 | return 0; | ||||
569 | |||||
570 | r = sd_bus_message_new_method_call( | ||||
571 | bus, | ||||
572 | &m, | ||||
573 | "org.freedesktop.DBus", | ||||
574 | "/org/freedesktop/DBus", | ||||
575 | "org.freedesktop.DBus", | ||||
576 | "Hello"); | ||||
577 | if (r < 0) | ||||
578 | return r; | ||||
579 | |||||
580 | return sd_bus_call_async(bus, NULL((void*)0), m, hello_callback, NULL((void*)0), 0); | ||||
581 | } | ||||
582 | |||||
583 | int bus_start_running(sd_bus *bus) { | ||||
584 | struct reply_callback *c; | ||||
585 | Iterator i; | ||||
586 | usec_t n; | ||||
587 | int r; | ||||
588 | |||||
589 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 589, __PRETTY_FUNCTION__); } while (0); | ||||
590 | assert(bus->state < BUS_HELLO)do { if ((__builtin_expect(!!(!(bus->state < BUS_HELLO) ),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("bus->state < BUS_HELLO" ), "../src/libsystemd/sd-bus/sd-bus.c", 590, __PRETTY_FUNCTION__ ); } while (0); | ||||
591 | |||||
592 | /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert | ||||
593 | * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since | ||||
594 | * adding a fixed value to all entries should not alter the internal order. */ | ||||
595 | |||||
596 | n = now(CLOCK_MONOTONIC1); | ||||
597 | ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i)for ((i) = ((Iterator) { .idx = ((2147483647 *2U +1U) - 1), . next_key = ((void*)0) }); ordered_hashmap_iterate((bus->reply_callbacks ), &(i), (void**)&(c), ((void*)0)); ) { | ||||
598 | if (c->timeout_usec == 0) | ||||
599 | continue; | ||||
600 | |||||
601 | c->timeout_usec = usec_add(n, c->timeout_usec); | ||||
602 | } | ||||
603 | |||||
604 | if (bus->bus_client) { | ||||
605 | bus_set_state(bus, BUS_HELLO); | ||||
606 | return 1; | ||||
607 | } | ||||
608 | |||||
609 | bus_set_state(bus, BUS_RUNNING); | ||||
610 | |||||
611 | r = synthesize_connected_signal(bus); | ||||
612 | if (r < 0) | ||||
613 | return r; | ||||
614 | |||||
615 | return 1; | ||||
616 | } | ||||
617 | |||||
618 | static int parse_address_key(const char **p, const char *key, char **value) { | ||||
619 | size_t l, n = 0, allocated = 0; | ||||
620 | _cleanup_free___attribute__((cleanup(freep))) char *r = NULL((void*)0); | ||||
621 | const char *a; | ||||
622 | |||||
623 | assert(p)do { if ((__builtin_expect(!!(!(p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("p"), "../src/libsystemd/sd-bus/sd-bus.c" , 623, __PRETTY_FUNCTION__); } while (0); | ||||
624 | assert(*p)do { if ((__builtin_expect(!!(!(*p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("*p"), "../src/libsystemd/sd-bus/sd-bus.c" , 624, __PRETTY_FUNCTION__); } while (0); | ||||
625 | assert(value)do { if ((__builtin_expect(!!(!(value)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("value"), "../src/libsystemd/sd-bus/sd-bus.c" , 625, __PRETTY_FUNCTION__); } while (0); | ||||
626 | |||||
627 | if (key) { | ||||
628 | l = strlen(key); | ||||
629 | if (strncmp(*p, key, l) != 0) | ||||
630 | return 0; | ||||
631 | |||||
632 | if ((*p)[l] != '=') | ||||
633 | return 0; | ||||
634 | |||||
635 | if (*value) | ||||
636 | return -EINVAL22; | ||||
637 | |||||
638 | a = *p + l + 1; | ||||
639 | } else | ||||
640 | a = *p; | ||||
641 | |||||
642 | while (!IN_SET(*a, ';', ',', 0)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){';', ',', 0})/sizeof(int)]; switch(*a) { case ';': case ',': case 0: _found = 1; break; default: break ; } _found; })) { | ||||
643 | char c; | ||||
644 | |||||
645 | if (*a == '%') { | ||||
646 | int x, y; | ||||
647 | |||||
648 | x = unhexchar(a[1]); | ||||
649 | if (x < 0) | ||||
650 | return x; | ||||
651 | |||||
652 | y = unhexchar(a[2]); | ||||
653 | if (y < 0) | ||||
654 | return y; | ||||
655 | |||||
656 | c = (char) ((x << 4) | y); | ||||
657 | a += 3; | ||||
658 | } else { | ||||
659 | c = *a; | ||||
660 | a++; | ||||
661 | } | ||||
662 | |||||
663 | if (!GREEDY_REALLOC(r, allocated, n + 2)greedy_realloc((void**) &(r), &(allocated), (n + 2), sizeof ((r)[0]))) | ||||
664 | return -ENOMEM12; | ||||
665 | |||||
666 | r[n++] = c; | ||||
667 | } | ||||
668 | |||||
669 | if (!r) { | ||||
670 | r = strdup(""); | ||||
671 | if (!r) | ||||
672 | return -ENOMEM12; | ||||
673 | } else | ||||
674 | r[n] = 0; | ||||
675 | |||||
676 | if (*a == ',') | ||||
677 | a++; | ||||
678 | |||||
679 | *p = a; | ||||
680 | |||||
681 | free_and_replace(*value, r)({ free(*value); (*value) = (r); (r) = ((void*)0); 0; }); | ||||
682 | |||||
683 | return 1; | ||||
684 | } | ||||
685 | |||||
686 | static void skip_address_key(const char **p) { | ||||
687 | assert(p)do { if ((__builtin_expect(!!(!(p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("p"), "../src/libsystemd/sd-bus/sd-bus.c" , 687, __PRETTY_FUNCTION__); } while (0); | ||||
688 | assert(*p)do { if ((__builtin_expect(!!(!(*p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("*p"), "../src/libsystemd/sd-bus/sd-bus.c" , 688, __PRETTY_FUNCTION__); } while (0); | ||||
689 | |||||
690 | *p += strcspn(*p, ","); | ||||
691 | |||||
692 | if (**p == ',') | ||||
693 | (*p)++; | ||||
694 | } | ||||
695 | |||||
696 | static int parse_unix_address(sd_bus *b, const char **p, char **guid) { | ||||
697 | _cleanup_free___attribute__((cleanup(freep))) char *path = NULL((void*)0), *abstract = NULL((void*)0); | ||||
698 | size_t l; | ||||
699 | int r; | ||||
700 | |||||
701 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 701, __PRETTY_FUNCTION__); } while (0); | ||||
702 | assert(p)do { if ((__builtin_expect(!!(!(p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("p"), "../src/libsystemd/sd-bus/sd-bus.c" , 702, __PRETTY_FUNCTION__); } while (0); | ||||
703 | assert(*p)do { if ((__builtin_expect(!!(!(*p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("*p"), "../src/libsystemd/sd-bus/sd-bus.c" , 703, __PRETTY_FUNCTION__); } while (0); | ||||
704 | assert(guid)do { if ((__builtin_expect(!!(!(guid)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("guid"), "../src/libsystemd/sd-bus/sd-bus.c" , 704, __PRETTY_FUNCTION__); } while (0); | ||||
705 | |||||
706 | while (!IN_SET(**p, 0, ';')({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){0, ';'})/sizeof(int)]; switch(**p) { case 0: case ';': _found = 1; break; default: break; } _found; })) { | ||||
707 | r = parse_address_key(p, "guid", guid); | ||||
708 | if (r < 0) | ||||
709 | return r; | ||||
710 | else if (r > 0) | ||||
711 | continue; | ||||
712 | |||||
713 | r = parse_address_key(p, "path", &path); | ||||
714 | if (r < 0) | ||||
715 | return r; | ||||
716 | else if (r > 0) | ||||
717 | continue; | ||||
718 | |||||
719 | r = parse_address_key(p, "abstract", &abstract); | ||||
720 | if (r < 0) | ||||
721 | return r; | ||||
722 | else if (r > 0) | ||||
723 | continue; | ||||
724 | |||||
725 | skip_address_key(p); | ||||
726 | } | ||||
727 | |||||
728 | if (!path && !abstract) | ||||
729 | return -EINVAL22; | ||||
730 | |||||
731 | if (path && abstract) | ||||
732 | return -EINVAL22; | ||||
733 | |||||
734 | if (path) { | ||||
735 | l = strlen(path); | ||||
736 | if (l > sizeof(b->sockaddr.un.sun_path)) | ||||
737 | return -E2BIG7; | ||||
738 | |||||
739 | b->sockaddr.un.sun_family = AF_UNIX1; | ||||
740 | strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path)); | ||||
741 | b->sockaddr_size = offsetof(struct sockaddr_un, sun_path)__builtin_offsetof(struct sockaddr_un, sun_path) + l; | ||||
742 | } else if (abstract) { | ||||
743 | l = strlen(abstract); | ||||
744 | if (l > sizeof(b->sockaddr.un.sun_path) - 1) | ||||
745 | return -E2BIG7; | ||||
746 | |||||
747 | b->sockaddr.un.sun_family = AF_UNIX1; | ||||
748 | b->sockaddr.un.sun_path[0] = 0; | ||||
749 | strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1); | ||||
750 | b->sockaddr_size = offsetof(struct sockaddr_un, sun_path)__builtin_offsetof(struct sockaddr_un, sun_path) + 1 + l; | ||||
751 | } | ||||
752 | |||||
753 | b->is_local = true1; | ||||
754 | |||||
755 | return 0; | ||||
756 | } | ||||
757 | |||||
758 | static int parse_tcp_address(sd_bus *b, const char **p, char **guid) { | ||||
759 | _cleanup_free___attribute__((cleanup(freep))) char *host = NULL((void*)0), *port = NULL((void*)0), *family = NULL((void*)0); | ||||
760 | int r; | ||||
761 | struct addrinfo *result, hints = { | ||||
762 | .ai_socktype = SOCK_STREAMSOCK_STREAM, | ||||
763 | .ai_flags = AI_ADDRCONFIG0x0020, | ||||
764 | }; | ||||
765 | |||||
766 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 766, __PRETTY_FUNCTION__); } while (0); | ||||
767 | assert(p)do { if ((__builtin_expect(!!(!(p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("p"), "../src/libsystemd/sd-bus/sd-bus.c" , 767, __PRETTY_FUNCTION__); } while (0); | ||||
768 | assert(*p)do { if ((__builtin_expect(!!(!(*p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("*p"), "../src/libsystemd/sd-bus/sd-bus.c" , 768, __PRETTY_FUNCTION__); } while (0); | ||||
769 | assert(guid)do { if ((__builtin_expect(!!(!(guid)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("guid"), "../src/libsystemd/sd-bus/sd-bus.c" , 769, __PRETTY_FUNCTION__); } while (0); | ||||
770 | |||||
771 | while (!IN_SET(**p, 0, ';')({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){0, ';'})/sizeof(int)]; switch(**p) { case 0: case ';': _found = 1; break; default: break; } _found; })) { | ||||
772 | r = parse_address_key(p, "guid", guid); | ||||
773 | if (r < 0) | ||||
774 | return r; | ||||
775 | else if (r > 0) | ||||
776 | continue; | ||||
777 | |||||
778 | r = parse_address_key(p, "host", &host); | ||||
779 | if (r < 0) | ||||
780 | return r; | ||||
781 | else if (r > 0) | ||||
782 | continue; | ||||
783 | |||||
784 | r = parse_address_key(p, "port", &port); | ||||
785 | if (r < 0) | ||||
786 | return r; | ||||
787 | else if (r > 0) | ||||
788 | continue; | ||||
789 | |||||
790 | r = parse_address_key(p, "family", &family); | ||||
791 | if (r < 0) | ||||
792 | return r; | ||||
793 | else if (r > 0) | ||||
794 | continue; | ||||
795 | |||||
796 | skip_address_key(p); | ||||
797 | } | ||||
798 | |||||
799 | if (!host || !port) | ||||
800 | return -EINVAL22; | ||||
801 | |||||
802 | if (family) { | ||||
803 | if (streq(family, "ipv4")(strcmp((family),("ipv4")) == 0)) | ||||
804 | hints.ai_family = AF_INET2; | ||||
805 | else if (streq(family, "ipv6")(strcmp((family),("ipv6")) == 0)) | ||||
806 | hints.ai_family = AF_INET610; | ||||
807 | else | ||||
808 | return -EINVAL22; | ||||
809 | } | ||||
810 | |||||
811 | r = getaddrinfo(host, port, &hints, &result); | ||||
812 | if (r == EAI_SYSTEM-11) | ||||
813 | return -errno(*__errno_location ()); | ||||
814 | else if (r != 0) | ||||
815 | return -EADDRNOTAVAIL99; | ||||
816 | |||||
817 | memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen); | ||||
818 | b->sockaddr_size = result->ai_addrlen; | ||||
819 | |||||
820 | freeaddrinfo(result); | ||||
821 | |||||
822 | b->is_local = false0; | ||||
823 | |||||
824 | return 0; | ||||
825 | } | ||||
826 | |||||
827 | static int parse_exec_address(sd_bus *b, const char **p, char **guid) { | ||||
828 | char *path = NULL((void*)0); | ||||
829 | unsigned n_argv = 0, j; | ||||
830 | char **argv = NULL((void*)0); | ||||
831 | size_t allocated = 0; | ||||
832 | int r; | ||||
833 | |||||
834 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 834, __PRETTY_FUNCTION__); } while (0); | ||||
835 | assert(p)do { if ((__builtin_expect(!!(!(p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("p"), "../src/libsystemd/sd-bus/sd-bus.c" , 835, __PRETTY_FUNCTION__); } while (0); | ||||
836 | assert(*p)do { if ((__builtin_expect(!!(!(*p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("*p"), "../src/libsystemd/sd-bus/sd-bus.c" , 836, __PRETTY_FUNCTION__); } while (0); | ||||
837 | assert(guid)do { if ((__builtin_expect(!!(!(guid)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("guid"), "../src/libsystemd/sd-bus/sd-bus.c" , 837, __PRETTY_FUNCTION__); } while (0); | ||||
838 | |||||
839 | while (!IN_SET(**p, 0, ';')({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){0, ';'})/sizeof(int)]; switch(**p) { case 0: case ';': _found = 1; break; default: break; } _found; })) { | ||||
840 | r = parse_address_key(p, "guid", guid); | ||||
841 | if (r < 0) | ||||
842 | goto fail; | ||||
843 | else if (r > 0) | ||||
844 | continue; | ||||
845 | |||||
846 | r = parse_address_key(p, "path", &path); | ||||
847 | if (r < 0) | ||||
848 | goto fail; | ||||
849 | else if (r > 0) | ||||
850 | continue; | ||||
851 | |||||
852 | if (startswith(*p, "argv")) { | ||||
853 | unsigned ul; | ||||
854 | |||||
855 | errno(*__errno_location ()) = 0; | ||||
856 | ul = strtoul(*p + 4, (char**) p, 10); | ||||
857 | if (errno(*__errno_location ()) > 0 || **p != '=' || ul > 256) { | ||||
858 | r = -EINVAL22; | ||||
859 | goto fail; | ||||
860 | } | ||||
861 | |||||
862 | (*p)++; | ||||
863 | |||||
864 | if (ul >= n_argv) { | ||||
865 | if (!GREEDY_REALLOC0(argv, allocated, ul + 2)greedy_realloc0((void**) &(argv), &(allocated), (ul + 2), sizeof((argv)[0]))) { | ||||
866 | r = -ENOMEM12; | ||||
867 | goto fail; | ||||
868 | } | ||||
869 | |||||
870 | n_argv = ul + 1; | ||||
871 | } | ||||
872 | |||||
873 | r = parse_address_key(p, NULL((void*)0), argv + ul); | ||||
874 | if (r < 0) | ||||
875 | goto fail; | ||||
876 | |||||
877 | continue; | ||||
878 | } | ||||
879 | |||||
880 | skip_address_key(p); | ||||
881 | } | ||||
882 | |||||
883 | if (!path) { | ||||
884 | r = -EINVAL22; | ||||
885 | goto fail; | ||||
886 | } | ||||
887 | |||||
888 | /* Make sure there are no holes in the array, with the | ||||
889 | * exception of argv[0] */ | ||||
890 | for (j = 1; j < n_argv; j++) | ||||
891 | if (!argv[j]) { | ||||
892 | r = -EINVAL22; | ||||
893 | goto fail; | ||||
894 | } | ||||
895 | |||||
896 | if (argv && argv[0] == NULL((void*)0)) { | ||||
897 | argv[0] = strdup(path); | ||||
898 | if (!argv[0]) { | ||||
899 | r = -ENOMEM12; | ||||
900 | goto fail; | ||||
901 | } | ||||
902 | } | ||||
903 | |||||
904 | b->exec_path = path; | ||||
905 | b->exec_argv = argv; | ||||
906 | |||||
907 | b->is_local = false0; | ||||
908 | |||||
909 | return 0; | ||||
910 | |||||
911 | fail: | ||||
912 | for (j = 0; j < n_argv; j++) | ||||
913 | free(argv[j]); | ||||
914 | |||||
915 | free(argv); | ||||
916 | free(path); | ||||
917 | return r; | ||||
918 | } | ||||
919 | |||||
920 | static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) { | ||||
921 | _cleanup_free___attribute__((cleanup(freep))) char *machine = NULL((void*)0), *pid = NULL((void*)0); | ||||
922 | int r; | ||||
923 | |||||
924 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 924, __PRETTY_FUNCTION__); } while (0); | ||||
925 | assert(p)do { if ((__builtin_expect(!!(!(p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("p"), "../src/libsystemd/sd-bus/sd-bus.c" , 925, __PRETTY_FUNCTION__); } while (0); | ||||
926 | assert(*p)do { if ((__builtin_expect(!!(!(*p)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("*p"), "../src/libsystemd/sd-bus/sd-bus.c" , 926, __PRETTY_FUNCTION__); } while (0); | ||||
927 | assert(guid)do { if ((__builtin_expect(!!(!(guid)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("guid"), "../src/libsystemd/sd-bus/sd-bus.c" , 927, __PRETTY_FUNCTION__); } while (0); | ||||
928 | |||||
929 | while (!IN_SET(**p, 0, ';')({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){0, ';'})/sizeof(int)]; switch(**p) { case 0: case ';': _found = 1; break; default: break; } _found; })) { | ||||
930 | r = parse_address_key(p, "guid", guid); | ||||
931 | if (r < 0) | ||||
932 | return r; | ||||
933 | else if (r > 0) | ||||
934 | continue; | ||||
935 | |||||
936 | r = parse_address_key(p, "machine", &machine); | ||||
937 | if (r < 0) | ||||
938 | return r; | ||||
939 | else if (r > 0) | ||||
940 | continue; | ||||
941 | |||||
942 | r = parse_address_key(p, "pid", &pid); | ||||
943 | if (r < 0) | ||||
944 | return r; | ||||
945 | else if (r > 0) | ||||
946 | continue; | ||||
947 | |||||
948 | skip_address_key(p); | ||||
949 | } | ||||
950 | |||||
951 | if (!machine == !pid) | ||||
952 | return -EINVAL22; | ||||
953 | |||||
954 | if (machine) { | ||||
955 | if (!streq(machine, ".host")(strcmp((machine),(".host")) == 0) && !machine_name_is_valid(machine)hostname_is_valid(machine, 0)) | ||||
956 | return -EINVAL22; | ||||
957 | |||||
958 | free_and_replace(b->machine, machine)({ free(b->machine); (b->machine) = (machine); (machine ) = ((void*)0); 0; }); | ||||
959 | } else { | ||||
960 | b->machine = mfree(b->machine); | ||||
961 | } | ||||
962 | |||||
963 | if (pid) { | ||||
964 | r = parse_pid(pid, &b->nspid); | ||||
965 | if (r < 0) | ||||
966 | return r; | ||||
967 | } else | ||||
968 | b->nspid = 0; | ||||
969 | |||||
970 | b->sockaddr.un.sun_family = AF_UNIX1; | ||||
971 | /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */ | ||||
972 | strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path)); | ||||
973 | b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un)({ const struct sockaddr_un *_sa = &(b->sockaddr.un); do { if ((__builtin_expect(!!(!(_sa->sun_family == 1)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("_sa->sun_family == AF_UNIX"), "../src/libsystemd/sd-bus/sd-bus.c" , 973, __PRETTY_FUNCTION__); } while (0); __builtin_offsetof( struct sockaddr_un, sun_path) + (_sa->sun_path[0] == 0 ? 1 + strnlen(_sa->sun_path+1, sizeof(_sa->sun_path)-1) : strnlen (_sa->sun_path, sizeof(_sa->sun_path))); }); | ||||
974 | b->is_local = false0; | ||||
975 | |||||
976 | return 0; | ||||
977 | } | ||||
978 | |||||
979 | static void bus_reset_parsed_address(sd_bus *b) { | ||||
980 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 980, __PRETTY_FUNCTION__); } while (0); | ||||
981 | |||||
982 | zero(b->sockaddr)(({ size_t _l_ = (sizeof(b->sockaddr)); void *_x_ = (& (b->sockaddr)); _l_ == 0 ? _x_ : memset(_x_, 0, _l_); })); | ||||
983 | b->sockaddr_size = 0; | ||||
984 | b->exec_argv = strv_free(b->exec_argv); | ||||
985 | b->exec_path = mfree(b->exec_path); | ||||
986 | b->server_id = SD_ID128_NULL((const sd_id128_t) { .qwords = { 0, 0 }}); | ||||
987 | b->machine = mfree(b->machine); | ||||
988 | b->nspid = 0; | ||||
989 | } | ||||
990 | |||||
991 | static int bus_parse_next_address(sd_bus *b) { | ||||
992 | _cleanup_free___attribute__((cleanup(freep))) char *guid = NULL((void*)0); | ||||
993 | const char *a; | ||||
994 | int r; | ||||
995 | |||||
996 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 996, __PRETTY_FUNCTION__); } while (0); | ||||
997 | |||||
998 | if (!b->address) | ||||
999 | return 0; | ||||
1000 | if (b->address[b->address_index] == 0) | ||||
1001 | return 0; | ||||
1002 | |||||
1003 | bus_reset_parsed_address(b); | ||||
1004 | |||||
1005 | a = b->address + b->address_index; | ||||
1006 | |||||
1007 | while (*a != 0) { | ||||
1008 | |||||
1009 | if (*a == ';') { | ||||
1010 | a++; | ||||
1011 | continue; | ||||
1012 | } | ||||
1013 | |||||
1014 | if (startswith(a, "unix:")) { | ||||
1015 | a += 5; | ||||
1016 | |||||
1017 | r = parse_unix_address(b, &a, &guid); | ||||
1018 | if (r < 0) | ||||
1019 | return r; | ||||
1020 | break; | ||||
1021 | |||||
1022 | } else if (startswith(a, "tcp:")) { | ||||
1023 | |||||
1024 | a += 4; | ||||
1025 | r = parse_tcp_address(b, &a, &guid); | ||||
1026 | if (r < 0) | ||||
1027 | return r; | ||||
1028 | |||||
1029 | break; | ||||
1030 | |||||
1031 | } else if (startswith(a, "unixexec:")) { | ||||
1032 | |||||
1033 | a += 9; | ||||
1034 | r = parse_exec_address(b, &a, &guid); | ||||
1035 | if (r < 0) | ||||
1036 | return r; | ||||
1037 | |||||
1038 | break; | ||||
1039 | |||||
1040 | } else if (startswith(a, "x-machine-unix:")) { | ||||
1041 | |||||
1042 | a += 15; | ||||
1043 | r = parse_container_unix_address(b, &a, &guid); | ||||
1044 | if (r < 0) | ||||
1045 | return r; | ||||
1046 | |||||
1047 | break; | ||||
1048 | } | ||||
1049 | |||||
1050 | a = strchr(a, ';'); | ||||
1051 | if (!a) | ||||
1052 | return 0; | ||||
1053 | } | ||||
1054 | |||||
1055 | if (guid) { | ||||
1056 | r = sd_id128_from_string(guid, &b->server_id); | ||||
1057 | if (r < 0) | ||||
1058 | return r; | ||||
1059 | } | ||||
1060 | |||||
1061 | b->address_index = a - b->address; | ||||
1062 | return 1; | ||||
1063 | } | ||||
1064 | |||||
1065 | static void bus_kill_exec(sd_bus *bus) { | ||||
1066 | if (pid_is_valid(bus->busexec_pid) > 0) { | ||||
1067 | sigterm_wait(bus->busexec_pid); | ||||
1068 | bus->busexec_pid = 0; | ||||
1069 | } | ||||
1070 | } | ||||
1071 | |||||
1072 | static int bus_start_address(sd_bus *b) { | ||||
1073 | int r; | ||||
1074 | |||||
1075 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1075, __PRETTY_FUNCTION__); } while (0); | ||||
1076 | |||||
1077 | for (;;) { | ||||
1078 | bus_close_io_fds(b); | ||||
1079 | bus_close_inotify_fd(b); | ||||
1080 | |||||
1081 | bus_kill_exec(b); | ||||
1082 | |||||
1083 | /* If you provide multiple different bus-addresses, we | ||||
1084 | * try all of them in order and use the first one that | ||||
1085 | * succeeds. */ | ||||
1086 | |||||
1087 | if (b->exec_path) | ||||
1088 | r = bus_socket_exec(b); | ||||
1089 | else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC0) | ||||
1090 | r = bus_container_connect_socket(b); | ||||
1091 | else if (b->sockaddr.sa.sa_family != AF_UNSPEC0) | ||||
1092 | r = bus_socket_connect(b); | ||||
1093 | else | ||||
1094 | goto next; | ||||
1095 | |||||
1096 | if (r >= 0) { | ||||
1097 | int q; | ||||
1098 | |||||
1099 | q = bus_attach_io_events(b); | ||||
1100 | if (q < 0) | ||||
1101 | return q; | ||||
1102 | |||||
1103 | q = bus_attach_inotify_event(b); | ||||
1104 | if (q < 0) | ||||
1105 | return q; | ||||
1106 | |||||
1107 | return r; | ||||
1108 | } | ||||
1109 | |||||
1110 | b->last_connect_error = -r; | ||||
1111 | |||||
1112 | next: | ||||
1113 | r = bus_parse_next_address(b); | ||||
1114 | if (r < 0) | ||||
1115 | return r; | ||||
1116 | if (r == 0) | ||||
1117 | return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED111; | ||||
1118 | } | ||||
1119 | } | ||||
1120 | |||||
1121 | int bus_next_address(sd_bus *b) { | ||||
1122 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1122, __PRETTY_FUNCTION__); } while (0); | ||||
1123 | |||||
1124 | bus_reset_parsed_address(b); | ||||
1125 | return bus_start_address(b); | ||||
1126 | } | ||||
1127 | |||||
1128 | static int bus_start_fd(sd_bus *b) { | ||||
1129 | struct stat st; | ||||
1130 | int r; | ||||
1131 | |||||
1132 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1132, __PRETTY_FUNCTION__); } while (0); | ||||
1133 | assert(b->input_fd >= 0)do { if ((__builtin_expect(!!(!(b->input_fd >= 0)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("b->input_fd >= 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 1133, __PRETTY_FUNCTION__ ); } while (0); | ||||
1134 | assert(b->output_fd >= 0)do { if ((__builtin_expect(!!(!(b->output_fd >= 0)),0)) ) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("b->output_fd >= 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 1134, __PRETTY_FUNCTION__ ); } while (0); | ||||
1135 | |||||
1136 | r = fd_nonblock(b->input_fd, true1); | ||||
1137 | if (r < 0) | ||||
1138 | return r; | ||||
1139 | |||||
1140 | r = fd_cloexec(b->input_fd, true1); | ||||
1141 | if (r < 0) | ||||
1142 | return r; | ||||
1143 | |||||
1144 | if (b->input_fd != b->output_fd) { | ||||
1145 | r = fd_nonblock(b->output_fd, true1); | ||||
1146 | if (r < 0) | ||||
1147 | return r; | ||||
1148 | |||||
1149 | r = fd_cloexec(b->output_fd, true1); | ||||
1150 | if (r < 0) | ||||
1151 | return r; | ||||
1152 | } | ||||
1153 | |||||
1154 | if (fstat(b->input_fd, &st) < 0) | ||||
1155 | return -errno(*__errno_location ()); | ||||
1156 | |||||
1157 | return bus_socket_take_fd(b); | ||||
1158 | } | ||||
1159 | |||||
1160 | _public___attribute__ ((visibility("default"))) int sd_bus_start(sd_bus *bus) { | ||||
1161 | int r; | ||||
1162 | |||||
1163 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1163, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1164 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 1164, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
1165 | assert_return(bus->state == BUS_UNSET, -EPERM)do { if (!(((__builtin_expect(!!(bus->state == BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state == BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 1165, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
1166 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1166, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1167 | |||||
1168 | bus_set_state(bus, BUS_OPENING); | ||||
1169 | |||||
1170 | if (bus->is_server && bus->bus_client) | ||||
1171 | return -EINVAL22; | ||||
1172 | |||||
1173 | if (bus->input_fd >= 0) | ||||
1174 | r = bus_start_fd(bus); | ||||
1175 | else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC0 || bus->exec_path || bus->machine) | ||||
1176 | r = bus_start_address(bus); | ||||
1177 | else | ||||
1178 | return -EINVAL22; | ||||
1179 | |||||
1180 | if (r < 0) { | ||||
1181 | sd_bus_close(bus); | ||||
1182 | return r; | ||||
1183 | } | ||||
1184 | |||||
1185 | return bus_send_hello(bus); | ||||
1186 | } | ||||
1187 | |||||
1188 | _public___attribute__ ((visibility("default"))) int sd_bus_open_with_description(sd_bus **ret, const char *description) { | ||||
1189 | const char *e; | ||||
1190 | _cleanup_(bus_freep)__attribute__((cleanup(bus_freep))) sd_bus *b = NULL((void*)0); | ||||
1191 | int r; | ||||
1192 | |||||
1193 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 1193, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1194 | |||||
1195 | /* Let's connect to the starter bus if it is set, and | ||||
1196 | * otherwise to the bus that is appropropriate for the scope | ||||
1197 | * we are running in */ | ||||
1198 | |||||
1199 | e = secure_getenv("DBUS_STARTER_BUS_TYPE"); | ||||
1200 | if (e) { | ||||
1201 | if (streq(e, "system")(strcmp((e),("system")) == 0)) | ||||
1202 | return sd_bus_open_system_with_description(ret, description); | ||||
1203 | else if (STR_IN_SET(e, "session", "user")(!!strv_find((((char**) ((const char*[]) { "session", "user", ((void*)0) }))), (e)))) | ||||
1204 | return sd_bus_open_user_with_description(ret, description); | ||||
1205 | } | ||||
1206 | |||||
1207 | e = secure_getenv("DBUS_STARTER_ADDRESS"); | ||||
1208 | if (!e) { | ||||
1209 | if (cg_pid_get_owner_uid(0, NULL((void*)0)) >= 0) | ||||
1210 | return sd_bus_open_user_with_description(ret, description); | ||||
1211 | else | ||||
1212 | return sd_bus_open_system_with_description(ret, description); | ||||
1213 | } | ||||
1214 | |||||
1215 | r = sd_bus_new(&b); | ||||
1216 | if (r < 0) | ||||
1217 | return r; | ||||
1218 | |||||
1219 | r = sd_bus_set_address(b, e); | ||||
1220 | if (r < 0) | ||||
1221 | return r; | ||||
1222 | |||||
1223 | b->bus_client = true1; | ||||
1224 | |||||
1225 | /* We don't know whether the bus is trusted or not, so better | ||||
1226 | * be safe, and authenticate everything */ | ||||
1227 | b->trusted = false0; | ||||
1228 | b->is_local = false0; | ||||
1229 | b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS; | ||||
1230 | |||||
1231 | r = sd_bus_start(b); | ||||
1232 | if (r < 0) | ||||
1233 | return r; | ||||
1234 | |||||
1235 | *ret = TAKE_PTR(b)({ typeof(b) _ptr_ = (b); (b) = ((void*)0); _ptr_; }); | ||||
1236 | return 0; | ||||
1237 | } | ||||
1238 | |||||
1239 | _public___attribute__ ((visibility("default"))) int sd_bus_open(sd_bus **ret) { | ||||
1240 | return sd_bus_open_with_description(ret, NULL((void*)0)); | ||||
1241 | } | ||||
1242 | |||||
1243 | int bus_set_address_system(sd_bus *b) { | ||||
1244 | const char *e; | ||||
1245 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1245, __PRETTY_FUNCTION__); } while (0); | ||||
1246 | |||||
1247 | e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS"); | ||||
1248 | if (e) | ||||
1249 | return sd_bus_set_address(b, e); | ||||
1250 | |||||
1251 | return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS"unix:path=/run/dbus/system_bus_socket"); | ||||
1252 | } | ||||
1253 | |||||
1254 | _public___attribute__ ((visibility("default"))) int sd_bus_open_system_with_description(sd_bus **ret, const char *description) { | ||||
1255 | _cleanup_(bus_freep)__attribute__((cleanup(bus_freep))) sd_bus *b = NULL((void*)0); | ||||
1256 | int r; | ||||
1257 | |||||
1258 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 1258, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1259 | |||||
1260 | r = sd_bus_new(&b); | ||||
1261 | if (r < 0) | ||||
1262 | return r; | ||||
1263 | |||||
1264 | if (description) { | ||||
1265 | r = sd_bus_set_description(b, description); | ||||
1266 | if (r < 0) | ||||
1267 | return r; | ||||
1268 | } | ||||
1269 | |||||
1270 | r = bus_set_address_system(b); | ||||
1271 | if (r < 0) | ||||
1272 | return r; | ||||
1273 | |||||
1274 | b->bus_client = true1; | ||||
1275 | b->is_system = true1; | ||||
1276 | |||||
1277 | /* Let's do per-method access control on the system bus. We | ||||
1278 | * need the caller's UID and capability set for that. */ | ||||
1279 | b->trusted = false0; | ||||
1280 | b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS; | ||||
1281 | b->is_local = true1; | ||||
1282 | |||||
1283 | r = sd_bus_start(b); | ||||
1284 | if (r < 0) | ||||
1285 | return r; | ||||
1286 | |||||
1287 | *ret = TAKE_PTR(b)({ typeof(b) _ptr_ = (b); (b) = ((void*)0); _ptr_; }); | ||||
1288 | return 0; | ||||
1289 | } | ||||
1290 | |||||
1291 | _public___attribute__ ((visibility("default"))) int sd_bus_open_system(sd_bus **ret) { | ||||
1292 | return sd_bus_open_system_with_description(ret, NULL((void*)0)); | ||||
1293 | } | ||||
1294 | |||||
1295 | int bus_set_address_user(sd_bus *b) { | ||||
1296 | const char *e; | ||||
1297 | _cleanup_free___attribute__((cleanup(freep))) char *ee = NULL((void*)0), *s = NULL((void*)0); | ||||
1298 | |||||
1299 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1299, __PRETTY_FUNCTION__); } while (0); | ||||
1300 | |||||
1301 | e = secure_getenv("DBUS_SESSION_BUS_ADDRESS"); | ||||
1302 | if (e) | ||||
1303 | return sd_bus_set_address(b, e); | ||||
1304 | |||||
1305 | e = secure_getenv("XDG_RUNTIME_DIR"); | ||||
1306 | if (!e) | ||||
1307 | return -ENOENT2; | ||||
1308 | |||||
1309 | ee = bus_address_escape(e); | ||||
1310 | if (!ee) | ||||
1311 | return -ENOMEM12; | ||||
1312 | |||||
1313 | if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT"unix:path=%s/bus", ee) < 0) | ||||
1314 | return -ENOMEM12; | ||||
1315 | |||||
1316 | b->address = TAKE_PTR(s)({ typeof(s) _ptr_ = (s); (s) = ((void*)0); _ptr_; }); | ||||
1317 | |||||
1318 | return 0; | ||||
1319 | } | ||||
1320 | |||||
1321 | _public___attribute__ ((visibility("default"))) int sd_bus_open_user_with_description(sd_bus **ret, const char *description) { | ||||
1322 | _cleanup_(bus_freep)__attribute__((cleanup(bus_freep))) sd_bus *b = NULL((void*)0); | ||||
1323 | int r; | ||||
1324 | |||||
1325 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 1325, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1326 | |||||
1327 | r = sd_bus_new(&b); | ||||
1328 | if (r < 0) | ||||
1329 | return r; | ||||
1330 | |||||
1331 | if (description) { | ||||
1332 | r = sd_bus_set_description(b, description); | ||||
1333 | if (r < 0) | ||||
1334 | return r; | ||||
1335 | } | ||||
1336 | |||||
1337 | r = bus_set_address_user(b); | ||||
1338 | if (r < 0) | ||||
1339 | return r; | ||||
1340 | |||||
1341 | b->bus_client = true1; | ||||
1342 | b->is_user = true1; | ||||
1343 | |||||
1344 | /* We don't do any per-method access control on the user bus. */ | ||||
1345 | b->trusted = true1; | ||||
1346 | b->is_local = true1; | ||||
1347 | |||||
1348 | r = sd_bus_start(b); | ||||
1349 | if (r < 0) | ||||
1350 | return r; | ||||
1351 | |||||
1352 | *ret = TAKE_PTR(b)({ typeof(b) _ptr_ = (b); (b) = ((void*)0); _ptr_; }); | ||||
1353 | return 0; | ||||
1354 | } | ||||
1355 | |||||
1356 | _public___attribute__ ((visibility("default"))) int sd_bus_open_user(sd_bus **ret) { | ||||
1357 | return sd_bus_open_user_with_description(ret, NULL((void*)0)); | ||||
1358 | } | ||||
1359 | |||||
1360 | int bus_set_address_system_remote(sd_bus *b, const char *host) { | ||||
1361 | _cleanup_free___attribute__((cleanup(freep))) char *e = NULL((void*)0); | ||||
1362 | char *m = NULL((void*)0), *c = NULL((void*)0), *a; | ||||
1363 | |||||
1364 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1364, __PRETTY_FUNCTION__); } while (0); | ||||
1365 | assert(host)do { if ((__builtin_expect(!!(!(host)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("host"), "../src/libsystemd/sd-bus/sd-bus.c" , 1365, __PRETTY_FUNCTION__); } while (0); | ||||
1366 | |||||
1367 | /* Let's see if we shall enter some container */ | ||||
1368 | m = strchr(host, ':'); | ||||
1369 | if (m) { | ||||
1370 | m++; | ||||
1371 | |||||
1372 | /* Let's make sure this is not a port of some kind, | ||||
1373 | * and is a valid machine name. */ | ||||
1374 | if (!in_charset(m, DIGITS"0123456789") && machine_name_is_valid(m)hostname_is_valid(m, 0)) { | ||||
1375 | char *t; | ||||
1376 | |||||
1377 | /* Cut out the host part */ | ||||
1378 | t = strndupa(host, m - host - 1)(__extension__ ({ const char *__old = (host); size_t __len = strnlen (__old, (m - host - 1)); char *__new = (char *) __builtin_alloca (__len + 1); __new[__len] = '\0'; (char *) memcpy (__new, __old , __len); })); | ||||
1379 | e = bus_address_escape(t); | ||||
1380 | if (!e) | ||||
1381 | return -ENOMEM12; | ||||
1382 | |||||
1383 | c = strjoina(",argv5=--machine=", m)({ const char *_appendees_[] = { ",argv5=--machine=", m }; char *_d_, *_p_; size_t _len_ = 0; size_t _i_; for (_i_ = 0; _i_ < __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p (typeof(_appendees_), typeof(&*(_appendees_))), sizeof(_appendees_ )/sizeof((_appendees_)[0]), ((void)0))) && _appendees_ [_i_]; _i_++) _len_ += strlen(_appendees_[_i_]); _p_ = _d_ = __builtin_alloca (_len_ + 1); for (_i_ = 0; _i_ < __extension__ (__builtin_choose_expr ( !__builtin_types_compatible_p(typeof(_appendees_), typeof(& *(_appendees_))), sizeof(_appendees_)/sizeof((_appendees_)[0] ), ((void)0))) && _appendees_[_i_]; _i_++) _p_ = stpcpy (_p_, _appendees_[_i_]); *_p_ = 0; _d_; }); | ||||
1384 | } | ||||
1385 | } | ||||
1386 | |||||
1387 | if (!e) { | ||||
1388 | e = bus_address_escape(host); | ||||
1389 | if (!e) | ||||
1390 | return -ENOMEM12; | ||||
1391 | } | ||||
1392 | |||||
1393 | a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c)strjoin_real(("unixexec:path=ssh,argv1=-xT,argv2=--,argv3="), e, ",argv4=systemd-stdio-bridge", c, ((void*)0)); | ||||
1394 | if (!a) | ||||
1395 | return -ENOMEM12; | ||||
1396 | |||||
1397 | return free_and_replace(b->address, a)({ free(b->address); (b->address) = (a); (a) = ((void*) 0); 0; }); | ||||
1398 | } | ||||
1399 | |||||
1400 | _public___attribute__ ((visibility("default"))) int sd_bus_open_system_remote(sd_bus **ret, const char *host) { | ||||
1401 | _cleanup_(bus_freep)__attribute__((cleanup(bus_freep))) sd_bus *b = NULL((void*)0); | ||||
1402 | int r; | ||||
1403 | |||||
1404 | assert_return(host, -EINVAL)do { if (!(((__builtin_expect(!!(host),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("host"), "../src/libsystemd/sd-bus/sd-bus.c" , 1404, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1405 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 1405, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1406 | |||||
1407 | r = sd_bus_new(&b); | ||||
1408 | if (r < 0) | ||||
1409 | return r; | ||||
1410 | |||||
1411 | r = bus_set_address_system_remote(b, host); | ||||
1412 | if (r < 0) | ||||
1413 | return r; | ||||
1414 | |||||
1415 | b->bus_client = true1; | ||||
1416 | b->trusted = false0; | ||||
1417 | b->is_system = true1; | ||||
1418 | b->is_local = false0; | ||||
1419 | |||||
1420 | r = sd_bus_start(b); | ||||
1421 | if (r < 0) | ||||
1422 | return r; | ||||
1423 | |||||
1424 | *ret = TAKE_PTR(b)({ typeof(b) _ptr_ = (b); (b) = ((void*)0); _ptr_; }); | ||||
1425 | return 0; | ||||
1426 | } | ||||
1427 | |||||
1428 | int bus_set_address_system_machine(sd_bus *b, const char *machine) { | ||||
1429 | _cleanup_free___attribute__((cleanup(freep))) char *e = NULL((void*)0); | ||||
1430 | char *a; | ||||
1431 | |||||
1432 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1432, __PRETTY_FUNCTION__); } while (0); | ||||
1433 | assert(machine)do { if ((__builtin_expect(!!(!(machine)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("machine"), "../src/libsystemd/sd-bus/sd-bus.c" , 1433, __PRETTY_FUNCTION__); } while (0); | ||||
1434 | |||||
1435 | e = bus_address_escape(machine); | ||||
1436 | if (!e) | ||||
1437 | return -ENOMEM12; | ||||
1438 | |||||
1439 | a = strjoin("x-machine-unix:machine=", e)strjoin_real(("x-machine-unix:machine="), e, ((void*)0)); | ||||
1440 | if (!a) | ||||
1441 | return -ENOMEM12; | ||||
1442 | |||||
1443 | return free_and_replace(b->address, a)({ free(b->address); (b->address) = (a); (a) = ((void*) 0); 0; }); | ||||
1444 | } | ||||
1445 | |||||
1446 | _public___attribute__ ((visibility("default"))) int sd_bus_open_system_machine(sd_bus **ret, const char *machine) { | ||||
1447 | _cleanup_(bus_freep)__attribute__((cleanup(bus_freep))) sd_bus *b = NULL((void*)0); | ||||
1448 | int r; | ||||
1449 | |||||
1450 | assert_return(machine, -EINVAL)do { if (!(((__builtin_expect(!!(machine),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("machine"), "../src/libsystemd/sd-bus/sd-bus.c" , 1450, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1451 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 1451, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1452 | assert_return(streq(machine, ".host") || machine_name_is_valid(machine), -EINVAL)do { if (!(((__builtin_expect(!!((strcmp((machine),(".host")) == 0) || hostname_is_valid(machine, 0)),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("streq(machine, \".host\") || machine_name_is_valid(machine)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1452, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
1453 | |||||
1454 | r = sd_bus_new(&b); | ||||
1455 | if (r < 0) | ||||
1456 | return r; | ||||
1457 | |||||
1458 | r = bus_set_address_system_machine(b, machine); | ||||
1459 | if (r < 0) | ||||
1460 | return r; | ||||
1461 | |||||
1462 | b->bus_client = true1; | ||||
1463 | b->trusted = false0; | ||||
1464 | b->is_system = true1; | ||||
1465 | b->is_local = false0; | ||||
1466 | |||||
1467 | r = sd_bus_start(b); | ||||
1468 | if (r < 0) | ||||
1469 | return r; | ||||
1470 | |||||
1471 | *ret = TAKE_PTR(b)({ typeof(b) _ptr_ = (b); (b) = ((void*)0); _ptr_; }); | ||||
1472 | return 0; | ||||
1473 | } | ||||
1474 | |||||
1475 | _public___attribute__ ((visibility("default"))) void sd_bus_close(sd_bus *bus) { | ||||
1476 | if (!bus) | ||||
1477 | return; | ||||
1478 | if (bus->state == BUS_CLOSED) | ||||
1479 | return; | ||||
1480 | if (bus_pid_changed(bus)) | ||||
1481 | return; | ||||
1482 | |||||
1483 | /* Don't leave ssh hanging around */ | ||||
1484 | bus_kill_exec(bus); | ||||
1485 | |||||
1486 | bus_set_state(bus, BUS_CLOSED); | ||||
1487 | |||||
1488 | sd_bus_detach_event(bus); | ||||
1489 | |||||
1490 | /* Drop all queued messages so that they drop references to | ||||
1491 | * the bus object and the bus may be freed */ | ||||
1492 | bus_reset_queues(bus); | ||||
1493 | |||||
1494 | bus_close_io_fds(bus); | ||||
1495 | bus_close_inotify_fd(bus); | ||||
1496 | } | ||||
1497 | |||||
1498 | _public___attribute__ ((visibility("default"))) sd_bus* sd_bus_flush_close_unref(sd_bus *bus) { | ||||
1499 | if (!bus
| ||||
1500 | return NULL((void*)0); | ||||
1501 | |||||
1502 | /* Have to do this before flush() to prevent hang */ | ||||
1503 | bus_kill_exec(bus); | ||||
1504 | |||||
1505 | sd_bus_flush(bus); | ||||
1506 | sd_bus_close(bus); | ||||
1507 | |||||
1508 | return sd_bus_unref(bus); | ||||
1509 | } | ||||
1510 | |||||
1511 | void bus_enter_closing(sd_bus *bus) { | ||||
1512 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1512, __PRETTY_FUNCTION__); } while (0); | ||||
1513 | |||||
1514 | if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING , BUS_HELLO, BUS_RUNNING})/sizeof(int)]; switch(bus->state ) { case BUS_WATCH_BIND: case BUS_OPENING: case BUS_AUTHENTICATING : case BUS_HELLO: case BUS_RUNNING: _found = 1; break; default : break; } _found; })) | ||||
1515 | return; | ||||
1516 | |||||
1517 | bus_set_state(bus, BUS_CLOSING); | ||||
1518 | } | ||||
1519 | |||||
1520 | _public___attribute__ ((visibility("default"))) sd_bus *sd_bus_ref(sd_bus *bus) { | ||||
1521 | if (!bus) | ||||
1522 | return NULL((void*)0); | ||||
1523 | |||||
1524 | assert_se(REFCNT_INC(bus->n_ref) >= 2)do { if ((__builtin_expect(!!(!((__sync_add_and_fetch(&(bus ->n_ref)._value, 1)) >= 2)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("REFCNT_INC(bus->n_ref) >= 2"), "../src/libsystemd/sd-bus/sd-bus.c" , 1524, __PRETTY_FUNCTION__); } while (0); | ||||
1525 | |||||
1526 | return bus; | ||||
1527 | } | ||||
1528 | |||||
1529 | _public___attribute__ ((visibility("default"))) sd_bus *sd_bus_unref(sd_bus *bus) { | ||||
1530 | unsigned i; | ||||
1531 | |||||
1532 | if (!bus
| ||||
1533 | return NULL((void*)0); | ||||
1534 | |||||
1535 | i = REFCNT_DEC(bus->n_ref)(__sync_sub_and_fetch(&(bus->n_ref)._value, 1)); | ||||
1536 | if (i > 0) | ||||
1537 | return NULL((void*)0); | ||||
1538 | |||||
1539 | return bus_free(bus); | ||||
1540 | } | ||||
1541 | |||||
1542 | _public___attribute__ ((visibility("default"))) int sd_bus_is_open(sd_bus *bus) { | ||||
1543 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1543, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1544 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 1544, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
1545 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1545, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1546 | |||||
1547 | return BUS_IS_OPEN(bus->state); | ||||
1548 | } | ||||
1549 | |||||
1550 | _public___attribute__ ((visibility("default"))) int sd_bus_is_ready(sd_bus *bus) { | ||||
1551 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1551, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1552 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 1552, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
1553 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1553, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1554 | |||||
1555 | return bus->state == BUS_RUNNING; | ||||
1556 | } | ||||
1557 | |||||
1558 | _public___attribute__ ((visibility("default"))) int sd_bus_can_send(sd_bus *bus, char type) { | ||||
1559 | int r; | ||||
1560 | |||||
1561 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1561, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1562 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 1562, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
1563 | assert_return(bus->state != BUS_UNSET, -ENOTCONN)do { if (!(((__builtin_expect(!!(bus->state != BUS_UNSET), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->state != BUS_UNSET"), "../src/libsystemd/sd-bus/sd-bus.c" , 1563, __PRETTY_FUNCTION__), 0))) return (-107); } while (0); | ||||
1564 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1564, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1565 | |||||
1566 | if (bus->is_monitor) | ||||
1567 | return 0; | ||||
1568 | |||||
1569 | if (type == SD_BUS_TYPE_UNIX_FD) { | ||||
1570 | if (!bus->accept_fd) | ||||
1571 | return 0; | ||||
1572 | |||||
1573 | r = bus_ensure_running(bus); | ||||
1574 | if (r < 0) | ||||
1575 | return r; | ||||
1576 | |||||
1577 | return bus->can_fds; | ||||
1578 | } | ||||
1579 | |||||
1580 | return bus_type_is_valid(type); | ||||
1581 | } | ||||
1582 | |||||
1583 | _public___attribute__ ((visibility("default"))) int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) { | ||||
1584 | int r; | ||||
1585 | |||||
1586 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1586, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1587 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 1587, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
1588 | assert_return(id, -EINVAL)do { if (!(((__builtin_expect(!!(id),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("id"), "../src/libsystemd/sd-bus/sd-bus.c" , 1588, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1589 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1589, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1590 | |||||
1591 | r = bus_ensure_running(bus); | ||||
1592 | if (r < 0) | ||||
1593 | return r; | ||||
1594 | |||||
1595 | *id = bus->server_id; | ||||
1596 | return 0; | ||||
1597 | } | ||||
1598 | |||||
1599 | #define COOKIE_CYCLED(1U << 31) (UINT32_C(1)1U << 31) | ||||
1600 | |||||
1601 | static uint64_t cookie_inc(uint64_t cookie) { | ||||
1602 | |||||
1603 | /* Stay within the 32bit range, since classic D-Bus can't deal with more */ | ||||
1604 | if (cookie >= UINT32_MAX(4294967295U)) | ||||
1605 | return COOKIE_CYCLED(1U << 31); /* Don't go back to zero, but use the highest bit for checking | ||||
1606 | * whether we are looping. */ | ||||
1607 | |||||
1608 | return cookie + 1; | ||||
1609 | } | ||||
1610 | |||||
1611 | static int next_cookie(sd_bus *b) { | ||||
1612 | uint64_t new_cookie; | ||||
1613 | |||||
1614 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1614, __PRETTY_FUNCTION__); } while (0); | ||||
1615 | |||||
1616 | new_cookie = cookie_inc(b->cookie); | ||||
1617 | |||||
1618 | /* Small optimization: don't bother with checking for cookie reuse until we overran cookiespace at | ||||
1619 | * least once, but then do it thorougly. */ | ||||
1620 | if (FLAGS_SET(new_cookie, COOKIE_CYCLED)(((new_cookie) & ((1U << 31))) == ((1U << 31) ))) { | ||||
1621 | uint32_t i; | ||||
1622 | |||||
1623 | /* Check if the cookie is currently in use. If so, pick the next one */ | ||||
1624 | for (i = 0; i < COOKIE_CYCLED(1U << 31); i++) { | ||||
1625 | if (!ordered_hashmap_contains(b->reply_callbacks, &new_cookie)) | ||||
1626 | goto good; | ||||
1627 | |||||
1628 | new_cookie = cookie_inc(new_cookie); | ||||
1629 | } | ||||
1630 | |||||
1631 | /* Can't fulfill request */ | ||||
1632 | return -EBUSY16; | ||||
1633 | } | ||||
1634 | |||||
1635 | good: | ||||
1636 | b->cookie = new_cookie; | ||||
1637 | return 0; | ||||
1638 | } | ||||
1639 | |||||
1640 | static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) { | ||||
1641 | int r; | ||||
1642 | |||||
1643 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1643, __PRETTY_FUNCTION__); } while (0); | ||||
1644 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1644, __PRETTY_FUNCTION__); } while (0); | ||||
1645 | |||||
1646 | if (m->sealed) { | ||||
1647 | /* If we copy the same message to multiple | ||||
1648 | * destinations, avoid using the same cookie | ||||
1649 | * numbers. */ | ||||
1650 | b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m))__extension__ ({ const typeof((b->cookie)) __unique_prefix_A22 = ((b->cookie)); const typeof((BUS_MESSAGE_COOKIE(m))) __unique_prefix_B23 = ((BUS_MESSAGE_COOKIE(m))); __unique_prefix_A22 > __unique_prefix_B23 ? __unique_prefix_A22 : __unique_prefix_B23; }); | ||||
1651 | return 0; | ||||
1652 | } | ||||
1653 | |||||
1654 | if (timeout == 0) | ||||
1655 | timeout = BUS_DEFAULT_TIMEOUT((usec_t) (25 * ((usec_t) 1000000ULL))); | ||||
1656 | |||||
1657 | if (!m->sender && b->patch_sender) { | ||||
1658 | r = sd_bus_message_set_sender(m, b->patch_sender); | ||||
1659 | if (r < 0) | ||||
1660 | return r; | ||||
1661 | } | ||||
1662 | |||||
1663 | r = next_cookie(b); | ||||
1664 | if (r < 0) | ||||
1665 | return r; | ||||
1666 | |||||
1667 | return sd_bus_message_seal(m, b->cookie, timeout); | ||||
1668 | } | ||||
1669 | |||||
1670 | static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) { | ||||
1671 | bool_Bool remarshal = false0; | ||||
1672 | |||||
1673 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1673, __PRETTY_FUNCTION__); } while (0); | ||||
1674 | |||||
1675 | /* wrong packet version */ | ||||
1676 | if (b->message_version != 0 && b->message_version != (*m)->header->version) | ||||
1677 | remarshal = true1; | ||||
1678 | |||||
1679 | /* wrong packet endianness */ | ||||
1680 | if (b->message_endian != 0 && b->message_endian != (*m)->header->endian) | ||||
1681 | remarshal = true1; | ||||
1682 | |||||
1683 | return remarshal ? bus_message_remarshal(b, m) : 0; | ||||
1684 | } | ||||
1685 | |||||
1686 | int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) { | ||||
1687 | assert(b)do { if ((__builtin_expect(!!(!(b)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 1687, __PRETTY_FUNCTION__); } while (0); | ||||
1688 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1688, __PRETTY_FUNCTION__); } while (0); | ||||
1689 | |||||
1690 | /* Fake some timestamps, if they were requested, and not | ||||
1691 | * already initialized */ | ||||
1692 | if (b->attach_timestamp) { | ||||
1693 | if (m->realtime <= 0) | ||||
1694 | m->realtime = now(CLOCK_REALTIME0); | ||||
1695 | |||||
1696 | if (m->monotonic <= 0) | ||||
1697 | m->monotonic = now(CLOCK_MONOTONIC1); | ||||
1698 | } | ||||
1699 | |||||
1700 | /* The bus specification says the serial number cannot be 0, | ||||
1701 | * hence let's fill something in for synthetic messages. Since | ||||
1702 | * synthetic messages might have a fake sender and we don't | ||||
1703 | * want to interfere with the real sender's serial numbers we | ||||
1704 | * pick a fixed, artificial one. We use (uint32_t) -1 rather | ||||
1705 | * than (uint64_t) -1 since dbus1 only had 32bit identifiers, | ||||
1706 | * even though kdbus can do 64bit. */ | ||||
1707 | return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0); | ||||
1708 | } | ||||
1709 | |||||
1710 | static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) { | ||||
1711 | int r; | ||||
1712 | |||||
1713 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1713, __PRETTY_FUNCTION__); } while (0); | ||||
1714 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1714, __PRETTY_FUNCTION__); } while (0); | ||||
1715 | |||||
1716 | r = bus_socket_write_message(bus, m, idx); | ||||
1717 | if (r <= 0) | ||||
1718 | return r; | ||||
1719 | |||||
1720 | if (*idx >= BUS_MESSAGE_SIZE(m)) | ||||
1721 | log_debug("Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s",({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1722 | bus_message_type_to_string(m->header->type),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1723 | strna(sd_bus_message_get_sender(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1724 | strna(sd_bus_message_get_destination(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1725 | strna(sd_bus_message_get_path(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1726 | strna(sd_bus_message_get_interface(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1727 | strna(sd_bus_message_get_member(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1728 | BUS_MESSAGE_COOKIE(m),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1729 | m->reply_cookie,({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1730 | strna(m->root_container.signature),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1731 | strna(m->error.name),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }) | ||||
1732 | strna(m->error.message))({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 1732, __func__, "Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(m->header->type), strna(sd_bus_message_get_sender (m)), strna(sd_bus_message_get_destination(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m)), BUS_MESSAGE_COOKIE(m), m->reply_cookie, strna(m-> root_container.signature), strna(m->error.name), strna(m-> error.message)) : -abs(_e); }); | ||||
1733 | |||||
1734 | return r; | ||||
1735 | } | ||||
1736 | |||||
1737 | static int dispatch_wqueue(sd_bus *bus) { | ||||
1738 | int r, ret = 0; | ||||
1739 | |||||
1740 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1740, __PRETTY_FUNCTION__); } while (0); | ||||
1741 | assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO))do { if ((__builtin_expect(!!(!(({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){BUS_RUNNING, BUS_HELLO})/sizeof(int)]; switch (bus->state) { case BUS_RUNNING: case BUS_HELLO: _found = 1 ; break; default: break; } _found; }))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("IN_SET(bus->state, BUS_RUNNING, BUS_HELLO)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1741, __PRETTY_FUNCTION__ ); } while (0); | ||||
1742 | |||||
1743 | while (bus->wqueue_size > 0) { | ||||
1744 | |||||
1745 | r = bus_write_message(bus, bus->wqueue[0], &bus->windex); | ||||
1746 | if (r < 0) | ||||
1747 | return r; | ||||
1748 | else if (r == 0) | ||||
1749 | /* Didn't do anything this time */ | ||||
1750 | return ret; | ||||
1751 | else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) { | ||||
1752 | /* Fully written. Let's drop the entry from | ||||
1753 | * the queue. | ||||
1754 | * | ||||
1755 | * This isn't particularly optimized, but | ||||
1756 | * well, this is supposed to be our worst-case | ||||
1757 | * buffer only, and the socket buffer is | ||||
1758 | * supposed to be our primary buffer, and if | ||||
1759 | * it got full, then all bets are off | ||||
1760 | * anyway. */ | ||||
1761 | |||||
1762 | bus->wqueue_size--; | ||||
1763 | bus_message_unref_queued(bus->wqueue[0], bus); | ||||
1764 | memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size); | ||||
1765 | bus->windex = 0; | ||||
1766 | |||||
1767 | ret = 1; | ||||
1768 | } | ||||
1769 | } | ||||
1770 | |||||
1771 | return ret; | ||||
1772 | } | ||||
1773 | |||||
1774 | static int bus_read_message(sd_bus *bus, bool_Bool hint_priority, int64_t priority) { | ||||
1775 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1775, __PRETTY_FUNCTION__); } while (0); | ||||
1776 | |||||
1777 | return bus_socket_read_message(bus); | ||||
1778 | } | ||||
1779 | |||||
1780 | int bus_rqueue_make_room(sd_bus *bus) { | ||||
1781 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1781, __PRETTY_FUNCTION__); } while (0); | ||||
1782 | |||||
1783 | if (bus->rqueue_size >= BUS_RQUEUE_MAX(384*1024)) | ||||
1784 | return -ENOBUFS105; | ||||
1785 | |||||
1786 | if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1)greedy_realloc((void**) &(bus->rqueue), &(bus-> rqueue_allocated), (bus->rqueue_size + 1), sizeof((bus-> rqueue)[0]))) | ||||
1787 | return -ENOMEM12; | ||||
1788 | |||||
1789 | return 0; | ||||
1790 | } | ||||
1791 | |||||
1792 | static void rqueue_drop_one(sd_bus *bus, size_t i) { | ||||
1793 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1793, __PRETTY_FUNCTION__); } while (0); | ||||
1794 | assert(i < bus->rqueue_size)do { if ((__builtin_expect(!!(!(i < bus->rqueue_size)), 0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("i < bus->rqueue_size" ), "../src/libsystemd/sd-bus/sd-bus.c", 1794, __PRETTY_FUNCTION__ ); } while (0); | ||||
1795 | |||||
1796 | bus_message_unref_queued(bus->rqueue[i], bus); | ||||
1797 | memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1)); | ||||
1798 | bus->rqueue_size--; | ||||
1799 | } | ||||
1800 | |||||
1801 | static int dispatch_rqueue(sd_bus *bus, bool_Bool hint_priority, int64_t priority, sd_bus_message **m) { | ||||
1802 | int r, ret = 0; | ||||
1803 | |||||
1804 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1804, __PRETTY_FUNCTION__); } while (0); | ||||
1805 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1805, __PRETTY_FUNCTION__); } while (0); | ||||
1806 | assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO))do { if ((__builtin_expect(!!(!(({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){BUS_RUNNING, BUS_HELLO})/sizeof(int)]; switch (bus->state) { case BUS_RUNNING: case BUS_HELLO: _found = 1 ; break; default: break; } _found; }))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("IN_SET(bus->state, BUS_RUNNING, BUS_HELLO)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1806, __PRETTY_FUNCTION__ ); } while (0); | ||||
1807 | |||||
1808 | /* Note that the priority logic is only available on kdbus, | ||||
1809 | * where the rqueue is unused. We check the rqueue here | ||||
1810 | * anyway, because it's simple... */ | ||||
1811 | |||||
1812 | for (;;) { | ||||
1813 | if (bus->rqueue_size > 0) { | ||||
1814 | /* Dispatch a queued message */ | ||||
1815 | *m = sd_bus_message_ref(bus->rqueue[0]); | ||||
1816 | rqueue_drop_one(bus, 0); | ||||
1817 | return 1; | ||||
1818 | } | ||||
1819 | |||||
1820 | /* Try to read a new message */ | ||||
1821 | r = bus_read_message(bus, hint_priority, priority); | ||||
1822 | if (r < 0) | ||||
1823 | return r; | ||||
1824 | if (r == 0) { | ||||
1825 | *m = NULL((void*)0); | ||||
1826 | return ret; | ||||
1827 | } | ||||
1828 | |||||
1829 | ret = 1; | ||||
1830 | } | ||||
1831 | } | ||||
1832 | |||||
1833 | _public___attribute__ ((visibility("default"))) int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) { | ||||
1834 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = sd_bus_message_ref(_m); | ||||
1835 | int r; | ||||
1836 | |||||
1837 | assert_return(m, -EINVAL)do { if (!(((__builtin_expect(!!(m),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1837, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1838 | |||||
1839 | if (!bus) | ||||
1840 | bus = m->bus; | ||||
1841 | |||||
1842 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1842, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1843 | |||||
1844 | if (!BUS_IS_OPEN(bus->state)) | ||||
1845 | return -ENOTCONN107; | ||||
1846 | |||||
1847 | if (m->n_fds > 0) { | ||||
1848 | r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD); | ||||
1849 | if (r < 0) | ||||
1850 | return r; | ||||
1851 | if (r == 0) | ||||
1852 | return -EOPNOTSUPP95; | ||||
1853 | } | ||||
1854 | |||||
1855 | /* If the cookie number isn't kept, then we know that no reply | ||||
1856 | * is expected */ | ||||
1857 | if (!cookie && !m->sealed) | ||||
1858 | m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED; | ||||
1859 | |||||
1860 | r = bus_seal_message(bus, m, 0); | ||||
1861 | if (r < 0) | ||||
1862 | return r; | ||||
1863 | |||||
1864 | /* Remarshall if we have to. This will possibly unref the | ||||
1865 | * message and place a replacement in m */ | ||||
1866 | r = bus_remarshal_message(bus, &m); | ||||
1867 | if (r < 0) | ||||
1868 | return r; | ||||
1869 | |||||
1870 | /* If this is a reply and no reply was requested, then let's | ||||
1871 | * suppress this, if we can */ | ||||
1872 | if (m->dont_send) | ||||
1873 | goto finish; | ||||
1874 | |||||
1875 | if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){BUS_RUNNING, BUS_HELLO})/sizeof(int)]; switch (bus->state) { case BUS_RUNNING: case BUS_HELLO: _found = 1 ; break; default: break; } _found; }) && bus->wqueue_size <= 0) { | ||||
1876 | size_t idx = 0; | ||||
1877 | |||||
1878 | r = bus_write_message(bus, m, &idx); | ||||
1879 | if (r < 0) { | ||||
1880 | if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){-107, -104, -32, -108})/sizeof(int)]; switch (r) { case -107: case -104: case -32: case -108: _found = 1; break ; default: break; } _found; })) { | ||||
1881 | bus_enter_closing(bus); | ||||
1882 | return -ECONNRESET104; | ||||
1883 | } | ||||
1884 | |||||
1885 | return r; | ||||
1886 | } | ||||
1887 | |||||
1888 | if (idx < BUS_MESSAGE_SIZE(m)) { | ||||
1889 | /* Wasn't fully written. So let's remember how | ||||
1890 | * much was written. Note that the first entry | ||||
1891 | * of the wqueue array is always allocated so | ||||
1892 | * that we always can remember how much was | ||||
1893 | * written. */ | ||||
1894 | bus->wqueue[0] = bus_message_ref_queued(m, bus); | ||||
1895 | bus->wqueue_size = 1; | ||||
1896 | bus->windex = idx; | ||||
1897 | } | ||||
1898 | |||||
1899 | } else { | ||||
1900 | /* Just append it to the queue. */ | ||||
1901 | |||||
1902 | if (bus->wqueue_size >= BUS_WQUEUE_MAX(384*1024)) | ||||
1903 | return -ENOBUFS105; | ||||
1904 | |||||
1905 | if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1)greedy_realloc((void**) &(bus->wqueue), &(bus-> wqueue_allocated), (bus->wqueue_size + 1), sizeof((bus-> wqueue)[0]))) | ||||
1906 | return -ENOMEM12; | ||||
1907 | |||||
1908 | bus->wqueue[bus->wqueue_size++] = bus_message_ref_queued(m, bus); | ||||
1909 | } | ||||
1910 | |||||
1911 | finish: | ||||
1912 | if (cookie) | ||||
1913 | *cookie = BUS_MESSAGE_COOKIE(m); | ||||
1914 | |||||
1915 | return 1; | ||||
1916 | } | ||||
1917 | |||||
1918 | _public___attribute__ ((visibility("default"))) int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) { | ||||
1919 | int r; | ||||
1920 | |||||
1921 | assert_return(m, -EINVAL)do { if (!(((__builtin_expect(!!(m),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1921, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1922 | |||||
1923 | if (!bus) | ||||
1924 | bus = m->bus; | ||||
1925 | |||||
1926 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1926, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1927 | |||||
1928 | if (!BUS_IS_OPEN(bus->state)) | ||||
1929 | return -ENOTCONN107; | ||||
1930 | |||||
1931 | if (!streq_ptr(m->destination, destination)) { | ||||
1932 | |||||
1933 | if (!destination) | ||||
1934 | return -EEXIST17; | ||||
1935 | |||||
1936 | r = sd_bus_message_set_destination(m, destination); | ||||
1937 | if (r < 0) | ||||
1938 | return r; | ||||
1939 | } | ||||
1940 | |||||
1941 | return sd_bus_send(bus, m, cookie); | ||||
1942 | } | ||||
1943 | |||||
1944 | static usec_t calc_elapse(sd_bus *bus, uint64_t usec) { | ||||
1945 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 1945, __PRETTY_FUNCTION__); } while (0); | ||||
1946 | |||||
1947 | if (usec == (uint64_t) -1) | ||||
1948 | return 0; | ||||
1949 | |||||
1950 | /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel | ||||
1951 | * with any connection setup states. Hence, if a method callback is started earlier than that we just store the | ||||
1952 | * relative timestamp, and afterwards the absolute one. */ | ||||
1953 | |||||
1954 | if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING })/sizeof(int)]; switch(bus->state) { case BUS_WATCH_BIND: case BUS_OPENING: case BUS_AUTHENTICATING: _found = 1; break ; default: break; } _found; })) | ||||
1955 | return usec; | ||||
1956 | else | ||||
1957 | return now(CLOCK_MONOTONIC1) + usec; | ||||
1958 | } | ||||
1959 | |||||
1960 | static int timeout_compare(const void *a, const void *b) { | ||||
1961 | const struct reply_callback *x = a, *y = b; | ||||
1962 | |||||
1963 | if (x->timeout_usec != 0 && y->timeout_usec == 0) | ||||
1964 | return -1; | ||||
1965 | |||||
1966 | if (x->timeout_usec == 0 && y->timeout_usec != 0) | ||||
1967 | return 1; | ||||
1968 | |||||
1969 | if (x->timeout_usec < y->timeout_usec) | ||||
1970 | return -1; | ||||
1971 | |||||
1972 | if (x->timeout_usec > y->timeout_usec) | ||||
1973 | return 1; | ||||
1974 | |||||
1975 | return 0; | ||||
1976 | } | ||||
1977 | |||||
1978 | _public___attribute__ ((visibility("default"))) int sd_bus_call_async( | ||||
1979 | sd_bus *bus, | ||||
1980 | sd_bus_slot **slot, | ||||
1981 | sd_bus_message *_m, | ||||
1982 | sd_bus_message_handler_t callback, | ||||
1983 | void *userdata, | ||||
1984 | uint64_t usec) { | ||||
1985 | |||||
1986 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = sd_bus_message_ref(_m); | ||||
1987 | _cleanup_(sd_bus_slot_unrefp)__attribute__((cleanup(sd_bus_slot_unrefp))) sd_bus_slot *s = NULL((void*)0); | ||||
1988 | int r; | ||||
1989 | |||||
1990 | assert_return(m, -EINVAL)do { if (!(((__builtin_expect(!!(m),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 1990, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1991 | assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL)do { if (!(((__builtin_expect(!!(m->header->type == SD_BUS_MESSAGE_METHOD_CALL ),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("m->header->type == SD_BUS_MESSAGE_METHOD_CALL"), "../src/libsystemd/sd-bus/sd-bus.c" , 1991, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
1992 | assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL)do { if (!(((__builtin_expect(!!(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED ))),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED))" ), "../src/libsystemd/sd-bus/sd-bus.c", 1992, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
1993 | |||||
1994 | if (!bus) | ||||
1995 | bus = m->bus; | ||||
1996 | |||||
1997 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 1997, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
1998 | |||||
1999 | if (!BUS_IS_OPEN(bus->state)) | ||||
2000 | return -ENOTCONN107; | ||||
2001 | |||||
2002 | /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */ | ||||
2003 | if (!callback && !slot && !m->sealed) | ||||
2004 | m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED; | ||||
2005 | |||||
2006 | r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops)internal_ordered_hashmap_ensure_allocated(&bus->reply_callbacks , &uint64_hash_ops ); | ||||
2007 | if (r < 0) | ||||
2008 | return r; | ||||
2009 | |||||
2010 | r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare); | ||||
2011 | if (r < 0) | ||||
2012 | return r; | ||||
2013 | |||||
2014 | r = bus_seal_message(bus, m, usec); | ||||
2015 | if (r < 0) | ||||
2016 | return r; | ||||
2017 | |||||
2018 | r = bus_remarshal_message(bus, &m); | ||||
2019 | if (r < 0) | ||||
2020 | return r; | ||||
2021 | |||||
2022 | if (slot || callback) { | ||||
2023 | s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata); | ||||
2024 | if (!s) | ||||
2025 | return -ENOMEM12; | ||||
2026 | |||||
2027 | s->reply_callback.callback = callback; | ||||
2028 | |||||
2029 | s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m); | ||||
2030 | r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback); | ||||
2031 | if (r < 0) { | ||||
2032 | s->reply_callback.cookie = 0; | ||||
2033 | return r; | ||||
2034 | } | ||||
2035 | |||||
2036 | s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout); | ||||
2037 | if (s->reply_callback.timeout_usec != 0) { | ||||
2038 | r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx); | ||||
2039 | if (r < 0) { | ||||
2040 | s->reply_callback.timeout_usec = 0; | ||||
2041 | return r; | ||||
2042 | } | ||||
2043 | } | ||||
2044 | } | ||||
2045 | |||||
2046 | r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL((void*)0)); | ||||
2047 | if (r < 0) | ||||
2048 | return r; | ||||
2049 | |||||
2050 | if (slot) | ||||
2051 | *slot = s; | ||||
2052 | s = NULL((void*)0); | ||||
2053 | |||||
2054 | return r; | ||||
2055 | } | ||||
2056 | |||||
2057 | int bus_ensure_running(sd_bus *bus) { | ||||
2058 | int r; | ||||
2059 | |||||
2060 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2060, __PRETTY_FUNCTION__); } while (0); | ||||
2061 | |||||
2062 | if (bus->state == BUS_RUNNING) | ||||
2063 | return 1; | ||||
2064 | |||||
2065 | for (;;) { | ||||
2066 | if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){BUS_UNSET, BUS_CLOSED, BUS_CLOSING})/sizeof (int)]; switch(bus->state) { case BUS_UNSET: case BUS_CLOSED : case BUS_CLOSING: _found = 1; break; default: break; } _found ; })) | ||||
2067 | return -ENOTCONN107; | ||||
2068 | |||||
2069 | r = sd_bus_process(bus, NULL((void*)0)); | ||||
2070 | if (r < 0) | ||||
2071 | return r; | ||||
2072 | if (bus->state == BUS_RUNNING) | ||||
2073 | return 1; | ||||
2074 | if (r > 0) | ||||
2075 | continue; | ||||
2076 | |||||
2077 | r = sd_bus_wait(bus, (uint64_t) -1); | ||||
2078 | if (r < 0) | ||||
2079 | return r; | ||||
2080 | } | ||||
2081 | } | ||||
2082 | |||||
2083 | _public___attribute__ ((visibility("default"))) int sd_bus_call( | ||||
2084 | sd_bus *bus, | ||||
2085 | sd_bus_message *_m, | ||||
2086 | uint64_t usec, | ||||
2087 | sd_bus_error *error, | ||||
2088 | sd_bus_message **reply) { | ||||
2089 | |||||
2090 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = sd_bus_message_ref(_m); | ||||
2091 | usec_t timeout; | ||||
2092 | uint64_t cookie; | ||||
2093 | size_t i; | ||||
2094 | int r; | ||||
2095 | |||||
2096 | bus_assert_return(m, -EINVAL, error)do { if (!(((__builtin_expect(!!(m),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2096, __PRETTY_FUNCTION__), 0))) return sd_bus_error_set_errno (error, -22); } while (0); | ||||
2097 | bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error)do { if (!(((__builtin_expect(!!(m->header->type == SD_BUS_MESSAGE_METHOD_CALL ),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("m->header->type == SD_BUS_MESSAGE_METHOD_CALL"), "../src/libsystemd/sd-bus/sd-bus.c" , 2097, __PRETTY_FUNCTION__), 0))) return sd_bus_error_set_errno (error, -22); } while (0); | ||||
2098 | bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error)do { if (!(((__builtin_expect(!!(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2098, __PRETTY_FUNCTION__ ), 0))) return sd_bus_error_set_errno(error, -22); } while (0 ); | ||||
2099 | bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error)do { if (!(((__builtin_expect(!!(!bus_error_is_dirty(error)), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("!bus_error_is_dirty(error)"), "../src/libsystemd/sd-bus/sd-bus.c" , 2099, __PRETTY_FUNCTION__), 0))) return sd_bus_error_set_errno (error, -22); } while (0); | ||||
2100 | |||||
2101 | if (!bus) | ||||
2102 | bus = m->bus; | ||||
2103 | |||||
2104 | bus_assert_return(!bus_pid_changed(bus), -ECHILD, error)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2104, __PRETTY_FUNCTION__ ), 0))) return sd_bus_error_set_errno(error, -10); } while (0 ); | ||||
2105 | |||||
2106 | if (!BUS_IS_OPEN(bus->state)) { | ||||
2107 | r = -ENOTCONN107; | ||||
2108 | goto fail; | ||||
2109 | } | ||||
2110 | |||||
2111 | r = bus_ensure_running(bus); | ||||
2112 | if (r < 0) | ||||
2113 | goto fail; | ||||
2114 | |||||
2115 | i = bus->rqueue_size; | ||||
2116 | |||||
2117 | r = bus_seal_message(bus, m, usec); | ||||
2118 | if (r < 0) | ||||
2119 | goto fail; | ||||
2120 | |||||
2121 | r = bus_remarshal_message(bus, &m); | ||||
2122 | if (r < 0) | ||||
2123 | goto fail; | ||||
2124 | |||||
2125 | r = sd_bus_send(bus, m, &cookie); | ||||
2126 | if (r < 0) | ||||
2127 | goto fail; | ||||
2128 | |||||
2129 | timeout = calc_elapse(bus, m->timeout); | ||||
2130 | |||||
2131 | for (;;) { | ||||
2132 | usec_t left; | ||||
2133 | |||||
2134 | while (i < bus->rqueue_size) { | ||||
2135 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *incoming = NULL((void*)0); | ||||
2136 | |||||
2137 | incoming = sd_bus_message_ref(bus->rqueue[i]); | ||||
2138 | |||||
2139 | if (incoming->reply_cookie == cookie) { | ||||
2140 | /* Found a match! */ | ||||
2141 | |||||
2142 | rqueue_drop_one(bus, i); | ||||
2143 | log_debug_bus_message(incoming)do { sd_bus_message *_mm = (incoming); ({ int _level = (((7)) ), _e = ((0)), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm (_realm) >= ((_level) & 0x07)) ? log_internal_realm((( _realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c" , 2143, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }); } while (0); | ||||
2144 | |||||
2145 | if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) { | ||||
2146 | |||||
2147 | if (incoming->n_fds <= 0 || bus->accept_fd) { | ||||
2148 | if (reply) | ||||
2149 | *reply = TAKE_PTR(incoming)({ typeof(incoming) _ptr_ = (incoming); (incoming) = ((void*) 0); _ptr_; }); | ||||
2150 | |||||
2151 | return 1; | ||||
2152 | } | ||||
2153 | |||||
2154 | return sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE"org.freedesktop.DBus.Error.InconsistentMessage", "Reply message contained file descriptors which I couldn't accept. Sorry."); | ||||
2155 | |||||
2156 | } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) | ||||
2157 | return sd_bus_error_copy(error, &incoming->error); | ||||
2158 | else { | ||||
2159 | r = -EIO5; | ||||
2160 | goto fail; | ||||
2161 | } | ||||
2162 | |||||
2163 | } else if (BUS_MESSAGE_COOKIE(incoming) == cookie && | ||||
2164 | bus->unique_name && | ||||
2165 | incoming->sender && | ||||
2166 | streq(bus->unique_name, incoming->sender)(strcmp((bus->unique_name),(incoming->sender)) == 0)) { | ||||
2167 | |||||
2168 | rqueue_drop_one(bus, i); | ||||
2169 | |||||
2170 | /* Our own message? Somebody is trying to send its own client a message, | ||||
2171 | * let's not dead-lock, let's fail immediately. */ | ||||
2172 | |||||
2173 | r = -ELOOP40; | ||||
2174 | goto fail; | ||||
2175 | } | ||||
2176 | |||||
2177 | /* Try to read more, right-away */ | ||||
2178 | i++; | ||||
2179 | } | ||||
2180 | |||||
2181 | r = bus_read_message(bus, false0, 0); | ||||
2182 | if (r < 0) { | ||||
2183 | if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){-107, -104, -32, -108})/sizeof(int)]; switch (r) { case -107: case -104: case -32: case -108: _found = 1; break ; default: break; } _found; })) { | ||||
2184 | bus_enter_closing(bus); | ||||
2185 | r = -ECONNRESET104; | ||||
2186 | } | ||||
2187 | |||||
2188 | goto fail; | ||||
2189 | } | ||||
2190 | if (r > 0) | ||||
2191 | continue; | ||||
2192 | |||||
2193 | if (timeout > 0) { | ||||
2194 | usec_t n; | ||||
2195 | |||||
2196 | n = now(CLOCK_MONOTONIC1); | ||||
2197 | if (n >= timeout) { | ||||
2198 | r = -ETIMEDOUT110; | ||||
2199 | goto fail; | ||||
2200 | } | ||||
2201 | |||||
2202 | left = timeout - n; | ||||
2203 | } else | ||||
2204 | left = (uint64_t) -1; | ||||
2205 | |||||
2206 | r = bus_poll(bus, true1, left); | ||||
2207 | if (r < 0) | ||||
2208 | goto fail; | ||||
2209 | if (r == 0) { | ||||
2210 | r = -ETIMEDOUT110; | ||||
2211 | goto fail; | ||||
2212 | } | ||||
2213 | |||||
2214 | r = dispatch_wqueue(bus); | ||||
2215 | if (r < 0) { | ||||
2216 | if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){-107, -104, -32, -108})/sizeof(int)]; switch (r) { case -107: case -104: case -32: case -108: _found = 1; break ; default: break; } _found; })) { | ||||
2217 | bus_enter_closing(bus); | ||||
2218 | r = -ECONNRESET104; | ||||
2219 | } | ||||
2220 | |||||
2221 | goto fail; | ||||
2222 | } | ||||
2223 | } | ||||
2224 | |||||
2225 | fail: | ||||
2226 | return sd_bus_error_set_errno(error, r); | ||||
2227 | } | ||||
2228 | |||||
2229 | _public___attribute__ ((visibility("default"))) int sd_bus_get_fd(sd_bus *bus) { | ||||
2230 | |||||
2231 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2231, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
2232 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 2232, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
2233 | assert_return(bus->input_fd == bus->output_fd, -EPERM)do { if (!(((__builtin_expect(!!(bus->input_fd == bus-> output_fd),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("bus->input_fd == bus->output_fd"), "../src/libsystemd/sd-bus/sd-bus.c" , 2233, __PRETTY_FUNCTION__), 0))) return (-1); } while (0); | ||||
2234 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2234, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
2235 | |||||
2236 | if (bus->state == BUS_CLOSED) | ||||
2237 | return -ENOTCONN107; | ||||
2238 | |||||
2239 | if (bus->inotify_fd >= 0) | ||||
2240 | return bus->inotify_fd; | ||||
2241 | |||||
2242 | if (bus->input_fd >= 0) | ||||
2243 | return bus->input_fd; | ||||
2244 | |||||
2245 | return -ENOTCONN107; | ||||
2246 | } | ||||
2247 | |||||
2248 | _public___attribute__ ((visibility("default"))) int sd_bus_get_events(sd_bus *bus) { | ||||
2249 | int flags = 0; | ||||
2250 | |||||
2251 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2251, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
2252 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 2252, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
2253 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2253, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
2254 | |||||
2255 | switch (bus->state) { | ||||
2256 | |||||
2257 | case BUS_UNSET: | ||||
2258 | case BUS_CLOSED: | ||||
2259 | return -ENOTCONN107; | ||||
2260 | |||||
2261 | case BUS_WATCH_BIND: | ||||
2262 | flags |= POLLIN0x001; | ||||
2263 | break; | ||||
2264 | |||||
2265 | case BUS_OPENING: | ||||
2266 | flags |= POLLOUT0x004; | ||||
2267 | break; | ||||
2268 | |||||
2269 | case BUS_AUTHENTICATING: | ||||
2270 | if (bus_socket_auth_needs_write(bus)) | ||||
2271 | flags |= POLLOUT0x004; | ||||
2272 | |||||
2273 | flags |= POLLIN0x001; | ||||
2274 | break; | ||||
2275 | |||||
2276 | case BUS_RUNNING: | ||||
2277 | case BUS_HELLO: | ||||
2278 | if (bus->rqueue_size <= 0) | ||||
2279 | flags |= POLLIN0x001; | ||||
2280 | if (bus->wqueue_size > 0) | ||||
2281 | flags |= POLLOUT0x004; | ||||
2282 | break; | ||||
2283 | |||||
2284 | case BUS_CLOSING: | ||||
2285 | break; | ||||
2286 | |||||
2287 | default: | ||||
2288 | assert_not_reached("Unknown state")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, ( "Unknown state"), "../src/libsystemd/sd-bus/sd-bus.c", 2288, __PRETTY_FUNCTION__ ); } while (0); | ||||
2289 | } | ||||
2290 | |||||
2291 | return flags; | ||||
2292 | } | ||||
2293 | |||||
2294 | _public___attribute__ ((visibility("default"))) int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) { | ||||
2295 | struct reply_callback *c; | ||||
2296 | |||||
2297 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2297, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
2298 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 2298, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
2299 | assert_return(timeout_usec, -EINVAL)do { if (!(((__builtin_expect(!!(timeout_usec),1))) ? (1) : ( log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("timeout_usec" ), "../src/libsystemd/sd-bus/sd-bus.c", 2299, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
2300 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2300, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
2301 | |||||
2302 | if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING) | ||||
2303 | return -ENOTCONN107; | ||||
2304 | |||||
2305 | if (bus->track_queue) { | ||||
2306 | *timeout_usec = 0; | ||||
2307 | return 1; | ||||
2308 | } | ||||
2309 | |||||
2310 | switch (bus->state) { | ||||
2311 | |||||
2312 | case BUS_AUTHENTICATING: | ||||
2313 | *timeout_usec = bus->auth_timeout; | ||||
2314 | return 1; | ||||
2315 | |||||
2316 | case BUS_RUNNING: | ||||
2317 | case BUS_HELLO: | ||||
2318 | if (bus->rqueue_size > 0) { | ||||
2319 | *timeout_usec = 0; | ||||
2320 | return 1; | ||||
2321 | } | ||||
2322 | |||||
2323 | c = prioq_peek(bus->reply_callbacks_prioq); | ||||
2324 | if (!c) { | ||||
2325 | *timeout_usec = (uint64_t) -1; | ||||
2326 | return 0; | ||||
2327 | } | ||||
2328 | |||||
2329 | if (c->timeout_usec == 0) { | ||||
2330 | *timeout_usec = (uint64_t) -1; | ||||
2331 | return 0; | ||||
2332 | } | ||||
2333 | |||||
2334 | *timeout_usec = c->timeout_usec; | ||||
2335 | return 1; | ||||
2336 | |||||
2337 | case BUS_CLOSING: | ||||
2338 | *timeout_usec = 0; | ||||
2339 | return 1; | ||||
2340 | |||||
2341 | case BUS_WATCH_BIND: | ||||
2342 | case BUS_OPENING: | ||||
2343 | *timeout_usec = (uint64_t) -1; | ||||
2344 | return 0; | ||||
2345 | |||||
2346 | default: | ||||
2347 | assert_not_reached("Unknown or unexpected stat")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, ( "Unknown or unexpected stat"), "../src/libsystemd/sd-bus/sd-bus.c" , 2347, __PRETTY_FUNCTION__); } while (0); | ||||
2348 | } | ||||
2349 | } | ||||
2350 | |||||
2351 | static int process_timeout(sd_bus *bus) { | ||||
2352 | _cleanup_(sd_bus_error_free)__attribute__((cleanup(sd_bus_error_free))) sd_bus_error error_buffer = SD_BUS_ERROR_NULL((const sd_bus_error) {(((void*)0)), (((void*)0)), 0}); | ||||
2353 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message* m = NULL((void*)0); | ||||
2354 | struct reply_callback *c; | ||||
2355 | sd_bus_slot *slot; | ||||
2356 | bool_Bool is_hello; | ||||
2357 | usec_t n; | ||||
2358 | int r; | ||||
2359 | |||||
2360 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2360, __PRETTY_FUNCTION__); } while (0); | ||||
2361 | assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO))do { if ((__builtin_expect(!!(!(({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){BUS_RUNNING, BUS_HELLO})/sizeof(int)]; switch (bus->state) { case BUS_RUNNING: case BUS_HELLO: _found = 1 ; break; default: break; } _found; }))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("IN_SET(bus->state, BUS_RUNNING, BUS_HELLO)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2361, __PRETTY_FUNCTION__ ); } while (0); | ||||
2362 | |||||
2363 | c = prioq_peek(bus->reply_callbacks_prioq); | ||||
2364 | if (!c) | ||||
2365 | return 0; | ||||
2366 | |||||
2367 | n = now(CLOCK_MONOTONIC1); | ||||
2368 | if (c->timeout_usec > n) | ||||
2369 | return 0; | ||||
2370 | |||||
2371 | r = bus_message_new_synthetic_error( | ||||
2372 | bus, | ||||
2373 | c->cookie, | ||||
2374 | &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out")((const sd_bus_error) {("org.freedesktop.DBus.Error.NoReply") , ("Method call timed out"), 0}), | ||||
2375 | &m); | ||||
2376 | if (r < 0) | ||||
2377 | return r; | ||||
2378 | |||||
2379 | r = bus_seal_synthetic_message(bus, m); | ||||
2380 | if (r < 0) | ||||
2381 | return r; | ||||
2382 | |||||
2383 | assert_se(prioq_pop(bus->reply_callbacks_prioq) == c)do { if ((__builtin_expect(!!(!(prioq_pop(bus->reply_callbacks_prioq ) == c)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("prioq_pop(bus->reply_callbacks_prioq) == c" ), "../src/libsystemd/sd-bus/sd-bus.c", 2383, __PRETTY_FUNCTION__ ); } while (0); | ||||
2384 | c->timeout_usec = 0; | ||||
2385 | |||||
2386 | ordered_hashmap_remove(bus->reply_callbacks, &c->cookie); | ||||
2387 | c->cookie = 0; | ||||
2388 | |||||
2389 | slot = container_of(c, sd_bus_slot, reply_callback)__extension__ ({ const typeof( ((sd_bus_slot*)0)->reply_callback ) *__unique_prefix_A24 = ((c)); (sd_bus_slot*)( (char *)__unique_prefix_A24 - __builtin_offsetof(sd_bus_slot, reply_callback) ); }); | ||||
2390 | |||||
2391 | bus->iteration_counter++; | ||||
2392 | |||||
2393 | is_hello = bus->state == BUS_HELLO && c->callback == hello_callback; | ||||
2394 | |||||
2395 | bus->current_message = m; | ||||
2396 | bus->current_slot = sd_bus_slot_ref(slot); | ||||
2397 | bus->current_handler = c->callback; | ||||
2398 | bus->current_userdata = slot->userdata; | ||||
2399 | r = c->callback(m, slot->userdata, &error_buffer); | ||||
2400 | bus->current_userdata = NULL((void*)0); | ||||
2401 | bus->current_handler = NULL((void*)0); | ||||
2402 | bus->current_slot = NULL((void*)0); | ||||
2403 | bus->current_message = NULL((void*)0); | ||||
2404 | |||||
2405 | if (slot->floating) { | ||||
2406 | bus_slot_disconnect(slot); | ||||
2407 | sd_bus_slot_unref(slot); | ||||
2408 | } | ||||
2409 | |||||
2410 | sd_bus_slot_unref(slot); | ||||
2411 | |||||
2412 | /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log | ||||
2413 | * and ignore the callback handler's return value. */ | ||||
2414 | if (is_hello) | ||||
2415 | return r; | ||||
2416 | |||||
2417 | return bus_maybe_reply_error(m, r, &error_buffer); | ||||
2418 | } | ||||
2419 | |||||
2420 | static int process_hello(sd_bus *bus, sd_bus_message *m) { | ||||
2421 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2421, __PRETTY_FUNCTION__); } while (0); | ||||
2422 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2422, __PRETTY_FUNCTION__); } while (0); | ||||
2423 | |||||
2424 | if (bus->state != BUS_HELLO) | ||||
2425 | return 0; | ||||
2426 | |||||
2427 | /* Let's make sure the first message on the bus is the HELLO | ||||
2428 | * reply. But note that we don't actually parse the message | ||||
2429 | * here (we leave that to the usual handling), we just verify | ||||
2430 | * we don't let any earlier msg through. */ | ||||
2431 | |||||
2432 | if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR })/sizeof(int)]; switch(m->header->type) { case SD_BUS_MESSAGE_METHOD_RETURN : case SD_BUS_MESSAGE_METHOD_ERROR: _found = 1; break; default : break; } _found; })) | ||||
2433 | return -EIO5; | ||||
2434 | |||||
2435 | if (m->reply_cookie != 1) | ||||
2436 | return -EIO5; | ||||
2437 | |||||
2438 | return 0; | ||||
2439 | } | ||||
2440 | |||||
2441 | static int process_reply(sd_bus *bus, sd_bus_message *m) { | ||||
2442 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *synthetic_reply = NULL((void*)0); | ||||
2443 | _cleanup_(sd_bus_error_free)__attribute__((cleanup(sd_bus_error_free))) sd_bus_error error_buffer = SD_BUS_ERROR_NULL((const sd_bus_error) {(((void*)0)), (((void*)0)), 0}); | ||||
2444 | struct reply_callback *c; | ||||
2445 | sd_bus_slot *slot; | ||||
2446 | bool_Bool is_hello; | ||||
2447 | int r; | ||||
2448 | |||||
2449 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2449, __PRETTY_FUNCTION__); } while (0); | ||||
2450 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2450, __PRETTY_FUNCTION__); } while (0); | ||||
2451 | |||||
2452 | if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR })/sizeof(int)]; switch(m->header->type) { case SD_BUS_MESSAGE_METHOD_RETURN : case SD_BUS_MESSAGE_METHOD_ERROR: _found = 1; break; default : break; } _found; })) | ||||
2453 | return 0; | ||||
2454 | |||||
2455 | if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name)) | ||||
2456 | return 0; | ||||
2457 | |||||
2458 | c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie); | ||||
2459 | if (!c) | ||||
2460 | return 0; | ||||
2461 | |||||
2462 | c->cookie = 0; | ||||
2463 | |||||
2464 | slot = container_of(c, sd_bus_slot, reply_callback)__extension__ ({ const typeof( ((sd_bus_slot*)0)->reply_callback ) *__unique_prefix_A25 = ((c)); (sd_bus_slot*)( (char *)__unique_prefix_A25 - __builtin_offsetof(sd_bus_slot, reply_callback) ); }); | ||||
2465 | |||||
2466 | if (m->n_fds > 0 && !bus->accept_fd) { | ||||
2467 | |||||
2468 | /* If the reply contained a file descriptor which we | ||||
2469 | * didn't want we pass an error instead. */ | ||||
2470 | |||||
2471 | r = bus_message_new_synthetic_error( | ||||
2472 | bus, | ||||
2473 | m->reply_cookie, | ||||
2474 | &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor")((const sd_bus_error) {("org.freedesktop.DBus.Error.InconsistentMessage" ), ("Reply message contained file descriptor"), 0}), | ||||
2475 | &synthetic_reply); | ||||
2476 | if (r < 0) | ||||
2477 | return r; | ||||
2478 | |||||
2479 | /* Copy over original timestamp */ | ||||
2480 | synthetic_reply->realtime = m->realtime; | ||||
2481 | synthetic_reply->monotonic = m->monotonic; | ||||
2482 | synthetic_reply->seqnum = m->seqnum; | ||||
2483 | |||||
2484 | r = bus_seal_synthetic_message(bus, synthetic_reply); | ||||
2485 | if (r < 0) | ||||
2486 | return r; | ||||
2487 | |||||
2488 | m = synthetic_reply; | ||||
2489 | } else { | ||||
2490 | r = sd_bus_message_rewind(m, true1); | ||||
2491 | if (r < 0) | ||||
2492 | return r; | ||||
2493 | } | ||||
2494 | |||||
2495 | if (c->timeout_usec != 0) { | ||||
2496 | prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx); | ||||
2497 | c->timeout_usec = 0; | ||||
2498 | } | ||||
2499 | |||||
2500 | is_hello = bus->state == BUS_HELLO && c->callback == hello_callback; | ||||
2501 | |||||
2502 | bus->current_slot = sd_bus_slot_ref(slot); | ||||
2503 | bus->current_handler = c->callback; | ||||
2504 | bus->current_userdata = slot->userdata; | ||||
2505 | r = c->callback(m, slot->userdata, &error_buffer); | ||||
2506 | bus->current_userdata = NULL((void*)0); | ||||
2507 | bus->current_handler = NULL((void*)0); | ||||
2508 | bus->current_slot = NULL((void*)0); | ||||
2509 | |||||
2510 | if (slot->floating) { | ||||
2511 | bus_slot_disconnect(slot); | ||||
2512 | sd_bus_slot_unref(slot); | ||||
2513 | } | ||||
2514 | |||||
2515 | sd_bus_slot_unref(slot); | ||||
2516 | |||||
2517 | /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and | ||||
2518 | * ignore the callback handler's return value. */ | ||||
2519 | if (is_hello) | ||||
2520 | return r; | ||||
2521 | |||||
2522 | return bus_maybe_reply_error(m, r, &error_buffer); | ||||
2523 | } | ||||
2524 | |||||
2525 | static int process_filter(sd_bus *bus, sd_bus_message *m) { | ||||
2526 | _cleanup_(sd_bus_error_free)__attribute__((cleanup(sd_bus_error_free))) sd_bus_error error_buffer = SD_BUS_ERROR_NULL((const sd_bus_error) {(((void*)0)), (((void*)0)), 0}); | ||||
2527 | struct filter_callback *l; | ||||
2528 | int r; | ||||
2529 | |||||
2530 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2530, __PRETTY_FUNCTION__); } while (0); | ||||
2531 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2531, __PRETTY_FUNCTION__); } while (0); | ||||
2532 | |||||
2533 | do { | ||||
2534 | bus->filter_callbacks_modified = false0; | ||||
2535 | |||||
2536 | LIST_FOREACH(callbacks, l, bus->filter_callbacks)for ((l) = (bus->filter_callbacks); (l); (l) = (l)->callbacks_next ) { | ||||
2537 | sd_bus_slot *slot; | ||||
2538 | |||||
2539 | if (bus->filter_callbacks_modified) | ||||
2540 | break; | ||||
2541 | |||||
2542 | /* Don't run this more than once per iteration */ | ||||
2543 | if (l->last_iteration == bus->iteration_counter) | ||||
2544 | continue; | ||||
2545 | |||||
2546 | l->last_iteration = bus->iteration_counter; | ||||
2547 | |||||
2548 | r = sd_bus_message_rewind(m, true1); | ||||
2549 | if (r < 0) | ||||
2550 | return r; | ||||
2551 | |||||
2552 | slot = container_of(l, sd_bus_slot, filter_callback)__extension__ ({ const typeof( ((sd_bus_slot*)0)->filter_callback ) *__unique_prefix_A26 = ((l)); (sd_bus_slot*)( (char *)__unique_prefix_A26 - __builtin_offsetof(sd_bus_slot, filter_callback) ); }); | ||||
2553 | |||||
2554 | bus->current_slot = sd_bus_slot_ref(slot); | ||||
2555 | bus->current_handler = l->callback; | ||||
2556 | bus->current_userdata = slot->userdata; | ||||
2557 | r = l->callback(m, slot->userdata, &error_buffer); | ||||
2558 | bus->current_userdata = NULL((void*)0); | ||||
2559 | bus->current_handler = NULL((void*)0); | ||||
2560 | bus->current_slot = sd_bus_slot_unref(slot); | ||||
2561 | |||||
2562 | r = bus_maybe_reply_error(m, r, &error_buffer); | ||||
2563 | if (r != 0) | ||||
2564 | return r; | ||||
2565 | |||||
2566 | } | ||||
2567 | |||||
2568 | } while (bus->filter_callbacks_modified); | ||||
2569 | |||||
2570 | return 0; | ||||
2571 | } | ||||
2572 | |||||
2573 | static int process_match(sd_bus *bus, sd_bus_message *m) { | ||||
2574 | int r; | ||||
2575 | |||||
2576 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2576, __PRETTY_FUNCTION__); } while (0); | ||||
2577 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2577, __PRETTY_FUNCTION__); } while (0); | ||||
2578 | |||||
2579 | do { | ||||
2580 | bus->match_callbacks_modified = false0; | ||||
2581 | |||||
2582 | r = bus_match_run(bus, &bus->match_callbacks, m); | ||||
2583 | if (r != 0) | ||||
2584 | return r; | ||||
2585 | |||||
2586 | } while (bus->match_callbacks_modified); | ||||
2587 | |||||
2588 | return 0; | ||||
2589 | } | ||||
2590 | |||||
2591 | static int process_builtin(sd_bus *bus, sd_bus_message *m) { | ||||
2592 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *reply = NULL((void*)0); | ||||
2593 | int r; | ||||
2594 | |||||
2595 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2595, __PRETTY_FUNCTION__); } while (0); | ||||
2596 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2596, __PRETTY_FUNCTION__); } while (0); | ||||
2597 | |||||
2598 | if (bus->is_monitor) | ||||
2599 | return 0; | ||||
2600 | |||||
2601 | if (bus->manual_peer_interface) | ||||
2602 | return 0; | ||||
2603 | |||||
2604 | if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL) | ||||
2605 | return 0; | ||||
2606 | |||||
2607 | if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer")) | ||||
2608 | return 0; | ||||
2609 | |||||
2610 | if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) | ||||
2611 | return 1; | ||||
2612 | |||||
2613 | if (streq_ptr(m->member, "Ping")) | ||||
2614 | r = sd_bus_message_new_method_return(m, &reply); | ||||
2615 | else if (streq_ptr(m->member, "GetMachineId")) { | ||||
2616 | sd_id128_t id; | ||||
2617 | char sid[33]; | ||||
2618 | |||||
2619 | r = sd_id128_get_machine(&id); | ||||
2620 | if (r < 0) | ||||
2621 | return r; | ||||
2622 | |||||
2623 | r = sd_bus_message_new_method_return(m, &reply); | ||||
2624 | if (r < 0) | ||||
2625 | return r; | ||||
2626 | |||||
2627 | r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid)); | ||||
2628 | } else { | ||||
2629 | r = sd_bus_message_new_method_errorf( | ||||
2630 | m, &reply, | ||||
2631 | SD_BUS_ERROR_UNKNOWN_METHOD"org.freedesktop.DBus.Error.UnknownMethod", | ||||
2632 | "Unknown method '%s' on interface '%s'.", m->member, m->interface); | ||||
2633 | } | ||||
2634 | if (r < 0) | ||||
2635 | return r; | ||||
2636 | |||||
2637 | r = sd_bus_send(bus, reply, NULL((void*)0)); | ||||
2638 | if (r < 0) | ||||
2639 | return r; | ||||
2640 | |||||
2641 | return 1; | ||||
2642 | } | ||||
2643 | |||||
2644 | static int process_fd_check(sd_bus *bus, sd_bus_message *m) { | ||||
2645 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2645, __PRETTY_FUNCTION__); } while (0); | ||||
2646 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2646, __PRETTY_FUNCTION__); } while (0); | ||||
2647 | |||||
2648 | /* If we got a message with a file descriptor which we didn't | ||||
2649 | * want to accept, then let's drop it. How can this even | ||||
2650 | * happen? For example, when the kernel queues a message into | ||||
2651 | * an activatable names's queue which allows fds, and then is | ||||
2652 | * delivered to us later even though we ourselves did not | ||||
2653 | * negotiate it. */ | ||||
2654 | |||||
2655 | if (bus->is_monitor) | ||||
2656 | return 0; | ||||
2657 | |||||
2658 | if (m->n_fds <= 0) | ||||
2659 | return 0; | ||||
2660 | |||||
2661 | if (bus->accept_fd) | ||||
2662 | return 0; | ||||
2663 | |||||
2664 | if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL) | ||||
2665 | return 1; /* just eat it up */ | ||||
2666 | |||||
2667 | return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE"org.freedesktop.DBus.Error.InconsistentMessage", "Message contains file descriptors, which I cannot accept. Sorry."); | ||||
2668 | } | ||||
2669 | |||||
2670 | static int process_message(sd_bus *bus, sd_bus_message *m) { | ||||
2671 | int r; | ||||
2672 | |||||
2673 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2673, __PRETTY_FUNCTION__); } while (0); | ||||
2674 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 2674, __PRETTY_FUNCTION__); } while (0); | ||||
2675 | |||||
2676 | bus->current_message = m; | ||||
2677 | bus->iteration_counter++; | ||||
2678 | |||||
2679 | log_debug_bus_message(m)do { sd_bus_message *_mm = (m); ({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm (_realm) >= ((_level) & 0x07)) ? log_internal_realm((( _realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c" , 2679, __func__, "Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" "l" "u" " reply_cookie=%" "l" "u" " signature=%s error-name=%s error-message=%s" , bus_message_type_to_string(_mm->header->type), strna( sd_bus_message_get_sender(_mm)), strna(sd_bus_message_get_destination (_mm)), strna(sd_bus_message_get_path(_mm)), strna(sd_bus_message_get_interface (_mm)), strna(sd_bus_message_get_member(_mm)), BUS_MESSAGE_COOKIE (_mm), _mm->reply_cookie, strna(_mm->root_container.signature ), strna(_mm->error.name), strna(_mm->error.message)) : -abs(_e); }); } while (0); | ||||
2680 | |||||
2681 | r = process_hello(bus, m); | ||||
2682 | if (r != 0) | ||||
2683 | goto finish; | ||||
2684 | |||||
2685 | r = process_reply(bus, m); | ||||
2686 | if (r != 0) | ||||
2687 | goto finish; | ||||
2688 | |||||
2689 | r = process_fd_check(bus, m); | ||||
2690 | if (r != 0) | ||||
2691 | goto finish; | ||||
2692 | |||||
2693 | r = process_filter(bus, m); | ||||
2694 | if (r != 0) | ||||
2695 | goto finish; | ||||
2696 | |||||
2697 | r = process_match(bus, m); | ||||
2698 | if (r != 0) | ||||
2699 | goto finish; | ||||
2700 | |||||
2701 | r = process_builtin(bus, m); | ||||
2702 | if (r != 0) | ||||
2703 | goto finish; | ||||
2704 | |||||
2705 | r = bus_process_object(bus, m); | ||||
2706 | |||||
2707 | finish: | ||||
2708 | bus->current_message = NULL((void*)0); | ||||
2709 | return r; | ||||
2710 | } | ||||
2711 | |||||
2712 | static int dispatch_track(sd_bus *bus) { | ||||
2713 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2713, __PRETTY_FUNCTION__); } while (0); | ||||
2714 | |||||
2715 | if (!bus->track_queue) | ||||
2716 | return 0; | ||||
2717 | |||||
2718 | bus_track_dispatch(bus->track_queue); | ||||
2719 | return 1; | ||||
2720 | } | ||||
2721 | |||||
2722 | static int process_running(sd_bus *bus, bool_Bool hint_priority, int64_t priority, sd_bus_message **ret) { | ||||
2723 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = NULL((void*)0); | ||||
2724 | int r; | ||||
2725 | |||||
2726 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2726, __PRETTY_FUNCTION__); } while (0); | ||||
2727 | assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO))do { if ((__builtin_expect(!!(!(({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended[20 - sizeof((int[]){BUS_RUNNING, BUS_HELLO})/sizeof(int)]; switch (bus->state) { case BUS_RUNNING: case BUS_HELLO: _found = 1 ; break; default: break; } _found; }))),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("IN_SET(bus->state, BUS_RUNNING, BUS_HELLO)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2727, __PRETTY_FUNCTION__ ); } while (0); | ||||
2728 | |||||
2729 | r = process_timeout(bus); | ||||
2730 | if (r != 0) | ||||
2731 | goto null_message; | ||||
2732 | |||||
2733 | r = dispatch_wqueue(bus); | ||||
2734 | if (r != 0) | ||||
2735 | goto null_message; | ||||
2736 | |||||
2737 | r = dispatch_track(bus); | ||||
2738 | if (r != 0) | ||||
2739 | goto null_message; | ||||
2740 | |||||
2741 | r = dispatch_rqueue(bus, hint_priority, priority, &m); | ||||
2742 | if (r < 0) | ||||
2743 | return r; | ||||
2744 | if (!m) | ||||
2745 | goto null_message; | ||||
2746 | |||||
2747 | r = process_message(bus, m); | ||||
2748 | if (r != 0) | ||||
2749 | goto null_message; | ||||
2750 | |||||
2751 | if (ret) { | ||||
2752 | r = sd_bus_message_rewind(m, true1); | ||||
2753 | if (r < 0) | ||||
2754 | return r; | ||||
2755 | |||||
2756 | *ret = TAKE_PTR(m)({ typeof(m) _ptr_ = (m); (m) = ((void*)0); _ptr_; }); | ||||
2757 | return 1; | ||||
2758 | } | ||||
2759 | |||||
2760 | if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) { | ||||
2761 | |||||
2762 | log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 2766, __func__, "Unprocessed message call sender=%s object=%s interface=%s member=%s" , strna(sd_bus_message_get_sender(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m))) : -abs(_e); }) | ||||
2763 | strna(sd_bus_message_get_sender(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 2766, __func__, "Unprocessed message call sender=%s object=%s interface=%s member=%s" , strna(sd_bus_message_get_sender(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m))) : -abs(_e); }) | ||||
2764 | strna(sd_bus_message_get_path(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 2766, __func__, "Unprocessed message call sender=%s object=%s interface=%s member=%s" , strna(sd_bus_message_get_sender(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m))) : -abs(_e); }) | ||||
2765 | strna(sd_bus_message_get_interface(m)),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 2766, __func__, "Unprocessed message call sender=%s object=%s interface=%s member=%s" , strna(sd_bus_message_get_sender(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m))) : -abs(_e); }) | ||||
2766 | strna(sd_bus_message_get_member(m)))({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 2766, __func__, "Unprocessed message call sender=%s object=%s interface=%s member=%s" , strna(sd_bus_message_get_sender(m)), strna(sd_bus_message_get_path (m)), strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member (m))) : -abs(_e); }); | ||||
2767 | |||||
2768 | r = sd_bus_reply_method_errorf( | ||||
2769 | m, | ||||
2770 | SD_BUS_ERROR_UNKNOWN_OBJECT"org.freedesktop.DBus.Error.UnknownObject", | ||||
2771 | "Unknown object '%s'.", m->path); | ||||
2772 | if (r < 0) | ||||
2773 | return r; | ||||
2774 | } | ||||
2775 | |||||
2776 | return 1; | ||||
2777 | |||||
2778 | null_message: | ||||
2779 | if (r >= 0 && ret) | ||||
2780 | *ret = NULL((void*)0); | ||||
2781 | |||||
2782 | return r; | ||||
2783 | } | ||||
2784 | |||||
2785 | static int bus_exit_now(sd_bus *bus) { | ||||
2786 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2786, __PRETTY_FUNCTION__); } while (0); | ||||
2787 | |||||
2788 | /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes | ||||
2789 | * sd_event_exit(), otherwise invokes libc exit(). */ | ||||
2790 | |||||
2791 | if (bus->exited) /* did we already exit? */ | ||||
2792 | return 0; | ||||
2793 | if (!bus->exit_triggered) /* was the exit condition triggered? */ | ||||
2794 | return 0; | ||||
2795 | if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */ | ||||
2796 | return 0; | ||||
2797 | |||||
2798 | bus->exited = true1; /* never exit more than once */ | ||||
2799 | |||||
2800 | log_debug("Bus connection disconnected, exiting.")({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 2800, __func__, "Bus connection disconnected, exiting." ) : -abs(_e); }); | ||||
2801 | |||||
2802 | if (bus->event) | ||||
2803 | return sd_event_exit(bus->event, EXIT_FAILURE1); | ||||
2804 | else | ||||
2805 | exit(EXIT_FAILURE1); | ||||
2806 | |||||
2807 | assert_not_reached("exit() didn't exit?")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, ( "exit() didn't exit?"), "../src/libsystemd/sd-bus/sd-bus.c", 2807 , __PRETTY_FUNCTION__); } while (0); | ||||
2808 | } | ||||
2809 | |||||
2810 | static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) { | ||||
2811 | _cleanup_(sd_bus_error_free)__attribute__((cleanup(sd_bus_error_free))) sd_bus_error error_buffer = SD_BUS_ERROR_NULL((const sd_bus_error) {(((void*)0)), (((void*)0)), 0}); | ||||
2812 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = NULL((void*)0); | ||||
2813 | sd_bus_slot *slot; | ||||
2814 | int r; | ||||
2815 | |||||
2816 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2816, __PRETTY_FUNCTION__); } while (0); | ||||
2817 | assert(c)do { if ((__builtin_expect(!!(!(c)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("c"), "../src/libsystemd/sd-bus/sd-bus.c" , 2817, __PRETTY_FUNCTION__); } while (0); | ||||
2818 | |||||
2819 | r = bus_message_new_synthetic_error( | ||||
2820 | bus, | ||||
2821 | c->cookie, | ||||
2822 | &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated")((const sd_bus_error) {("org.freedesktop.DBus.Error.NoReply") , ("Connection terminated"), 0}), | ||||
2823 | &m); | ||||
2824 | if (r < 0) | ||||
2825 | return r; | ||||
2826 | |||||
2827 | r = bus_seal_synthetic_message(bus, m); | ||||
2828 | if (r < 0) | ||||
2829 | return r; | ||||
2830 | |||||
2831 | if (c->timeout_usec != 0) { | ||||
2832 | prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx); | ||||
2833 | c->timeout_usec = 0; | ||||
2834 | } | ||||
2835 | |||||
2836 | ordered_hashmap_remove(bus->reply_callbacks, &c->cookie); | ||||
2837 | c->cookie = 0; | ||||
2838 | |||||
2839 | slot = container_of(c, sd_bus_slot, reply_callback)__extension__ ({ const typeof( ((sd_bus_slot*)0)->reply_callback ) *__unique_prefix_A27 = ((c)); (sd_bus_slot*)( (char *)__unique_prefix_A27 - __builtin_offsetof(sd_bus_slot, reply_callback) ); }); | ||||
2840 | |||||
2841 | bus->iteration_counter++; | ||||
2842 | |||||
2843 | bus->current_message = m; | ||||
2844 | bus->current_slot = sd_bus_slot_ref(slot); | ||||
2845 | bus->current_handler = c->callback; | ||||
2846 | bus->current_userdata = slot->userdata; | ||||
2847 | r = c->callback(m, slot->userdata, &error_buffer); | ||||
2848 | bus->current_userdata = NULL((void*)0); | ||||
2849 | bus->current_handler = NULL((void*)0); | ||||
2850 | bus->current_slot = NULL((void*)0); | ||||
2851 | bus->current_message = NULL((void*)0); | ||||
2852 | |||||
2853 | if (slot->floating) { | ||||
2854 | bus_slot_disconnect(slot); | ||||
2855 | sd_bus_slot_unref(slot); | ||||
2856 | } | ||||
2857 | |||||
2858 | sd_bus_slot_unref(slot); | ||||
2859 | |||||
2860 | return bus_maybe_reply_error(m, r, &error_buffer); | ||||
2861 | } | ||||
2862 | |||||
2863 | static int process_closing(sd_bus *bus, sd_bus_message **ret) { | ||||
2864 | _cleanup_(sd_bus_message_unrefp)__attribute__((cleanup(sd_bus_message_unrefp))) sd_bus_message *m = NULL((void*)0); | ||||
2865 | struct reply_callback *c; | ||||
2866 | int r; | ||||
2867 | |||||
2868 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2868, __PRETTY_FUNCTION__); } while (0); | ||||
2869 | assert(bus->state == BUS_CLOSING)do { if ((__builtin_expect(!!(!(bus->state == BUS_CLOSING) ),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("bus->state == BUS_CLOSING" ), "../src/libsystemd/sd-bus/sd-bus.c", 2869, __PRETTY_FUNCTION__ ); } while (0); | ||||
2870 | |||||
2871 | /* First, fail all outstanding method calls */ | ||||
2872 | c = ordered_hashmap_first(bus->reply_callbacks); | ||||
2873 | if (c) | ||||
2874 | return process_closing_reply_callback(bus, c); | ||||
2875 | |||||
2876 | /* Then, fake-drop all remaining bus tracking references */ | ||||
2877 | if (bus->tracks) { | ||||
2878 | bus_track_close(bus->tracks); | ||||
2879 | return 1; | ||||
2880 | } | ||||
2881 | |||||
2882 | /* Then, synthesize a Disconnected message */ | ||||
2883 | r = sd_bus_message_new_signal( | ||||
2884 | bus, | ||||
2885 | &m, | ||||
2886 | "/org/freedesktop/DBus/Local", | ||||
2887 | "org.freedesktop.DBus.Local", | ||||
2888 | "Disconnected"); | ||||
2889 | if (r < 0) | ||||
2890 | return r; | ||||
2891 | |||||
2892 | bus_message_set_sender_local(bus, m); | ||||
2893 | |||||
2894 | r = bus_seal_synthetic_message(bus, m); | ||||
2895 | if (r < 0) | ||||
2896 | return r; | ||||
2897 | |||||
2898 | sd_bus_close(bus); | ||||
2899 | |||||
2900 | bus->current_message = m; | ||||
2901 | bus->iteration_counter++; | ||||
2902 | |||||
2903 | r = process_filter(bus, m); | ||||
2904 | if (r != 0) | ||||
2905 | goto finish; | ||||
2906 | |||||
2907 | r = process_match(bus, m); | ||||
2908 | if (r != 0) | ||||
2909 | goto finish; | ||||
2910 | |||||
2911 | /* Nothing else to do, exit now, if the condition holds */ | ||||
2912 | bus->exit_triggered = true1; | ||||
2913 | (void) bus_exit_now(bus); | ||||
2914 | |||||
2915 | if (ret) | ||||
2916 | *ret = TAKE_PTR(m)({ typeof(m) _ptr_ = (m); (m) = ((void*)0); _ptr_; }); | ||||
2917 | |||||
2918 | r = 1; | ||||
2919 | |||||
2920 | finish: | ||||
2921 | bus->current_message = NULL((void*)0); | ||||
2922 | |||||
2923 | return r; | ||||
2924 | } | ||||
2925 | |||||
2926 | static int bus_process_internal(sd_bus *bus, bool_Bool hint_priority, int64_t priority, sd_bus_message **ret) { | ||||
2927 | int r; | ||||
2928 | |||||
2929 | /* Returns 0 when we didn't do anything. This should cause the | ||||
2930 | * caller to invoke sd_bus_wait() before returning the next | ||||
2931 | * time. Returns > 0 when we did something, which possibly | ||||
2932 | * means *ret is filled in with an unprocessed message. */ | ||||
2933 | |||||
2934 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 2934, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
2935 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 2935, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
2936 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 2936, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
2937 | |||||
2938 | /* We don't allow recursively invoking sd_bus_process(). */ | ||||
2939 | assert_return(!bus->current_message, -EBUSY)do { if (!(((__builtin_expect(!!(!bus->current_message),1) )) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus->current_message"), "../src/libsystemd/sd-bus/sd-bus.c" , 2939, __PRETTY_FUNCTION__), 0))) return (-16); } while (0); | ||||
2940 | assert(!bus->current_slot)do { if ((__builtin_expect(!!(!(!bus->current_slot)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("!bus->current_slot"), "../src/libsystemd/sd-bus/sd-bus.c" , 2940, __PRETTY_FUNCTION__); } while (0); | ||||
2941 | |||||
2942 | BUS_DONT_DESTROY(bus)__attribute__((cleanup(sd_bus_unrefp))) __attribute__ ((unused )) sd_bus *_dont_destroy_bus = sd_bus_ref(bus); | ||||
2943 | |||||
2944 | switch (bus->state) { | ||||
2945 | |||||
2946 | case BUS_UNSET: | ||||
2947 | return -ENOTCONN107; | ||||
2948 | |||||
2949 | case BUS_CLOSED: | ||||
2950 | return -ECONNRESET104; | ||||
2951 | |||||
2952 | case BUS_WATCH_BIND: | ||||
2953 | r = bus_socket_process_watch_bind(bus); | ||||
2954 | break; | ||||
2955 | |||||
2956 | case BUS_OPENING: | ||||
2957 | r = bus_socket_process_opening(bus); | ||||
2958 | break; | ||||
2959 | |||||
2960 | case BUS_AUTHENTICATING: | ||||
2961 | r = bus_socket_process_authenticating(bus); | ||||
2962 | break; | ||||
2963 | |||||
2964 | case BUS_RUNNING: | ||||
2965 | case BUS_HELLO: | ||||
2966 | r = process_running(bus, hint_priority, priority, ret); | ||||
2967 | if (r >= 0) | ||||
2968 | return r; | ||||
2969 | |||||
2970 | /* This branch initializes *ret, hence we don't use the generic error checking below */ | ||||
2971 | break; | ||||
2972 | |||||
2973 | case BUS_CLOSING: | ||||
2974 | return process_closing(bus, ret); | ||||
2975 | |||||
2976 | default: | ||||
2977 | assert_not_reached("Unknown state")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, ( "Unknown state"), "../src/libsystemd/sd-bus/sd-bus.c", 2977, __PRETTY_FUNCTION__ ); } while (0); | ||||
2978 | } | ||||
2979 | |||||
2980 | if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){-107, -104, -32, -108})/sizeof(int)]; switch (r) { case -107: case -104: case -32: case -108: _found = 1; break ; default: break; } _found; })) { | ||||
2981 | bus_enter_closing(bus); | ||||
2982 | r = 1; | ||||
2983 | } else if (r < 0) | ||||
2984 | return r; | ||||
2985 | |||||
2986 | if (ret) | ||||
2987 | *ret = NULL((void*)0); | ||||
2988 | |||||
2989 | return r; | ||||
2990 | } | ||||
2991 | |||||
2992 | _public___attribute__ ((visibility("default"))) int sd_bus_process(sd_bus *bus, sd_bus_message **ret) { | ||||
2993 | return bus_process_internal(bus, false0, 0, ret); | ||||
2994 | } | ||||
2995 | |||||
2996 | _public___attribute__ ((visibility("default"))) int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) { | ||||
2997 | return bus_process_internal(bus, true1, priority, ret); | ||||
2998 | } | ||||
2999 | |||||
3000 | static int bus_poll(sd_bus *bus, bool_Bool need_more, uint64_t timeout_usec) { | ||||
3001 | struct pollfd p[2] = {}; | ||||
3002 | int r, n; | ||||
3003 | struct timespec ts; | ||||
3004 | usec_t m = USEC_INFINITY((usec_t) -1); | ||||
3005 | |||||
3006 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3006, __PRETTY_FUNCTION__); } while (0); | ||||
3007 | |||||
3008 | if (bus->state == BUS_CLOSING) | ||||
3009 | return 1; | ||||
3010 | |||||
3011 | if (!BUS_IS_OPEN(bus->state)) | ||||
3012 | return -ENOTCONN107; | ||||
3013 | |||||
3014 | if (bus->state == BUS_WATCH_BIND) { | ||||
3015 | assert(bus->inotify_fd >= 0)do { if ((__builtin_expect(!!(!(bus->inotify_fd >= 0)), 0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("bus->inotify_fd >= 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 3015, __PRETTY_FUNCTION__ ); } while (0); | ||||
3016 | |||||
3017 | p[0].events = POLLIN0x001; | ||||
3018 | p[0].fd = bus->inotify_fd; | ||||
3019 | n = 1; | ||||
3020 | } else { | ||||
3021 | int e; | ||||
3022 | |||||
3023 | e = sd_bus_get_events(bus); | ||||
3024 | if (e < 0) | ||||
3025 | return e; | ||||
3026 | |||||
3027 | if (need_more) | ||||
3028 | /* The caller really needs some more data, he doesn't | ||||
3029 | * care about what's already read, or any timeouts | ||||
3030 | * except its own. */ | ||||
3031 | e |= POLLIN0x001; | ||||
3032 | else { | ||||
3033 | usec_t until; | ||||
3034 | /* The caller wants to process if there's something to | ||||
3035 | * process, but doesn't care otherwise */ | ||||
3036 | |||||
3037 | r = sd_bus_get_timeout(bus, &until); | ||||
3038 | if (r < 0) | ||||
3039 | return r; | ||||
3040 | if (r > 0) | ||||
3041 | m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC1)); | ||||
3042 | } | ||||
3043 | |||||
3044 | p[0].fd = bus->input_fd; | ||||
3045 | if (bus->output_fd == bus->input_fd) { | ||||
3046 | p[0].events = e; | ||||
3047 | n = 1; | ||||
3048 | } else { | ||||
3049 | p[0].events = e & POLLIN0x001; | ||||
3050 | p[1].fd = bus->output_fd; | ||||
3051 | p[1].events = e & POLLOUT0x004; | ||||
3052 | n = 2; | ||||
3053 | } | ||||
3054 | } | ||||
3055 | |||||
3056 | if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY((usec_t) -1) || timeout_usec < m)) | ||||
3057 | m = timeout_usec; | ||||
3058 | |||||
3059 | r = ppoll(p, n, m == USEC_INFINITY((usec_t) -1) ? NULL((void*)0) : timespec_store(&ts, m), NULL((void*)0)); | ||||
3060 | if (r < 0) | ||||
3061 | return -errno(*__errno_location ()); | ||||
3062 | |||||
3063 | return r > 0 ? 1 : 0; | ||||
3064 | } | ||||
3065 | |||||
3066 | _public___attribute__ ((visibility("default"))) int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) { | ||||
3067 | |||||
3068 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3068, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3069 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3069, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3070 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3070, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3071 | |||||
3072 | if (bus->state == BUS_CLOSING) | ||||
3073 | return 0; | ||||
3074 | |||||
3075 | if (!BUS_IS_OPEN(bus->state)) | ||||
3076 | return -ENOTCONN107; | ||||
3077 | |||||
3078 | if (bus->rqueue_size > 0) | ||||
3079 | return 0; | ||||
3080 | |||||
3081 | return bus_poll(bus, false0, timeout_usec); | ||||
3082 | } | ||||
3083 | |||||
3084 | _public___attribute__ ((visibility("default"))) int sd_bus_flush(sd_bus *bus) { | ||||
3085 | int r; | ||||
3086 | |||||
3087 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3087, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3088 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3088, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3089 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3089, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3090 | |||||
3091 | if (bus->state == BUS_CLOSING) | ||||
3092 | return 0; | ||||
3093 | |||||
3094 | if (!BUS_IS_OPEN(bus->state)) | ||||
3095 | return -ENOTCONN107; | ||||
3096 | |||||
3097 | /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */ | ||||
3098 | if (bus->state == BUS_WATCH_BIND) | ||||
3099 | return -EUNATCH49; | ||||
3100 | |||||
3101 | r = bus_ensure_running(bus); | ||||
3102 | if (r < 0) | ||||
3103 | return r; | ||||
3104 | |||||
3105 | if (bus->wqueue_size <= 0) | ||||
3106 | return 0; | ||||
3107 | |||||
3108 | for (;;) { | ||||
3109 | r = dispatch_wqueue(bus); | ||||
3110 | if (r < 0) { | ||||
3111 | if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended [20 - sizeof((int[]){-107, -104, -32, -108})/sizeof(int)]; switch (r) { case -107: case -104: case -32: case -108: _found = 1; break ; default: break; } _found; })) { | ||||
3112 | bus_enter_closing(bus); | ||||
3113 | return -ECONNRESET104; | ||||
3114 | } | ||||
3115 | |||||
3116 | return r; | ||||
3117 | } | ||||
3118 | |||||
3119 | if (bus->wqueue_size <= 0) | ||||
3120 | return 0; | ||||
3121 | |||||
3122 | r = bus_poll(bus, false0, (uint64_t) -1); | ||||
3123 | if (r < 0) | ||||
3124 | return r; | ||||
3125 | } | ||||
3126 | } | ||||
3127 | |||||
3128 | _public___attribute__ ((visibility("default"))) int sd_bus_add_filter( | ||||
3129 | sd_bus *bus, | ||||
3130 | sd_bus_slot **slot, | ||||
3131 | sd_bus_message_handler_t callback, | ||||
3132 | void *userdata) { | ||||
3133 | |||||
3134 | sd_bus_slot *s; | ||||
3135 | |||||
3136 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3136, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3137 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3137, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3138 | assert_return(callback, -EINVAL)do { if (!(((__builtin_expect(!!(callback),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("callback"), "../src/libsystemd/sd-bus/sd-bus.c" , 3138, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3139 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3139, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3140 | |||||
3141 | s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata); | ||||
3142 | if (!s) | ||||
3143 | return -ENOMEM12; | ||||
3144 | |||||
3145 | s->filter_callback.callback = callback; | ||||
3146 | |||||
3147 | bus->filter_callbacks_modified = true1; | ||||
3148 | LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback)do { typeof(*(bus->filter_callbacks)) **_head = &(bus-> filter_callbacks), *_item = (&s->filter_callback); do { if ((__builtin_expect(!!(!(_item)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("_item"), "../src/libsystemd/sd-bus/sd-bus.c" , 3148, __PRETTY_FUNCTION__); } while (0); if ((_item->callbacks_next = *_head)) _item->callbacks_next->callbacks_prev = _item ; _item->callbacks_prev = ((void*)0); *_head = _item; } while (0); | ||||
3149 | |||||
3150 | if (slot) | ||||
3151 | *slot = s; | ||||
3152 | |||||
3153 | return 0; | ||||
3154 | } | ||||
3155 | |||||
3156 | static int add_match_callback( | ||||
3157 | sd_bus_message *m, | ||||
3158 | void *userdata, | ||||
3159 | sd_bus_error *ret_error) { | ||||
3160 | |||||
3161 | sd_bus_slot *match_slot = userdata; | ||||
3162 | bool_Bool failed = false0; | ||||
3163 | int r; | ||||
3164 | |||||
3165 | assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 3165, __PRETTY_FUNCTION__); } while (0); | ||||
3166 | assert(match_slot)do { if ((__builtin_expect(!!(!(match_slot)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("match_slot"), "../src/libsystemd/sd-bus/sd-bus.c" , 3166, __PRETTY_FUNCTION__); } while (0); | ||||
3167 | |||||
3168 | sd_bus_slot_ref(match_slot); | ||||
3169 | |||||
3170 | if (sd_bus_message_is_method_error(m, NULL((void*)0))) { | ||||
3171 | log_debug_errno(sd_bus_message_get_errno(m),({ int _level = ((7)), _e = ((sd_bus_message_get_errno(m))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c", 3174 , __func__, "Unable to add match %s, failing connection: %s", match_slot->match_callback.match_string, sd_bus_message_get_error (m)->message) : -abs(_e); }) | ||||
3172 | "Unable to add match %s, failing connection: %s",({ int _level = ((7)), _e = ((sd_bus_message_get_errno(m))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c", 3174 , __func__, "Unable to add match %s, failing connection: %s", match_slot->match_callback.match_string, sd_bus_message_get_error (m)->message) : -abs(_e); }) | ||||
3173 | match_slot->match_callback.match_string,({ int _level = ((7)), _e = ((sd_bus_message_get_errno(m))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c", 3174 , __func__, "Unable to add match %s, failing connection: %s", match_slot->match_callback.match_string, sd_bus_message_get_error (m)->message) : -abs(_e); }) | ||||
3174 | sd_bus_message_get_error(m)->message)({ int _level = ((7)), _e = ((sd_bus_message_get_errno(m))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/libsystemd/sd-bus/sd-bus.c", 3174 , __func__, "Unable to add match %s, failing connection: %s", match_slot->match_callback.match_string, sd_bus_message_get_error (m)->message) : -abs(_e); }); | ||||
3175 | |||||
3176 | failed = true1; | ||||
3177 | } else | ||||
3178 | log_debug("Match %s successfully installed.", match_slot->match_callback.match_string)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 3178, __func__, "Match %s successfully installed." , match_slot->match_callback.match_string) : -abs(_e); }); | ||||
3179 | |||||
3180 | if (match_slot->match_callback.install_callback) { | ||||
3181 | sd_bus *bus; | ||||
3182 | |||||
3183 | bus = sd_bus_message_get_bus(m); | ||||
3184 | |||||
3185 | /* This function has been called as slot handler, and we want to call another slot handler. Let's | ||||
3186 | * update the slot callback metadata temporarily with our own data, and then revert back to the old | ||||
3187 | * values. */ | ||||
3188 | |||||
3189 | assert(bus->current_slot == match_slot->match_callback.install_slot)do { if ((__builtin_expect(!!(!(bus->current_slot == match_slot ->match_callback.install_slot)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus->current_slot == match_slot->match_callback.install_slot" ), "../src/libsystemd/sd-bus/sd-bus.c", 3189, __PRETTY_FUNCTION__ ); } while (0); | ||||
3190 | assert(bus->current_handler == add_match_callback)do { if ((__builtin_expect(!!(!(bus->current_handler == add_match_callback )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("bus->current_handler == add_match_callback" ), "../src/libsystemd/sd-bus/sd-bus.c", 3190, __PRETTY_FUNCTION__ ); } while (0); | ||||
3191 | assert(bus->current_userdata == userdata)do { if ((__builtin_expect(!!(!(bus->current_userdata == userdata )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("bus->current_userdata == userdata" ), "../src/libsystemd/sd-bus/sd-bus.c", 3191, __PRETTY_FUNCTION__ ); } while (0); | ||||
3192 | |||||
3193 | bus->current_slot = match_slot; | ||||
3194 | bus->current_handler = match_slot->match_callback.install_callback; | ||||
3195 | bus->current_userdata = match_slot->userdata; | ||||
3196 | |||||
3197 | r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error); | ||||
3198 | |||||
3199 | bus->current_slot = match_slot->match_callback.install_slot; | ||||
3200 | bus->current_handler = add_match_callback; | ||||
3201 | bus->current_userdata = userdata; | ||||
3202 | |||||
3203 | match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot); | ||||
3204 | } else { | ||||
3205 | if (failed) /* Generic failure handling: destroy the connection */ | ||||
3206 | bus_enter_closing(sd_bus_message_get_bus(m)); | ||||
3207 | |||||
3208 | r = 1; | ||||
3209 | } | ||||
3210 | |||||
3211 | if (failed && match_slot->floating) { | ||||
3212 | bus_slot_disconnect(match_slot); | ||||
3213 | sd_bus_slot_unref(match_slot); | ||||
3214 | } | ||||
3215 | |||||
3216 | sd_bus_slot_unref(match_slot); | ||||
3217 | |||||
3218 | return r; | ||||
3219 | } | ||||
3220 | |||||
3221 | static int bus_add_match_full( | ||||
3222 | sd_bus *bus, | ||||
3223 | sd_bus_slot **slot, | ||||
3224 | bool_Bool asynchronous, | ||||
3225 | const char *match, | ||||
3226 | sd_bus_message_handler_t callback, | ||||
3227 | sd_bus_message_handler_t install_callback, | ||||
3228 | void *userdata) { | ||||
3229 | |||||
3230 | struct bus_match_component *components = NULL((void*)0); | ||||
3231 | unsigned n_components = 0; | ||||
3232 | sd_bus_slot *s = NULL((void*)0); | ||||
3233 | int r = 0; | ||||
3234 | |||||
3235 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3235, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3236 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3236, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3237 | assert_return(match, -EINVAL)do { if (!(((__builtin_expect(!!(match),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("match"), "../src/libsystemd/sd-bus/sd-bus.c" , 3237, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3238 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3238, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3239 | |||||
3240 | r = bus_match_parse(match, &components, &n_components); | ||||
3241 | if (r < 0) | ||||
3242 | goto finish; | ||||
3243 | |||||
3244 | s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata); | ||||
3245 | if (!s) { | ||||
3246 | r = -ENOMEM12; | ||||
3247 | goto finish; | ||||
3248 | } | ||||
3249 | |||||
3250 | s->match_callback.callback = callback; | ||||
3251 | s->match_callback.install_callback = install_callback; | ||||
3252 | |||||
3253 | if (bus->bus_client) { | ||||
3254 | enum bus_match_scope scope; | ||||
3255 | |||||
3256 | scope = bus_match_get_scope(components, n_components); | ||||
3257 | |||||
3258 | /* Do not install server-side matches for matches against the local service, interface or bus path. */ | ||||
3259 | if (scope != BUS_MATCH_LOCAL) { | ||||
3260 | |||||
3261 | /* We store the original match string, so that we can use it to remove the match again. */ | ||||
3262 | |||||
3263 | s->match_callback.match_string = strdup(match); | ||||
3264 | if (!s->match_callback.match_string) { | ||||
3265 | r = -ENOMEM12; | ||||
3266 | goto finish; | ||||
3267 | } | ||||
3268 | |||||
3269 | if (asynchronous) { | ||||
3270 | r = bus_add_match_internal_async(bus, | ||||
3271 | &s->match_callback.install_slot, | ||||
3272 | s->match_callback.match_string, | ||||
3273 | add_match_callback, | ||||
3274 | s); | ||||
3275 | |||||
3276 | if (r < 0) | ||||
3277 | return r; | ||||
3278 | |||||
3279 | /* Make the slot of the match call floating now. We need the reference, but we don't | ||||
3280 | * want that this match pins the bus object, hence we first create it non-floating, but | ||||
3281 | * then make it floating. */ | ||||
3282 | r = sd_bus_slot_set_floating(s->match_callback.install_slot, true1); | ||||
3283 | } else | ||||
3284 | r = bus_add_match_internal(bus, s->match_callback.match_string); | ||||
3285 | if (r < 0) | ||||
3286 | goto finish; | ||||
3287 | |||||
3288 | s->match_added = true1; | ||||
3289 | } | ||||
3290 | } | ||||
3291 | |||||
3292 | bus->match_callbacks_modified = true1; | ||||
3293 | r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback); | ||||
3294 | if (r < 0) | ||||
3295 | goto finish; | ||||
3296 | |||||
3297 | if (slot) | ||||
3298 | *slot = s; | ||||
3299 | s = NULL((void*)0); | ||||
3300 | |||||
3301 | finish: | ||||
3302 | bus_match_parse_free(components, n_components); | ||||
3303 | sd_bus_slot_unref(s); | ||||
3304 | |||||
3305 | return r; | ||||
3306 | } | ||||
3307 | |||||
3308 | _public___attribute__ ((visibility("default"))) int sd_bus_add_match( | ||||
3309 | sd_bus *bus, | ||||
3310 | sd_bus_slot **slot, | ||||
3311 | const char *match, | ||||
3312 | sd_bus_message_handler_t callback, | ||||
3313 | void *userdata) { | ||||
3314 | |||||
3315 | return bus_add_match_full(bus, slot, false0, match, callback, NULL((void*)0), userdata); | ||||
3316 | } | ||||
3317 | |||||
3318 | _public___attribute__ ((visibility("default"))) int sd_bus_add_match_async( | ||||
3319 | sd_bus *bus, | ||||
3320 | sd_bus_slot **slot, | ||||
3321 | const char *match, | ||||
3322 | sd_bus_message_handler_t callback, | ||||
3323 | sd_bus_message_handler_t install_callback, | ||||
3324 | void *userdata) { | ||||
3325 | |||||
3326 | return bus_add_match_full(bus, slot, true1, match, callback, install_callback, userdata); | ||||
3327 | } | ||||
3328 | |||||
3329 | bool_Bool bus_pid_changed(sd_bus *bus) { | ||||
3330 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3330, __PRETTY_FUNCTION__); } while (0); | ||||
3331 | |||||
3332 | /* We don't support people creating a bus connection and | ||||
3333 | * keeping it around over a fork(). Let's complain. */ | ||||
3334 | |||||
3335 | return bus->original_pid != getpid_cached(); | ||||
3336 | } | ||||
3337 | |||||
3338 | static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) { | ||||
3339 | sd_bus *bus = userdata; | ||||
3340 | int r; | ||||
3341 | |||||
3342 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3342, __PRETTY_FUNCTION__); } while (0); | ||||
3343 | |||||
3344 | /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */ | ||||
3345 | |||||
3346 | r = sd_bus_process(bus, NULL((void*)0)); | ||||
3347 | if (r < 0) { | ||||
3348 | log_debug_errno(r, "Processing of bus failed, closing down: %m")({ int _level = ((7)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 3348, __func__, "Processing of bus failed, closing down: %m" ) : -abs(_e); }); | ||||
3349 | bus_enter_closing(bus); | ||||
3350 | } | ||||
3351 | |||||
3352 | return 1; | ||||
3353 | } | ||||
3354 | |||||
3355 | static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) { | ||||
3356 | sd_bus *bus = userdata; | ||||
3357 | int r; | ||||
3358 | |||||
3359 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3359, __PRETTY_FUNCTION__); } while (0); | ||||
3360 | |||||
3361 | r = sd_bus_process(bus, NULL((void*)0)); | ||||
3362 | if (r < 0) { | ||||
3363 | log_debug_errno(r, "Processing of bus failed, closing down: %m")({ int _level = ((7)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 3363, __func__, "Processing of bus failed, closing down: %m" ) : -abs(_e); }); | ||||
3364 | bus_enter_closing(bus); | ||||
3365 | } | ||||
3366 | |||||
3367 | return 1; | ||||
3368 | } | ||||
3369 | |||||
3370 | static int prepare_callback(sd_event_source *s, void *userdata) { | ||||
3371 | sd_bus *bus = userdata; | ||||
3372 | int r, e; | ||||
3373 | usec_t until; | ||||
3374 | |||||
3375 | assert(s)do { if ((__builtin_expect(!!(!(s)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("s"), "../src/libsystemd/sd-bus/sd-bus.c" , 3375, __PRETTY_FUNCTION__); } while (0); | ||||
3376 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3376, __PRETTY_FUNCTION__); } while (0); | ||||
3377 | |||||
3378 | e = sd_bus_get_events(bus); | ||||
3379 | if (e < 0) { | ||||
3380 | r = e; | ||||
3381 | goto fail; | ||||
3382 | } | ||||
3383 | |||||
3384 | if (bus->output_fd != bus->input_fd) { | ||||
3385 | |||||
3386 | r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN0x001); | ||||
3387 | if (r < 0) | ||||
3388 | goto fail; | ||||
3389 | |||||
3390 | r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT0x004); | ||||
3391 | } else | ||||
3392 | r = sd_event_source_set_io_events(bus->input_io_event_source, e); | ||||
3393 | if (r < 0) | ||||
3394 | goto fail; | ||||
3395 | |||||
3396 | r = sd_bus_get_timeout(bus, &until); | ||||
3397 | if (r < 0) | ||||
3398 | goto fail; | ||||
3399 | if (r > 0) { | ||||
3400 | int j; | ||||
3401 | |||||
3402 | j = sd_event_source_set_time(bus->time_event_source, until); | ||||
3403 | if (j < 0) { | ||||
3404 | r = j; | ||||
3405 | goto fail; | ||||
3406 | } | ||||
3407 | } | ||||
3408 | |||||
3409 | r = sd_event_source_set_enabled(bus->time_event_source, r > 0); | ||||
3410 | if (r < 0) | ||||
3411 | goto fail; | ||||
3412 | |||||
3413 | return 1; | ||||
3414 | |||||
3415 | fail: | ||||
3416 | log_debug_errno(r, "Preparing of bus events failed, closing down: %m")({ int _level = ((7)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/libsystemd/sd-bus/sd-bus.c", 3416, __func__, "Preparing of bus events failed, closing down: %m" ) : -abs(_e); }); | ||||
3417 | bus_enter_closing(bus); | ||||
3418 | |||||
3419 | return 1; | ||||
3420 | } | ||||
3421 | |||||
3422 | static int quit_callback(sd_event_source *event, void *userdata) { | ||||
3423 | sd_bus *bus = userdata; | ||||
3424 | |||||
3425 | assert(event)do { if ((__builtin_expect(!!(!(event)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("event"), "../src/libsystemd/sd-bus/sd-bus.c" , 3425, __PRETTY_FUNCTION__); } while (0); | ||||
3426 | |||||
3427 | sd_bus_flush(bus); | ||||
3428 | sd_bus_close(bus); | ||||
3429 | |||||
3430 | return 1; | ||||
3431 | } | ||||
3432 | |||||
3433 | int bus_attach_io_events(sd_bus *bus) { | ||||
3434 | int r; | ||||
3435 | |||||
3436 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3436, __PRETTY_FUNCTION__); } while (0); | ||||
3437 | |||||
3438 | if (bus->input_fd < 0) | ||||
3439 | return 0; | ||||
3440 | |||||
3441 | if (!bus->event) | ||||
3442 | return 0; | ||||
3443 | |||||
3444 | if (!bus->input_io_event_source) { | ||||
3445 | r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus); | ||||
3446 | if (r < 0) | ||||
3447 | return r; | ||||
3448 | |||||
3449 | r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback); | ||||
3450 | if (r < 0) | ||||
3451 | return r; | ||||
3452 | |||||
3453 | r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority); | ||||
3454 | if (r < 0) | ||||
3455 | return r; | ||||
3456 | |||||
3457 | r = sd_event_source_set_description(bus->input_io_event_source, "bus-input"); | ||||
3458 | } else | ||||
3459 | r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd); | ||||
3460 | |||||
3461 | if (r < 0) | ||||
3462 | return r; | ||||
3463 | |||||
3464 | if (bus->output_fd != bus->input_fd) { | ||||
3465 | assert(bus->output_fd >= 0)do { if ((__builtin_expect(!!(!(bus->output_fd >= 0)),0 ))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("bus->output_fd >= 0" ), "../src/libsystemd/sd-bus/sd-bus.c", 3465, __PRETTY_FUNCTION__ ); } while (0); | ||||
3466 | |||||
3467 | if (!bus->output_io_event_source) { | ||||
3468 | r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus); | ||||
3469 | if (r < 0) | ||||
3470 | return r; | ||||
3471 | |||||
3472 | r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority); | ||||
3473 | if (r < 0) | ||||
3474 | return r; | ||||
3475 | |||||
3476 | r = sd_event_source_set_description(bus->input_io_event_source, "bus-output"); | ||||
3477 | } else | ||||
3478 | r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd); | ||||
3479 | |||||
3480 | if (r < 0) | ||||
3481 | return r; | ||||
3482 | } | ||||
3483 | |||||
3484 | return 0; | ||||
3485 | } | ||||
3486 | |||||
3487 | static void bus_detach_io_events(sd_bus *bus) { | ||||
3488 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3488, __PRETTY_FUNCTION__); } while (0); | ||||
3489 | |||||
3490 | if (bus->input_io_event_source) { | ||||
3491 | sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF); | ||||
3492 | bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source); | ||||
3493 | } | ||||
3494 | |||||
3495 | if (bus->output_io_event_source) { | ||||
3496 | sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF); | ||||
3497 | bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source); | ||||
3498 | } | ||||
3499 | } | ||||
3500 | |||||
3501 | int bus_attach_inotify_event(sd_bus *bus) { | ||||
3502 | int r; | ||||
3503 | |||||
3504 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3504, __PRETTY_FUNCTION__); } while (0); | ||||
3505 | |||||
3506 | if (bus->inotify_fd < 0) | ||||
3507 | return 0; | ||||
3508 | |||||
3509 | if (!bus->event) | ||||
3510 | return 0; | ||||
3511 | |||||
3512 | if (!bus->inotify_event_source) { | ||||
3513 | r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLINEPOLLIN, io_callback, bus); | ||||
3514 | if (r < 0) | ||||
3515 | return r; | ||||
3516 | |||||
3517 | r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority); | ||||
3518 | if (r < 0) | ||||
3519 | return r; | ||||
3520 | |||||
3521 | r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify"); | ||||
3522 | } else | ||||
3523 | r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd); | ||||
3524 | if (r < 0) | ||||
3525 | return r; | ||||
3526 | |||||
3527 | return 0; | ||||
3528 | } | ||||
3529 | |||||
3530 | static void bus_detach_inotify_event(sd_bus *bus) { | ||||
3531 | assert(bus)do { if ((__builtin_expect(!!(!(bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3531, __PRETTY_FUNCTION__); } while (0); | ||||
3532 | |||||
3533 | if (bus->inotify_event_source) { | ||||
3534 | sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF); | ||||
3535 | bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source); | ||||
3536 | } | ||||
3537 | } | ||||
3538 | |||||
3539 | _public___attribute__ ((visibility("default"))) int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) { | ||||
3540 | int r; | ||||
3541 | |||||
3542 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3542, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3543 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3543, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3544 | assert_return(!bus->event, -EBUSY)do { if (!(((__builtin_expect(!!(!bus->event),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus->event" ), "../src/libsystemd/sd-bus/sd-bus.c", 3544, __PRETTY_FUNCTION__ ), 0))) return (-16); } while (0); | ||||
3545 | |||||
3546 | assert(!bus->input_io_event_source)do { if ((__builtin_expect(!!(!(!bus->input_io_event_source )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!bus->input_io_event_source" ), "../src/libsystemd/sd-bus/sd-bus.c", 3546, __PRETTY_FUNCTION__ ); } while (0); | ||||
3547 | assert(!bus->output_io_event_source)do { if ((__builtin_expect(!!(!(!bus->output_io_event_source )),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!bus->output_io_event_source" ), "../src/libsystemd/sd-bus/sd-bus.c", 3547, __PRETTY_FUNCTION__ ); } while (0); | ||||
3548 | assert(!bus->time_event_source)do { if ((__builtin_expect(!!(!(!bus->time_event_source)), 0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!bus->time_event_source" ), "../src/libsystemd/sd-bus/sd-bus.c", 3548, __PRETTY_FUNCTION__ ); } while (0); | ||||
3549 | |||||
3550 | if (event) | ||||
3551 | bus->event = sd_event_ref(event); | ||||
3552 | else { | ||||
3553 | r = sd_event_default(&bus->event); | ||||
3554 | if (r < 0) | ||||
3555 | return r; | ||||
3556 | } | ||||
3557 | |||||
3558 | bus->event_priority = priority; | ||||
3559 | |||||
3560 | r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC1, 0, 0, time_callback, bus); | ||||
3561 | if (r < 0) | ||||
3562 | goto fail; | ||||
3563 | |||||
3564 | r = sd_event_source_set_priority(bus->time_event_source, priority); | ||||
3565 | if (r < 0) | ||||
3566 | goto fail; | ||||
3567 | |||||
3568 | r = sd_event_source_set_description(bus->time_event_source, "bus-time"); | ||||
3569 | if (r < 0) | ||||
3570 | goto fail; | ||||
3571 | |||||
3572 | r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus); | ||||
3573 | if (r < 0) | ||||
3574 | goto fail; | ||||
3575 | |||||
3576 | r = sd_event_source_set_description(bus->quit_event_source, "bus-exit"); | ||||
3577 | if (r < 0) | ||||
3578 | goto fail; | ||||
3579 | |||||
3580 | r = bus_attach_io_events(bus); | ||||
3581 | if (r < 0) | ||||
3582 | goto fail; | ||||
3583 | |||||
3584 | r = bus_attach_inotify_event(bus); | ||||
3585 | if (r < 0) | ||||
3586 | goto fail; | ||||
3587 | |||||
3588 | return 0; | ||||
3589 | |||||
3590 | fail: | ||||
3591 | sd_bus_detach_event(bus); | ||||
3592 | return r; | ||||
3593 | } | ||||
3594 | |||||
3595 | _public___attribute__ ((visibility("default"))) int sd_bus_detach_event(sd_bus *bus) { | ||||
3596 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3596, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3597 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3597, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3598 | |||||
3599 | if (!bus->event) | ||||
3600 | return 0; | ||||
3601 | |||||
3602 | bus_detach_io_events(bus); | ||||
3603 | bus_detach_inotify_event(bus); | ||||
3604 | |||||
3605 | if (bus->time_event_source) { | ||||
3606 | sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF); | ||||
3607 | bus->time_event_source = sd_event_source_unref(bus->time_event_source); | ||||
3608 | } | ||||
3609 | |||||
3610 | if (bus->quit_event_source) { | ||||
3611 | sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF); | ||||
3612 | bus->quit_event_source = sd_event_source_unref(bus->quit_event_source); | ||||
3613 | } | ||||
3614 | |||||
3615 | bus->event = sd_event_unref(bus->event); | ||||
3616 | return 1; | ||||
3617 | } | ||||
3618 | |||||
3619 | _public___attribute__ ((visibility("default"))) sd_event* sd_bus_get_event(sd_bus *bus) { | ||||
3620 | assert_return(bus, NULL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3620, __PRETTY_FUNCTION__), 0))) return (((void*)0)); } while (0); | ||||
3621 | |||||
3622 | return bus->event; | ||||
3623 | } | ||||
3624 | |||||
3625 | _public___attribute__ ((visibility("default"))) sd_bus_message* sd_bus_get_current_message(sd_bus *bus) { | ||||
3626 | assert_return(bus, NULL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3626, __PRETTY_FUNCTION__), 0))) return (((void*)0)); } while (0); | ||||
3627 | |||||
3628 | return bus->current_message; | ||||
3629 | } | ||||
3630 | |||||
3631 | _public___attribute__ ((visibility("default"))) sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) { | ||||
3632 | assert_return(bus, NULL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3632, __PRETTY_FUNCTION__), 0))) return (((void*)0)); } while (0); | ||||
3633 | |||||
3634 | return bus->current_slot; | ||||
3635 | } | ||||
3636 | |||||
3637 | _public___attribute__ ((visibility("default"))) sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) { | ||||
3638 | assert_return(bus, NULL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3638, __PRETTY_FUNCTION__), 0))) return (((void*)0)); } while (0); | ||||
3639 | |||||
3640 | return bus->current_handler; | ||||
3641 | } | ||||
3642 | |||||
3643 | _public___attribute__ ((visibility("default"))) void* sd_bus_get_current_userdata(sd_bus *bus) { | ||||
3644 | assert_return(bus, NULL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3644, __PRETTY_FUNCTION__), 0))) return (((void*)0)); } while (0); | ||||
3645 | |||||
3646 | return bus->current_userdata; | ||||
3647 | } | ||||
3648 | |||||
3649 | static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) { | ||||
3650 | sd_bus *b = NULL((void*)0); | ||||
3651 | int r; | ||||
3652 | |||||
3653 | assert(bus_open)do { if ((__builtin_expect(!!(!(bus_open)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("bus_open"), "../src/libsystemd/sd-bus/sd-bus.c" , 3653, __PRETTY_FUNCTION__); } while (0); | ||||
3654 | assert(default_bus)do { if ((__builtin_expect(!!(!(default_bus)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("default_bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3654, __PRETTY_FUNCTION__); } while (0); | ||||
3655 | |||||
3656 | if (!ret) | ||||
3657 | return !!*default_bus; | ||||
3658 | |||||
3659 | if (*default_bus) { | ||||
3660 | *ret = sd_bus_ref(*default_bus); | ||||
3661 | return 0; | ||||
3662 | } | ||||
3663 | |||||
3664 | r = bus_open(&b); | ||||
3665 | if (r < 0) | ||||
3666 | return r; | ||||
3667 | |||||
3668 | b->default_bus_ptr = default_bus; | ||||
3669 | b->tid = gettid(); | ||||
3670 | *default_bus = b; | ||||
3671 | |||||
3672 | *ret = b; | ||||
3673 | return 1; | ||||
3674 | } | ||||
3675 | |||||
3676 | _public___attribute__ ((visibility("default"))) int sd_bus_default_system(sd_bus **ret) { | ||||
3677 | return bus_default(sd_bus_open_system, &default_system_bus, ret); | ||||
3678 | } | ||||
3679 | |||||
3680 | _public___attribute__ ((visibility("default"))) int sd_bus_default_user(sd_bus **ret) { | ||||
3681 | return bus_default(sd_bus_open_user, &default_user_bus, ret); | ||||
3682 | } | ||||
3683 | |||||
3684 | _public___attribute__ ((visibility("default"))) int sd_bus_default(sd_bus **ret) { | ||||
3685 | int (*bus_open)(sd_bus **) = NULL((void*)0); | ||||
3686 | sd_bus **busp; | ||||
3687 | |||||
3688 | busp = bus_choose_default(&bus_open); | ||||
3689 | return bus_default(bus_open, busp, ret); | ||||
3690 | } | ||||
3691 | |||||
3692 | _public___attribute__ ((visibility("default"))) int sd_bus_get_tid(sd_bus *b, pid_t *tid) { | ||||
3693 | assert_return(b, -EINVAL)do { if (!(((__builtin_expect(!!(b),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("b"), "../src/libsystemd/sd-bus/sd-bus.c" , 3693, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3694 | assert_return(tid, -EINVAL)do { if (!(((__builtin_expect(!!(tid),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("tid"), "../src/libsystemd/sd-bus/sd-bus.c" , 3694, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3695 | assert_return(!bus_pid_changed(b), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(b)),1))) ? ( 1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(b)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3695, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3696 | |||||
3697 | if (b->tid != 0) { | ||||
3698 | *tid = b->tid; | ||||
3699 | return 0; | ||||
3700 | } | ||||
3701 | |||||
3702 | if (b->event) | ||||
3703 | return sd_event_get_tid(b->event, tid); | ||||
3704 | |||||
3705 | return -ENXIO6; | ||||
3706 | } | ||||
3707 | |||||
3708 | _public___attribute__ ((visibility("default"))) int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) { | ||||
3709 | _cleanup_free___attribute__((cleanup(freep))) char *e = NULL((void*)0); | ||||
3710 | char *ret; | ||||
3711 | |||||
3712 | assert_return(object_path_is_valid(prefix), -EINVAL)do { if (!(((__builtin_expect(!!(object_path_is_valid(prefix) ),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("object_path_is_valid(prefix)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3712, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3713 | assert_return(external_id, -EINVAL)do { if (!(((__builtin_expect(!!(external_id),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("external_id"), "../src/libsystemd/sd-bus/sd-bus.c" , 3713, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3714 | assert_return(ret_path, -EINVAL)do { if (!(((__builtin_expect(!!(ret_path),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret_path"), "../src/libsystemd/sd-bus/sd-bus.c" , 3714, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3715 | |||||
3716 | e = bus_label_escape(external_id); | ||||
3717 | if (!e) | ||||
3718 | return -ENOMEM12; | ||||
3719 | |||||
3720 | ret = strjoin(prefix, "/", e)strjoin_real((prefix), "/", e, ((void*)0)); | ||||
3721 | if (!ret) | ||||
3722 | return -ENOMEM12; | ||||
3723 | |||||
3724 | *ret_path = ret; | ||||
3725 | return 0; | ||||
3726 | } | ||||
3727 | |||||
3728 | _public___attribute__ ((visibility("default"))) int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) { | ||||
3729 | const char *e; | ||||
3730 | char *ret; | ||||
3731 | |||||
3732 | assert_return(object_path_is_valid(path), -EINVAL)do { if (!(((__builtin_expect(!!(object_path_is_valid(path)), 1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("object_path_is_valid(path)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3732, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3733 | assert_return(object_path_is_valid(prefix), -EINVAL)do { if (!(((__builtin_expect(!!(object_path_is_valid(prefix) ),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("object_path_is_valid(prefix)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3733, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3734 | assert_return(external_id, -EINVAL)do { if (!(((__builtin_expect(!!(external_id),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("external_id"), "../src/libsystemd/sd-bus/sd-bus.c" , 3734, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3735 | |||||
3736 | e = object_path_startswith(path, prefix); | ||||
3737 | if (!e) { | ||||
3738 | *external_id = NULL((void*)0); | ||||
3739 | return 0; | ||||
3740 | } | ||||
3741 | |||||
3742 | ret = bus_label_unescape(e); | ||||
3743 | if (!ret) | ||||
3744 | return -ENOMEM12; | ||||
3745 | |||||
3746 | *external_id = ret; | ||||
3747 | return 1; | ||||
3748 | } | ||||
3749 | |||||
3750 | _public___attribute__ ((visibility("default"))) int sd_bus_path_encode_many(char **out, const char *path_template, ...) { | ||||
3751 | _cleanup_strv_free___attribute__((cleanup(strv_freep))) char **labels = NULL((void*)0); | ||||
3752 | char *path, *path_pos, **label_pos; | ||||
3753 | const char *sep, *template_pos; | ||||
3754 | size_t path_length; | ||||
3755 | va_list list; | ||||
3756 | int r; | ||||
3757 | |||||
3758 | assert_return(out, -EINVAL)do { if (!(((__builtin_expect(!!(out),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("out"), "../src/libsystemd/sd-bus/sd-bus.c" , 3758, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3759 | assert_return(path_template, -EINVAL)do { if (!(((__builtin_expect(!!(path_template),1))) ? (1) : ( log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("path_template" ), "../src/libsystemd/sd-bus/sd-bus.c", 3759, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
3760 | |||||
3761 | path_length = strlen(path_template); | ||||
3762 | |||||
3763 | va_start(list, path_template)__builtin_va_start(list, path_template); | ||||
3764 | for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) { | ||||
3765 | const char *arg; | ||||
3766 | char *label; | ||||
3767 | |||||
3768 | arg = va_arg(list, const char *)__builtin_va_arg(list, const char *); | ||||
3769 | if (!arg) { | ||||
3770 | va_end(list)__builtin_va_end(list); | ||||
3771 | return -EINVAL22; | ||||
3772 | } | ||||
3773 | |||||
3774 | label = bus_label_escape(arg); | ||||
3775 | if (!label) { | ||||
3776 | va_end(list)__builtin_va_end(list); | ||||
3777 | return -ENOMEM12; | ||||
3778 | } | ||||
3779 | |||||
3780 | r = strv_consume(&labels, label); | ||||
3781 | if (r < 0) { | ||||
3782 | va_end(list)__builtin_va_end(list); | ||||
3783 | return r; | ||||
3784 | } | ||||
3785 | |||||
3786 | /* add label length, but account for the format character */ | ||||
3787 | path_length += strlen(label) - 1; | ||||
3788 | } | ||||
3789 | va_end(list)__builtin_va_end(list); | ||||
3790 | |||||
3791 | path = malloc(path_length + 1); | ||||
3792 | if (!path) | ||||
3793 | return -ENOMEM12; | ||||
3794 | |||||
3795 | path_pos = path; | ||||
3796 | label_pos = labels; | ||||
3797 | |||||
3798 | for (template_pos = path_template; *template_pos; ) { | ||||
3799 | sep = strchrnul(template_pos, '%'); | ||||
3800 | path_pos = mempcpy(path_pos, template_pos, sep - template_pos); | ||||
3801 | if (!*sep) | ||||
3802 | break; | ||||
3803 | |||||
3804 | path_pos = stpcpy(path_pos, *label_pos++); | ||||
3805 | template_pos = sep + 1; | ||||
3806 | } | ||||
3807 | |||||
3808 | *path_pos = 0; | ||||
3809 | *out = path; | ||||
3810 | return 0; | ||||
3811 | } | ||||
3812 | |||||
3813 | _public___attribute__ ((visibility("default"))) int sd_bus_path_decode_many(const char *path, const char *path_template, ...) { | ||||
3814 | _cleanup_strv_free___attribute__((cleanup(strv_freep))) char **labels = NULL((void*)0); | ||||
3815 | const char *template_pos, *path_pos; | ||||
3816 | char **label_pos; | ||||
3817 | va_list list; | ||||
3818 | int r; | ||||
3819 | |||||
3820 | /* | ||||
3821 | * This decodes an object-path based on a template argument. The | ||||
3822 | * template consists of a verbatim path, optionally including special | ||||
3823 | * directives: | ||||
3824 | * | ||||
3825 | * - Each occurrence of '%' in the template matches an arbitrary | ||||
3826 | * substring of a label in the given path. At most one such | ||||
3827 | * directive is allowed per label. For each such directive, the | ||||
3828 | * caller must provide an output parameter (char **) via va_arg. If | ||||
3829 | * NULL is passed, the given label is verified, but not returned. | ||||
3830 | * For each matched label, the *decoded* label is stored in the | ||||
3831 | * passed output argument, and the caller is responsible to free | ||||
3832 | * it. Note that the output arguments are only modified if the | ||||
3833 | * actualy path matched the template. Otherwise, they're left | ||||
3834 | * untouched. | ||||
3835 | * | ||||
3836 | * This function returns <0 on error, 0 if the path does not match the | ||||
3837 | * template, 1 if it matched. | ||||
3838 | */ | ||||
3839 | |||||
3840 | assert_return(path, -EINVAL)do { if (!(((__builtin_expect(!!(path),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("path"), "../src/libsystemd/sd-bus/sd-bus.c" , 3840, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3841 | assert_return(path_template, -EINVAL)do { if (!(((__builtin_expect(!!(path_template),1))) ? (1) : ( log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("path_template" ), "../src/libsystemd/sd-bus/sd-bus.c", 3841, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
3842 | |||||
3843 | path_pos = path; | ||||
3844 | |||||
3845 | for (template_pos = path_template; *template_pos; ) { | ||||
3846 | const char *sep; | ||||
3847 | size_t length; | ||||
3848 | char *label; | ||||
3849 | |||||
3850 | /* verify everything until the next '%' matches verbatim */ | ||||
3851 | sep = strchrnul(template_pos, '%'); | ||||
3852 | length = sep - template_pos; | ||||
3853 | if (strncmp(path_pos, template_pos, length)) | ||||
3854 | return 0; | ||||
3855 | |||||
3856 | path_pos += length; | ||||
3857 | template_pos += length; | ||||
3858 | |||||
3859 | if (!*template_pos) | ||||
3860 | break; | ||||
3861 | |||||
3862 | /* We found the next '%' character. Everything up until here | ||||
3863 | * matched. We now skip ahead to the end of this label and make | ||||
3864 | * sure it matches the tail of the label in the path. Then we | ||||
3865 | * decode the string in-between and save it for later use. */ | ||||
3866 | |||||
3867 | ++template_pos; /* skip over '%' */ | ||||
3868 | |||||
3869 | sep = strchrnul(template_pos, '/'); | ||||
3870 | length = sep - template_pos; /* length of suffix to match verbatim */ | ||||
3871 | |||||
3872 | /* verify the suffixes match */ | ||||
3873 | sep = strchrnul(path_pos, '/'); | ||||
3874 | if (sep - path_pos < (ssize_t)length || | ||||
3875 | strncmp(sep - length, template_pos, length)) | ||||
3876 | return 0; | ||||
3877 | |||||
3878 | template_pos += length; /* skip over matched label */ | ||||
3879 | length = sep - path_pos - length; /* length of sub-label to decode */ | ||||
3880 | |||||
3881 | /* store unescaped label for later use */ | ||||
3882 | label = bus_label_unescape_n(path_pos, length); | ||||
3883 | if (!label) | ||||
3884 | return -ENOMEM12; | ||||
3885 | |||||
3886 | r = strv_consume(&labels, label); | ||||
3887 | if (r < 0) | ||||
3888 | return r; | ||||
3889 | |||||
3890 | path_pos = sep; /* skip decoded label and suffix */ | ||||
3891 | } | ||||
3892 | |||||
3893 | /* end of template must match end of path */ | ||||
3894 | if (*path_pos) | ||||
3895 | return 0; | ||||
3896 | |||||
3897 | /* copy the labels over to the caller */ | ||||
3898 | va_start(list, path_template)__builtin_va_start(list, path_template); | ||||
3899 | for (label_pos = labels; label_pos && *label_pos; ++label_pos) { | ||||
3900 | char **arg; | ||||
3901 | |||||
3902 | arg = va_arg(list, char **)__builtin_va_arg(list, char **); | ||||
3903 | if (arg) | ||||
3904 | *arg = *label_pos; | ||||
3905 | else | ||||
3906 | free(*label_pos); | ||||
3907 | } | ||||
3908 | va_end(list)__builtin_va_end(list); | ||||
3909 | |||||
3910 | labels = mfree(labels); | ||||
3911 | return 1; | ||||
3912 | } | ||||
3913 | |||||
3914 | _public___attribute__ ((visibility("default"))) int sd_bus_try_close(sd_bus *bus) { | ||||
3915 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3915, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3916 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3916, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3917 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3917, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3918 | |||||
3919 | return -EOPNOTSUPP95; | ||||
3920 | } | ||||
3921 | |||||
3922 | _public___attribute__ ((visibility("default"))) int sd_bus_get_description(sd_bus *bus, const char **description) { | ||||
3923 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3923, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3924 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3924, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3925 | assert_return(description, -EINVAL)do { if (!(((__builtin_expect(!!(description),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("description"), "../src/libsystemd/sd-bus/sd-bus.c" , 3925, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3926 | assert_return(bus->description, -ENXIO)do { if (!(((__builtin_expect(!!(bus->description),1))) ? ( 1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("bus->description" ), "../src/libsystemd/sd-bus/sd-bus.c", 3926, __PRETTY_FUNCTION__ ), 0))) return (-6); } while (0); | ||||
3927 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3927, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3928 | |||||
3929 | if (bus->description) | ||||
3930 | *description = bus->description; | ||||
3931 | else if (bus->is_system) | ||||
3932 | *description = "system"; | ||||
3933 | else if (bus->is_user) | ||||
3934 | *description = "user"; | ||||
3935 | else | ||||
3936 | *description = NULL((void*)0); | ||||
3937 | |||||
3938 | return 0; | ||||
3939 | } | ||||
3940 | |||||
3941 | int bus_get_root_path(sd_bus *bus) { | ||||
3942 | int r; | ||||
3943 | |||||
3944 | if (bus->cgroup_root) | ||||
3945 | return 0; | ||||
3946 | |||||
3947 | r = cg_get_root_path(&bus->cgroup_root); | ||||
3948 | if (r == -ENOENT2) { | ||||
3949 | bus->cgroup_root = strdup("/"); | ||||
3950 | if (!bus->cgroup_root) | ||||
3951 | return -ENOMEM12; | ||||
3952 | |||||
3953 | r = 0; | ||||
3954 | } | ||||
3955 | |||||
3956 | return r; | ||||
3957 | } | ||||
3958 | |||||
3959 | _public___attribute__ ((visibility("default"))) int sd_bus_get_scope(sd_bus *bus, const char **scope) { | ||||
3960 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3960, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3961 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3961, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3962 | assert_return(scope, -EINVAL)do { if (!(((__builtin_expect(!!(scope),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("scope"), "../src/libsystemd/sd-bus/sd-bus.c" , 3962, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3963 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3963, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3964 | |||||
3965 | if (bus->is_user) { | ||||
3966 | *scope = "user"; | ||||
3967 | return 0; | ||||
3968 | } | ||||
3969 | |||||
3970 | if (bus->is_system) { | ||||
3971 | *scope = "system"; | ||||
3972 | return 0; | ||||
3973 | } | ||||
3974 | |||||
3975 | return -ENODATA61; | ||||
3976 | } | ||||
3977 | |||||
3978 | _public___attribute__ ((visibility("default"))) int sd_bus_get_address(sd_bus *bus, const char **address) { | ||||
3979 | |||||
3980 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3980, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3981 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3981, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3982 | assert_return(address, -EINVAL)do { if (!(((__builtin_expect(!!(address),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("address"), "../src/libsystemd/sd-bus/sd-bus.c" , 3982, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3983 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3983, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3984 | |||||
3985 | if (bus->address) { | ||||
3986 | *address = bus->address; | ||||
3987 | return 0; | ||||
3988 | } | ||||
3989 | |||||
3990 | return -ENODATA61; | ||||
3991 | } | ||||
3992 | |||||
3993 | _public___attribute__ ((visibility("default"))) int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) { | ||||
3994 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 3994, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3995 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 3995, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
3996 | assert_return(mask, -EINVAL)do { if (!(((__builtin_expect(!!(mask),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("mask"), "../src/libsystemd/sd-bus/sd-bus.c" , 3996, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
3997 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 3997, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
3998 | |||||
3999 | *mask = bus->creds_mask; | ||||
4000 | return 0; | ||||
4001 | } | ||||
4002 | |||||
4003 | _public___attribute__ ((visibility("default"))) int sd_bus_is_bus_client(sd_bus *bus) { | ||||
4004 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4004, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4005 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4005, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4006 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4006, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4007 | |||||
4008 | return bus->bus_client; | ||||
4009 | } | ||||
4010 | |||||
4011 | _public___attribute__ ((visibility("default"))) int sd_bus_is_server(sd_bus *bus) { | ||||
4012 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4012, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4013 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4013, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4014 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4014, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4015 | |||||
4016 | return bus->is_server; | ||||
4017 | } | ||||
4018 | |||||
4019 | _public___attribute__ ((visibility("default"))) int sd_bus_is_anonymous(sd_bus *bus) { | ||||
4020 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4020, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4021 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4021, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4022 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4022, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4023 | |||||
4024 | return bus->anonymous_auth; | ||||
4025 | } | ||||
4026 | |||||
4027 | _public___attribute__ ((visibility("default"))) int sd_bus_is_trusted(sd_bus *bus) { | ||||
4028 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4028, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4029 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4029, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4030 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4030, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4031 | |||||
4032 | return bus->trusted; | ||||
4033 | } | ||||
4034 | |||||
4035 | _public___attribute__ ((visibility("default"))) int sd_bus_is_monitor(sd_bus *bus) { | ||||
4036 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4036, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4037 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4037, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4038 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4038, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4039 | |||||
4040 | return bus->is_monitor; | ||||
4041 | } | ||||
4042 | |||||
4043 | static void flush_close(sd_bus *bus) { | ||||
4044 | if (!bus) | ||||
4045 | return; | ||||
4046 | |||||
4047 | /* Flushes and closes the specified bus. We take a ref before, | ||||
4048 | * to ensure the flushing does not cause the bus to be | ||||
4049 | * unreferenced. */ | ||||
4050 | |||||
4051 | sd_bus_flush_close_unref(sd_bus_ref(bus)); | ||||
4052 | } | ||||
4053 | |||||
4054 | _public___attribute__ ((visibility("default"))) void sd_bus_default_flush_close(void) { | ||||
4055 | flush_close(default_starter_bus); | ||||
| |||||
4056 | flush_close(default_user_bus); | ||||
4057 | flush_close(default_system_bus); | ||||
4058 | } | ||||
4059 | |||||
4060 | _public___attribute__ ((visibility("default"))) int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) { | ||||
4061 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4061, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4062 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4062, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4063 | |||||
4064 | /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already | ||||
4065 | * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never | ||||
4066 | * from the client side. */ | ||||
4067 | bus->exit_on_disconnect = b; | ||||
4068 | |||||
4069 | /* If the exit condition was triggered already, exit immediately. */ | ||||
4070 | return bus_exit_now(bus); | ||||
4071 | } | ||||
4072 | |||||
4073 | _public___attribute__ ((visibility("default"))) int sd_bus_get_exit_on_disconnect(sd_bus *bus) { | ||||
4074 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4074, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4075 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4075, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4076 | |||||
4077 | return bus->exit_on_disconnect; | ||||
4078 | } | ||||
4079 | |||||
4080 | _public___attribute__ ((visibility("default"))) int sd_bus_set_sender(sd_bus *bus, const char *sender) { | ||||
4081 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4081, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4082 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4082, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4083 | assert_return(!bus->bus_client, -EPERM)do { if (!(((__builtin_expect(!!(!bus->bus_client),1))) ? ( 1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus->bus_client" ), "../src/libsystemd/sd-bus/sd-bus.c", 4083, __PRETTY_FUNCTION__ ), 0))) return (-1); } while (0); | ||||
4084 | assert_return(!sender || service_name_is_valid(sender), -EINVAL)do { if (!(((__builtin_expect(!!(!sender || service_name_is_valid (sender)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD , ("!sender || service_name_is_valid(sender)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4084, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4085 | |||||
4086 | return free_and_strdup(&bus->patch_sender, sender); | ||||
4087 | } | ||||
4088 | |||||
4089 | _public___attribute__ ((visibility("default"))) int sd_bus_get_sender(sd_bus *bus, const char **ret) { | ||||
4090 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4090, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4091 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4091, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4092 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 4092, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4093 | |||||
4094 | if (!bus->patch_sender) | ||||
4095 | return -ENODATA61; | ||||
4096 | |||||
4097 | *ret = bus->patch_sender; | ||||
4098 | return 0; | ||||
4099 | } | ||||
4100 | |||||
4101 | _public___attribute__ ((visibility("default"))) int sd_bus_get_n_queued_read(sd_bus *bus, uint64_t *ret) { | ||||
4102 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4102, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4103 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4103, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4104 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4104, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4105 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 4105, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4106 | |||||
4107 | *ret = bus->rqueue_size; | ||||
4108 | return 0; | ||||
4109 | } | ||||
4110 | |||||
4111 | _public___attribute__ ((visibility("default"))) int sd_bus_get_n_queued_write(sd_bus *bus, uint64_t *ret) { | ||||
4112 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4112, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4113 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4113, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4114 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4114, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4115 | assert_return(ret, -EINVAL)do { if (!(((__builtin_expect(!!(ret),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("ret"), "../src/libsystemd/sd-bus/sd-bus.c" , 4115, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4116 | |||||
4117 | *ret = bus->wqueue_size; | ||||
4118 | return 0; | ||||
4119 | } | ||||
4120 | |||||
4121 | _public___attribute__ ((visibility("default"))) int sd_bus_enqueue_for_read(sd_bus *bus, sd_bus_message *m) { | ||||
4122 | int r; | ||||
4123 | |||||
4124 | assert_return(bus, -EINVAL)do { if (!(((__builtin_expect(!!(bus),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("bus"), "../src/libsystemd/sd-bus/sd-bus.c" , 4124, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4125 | assert_return(bus = bus_resolve(bus), -ENOPKG)do { if (!(((__builtin_expect(!!(bus = bus_resolve(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ( "bus = bus_resolve(bus)"), "../src/libsystemd/sd-bus/sd-bus.c" , 4125, __PRETTY_FUNCTION__), 0))) return (-65); } while (0); | ||||
4126 | assert_return(m, -EINVAL)do { if (!(((__builtin_expect(!!(m),1))) ? (1) : (log_assert_failed_return_realm (LOG_REALM_SYSTEMD, ("m"), "../src/libsystemd/sd-bus/sd-bus.c" , 4126, __PRETTY_FUNCTION__), 0))) return (-22); } while (0); | ||||
4127 | assert_return(m->sealed, -EINVAL)do { if (!(((__builtin_expect(!!(m->sealed),1))) ? (1) : ( log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("m->sealed" ), "../src/libsystemd/sd-bus/sd-bus.c", 4127, __PRETTY_FUNCTION__ ), 0))) return (-22); } while (0); | ||||
4128 | assert_return(!bus_pid_changed(bus), -ECHILD)do { if (!(((__builtin_expect(!!(!bus_pid_changed(bus)),1))) ? (1) : (log_assert_failed_return_realm(LOG_REALM_SYSTEMD, ("!bus_pid_changed(bus)" ), "../src/libsystemd/sd-bus/sd-bus.c", 4128, __PRETTY_FUNCTION__ ), 0))) return (-10); } while (0); | ||||
4129 | |||||
4130 | if (!BUS_IS_OPEN(bus->state)) | ||||
4131 | return -ENOTCONN107; | ||||
4132 | |||||
4133 | /* Re-enqeue a message for reading. This is primarily useful for PolicyKit-style authentication, | ||||
4134 | * where we want accept a message, then determine we need to interactively authenticate the user, and | ||||
4135 | * when we have that process the message again. */ | ||||
4136 | |||||
4137 | r = bus_rqueue_make_room(bus); | ||||
4138 | if (r < 0) | ||||
4139 | return r; | ||||
4140 | |||||
4141 | bus->rqueue[bus->rqueue_size++] = bus_message_ref_queued(m, bus); | ||||
4142 | return 0; | ||||
4143 | } |
1 | /* SPDX-License-Identifier: LGPL-2.1+ */ | |||
2 | #pragma once | |||
3 | ||||
4 | #include <alloca.h> | |||
5 | #include <stddef.h> | |||
6 | #include <stdlib.h> | |||
7 | #include <string.h> | |||
8 | ||||
9 | #include "macro.h" | |||
10 | ||||
11 | #define new(t, n)((t*) malloc_multiply(sizeof(t), (n))) ((t*) malloc_multiply(sizeof(t), (n))) | |||
12 | ||||
13 | #define new0(t, n)((t*) calloc((n), sizeof(t))) ((t*) calloc((n), sizeof(t))) | |||
14 | ||||
15 | #define newa(t, n)({ do { if ((__builtin_expect(!!(!(!size_multiply_overflow(sizeof (t), n))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!size_multiply_overflow(sizeof(t), n)" ), "../src/basic/alloc-util.h", 15, __PRETTY_FUNCTION__); } while (0); (t*) __builtin_alloca (sizeof(t)*(n)); }) \ | |||
16 | ({ \ | |||
17 | assert(!size_multiply_overflow(sizeof(t), n))do { if ((__builtin_expect(!!(!(!size_multiply_overflow(sizeof (t), n))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!size_multiply_overflow(sizeof(t), n)" ), "../src/basic/alloc-util.h", 17, __PRETTY_FUNCTION__); } while (0); \ | |||
18 | (t*) alloca(sizeof(t)*(n))__builtin_alloca (sizeof(t)*(n)); \ | |||
19 | }) | |||
20 | ||||
21 | #define newa0(t, n)({ do { if ((__builtin_expect(!!(!(!size_multiply_overflow(sizeof (t), n))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!size_multiply_overflow(sizeof(t), n)" ), "../src/basic/alloc-util.h", 21, __PRETTY_FUNCTION__); } while (0); (t*) ({ char *_new_; size_t _len_ = sizeof(t)*(n); _new_ = __builtin_alloca (_len_); (void *) memset(_new_, 0, _len_) ; }); }) \ | |||
22 | ({ \ | |||
23 | assert(!size_multiply_overflow(sizeof(t), n))do { if ((__builtin_expect(!!(!(!size_multiply_overflow(sizeof (t), n))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("!size_multiply_overflow(sizeof(t), n)" ), "../src/basic/alloc-util.h", 23, __PRETTY_FUNCTION__); } while (0); \ | |||
24 | (t*) alloca0(sizeof(t)*(n))({ char *_new_; size_t _len_ = sizeof(t)*(n); _new_ = __builtin_alloca (_len_); (void *) memset(_new_, 0, _len_); }); \ | |||
25 | }) | |||
26 | ||||
27 | #define newdup(t, p, n)((t*) memdup_multiply(p, sizeof(t), (n))) ((t*) memdup_multiply(p, sizeof(t), (n))) | |||
28 | ||||
29 | #define newdup_suffix0(t, p, n)((t*) memdup_suffix0_multiply(p, sizeof(t), (n))) ((t*) memdup_suffix0_multiply(p, sizeof(t), (n))) | |||
30 | ||||
31 | #define malloc0(n)(calloc(1, (n))) (calloc(1, (n))) | |||
32 | ||||
33 | static inline void *mfree(void *memory) { | |||
34 | free(memory); | |||
| ||||
35 | return NULL((void*)0); | |||
36 | } | |||
37 | ||||
38 | #define free_and_replace(a, b)({ free(a); (a) = (b); (b) = ((void*)0); 0; }) \ | |||
39 | ({ \ | |||
40 | free(a); \ | |||
41 | (a) = (b); \ | |||
42 | (b) = NULL((void*)0); \ | |||
43 | 0; \ | |||
44 | }) | |||
45 | ||||
46 | void* memdup(const void *p, size_t l) _alloc_(2); | |||
47 | void* memdup_suffix0(const void *p, size_t l) _alloc_(2); | |||
48 | ||||
49 | static inline void freep(void *p) { | |||
50 | free(*(void**) p); | |||
51 | } | |||
52 | ||||
53 | #define _cleanup_free___attribute__((cleanup(freep))) _cleanup_(freep)__attribute__((cleanup(freep))) | |||
54 | ||||
55 | static inline bool_Bool size_multiply_overflow(size_t size, size_t need) { | |||
56 | return _unlikely_(need != 0 && size > (SIZE_MAX / need))(__builtin_expect(!!(need != 0 && size > ((18446744073709551615UL ) / need)),0)); | |||
57 | } | |||
58 | ||||
59 | _malloc___attribute__ ((malloc)) _alloc_(1, 2) static inline void *malloc_multiply(size_t size, size_t need) { | |||
60 | if (size_multiply_overflow(size, need)) | |||
61 | return NULL((void*)0); | |||
62 | ||||
63 | return malloc(size * need); | |||
64 | } | |||
65 | ||||
66 | #if !HAVE_REALLOCARRAY1 | |||
67 | _alloc_(2, 3) static inline void *reallocarray(void *p, size_t need, size_t size) { | |||
68 | if (size_multiply_overflow(size, need)) | |||
69 | return NULL((void*)0); | |||
70 | ||||
71 | return realloc(p, size * need); | |||
72 | } | |||
73 | #endif | |||
74 | ||||
75 | _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t size, size_t need) { | |||
76 | if (size_multiply_overflow(size, need)) | |||
77 | return NULL((void*)0); | |||
78 | ||||
79 | return memdup(p, size * need); | |||
80 | } | |||
81 | ||||
82 | _alloc_(2, 3) static inline void *memdup_suffix0_multiply(const void *p, size_t size, size_t need) { | |||
83 | if (size_multiply_overflow(size, need)) | |||
84 | return NULL((void*)0); | |||
85 | ||||
86 | return memdup_suffix0(p, size * need); | |||
87 | } | |||
88 | ||||
89 | void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size); | |||
90 | void* greedy_realloc0(void **p, size_t *allocated, size_t need, size_t size); | |||
91 | ||||
92 | #define GREEDY_REALLOC(array, allocated, need)greedy_realloc((void**) &(array), &(allocated), (need ), sizeof((array)[0])) \ | |||
93 | greedy_realloc((void**) &(array), &(allocated), (need), sizeof((array)[0])) | |||
94 | ||||
95 | #define GREEDY_REALLOC0(array, allocated, need)greedy_realloc0((void**) &(array), &(allocated), (need ), sizeof((array)[0])) \ | |||
96 | greedy_realloc0((void**) &(array), &(allocated), (need), sizeof((array)[0])) | |||
97 | ||||
98 | #define alloca0(n)({ char *_new_; size_t _len_ = n; _new_ = __builtin_alloca (_len_ ); (void *) memset(_new_, 0, _len_); }) \ | |||
99 | ({ \ | |||
100 | char *_new_; \ | |||
101 | size_t _len_ = n; \ | |||
102 | _new_ = alloca(_len_)__builtin_alloca (_len_); \ | |||
103 | (void *) memset(_new_, 0, _len_); \ | |||
104 | }) | |||
105 | ||||
106 | /* It's not clear what alignment glibc/gcc alloca() guarantee, hence provide a guaranteed safe version */ | |||
107 | #define alloca_align(size, align)({ void *_ptr_; size_t _mask_ = (align) - 1; _ptr_ = __builtin_alloca ((size) + _mask_); (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); }) \ | |||
108 | ({ \ | |||
109 | void *_ptr_; \ | |||
110 | size_t _mask_ = (align) - 1; \ | |||
111 | _ptr_ = alloca((size) + _mask_)__builtin_alloca ((size) + _mask_); \ | |||
112 | (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); \ | |||
113 | }) | |||
114 | ||||
115 | #define alloca0_align(size, align)({ void *_new_; size_t _size_ = (size); _new_ = ({ void *_ptr_ ; size_t _mask_ = ((align)) - 1; _ptr_ = __builtin_alloca ((_size_ ) + _mask_); (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_ ); }); (void*)memset(_new_, 0, _size_); }) \ | |||
116 | ({ \ | |||
117 | void *_new_; \ | |||
118 | size_t _size_ = (size); \ | |||
119 | _new_ = alloca_align(_size_, (align))({ void *_ptr_; size_t _mask_ = ((align)) - 1; _ptr_ = __builtin_alloca ((_size_) + _mask_); (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); }); \ | |||
120 | (void*)memset(_new_, 0, _size_); \ | |||
121 | }) | |||
122 | ||||
123 | /* Takes inspiration from Rusts's Option::take() method: reads and returns a pointer, but at the same time resets it to | |||
124 | * NULL. See: https://doc.rust-lang.org/std/option/enum.Option.html#method.take */ | |||
125 | #define TAKE_PTR(ptr)({ typeof(ptr) _ptr_ = (ptr); (ptr) = ((void*)0); _ptr_; }) \ | |||
126 | ({ \ | |||
127 | typeof(ptr) _ptr_ = (ptr); \ | |||
128 | (ptr) = NULL((void*)0); \ | |||
129 | _ptr_; \ | |||
130 | }) |