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; 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(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; return 0; }
_public_ int sd_bus_query_sender_creds(sd_bus_message *call, uint64_t mask, sd_bus_creds **creds) { sd_bus_creds *c; assert_return(call, -EINVAL); assert_return(call->sealed, -EPERM); assert_return(call->bus, -EINVAL); assert_return(!bus_pid_changed(call->bus), -ECHILD); if (!BUS_IS_OPEN(call->bus->state)) return -ENOTCONN; c = sd_bus_message_get_creds(call); /* All data we need? */ if (c && (mask & ~c->mask) == 0) { *creds = sd_bus_creds_ref(c); return 0; } /* No data passed? Or not enough data passed to retrieve the missing bits? */ if (!c || !(c->mask & SD_BUS_CREDS_PID)) { /* We couldn't read anything from the call, let's try * to get it from the sender or peer */ if (call->sender) return sd_bus_get_owner(call->bus, call->sender, mask, creds); else return sd_bus_get_peer_creds(call->bus, mask, creds); } return bus_creds_extend_by_pid(c, mask, creds); }