X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fbus-util.c;h=dc8727c8fbe704725e03b77d7dc79357e9f8e555;hp=3674105ccc179a0a68c107c056bc8445f9c5a97a;hb=3d1092eab0f4a5c771225c78072a7b6eccb82849;hpb=1532f28b7cf3e6e02e74691450b2b5379be6b805 diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c index 3674105cc..dc8727c8f 100644 --- a/src/shared/bus-util.c +++ b/src/shared/bus-util.c @@ -19,27 +19,29 @@ along with systemd; If not, see . ***/ -#include +// #include -#include "sd-daemon.h" -#include "sd-event.h" -#include "util.h" +// #include "sd-daemon.h" +// #include "sd-event.h" +// #include "util.h" #include "strv.h" -#include "macro.h" -#include "def.h" -#include "path-util.h" -#include "missing.h" -#include "set.h" -#include "signal-util.h" +// #include "macro.h" +// #include "def.h" +// #include "path-util.h" +// #include "missing.h" +// #include "set.h" +// #include "signal-util.h" #include "unit-name.h" -#include "sd-bus.h" -#include "bus-error.h" -#include "bus-label.h" +// #include "sd-bus.h" +// #include "bus-error.h" +// #include "bus-label.h" #include "bus-message.h" #include "bus-util.h" #include "bus-internal.h" +/// UNNEEDED by elogind +#if 0 static int name_owner_change_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { sd_event *e = userdata; @@ -165,6 +167,7 @@ int bus_event_loop_with_idle( return code; } +#endif // 0 int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error) { _cleanup_bus_message_unref_ sd_bus_message *rep = NULL; @@ -220,6 +223,7 @@ int bus_test_polkit( sd_bus_message *call, int capability, const char *action, + const char **details, uid_t good_user, bool *_challenge, sd_bus_error *e) { @@ -242,29 +246,52 @@ int bus_test_polkit( return 1; #ifdef ENABLE_POLKIT else { + _cleanup_bus_message_unref_ sd_bus_message *request = NULL; _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; int authorized = false, challenge = false; - const char *sender; + const char *sender, **k, **v; sender = sd_bus_message_get_sender(call); if (!sender) return -EBADMSG; - r = sd_bus_call_method( + r = sd_bus_message_new_method_call( call->bus, + &request, "org.freedesktop.PolicyKit1", "/org/freedesktop/PolicyKit1/Authority", "org.freedesktop.PolicyKit1.Authority", - "CheckAuthorization", - e, - &reply, - "(sa{sv})sa{ss}us", + "CheckAuthorization"); + if (r < 0) + return r; + + r = sd_bus_message_append( + request, + "(sa{sv})s", "system-bus-name", 1, "name", "s", sender, - action, - 0, - 0, - ""); + action); + if (r < 0) + return r; + + r = sd_bus_message_open_container(request, 'a', "{ss}"); + if (r < 0) + return r; + + STRV_FOREACH_PAIR(k, v, details) { + r = sd_bus_message_append(request, "{ss}", *k, *v); + if (r < 0) + return r; + } + r = sd_bus_message_close_container(request); + if (r < 0) + return r; + + r = sd_bus_message_append(request, "us", 0, NULL); + if (r < 0) + return r; + + r = sd_bus_call(call->bus, request, 0, e, &reply); if (r < 0) { /* Treat no PK available as access denied */ if (sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN)) { @@ -354,6 +381,7 @@ int bus_verify_polkit_async( sd_bus_message *call, int capability, const char *action, + const char **details, bool interactive, uid_t good_user, Hashmap **registry, @@ -362,7 +390,7 @@ int bus_verify_polkit_async( #ifdef ENABLE_POLKIT _cleanup_bus_message_unref_ sd_bus_message *pk = NULL; AsyncPolkitQuery *q; - const char *sender; + const char *sender, **k, **v; sd_bus_message_handler_t callback; void *userdata; int c; @@ -460,12 +488,27 @@ int bus_verify_polkit_async( r = sd_bus_message_append( pk, - "(sa{sv})sa{ss}us", + "(sa{sv})s", "system-bus-name", 1, "name", "s", sender, - action, - 0, - !!interactive, - NULL); + action); + if (r < 0) + return r; + + r = sd_bus_message_open_container(pk, 'a', "{ss}"); + if (r < 0) + return r; + + STRV_FOREACH_PAIR(k, v, details) { + r = sd_bus_message_append(pk, "{ss}", *k, *v); + if (r < 0) + return r; + } + + r = sd_bus_message_close_container(pk); + if (r < 0) + return r; + + r = sd_bus_message_append(pk, "us", !!interactive, NULL); if (r < 0) return r; @@ -508,6 +551,8 @@ void bus_verify_polkit_async_registry_free(Hashmap *registry) { #endif } +/// UNNEEDED by elogind +#if 0 int bus_check_peercred(sd_bus *c) { struct ucred ucred; socklen_t l; @@ -643,6 +688,7 @@ int bus_open_user_systemd(sd_bus **_bus) { return 0; } +#endif // 0 int bus_print_property(const char *name, sd_bus_message *property, bool all) { char type; @@ -1100,6 +1146,8 @@ int bus_message_map_all_properties( return sd_bus_message_exit_container(m); } +/// UNNEEDED by elogind +#if 0 int bus_message_map_properties_changed( sd_bus_message *m, const struct bus_properties_map *map, @@ -1135,6 +1183,7 @@ int bus_message_map_properties_changed( return invalidated; } +#endif // 0 int bus_map_all_properties( sd_bus *bus, @@ -1180,9 +1229,12 @@ int bus_open_transport(BusTransport transport, const char *host, bool user, sd_b switch (transport) { case BUS_TRANSPORT_LOCAL: +/// elogind does not support a user bus +#if 0 if (user) r = sd_bus_default_user(bus); else +#endif // 0 r = sd_bus_default_system(bus); break; @@ -1202,6 +1254,8 @@ int bus_open_transport(BusTransport transport, const char *host, bool user, sd_b return r; } +/// UNNEEDED by elogind +#if 0 int bus_open_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus) { int r; @@ -1236,6 +1290,7 @@ int bus_open_transport_systemd(BusTransport transport, const char *host, bool us return r; } +#endif // 0 int bus_property_get_bool( sd_bus *bus, @@ -1301,6 +1356,8 @@ int bus_log_parse_error(int r) { return log_error_errno(r, "Failed to parse bus message: %m"); } +/// UNNEEDED by elogind +#if 0 int bus_log_create_error(int r) { return log_error_errno(r, "Failed to create bus message: %m"); } @@ -1382,7 +1439,8 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen if (STR_IN_SET(field, "CPUAccounting", "MemoryAccounting", "BlockIOAccounting", - "SendSIGHUP", "SendSIGKILL", "WakeSystem", "DefaultDependencies")) { + "SendSIGHUP", "SendSIGKILL", "WakeSystem", "DefaultDependencies", + "IgnoreSIGPIPE", "TTYVHangup", "TTYReset", "RemainAfterExit")) { r = parse_boolean(eq); if (r < 0) { @@ -1414,7 +1472,11 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen r = sd_bus_message_append(m, "v", "t", u); - } else if (STR_IN_SET(field, "User", "Group", "DevicePolicy", "KillMode")) + } else if (STR_IN_SET(field, + "User", "Group", "DevicePolicy", "KillMode", + "UtmpIdentifier", "UtmpMode", "PAMName", "TTYPath", + "StandardInput", "StandardOutput", "StandardError", + "Description", "Slice", "Type")) r = sd_bus_message_append(m, "v", "s", eq); else if (streq(field, "DeviceAllow")) { @@ -1564,6 +1626,7 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen return 0; } +#endif // 0 typedef struct BusWaitForJobs { sd_bus *bus; @@ -1576,6 +1639,8 @@ typedef struct BusWaitForJobs { sd_bus_slot *slot_disconnected; } BusWaitForJobs; +/// UNNEEDED by elogind +#if 0 static int match_disconnected(sd_bus_message *m, void *userdata, sd_bus_error *error) { assert(m); @@ -1839,11 +1904,9 @@ int bus_wait_for_jobs(BusWaitForJobs *d, bool quiet) { log_debug_errno(q, "Got result %s/%m for job %s", strna(d->result), strna(d->name)); } - free(d->name); - d->name = NULL; + d->name = mfree(d->name); - free(d->result); - d->result = NULL; + d->result = mfree(d->result); } return r; @@ -1861,8 +1924,16 @@ int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path) { return set_put_strdup(d->jobs, path); } -/// UNNEEDED by elogind -#if 0 +int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet) { + int r; + + r = bus_wait_for_jobs_add(d, path); + if (r < 0) + return log_oom(); + + return bus_wait_for_jobs(d, quiet); +} + int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, UnitFileChange **changes, unsigned *n_changes) { const char *type, *path, *source; int r; @@ -1892,7 +1963,6 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, Un return 0; } -#endif // 0 /** * bus_path_encode_unique() - encode unique object path @@ -2020,6 +2090,7 @@ int bus_path_decode_unique(const char *path, const char *prefix, char **ret_send *ret_external = external; return 1; } +#endif // 0 bool is_kdbus_wanted(void) { _cleanup_free_ char *value = NULL;