#include "bus-message.h"
#include "bus-util.h"
#include "time-util.h"
+#include "strv.h"
#include "bus-creds.h"
enum {
free(c->user_unit);
free(c->slice);
- free(c->cmdline_array);
+ strv_free(c->cmdline_array);
+ strv_free(c->well_known_names);
}
_public_ sd_bus_creds *sd_bus_creds_ref(sd_bus_creds *c) {
free(c->cgroup);
free(c->capability);
free(c->label);
+ free(c->unique_name);
free(c);
}
} else {
int r;
assert_return(pid >= 0, -EINVAL);
- assert_return(mask <= _SD_BUS_CREDS_MAX, -ENOTSUP);
+ assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
assert_return(ret, -EINVAL);
if (pid == 0)
}
_public_ int sd_bus_creds_get_cmdline(sd_bus_creds *c, char ***cmdline) {
- size_t n, i;
- const char *p;
- bool first;
-
assert_return(c, -EINVAL);
assert_return(c->cmdline, -ESRCH);
assert_return(c->mask & SD_BUS_CREDS_CMDLINE, -ENODATA);
assert(c->cmdline);
- for (p = c->cmdline, n = 0; p < c->cmdline + c->cmdline_length; p++)
- if (*p == 0)
- n++;
-
- *(char***) &c->cmdline_array = new(char*, n + 1);
- if (!c->cmdline_array)
- return -ENOMEM;
-
- for (p = c->cmdline, i = 0, first = true; p < c->cmdline + c->cmdline_length; p++) {
- if (first)
- c->cmdline_array[i++] = (char*) p;
-
- first = *p == 0;
+ if (!c->cmdline_array) {
+ c->cmdline_array = strv_parse_nulstr(c->cmdline, c->cmdline_size);
+ if (!c->cmdline_array)
+ return -ENOMEM;
}
- c->cmdline_array[i] = NULL;
*cmdline = c->cmdline_array;
-
return 0;
}
return 0;
}
+_public_ int sd_bus_creds_get_unique_name(sd_bus_creds *c, const char **unique_name) {
+ assert_return(c, -EINVAL);
+ assert_return(unique_name, -EINVAL);
+ assert_return(c->mask & SD_BUS_CREDS_UNIQUE_NAME, -ENODATA);
+
+ *unique_name = c->unique_name;
+ return 0;
+}
+
+_public_ int sd_bus_creds_get_well_known_names(sd_bus_creds *c, char ***well_known_names) {
+ assert_return(c, -EINVAL);
+ assert_return(well_known_names, -EINVAL);
+ assert_return(c->mask & SD_BUS_CREDS_WELL_KNOWN_NAMES, -ENODATA);
+
+ *well_known_names = c->well_known_names;
+ return 0;
+}
+
static int has_cap(sd_bus_creds *c, unsigned offset, int capability) {
size_t sz;
const char *p;
p = procfs_file_alloca(pid, "cmdline");
- r = read_full_file(p, &c->cmdline, &c->cmdline_length);
+ r = read_full_file(p, &c->cmdline, &c->cmdline_size);
if (r < 0)
return r;
- if (c->cmdline_length == 0) {
+ if (c->cmdline_size == 0) {
free(c->cmdline);
c->cmdline = NULL;
} else
return -ENOMEM;
r = read_one_line_file(p, &c->tid_comm);
- if (r < 0 && r != -ENOENT)
+ if (r < 0)
return r == -ENOENT ? -ESRCH : r;
- else if (r >= 0)
- c->mask |= SD_BUS_CREDS_TID_COMM;
+
+ c->mask |= SD_BUS_CREDS_TID_COMM;
}
if (missing & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID)) {
r = cg_pid_get_path(NULL, pid, &c->cgroup);
- if (r < 0 && r != -ESRCH)
+ if (r < 0)
return r;
- else if (r >= 0)
- c->mask |= missing & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID);
+
+ c->mask |= missing & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID);
}
if (missing & SD_BUS_CREDS_AUDIT_SESSION_ID) {
return 0;
}
-_public_ int sd_bus_creds_extend(sd_bus_creds *c, uint64_t mask, sd_bus_creds **ret) {
+int bus_creds_extend_by_pid(sd_bus_creds *c, uint64_t mask, sd_bus_creds **ret) {
_cleanup_bus_creds_unref_ sd_bus_creds *n = NULL;
int r;
- assert_return(c, -EINVAL);
- assert_return(ret, -EINVAL);
+ assert(c);
+ assert(ret);
if ((mask & ~c->mask) == 0) {
/* There's already all data we need. */
}
if (c->mask & mask & SD_BUS_CREDS_CMDLINE) {
- n->cmdline = memdup(c->cmdline, c->cmdline_length);
+ n->cmdline = memdup(c->cmdline, c->cmdline_size);
if (!n->cmdline)
return -ENOMEM;
- n->cmdline_length = c->cmdline_length;
+ n->cmdline_size = c->cmdline_size;
n->mask |= SD_BUS_CREDS_CMDLINE;
}
n->mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID;
}
+ if (c->mask & mask & SD_BUS_CREDS_UNIQUE_NAME) {
+ n->unique_name = strdup(c->unique_name);
+ if (!n->unique_name)
+ return -ENOMEM;
+ }
+
+ if (c->mask & mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
+ n->well_known_names = strv_copy(c->well_known_names);
+ if (!n->well_known_names)
+ return -ENOMEM;
+ }
+
/* Get more data */
r = bus_creds_add_more(n, mask,