X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbusctl.c;h=b4a91dfed3f4e649520e0f045fbab3cff702a133;hb=da927ba997d68401563b927f92e6e40e021a8e5c;hp=145b3198c1fd3abe120684e8763416e1aaf66d66;hpb=38051578360c211e88ef4082ce5746adb52a500e;p=elogind.git diff --git a/src/libsystemd/sd-bus/busctl.c b/src/libsystemd/sd-bus/busctl.c index 145b3198c..b4a91dfed 100644 --- a/src/libsystemd/sd-bus/busctl.c +++ b/src/libsystemd/sd-bus/busctl.c @@ -56,6 +56,8 @@ static bool arg_verbose = false; static bool arg_expect_reply = true; static bool arg_auto_start = true; static bool arg_allow_interactive_authorization = true; +static bool arg_augment_creds = true; +static usec_t arg_timeout = 0; static void pager_open_if_enabled(void) { @@ -66,6 +68,9 @@ static void pager_open_if_enabled(void) { pager_open(false); } +#define NAME_IS_ACQUIRED INT_TO_PTR(1) +#define NAME_IS_ACTIVATABLE INT_TO_PTR(2) + static int list_bus_names(sd_bus *bus, char **argv) { _cleanup_strv_free_ char **acquired = NULL, **activatable = NULL; _cleanup_free_ char **merged = NULL; @@ -85,7 +90,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { r = sd_bus_list_names(bus, (arg_acquired || arg_unique) ? &acquired : NULL, arg_activatable ? &activatable : NULL); if (r < 0) { - log_error("Failed to list names: %s", strerror(-r)); + log_error_errno(r, "Failed to list names: %m"); return r; } @@ -98,9 +103,9 @@ static int list_bus_names(sd_bus *bus, char **argv) { STRV_FOREACH(i, acquired) { max_i = MAX(max_i, strlen(*i)); - r = hashmap_put(names, *i, INT_TO_PTR(1)); + r = hashmap_put(names, *i, NAME_IS_ACQUIRED); if (r < 0) { - log_error("Failed to add to hashmap: %s", strerror(-r)); + log_error_errno(r, "Failed to add to hashmap: %m"); return r; } } @@ -108,9 +113,9 @@ static int list_bus_names(sd_bus *bus, char **argv) { STRV_FOREACH(i, activatable) { max_i = MAX(max_i, strlen(*i)); - r = hashmap_put(names, *i, INT_TO_PTR(2)); + r = hashmap_put(names, *i, NAME_IS_ACTIVATABLE); if (r < 0 && r != -EEXIST) { - log_error("Failed to add to hashmap: %s", strerror(-r)); + log_error_errno(r, "Failed to add to hashmap: %m"); return r; } } @@ -136,7 +141,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; sd_id128_t mid; - if (hashmap_get(names, *i) == INT_TO_PTR(2)) { + if (hashmap_get(names, *i) == NAME_IS_ACTIVATABLE) { /* Activatable */ printf("%-*s", (int) max_i, *i); @@ -157,10 +162,12 @@ static int list_bus_names(sd_bus *bus, char **argv) { printf("%-*s", (int) max_i, *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_DESCRIPTION, &creds); + r = sd_bus_get_name_creds( + bus, *i, + (arg_augment_creds ? SD_BUS_CREDS_AUGMENT : 0) | + 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_DESCRIPTION, &creds); if (r >= 0) { const char *unique, *session, *unit, *cn; pid_t pid; @@ -432,7 +439,7 @@ static int tree(sd_bus *bus, char **argv) { r = sd_bus_list_names(bus, &names, NULL); if (r < 0) { - log_error("Failed to get name list: %s", strerror(-r)); + log_error_errno(r, "Failed to get name list: %m"); return r; } @@ -1089,7 +1096,7 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL r = sd_bus_add_match(bus, NULL, m, NULL, NULL); if (r < 0) { - log_error("Failed to add match: %s", strerror(-r)); + log_error_errno(r, "Failed to add match: %m"); return r; } @@ -1099,7 +1106,7 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL STRV_FOREACH(i, arg_matches) { r = sd_bus_add_match(bus, NULL, *i, NULL, NULL); if (r < 0) { - log_error("Failed to add match: %s", strerror(-r)); + log_error_errno(r, "Failed to add match: %m"); return r; } @@ -1109,7 +1116,7 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL if (!added_something) { r = sd_bus_add_match(bus, NULL, "", NULL, NULL); if (r < 0) { - log_error("Failed to add match: %s", strerror(-r)); + log_error_errno(r, "Failed to add match: %m"); return r; } } @@ -1119,7 +1126,7 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL r = sd_bus_process(bus, &m); if (r < 0) { - log_error("Failed to process bus: %s", strerror(-r)); + log_error_errno(r, "Failed to process bus: %m"); return r; } @@ -1133,7 +1140,7 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL r = sd_bus_wait(bus, (uint64_t) -1); if (r < 0) { - log_error("Failed to wait for bus: %s", strerror(-r)); + log_error_errno(r, "Failed to wait for bus: %m"); return r; } } @@ -1168,19 +1175,32 @@ static int status(sd_bus *bus, char *argv[]) { assert(bus); - if (strv_length(argv) != 2) { - log_error("Expects one argument."); + if (strv_length(argv) > 2) { + log_error("Expects no or one argument."); return -EINVAL; } - r = parse_pid(argv[1], &pid); - if (r < 0) - 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); + if (argv[1]) { + r = parse_pid(argv[1], &pid); + if (r < 0) + r = sd_bus_get_name_creds( + bus, + argv[1], + (arg_augment_creds ? SD_BUS_CREDS_AUGMENT : 0) | _SD_BUS_CREDS_ALL, + &creds); + else + r = sd_bus_creds_new_from_pid( + &creds, + pid, + _SD_BUS_CREDS_ALL); + } else + r = sd_bus_get_owner_creds( + bus, + (arg_augment_creds ? SD_BUS_CREDS_AUGMENT : 0) | _SD_BUS_CREDS_ALL, + &creds); if (r < 0) { - log_error("Failed to get credentials: %s", strerror(-r)); + log_error_errno(r, "Failed to get credentials: %m"); return r; } @@ -1494,7 +1514,7 @@ static int call(sd_bus *bus, char *argv[]) { return 0; } - r = sd_bus_call(bus, m, 0, &error, &reply); + r = sd_bus_call(bus, m, arg_timeout, &error, &reply); if (r < 0) { log_error("%s", bus_error_message(&error, r)); return r; @@ -1627,7 +1647,7 @@ static int set_property(sd_bus *bus, char *argv[]) { return -EINVAL; } - r = sd_bus_call(bus, m, 0, &error, NULL); + r = sd_bus_call(bus, m, arg_timeout, &error, NULL); if (r < 0) { log_error("%s", bus_error_message(&error, r)); return r; @@ -1659,10 +1679,12 @@ static int help(void) { " --expect-reply=BOOL Expect a method call reply\n" " --auto-start=BOOL Auto-start destination service\n" " --allow-interactive-authorization=BOOL\n" - " Allow interactive authorization for operation\n\n" + " Allow interactive authorization for operation\n" + " --timeout=SECS Maximum time to wait for method call completion\n" + " --augment-creds=BOOL Extend credential data with data read from /proc/$PID\n\n" "Commands:\n" " list List bus names\n" - " status SERVICE Show service name status\n" + " status [SERVICE] Show bus service, process or bus owner credentials\n" " monitor [SERVICE...] Show bus traffic\n" " capture [SERVICE...] Capture bus traffic as pcap\n" " tree [SERVICE...] Show object tree of service\n" @@ -1699,6 +1721,8 @@ static int parse_argv(int argc, char *argv[]) { ARG_EXPECT_REPLY, ARG_AUTO_START, ARG_ALLOW_INTERACTIVE_AUTHORIZATION, + ARG_TIMEOUT, + ARG_AUGMENT_CREDS, }; static const struct option options[] = { @@ -1723,6 +1747,8 @@ static int parse_argv(int argc, char *argv[]) { { "expect-reply", required_argument, NULL, ARG_EXPECT_REPLY }, { "auto-start", required_argument, NULL, ARG_AUTO_START }, { "allow-interactive-authorization", required_argument, NULL, ARG_ALLOW_INTERACTIVE_AUTHORIZATION }, + { "timeout", required_argument, NULL, ARG_TIMEOUT }, + { "augment-creds",required_argument, NULL, ARG_AUGMENT_CREDS}, {}, }; @@ -1856,6 +1882,25 @@ static int parse_argv(int argc, char *argv[]) { arg_allow_interactive_authorization = !!r; break; + case ARG_TIMEOUT: + r = parse_sec(optarg, &arg_timeout); + if (r < 0) { + log_error("Failed to parse --timeout= parameter."); + return r; + } + + break; + + case ARG_AUGMENT_CREDS: + r = parse_boolean(optarg); + if (r < 0) { + log_error("Failed to parse --augment-creds= parameter."); + return r; + } + + arg_augment_creds = !!r; + break; + case '?': return -EINVAL; @@ -1917,7 +1962,7 @@ int main(int argc, char *argv[]) { r = sd_bus_new(&bus); if (r < 0) { - log_error("Failed to allocate bus: %s", strerror(-r)); + log_error_errno(r, "Failed to allocate bus: %m"); goto finish; } @@ -1926,25 +1971,25 @@ int main(int argc, char *argv[]) { r = sd_bus_set_monitor(bus, true); if (r < 0) { - log_error("Failed to set monitor mode: %s", strerror(-r)); + log_error_errno(r, "Failed to set monitor mode: %m"); goto finish; } - r = sd_bus_negotiate_creds(bus, _SD_BUS_CREDS_ALL); + r = sd_bus_negotiate_creds(bus, true, _SD_BUS_CREDS_ALL); if (r < 0) { - log_error("Failed to enable credentials: %s", strerror(-r)); + log_error_errno(r, "Failed to enable credentials: %m"); goto finish; } r = sd_bus_negotiate_timestamp(bus, true); if (r < 0) { - log_error("Failed to enable timestamps: %s", strerror(-r)); + log_error_errno(r, "Failed to enable timestamps: %m"); goto finish; } r = sd_bus_negotiate_fds(bus, true); if (r < 0) { - log_error("Failed to enable fds: %s", strerror(-r)); + log_error_errno(r, "Failed to enable fds: %m"); goto finish; } } @@ -1954,7 +1999,7 @@ int main(int argc, char *argv[]) { else { r = sd_bus_set_bus_client(bus, true); if (r < 0) { - log_error("Failed to set bus client: %s", strerror(-r)); + log_error_errno(r, "Failed to set bus client: %m"); goto finish; } @@ -1980,13 +2025,13 @@ int main(int argc, char *argv[]) { } } if (r < 0) { - log_error("Failed to set address: %s", strerror(-r)); + log_error_errno(r, "Failed to set address: %m"); goto finish; } r = sd_bus_start(bus); if (r < 0) { - log_error("Failed to connect to bus: %s", strerror(-r)); + log_error_errno(r, "Failed to connect to bus: %m"); goto finish; }