chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sd-bus: add proper monitoring API
[elogind.git]
/
src
/
libsystemd
/
sd-bus
/
bus-control.c
diff --git
a/src/libsystemd/sd-bus/bus-control.c
b/src/libsystemd/sd-bus/bus-control.c
index e7e9ba07b0a4f5bab1681f1036624cf9ee5415f0..bb6683efff6e0b7ee32d663202327d2391de02af 100644
(file)
--- 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;
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;
}
previous_id = name->owner_id;
}
@@
-379,9
+377,10
@@
static int bus_get_owner_kdbus(
cmd = alloca0(size);
strcpy(cmd->name, name);
}
cmd = alloca0(size);
strcpy(cmd->name, name);
}
- cmd->flags = KDBUS_ATTACH_NAMES;
cmd->size = size;
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;
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;
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) {
}
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,
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;
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;
size_t sz;
const char *sender = NULL;
size_t sender_length = 0;
@@
-926,7
+937,7
@@
int bus_add_match_internal_kernel(
assert(bus);
assert(bus);
-
zero(bloom
);
+
bloom = alloca0(bus->bloom_size
);
sz = ALIGN8(offsetof(struct kdbus_cmd_match, items));
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;
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;
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;
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;
using_bloom = true;
break;
@@
-972,7
+983,7
@@
int bus_add_match_internal_kernel(
if (!streq(c->value_str, "NameOwnerChanged"))
matches_name_change = false;
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;
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;
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, "/")) {
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;
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);
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, bu
s->bloom_size, bus->bloom_n_hash, bu
f, c->value_str);
using_bloom = true;
break;
}
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);
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, bu
s->bloom_size, bus->bloom_n_hash, bu
f, c->value_str);
using_bloom = true;
break;
}
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);
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, bu
s->bloom_size, bus->bloom_n_hash, bu
f, c->value_str);
using_bloom = true;
break;
}
using_bloom = true;
break;
}
@@
-1039,7
+1050,7
@@
int bus_add_match_internal_kernel(
}
if (using_bloom)
}
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;
m = alloca0(sz);
m->size = sz;
@@
-1056,9
+1067,9
@@
int bus_add_match_internal_kernel(
}
if (using_bloom) {
}
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);
}
item = KDBUS_ITEM_NEXT(item);
}
@@
-1087,13
+1098,22
@@
int bus_add_match_internal_kernel(
return 0;
}
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) {
static int bus_add_match_internal_dbus1(
sd_bus *bus,
const char *match) {
+ const char *e;
+
assert(bus);
assert(match);
assert(bus);
assert(match);
+ e = internal_match(bus, match);
+
return sd_bus_call_method(
bus,
"org.freedesktop.DBus",
return sd_bus_call_method(
bus,
"org.freedesktop.DBus",
@@
-1103,7
+1123,7
@@
static int bus_add_match_internal_dbus1(
NULL,
NULL,
"s",
NULL,
NULL,
"s",
-
match
);
+
e
);
}
int bus_add_match_internal(
}
int bus_add_match_internal(
@@
-1148,9
+1168,13
@@
static int bus_remove_match_internal_dbus1(
sd_bus *bus,
const char *match) {
sd_bus *bus,
const char *match) {
+ const char *e;
+
assert(bus);
assert(match);
assert(bus);
assert(match);
+ e = internal_match(bus, match);
+
return sd_bus_call_method(
bus,
"org.freedesktop.DBus",
return sd_bus_call_method(
bus,
"org.freedesktop.DBus",
@@
-1160,7
+1184,7
@@
static int bus_remove_match_internal_dbus1(
NULL,
NULL,
"s",
NULL,
NULL,
"s",
-
match
);
+
e
);
}
int bus_remove_match_internal(
}
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,
r = sd_bus_message_new_method_call(
bus,
+ &m,
name,
"/",
"org.freedesktop.DBus.Peer",
name,
"/",
"org.freedesktop.DBus.Peer",
- "GetMachineId"
, &m
);
+ "GetMachineId");
if (r < 0)
return r;
if (r < 0)
return r;
- r = sd_bus_message_set_
no_auto_start(m, tru
e);
+ r = sd_bus_message_set_
auto_start(m, fals
e);
if (r < 0)
return r;
if (r < 0)
return r;