| 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 | }) |