1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/socket.h>
24 #include "sd-daemon.h"
30 #include "path-util.h"
33 #include "signal-util.h"
34 #include "unit-name.h"
37 #include "bus-error.h"
38 #include "bus-label.h"
39 #include "bus-message.h"
41 #include "bus-internal.h"
43 static int name_owner_change_callback(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
44 sd_event
*e
= userdata
;
49 sd_bus_close(sd_bus_message_get_bus(m
));
55 int bus_async_unregister_and_exit(sd_event
*e
, sd_bus
*bus
, const char *name
) {
56 _cleanup_free_
char *match
= NULL
;
64 /* We unregister the name here and then wait for the
65 * NameOwnerChanged signal for this event to arrive before we
66 * quit. We do this in order to make sure that any queued
67 * requests are still processed before we really exit. */
69 r
= sd_bus_get_unique_name(bus
, &unique
);
74 "sender='org.freedesktop.DBus',"
76 "interface='org.freedesktop.DBus',"
77 "member='NameOwnerChanged',"
78 "path='/org/freedesktop/DBus',"
81 "arg2=''", name
, unique
);
85 r
= sd_bus_add_match(bus
, NULL
, match
, name_owner_change_callback
, e
);
89 r
= sd_bus_release_name(bus
, name
);
96 int bus_event_loop_with_idle(
101 check_idle_t check_idle
,
103 bool exiting
= false;
113 r
= sd_event_get_state(e
);
116 if (r
== SD_EVENT_FINISHED
)
120 idle
= check_idle(userdata
);
124 r
= sd_event_run(e
, exiting
|| !idle
? (uint64_t) -1 : timeout
);
128 if (r
== 0 && !exiting
&& idle
) {
130 r
= sd_bus_try_close(bus
);
134 /* Fallback for dbus1 connections: we
135 * unregister the name and wait for the
136 * response to come through for it */
137 if (r
== -EOPNOTSUPP
) {
139 /* Inform the service manager that we
140 * are going down, so that it will
141 * queue all further start requests,
142 * instead of assuming we are already
144 sd_notify(false, "STOPPING=1");
146 r
= bus_async_unregister_and_exit(e
, bus
, name
);
162 r
= sd_event_get_exit_code(e
, &code
);
169 int bus_name_has_owner(sd_bus
*c
, const char *name
, sd_bus_error
*error
) {
170 _cleanup_bus_message_unref_ sd_bus_message
*rep
= NULL
;
171 int r
, has_owner
= 0;
176 r
= sd_bus_call_method(c
,
177 "org.freedesktop.DBus",
178 "/org/freedesktop/dbus",
179 "org.freedesktop.DBus",
188 r
= sd_bus_message_read_basic(rep
, 'b', &has_owner
);
190 return sd_bus_error_set_errno(error
, r
);
195 static int check_good_user(sd_bus_message
*m
, uid_t good_user
) {
196 _cleanup_bus_creds_unref_ sd_bus_creds
*creds
= NULL
;
202 if (good_user
== UID_INVALID
)
205 r
= sd_bus_query_sender_creds(m
, SD_BUS_CREDS_EUID
, &creds
);
209 /* Don't trust augmented credentials for authorization */
210 assert_return((sd_bus_creds_get_augmented_mask(creds
) & SD_BUS_CREDS_EUID
) == 0, -EPERM
);
212 r
= sd_bus_creds_get_euid(creds
, &sender_uid
);
216 return sender_uid
== good_user
;
220 sd_bus_message
*call
,
232 /* Tests non-interactively! */
234 r
= check_good_user(call
, good_user
);
238 r
= sd_bus_query_sender_privilege(call
, capability
);
245 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
246 int authorized
= false, challenge
= false;
249 sender
= sd_bus_message_get_sender(call
);
253 r
= sd_bus_call_method(
255 "org.freedesktop.PolicyKit1",
256 "/org/freedesktop/PolicyKit1/Authority",
257 "org.freedesktop.PolicyKit1.Authority",
258 "CheckAuthorization",
262 "system-bus-name", 1, "name", "s", sender
,
269 /* Treat no PK available as access denied */
270 if (sd_bus_error_has_name(e
, SD_BUS_ERROR_SERVICE_UNKNOWN
)) {
271 sd_bus_error_free(e
);
278 r
= sd_bus_message_enter_container(reply
, 'r', "bba{ss}");
282 r
= sd_bus_message_read(reply
, "bb", &authorized
, &challenge
);
290 *_challenge
= challenge
;
301 typedef struct AsyncPolkitQuery
{
302 sd_bus_message
*request
, *reply
;
303 sd_bus_message_handler_t callback
;
309 static void async_polkit_query_free(AsyncPolkitQuery
*q
) {
314 sd_bus_slot_unref(q
->slot
);
316 if (q
->registry
&& q
->request
)
317 hashmap_remove(q
->registry
, q
->request
);
319 sd_bus_message_unref(q
->request
);
320 sd_bus_message_unref(q
->reply
);
325 static int async_polkit_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
326 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
327 AsyncPolkitQuery
*q
= userdata
;
333 q
->slot
= sd_bus_slot_unref(q
->slot
);
334 q
->reply
= sd_bus_message_ref(reply
);
336 r
= sd_bus_message_rewind(q
->request
, true);
338 r
= sd_bus_reply_method_errno(q
->request
, r
, NULL
);
342 r
= q
->callback(q
->request
, q
->userdata
, &error_buffer
);
343 r
= bus_maybe_reply_error(q
->request
, r
, &error_buffer
);
346 async_polkit_query_free(q
);
353 int bus_verify_polkit_async(
354 sd_bus_message
*call
,
360 sd_bus_error
*error
) {
363 _cleanup_bus_message_unref_ sd_bus_message
*pk
= NULL
;
366 sd_bus_message_handler_t callback
;
376 r
= check_good_user(call
, good_user
);
381 q
= hashmap_get(*registry
, call
);
383 int authorized
, challenge
;
385 /* This is the second invocation of this function, and
386 * there's already a response from polkit, let's
390 if (sd_bus_message_is_method_error(q
->reply
, NULL
)) {
391 const sd_bus_error
*e
;
393 /* Copy error from polkit reply */
394 e
= sd_bus_message_get_error(q
->reply
);
395 sd_bus_error_copy(error
, e
);
397 /* Treat no PK available as access denied */
398 if (sd_bus_error_has_name(e
, SD_BUS_ERROR_SERVICE_UNKNOWN
))
401 return -sd_bus_error_get_errno(e
);
404 r
= sd_bus_message_enter_container(q
->reply
, 'r', "bba{ss}");
406 r
= sd_bus_message_read(q
->reply
, "bb", &authorized
, &challenge
);
415 return sd_bus_error_set(error
, SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED
, "Interactive authentication required.");
421 r
= sd_bus_query_sender_privilege(call
, capability
);
428 if (sd_bus_get_current_message(call
->bus
) != call
)
431 callback
= sd_bus_get_current_handler(call
->bus
);
435 userdata
= sd_bus_get_current_userdata(call
->bus
);
437 sender
= sd_bus_message_get_sender(call
);
441 c
= sd_bus_message_get_allow_interactive_authorization(call
);
447 r
= hashmap_ensure_allocated(registry
, NULL
);
451 r
= sd_bus_message_new_method_call(
454 "org.freedesktop.PolicyKit1",
455 "/org/freedesktop/PolicyKit1/Authority",
456 "org.freedesktop.PolicyKit1.Authority",
457 "CheckAuthorization");
461 r
= sd_bus_message_append(
464 "system-bus-name", 1, "name", "s", sender
,
472 q
= new0(AsyncPolkitQuery
, 1);
476 q
->request
= sd_bus_message_ref(call
);
477 q
->callback
= callback
;
478 q
->userdata
= userdata
;
480 r
= hashmap_put(*registry
, call
, q
);
482 async_polkit_query_free(q
);
486 q
->registry
= *registry
;
488 r
= sd_bus_call_async(call
->bus
, &q
->slot
, pk
, async_polkit_callback
, q
, 0);
490 async_polkit_query_free(q
);
500 void bus_verify_polkit_async_registry_free(Hashmap
*registry
) {
504 while ((q
= hashmap_steal_first(registry
)))
505 async_polkit_query_free(q
);
507 hashmap_free(registry
);
511 int bus_check_peercred(sd_bus
*c
) {
518 fd
= sd_bus_get_fd(c
);
522 l
= sizeof(struct ucred
);
523 if (getsockopt(fd
, SOL_SOCKET
, SO_PEERCRED
, &ucred
, &l
) < 0)
526 if (l
!= sizeof(struct ucred
))
529 if (ucred
.uid
!= 0 && ucred
.uid
!= geteuid())
535 int bus_open_system_systemd(sd_bus
**_bus
) {
536 _cleanup_bus_unref_ sd_bus
*bus
= NULL
;
542 return sd_bus_open_system(_bus
);
544 /* If we are root and kdbus is not available, then let's talk
545 * directly to the system instance, instead of going via the
549 r
= sd_bus_new(&bus
);
553 r
= sd_bus_set_address(bus
, KERNEL_SYSTEM_BUS_ADDRESS
);
557 bus
->bus_client
= true;
559 r
= sd_bus_start(bus
);
566 bus
= sd_bus_unref(bus
);
569 r
= sd_bus_new(&bus
);
573 r
= sd_bus_set_address(bus
, "unix:path=/run/systemd/private");
577 r
= sd_bus_start(bus
);
579 return sd_bus_open_system(_bus
);
581 r
= bus_check_peercred(bus
);
591 int bus_open_user_systemd(sd_bus
**_bus
) {
592 _cleanup_bus_unref_ sd_bus
*bus
= NULL
;
593 _cleanup_free_
char *ee
= NULL
;
597 /* Try via kdbus first, and then directly */
602 r
= sd_bus_new(&bus
);
606 if (asprintf(&bus
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, getuid()) < 0)
609 bus
->bus_client
= true;
611 r
= sd_bus_start(bus
);
618 bus
= sd_bus_unref(bus
);
621 e
= secure_getenv("XDG_RUNTIME_DIR");
623 return sd_bus_open_user(_bus
);
625 ee
= bus_address_escape(e
);
629 r
= sd_bus_new(&bus
);
633 bus
->address
= strjoin("unix:path=", ee
, "/systemd/private", NULL
);
637 r
= sd_bus_start(bus
);
639 return sd_bus_open_user(_bus
);
641 r
= bus_check_peercred(bus
);
651 int bus_print_property(const char *name
, sd_bus_message
*property
, bool all
) {
653 const char *contents
;
659 r
= sd_bus_message_peek_type(property
, &type
, &contents
);
665 case SD_BUS_TYPE_STRING
: {
668 r
= sd_bus_message_read_basic(property
, type
, &s
);
672 if (all
|| !isempty(s
)) {
673 _cleanup_free_
char *escaped
= NULL
;
675 escaped
= xescape(s
, "\n");
679 printf("%s=%s\n", name
, escaped
);
685 case SD_BUS_TYPE_BOOLEAN
: {
688 r
= sd_bus_message_read_basic(property
, type
, &b
);
692 printf("%s=%s\n", name
, yes_no(b
));
697 case SD_BUS_TYPE_UINT64
: {
700 r
= sd_bus_message_read_basic(property
, type
, &u
);
704 /* Yes, heuristics! But we can change this check
705 * should it turn out to not be sufficient */
707 if (endswith(name
, "Timestamp")) {
708 char timestamp
[FORMAT_TIMESTAMP_MAX
], *t
;
710 t
= format_timestamp(timestamp
, sizeof(timestamp
), u
);
712 printf("%s=%s\n", name
, strempty(t
));
714 } else if (strstr(name
, "USec")) {
715 char timespan
[FORMAT_TIMESPAN_MAX
];
717 printf("%s=%s\n", name
, format_timespan(timespan
, sizeof(timespan
), u
, 0));
719 printf("%s=%llu\n", name
, (unsigned long long) u
);
724 case SD_BUS_TYPE_INT64
: {
727 r
= sd_bus_message_read_basic(property
, type
, &i
);
731 printf("%s=%lld\n", name
, (long long) i
);
736 case SD_BUS_TYPE_UINT32
: {
739 r
= sd_bus_message_read_basic(property
, type
, &u
);
743 if (strstr(name
, "UMask") || strstr(name
, "Mode"))
744 printf("%s=%04o\n", name
, u
);
746 printf("%s=%u\n", name
, (unsigned) u
);
751 case SD_BUS_TYPE_INT32
: {
754 r
= sd_bus_message_read_basic(property
, type
, &i
);
758 printf("%s=%i\n", name
, (int) i
);
762 case SD_BUS_TYPE_DOUBLE
: {
765 r
= sd_bus_message_read_basic(property
, type
, &d
);
769 printf("%s=%g\n", name
, d
);
773 case SD_BUS_TYPE_ARRAY
:
774 if (streq(contents
, "s")) {
778 r
= sd_bus_message_enter_container(property
, SD_BUS_TYPE_ARRAY
, contents
);
782 while((r
= sd_bus_message_read_basic(property
, SD_BUS_TYPE_STRING
, &str
)) > 0) {
783 _cleanup_free_
char *escaped
= NULL
;
788 escaped
= xescape(str
, "\n ");
792 printf("%s%s", first
? "" : " ", escaped
);
804 r
= sd_bus_message_exit_container(property
);
810 } else if (streq(contents
, "y")) {
814 r
= sd_bus_message_read_array(property
, SD_BUS_TYPE_BYTE
, (const void**) &u
, &n
);
823 for (i
= 0; i
< n
; i
++)
824 printf("%02x", u
[i
]);
831 } else if (streq(contents
, "u")) {
835 r
= sd_bus_message_read_array(property
, SD_BUS_TYPE_UINT32
, (const void**) &u
, &n
);
844 for (i
= 0; i
< n
; i
++)
845 printf("%08x", u
[i
]);
859 int bus_print_all_properties(sd_bus
*bus
, const char *dest
, const char *path
, char **filter
, bool all
) {
860 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
861 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
867 r
= sd_bus_call_method(bus
,
870 "org.freedesktop.DBus.Properties",
878 r
= sd_bus_message_enter_container(reply
, SD_BUS_TYPE_ARRAY
, "{sv}");
882 while ((r
= sd_bus_message_enter_container(reply
, SD_BUS_TYPE_DICT_ENTRY
, "sv")) > 0) {
884 const char *contents
;
886 r
= sd_bus_message_read_basic(reply
, SD_BUS_TYPE_STRING
, &name
);
890 if (!filter
|| strv_find(filter
, name
)) {
891 r
= sd_bus_message_peek_type(reply
, NULL
, &contents
);
895 r
= sd_bus_message_enter_container(reply
, SD_BUS_TYPE_VARIANT
, contents
);
899 r
= bus_print_property(name
, reply
, all
);
904 printf("%s=[unprintable]\n", name
);
905 /* skip what we didn't read */
906 r
= sd_bus_message_skip(reply
, contents
);
911 r
= sd_bus_message_exit_container(reply
);
915 r
= sd_bus_message_skip(reply
, "v");
920 r
= sd_bus_message_exit_container(reply
);
927 r
= sd_bus_message_exit_container(reply
);
934 int bus_map_id128(sd_bus
*bus
, const char *member
, sd_bus_message
*m
, sd_bus_error
*error
, void *userdata
) {
935 sd_id128_t
*p
= userdata
;
940 r
= sd_bus_message_read_array(m
, SD_BUS_TYPE_BYTE
, &v
, &n
);
947 memcpy((*p
).bytes
, v
, n
);
954 static int map_basic(sd_bus
*bus
, const char *member
, sd_bus_message
*m
, sd_bus_error
*error
, void *userdata
) {
958 r
= sd_bus_message_peek_type(m
, &type
, NULL
);
963 case SD_BUS_TYPE_STRING
: {
967 r
= sd_bus_message_read_basic(m
, type
, &s
);
974 r
= free_and_strdup(p
, s
);
978 case SD_BUS_TYPE_ARRAY
: {
979 _cleanup_strv_free_
char **l
= NULL
;
980 char ***p
= userdata
;
982 r
= bus_message_read_strv_extend(m
, &l
);
993 case SD_BUS_TYPE_BOOLEAN
: {
997 r
= sd_bus_message_read_basic(m
, type
, &b
);
1006 case SD_BUS_TYPE_UINT32
: {
1008 uint32_t *p
= userdata
;
1010 r
= sd_bus_message_read_basic(m
, type
, &u
);
1019 case SD_BUS_TYPE_UINT64
: {
1021 uint64_t *p
= userdata
;
1023 r
= sd_bus_message_read_basic(m
, type
, &t
);
1039 int bus_message_map_all_properties(
1041 const struct bus_properties_map
*map
,
1044 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1050 r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_ARRAY
, "{sv}");
1054 while ((r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_DICT_ENTRY
, "sv")) > 0) {
1055 const struct bus_properties_map
*prop
;
1057 const char *contents
;
1061 r
= sd_bus_message_read_basic(m
, SD_BUS_TYPE_STRING
, &member
);
1065 for (i
= 0, prop
= NULL
; map
[i
].member
; i
++)
1066 if (streq(map
[i
].member
, member
)) {
1072 r
= sd_bus_message_peek_type(m
, NULL
, &contents
);
1076 r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_VARIANT
, contents
);
1080 v
= (uint8_t *)userdata
+ prop
->offset
;
1082 r
= prop
->set(sd_bus_message_get_bus(m
), member
, m
, &error
, v
);
1084 r
= map_basic(sd_bus_message_get_bus(m
), member
, m
, &error
, v
);
1088 r
= sd_bus_message_exit_container(m
);
1092 r
= sd_bus_message_skip(m
, "v");
1097 r
= sd_bus_message_exit_container(m
);
1104 return sd_bus_message_exit_container(m
);
1107 int bus_message_map_properties_changed(
1109 const struct bus_properties_map
*map
,
1113 int r
, invalidated
, i
;
1118 r
= bus_message_map_all_properties(m
, map
, userdata
);
1122 r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_ARRAY
, "s");
1127 while ((r
= sd_bus_message_read_basic(m
, SD_BUS_TYPE_STRING
, &member
)) > 0)
1128 for (i
= 0; map
[i
].member
; i
++)
1129 if (streq(map
[i
].member
, member
)) {
1136 r
= sd_bus_message_exit_container(m
);
1143 int bus_map_all_properties(
1145 const char *destination
,
1147 const struct bus_properties_map
*map
,
1150 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1151 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1155 assert(destination
);
1159 r
= sd_bus_call_method(
1163 "org.freedesktop.DBus.Properties",
1171 return bus_message_map_all_properties(m
, map
, userdata
);
1174 int bus_open_transport(BusTransport transport
, const char *host
, bool user
, sd_bus
**bus
) {
1177 assert(transport
>= 0);
1178 assert(transport
< _BUS_TRANSPORT_MAX
);
1181 assert_return((transport
== BUS_TRANSPORT_LOCAL
) == !host
, -EINVAL
);
1182 assert_return(transport
== BUS_TRANSPORT_LOCAL
|| !user
, -EOPNOTSUPP
);
1184 switch (transport
) {
1186 case BUS_TRANSPORT_LOCAL
:
1188 r
= sd_bus_default_user(bus
);
1190 r
= sd_bus_default_system(bus
);
1194 case BUS_TRANSPORT_REMOTE
:
1195 r
= sd_bus_open_system_remote(bus
, host
);
1198 case BUS_TRANSPORT_MACHINE
:
1199 r
= sd_bus_open_system_machine(bus
, host
);
1203 assert_not_reached("Hmm, unknown transport type.");
1209 int bus_open_transport_systemd(BusTransport transport
, const char *host
, bool user
, sd_bus
**bus
) {
1212 assert(transport
>= 0);
1213 assert(transport
< _BUS_TRANSPORT_MAX
);
1216 assert_return((transport
== BUS_TRANSPORT_LOCAL
) == !host
, -EINVAL
);
1217 assert_return(transport
== BUS_TRANSPORT_LOCAL
|| !user
, -EOPNOTSUPP
);
1219 switch (transport
) {
1221 case BUS_TRANSPORT_LOCAL
:
1223 r
= bus_open_user_systemd(bus
);
1225 r
= bus_open_system_systemd(bus
);
1229 case BUS_TRANSPORT_REMOTE
:
1230 r
= sd_bus_open_system_remote(bus
, host
);
1233 case BUS_TRANSPORT_MACHINE
:
1234 r
= sd_bus_open_system_machine(bus
, host
);
1238 assert_not_reached("Hmm, unknown transport type.");
1244 int bus_property_get_bool(
1247 const char *interface
,
1248 const char *property
,
1249 sd_bus_message
*reply
,
1251 sd_bus_error
*error
) {
1253 int b
= *(bool*) userdata
;
1255 return sd_bus_message_append_basic(reply
, 'b', &b
);
1258 #if __SIZEOF_SIZE_T__ != 8
1259 int bus_property_get_size(
1262 const char *interface
,
1263 const char *property
,
1264 sd_bus_message
*reply
,
1266 sd_bus_error
*error
) {
1268 uint64_t sz
= *(size_t*) userdata
;
1270 return sd_bus_message_append_basic(reply
, 't', &sz
);
1274 #if __SIZEOF_LONG__ != 8
1275 int bus_property_get_long(
1278 const char *interface
,
1279 const char *property
,
1280 sd_bus_message
*reply
,
1282 sd_bus_error
*error
) {
1284 int64_t l
= *(long*) userdata
;
1286 return sd_bus_message_append_basic(reply
, 'x', &l
);
1289 int bus_property_get_ulong(
1292 const char *interface
,
1293 const char *property
,
1294 sd_bus_message
*reply
,
1296 sd_bus_error
*error
) {
1298 uint64_t ul
= *(unsigned long*) userdata
;
1300 return sd_bus_message_append_basic(reply
, 't', &ul
);
1304 int bus_log_parse_error(int r
) {
1305 return log_error_errno(r
, "Failed to parse bus message: %m");
1308 int bus_log_create_error(int r
) {
1309 return log_error_errno(r
, "Failed to create bus message: %m");
1312 int bus_parse_unit_info(sd_bus_message
*message
, UnitInfo
*u
) {
1318 return sd_bus_message_read(
1333 int bus_append_unit_property_assignment(sd_bus_message
*m
, const char *assignment
) {
1334 const char *eq
, *field
;
1340 eq
= strchr(assignment
, '=');
1342 log_error("Not an assignment: %s", assignment
);
1346 field
= strndupa(assignment
, eq
- assignment
);
1349 if (streq(field
, "CPUQuota")) {
1353 r
= sd_bus_message_append_basic(m
, SD_BUS_TYPE_STRING
, "CPUQuotaPerSecUSec");
1355 return bus_log_create_error(r
);
1357 r
= sd_bus_message_append(m
, "v", "t", USEC_INFINITY
);
1359 } else if (endswith(eq
, "%")) {
1362 if (sscanf(eq
, "%lf%%", &percent
) != 1 || percent
<= 0) {
1363 log_error("CPU quota '%s' invalid.", eq
);
1367 r
= sd_bus_message_append_basic(m
, SD_BUS_TYPE_STRING
, "CPUQuotaPerSecUSec");
1369 return bus_log_create_error(r
);
1371 r
= sd_bus_message_append(m
, "v", "t", (usec_t
) percent
* USEC_PER_SEC
/ 100);
1373 log_error("CPU quota needs to be in percent.");
1378 return bus_log_create_error(r
);
1383 r
= sd_bus_message_append_basic(m
, SD_BUS_TYPE_STRING
, field
);
1385 return bus_log_create_error(r
);
1387 if (STR_IN_SET(field
,
1388 "CPUAccounting", "MemoryAccounting", "BlockIOAccounting",
1389 "SendSIGHUP", "SendSIGKILL", "WakeSystem", "DefaultDependencies")) {
1391 r
= parse_boolean(eq
);
1393 log_error("Failed to parse boolean assignment %s.", assignment
);
1397 r
= sd_bus_message_append(m
, "v", "b", r
);
1399 } else if (streq(field
, "MemoryLimit")) {
1402 r
= parse_size(eq
, 1024, &bytes
);
1404 log_error("Failed to parse bytes specification %s", assignment
);
1408 r
= sd_bus_message_append(m
, "v", "t", (uint64_t) bytes
);
1410 } else if (STR_IN_SET(field
, "CPUShares", "BlockIOWeight")) {
1413 r
= safe_atou64(eq
, &u
);
1415 log_error("Failed to parse %s value %s.", field
, eq
);
1419 r
= sd_bus_message_append(m
, "v", "t", u
);
1421 } else if (STR_IN_SET(field
, "User", "Group", "DevicePolicy", "KillMode"))
1422 r
= sd_bus_message_append(m
, "v", "s", eq
);
1424 else if (streq(field
, "DeviceAllow")) {
1427 r
= sd_bus_message_append(m
, "v", "a(ss)", 0);
1429 const char *path
, *rwm
, *e
;
1431 e
= strchr(eq
, ' ');
1433 path
= strndupa(eq
, e
- eq
);
1440 if (!path_startswith(path
, "/dev")) {
1441 log_error("%s is not a device file in /dev.", path
);
1445 r
= sd_bus_message_append(m
, "v", "a(ss)", 1, path
, rwm
);
1448 } else if (STR_IN_SET(field
, "BlockIOReadBandwidth", "BlockIOWriteBandwidth")) {
1451 r
= sd_bus_message_append(m
, "v", "a(st)", 0);
1453 const char *path
, *bandwidth
, *e
;
1456 e
= strchr(eq
, ' ');
1458 path
= strndupa(eq
, e
- eq
);
1461 log_error("Failed to parse %s value %s.", field
, eq
);
1465 if (!path_startswith(path
, "/dev")) {
1466 log_error("%s is not a device file in /dev.", path
);
1470 r
= parse_size(bandwidth
, 1000, &bytes
);
1472 log_error("Failed to parse byte value %s.", bandwidth
);
1476 r
= sd_bus_message_append(m
, "v", "a(st)", 1, path
, (uint64_t) bytes
);
1479 } else if (streq(field
, "BlockIODeviceWeight")) {
1482 r
= sd_bus_message_append(m
, "v", "a(st)", 0);
1484 const char *path
, *weight
, *e
;
1487 e
= strchr(eq
, ' ');
1489 path
= strndupa(eq
, e
- eq
);
1492 log_error("Failed to parse %s value %s.", field
, eq
);
1496 if (!path_startswith(path
, "/dev")) {
1497 log_error("%s is not a device file in /dev.", path
);
1501 r
= safe_atou64(weight
, &u
);
1503 log_error("Failed to parse %s value %s.", field
, weight
);
1506 r
= sd_bus_message_append(m
, "v", "a(st)", path
, u
);
1509 } else if (rlimit_from_string(field
) >= 0) {
1512 if (streq(eq
, "infinity"))
1515 r
= safe_atou64(eq
, &rl
);
1517 log_error("Invalid resource limit: %s", eq
);
1522 r
= sd_bus_message_append(m
, "v", "t", rl
);
1524 } else if (streq(field
, "Nice")) {
1527 r
= safe_atoi32(eq
, &i
);
1529 log_error("Failed to parse %s value %s.", field
, eq
);
1533 r
= sd_bus_message_append(m
, "v", "i", i
);
1535 } else if (streq(field
, "Environment")) {
1537 r
= sd_bus_message_append(m
, "v", "as", 1, eq
);
1539 } else if (streq(field
, "KillSignal")) {
1542 sig
= signal_from_string_try_harder(eq
);
1544 log_error("Failed to parse %s value %s.", field
, eq
);
1548 r
= sd_bus_message_append(m
, "v", "i", sig
);
1550 } else if (streq(field
, "AccuracySec")) {
1553 r
= parse_sec(eq
, &u
);
1555 log_error("Failed to parse %s value %s", field
, eq
);
1559 r
= sd_bus_message_append(m
, "v", "t", u
);
1562 log_error("Unknown assignment %s.", assignment
);
1567 return bus_log_create_error(r
);
1572 typedef struct BusWaitForJobs
{
1579 sd_bus_slot
*slot_job_removed
;
1580 sd_bus_slot
*slot_disconnected
;
1583 static int match_disconnected(sd_bus_message
*m
, void *userdata
, sd_bus_error
*error
) {
1586 log_error("Warning! D-Bus connection terminated.");
1587 sd_bus_close(sd_bus_message_get_bus(m
));
1592 static int match_job_removed(sd_bus_message
*m
, void *userdata
, sd_bus_error
*error
) {
1593 const char *path
, *unit
, *result
;
1594 BusWaitForJobs
*d
= userdata
;
1602 r
= sd_bus_message_read(m
, "uoss", &id
, &path
, &unit
, &result
);
1604 bus_log_parse_error(r
);
1608 found
= set_remove(d
->jobs
, (char*) path
);
1614 if (!isempty(result
))
1615 d
->result
= strdup(result
);
1618 d
->name
= strdup(unit
);
1623 void bus_wait_for_jobs_free(BusWaitForJobs
*d
) {
1627 set_free_free(d
->jobs
);
1629 sd_bus_slot_unref(d
->slot_disconnected
);
1630 sd_bus_slot_unref(d
->slot_job_removed
);
1632 sd_bus_unref(d
->bus
);
1640 int bus_wait_for_jobs_new(sd_bus
*bus
, BusWaitForJobs
**ret
) {
1641 _cleanup_(bus_wait_for_jobs_freep
) BusWaitForJobs
*d
= NULL
;
1647 d
= new0(BusWaitForJobs
, 1);
1651 d
->bus
= sd_bus_ref(bus
);
1653 /* When we are a bus client we match by sender. Direct
1654 * connections OTOH have no initialized sender field, and
1655 * hence we ignore the sender then */
1656 r
= sd_bus_add_match(
1658 &d
->slot_job_removed
,
1661 "sender='org.freedesktop.systemd1',"
1662 "interface='org.freedesktop.systemd1.Manager',"
1663 "member='JobRemoved',"
1664 "path='/org/freedesktop/systemd1'" :
1666 "interface='org.freedesktop.systemd1.Manager',"
1667 "member='JobRemoved',"
1668 "path='/org/freedesktop/systemd1'",
1669 match_job_removed
, d
);
1673 r
= sd_bus_add_match(
1675 &d
->slot_disconnected
,
1677 "sender='org.freedesktop.DBus.Local',"
1678 "interface='org.freedesktop.DBus.Local',"
1679 "member='Disconnected'",
1680 match_disconnected
, d
);
1690 static int bus_process_wait(sd_bus
*bus
) {
1694 r
= sd_bus_process(bus
, NULL
);
1700 r
= sd_bus_wait(bus
, (uint64_t) -1);
1706 static int bus_job_get_service_result(BusWaitForJobs
*d
, char **result
) {
1707 _cleanup_free_
char *dbus_path
= NULL
;
1713 dbus_path
= unit_dbus_path_from_name(d
->name
);
1717 return sd_bus_get_property_string(d
->bus
,
1718 "org.freedesktop.systemd1",
1720 "org.freedesktop.systemd1.Service",
1726 static const struct {
1727 const char *result
, *explanation
;
1728 } explanations
[] = {
1729 { "resources", "a configured resource limit was exceeded" },
1730 { "timeout", "a timeout was exceeded" },
1731 { "exit-code", "the control process exited with error code" },
1732 { "signal", "a fatal signal was delivered to the control process" },
1733 { "core-dump", "a fatal signal was delivered causing the control process to dump core" },
1734 { "watchdog", "the service failed to send watchdog ping" },
1735 { "start-limit", "start of the service was attempted too often" }
1738 static void log_job_error_with_service_result(const char* service
, const char *result
) {
1739 _cleanup_free_
char *service_shell_quoted
= NULL
;
1743 service_shell_quoted
= shell_maybe_quote(service
);
1745 if (!isempty(result
)) {
1748 for (i
= 0; i
< ELEMENTSOF(explanations
); ++i
)
1749 if (streq(result
, explanations
[i
].result
))
1752 if (i
< ELEMENTSOF(explanations
)) {
1753 log_error("Job for %s failed because %s. See \"systemctl status %s\" and \"journalctl -xe\" for details.\n",
1755 explanations
[i
].explanation
,
1756 strna(service_shell_quoted
));
1762 log_error("Job for %s failed. See \"systemctl status %s\" and \"journalctl -xe\" for details.\n",
1764 strna(service_shell_quoted
));
1767 /* For some results maybe additional explanation is required */
1768 if (streq_ptr(result
, "start-limit"))
1769 log_info("To force a start use \"systemctl reset-failed %1$s\" followed by \"systemctl start %1$s\" again.",
1770 strna(service_shell_quoted
));
1773 static int check_wait_response(BusWaitForJobs
*d
, bool quiet
) {
1779 if (streq(d
->result
, "canceled"))
1780 log_error("Job for %s canceled.", strna(d
->name
));
1781 else if (streq(d
->result
, "timeout"))
1782 log_error("Job for %s timed out.", strna(d
->name
));
1783 else if (streq(d
->result
, "dependency"))
1784 log_error("A dependency job for %s failed. See 'journalctl -xe' for details.", strna(d
->name
));
1785 else if (streq(d
->result
, "invalid"))
1786 log_error("Job for %s invalid.", strna(d
->name
));
1787 else if (streq(d
->result
, "assert"))
1788 log_error("Assertion failed on job for %s.", strna(d
->name
));
1789 else if (streq(d
->result
, "unsupported"))
1790 log_error("Operation on or unit type of %s not supported on this system.", strna(d
->name
));
1791 else if (!streq(d
->result
, "done") && !streq(d
->result
, "skipped")) {
1794 _cleanup_free_
char *result
= NULL
;
1796 q
= bus_job_get_service_result(d
, &result
);
1798 log_debug_errno(q
, "Failed to get Result property of service %s: %m", d
->name
);
1800 log_job_error_with_service_result(d
->name
, result
);
1802 log_error("Job failed. See \"journalctl -xe\" for details.");
1806 if (streq(d
->result
, "canceled"))
1808 else if (streq(d
->result
, "timeout"))
1810 else if (streq(d
->result
, "dependency"))
1812 else if (streq(d
->result
, "invalid"))
1814 else if (streq(d
->result
, "assert"))
1816 else if (streq(d
->result
, "unsupported"))
1818 else if (!streq(d
->result
, "done") && !streq(d
->result
, "skipped"))
1824 int bus_wait_for_jobs(BusWaitForJobs
*d
, bool quiet
) {
1829 while (!set_isempty(d
->jobs
)) {
1832 q
= bus_process_wait(d
->bus
);
1834 return log_error_errno(q
, "Failed to wait for response: %m");
1837 q
= check_wait_response(d
, quiet
);
1838 /* Return the first error as it is most likely to be
1840 if (q
< 0 && r
== 0)
1843 log_debug_errno(q
, "Got result %s/%m for job %s", strna(d
->result
), strna(d
->name
));
1856 int bus_wait_for_jobs_add(BusWaitForJobs
*d
, const char *path
) {
1861 r
= set_ensure_allocated(&d
->jobs
, &string_hash_ops
);
1865 return set_put_strdup(d
->jobs
, path
);
1868 int bus_wait_for_jobs_one(BusWaitForJobs
*d
, const char *path
, bool quiet
) {
1871 r
= bus_wait_for_jobs_add(d
, path
);
1875 return bus_wait_for_jobs(d
, quiet
);
1878 int bus_deserialize_and_dump_unit_file_changes(sd_bus_message
*m
, bool quiet
, UnitFileChange
**changes
, unsigned *n_changes
) {
1879 const char *type
, *path
, *source
;
1882 r
= sd_bus_message_enter_container(m
, SD_BUS_TYPE_ARRAY
, "(sss)");
1884 return bus_log_parse_error(r
);
1886 while ((r
= sd_bus_message_read(m
, "(sss)", &type
, &path
, &source
)) > 0) {
1888 if (streq(type
, "symlink"))
1889 log_info("Created symlink from %s to %s.", path
, source
);
1891 log_info("Removed symlink %s.", path
);
1894 r
= unit_file_changes_add(changes
, n_changes
, streq(type
, "symlink") ? UNIT_FILE_SYMLINK
: UNIT_FILE_UNLINK
, path
, source
);
1899 return bus_log_parse_error(r
);
1901 r
= sd_bus_message_exit_container(m
);
1903 return bus_log_parse_error(r
);
1909 * bus_path_encode_unique() - encode unique object path
1910 * @b: bus connection or NULL
1911 * @prefix: object path prefix
1912 * @sender_id: unique-name of client, or NULL
1913 * @external_id: external ID to be chosen by client, or NULL
1914 * @ret_path: storage for encoded object path pointer
1916 * Whenever we provide a bus API that allows clients to create and manage
1917 * server-side objects, we need to provide a unique name for these objects. If
1918 * we let the server choose the name, we suffer from a race condition: If a
1919 * client creates an object asynchronously, it cannot destroy that object until
1920 * it received the method reply. It cannot know the name of the new object,
1921 * thus, it cannot destroy it. Furthermore, it enforces a round-trip.
1923 * Therefore, many APIs allow the client to choose the unique name for newly
1924 * created objects. There're two problems to solve, though:
1925 * 1) Object names are usually defined via dbus object paths, which are
1926 * usually globally namespaced. Therefore, multiple clients must be able
1927 * to choose unique object names without interference.
1928 * 2) If multiple libraries share the same bus connection, they must be
1929 * able to choose unique object names without interference.
1930 * The first problem is solved easily by prefixing a name with the
1931 * unique-bus-name of a connection. The server side must enforce this and
1932 * reject any other name. The second problem is solved by providing unique
1933 * suffixes from within sd-bus.
1935 * This helper allows clients to create unique object-paths. It uses the
1936 * template '/prefix/sender_id/external_id' and returns the new path in
1937 * @ret_path (must be freed by the caller).
1938 * If @sender_id is NULL, the unique-name of @b is used. If @external_id is
1939 * NULL, this function allocates a unique suffix via @b (by requesting a new
1940 * cookie). If both @sender_id and @external_id are given, @b can be passed as
1943 * Returns: 0 on success, negative error code on failure.
1945 int bus_path_encode_unique(sd_bus
*b
, const char *prefix
, const char *sender_id
, const char *external_id
, char **ret_path
) {
1946 _cleanup_free_
char *sender_label
= NULL
, *external_label
= NULL
;
1947 char external_buf
[DECIMAL_STR_MAX(uint64_t)], *p
;
1950 assert_return(b
|| (sender_id
&& external_id
), -EINVAL
);
1951 assert_return(object_path_is_valid(prefix
), -EINVAL
);
1952 assert_return(ret_path
, -EINVAL
);
1955 r
= sd_bus_get_unique_name(b
, &sender_id
);
1961 xsprintf(external_buf
, "%"PRIu64
, ++b
->cookie
);
1962 external_id
= external_buf
;
1965 sender_label
= bus_label_escape(sender_id
);
1969 external_label
= bus_label_escape(external_id
);
1970 if (!external_label
)
1973 p
= strjoin(prefix
, "/", sender_label
, "/", external_label
, NULL
);
1982 * bus_path_decode_unique() - decode unique object path
1983 * @path: object path to decode
1984 * @prefix: object path prefix
1985 * @ret_sender: output parameter for sender-id label
1986 * @ret_external: output parameter for external-id label
1988 * This does the reverse of bus_path_encode_unique() (see its description for
1989 * details). Both trailing labels, sender-id and external-id, are unescaped and
1990 * returned in the given output parameters (the caller must free them).
1992 * Note that this function returns 0 if the path does not match the template
1993 * (see bus_path_encode_unique()), 1 if it matched.
1995 * Returns: Negative error code on failure, 0 if the given object path does not
1996 * match the template (return parameters are set to NULL), 1 if it was
1997 * parsed successfully (return parameters contain allocated labels).
1999 int bus_path_decode_unique(const char *path
, const char *prefix
, char **ret_sender
, char **ret_external
) {
2001 char *sender
, *external
;
2003 assert(object_path_is_valid(path
));
2004 assert(object_path_is_valid(prefix
));
2006 assert(ret_external
);
2008 p
= object_path_startswith(path
, prefix
);
2011 *ret_external
= NULL
;
2018 *ret_external
= NULL
;
2022 sender
= bus_label_unescape_n(p
, q
- p
);
2023 external
= bus_label_unescape(q
+ 1);
2024 if (!sender
|| !external
) {
2030 *ret_sender
= sender
;
2031 *ret_external
= external
;
2035 bool is_kdbus_wanted(void) {
2036 _cleanup_free_
char *value
= NULL
;
2039 if (get_proc_cmdline_key("kdbus", NULL
) <= 0) {
2040 r
= get_proc_cmdline_key("kdbus=", &value
);
2041 if (r
<= 0 || parse_boolean(value
) != 1)
2048 bool is_kdbus_available(void) {
2049 _cleanup_close_
int fd
= -1;
2050 struct kdbus_cmd cmd
= { .size
= sizeof(cmd
), .flags
= KDBUS_FLAG_NEGOTIATE
};
2052 if (!is_kdbus_wanted())
2055 fd
= open("/sys/fs/kdbus/control", O_RDWR
| O_CLOEXEC
| O_NONBLOCK
| O_NOCTTY
);
2059 return ioctl(fd
, KDBUS_CMD_BUS_MAKE
, &cmd
) >= 0;