diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index 0f97015bd4..a6dbf0ddb5 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -742,6 +742,9 @@ static void member_hash_func(const Member *m, struct siphash *state) { if (m->name) string_hash_func(m->name, state); + if (m->signature) + string_hash_func(m->signature, state); + if (m->interface) string_hash_func(m->interface, state); } @@ -762,7 +765,11 @@ static int member_compare_func(const Member *x, const Member *y) { if (d != 0) return d; - return strcmp_ptr(x->name, y->name); + d = strcmp_ptr(x->name, y->name); + if (d != 0) + return d; + + return strcmp_ptr(x->signature, y->signature); } static int member_compare_funcp(Member * const *a, Member * const *b) { @@ -809,8 +816,9 @@ static int on_interface(const char *interface, uint64_t flags, void *userdata) { return log_oom(); r = set_put(members, m); - if (r == -EEXIST) - return log_error_errno(r, "Invalid introspection data: duplicate interface '%s'.", interface); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EEXIST), + "Invalid introspection data: duplicate interface '%s'.", interface); if (r < 0) return log_oom(); @@ -852,8 +860,9 @@ static int on_method(const char *interface, const char *name, const char *signat return log_oom(); r = set_put(members, m); - if (r == -EEXIST) - return log_error_errno(r, "Invalid introspection data: duplicate method '%s' on interface '%s'.", name, interface); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EEXIST), + "Invalid introspection data: duplicate method '%s' on interface '%s'.", name, interface); if (r < 0) return log_oom(); @@ -891,8 +900,9 @@ static int on_signal(const char *interface, const char *name, const char *signat return log_oom(); r = set_put(members, m); - if (r == -EEXIST) - return log_error_errno(r, "Invalid introspection data: duplicate signal '%s' on interface '%s'.", name, interface); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EEXIST), + "Invalid introspection data: duplicate signal '%s' on interface '%s'.", name, interface); if (r < 0) return log_oom(); @@ -931,8 +941,9 @@ static int on_property(const char *interface, const char *name, const char *sign return log_oom(); r = set_put(members, m); - if (r == -EEXIST) - return log_error_errno(r, "Invalid introspection data: duplicate property '%s' on interface '%s'.", name, interface); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EEXIST), + "Invalid introspection data: duplicate property '%s' on interface '%s'.", name, interface); if (r < 0) return log_oom();