m = hashmap_get(c->matches, normalized);
if (!m) {
- r = sd_bus_error_setf(error, SD_BUS_ERROR_MATCH_RULE_NOT_FOUND, "Match rule \"%s\" not found.");
+ r = sd_bus_error_setf(error, SD_BUS_ERROR_MATCH_RULE_NOT_FOUND, "Match rule \"%s\" not found.", normalized);
goto finish;
}
return r;
}
-static int driver_get_security_ctx(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
- _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
- _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
- char *arg0;
+static int get_creds(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) {
+ _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
+ const char *name;
int r;
- r = sd_bus_message_read(m, "s", &arg0);
+ assert(bus);
+ assert(m);
+ assert(_creds);
+
+ r = sd_bus_message_read(m, "s", &name);
if (r < 0)
return r;
- assert_return(service_name_is_valid(arg0), -EINVAL);
+ assert_return(service_name_is_valid(name), -EINVAL);
+
+ r = sd_bus_get_owner(bus, name, mask, &c);
+ if (r == -ENOENT || r == -ENXIO)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Name %s is currently not owned by anyone.", name);
+ if (r < 0)
+ return r;
+
+ if ((c->mask & mask) != mask)
+ return -ENOTSUP;
+
+ *_creds = c;
+ c = NULL;
- r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_SELINUX_CONTEXT, &creds);
+ return 0;
+}
+
+static int driver_get_security_context(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
+ _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
+ _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+ int r;
+
+ r = get_creds(bus, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, error);
if (r < 0)
return r;
static int driver_get_pid(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
- char *arg0;
int r;
- r = sd_bus_message_read(m, "s", &arg0);
- if (r < 0)
- return r;
-
- assert_return(service_name_is_valid(arg0), -EINVAL);
-
- r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_PID, &creds);
+ r = get_creds(bus, m, SD_BUS_CREDS_PID, &creds, error);
if (r < 0)
return r;
- return sd_bus_reply_method_return(m, "u", creds->pid);
+ return sd_bus_reply_method_return(m, "u", (uint32_t) creds->pid);
}
static int driver_get_user(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
- char *arg0;
int r;
- r = sd_bus_message_read(m, "s", &arg0);
+ r = get_creds(bus, m, SD_BUS_CREDS_UID, &creds, error);
if (r < 0)
return r;
- assert_return(service_name_is_valid(arg0), -EINVAL);
+ return sd_bus_reply_method_return(m, "u", (uint32_t) creds->uid);
+}
+
+static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
+ _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+ int r;
- r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_UID, &creds);
+ r = get_creds(bus, m, SD_BUS_CREDS_UNIQUE_NAME, &creds, error);
if (r < 0)
return r;
- return sd_bus_reply_method_return(m, "u", creds->uid);
+ return sd_bus_reply_method_return(m, "s", creds->unique_name);
}
static int driver_get_id(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
return sd_bus_reply_method_return(m, "s", sd_id128_to_string(server_id, buf));
}
-static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
- _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
- char *arg0;
- int r;
-
- r = sd_bus_message_read(m, "s", &arg0);
- if (r < 0)
- return r;
-
- assert_return(service_name_is_valid(arg0), -EINVAL);
-
- r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_UNIQUE_NAME, &creds);
- if (r < 0)
- return r;
-
- return sd_bus_reply_method_return(m, "s", creds->unique_name);
-}
-
static int driver_hello(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
return sd_bus_reply_method_return(m, "s", m->sender);
}
if (!streq(name->name, arg0))
continue;
- if (asprintf(&n, ":1.%llu", (unsigned long long) name->id) < 0)
+ if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0)
return -ENOMEM;
r = strv_push(&owners, n);
}
static int driver_name_has_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
- char *arg0;
+ const char *name;
int r;
- r = sd_bus_message_read(m, "s", &arg0);
+ r = sd_bus_message_read(m, "s", &name);
if (r < 0)
return r;
- assert_return(service_name_is_valid(arg0), -EINVAL);
+ assert_return(service_name_is_valid(name), -EINVAL);
- r = sd_bus_get_owner(bus, arg0, 0, NULL);
- if (r < 0 && r != -ENOENT)
+ r = sd_bus_get_owner(bus, name, 0, NULL);
+ if (r < 0 && r != -ENOENT && r != -ENXIO)
return r;
return sd_bus_reply_method_return(m, "b", r >= 0);
if (r < 0)
return r;
- n->id = id;
+ n->owner_id = id;
r = ioctl(bus->input_fd, KDBUS_CMD_NAME_ACQUIRE, n);
if (r < 0) {
if (r < 0)
return r;
- n->id = id;
+ n->owner_id = id;
r = ioctl(bus->input_fd, KDBUS_CMD_NAME_RELEASE, n);
if (r < 0) {
if (r < 0)
return r;
- if (!t[0] || t[1])
- return -EIO;
+ if (!t || !t[0] || t[1])
+ return sd_bus_error_setf(error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Bus name %s not found.", name);
r = sd_bus_call_method(
bus,
static const sd_bus_vtable driver_vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("AddMatch", "s", NULL, driver_add_match, SD_BUS_VTABLE_UNPRIVILEGED),
- SD_BUS_METHOD("GetConnectionSELinuxSecurityContext", "s", "ay", driver_get_security_ctx, SD_BUS_VTABLE_UNPRIVILEGED),
+ SD_BUS_METHOD("GetConnectionSELinuxSecurityContext", "s", "ay", driver_get_security_context, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("GetConnectionUnixProcessID", "s", "u", driver_get_pid, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("GetConnectionUnixUser", "s", "u", driver_get_user, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("GetId", NULL, "s", driver_get_id, SD_BUS_VTABLE_UNPRIVILEGED),
r = sd_bus_request_name(c->bus, "org.freedesktop.DBus", 0);
if (r < 0) {
- log_error("Unable to request name: %s\n", strerror(-r));
+ log_error("Unable to request name: %s", strerror(-r));
return r;
}