X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-control.c;h=177bd882ada36c569bfc68d31f65459bc775c61e;hb=264ad849a4a0acf1ca392da62b7018d4fe7b66b3;hp=5296029fd64e584aa09ae82f99b30b7fdbce9a00;hpb=75722f1d48cf1a93cc4a24e332c9871808c0e641;p=elogind.git diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c index 5296029fd..177bd882a 100644 --- a/src/libsystemd-bus/bus-control.c +++ b/src/libsystemd-bus/bus-control.c @@ -40,6 +40,8 @@ int sd_bus_get_unique_name(sd_bus *bus, const char **unique) { return -EINVAL; if (!unique) return -EINVAL; + if (bus_pid_changed(bus)) + return -ECHILD; r = bus_ensure_running(bus); if (r < 0) @@ -60,16 +62,19 @@ int sd_bus_request_name(sd_bus *bus, const char *name, int flags) { return -EINVAL; if (!bus->bus_client) return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; if (bus->is_kernel) { struct kdbus_cmd_name *n; size_t l; l = strlen(name); - n = alloca(offsetof(struct kdbus_cmd_name, name) + l + 1); + n = alloca0(offsetof(struct kdbus_cmd_name, name) + l + 1); n->size = offsetof(struct kdbus_cmd_name, name) + l + 1; n->name_flags = flags; - n->id = 0; memcpy(n->name, name, l+1); #ifdef HAVE_VALGRIND_MEMCHECK_H @@ -115,16 +120,18 @@ int sd_bus_release_name(sd_bus *bus, const char *name) { return -EINVAL; if (!bus->bus_client) return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; if (bus->is_kernel) { struct kdbus_cmd_name *n; size_t l; l = strlen(name); - n = alloca(offsetof(struct kdbus_cmd_name, name) + l + 1); + n = alloca0(offsetof(struct kdbus_cmd_name, name) + l + 1); n->size = offsetof(struct kdbus_cmd_name, name) + l + 1; - n->name_flags = 0; - n->id = 0; memcpy(n->name, name, l+1); #ifdef HAVE_VALGRIND_MEMCHECK_H @@ -166,6 +173,10 @@ int sd_bus_list_names(sd_bus *bus, char ***l) { return -EINVAL; if (!l) return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; r = sd_bus_call_method( bus, @@ -216,6 +227,10 @@ int sd_bus_get_owner(sd_bus *bus, const char *name, char **owner) { return -EINVAL; if (!name) return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; r = sd_bus_call_method( bus, @@ -258,6 +273,10 @@ int sd_bus_get_owner_uid(sd_bus *bus, const char *name, uid_t *uid) { return -EINVAL; if (!uid) return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; r = sd_bus_call_method( bus, @@ -291,6 +310,10 @@ int sd_bus_get_owner_pid(sd_bus *bus, const char *name, pid_t *pid) { return -EINVAL; if (!pid) return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; r = sd_bus_call_method( bus, @@ -347,3 +370,39 @@ int bus_remove_match_internal(sd_bus *bus, const char *match) { "s", match); } + +int sd_bus_get_owner_machine_id(sd_bus *bus, const char *name, sd_id128_t *machine) { + _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; + const char *mid; + int r; + + if (!bus) + return -EINVAL; + if (!name) + return -EINVAL; + if (!BUS_IS_OPEN(bus->state)) + return -ENOTCONN; + if (bus_pid_changed(bus)) + return -ECHILD; + + if (streq_ptr(name, bus->unique_name)) + return sd_id128_get_machine(machine); + + r = sd_bus_call_method(bus, + name, + "/", + "org.freedesktop.DBus.Peer", + "GetMachineId", + NULL, + &reply, + NULL); + + if (r < 0) + return r; + + r = sd_bus_message_read(reply, "s", &mid); + if (r < 0) + return r; + + return sd_id128_from_string(mid, machine); +}