Systemd/src/libsystemd-bus/busctl.c
2013-03-20 23:00:10 +01:00

107 lines
3.1 KiB
C

/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
Copyright 2013 Lennart Poettering
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
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 = sd_bus_open_user(&bus);
if (r < 0) {
log_error("Failed to connect to bus: %s", strerror(-r));
goto fail;
}
r = sd_bus_list_names(bus, &l);
if (r < 0) {
log_error("Failed to list names: %s", strerror(-r));
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;
uid_t uid;
/* if ((*i)[0] == ':') */
/* continue; */
printf("%-*s", (int) max_i, *i);
r = sd_bus_get_owner_pid(bus, *i, &pid);
if (r >= 0) {
_cleanup_free_ char *comm = NULL;
printf(" %10lu", (unsigned long) pid);
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;
fail:
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}