X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-control.c;h=bb6683efff6e0b7ee32d663202327d2391de02af;hp=e7e9ba07b0a4f5bab1681f1036624cf9ee5415f0;hb=09365592341b4ba4ceca677bb551dcde811e0333;hpb=607553f9306286fdccf0b356bc3d1087adfe21c4 diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index e7e9ba07b..bb6683eff 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -237,11 +237,9 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0) return -ENOMEM; - r = strv_push(x, n); - if (r < 0) { - free(n); - return -ENOMEM; - } + r = strv_consume(x, n); + if (r < 0) + return r; previous_id = name->owner_id; } @@ -379,9 +377,10 @@ static int bus_get_owner_kdbus( cmd = alloca0(size); strcpy(cmd->name, name); } - cmd->flags = KDBUS_ATTACH_NAMES; cmd->size = size; + kdbus_translate_attach_flags(mask, (uint64_t*) &cmd->flags); + r = ioctl(bus->input_fd, KDBUS_CMD_CONN_INFO, cmd); if (r < 0) return -errno; @@ -553,6 +552,18 @@ static int bus_get_owner_kdbus( c->mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES; } break; + + case KDBUS_ITEM_CONN_NAME: + if ((mask & SD_BUS_CREDS_CONNECTION_NAME)) { + c->conn_name = strdup(item->str); + if (!c->conn_name) { + r = -ENOMEM; + goto fail; + } + + c->mask |= SD_BUS_CREDS_CONNECTION_NAME; + } + break; } } @@ -674,8 +685,8 @@ static int bus_get_owner_dbus1( } if (mask & SD_BUS_CREDS_SELINUX_CONTEXT) { - const void *p; - size_t sz; + const void *p = NULL; + size_t sz = 0; r = sd_bus_call_method( bus, @@ -913,7 +924,7 @@ int bus_add_match_internal_kernel( struct kdbus_cmd_match *m; struct kdbus_item *item; - uint64_t bloom[BLOOM_SIZE/8]; + uint64_t *bloom; size_t sz; const char *sender = NULL; size_t sender_length = 0; @@ -926,7 +937,7 @@ int bus_add_match_internal_kernel( assert(bus); - zero(bloom); + bloom = alloca0(bus->bloom_size); sz = ALIGN8(offsetof(struct kdbus_cmd_match, items)); @@ -956,7 +967,7 @@ int bus_add_match_internal_kernel( if (c->value_u8 != SD_BUS_MESSAGE_SIGNAL) matches_name_change = false; - bloom_add_pair(bloom, "message-type", bus_message_type_to_string(c->value_u8)); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, "message-type", bus_message_type_to_string(c->value_u8)); using_bloom = true; break; @@ -964,7 +975,7 @@ int bus_add_match_internal_kernel( if (!streq(c->value_str, "org.freedesktop.DBus")) matches_name_change = false; - bloom_add_pair(bloom, "interface", c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, "interface", c->value_str); using_bloom = true; break; @@ -972,7 +983,7 @@ int bus_add_match_internal_kernel( if (!streq(c->value_str, "NameOwnerChanged")) matches_name_change = false; - bloom_add_pair(bloom, "member", c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, "member", c->value_str); using_bloom = true; break; @@ -980,13 +991,13 @@ int bus_add_match_internal_kernel( if (!streq(c->value_str, "/org/freedesktop/DBus")) matches_name_change = false; - bloom_add_pair(bloom, "path", c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, "path", c->value_str); using_bloom = true; break; case BUS_MATCH_PATH_NAMESPACE: if (!streq(c->value_str, "/")) { - bloom_add_pair(bloom, "path-slash-prefix", c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, "path-slash-prefix", c->value_str); using_bloom = true; } break; @@ -998,7 +1009,7 @@ int bus_add_match_internal_kernel( name_change_arg[c->type - BUS_MATCH_ARG] = c->value_str; snprintf(buf, sizeof(buf), "arg%u", c->type - BUS_MATCH_ARG); - bloom_add_pair(bloom, buf, c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, buf, c->value_str); using_bloom = true; break; } @@ -1007,7 +1018,7 @@ int bus_add_match_internal_kernel( char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")]; snprintf(buf, sizeof(buf), "arg%u-slash-prefix", c->type - BUS_MATCH_ARG_PATH); - bloom_add_pair(bloom, buf, c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, buf, c->value_str); using_bloom = true; break; } @@ -1016,7 +1027,7 @@ int bus_add_match_internal_kernel( char buf[sizeof("arg")-1 + 2 + sizeof("-dot-prefix")]; snprintf(buf, sizeof(buf), "arg%u-dot-prefix", c->type - BUS_MATCH_ARG_NAMESPACE); - bloom_add_pair(bloom, buf, c->value_str); + bloom_add_pair(bloom, bus->bloom_size, bus->bloom_n_hash, buf, c->value_str); using_bloom = true; break; } @@ -1039,7 +1050,7 @@ int bus_add_match_internal_kernel( } if (using_bloom) - sz += ALIGN8(offsetof(struct kdbus_item, data64) + BLOOM_SIZE); + sz += ALIGN8(offsetof(struct kdbus_item, data64) + bus->bloom_size); m = alloca0(sz); m->size = sz; @@ -1056,9 +1067,9 @@ int bus_add_match_internal_kernel( } if (using_bloom) { - item->size = offsetof(struct kdbus_item, data64) + BLOOM_SIZE; - item->type = KDBUS_ITEM_BLOOM; - memcpy(item->data64, bloom, BLOOM_SIZE); + item->size = offsetof(struct kdbus_item, data64) + bus->bloom_size; + item->type = KDBUS_ITEM_BLOOM_MASK; + memcpy(item->data64, bloom, bus->bloom_size); item = KDBUS_ITEM_NEXT(item); } @@ -1087,13 +1098,22 @@ int bus_add_match_internal_kernel( return 0; } +#define internal_match(bus, m) \ + ((bus)->hello_flags & KDBUS_HELLO_MONITOR \ + ? (isempty(m) ? "eavesdrop='true'" : strappenda((m), ",eavesdrop='true'")) \ + : (m)) + static int bus_add_match_internal_dbus1( sd_bus *bus, const char *match) { + const char *e; + assert(bus); assert(match); + e = internal_match(bus, match); + return sd_bus_call_method( bus, "org.freedesktop.DBus", @@ -1103,7 +1123,7 @@ static int bus_add_match_internal_dbus1( NULL, NULL, "s", - match); + e); } int bus_add_match_internal( @@ -1148,9 +1168,13 @@ static int bus_remove_match_internal_dbus1( sd_bus *bus, const char *match) { + const char *e; + assert(bus); assert(match); + e = internal_match(bus, match); + return sd_bus_call_method( bus, "org.freedesktop.DBus", @@ -1160,7 +1184,7 @@ static int bus_remove_match_internal_dbus1( NULL, NULL, "s", - match); + e); } int bus_remove_match_internal( @@ -1194,14 +1218,15 @@ _public_ int sd_bus_get_owner_machine_id(sd_bus *bus, const char *name, sd_id128 r = sd_bus_message_new_method_call( bus, + &m, name, "/", "org.freedesktop.DBus.Peer", - "GetMachineId", &m); + "GetMachineId"); if (r < 0) return r; - r = sd_bus_message_set_no_auto_start(m, true); + r = sd_bus_message_set_auto_start(m, false); if (r < 0) return r;