X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-util.c;h=2c3da3ce92fc56d9fbf8a9355891c834d0026fc2;hb=c7460cce79fd358f2745bd390bd2e7ded450ee62;hp=7c6da60ccabc9212287235dc4dcb6551dcd0f673;hpb=d5099efc47d4e6ac60816b5381a5f607ab03f06e;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c index 7c6da60cc..2c3da3ce9 100644 --- a/src/libsystemd/sd-bus/bus-util.c +++ b/src/libsystemd/sd-bus/bus-util.c @@ -20,7 +20,6 @@ ***/ #include -#include #include "systemd/sd-daemon.h" @@ -212,13 +211,19 @@ int bus_verify_polkit( #ifdef ENABLE_POLKIT else { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; - int authorized = false, challenge = false; + int authorized = false, challenge = false, c; const char *sender; sender = sd_bus_message_get_sender(call); if (!sender) return -EBADMSG; + c = sd_bus_message_get_allow_interactive_authorization(call); + if (c < 0) + return c; + if (c > 0) + interactive = true; + r = sd_bus_call_method( call->bus, "org.freedesktop.PolicyKit1", @@ -231,7 +236,7 @@ int bus_verify_polkit( "system-bus-name", 1, "name", "s", sender, action, 0, - interactive ? 1 : 0, + !!interactive, ""); if (r < 0) { @@ -334,6 +339,7 @@ int bus_verify_polkit_async( const char *sender; sd_bus_message_handler_t callback; void *userdata; + int c; #endif int r; @@ -375,6 +381,9 @@ int bus_verify_polkit_async( if (authorized) return 1; + if (challenge) + return sd_bus_error_set(error, SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED, "Interactive authentication required."); + return -EACCES; } #endif @@ -399,6 +408,12 @@ int bus_verify_polkit_async( if (!sender) return -EBADMSG; + c = sd_bus_message_get_allow_interactive_authorization(call); + if (c < 0) + return c; + if (c > 0) + interactive = true; + r = hashmap_ensure_allocated(registry, NULL); if (r < 0) return r; @@ -419,7 +434,7 @@ int bus_verify_polkit_async( "system-bus-name", 1, "name", "s", sender, action, 0, - interactive ? 1 : 0, + !!interactive, NULL); if (r < 0) return r; @@ -505,7 +520,7 @@ int bus_open_system_systemd(sd_bus **_bus) { if (r < 0) return r; - r = sd_bus_set_address(bus, KERNEL_SYSTEM_BUS_PATH); + r = sd_bus_set_address(bus, KERNEL_SYSTEM_BUS_ADDRESS); if (r < 0) return r; @@ -558,7 +573,7 @@ int bus_open_user_systemd(sd_bus **_bus) { if (r < 0) return r; - if (asprintf(&bus->address, KERNEL_USER_BUS_FMT, getuid()) < 0) + if (asprintf(&bus->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid()) < 0) return -ENOMEM; bus->bus_client = true; @@ -624,14 +639,21 @@ int bus_print_property(const char *name, sd_bus_message *property, bool all) { if (r < 0) return r; - if (all || !isempty(s)) - printf("%s=%s\n", name, s); + if (all || !isempty(s)) { + _cleanup_free_ char *escaped = NULL; + + escaped = xescape(s, "\n"); + if (!escaped) + return -ENOMEM; + + printf("%s=%s\n", name, escaped); + } return 1; } case SD_BUS_TYPE_BOOLEAN: { - bool b; + int b; r = sd_bus_message_read_basic(property, type, &b); if (r < 0) @@ -716,10 +738,16 @@ int bus_print_property(const char *name, sd_bus_message *property, bool all) { return r; while((r = sd_bus_message_read_basic(property, SD_BUS_TYPE_STRING, &str)) > 0) { + _cleanup_free_ char *escaped = NULL; + if (first) printf("%s=", name); - printf("%s%s", first ? "" : " ", str); + escaped = xescape(str, "\n "); + if (!escaped) + return -ENOMEM; + + printf("%s%s", first ? "" : " ", escaped); first = false; } @@ -1127,8 +1155,8 @@ int bus_open_transport(BusTransport transport, const char *host, bool user, sd_b r = sd_bus_open_system_remote(bus, host); break; - case BUS_TRANSPORT_CONTAINER: - r = sd_bus_open_system_container(bus, host); + case BUS_TRANSPORT_MACHINE: + r = sd_bus_open_system_machine(bus, host); break; default: @@ -1162,8 +1190,8 @@ int bus_open_transport_systemd(BusTransport transport, const char *host, bool us r = sd_bus_open_system_remote(bus, host); break; - case BUS_TRANSPORT_CONTAINER: - r = sd_bus_open_system_container(bus, host); + case BUS_TRANSPORT_MACHINE: + r = sd_bus_open_system_machine(bus, host); break; default: @@ -1234,13 +1262,11 @@ int bus_property_get_ulong( #endif int bus_log_parse_error(int r) { - log_error("Failed to parse bus message: %s", strerror(-r)); - return r; + return log_error_errno(r, "Failed to parse bus message: %m"); } int bus_log_create_error(int r) { - log_error("Failed to create bus message: %s", strerror(-r)); - return r; + return log_error_errno(r, "Failed to create bus message: %m"); } int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u) { @@ -1345,7 +1371,8 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen if (STR_IN_SET(field, "CPUAccounting", "MemoryAccounting", "BlockIOAccounting", - "SendSIGHUP", "SendSIGKILL")) { + "SendSIGHUP", "SendSIGKILL", + "WakeSystem")) { r = parse_boolean(eq); if (r < 0) { @@ -1506,6 +1533,17 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen r = sd_bus_message_append(m, "v", "i", sig); + } else if (streq(field, "AccuracySec")) { + usec_t u; + + r = parse_sec(eq, &u); + if (r < 0) { + log_error("Failed to parse %s value %s", field, eq); + return -EINVAL; + } + + r = sd_bus_message_append(m, "v", "t", u); + } else { log_error("Unknown assignment %s.", assignment); return -EINVAL;