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;