chiark / gitweb /
bus: hook up client with socket communication
[elogind.git] / src / libsystemd-bus / busctl.c
index 88446fcc7c0b10631873c3513efcae26fb7524d3..7348894c5b6f05735a7ecc6da7f52dda478ffb29 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include "strv.h"
+#include "util.h"
+#include "log.h"
+
 #include "sd-bus.h"
+#include "bus-message.h"
+#include "bus-internal.h"
 
 int main(int argc, char *argv[]) {
         _cleanup_bus_unref_ sd_bus *bus = NULL;
         _cleanup_strv_free_ char **l = NULL;
         char **i;
         int r;
+        size_t max_i = 0;
 
-        r = bus_open_system(&bus);
+        r = sd_bus_open_user(&bus);
         if (r < 0) {
                 log_error("Failed to connect to bus: %s", strerror(-r));
                 goto fail;
@@ -39,26 +46,57 @@ int main(int argc, char *argv[]) {
                 goto fail;
         }
 
+        strv_sort(l);
+
+        STRV_FOREACH(i, l)
+                max_i = MAX(max_i, strlen(*i));
+
+        printf("%-*s %*s %-*s %-*s CONNECTION\n",
+               (int) max_i, "NAME", 10, "PID", 15, "PROCESS", 16, "USER");
+
         STRV_FOREACH(i, l) {
                 _cleanup_free_ char *owner = NULL;
-                pid_t pid = 0;
+                pid_t pid;
                 uid_t uid;
-                bool uid_valid;
 
-                r = sd_bus_get_owner(bus, *i, &owner);
-                if (r == -ENXIO)
-                        continue;
+                /* if ((*i)[0] == ':') */
+                /*         continue; */
+
+                printf("%-*s", (int) max_i, *i);
 
-                r = sd_get_owner_pid(bus, *i, &pid);
-                if (r == -ENXIO)
-                        continue;
+                r = sd_bus_get_owner_pid(bus, *i, &pid);
+                if (r >= 0) {
+                        _cleanup_free_ char *comm = NULL;
 
-                r = sd_get_owner_uid(bus, *i, &pid);
-                if (r == -ENXIO)
-                        continue;
-                uid_valid = r >= 0;
+                        printf(" %10lu", (unsigned long) pid);
 
-                printf("%s (%s) %llu %llu\n", *i, owner, (unsigned long long) pid, (unsigned long long) uid);
+                        get_process_comm(pid, &comm);
+                        printf(" %-15s", strna(comm));
+                } else
+                        printf("          - -              ");
+
+                r = sd_bus_get_owner_uid(bus, *i, &uid);
+                if (r >= 0) {
+                        _cleanup_free_ char *u = NULL;
+
+                        u = uid_to_name(uid);
+                        if (!u) {
+                                log_oom();
+                                goto fail;
+                        }
+
+                        if (strlen(u) > 16)
+                                u[16] = 0;
+
+                        printf(" %-16s", u);
+                } else
+                        printf(" -               ");
+
+                r = sd_bus_get_owner(bus, *i, &owner);
+                if (r >= 0)
+                        printf(" %s\n", owner);
+                else
+                        printf(" -\n");
         }
 
         r = 0;