chiark / gitweb /
busctl: add command to dump creds of a peer or pid
authorLennart Poettering <lennart@poettering.net>
Mon, 2 Dec 2013 17:40:19 +0000 (18:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Dec 2013 17:40:43 +0000 (18:40 +0100)
(also, rename _SD_BUS_CREDS_MAX to _SD_BUX_CRED_ALL, since "MAX" so far
was used to indicate one higher than the highest valid value, and this
is not correct here.)

src/libsystemd-bus/bus-control.c
src/libsystemd-bus/bus-creds.c
src/libsystemd-bus/busctl.c
src/libsystemd-bus/sd-bus.c
src/libsystemd-bus/test-bus-creds.c
src/libsystemd-bus/test-bus-kernel.c
src/systemd/sd-bus.h

index 4f8c623..77c4543 100644 (file)
@@ -598,7 +598,7 @@ _public_ int sd_bus_get_owner(
 
         assert_return(bus, -EINVAL);
         assert_return(name, -EINVAL);
-        assert_return(mask <= _SD_BUS_CREDS_MAX, -ENOTSUP);
+        assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
         assert_return(mask == 0 || creds, -EINVAL);
         assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
         assert_return(!bus_pid_changed(bus), -ECHILD);
index 54dcd41..6071312 100644 (file)
@@ -126,7 +126,7 @@ _public_ int sd_bus_creds_new_from_pid(pid_t pid, uint64_t mask, sd_bus_creds **
         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)
index f557e50..f1ae051 100644 (file)
@@ -215,8 +215,33 @@ static int monitor(sd_bus *bus, char *argv[]) {
                         return r;
                 }
         }
+}
 
-        return -EINVAL;
+static int status(sd_bus *bus, char *argv[]) {
+        _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+        pid_t pid;
+        int r;
+
+        assert(bus);
+
+        if (strv_length(argv) != 2) {
+                log_error("Expects one argument.");
+                return -EINVAL;
+        }
+
+        r = parse_pid(argv[1], &pid);
+        if (r < 0)
+                r = sd_bus_get_owner(bus, argv[1], _SD_BUS_CREDS_ALL, &creds);
+        else
+                r = sd_bus_creds_new_from_pid(pid, _SD_BUS_CREDS_ALL, &creds);
+
+        if (r < 0) {
+                log_error("Failed to get credentials: %s", strerror(-r));
+                return r;
+        }
+
+        bus_creds_dump(creds, NULL);
+        return 0;
 }
 
 static int help(void) {
@@ -347,6 +372,9 @@ static int busctl_main(sd_bus *bus, int argc, char *argv[]) {
         if (streq(argv[optind], "monitor"))
                 return monitor(bus, argv + optind);
 
+        if (streq(argv[optind], "status"))
+                return status(bus, argv + optind);
+
         if (streq(argv[optind], "help"))
                 return help();
 
index 1ed08c0..a86e33c 100644 (file)
@@ -287,7 +287,7 @@ _public_ int sd_bus_negotiate_attach_timestamp(sd_bus *bus, int b) {
 
 _public_ int sd_bus_negotiate_attach_creds(sd_bus *bus, uint64_t mask) {
         assert_return(bus, -EINVAL);
-        assert_return(mask <= _SD_BUS_CREDS_MAX, -EINVAL);
+        assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
         assert_return(bus->state == BUS_UNSET, -EPERM);
         assert_return(!bus_pid_changed(bus), -ECHILD);
 
@@ -2797,7 +2797,7 @@ _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **re
         int r;
 
         assert_return(bus, -EINVAL);
-        assert_return(mask <= _SD_BUS_CREDS_MAX, -ENOTSUP);
+        assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
         assert_return(ret, -EINVAL);
         assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
         assert_return(!bus_pid_changed(bus), -ECHILD);
index 0a9b2ca..966b84c 100644 (file)
@@ -28,14 +28,14 @@ int main(int argc, char *argv[]) {
         _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
         int r;
 
-        r = sd_bus_creds_new_from_pid(0, _SD_BUS_CREDS_MAX, &creds);
+        r = sd_bus_creds_new_from_pid(0, _SD_BUS_CREDS_ALL, &creds);
         assert_se(r >= 0);
 
         bus_creds_dump(creds, NULL);
 
         creds = sd_bus_creds_unref(creds);
 
-        r = sd_bus_creds_new_from_pid(1, _SD_BUS_CREDS_MAX, &creds);
+        r = sd_bus_creds_new_from_pid(1, _SD_BUS_CREDS_ALL, &creds);
         if (r != -EACCES) {
                 assert_se(r >= 0);
                 putchar('\n');
index 23b185d..785e245 100644 (file)
@@ -64,10 +64,10 @@ int main(int argc, char *argv[]) {
         assert_se(r >= 0);
 
         assert_se(sd_bus_negotiate_attach_timestamp(a, 1) >= 0);
-        assert_se(sd_bus_negotiate_attach_creds(a, _SD_BUS_CREDS_MAX) >= 0);
+        assert_se(sd_bus_negotiate_attach_creds(a, _SD_BUS_CREDS_ALL) >= 0);
 
         assert_se(sd_bus_negotiate_attach_timestamp(b, 1) >= 0);
-        assert_se(sd_bus_negotiate_attach_creds(b, _SD_BUS_CREDS_MAX) >= 0);
+        assert_se(sd_bus_negotiate_attach_creds(b, _SD_BUS_CREDS_ALL) >= 0);
 
         r = sd_bus_start(a);
         assert_se(r >= 0);
index 1cce9c5..2598d7e 100644 (file)
@@ -72,7 +72,7 @@ enum {
         SD_BUS_CREDS_AUDIT_LOGIN_UID  = 1ULL << 21,
         SD_BUS_CREDS_UNIQUE_NAME      = 1ULL << 22,
         SD_BUS_CREDS_WELL_KNOWN_NAMES = 1ULL << 23,
-        _SD_BUS_CREDS_MAX             = (1ULL << 24) -1,
+        _SD_BUS_CREDS_ALL             = (1ULL << 24) -1,
 };
 
 /* Callbacks */