X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbusctl.c;h=fdc275ce46d1291c70888010556528a816558396;hp=1d7f575314b7ec4512a77ddc837c41aa2653993e;hb=056f95d0a70413e10e4a4ea9966baabb5a1450ed;hpb=14008e4e9cc6b51d68cd07ed091f788239d92856 diff --git a/src/libsystemd/sd-bus/busctl.c b/src/libsystemd/sd-bus/busctl.c index 1d7f57531..fdc275ce4 100644 --- a/src/libsystemd/sd-bus/busctl.c +++ b/src/libsystemd/sd-bus/busctl.c @@ -34,6 +34,7 @@ #include "bus-dump.h" static bool arg_no_pager = false; +static bool arg_legend = true; static char *arg_address = NULL; static bool arg_unique = false; static bool arg_acquired = false; @@ -75,7 +76,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { pager_open_if_enabled(); - names = hashmap_new(string_hash_func, string_compare_func); + names = hashmap_new(&string_hash_ops); if (!names) return log_oom(); @@ -106,13 +107,15 @@ static int list_bus_names(sd_bus *bus, char **argv) { merged[n] = NULL; strv_sort(merged); - printf("%-*s %*s %-*s %-*s %-*s %-*s %-*s %-*s", - (int) max_i, "NAME", 10, "PID", 15, "PROCESS", 16, "USER", 13, "CONNECTION", 25, "UNIT", 10, "SESSION", 19, "CONNECTION-NAME"); + if (arg_legend) { + printf("%-*s %*s %-*s %-*s %-*s %-*s %-*s %-*s", + (int) max_i, "NAME", 10, "PID", 15, "PROCESS", 16, "USER", 13, "CONNECTION", 25, "UNIT", 10, "SESSION", 19, "CONNECTION-NAME"); - if (arg_show_machine) - puts(" MACHINE"); - else - putchar('\n'); + if (arg_show_machine) + puts(" MACHINE"); + else + putchar('\n'); + } STRV_FOREACH(i, merged) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; @@ -139,7 +142,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { printf("%-*s", (int) max_i, *i); - r = sd_bus_get_owner(bus, *i, + r = sd_bus_get_name_creds(bus, *i, SD_BUS_CREDS_UID|SD_BUS_CREDS_PID|SD_BUS_CREDS_COMM| SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_SESSION| SD_BUS_CREDS_CONNECTION_NAME, &creds); @@ -207,7 +210,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { printf(" - - - - - - - "); if (arg_show_machine) { - r = sd_bus_get_owner_machine_id(bus, *i, &mid); + r = sd_bus_get_name_machine_id(bus, *i, &mid); if (r >= 0) { char m[SD_ID128_STRING_MAX]; printf(" %s\n", sd_id128_to_string(mid, m)); @@ -237,7 +240,7 @@ static int monitor(sd_bus *bus, char *argv[]) { if (!m) return log_oom(); - r = sd_bus_add_match(bus, m, NULL, NULL); + r = sd_bus_add_match(bus, NULL, m, NULL, NULL); if (r < 0) { log_error("Failed to add match: %s", strerror(-r)); return r; @@ -247,7 +250,7 @@ static int monitor(sd_bus *bus, char *argv[]) { } STRV_FOREACH(i, arg_matches) { - r = sd_bus_add_match(bus, *i, NULL, NULL); + r = sd_bus_add_match(bus, NULL, *i, NULL, NULL); if (r < 0) { log_error("Failed to add match: %s", strerror(-r)); return r; @@ -257,7 +260,7 @@ static int monitor(sd_bus *bus, char *argv[]) { } if (!added_something) { - r = sd_bus_add_match(bus, "", NULL, NULL); + r = sd_bus_add_match(bus, NULL, "", NULL, NULL); if (r < 0) { log_error("Failed to add match: %s", strerror(-r)); return r; @@ -303,9 +306,9 @@ static int status(sd_bus *bus, char *argv[]) { r = parse_pid(argv[1], &pid); if (r < 0) - r = sd_bus_get_owner(bus, argv[1], _SD_BUS_CREDS_ALL, &creds); + r = sd_bus_get_name_creds(bus, argv[1], _SD_BUS_CREDS_ALL, &creds); else - r = sd_bus_creds_new_from_pid(pid, _SD_BUS_CREDS_ALL, &creds); + r = sd_bus_creds_new_from_pid(&creds, pid, _SD_BUS_CREDS_ALL); if (r < 0) { log_error("Failed to get credentials: %s", strerror(-r)); @@ -317,12 +320,12 @@ static int status(sd_bus *bus, char *argv[]) { } static int help(void) { - printf("%s [OPTIONS...] {COMMAND} ...\n\n" "Introspect the bus.\n\n" " -h --help Show this help\n" " --version Show package version\n" " --no-pager Do not pipe output into a pager\n" + " --no-legend Do not show the headers and footers\n" " --system Connect to system bus\n" " --user Connect to user bus\n" " -H --host=[USER@]HOST Operate on remote host\n" @@ -337,8 +340,8 @@ static int help(void) { " list List bus names\n" " monitor [SERVICE...] Show bus traffic\n" " status NAME Show name status\n" - " help Show this help\n", - program_invocation_short_name); + " help Show this help\n" + , program_invocation_short_name); return 0; } @@ -348,6 +351,7 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_VERSION = 0x100, ARG_NO_PAGER, + ARG_NO_LEGEND, ARG_SYSTEM, ARG_USER, ARG_ADDRESS, @@ -362,6 +366,7 @@ static int parse_argv(int argc, char *argv[]) { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, ARG_VERSION }, { "no-pager", no_argument, NULL, ARG_NO_PAGER }, + { "no-legend", no_argument, NULL, ARG_NO_LEGEND }, { "system", no_argument, NULL, ARG_SYSTEM }, { "user", no_argument, NULL, ARG_USER }, { "address", required_argument, NULL, ARG_ADDRESS }, @@ -380,7 +385,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "hH:M:", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hH:M:", options, NULL)) >= 0) switch (c) { @@ -396,6 +401,10 @@ static int parse_argv(int argc, char *argv[]) { arg_no_pager = true; break; + case ARG_NO_LEGEND: + arg_legend = false; + break; + case ARG_USER: arg_user = true; break; @@ -445,7 +454,6 @@ static int parse_argv(int argc, char *argv[]) { default: assert_not_reached("Unhandled option"); } - } if (!arg_unique && !arg_acquired && !arg_activatable) arg_unique = arg_acquired = arg_activatable = true; @@ -474,7 +482,7 @@ static int busctl_main(sd_bus *bus, int argc, char *argv[]) { } int main(int argc, char *argv[]) { - _cleanup_bus_unref_ sd_bus *bus = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; int r; log_parse_environment(); @@ -484,29 +492,75 @@ int main(int argc, char *argv[]) { if (r <= 0) goto finish; - if (arg_address) { - r = sd_bus_new(&bus); + r = sd_bus_new(&bus); + if (r < 0) { + log_error("Failed to allocate bus: %s", strerror(-r)); + goto finish; + } + + if (streq_ptr(argv[optind], "monitor")) { + + r = sd_bus_set_monitor(bus, true); if (r < 0) { - log_error("Failed to allocate bus: %s", strerror(-r)); + log_error("Failed to set monitor mode: %s", strerror(-r)); goto finish; } - r = sd_bus_set_address(bus, arg_address); + r = sd_bus_negotiate_creds(bus, _SD_BUS_CREDS_ALL); if (r < 0) { - log_error("Failed to set address: %s", strerror(-r)); + log_error("Failed to enable credentials: %s", strerror(-r)); goto finish; } - r = sd_bus_set_bus_client(bus, true); + r = sd_bus_negotiate_timestamp(bus, true); if (r < 0) { - log_error("Failed to set bus client: %s", strerror(-r)); + log_error("Failed to enable timestamps: %s", strerror(-r)); goto finish; } - r = sd_bus_start(bus); - } else - r = bus_open_transport(arg_transport, arg_host, arg_user, &bus); + r = sd_bus_negotiate_fds(bus, true); + if (r < 0) { + log_error("Failed to enable fds: %s", strerror(-r)); + goto finish; + } + } + + if (arg_address) + r = sd_bus_set_address(bus, arg_address); + else { + switch (arg_transport) { + + case BUS_TRANSPORT_LOCAL: + if (arg_user) + r = bus_set_address_user(bus); + else + r = bus_set_address_system(bus); + break; + + case BUS_TRANSPORT_REMOTE: + r = bus_set_address_system_remote(bus, arg_host); + break; + + case BUS_TRANSPORT_CONTAINER: + r = bus_set_address_system_container(bus, arg_host); + break; + + default: + assert_not_reached("Hmm, unknown transport type."); + } + } + if (r < 0) { + log_error("Failed to set address: %s", strerror(-r)); + goto finish; + } + + r = sd_bus_set_bus_client(bus, true); + if (r < 0) { + log_error("Failed to set bus client: %s", strerror(-r)); + goto finish; + } + r = sd_bus_start(bus); if (r < 0) { log_error("Failed to connect to bus: %s", strerror(-r)); goto finish;