free(m->fds);
}
+ free(m->cmdline_array);
+
reset_containers(m);
free(m->root_container.signature);
int sd_bus_message_get_uid(sd_bus_message *m, uid_t *uid) {
if (!m)
return -EINVAL;
+ if (!uid)
+ return -EINVAL;
if (!m->uid_valid)
- return -ENOENT;
+ return -ESRCH;
*uid = m->uid;
return 0;
int sd_bus_message_get_gid(sd_bus_message *m, gid_t *gid) {
if (!m)
return -EINVAL;
+ if (!gid)
+ return -EINVAL;
if (!m->gid_valid)
- return -ENOENT;
+ return -ESRCH;
*gid = m->gid;
return 0;
int sd_bus_message_get_pid(sd_bus_message *m, pid_t *pid) {
if (!m)
return -EINVAL;
+ if (!pid)
+ return -EINVAL;
if (m->pid <= 0)
- return -ENOENT;
+ return -ESRCH;
*pid = m->pid;
return 0;
int sd_bus_message_get_tid(sd_bus_message *m, pid_t *tid) {
if (!m)
return -EINVAL;
+ if (!tid)
+ return -EINVAL;
if (m->tid <= 0)
- return -ENOENT;
+ return -ESRCH;
*tid = m->tid;
return 0;
int sd_bus_message_get_pid_starttime(sd_bus_message *m, uint64_t *usec) {
if (!m)
return -EINVAL;
+ if (!usec)
+ return -EINVAL;
if (m->pid_starttime <= 0)
- return -ENOENT;
+ return -ESRCH;
*usec = m->pid_starttime;
return 0;
}
-const char *sd_bus_message_get_label(sd_bus_message *m) {
+int sd_bus_message_get_selinux_context(sd_bus_message *m, const char **ret) {
if (!m)
- return NULL;
+ return -EINVAL;
+ if (!m->label)
+ return -ESRCH;
+
+ *ret = m->label;
+ return 0;
+}
+
+int sd_bus_message_get_monotonic_timestamp(sd_bus_message *m, uint64_t *usec) {
+ if (!m)
+ return -EINVAL;
+ if (!usec)
+ return -EINVAL;
+ if (m->monotonic <= 0)
+ return -ESRCH;
+
+ *usec = m->monotonic;
+ return 0;
+}
+
+int sd_bus_message_get_realtime_timestamp(sd_bus_message *m, uint64_t *usec) {
+ if (!m)
+ return -EINVAL;
+ if (!usec)
+ return -EINVAL;
+ if (m->realtime <= 0)
+ return -ESRCH;
+
+ *usec = m->realtime;
+ return 0;
+}
+
+int sd_bus_message_get_comm(sd_bus_message *m, const char **ret) {
+ if (!m)
+ return -EINVAL;
+ if (!ret)
+ return -EINVAL;
+ if (!m->comm)
+ return -ESRCH;
+
+ *ret = m->comm;
+ return 0;
+}
+
+int sd_bus_message_get_tid_comm(sd_bus_message *m, const char **ret) {
+ if (!m)
+ return -EINVAL;
+ if (!ret)
+ return -EINVAL;
+ if (!m->tid_comm)
+ return -ESRCH;
+
+ *ret = m->tid_comm;
+ return 0;
+}
- return m->label;
+int sd_bus_message_get_exe(sd_bus_message *m, const char **ret) {
+ if (!m)
+ return -EINVAL;
+ if (!ret)
+ return -EINVAL;
+ if (!m->exe)
+ return -ESRCH;
+
+ *ret = m->exe;
+ return 0;
+}
+
+int sd_bus_message_get_cgroup(sd_bus_message *m, const char **ret) {
+ if (!m)
+ return -EINVAL;
+ if (!ret)
+ return -EINVAL;
+ if (!m->cgroup)
+ return -ESRCH;
+
+ *ret = m->cgroup;
+ return 0;
+}
+
+int sd_bus_message_get_cmdline(sd_bus_message *m, char ***cmdline) {
+ size_t n, i;
+ const char *p;
+ bool first;
+
+ if (!m)
+ return -EINVAL;
+
+ if (!m->cmdline)
+ return -ENOENT;
+
+ 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;
}
int sd_bus_message_is_signal(sd_bus_message *m, const char *interface, const char *member) {
int bus_message_seal(sd_bus_message *m, uint64_t serial) {
int r;
+ size_t l, a;
assert(m);
return r;
}
+ l = BUS_MESSAGE_FIELDS_SIZE(m);
+ a = ALIGN8(l) - l;
+
+ if (a > 0) {
+ /* Add padding at the end, since we know the body
+ * needs to start at an 8 byte alignment. */
+ void *p;
+
+ p = message_extend_fields(m, 1, a);
+ if (!p)
+ return -ENOMEM;
+
+ memset(p, 0, a);
+ m->header->fields_size -= a;
+ }
+
m->header->serial = serial;
m->sealed = true;
}
int bus_message_dump(sd_bus_message *m) {
+ char **cmdline = NULL;
unsigned level = 1;
int r;
printf("\tgid=%lu\n", (unsigned long) m->gid);
if (m->pid_starttime != 0)
printf("\tpid_starttime=%llu\n", (unsigned long long) m->pid_starttime);
+ if (m->monotonic != 0)
+ printf("\tmonotonic=%llu\n", (unsigned long long) m->monotonic);
+ if (m->realtime != 0)
+ printf("\trealtime=%llu\n", (unsigned long long) m->realtime);
+ if (m->exe)
+ printf("\texe=[%s]\n", m->exe);
+ if (m->comm)
+ printf("\tcomm=[%s]\n", m->comm);
+ if (m->tid_comm)
+ printf("\ttid_comm=[%s]\n", m->tid_comm);
+ if (m->label)
+ printf("\tlabel=[%s]\n", m->label);
+ if (m->cgroup)
+ printf("\tcgroup=[%s]\n", m->cgroup);
+
+ if (sd_bus_message_get_cmdline(m, &cmdline) >= 0) {
+ char **c;
+
+ fputs("\tcmdline=[", stdout);
+ STRV_FOREACH(c, cmdline) {
+ if (c != cmdline)
+ putchar(' ');
+
+ fputs(*c, stdout);
+ }
+
+ fputs("]\n", stdout);
+ }
r = sd_bus_message_rewind(m, true);
if (r < 0) {
const char* bus_message_get_arg(sd_bus_message *m, unsigned i) {
int r;
- const char *t;
- char type;
+ const char *t = NULL;
+ unsigned j;
assert(m);
if (r < 0)
return NULL;
- while (i > 0) {
+ for (j = 0; j <= i; j++) {
+ char type;
+
r = sd_bus_message_peek_type(m, &type, NULL);
if (r < 0)
return NULL;
r = sd_bus_message_read_basic(m, type, &t);
if (r < 0)
return NULL;
-
- i--;
}
- r = sd_bus_message_rewind(m, true);
- if (r < 0)
- return NULL;
-
return t;
}