+_public_ int sd_bus_message_get_cgroup(sd_bus_message *m, const char **ret) {
+ assert_return(m, -EINVAL);
+ assert_return(ret, -EINVAL);
+ assert_return(m->cgroup, -ESRCH);
+
+ *ret = m->cgroup;
+ return 0;
+}
+
+_public_ int sd_bus_message_get_unit(sd_bus_message *m, const char **ret) {
+ int r;
+
+ assert_return(m, -EINVAL);
+ assert_return(ret, -EINVAL);
+ assert_return(m->cgroup, -ESRCH);
+
+ if (!m->unit) {
+ r = cg_path_get_unit(m->cgroup, &m->unit);
+ if (r < 0)
+ return r;
+ }
+
+ *ret = m->unit;
+ return 0;
+}
+
+_public_ int sd_bus_message_get_user_unit(sd_bus_message *m, const char **ret) {
+ int r;
+
+ assert_return(m, -EINVAL);
+ assert_return(ret, -EINVAL);
+ assert_return(m->cgroup, -ESRCH);
+
+ if (!m->user_unit) {
+ r = cg_path_get_user_unit(m->cgroup, &m->user_unit);
+ if (r < 0)
+ return r;
+ }
+
+ *ret = m->user_unit;
+ return 0;
+}
+
+_public_ int sd_bus_message_get_session(sd_bus_message *m, const char **ret) {
+ int r;
+
+ assert_return(m, -EINVAL);
+ assert_return(ret, -EINVAL);
+ assert_return(m->cgroup, -ESRCH);
+
+ if (!m->session) {
+ r = cg_path_get_session(m->cgroup, &m->session);
+ if (r < 0)
+ return r;
+ }
+
+ *ret = m->session;
+ return 0;
+}
+
+_public_ int sd_bus_message_get_owner_uid(sd_bus_message *m, uid_t *uid) {
+ assert_return(m, -EINVAL);
+ assert_return(uid, -EINVAL);
+ assert_return(m->cgroup, -ESRCH);
+
+ return cg_path_get_owner_uid(m->cgroup, uid);
+}
+
+_public_ int sd_bus_message_get_cmdline(sd_bus_message *m, char ***cmdline) {
+ size_t n, i;
+ const char *p;
+ bool first;
+
+ assert_return(m, -EINVAL);
+ assert_return(m->cmdline, -ESRCH);
+
+ for (p = m->cmdline, n = 0; p < m->cmdline + m->cmdline_length; p++)
+ if (*p == 0)
+ n++;
+
+ m->cmdline_array = new(char*, n + 1);
+ if (!m->cmdline_array)
+ return -ENOMEM;
+
+ for (p = m->cmdline, i = 0, first = true; p < m->cmdline + m->cmdline_length; p++) {
+ if (first)
+ m->cmdline_array[i++] = (char*) p;
+
+ first = *p == 0;
+ }
+
+ m->cmdline_array[i] = NULL;
+ *cmdline = m->cmdline_array;
+
+ return 0;
+}
+
+_public_ int sd_bus_message_get_audit_sessionid(sd_bus_message *m, uint32_t *sessionid) {
+ assert_return(m, -EINVAL);
+ assert_return(sessionid, -EINVAL);
+ assert_return(m->audit, -ESRCH);
+
+ *sessionid = m->audit->sessionid;
+ return 0;
+}
+
+_public_ int sd_bus_message_get_audit_loginuid(sd_bus_message *m, uid_t *uid) {
+ assert_return(m, -EINVAL);
+ assert_return(uid, -EINVAL);
+ assert_return(m->audit, -ESRCH);
+
+ *uid = m->audit->loginuid;
+ return 0;
+}
+
+_public_ int sd_bus_message_has_effective_cap(sd_bus_message *m, int capability) {
+ unsigned sz;
+
+ assert_return(m, -EINVAL);
+ assert_return(capability < 0, -EINVAL);
+ assert_return(!m->capability, -ESRCH);
+
+ sz = m->capability_size / 4;
+ if ((unsigned) capability >= sz*8)
+ return 0;
+
+ return !!(m->capability[2 * sz + (capability / 8)] & (1 << (capability % 8)));
+}
+
+_public_ int sd_bus_message_is_signal(sd_bus_message *m,
+ const char *interface,
+ const char *member) {
+ assert_return(m, -EINVAL);
+
+ if (m->header->type != SD_BUS_MESSAGE_SIGNAL)
+ return 0;
+
+ if (interface && (!m->interface || !streq(m->interface, interface)))
+ return 0;
+
+ if (member && (!m->member || !streq(m->member, member)))
+ return 0;
+
+ return 1;
+}
+
+_public_ int sd_bus_message_is_method_call(sd_bus_message *m,
+ const char *interface,
+ const char *member) {
+ assert_return(m, -EINVAL);
+
+ if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
+ return 0;
+
+ if (interface && (!m->interface || !streq(m->interface, interface)))
+ return 0;
+
+ if (member && (!m->member || !streq(m->member, member)))
+ return 0;
+
+ return 1;
+}
+
+_public_ int sd_bus_message_is_method_error(sd_bus_message *m, const char *name) {
+ assert_return(m, -EINVAL);
+
+ if (m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
+ return 0;
+
+ if (name && (!m->error.name || !streq(m->error.name, name)))
+ return 0;
+
+ return 1;
+}
+
+_public_ int sd_bus_message_set_no_reply(sd_bus_message *m, int b) {
+ assert_return(m, -EINVAL);
+ assert_return(!m->sealed, -EPERM);
+ assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EPERM);