chiark / gitweb /
sd-bus: check return value of vasprintf
[elogind.git] / src / libsystemd / sd-bus / bus-creds.c
index 52e55fc5e134cf320b7011be7f9e5d87d94d9a4a..26c25452bb5a3c0c3e62738f1b02d6d1d3160500 100644 (file)
@@ -30,6 +30,7 @@
 #include "time-util.h"
 #include "strv.h"
 #include "bus-creds.h"
+#include "bus-label.h"
 
 enum {
         CAP_OFFSET_INHERITABLE = 0,
@@ -48,6 +49,7 @@ void bus_creds_done(sd_bus_creds *c) {
         free(c->unit);
         free(c->user_unit);
         free(c->slice);
+        free(c->unescaped_conn_name);
 
         strv_free(c->cmdline_array);
         strv_free(c->well_known_names);
@@ -92,6 +94,7 @@ _public_ sd_bus_creds *sd_bus_creds_unref(sd_bus_creds *c) {
                         free(c->label);
                         free(c->unique_name);
                         free(c->cgroup_root);
+                        free(c->conn_name);
                         free(c);
                 }
         } else {
@@ -123,7 +126,7 @@ sd_bus_creds* bus_creds_new(void) {
         return c;
 }
 
-_public_ int sd_bus_creds_new_from_pid(pid_t pid, uint64_t mask, sd_bus_creds **ret) {
+_public_ int sd_bus_creds_new_from_pid(sd_bus_creds **ret, pid_t pid, uint64_t mask) {
         sd_bus_creds *c;
         int r;
 
@@ -146,7 +149,7 @@ _public_ int sd_bus_creds_new_from_pid(pid_t pid, uint64_t mask, sd_bus_creds **
 
         /* Check if the process existed at all, in case we haven't
          * figured that out already */
-        if (kill(pid, 0) < 0 && errno == ESRCH) {
+        if (!pid_is_alive(pid)) {
                 sd_bus_creds_unref(c);
                 return -ESRCH;
         }
@@ -462,6 +465,25 @@ _public_ int sd_bus_creds_get_well_known_names(sd_bus_creds *c, char ***well_kno
         return 0;
 }
 
+_public_ int sd_bus_creds_get_connection_name(sd_bus_creds *c, const char **ret) {
+        assert_return(c, -EINVAL);
+        assert_return(ret, -EINVAL);
+
+        if (!(c->mask & SD_BUS_CREDS_CONNECTION_NAME))
+                return -ENODATA;
+
+        assert(c->conn_name);
+
+        if (!c->unescaped_conn_name) {
+                c->unescaped_conn_name = bus_label_unescape(c->conn_name);
+                if (!c->unescaped_conn_name)
+                        return -ENOMEM;
+        }
+
+        *ret = c->unescaped_conn_name;
+        return 0;
+}
+
 static int has_cap(sd_bus_creds *c, unsigned offset, int capability) {
         size_t sz;
 
@@ -727,7 +749,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
         if (tid > 0 && (missing & SD_BUS_CREDS_TID_COMM)) {
                 _cleanup_free_ char *p = NULL;
 
-                if (asprintf(&p, "/proc/%lu/task/%lu/comm", (unsigned long) pid, (unsigned long) tid) < 0)
+                if (asprintf(&p, "/proc/"PID_FMT"/task/"PID_FMT"/comm", pid, tid) < 0)
                         return -ENOMEM;
 
                 r = read_one_line_file(p, &c->tid_comm);