}
static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
- _cleanup_free_ char *machine = NULL;
+ _cleanup_free_ char *machine = NULL, *pid = NULL;
int r;
assert(b);
else if (r > 0)
continue;
+ r = parse_address_key(p, "pid", &pid);
+ if (r < 0)
+ return r;
+ else if (r > 0)
+ continue;
+
skip_address_key(p);
}
- if (!machine)
+ if (!machine == !pid)
return -EINVAL;
- if (!machine_name_is_valid(machine))
- return -EINVAL;
+ if (machine) {
+ if (!machine_name_is_valid(machine))
+ return -EINVAL;
- free(b->machine);
- b->machine = machine;
- machine = NULL;
+ free(b->machine);
+ b->machine = machine;
+ machine = NULL;
+ } else {
+ free(b->machine);
+ b->machine = NULL;
+ }
+
+ if (pid) {
+ r = parse_pid(pid, &b->nspid);
+ if (r < 0)
+ return r;
+ } else
+ b->nspid = 0;
b->sockaddr.un.sun_family = AF_UNIX;
strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
}
static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
- _cleanup_free_ char *machine = NULL;
+ _cleanup_free_ char *machine = NULL, *pid = NULL;
int r;
assert(b);
else if (r > 0)
continue;
+ r = parse_address_key(p, "pid", &pid);
+ if (r < 0)
+ return r;
+ else if (r > 0)
+ continue;
+
skip_address_key(p);
}
- if (!machine)
+ if (!machine == !pid)
return -EINVAL;
- if (!machine_name_is_valid(machine))
- return -EINVAL;
+ if (machine) {
+ if (!machine_name_is_valid(machine))
+ return -EINVAL;
- free(b->machine);
- b->machine = machine;
- machine = NULL;
+ free(b->machine);
+ b->machine = machine;
+ machine = NULL;
+ } else {
+ free(b->machine);
+ b->machine = NULL;
+ }
+
+ if (pid) {
+ r = parse_pid(pid, &b->nspid);
+ if (r < 0)
+ return r;
+ } else
+ b->nspid = 0;
free(b->kernel);
b->kernel = strdup("/sys/fs/kdbus/0-system/bus");
b->kernel = NULL;
free(b->machine);
b->machine = NULL;
+ b->nspid = 0;
}
static int bus_parse_next_address(sd_bus *b) {
return r;
break;
- } else if (startswith(a, "x-container-unix:")) {
+ } else if (startswith(a, "x-machine-unix:")) {
a += 17;
r = parse_container_unix_address(b, &a, &guid);
return r;
break;
- } else if (startswith(a, "x-container-kernel:")) {
+ } else if (startswith(a, "x-machine-kernel:")) {
a += 19;
r = parse_container_kernel_address(b, &a, &guid);
if (b->exec_path)
r = bus_socket_exec(b);
- else if (b->machine && b->kernel)
+ else if ((b->nspid > 0 || b->machine) && b->kernel)
r = bus_container_connect_kernel(b);
- else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
+ else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
r = bus_container_connect_socket(b);
else if (b->kernel)
r = bus_kernel_connect(b);
if (e)
return sd_bus_set_address(b, e);
- return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
+ return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
}
_public_ int sd_bus_open_system(sd_bus **ret) {
return -ENOMEM;
#ifdef ENABLE_KDBUS
- (void) asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, getuid(), ee);
+ (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
#else
- (void) asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
+ (void) asprintf(&b->address, UNIX_USER_BUS_ADDRESS_FMT, ee);
#endif
} else {
#ifdef ENABLE_KDBUS
- (void) asprintf(&b->address, KERNEL_USER_BUS_FMT, getuid());
+ (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
#else
return -ECONNREFUSED;
#endif
bus->bus_client = true;
bus->trusted = false;
+ bus->is_system = true;
r = sd_bus_start(bus);
if (r < 0)
return r;
}
-int bus_set_address_system_container(sd_bus *b, const char *machine) {
+int bus_set_address_system_machine(sd_bus *b, const char *machine) {
_cleanup_free_ char *e = NULL;
assert(b);
return -ENOMEM;
#ifdef ENABLE_KDBUS
- b->address = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
+ b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
#else
- b->address = strjoin("x-container-unix:machine=", e, NULL);
+ b->address = strjoin("x-machine-unix:machine=", e, NULL);
#endif
if (!b->address)
return -ENOMEM;
return 0;
}
-_public_ int sd_bus_open_system_container(sd_bus **ret, const char *machine) {
+_public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
sd_bus *bus;
int r;
if (r < 0)
return r;
- r = bus_set_address_system_container(bus, machine);
+ r = bus_set_address_system_machine(bus, machine);
if (r < 0)
goto fail;
bus->bus_client = true;
bus->trusted = false;
+ bus->is_system = true;
r = sd_bus_start(bus);
if (r < 0)
return bus_type_is_valid(type);
}
-_public_ int sd_bus_get_owner_id(sd_bus *bus, sd_id128_t *id) {
+_public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
int r;
assert_return(bus, -EINVAL);
if (need_more)
/* The caller really needs some more data, he doesn't
* care about what's already read, or any timeouts
- * except its own.*/
+ * except its own. */
e |= POLLIN;
else {
usec_t until;
return r;
}
+
+_public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
+ int r;
+
+ assert_return(bus, -EINVAL);
+ assert_return(scope, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ if (bus->is_kernel) {
+ _cleanup_free_ char *n = NULL;
+ const char *dash;
+
+ r = bus_kernel_get_bus_name(bus, &n);
+ if (r < 0)
+ return r;
+
+ if (streq(n, "0-system")) {
+ *scope = "system";
+ return 0;
+ }
+
+ dash = strchr(n, '-');
+ if (streq_ptr(dash, "-user")) {
+ *scope = "user";
+ return 0;
+ }
+ }
+
+ if (bus->is_user) {
+ *scope = "user";
+ return 0;
+ }
+
+ if (bus->is_system) {
+ *scope = "system";
+ return 0;
+ }
+
+ return -ENODATA;
+}
+
+_public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
+
+ assert_return(bus, -EINVAL);
+ assert_return(address, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ if (bus->address) {
+ *address = bus->address;
+ return 0;
+ }
+
+ return -ENODATA;
+}
+
+int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
+ assert_return(bus, -EINVAL);
+ assert_return(mask, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ *mask = bus->creds_mask;
+ return 0;
+}
+
+int sd_bus_is_bus_client(sd_bus *bus) {
+ assert_return(bus, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ return bus->bus_client;
+}
+
+int sd_bus_is_server(sd_bus *bus) {
+ assert_return(bus, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ return bus->is_server;
+}
+
+int sd_bus_is_anonymous(sd_bus *bus) {
+ assert_return(bus, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ return bus->anonymous_auth;
+}
+
+int sd_bus_is_trusted(sd_bus *bus) {
+ assert_return(bus, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ return bus->trusted;
+}
+
+int sd_bus_is_monitor(sd_bus *bus) {
+ assert_return(bus, -EINVAL);
+ assert_return(!bus_pid_changed(bus), -ECHILD);
+
+ return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);
+}