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=d8122fdfcffcf83ab2ff31408544449325896278;hp=b6839c13e73f84321c1b3568d956fe901428f4fb;hb=455971c1493fc6dc3125d235cf4ea6102cac626d;hpb=601185b43da638b1c74153deae01dbd518680889 diff --git a/src/libsystemd/sd-bus/busctl.c b/src/libsystemd/sd-bus/busctl.c index b6839c13e..d8122fdfc 100644 --- a/src/libsystemd/sd-bus/busctl.c +++ b/src/libsystemd/sd-bus/busctl.c @@ -44,6 +44,7 @@ static char **arg_matches = NULL; static BusTransport arg_transport = BUS_TRANSPORT_LOCAL; static char *arg_host = NULL; static bool arg_user = false; +static size_t arg_snaplen = 4096; static void pager_open_if_enabled(void) { @@ -76,7 +77,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(); @@ -109,7 +110,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { 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"); + (int) max_i, "NAME", 10, "PID", 15, "PROCESS", 16, "USER", 13, "CONNECTION", 25, "UNIT", 10, "SESSION", 19, "DESCRIPTION"); if (arg_show_machine) puts(" MACHINE"); @@ -142,10 +143,10 @@ 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); + SD_BUS_CREDS_DESCRIPTION, &creds); if (r >= 0) { const char *unique, *session, *unit, *cn; pid_t pid; @@ -200,7 +201,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { else fputs(" - ", stdout); - r = sd_bus_creds_get_connection_name(creds, &cn); + r = sd_bus_creds_get_description(creds, &cn); if (r >= 0) printf(" %-19s", cn); else @@ -210,7 +211,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)); @@ -223,7 +224,15 @@ static int list_bus_names(sd_bus *bus, char **argv) { return 0; } -static int monitor(sd_bus *bus, char *argv[]) { +static int message_dump(sd_bus_message *m, FILE *f) { + return bus_message_dump(m, f, true); +} + +static int message_pcap(sd_bus_message *m, FILE *f) { + return bus_message_pcap_frame(m, arg_snaplen, f); +} + +static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FILE *f)) { bool added_something = false; char **i; int r; @@ -277,7 +286,7 @@ static int monitor(sd_bus *bus, char *argv[]) { } if (m) { - bus_message_dump(m, stdout, true); + dump(m, stdout); continue; } @@ -292,6 +301,28 @@ static int monitor(sd_bus *bus, char *argv[]) { } } +static int capture(sd_bus *bus, char *argv[]) { + int r; + + if (isatty(fileno(stdout)) > 0) { + log_error("Refusing to write message data to console, please redirect output to a file."); + return -EINVAL; + } + + bus_pcap_header(arg_snaplen, stdout); + + r = monitor(bus, argv, message_pcap); + if (r < 0) + return r; + + if (ferror(stdout)) { + log_error("Couldn't write capture file."); + return -EIO; + } + + return r; +} + static int status(sd_bus *bus, char *argv[]) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; pid_t pid; @@ -306,7 +337,7 @@ 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(&creds, pid, _SD_BUS_CREDS_ALL); @@ -339,6 +370,7 @@ static int help(void) { "Commands:\n" " list List bus names\n" " monitor [SERVICE...] Show bus traffic\n" + " capture [SERVICE...] Capture bus traffic as pcap\n" " status NAME Show name status\n" " help Show this help\n" , program_invocation_short_name); @@ -359,7 +391,8 @@ static int parse_argv(int argc, char *argv[]) { ARG_SHOW_MACHINE, ARG_UNIQUE, ARG_ACQUIRED, - ARG_ACTIVATABLE + ARG_ACTIVATABLE, + ARG_SIZE, }; static const struct option options[] = { @@ -377,10 +410,11 @@ static int parse_argv(int argc, char *argv[]) { { "match", required_argument, NULL, ARG_MATCH }, { "host", required_argument, NULL, 'H' }, { "machine", required_argument, NULL, 'M' }, + { "size", required_argument, NULL, ARG_SIZE }, {}, }; - int c; + int c, r; assert(argc >= 0); assert(argv); @@ -438,6 +472,24 @@ static int parse_argv(int argc, char *argv[]) { return log_oom(); break; + case ARG_SIZE: { + off_t o; + + r = parse_size(optarg, 0, &o); + if (r < 0) { + log_error("Failed to parse size: %s", optarg); + return r; + } + + if ((off_t) (size_t) o != o) { + log_error("Size out of range."); + return -E2BIG; + } + + arg_snaplen = (size_t) o; + break; + } + case 'H': arg_transport = BUS_TRANSPORT_REMOTE; arg_host = optarg; @@ -469,7 +521,10 @@ static int busctl_main(sd_bus *bus, int argc, char *argv[]) { return list_bus_names(bus, argv + optind); if (streq(argv[optind], "monitor")) - return monitor(bus, argv + optind); + return monitor(bus, argv + optind, message_dump); + + if (streq(argv[optind], "capture")) + return capture(bus, argv + optind); if (streq(argv[optind], "status")) return status(bus, argv + optind); @@ -482,7 +537,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(); @@ -498,7 +553,8 @@ int main(int argc, char *argv[]) { goto finish; } - if (streq_ptr(argv[optind], "monitor")) { + if (streq_ptr(argv[optind], "monitor") || + streq_ptr(argv[optind], "capture")) { r = sd_bus_set_monitor(bus, true); if (r < 0) {