]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/dbus-manager.c
core: rename (and modernize) bus_unit_check_load_state() → bus_unit_validate_load_state()
[thirdparty/systemd.git] / src / core / dbus-manager.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6 ***/
7
8 #include <errno.h>
9 #include <sys/prctl.h>
10 #include <sys/statvfs.h>
11 #include <unistd.h>
12
13 #include "alloc-util.h"
14 #include "architecture.h"
15 #include "build.h"
16 #include "bus-common-errors.h"
17 #include "dbus-execute.h"
18 #include "dbus-job.h"
19 #include "dbus-manager.h"
20 #include "dbus-unit.h"
21 #include "dbus.h"
22 #include "env-util.h"
23 #include "fd-util.h"
24 #include "fileio.h"
25 #include "format-util.h"
26 #include "fs-util.h"
27 #include "install.h"
28 #include "log.h"
29 #include "os-util.h"
30 #include "parse-util.h"
31 #include "path-util.h"
32 #include "selinux-access.h"
33 #include "stat-util.h"
34 #include "string-util.h"
35 #include "strv.h"
36 #include "syslog-util.h"
37 #include "user-util.h"
38 #include "virt.h"
39 #include "watchdog.h"
40
41 /* Require 16MiB free in /run/systemd for reloading/reexecing. After all we need to serialize our state there, and if
42 * we can't we'll fail badly. */
43 #define RELOAD_DISK_SPACE_MIN (UINT64_C(16) * UINT64_C(1024) * UINT64_C(1024))
44
45 static UnitFileFlags unit_file_bools_to_flags(bool runtime, bool force) {
46 return (runtime ? UNIT_FILE_RUNTIME : 0) |
47 (force ? UNIT_FILE_FORCE : 0);
48 }
49
50 static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_version, "s", PACKAGE_VERSION);
51 static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_features, "s", SYSTEMD_FEATURES);
52 static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_architecture, "s", architecture_to_string(uname_architecture()));
53 static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_log_target, "s", log_target_to_string(log_get_target()));
54 static BUS_DEFINE_PROPERTY_GET2(property_get_system_state, "s", Manager, manager_state, manager_state_to_string);
55 static BUS_DEFINE_PROPERTY_GET_GLOBAL(property_get_timer_slack_nsec, "t", (uint64_t) prctl(PR_GET_TIMERSLACK));
56 static BUS_DEFINE_PROPERTY_GET_REF(property_get_hashmap_size, "u", Hashmap *, hashmap_size);
57 static BUS_DEFINE_PROPERTY_GET_REF(property_get_set_size, "u", Set *, set_size);
58
59 static int property_get_virtualization(
60 sd_bus *bus,
61 const char *path,
62 const char *interface,
63 const char *property,
64 sd_bus_message *reply,
65 void *userdata,
66 sd_bus_error *error) {
67
68 int v;
69
70 assert(bus);
71 assert(reply);
72
73 v = detect_virtualization();
74
75 /* Make sure to return the empty string when we detect no virtualization, as that is the API.
76 *
77 * https://github.com/systemd/systemd/issues/1423
78 */
79
80 return sd_bus_message_append(
81 reply, "s",
82 v == VIRTUALIZATION_NONE ? NULL : virtualization_to_string(v));
83 }
84
85 static int property_get_tainted(
86 sd_bus *bus,
87 const char *path,
88 const char *interface,
89 const char *property,
90 sd_bus_message *reply,
91 void *userdata,
92 sd_bus_error *error) {
93
94 _cleanup_free_ char *s = NULL;
95 Manager *m = userdata;
96
97 assert(bus);
98 assert(reply);
99 assert(m);
100
101 s = manager_taint_string(m);
102 if (!s)
103 return log_oom();
104
105 return sd_bus_message_append(reply, "s", s);
106 }
107
108 static int property_set_log_target(
109 sd_bus *bus,
110 const char *path,
111 const char *interface,
112 const char *property,
113 sd_bus_message *value,
114 void *userdata,
115 sd_bus_error *error) {
116
117 const char *t;
118 int r;
119
120 assert(bus);
121 assert(value);
122
123 r = sd_bus_message_read(value, "s", &t);
124 if (r < 0)
125 return r;
126
127 return log_set_target_from_string(t);
128 }
129
130 static int property_get_log_level(
131 sd_bus *bus,
132 const char *path,
133 const char *interface,
134 const char *property,
135 sd_bus_message *reply,
136 void *userdata,
137 sd_bus_error *error) {
138
139 _cleanup_free_ char *t = NULL;
140 int r;
141
142 assert(bus);
143 assert(reply);
144
145 r = log_level_to_string_alloc(log_get_max_level(), &t);
146 if (r < 0)
147 return r;
148
149 return sd_bus_message_append(reply, "s", t);
150 }
151
152 static int property_set_log_level(
153 sd_bus *bus,
154 const char *path,
155 const char *interface,
156 const char *property,
157 sd_bus_message *value,
158 void *userdata,
159 sd_bus_error *error) {
160
161 const char *t;
162 int r;
163
164 assert(bus);
165 assert(value);
166
167 r = sd_bus_message_read(value, "s", &t);
168 if (r < 0)
169 return r;
170
171 r = log_set_max_level_from_string(t);
172 if (r == 0)
173 log_info("Setting log level to %s.", t);
174 return r;
175 }
176
177 static int property_get_progress(
178 sd_bus *bus,
179 const char *path,
180 const char *interface,
181 const char *property,
182 sd_bus_message *reply,
183 void *userdata,
184 sd_bus_error *error) {
185
186 Manager *m = userdata;
187 double d;
188
189 assert(bus);
190 assert(reply);
191 assert(m);
192
193 if (MANAGER_IS_FINISHED(m))
194 d = 1.0;
195 else
196 d = 1.0 - ((double) hashmap_size(m->jobs) / (double) m->n_installed_jobs);
197
198 return sd_bus_message_append(reply, "d", d);
199 }
200
201 static int property_get_show_status(
202 sd_bus *bus,
203 const char *path,
204 const char *interface,
205 const char *property,
206 sd_bus_message *reply,
207 void *userdata,
208 sd_bus_error *error) {
209
210 Manager *m = userdata;
211 int b;
212
213 assert(bus);
214 assert(reply);
215 assert(m);
216
217 b = m->show_status > 0;
218 return sd_bus_message_append_basic(reply, 'b', &b);
219 }
220
221 static int property_set_runtime_watchdog(
222 sd_bus *bus,
223 const char *path,
224 const char *interface,
225 const char *property,
226 sd_bus_message *value,
227 void *userdata,
228 sd_bus_error *error) {
229
230 usec_t *t = userdata;
231 int r;
232
233 assert(bus);
234 assert(value);
235
236 assert_cc(sizeof(usec_t) == sizeof(uint64_t));
237
238 r = sd_bus_message_read(value, "t", t);
239 if (r < 0)
240 return r;
241
242 return watchdog_set_timeout(t);
243 }
244
245 static int bus_get_unit_by_name(Manager *m, sd_bus_message *message, const char *name, Unit **ret_unit, sd_bus_error *error) {
246 Unit *u;
247 int r;
248
249 assert(m);
250 assert(message);
251 assert(ret_unit);
252
253 /* More or less a wrapper around manager_get_unit() that generates nice errors and has one trick up its sleeve:
254 * if the name is specified empty we use the client's unit. */
255
256 if (isempty(name)) {
257 _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
258 pid_t pid;
259
260 r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds);
261 if (r < 0)
262 return r;
263
264 r = sd_bus_creds_get_pid(creds, &pid);
265 if (r < 0)
266 return r;
267
268 u = manager_get_unit_by_pid(m, pid);
269 if (!u)
270 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Client not member of any unit.");
271 } else {
272 u = manager_get_unit(m, name);
273 if (!u)
274 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Unit %s not loaded.", name);
275 }
276
277 *ret_unit = u;
278 return 0;
279 }
280
281 static int bus_load_unit_by_name(Manager *m, sd_bus_message *message, const char *name, Unit **ret_unit, sd_bus_error *error) {
282 assert(m);
283 assert(message);
284 assert(ret_unit);
285
286 /* Pretty much the same as bus_get_unit_by_name(), but we also load the unit if necessary. */
287
288 if (isempty(name))
289 return bus_get_unit_by_name(m, message, name, ret_unit, error);
290
291 return manager_load_unit(m, name, NULL, error, ret_unit);
292 }
293
294 static int method_get_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
295 _cleanup_free_ char *path = NULL;
296 Manager *m = userdata;
297 const char *name;
298 Unit *u;
299 int r;
300
301 assert(message);
302 assert(m);
303
304 /* Anyone can call this method */
305
306 r = sd_bus_message_read(message, "s", &name);
307 if (r < 0)
308 return r;
309
310 r = bus_get_unit_by_name(m, message, name, &u, error);
311 if (r < 0)
312 return r;
313
314 r = mac_selinux_unit_access_check(u, message, "status", error);
315 if (r < 0)
316 return r;
317
318 path = unit_dbus_path(u);
319 if (!path)
320 return -ENOMEM;
321
322 return sd_bus_reply_method_return(message, "o", path);
323 }
324
325 static int method_get_unit_by_pid(sd_bus_message *message, void *userdata, sd_bus_error *error) {
326 _cleanup_free_ char *path = NULL;
327 Manager *m = userdata;
328 pid_t pid;
329 Unit *u;
330 int r;
331
332 assert(message);
333 assert(m);
334
335 assert_cc(sizeof(pid_t) == sizeof(uint32_t));
336
337 /* Anyone can call this method */
338
339 r = sd_bus_message_read(message, "u", &pid);
340 if (r < 0)
341 return r;
342 if (pid < 0)
343 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid PID " PID_FMT, pid);
344
345 if (pid == 0) {
346 _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
347
348 r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds);
349 if (r < 0)
350 return r;
351
352 r = sd_bus_creds_get_pid(creds, &pid);
353 if (r < 0)
354 return r;
355 }
356
357 u = manager_get_unit_by_pid(m, pid);
358 if (!u)
359 return sd_bus_error_setf(error, BUS_ERROR_NO_UNIT_FOR_PID, "PID "PID_FMT" does not belong to any loaded unit.", pid);
360
361 r = mac_selinux_unit_access_check(u, message, "status", error);
362 if (r < 0)
363 return r;
364
365 path = unit_dbus_path(u);
366 if (!path)
367 return -ENOMEM;
368
369 return sd_bus_reply_method_return(message, "o", path);
370 }
371
372 static int method_get_unit_by_invocation_id(sd_bus_message *message, void *userdata, sd_bus_error *error) {
373 _cleanup_free_ char *path = NULL;
374 Manager *m = userdata;
375 sd_id128_t id;
376 const void *a;
377 Unit *u;
378 size_t sz;
379 int r;
380
381 assert(message);
382 assert(m);
383
384 /* Anyone can call this method */
385
386 r = sd_bus_message_read_array(message, 'y', &a, &sz);
387 if (r < 0)
388 return r;
389 if (sz == 0)
390 id = SD_ID128_NULL;
391 else if (sz == 16)
392 memcpy(&id, a, sz);
393 else
394 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid invocation ID");
395
396 if (sd_id128_is_null(id)) {
397 _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
398 pid_t pid;
399
400 r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds);
401 if (r < 0)
402 return r;
403
404 r = sd_bus_creds_get_pid(creds, &pid);
405 if (r < 0)
406 return r;
407
408 u = manager_get_unit_by_pid(m, pid);
409 if (!u)
410 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Client " PID_FMT " not member of any unit.", pid);
411 } else {
412 u = hashmap_get(m->units_by_invocation_id, &id);
413 if (!u)
414 return sd_bus_error_setf(error, BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID, "No unit with the specified invocation ID " SD_ID128_FORMAT_STR " known.", SD_ID128_FORMAT_VAL(id));
415 }
416
417 r = mac_selinux_unit_access_check(u, message, "status", error);
418 if (r < 0)
419 return r;
420
421 /* So here's a special trick: the bus path we return actually references the unit by its invocation ID instead
422 * of the unit name. This means it stays valid only as long as the invocation ID stays the same. */
423 path = unit_dbus_path_invocation_id(u);
424 if (!path)
425 return -ENOMEM;
426
427 return sd_bus_reply_method_return(message, "o", path);
428 }
429
430 static int method_get_unit_by_control_group(sd_bus_message *message, void *userdata, sd_bus_error *error) {
431 _cleanup_free_ char *path = NULL;
432 Manager *m = userdata;
433 const char *cgroup;
434 Unit *u;
435 int r;
436
437 r = sd_bus_message_read(message, "s", &cgroup);
438 if (r < 0)
439 return r;
440
441 u = manager_get_unit_by_cgroup(m, cgroup);
442 if (!u)
443 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Control group '%s' is not valid or not managed by this instance", cgroup);
444
445 r = mac_selinux_unit_access_check(u, message, "status", error);
446 if (r < 0)
447 return r;
448
449 path = unit_dbus_path(u);
450 if (!path)
451 return -ENOMEM;
452
453 return sd_bus_reply_method_return(message, "o", path);
454 }
455
456 static int method_load_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
457 _cleanup_free_ char *path = NULL;
458 Manager *m = userdata;
459 const char *name;
460 Unit *u;
461 int r;
462
463 assert(message);
464 assert(m);
465
466 /* Anyone can call this method */
467
468 r = sd_bus_message_read(message, "s", &name);
469 if (r < 0)
470 return r;
471
472 r = bus_load_unit_by_name(m, message, name, &u, error);
473 if (r < 0)
474 return r;
475
476 r = mac_selinux_unit_access_check(u, message, "status", error);
477 if (r < 0)
478 return r;
479
480 path = unit_dbus_path(u);
481 if (!path)
482 return -ENOMEM;
483
484 return sd_bus_reply_method_return(message, "o", path);
485 }
486
487 static int method_start_unit_generic(sd_bus_message *message, Manager *m, JobType job_type, bool reload_if_possible, sd_bus_error *error) {
488 const char *name;
489 Unit *u;
490 int r;
491
492 assert(message);
493 assert(m);
494
495 r = sd_bus_message_read(message, "s", &name);
496 if (r < 0)
497 return r;
498
499 r = manager_load_unit(m, name, NULL, error, &u);
500 if (r < 0)
501 return r;
502
503 return bus_unit_method_start_generic(message, u, job_type, reload_if_possible, error);
504 }
505
506 static int method_start_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
507 return method_start_unit_generic(message, userdata, JOB_START, false, error);
508 }
509
510 static int method_stop_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
511 return method_start_unit_generic(message, userdata, JOB_STOP, false, error);
512 }
513
514 static int method_reload_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
515 return method_start_unit_generic(message, userdata, JOB_RELOAD, false, error);
516 }
517
518 static int method_restart_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
519 return method_start_unit_generic(message, userdata, JOB_RESTART, false, error);
520 }
521
522 static int method_try_restart_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
523 return method_start_unit_generic(message, userdata, JOB_TRY_RESTART, false, error);
524 }
525
526 static int method_reload_or_restart_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
527 return method_start_unit_generic(message, userdata, JOB_RESTART, true, error);
528 }
529
530 static int method_reload_or_try_restart_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
531 return method_start_unit_generic(message, userdata, JOB_TRY_RESTART, true, error);
532 }
533
534 static int method_start_unit_replace(sd_bus_message *message, void *userdata, sd_bus_error *error) {
535 Manager *m = userdata;
536 const char *old_name;
537 Unit *u;
538 int r;
539
540 assert(message);
541 assert(m);
542
543 r = sd_bus_message_read(message, "s", &old_name);
544 if (r < 0)
545 return r;
546
547 r = bus_get_unit_by_name(m, message, old_name, &u, error);
548 if (r < 0)
549 return r;
550 if (!u->job || u->job->type != JOB_START)
551 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_JOB, "No job queued for unit %s", old_name);
552
553 return method_start_unit_generic(message, m, JOB_START, false, error);
554 }
555
556 static int method_kill_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
557 Manager *m = userdata;
558 const char *name;
559 Unit *u;
560 int r;
561
562 assert(message);
563 assert(m);
564
565 r = sd_bus_message_read(message, "s", &name);
566 if (r < 0)
567 return r;
568
569 r = bus_get_unit_by_name(m, message, name, &u, error);
570 if (r < 0)
571 return r;
572
573 return bus_unit_method_kill(message, u, error);
574 }
575
576 static int method_reset_failed_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
577 Manager *m = userdata;
578 const char *name;
579 Unit *u;
580 int r;
581
582 assert(message);
583 assert(m);
584
585 r = sd_bus_message_read(message, "s", &name);
586 if (r < 0)
587 return r;
588
589 r = bus_get_unit_by_name(m, message, name, &u, error);
590 if (r < 0)
591 return r;
592
593 return bus_unit_method_reset_failed(message, u, error);
594 }
595
596 static int method_set_unit_properties(sd_bus_message *message, void *userdata, sd_bus_error *error) {
597 Manager *m = userdata;
598 const char *name;
599 Unit *u;
600 int r;
601
602 assert(message);
603 assert(m);
604
605 r = sd_bus_message_read(message, "s", &name);
606 if (r < 0)
607 return r;
608
609 r = bus_load_unit_by_name(m, message, name, &u, error);
610 if (r < 0)
611 return r;
612
613 r = bus_unit_validate_load_state(u, error);
614 if (r < 0)
615 return r;
616
617 return bus_unit_method_set_properties(message, u, error);
618 }
619
620 static int method_ref_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
621 Manager *m = userdata;
622 const char *name;
623 Unit *u;
624 int r;
625
626 assert(message);
627 assert(m);
628
629 r = sd_bus_message_read(message, "s", &name);
630 if (r < 0)
631 return r;
632
633 r = bus_load_unit_by_name(m, message, name, &u, error);
634 if (r < 0)
635 return r;
636
637 r = bus_unit_validate_load_state(u, error);
638 if (r < 0)
639 return r;
640
641 return bus_unit_method_ref(message, u, error);
642 }
643
644 static int method_unref_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
645 Manager *m = userdata;
646 const char *name;
647 Unit *u;
648 int r;
649
650 assert(message);
651 assert(m);
652
653 r = sd_bus_message_read(message, "s", &name);
654 if (r < 0)
655 return r;
656
657 r = bus_load_unit_by_name(m, message, name, &u, error);
658 if (r < 0)
659 return r;
660
661 r = bus_unit_validate_load_state(u, error);
662 if (r < 0)
663 return r;
664
665 return bus_unit_method_unref(message, u, error);
666 }
667
668 static int reply_unit_info(sd_bus_message *reply, Unit *u) {
669 _cleanup_free_ char *unit_path = NULL, *job_path = NULL;
670 Unit *following;
671
672 following = unit_following(u);
673
674 unit_path = unit_dbus_path(u);
675 if (!unit_path)
676 return -ENOMEM;
677
678 if (u->job) {
679 job_path = job_dbus_path(u->job);
680 if (!job_path)
681 return -ENOMEM;
682 }
683
684 return sd_bus_message_append(
685 reply, "(ssssssouso)",
686 u->id,
687 unit_description(u),
688 unit_load_state_to_string(u->load_state),
689 unit_active_state_to_string(unit_active_state(u)),
690 unit_sub_state_to_string(u),
691 following ? following->id : "",
692 unit_path,
693 u->job ? u->job->id : 0,
694 u->job ? job_type_to_string(u->job->type) : "",
695 job_path ? job_path : "/");
696 }
697
698 static int method_list_units_by_names(sd_bus_message *message, void *userdata, sd_bus_error *error) {
699 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
700 Manager *m = userdata;
701 int r;
702 char **unit;
703 _cleanup_strv_free_ char **units = NULL;
704
705 assert(message);
706 assert(m);
707
708 r = sd_bus_message_read_strv(message, &units);
709 if (r < 0)
710 return r;
711
712 r = sd_bus_message_new_method_return(message, &reply);
713 if (r < 0)
714 return r;
715
716 r = sd_bus_message_open_container(reply, 'a', "(ssssssouso)");
717 if (r < 0)
718 return r;
719
720 STRV_FOREACH(unit, units) {
721 Unit *u;
722
723 if (!unit_name_is_valid(*unit, UNIT_NAME_ANY))
724 continue;
725
726 r = bus_load_unit_by_name(m, message, *unit, &u, error);
727 if (r < 0)
728 return r;
729
730 r = reply_unit_info(reply, u);
731 if (r < 0)
732 return r;
733 }
734
735 r = sd_bus_message_close_container(reply);
736 if (r < 0)
737 return r;
738
739 return sd_bus_send(NULL, reply, NULL);
740 }
741
742 static int method_get_unit_processes(sd_bus_message *message, void *userdata, sd_bus_error *error) {
743 Manager *m = userdata;
744 const char *name;
745 Unit *u;
746 int r;
747
748 assert(message);
749 assert(m);
750
751 r = sd_bus_message_read(message, "s", &name);
752 if (r < 0)
753 return r;
754
755 r = bus_get_unit_by_name(m, message, name, &u, error);
756 if (r < 0)
757 return r;
758
759 return bus_unit_method_get_processes(message, u, error);
760 }
761
762 static int method_attach_processes_to_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
763 Manager *m = userdata;
764 const char *name;
765 Unit *u;
766 int r;
767
768 assert(message);
769 assert(m);
770
771 r = sd_bus_message_read(message, "s", &name);
772 if (r < 0)
773 return r;
774
775 r = bus_get_unit_by_name(m, message, name, &u, error);
776 if (r < 0)
777 return r;
778
779 return bus_unit_method_attach_processes(message, u, error);
780 }
781
782 static int transient_unit_from_message(
783 Manager *m,
784 sd_bus_message *message,
785 const char *name,
786 Unit **unit,
787 sd_bus_error *error) {
788
789 UnitType t;
790 Unit *u;
791 int r;
792
793 assert(m);
794 assert(message);
795 assert(name);
796
797 t = unit_name_to_type(name);
798 if (t < 0)
799 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid unit name or type.");
800
801 if (!unit_vtable[t]->can_transient)
802 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unit type %s does not support transient units.", unit_type_to_string(t));
803
804 r = manager_load_unit(m, name, NULL, error, &u);
805 if (r < 0)
806 return r;
807
808 if (!unit_is_pristine(u))
809 return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
810
811 /* OK, the unit failed to load and is unreferenced, now let's
812 * fill in the transient data instead */
813 r = unit_make_transient(u);
814 if (r < 0)
815 return r;
816
817 /* Set our properties */
818 r = bus_unit_set_properties(u, message, UNIT_RUNTIME, false, error);
819 if (r < 0)
820 return r;
821
822 /* If the client asked for it, automatically add a reference to this unit. */
823 if (u->bus_track_add) {
824 r = bus_unit_track_add_sender(u, message);
825 if (r < 0)
826 return log_error_errno(r, "Failed to watch sender: %m");
827 }
828
829 /* Now load the missing bits of the unit we just created */
830 unit_add_to_load_queue(u);
831 manager_dispatch_load_queue(m);
832
833 *unit = u;
834
835 return 0;
836 }
837
838 static int transient_aux_units_from_message(
839 Manager *m,
840 sd_bus_message *message,
841 sd_bus_error *error) {
842
843 int r;
844
845 assert(m);
846 assert(message);
847
848 r = sd_bus_message_enter_container(message, 'a', "(sa(sv))");
849 if (r < 0)
850 return r;
851
852 while ((r = sd_bus_message_enter_container(message, 'r', "sa(sv)")) > 0) {
853 const char *name = NULL;
854 Unit *u;
855
856 r = sd_bus_message_read(message, "s", &name);
857 if (r < 0)
858 return r;
859
860 r = transient_unit_from_message(m, message, name, &u, error);
861 if (r < 0)
862 return r;
863
864 r = sd_bus_message_exit_container(message);
865 if (r < 0)
866 return r;
867 }
868 if (r < 0)
869 return r;
870
871 r = sd_bus_message_exit_container(message);
872 if (r < 0)
873 return r;
874
875 return 0;
876 }
877
878 static int method_start_transient_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
879 const char *name, *smode;
880 Manager *m = userdata;
881 JobMode mode;
882 Unit *u;
883 int r;
884
885 assert(message);
886 assert(m);
887
888 r = mac_selinux_access_check(message, "start", error);
889 if (r < 0)
890 return r;
891
892 r = sd_bus_message_read(message, "ss", &name, &smode);
893 if (r < 0)
894 return r;
895
896 mode = job_mode_from_string(smode);
897 if (mode < 0)
898 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Job mode %s is invalid.", smode);
899
900 r = bus_verify_manage_units_async(m, message, error);
901 if (r < 0)
902 return r;
903 if (r == 0)
904 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
905
906 r = transient_unit_from_message(m, message, name, &u, error);
907 if (r < 0)
908 return r;
909
910 r = transient_aux_units_from_message(m, message, error);
911 if (r < 0)
912 return r;
913
914 /* Finally, start it */
915 return bus_unit_queue_job(message, u, JOB_START, mode, false, error);
916 }
917
918 static int method_get_job(sd_bus_message *message, void *userdata, sd_bus_error *error) {
919 _cleanup_free_ char *path = NULL;
920 Manager *m = userdata;
921 uint32_t id;
922 Job *j;
923 int r;
924
925 assert(message);
926 assert(m);
927
928 /* Anyone can call this method */
929
930 r = sd_bus_message_read(message, "u", &id);
931 if (r < 0)
932 return r;
933
934 j = manager_get_job(m, id);
935 if (!j)
936 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_JOB, "Job %u does not exist.", (unsigned) id);
937
938 r = mac_selinux_unit_access_check(j->unit, message, "status", error);
939 if (r < 0)
940 return r;
941
942 path = job_dbus_path(j);
943 if (!path)
944 return -ENOMEM;
945
946 return sd_bus_reply_method_return(message, "o", path);
947 }
948
949 static int method_cancel_job(sd_bus_message *message, void *userdata, sd_bus_error *error) {
950 Manager *m = userdata;
951 uint32_t id;
952 Job *j;
953 int r;
954
955 assert(message);
956 assert(m);
957
958 r = sd_bus_message_read(message, "u", &id);
959 if (r < 0)
960 return r;
961
962 j = manager_get_job(m, id);
963 if (!j)
964 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_JOB, "Job %u does not exist.", (unsigned) id);
965
966 return bus_job_method_cancel(message, j, error);
967 }
968
969 static int method_clear_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error) {
970 Manager *m = userdata;
971 int r;
972
973 assert(message);
974 assert(m);
975
976 r = mac_selinux_access_check(message, "reload", error);
977 if (r < 0)
978 return r;
979
980 r = bus_verify_manage_units_async(m, message, error);
981 if (r < 0)
982 return r;
983 if (r == 0)
984 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
985
986 manager_clear_jobs(m);
987
988 return sd_bus_reply_method_return(message, NULL);
989 }
990
991 static int method_reset_failed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
992 Manager *m = userdata;
993 int r;
994
995 assert(message);
996 assert(m);
997
998 r = mac_selinux_access_check(message, "reload", error);
999 if (r < 0)
1000 return r;
1001
1002 r = bus_verify_manage_units_async(m, message, error);
1003 if (r < 0)
1004 return r;
1005 if (r == 0)
1006 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
1007
1008 manager_reset_failed(m);
1009
1010 return sd_bus_reply_method_return(message, NULL);
1011 }
1012
1013 static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states, char **patterns) {
1014 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1015 Manager *m = userdata;
1016 const char *k;
1017 Iterator i;
1018 Unit *u;
1019 int r;
1020
1021 assert(message);
1022 assert(m);
1023
1024 /* Anyone can call this method */
1025
1026 r = mac_selinux_access_check(message, "status", error);
1027 if (r < 0)
1028 return r;
1029
1030 r = sd_bus_message_new_method_return(message, &reply);
1031 if (r < 0)
1032 return r;
1033
1034 r = sd_bus_message_open_container(reply, 'a', "(ssssssouso)");
1035 if (r < 0)
1036 return r;
1037
1038 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
1039 if (k != u->id)
1040 continue;
1041
1042 if (!strv_isempty(states) &&
1043 !strv_contains(states, unit_load_state_to_string(u->load_state)) &&
1044 !strv_contains(states, unit_active_state_to_string(unit_active_state(u))) &&
1045 !strv_contains(states, unit_sub_state_to_string(u)))
1046 continue;
1047
1048 if (!strv_isempty(patterns) &&
1049 !strv_fnmatch_or_empty(patterns, u->id, FNM_NOESCAPE))
1050 continue;
1051
1052 r = reply_unit_info(reply, u);
1053 if (r < 0)
1054 return r;
1055 }
1056
1057 r = sd_bus_message_close_container(reply);
1058 if (r < 0)
1059 return r;
1060
1061 return sd_bus_send(NULL, reply, NULL);
1062 }
1063
1064 static int method_list_units(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1065 return list_units_filtered(message, userdata, error, NULL, NULL);
1066 }
1067
1068 static int method_list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1069 _cleanup_strv_free_ char **states = NULL;
1070 int r;
1071
1072 r = sd_bus_message_read_strv(message, &states);
1073 if (r < 0)
1074 return r;
1075
1076 return list_units_filtered(message, userdata, error, states, NULL);
1077 }
1078
1079 static int method_list_units_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1080 _cleanup_strv_free_ char **states = NULL;
1081 _cleanup_strv_free_ char **patterns = NULL;
1082 int r;
1083
1084 r = sd_bus_message_read_strv(message, &states);
1085 if (r < 0)
1086 return r;
1087
1088 r = sd_bus_message_read_strv(message, &patterns);
1089 if (r < 0)
1090 return r;
1091
1092 return list_units_filtered(message, userdata, error, states, patterns);
1093 }
1094
1095 static int method_list_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1096 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1097 Manager *m = userdata;
1098 Iterator i;
1099 Job *j;
1100 int r;
1101
1102 assert(message);
1103 assert(m);
1104
1105 /* Anyone can call this method */
1106
1107 r = mac_selinux_access_check(message, "status", error);
1108 if (r < 0)
1109 return r;
1110
1111 r = sd_bus_message_new_method_return(message, &reply);
1112 if (r < 0)
1113 return r;
1114
1115 r = sd_bus_message_open_container(reply, 'a', "(usssoo)");
1116 if (r < 0)
1117 return r;
1118
1119 HASHMAP_FOREACH(j, m->jobs, i) {
1120 _cleanup_free_ char *unit_path = NULL, *job_path = NULL;
1121
1122 job_path = job_dbus_path(j);
1123 if (!job_path)
1124 return -ENOMEM;
1125
1126 unit_path = unit_dbus_path(j->unit);
1127 if (!unit_path)
1128 return -ENOMEM;
1129
1130 r = sd_bus_message_append(
1131 reply, "(usssoo)",
1132 j->id,
1133 j->unit->id,
1134 job_type_to_string(j->type),
1135 job_state_to_string(j->state),
1136 job_path,
1137 unit_path);
1138 if (r < 0)
1139 return r;
1140 }
1141
1142 r = sd_bus_message_close_container(reply);
1143 if (r < 0)
1144 return r;
1145
1146 return sd_bus_send(NULL, reply, NULL);
1147 }
1148
1149 static int method_subscribe(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1150 Manager *m = userdata;
1151 int r;
1152
1153 assert(message);
1154 assert(m);
1155
1156 /* Anyone can call this method */
1157
1158 r = mac_selinux_access_check(message, "status", error);
1159 if (r < 0)
1160 return r;
1161
1162 if (sd_bus_message_get_bus(message) == m->api_bus) {
1163
1164 /* Note that direct bus connection subscribe by
1165 * default, we only track peers on the API bus here */
1166
1167 if (!m->subscribed) {
1168 r = sd_bus_track_new(sd_bus_message_get_bus(message), &m->subscribed, NULL, NULL);
1169 if (r < 0)
1170 return r;
1171 }
1172
1173 r = sd_bus_track_add_sender(m->subscribed, message);
1174 if (r < 0)
1175 return r;
1176 if (r == 0)
1177 return sd_bus_error_setf(error, BUS_ERROR_ALREADY_SUBSCRIBED, "Client is already subscribed.");
1178 }
1179
1180 return sd_bus_reply_method_return(message, NULL);
1181 }
1182
1183 static int method_unsubscribe(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1184 Manager *m = userdata;
1185 int r;
1186
1187 assert(message);
1188 assert(m);
1189
1190 /* Anyone can call this method */
1191
1192 r = mac_selinux_access_check(message, "status", error);
1193 if (r < 0)
1194 return r;
1195
1196 if (sd_bus_message_get_bus(message) == m->api_bus) {
1197 r = sd_bus_track_remove_sender(m->subscribed, message);
1198 if (r < 0)
1199 return r;
1200 if (r == 0)
1201 return sd_bus_error_setf(error, BUS_ERROR_NOT_SUBSCRIBED, "Client is not subscribed.");
1202 }
1203
1204 return sd_bus_reply_method_return(message, NULL);
1205 }
1206
1207 static int dump_impl(sd_bus_message *message, void *userdata, sd_bus_error *error, int (*reply)(sd_bus_message *, char *)) {
1208 _cleanup_free_ char *dump = NULL;
1209 Manager *m = userdata;
1210 int r;
1211
1212 assert(message);
1213 assert(m);
1214
1215 /* Anyone can call this method */
1216
1217 r = mac_selinux_access_check(message, "status", error);
1218 if (r < 0)
1219 return r;
1220
1221 r = manager_get_dump_string(m, &dump);
1222 if (r < 0)
1223 return r;
1224
1225 return reply(message, dump);
1226 }
1227
1228 static int reply_dump(sd_bus_message *message, char *dump) {
1229 return sd_bus_reply_method_return(message, "s", dump);
1230 }
1231
1232 static int method_dump(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1233 return dump_impl(message, userdata, error, reply_dump);
1234 }
1235
1236 static int reply_dump_by_fd(sd_bus_message *message, char *dump) {
1237 _cleanup_close_ int fd = -1;
1238
1239 fd = acquire_data_fd(dump, strlen(dump), 0);
1240 if (fd < 0)
1241 return fd;
1242
1243 return sd_bus_reply_method_return(message, "h", fd);
1244 }
1245
1246 static int method_dump_by_fd(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1247 return dump_impl(message, userdata, error, reply_dump_by_fd);
1248 }
1249
1250 static int method_refuse_snapshot(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1251 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Support for snapshots has been removed.");
1252 }
1253
1254 static int verify_run_space(const char *message, sd_bus_error *error) {
1255 struct statvfs svfs;
1256 uint64_t available;
1257
1258 if (statvfs("/run/systemd", &svfs) < 0)
1259 return sd_bus_error_set_errnof(error, errno, "Failed to statvfs(/run/systemd): %m");
1260
1261 available = (uint64_t) svfs.f_bfree * (uint64_t) svfs.f_bsize;
1262
1263 if (available < RELOAD_DISK_SPACE_MIN) {
1264 char fb_available[FORMAT_BYTES_MAX], fb_need[FORMAT_BYTES_MAX];
1265 return sd_bus_error_setf(error,
1266 BUS_ERROR_DISK_FULL,
1267 "%s, not enough space available on /run/systemd. "
1268 "Currently, %s are free, but a safety buffer of %s is enforced.",
1269 message,
1270 format_bytes(fb_available, sizeof(fb_available), available),
1271 format_bytes(fb_need, sizeof(fb_need), RELOAD_DISK_SPACE_MIN));
1272 }
1273
1274 return 0;
1275 }
1276
1277 int verify_run_space_and_log(const char *message) {
1278 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
1279 int r;
1280
1281 r = verify_run_space(message, &error);
1282 if (r < 0)
1283 log_error_errno(r, "%s", bus_error_message(&error, r));
1284
1285 return r;
1286 }
1287
1288 static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1289 Manager *m = userdata;
1290 int r;
1291
1292 assert(message);
1293 assert(m);
1294
1295 r = verify_run_space("Refusing to reload", error);
1296 if (r < 0)
1297 return r;
1298
1299 r = mac_selinux_access_check(message, "reload", error);
1300 if (r < 0)
1301 return r;
1302
1303 r = bus_verify_reload_daemon_async(m, message, error);
1304 if (r < 0)
1305 return r;
1306 if (r == 0)
1307 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
1308
1309 /* Instead of sending the reply back right away, we just
1310 * remember that we need to and then send it after the reload
1311 * is finished. That way the caller knows when the reload
1312 * finished. */
1313
1314 assert(!m->queued_message);
1315 r = sd_bus_message_new_method_return(message, &m->queued_message);
1316 if (r < 0)
1317 return r;
1318
1319 m->exit_code = MANAGER_RELOAD;
1320
1321 return 1;
1322 }
1323
1324 static int method_reexecute(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1325 Manager *m = userdata;
1326 int r;
1327
1328 assert(message);
1329 assert(m);
1330
1331 r = verify_run_space("Refusing to reexecute", error);
1332 if (r < 0)
1333 return r;
1334
1335 r = mac_selinux_access_check(message, "reload", error);
1336 if (r < 0)
1337 return r;
1338
1339 r = bus_verify_reload_daemon_async(m, message, error);
1340 if (r < 0)
1341 return r;
1342 if (r == 0)
1343 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
1344
1345 /* We don't send a reply back here, the client should
1346 * just wait for us disconnecting. */
1347
1348 m->exit_code = MANAGER_REEXECUTE;
1349 return 1;
1350 }
1351
1352 static int method_exit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1353 Manager *m = userdata;
1354 int r;
1355
1356 assert(message);
1357 assert(m);
1358
1359 r = mac_selinux_access_check(message, "halt", error);
1360 if (r < 0)
1361 return r;
1362
1363 /* Exit() (in contrast to SetExitCode()) is actually allowed even if
1364 * we are running on the host. It will fall back on reboot() in
1365 * systemd-shutdown if it cannot do the exit() because it isn't a
1366 * container. */
1367
1368 m->exit_code = MANAGER_EXIT;
1369
1370 return sd_bus_reply_method_return(message, NULL);
1371 }
1372
1373 static int method_reboot(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1374 Manager *m = userdata;
1375 int r;
1376
1377 assert(message);
1378 assert(m);
1379
1380 r = mac_selinux_access_check(message, "reboot", error);
1381 if (r < 0)
1382 return r;
1383
1384 if (!MANAGER_IS_SYSTEM(m))
1385 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Reboot is only supported for system managers.");
1386
1387 m->exit_code = MANAGER_REBOOT;
1388
1389 return sd_bus_reply_method_return(message, NULL);
1390 }
1391
1392 static int method_poweroff(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1393 Manager *m = userdata;
1394 int r;
1395
1396 assert(message);
1397 assert(m);
1398
1399 r = mac_selinux_access_check(message, "halt", error);
1400 if (r < 0)
1401 return r;
1402
1403 if (!MANAGER_IS_SYSTEM(m))
1404 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Powering off is only supported for system managers.");
1405
1406 m->exit_code = MANAGER_POWEROFF;
1407
1408 return sd_bus_reply_method_return(message, NULL);
1409 }
1410
1411 static int method_halt(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1412 Manager *m = userdata;
1413 int r;
1414
1415 assert(message);
1416 assert(m);
1417
1418 r = mac_selinux_access_check(message, "halt", error);
1419 if (r < 0)
1420 return r;
1421
1422 if (!MANAGER_IS_SYSTEM(m))
1423 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Halt is only supported for system managers.");
1424
1425 m->exit_code = MANAGER_HALT;
1426
1427 return sd_bus_reply_method_return(message, NULL);
1428 }
1429
1430 static int method_kexec(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1431 Manager *m = userdata;
1432 int r;
1433
1434 assert(message);
1435 assert(m);
1436
1437 r = mac_selinux_access_check(message, "reboot", error);
1438 if (r < 0)
1439 return r;
1440
1441 if (!MANAGER_IS_SYSTEM(m))
1442 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "KExec is only supported for system managers.");
1443
1444 m->exit_code = MANAGER_KEXEC;
1445
1446 return sd_bus_reply_method_return(message, NULL);
1447 }
1448
1449 static int method_switch_root(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1450 char *ri = NULL, *rt = NULL;
1451 const char *root, *init;
1452 Manager *m = userdata;
1453 struct statvfs svfs;
1454 uint64_t available;
1455 int r;
1456
1457 assert(message);
1458 assert(m);
1459
1460 if (statvfs("/run/systemd", &svfs) < 0)
1461 return sd_bus_error_set_errnof(error, errno, "Failed to statvfs(/run/systemd): %m");
1462
1463 available = (uint64_t) svfs.f_bfree * (uint64_t) svfs.f_bsize;
1464
1465 if (available < RELOAD_DISK_SPACE_MIN) {
1466 char fb_available[FORMAT_BYTES_MAX], fb_need[FORMAT_BYTES_MAX];
1467 log_warning("Dangerously low amount of free space on /run/systemd, root switching operation might not complete successfuly. "
1468 "Currently, %s are free, but %s are suggested. Proceeding anyway.",
1469 format_bytes(fb_available, sizeof(fb_available), available),
1470 format_bytes(fb_need, sizeof(fb_need), RELOAD_DISK_SPACE_MIN));
1471 }
1472
1473 r = mac_selinux_access_check(message, "reboot", error);
1474 if (r < 0)
1475 return r;
1476
1477 if (!MANAGER_IS_SYSTEM(m))
1478 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Root switching is only supported by system manager.");
1479
1480 r = sd_bus_message_read(message, "ss", &root, &init);
1481 if (r < 0)
1482 return r;
1483
1484 if (isempty(root))
1485 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "New root directory may not be the empty string.");
1486 if (!path_is_absolute(root))
1487 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "New root path '%s' is not absolute.", root);
1488 if (path_equal(root, "/"))
1489 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "New root directory cannot be the old root directory.");
1490
1491 /* Safety check */
1492 if (isempty(init)) {
1493 r = path_is_os_tree(root);
1494 if (r < 0)
1495 return sd_bus_error_set_errnof(error, r, "Failed to determine whether root path '%s' contains an OS tree: %m", root);
1496 if (r == 0)
1497 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path '%s' does not seem to be an OS tree. os-release file is missing.", root);
1498 } else {
1499 _cleanup_free_ char *chased = NULL;
1500
1501 if (!path_is_absolute(init))
1502 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path to init binary '%s' not absolute.", init);
1503
1504 r = chase_symlinks(init, root, CHASE_PREFIX_ROOT|CHASE_TRAIL_SLASH, &chased);
1505 if (r < 0)
1506 return sd_bus_error_set_errnof(error, r, "Could not resolve init executable %s: %m", init);
1507
1508 if (laccess(chased, X_OK) < 0) {
1509 if (errno == EACCES)
1510 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Init binary %s is not executable.", init);
1511
1512 return sd_bus_error_set_errnof(error, r, "Could not check whether init binary %s is executable: %m", init);
1513 }
1514 }
1515
1516 rt = strdup(root);
1517 if (!rt)
1518 return -ENOMEM;
1519
1520 if (!isempty(init)) {
1521 ri = strdup(init);
1522 if (!ri) {
1523 free(rt);
1524 return -ENOMEM;
1525 }
1526 }
1527
1528 free(m->switch_root);
1529 m->switch_root = rt;
1530
1531 free(m->switch_root_init);
1532 m->switch_root_init = ri;
1533
1534 m->exit_code = MANAGER_SWITCH_ROOT;
1535
1536 return sd_bus_reply_method_return(message, NULL);
1537 }
1538
1539 static int method_set_environment(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1540 _cleanup_strv_free_ char **plus = NULL;
1541 Manager *m = userdata;
1542 int r;
1543
1544 assert(message);
1545 assert(m);
1546
1547 r = mac_selinux_access_check(message, "reload", error);
1548 if (r < 0)
1549 return r;
1550
1551 r = sd_bus_message_read_strv(message, &plus);
1552 if (r < 0)
1553 return r;
1554 if (!strv_env_is_valid(plus))
1555 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment assignments");
1556
1557 r = bus_verify_set_environment_async(m, message, error);
1558 if (r < 0)
1559 return r;
1560 if (r == 0)
1561 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
1562
1563 r = manager_environment_add(m, NULL, plus);
1564 if (r < 0)
1565 return r;
1566
1567 return sd_bus_reply_method_return(message, NULL);
1568 }
1569
1570 static int method_unset_environment(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1571 _cleanup_strv_free_ char **minus = NULL;
1572 Manager *m = userdata;
1573 int r;
1574
1575 assert(message);
1576 assert(m);
1577
1578 r = mac_selinux_access_check(message, "reload", error);
1579 if (r < 0)
1580 return r;
1581
1582 r = sd_bus_message_read_strv(message, &minus);
1583 if (r < 0)
1584 return r;
1585
1586 if (!strv_env_name_or_assignment_is_valid(minus))
1587 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment variable names or assignments");
1588
1589 r = bus_verify_set_environment_async(m, message, error);
1590 if (r < 0)
1591 return r;
1592 if (r == 0)
1593 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
1594
1595 r = manager_environment_add(m, minus, NULL);
1596 if (r < 0)
1597 return r;
1598
1599 return sd_bus_reply_method_return(message, NULL);
1600 }
1601
1602 static int method_unset_and_set_environment(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1603 _cleanup_strv_free_ char **minus = NULL, **plus = NULL;
1604 Manager *m = userdata;
1605 int r;
1606
1607 assert(message);
1608 assert(m);
1609
1610 r = mac_selinux_access_check(message, "reload", error);
1611 if (r < 0)
1612 return r;
1613
1614 r = sd_bus_message_read_strv(message, &minus);
1615 if (r < 0)
1616 return r;
1617
1618 r = sd_bus_message_read_strv(message, &plus);
1619 if (r < 0)
1620 return r;
1621
1622 if (!strv_env_name_or_assignment_is_valid(minus))
1623 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment variable names or assignments");
1624 if (!strv_env_is_valid(plus))
1625 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment assignments");
1626
1627 r = bus_verify_set_environment_async(m, message, error);
1628 if (r < 0)
1629 return r;
1630 if (r == 0)
1631 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
1632
1633 r = manager_environment_add(m, minus, plus);
1634 if (r < 0)
1635 return r;
1636
1637 return sd_bus_reply_method_return(message, NULL);
1638 }
1639
1640 static int method_set_exit_code(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1641 Manager *m = userdata;
1642 uint8_t code;
1643 int r;
1644
1645 assert(message);
1646 assert(m);
1647
1648 r = mac_selinux_access_check(message, "exit", error);
1649 if (r < 0)
1650 return r;
1651
1652 r = sd_bus_message_read_basic(message, 'y', &code);
1653 if (r < 0)
1654 return r;
1655
1656 if (MANAGER_IS_SYSTEM(m) && detect_container() <= 0)
1657 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "ExitCode can only be set for user service managers or in containers.");
1658
1659 m->return_value = code;
1660
1661 return sd_bus_reply_method_return(message, NULL);
1662 }
1663
1664 static int method_lookup_dynamic_user_by_name(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1665 Manager *m = userdata;
1666 const char *name;
1667 uid_t uid;
1668 int r;
1669
1670 assert(message);
1671 assert(m);
1672
1673 r = sd_bus_message_read_basic(message, 's', &name);
1674 if (r < 0)
1675 return r;
1676
1677 if (!MANAGER_IS_SYSTEM(m))
1678 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance.");
1679 if (!valid_user_group_name(name))
1680 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name invalid: %s", name);
1681
1682 r = dynamic_user_lookup_name(m, name, &uid);
1683 if (r == -ESRCH)
1684 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_DYNAMIC_USER, "Dynamic user %s does not exist.", name);
1685 if (r < 0)
1686 return r;
1687
1688 return sd_bus_reply_method_return(message, "u", (uint32_t) uid);
1689 }
1690
1691 static int method_lookup_dynamic_user_by_uid(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1692 _cleanup_free_ char *name = NULL;
1693 Manager *m = userdata;
1694 uid_t uid;
1695 int r;
1696
1697 assert(message);
1698 assert(m);
1699
1700 assert_cc(sizeof(uid) == sizeof(uint32_t));
1701 r = sd_bus_message_read_basic(message, 'u', &uid);
1702 if (r < 0)
1703 return r;
1704
1705 if (!MANAGER_IS_SYSTEM(m))
1706 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance.");
1707 if (!uid_is_valid(uid))
1708 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User ID invalid: " UID_FMT, uid);
1709
1710 r = dynamic_user_lookup_uid(m, uid, &name);
1711 if (r == -ESRCH)
1712 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_DYNAMIC_USER, "Dynamic user ID " UID_FMT " does not exist.", uid);
1713 if (r < 0)
1714 return r;
1715
1716 return sd_bus_reply_method_return(message, "s", name);
1717 }
1718
1719 static int method_get_dynamic_users(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1720 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1721 Manager *m = userdata;
1722 DynamicUser *d;
1723 Iterator i;
1724 int r;
1725
1726 assert(message);
1727 assert(m);
1728
1729 assert_cc(sizeof(uid_t) == sizeof(uint32_t));
1730
1731 if (!MANAGER_IS_SYSTEM(m))
1732 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance.");
1733
1734 r = sd_bus_message_new_method_return(message, &reply);
1735 if (r < 0)
1736 return r;
1737
1738 r = sd_bus_message_open_container(reply, 'a', "(us)");
1739 if (r < 0)
1740 return r;
1741
1742 HASHMAP_FOREACH(d, m->dynamic_users, i) {
1743 uid_t uid;
1744
1745 r = dynamic_user_current(d, &uid);
1746 if (r == -EAGAIN) /* not realized yet? */
1747 continue;
1748 if (r < 0)
1749 return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Failed to lookup a dynamic user.");
1750
1751 r = sd_bus_message_append(reply, "(us)", uid, d->name);
1752 if (r < 0)
1753 return r;
1754 }
1755
1756 r = sd_bus_message_close_container(reply);
1757 if (r < 0)
1758 return r;
1759
1760 return sd_bus_send(NULL, reply, NULL);
1761 }
1762
1763 static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states, char **patterns) {
1764 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1765 Manager *m = userdata;
1766 UnitFileList *item;
1767 Hashmap *h;
1768 Iterator i;
1769 int r;
1770
1771 assert(message);
1772 assert(m);
1773
1774 /* Anyone can call this method */
1775
1776 r = mac_selinux_access_check(message, "status", error);
1777 if (r < 0)
1778 return r;
1779
1780 r = sd_bus_message_new_method_return(message, &reply);
1781 if (r < 0)
1782 return r;
1783
1784 h = hashmap_new(&string_hash_ops);
1785 if (!h)
1786 return -ENOMEM;
1787
1788 r = unit_file_get_list(m->unit_file_scope, NULL, h, states, patterns);
1789 if (r < 0)
1790 goto fail;
1791
1792 r = sd_bus_message_open_container(reply, 'a', "(ss)");
1793 if (r < 0)
1794 goto fail;
1795
1796 HASHMAP_FOREACH(item, h, i) {
1797
1798 r = sd_bus_message_append(reply, "(ss)", item->path, unit_file_state_to_string(item->state));
1799 if (r < 0)
1800 goto fail;
1801 }
1802
1803 unit_file_list_free(h);
1804
1805 r = sd_bus_message_close_container(reply);
1806 if (r < 0)
1807 return r;
1808
1809 return sd_bus_send(NULL, reply, NULL);
1810
1811 fail:
1812 unit_file_list_free(h);
1813 return r;
1814 }
1815
1816 static int method_list_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1817 return list_unit_files_by_patterns(message, userdata, error, NULL, NULL);
1818 }
1819
1820 static int method_list_unit_files_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1821 _cleanup_strv_free_ char **states = NULL;
1822 _cleanup_strv_free_ char **patterns = NULL;
1823 int r;
1824
1825 r = sd_bus_message_read_strv(message, &states);
1826 if (r < 0)
1827 return r;
1828
1829 r = sd_bus_message_read_strv(message, &patterns);
1830 if (r < 0)
1831 return r;
1832
1833 return list_unit_files_by_patterns(message, userdata, error, states, patterns);
1834 }
1835
1836 static int method_get_unit_file_state(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1837 Manager *m = userdata;
1838 const char *name;
1839 UnitFileState state;
1840 int r;
1841
1842 assert(message);
1843 assert(m);
1844
1845 /* Anyone can call this method */
1846
1847 r = mac_selinux_access_check(message, "status", error);
1848 if (r < 0)
1849 return r;
1850
1851 r = sd_bus_message_read(message, "s", &name);
1852 if (r < 0)
1853 return r;
1854
1855 r = unit_file_get_state(m->unit_file_scope, NULL, name, &state);
1856 if (r < 0)
1857 return r;
1858
1859 return sd_bus_reply_method_return(message, "s", unit_file_state_to_string(state));
1860 }
1861
1862 static int method_get_default_target(sd_bus_message *message, void *userdata, sd_bus_error *error) {
1863 _cleanup_free_ char *default_target = NULL;
1864 Manager *m = userdata;
1865 int r;
1866
1867 assert(message);
1868 assert(m);
1869
1870 /* Anyone can call this method */
1871
1872 r = mac_selinux_access_check(message, "status", error);
1873 if (r < 0)
1874 return r;
1875
1876 r = unit_file_get_default(m->unit_file_scope, NULL, &default_target);
1877 if (r < 0)
1878 return r;
1879
1880 return sd_bus_reply_method_return(message, "s", default_target);
1881 }
1882
1883 static int send_unit_files_changed(sd_bus *bus, void *userdata) {
1884 _cleanup_(sd_bus_message_unrefp) sd_bus_message *message = NULL;
1885 int r;
1886
1887 assert(bus);
1888
1889 r = sd_bus_message_new_signal(bus, &message, "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "UnitFilesChanged");
1890 if (r < 0)
1891 return r;
1892
1893 return sd_bus_send(bus, message, NULL);
1894 }
1895
1896 /* Create an error reply, using the error information from changes[]
1897 * if possible, and fall back to generating an error from error code c.
1898 * The error message only describes the first error.
1899 *
1900 * Coordinate with unit_file_dump_changes() in install.c.
1901 */
1902 static int install_error(
1903 sd_bus_error *error,
1904 int c,
1905 UnitFileChange *changes,
1906 size_t n_changes) {
1907
1908 size_t i;
1909 int r;
1910
1911 for (i = 0; i < n_changes; i++)
1912
1913 switch(changes[i].type) {
1914
1915 case 0 ... INT_MAX:
1916 continue;
1917
1918 case -EEXIST:
1919 if (changes[i].source)
1920 r = sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS,
1921 "File %s already exists and is a symlink to %s.",
1922 changes[i].path, changes[i].source);
1923 else
1924 r = sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS,
1925 "File %s already exists.",
1926 changes[i].path);
1927 goto found;
1928
1929 case -ERFKILL:
1930 r = sd_bus_error_setf(error, BUS_ERROR_UNIT_MASKED,
1931 "Unit file %s is masked.", changes[i].path);
1932 goto found;
1933
1934 case -EADDRNOTAVAIL:
1935 r = sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED,
1936 "Unit %s is transient or generated.", changes[i].path);
1937 goto found;
1938
1939 case -ELOOP:
1940 r = sd_bus_error_setf(error, BUS_ERROR_UNIT_LINKED,
1941 "Refusing to operate on linked unit file %s", changes[i].path);
1942 goto found;
1943
1944 case -ENOENT:
1945 r = sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Unit file %s does not exist.", changes[i].path);
1946 goto found;
1947
1948 default:
1949 r = sd_bus_error_set_errnof(error, changes[i].type, "File %s: %m", changes[i].path);
1950 goto found;
1951 }
1952
1953 r = c < 0 ? c : -EINVAL;
1954
1955 found:
1956 unit_file_changes_free(changes, n_changes);
1957 return r;
1958 }
1959
1960 static int reply_unit_file_changes_and_free(
1961 Manager *m,
1962 sd_bus_message *message,
1963 int carries_install_info,
1964 UnitFileChange *changes,
1965 size_t n_changes,
1966 sd_bus_error *error) {
1967
1968 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1969 bool bad = false, good = false;
1970 size_t i;
1971 int r;
1972
1973 if (unit_file_changes_have_modification(changes, n_changes)) {
1974 r = bus_foreach_bus(m, NULL, send_unit_files_changed, NULL);
1975 if (r < 0)
1976 log_debug_errno(r, "Failed to send UnitFilesChanged signal: %m");
1977 }
1978
1979 r = sd_bus_message_new_method_return(message, &reply);
1980 if (r < 0)
1981 goto fail;
1982
1983 if (carries_install_info >= 0) {
1984 r = sd_bus_message_append(reply, "b", carries_install_info);
1985 if (r < 0)
1986 goto fail;
1987 }
1988
1989 r = sd_bus_message_open_container(reply, 'a', "(sss)");
1990 if (r < 0)
1991 goto fail;
1992
1993 for (i = 0; i < n_changes; i++) {
1994
1995 if (changes[i].type < 0) {
1996 bad = true;
1997 continue;
1998 }
1999
2000 r = sd_bus_message_append(
2001 reply, "(sss)",
2002 unit_file_change_type_to_string(changes[i].type),
2003 changes[i].path,
2004 changes[i].source);
2005 if (r < 0)
2006 goto fail;
2007
2008 good = true;
2009 }
2010
2011 /* If there was a failed change, and no successful change, then return the first failure as proper method call
2012 * error. */
2013 if (bad && !good)
2014 return install_error(error, 0, changes, n_changes);
2015
2016 r = sd_bus_message_close_container(reply);
2017 if (r < 0)
2018 goto fail;
2019
2020 unit_file_changes_free(changes, n_changes);
2021 return sd_bus_send(NULL, reply, NULL);
2022
2023 fail:
2024 unit_file_changes_free(changes, n_changes);
2025 return r;
2026 }
2027
2028 static int method_enable_unit_files_generic(
2029 sd_bus_message *message,
2030 Manager *m,
2031 int (*call)(UnitFileScope scope, UnitFileFlags flags, const char *root_dir, char *files[], UnitFileChange **changes, size_t *n_changes),
2032 bool carries_install_info,
2033 sd_bus_error *error) {
2034
2035 _cleanup_strv_free_ char **l = NULL;
2036 UnitFileChange *changes = NULL;
2037 size_t n_changes = 0;
2038 UnitFileFlags flags;
2039 int runtime, force, r;
2040
2041 assert(message);
2042 assert(m);
2043
2044 r = sd_bus_message_read_strv(message, &l);
2045 if (r < 0)
2046 return r;
2047
2048 r = sd_bus_message_read(message, "bb", &runtime, &force);
2049 if (r < 0)
2050 return r;
2051
2052 flags = unit_file_bools_to_flags(runtime, force);
2053
2054 r = bus_verify_manage_unit_files_async(m, message, error);
2055 if (r < 0)
2056 return r;
2057 if (r == 0)
2058 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2059
2060 r = call(m->unit_file_scope, flags, NULL, l, &changes, &n_changes);
2061 if (r < 0)
2062 return install_error(error, r, changes, n_changes);
2063
2064 return reply_unit_file_changes_and_free(m, message, carries_install_info ? r : -1, changes, n_changes, error);
2065 }
2066
2067 static int method_enable_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2068 return method_enable_unit_files_generic(message, userdata, unit_file_enable, true, error);
2069 }
2070
2071 static int method_reenable_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2072 return method_enable_unit_files_generic(message, userdata, unit_file_reenable, true, error);
2073 }
2074
2075 static int method_link_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2076 return method_enable_unit_files_generic(message, userdata, unit_file_link, false, error);
2077 }
2078
2079 static int unit_file_preset_without_mode(UnitFileScope scope, UnitFileFlags flags, const char *root_dir, char **files, UnitFileChange **changes, size_t *n_changes) {
2080 return unit_file_preset(scope, flags, root_dir, files, UNIT_FILE_PRESET_FULL, changes, n_changes);
2081 }
2082
2083 static int method_preset_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2084 return method_enable_unit_files_generic(message, userdata, unit_file_preset_without_mode, true, error);
2085 }
2086
2087 static int method_mask_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2088 return method_enable_unit_files_generic(message, userdata, unit_file_mask, false, error);
2089 }
2090
2091 static int method_preset_unit_files_with_mode(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2092
2093 _cleanup_strv_free_ char **l = NULL;
2094 UnitFileChange *changes = NULL;
2095 size_t n_changes = 0;
2096 Manager *m = userdata;
2097 UnitFilePresetMode mm;
2098 int runtime, force, r;
2099 UnitFileFlags flags;
2100 const char *mode;
2101
2102 assert(message);
2103 assert(m);
2104
2105 r = sd_bus_message_read_strv(message, &l);
2106 if (r < 0)
2107 return r;
2108
2109 r = sd_bus_message_read(message, "sbb", &mode, &runtime, &force);
2110 if (r < 0)
2111 return r;
2112
2113 flags = unit_file_bools_to_flags(runtime, force);
2114
2115 if (isempty(mode))
2116 mm = UNIT_FILE_PRESET_FULL;
2117 else {
2118 mm = unit_file_preset_mode_from_string(mode);
2119 if (mm < 0)
2120 return -EINVAL;
2121 }
2122
2123 r = bus_verify_manage_unit_files_async(m, message, error);
2124 if (r < 0)
2125 return r;
2126 if (r == 0)
2127 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2128
2129 r = unit_file_preset(m->unit_file_scope, flags, NULL, l, mm, &changes, &n_changes);
2130 if (r < 0)
2131 return install_error(error, r, changes, n_changes);
2132
2133 return reply_unit_file_changes_and_free(m, message, r, changes, n_changes, error);
2134 }
2135
2136 static int method_disable_unit_files_generic(
2137 sd_bus_message *message,
2138 Manager *m,
2139 int (*call)(UnitFileScope scope, UnitFileFlags flags, const char *root_dir, char *files[], UnitFileChange **changes, size_t *n_changes),
2140 sd_bus_error *error) {
2141
2142 _cleanup_strv_free_ char **l = NULL;
2143 UnitFileChange *changes = NULL;
2144 size_t n_changes = 0;
2145 int r, runtime;
2146
2147 assert(message);
2148 assert(m);
2149
2150 r = sd_bus_message_read_strv(message, &l);
2151 if (r < 0)
2152 return r;
2153
2154 r = sd_bus_message_read(message, "b", &runtime);
2155 if (r < 0)
2156 return r;
2157
2158 r = bus_verify_manage_unit_files_async(m, message, error);
2159 if (r < 0)
2160 return r;
2161 if (r == 0)
2162 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2163
2164 r = call(m->unit_file_scope, runtime ? UNIT_FILE_RUNTIME : 0, NULL, l, &changes, &n_changes);
2165 if (r < 0)
2166 return install_error(error, r, changes, n_changes);
2167
2168 return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
2169 }
2170
2171 static int method_disable_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2172 return method_disable_unit_files_generic(message, userdata, unit_file_disable, error);
2173 }
2174
2175 static int method_unmask_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2176 return method_disable_unit_files_generic(message, userdata, unit_file_unmask, error);
2177 }
2178
2179 static int method_revert_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2180 _cleanup_strv_free_ char **l = NULL;
2181 UnitFileChange *changes = NULL;
2182 size_t n_changes = 0;
2183 Manager *m = userdata;
2184 int r;
2185
2186 assert(message);
2187 assert(m);
2188
2189 r = sd_bus_message_read_strv(message, &l);
2190 if (r < 0)
2191 return r;
2192
2193 r = bus_verify_manage_unit_files_async(m, message, error);
2194 if (r < 0)
2195 return r;
2196 if (r == 0)
2197 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2198
2199 r = unit_file_revert(m->unit_file_scope, NULL, l, &changes, &n_changes);
2200 if (r < 0)
2201 return install_error(error, r, changes, n_changes);
2202
2203 return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
2204 }
2205
2206 static int method_set_default_target(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2207 UnitFileChange *changes = NULL;
2208 size_t n_changes = 0;
2209 Manager *m = userdata;
2210 const char *name;
2211 int force, r;
2212
2213 assert(message);
2214 assert(m);
2215
2216 r = mac_selinux_access_check(message, "enable", error);
2217 if (r < 0)
2218 return r;
2219
2220 r = sd_bus_message_read(message, "sb", &name, &force);
2221 if (r < 0)
2222 return r;
2223
2224 r = bus_verify_manage_unit_files_async(m, message, error);
2225 if (r < 0)
2226 return r;
2227 if (r == 0)
2228 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2229
2230 r = unit_file_set_default(m->unit_file_scope, force ? UNIT_FILE_FORCE : 0, NULL, name, &changes, &n_changes);
2231 if (r < 0)
2232 return install_error(error, r, changes, n_changes);
2233
2234 return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
2235 }
2236
2237 static int method_preset_all_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2238 UnitFileChange *changes = NULL;
2239 size_t n_changes = 0;
2240 Manager *m = userdata;
2241 UnitFilePresetMode mm;
2242 const char *mode;
2243 UnitFileFlags flags;
2244 int force, runtime, r;
2245
2246 assert(message);
2247 assert(m);
2248
2249 r = mac_selinux_access_check(message, "enable", error);
2250 if (r < 0)
2251 return r;
2252
2253 r = sd_bus_message_read(message, "sbb", &mode, &runtime, &force);
2254 if (r < 0)
2255 return r;
2256
2257 flags = unit_file_bools_to_flags(runtime, force);
2258
2259 if (isempty(mode))
2260 mm = UNIT_FILE_PRESET_FULL;
2261 else {
2262 mm = unit_file_preset_mode_from_string(mode);
2263 if (mm < 0)
2264 return -EINVAL;
2265 }
2266
2267 r = bus_verify_manage_unit_files_async(m, message, error);
2268 if (r < 0)
2269 return r;
2270 if (r == 0)
2271 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2272
2273 r = unit_file_preset_all(m->unit_file_scope, flags, NULL, mm, &changes, &n_changes);
2274 if (r < 0)
2275 return install_error(error, r, changes, n_changes);
2276
2277 return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
2278 }
2279
2280 static int method_add_dependency_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2281 _cleanup_strv_free_ char **l = NULL;
2282 Manager *m = userdata;
2283 UnitFileChange *changes = NULL;
2284 size_t n_changes = 0;
2285 int runtime, force, r;
2286 char *target, *type;
2287 UnitDependency dep;
2288 UnitFileFlags flags;
2289
2290 assert(message);
2291 assert(m);
2292
2293 r = bus_verify_manage_unit_files_async(m, message, error);
2294 if (r < 0)
2295 return r;
2296 if (r == 0)
2297 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
2298
2299 r = sd_bus_message_read_strv(message, &l);
2300 if (r < 0)
2301 return r;
2302
2303 r = sd_bus_message_read(message, "ssbb", &target, &type, &runtime, &force);
2304 if (r < 0)
2305 return r;
2306
2307 flags = unit_file_bools_to_flags(runtime, force);
2308
2309 dep = unit_dependency_from_string(type);
2310 if (dep < 0)
2311 return -EINVAL;
2312
2313 r = unit_file_add_dependency(m->unit_file_scope, flags, NULL, l, target, dep, &changes, &n_changes);
2314 if (r < 0)
2315 return install_error(error, r, changes, n_changes);
2316
2317 return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
2318 }
2319
2320 static int method_get_unit_file_links(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2321 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2322 UnitFileChange *changes = NULL;
2323 size_t n_changes = 0, i;
2324 UnitFileFlags flags;
2325 const char *name;
2326 char **p;
2327 int runtime, r;
2328
2329 r = sd_bus_message_read(message, "sb", &name, &runtime);
2330 if (r < 0)
2331 return r;
2332
2333 r = sd_bus_message_new_method_return(message, &reply);
2334 if (r < 0)
2335 return r;
2336
2337 r = sd_bus_message_open_container(reply, SD_BUS_TYPE_ARRAY, "s");
2338 if (r < 0)
2339 return r;
2340
2341 p = STRV_MAKE(name);
2342 flags = UNIT_FILE_DRY_RUN |
2343 (runtime ? UNIT_FILE_RUNTIME : 0);
2344
2345 r = unit_file_disable(UNIT_FILE_SYSTEM, flags, NULL, p, &changes, &n_changes);
2346 if (r < 0)
2347 return log_error_errno(r, "Failed to get file links for %s: %m", name);
2348
2349 for (i = 0; i < n_changes; i++)
2350 if (changes[i].type == UNIT_FILE_UNLINK) {
2351 r = sd_bus_message_append(reply, "s", changes[i].path);
2352 if (r < 0)
2353 return r;
2354 }
2355
2356 r = sd_bus_message_close_container(reply);
2357 if (r < 0)
2358 return r;
2359
2360 return sd_bus_send(NULL, reply, NULL);
2361 }
2362
2363 static int method_get_job_waiting(sd_bus_message *message, void *userdata, sd_bus_error *error) {
2364 Manager *m = userdata;
2365 uint32_t id;
2366 Job *j;
2367 int r;
2368
2369 assert(message);
2370 assert(m);
2371
2372 r = sd_bus_message_read(message, "u", &id);
2373 if (r < 0)
2374 return r;
2375
2376 j = manager_get_job(m, id);
2377 if (!j)
2378 return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_JOB, "Job %u does not exist.", (unsigned) id);
2379
2380 return bus_job_method_get_waiting_jobs(message, j, error);
2381 }
2382
2383 const sd_bus_vtable bus_manager_vtable[] = {
2384 SD_BUS_VTABLE_START(0),
2385
2386 SD_BUS_PROPERTY("Version", "s", property_get_version, 0, SD_BUS_VTABLE_PROPERTY_CONST),
2387 SD_BUS_PROPERTY("Features", "s", property_get_features, 0, SD_BUS_VTABLE_PROPERTY_CONST),
2388 SD_BUS_PROPERTY("Virtualization", "s", property_get_virtualization, 0, SD_BUS_VTABLE_PROPERTY_CONST),
2389 SD_BUS_PROPERTY("Architecture", "s", property_get_architecture, 0, SD_BUS_VTABLE_PROPERTY_CONST),
2390 SD_BUS_PROPERTY("Tainted", "s", property_get_tainted, 0, SD_BUS_VTABLE_PROPERTY_CONST),
2391 BUS_PROPERTY_DUAL_TIMESTAMP("FirmwareTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_FIRMWARE]), SD_BUS_VTABLE_PROPERTY_CONST),
2392 BUS_PROPERTY_DUAL_TIMESTAMP("LoaderTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_LOADER]), SD_BUS_VTABLE_PROPERTY_CONST),
2393 BUS_PROPERTY_DUAL_TIMESTAMP("KernelTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_KERNEL]), SD_BUS_VTABLE_PROPERTY_CONST),
2394 BUS_PROPERTY_DUAL_TIMESTAMP("InitRDTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_INITRD]), SD_BUS_VTABLE_PROPERTY_CONST),
2395 BUS_PROPERTY_DUAL_TIMESTAMP("UserspaceTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_USERSPACE]), SD_BUS_VTABLE_PROPERTY_CONST),
2396 BUS_PROPERTY_DUAL_TIMESTAMP("FinishTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_FINISH]), SD_BUS_VTABLE_PROPERTY_CONST),
2397 BUS_PROPERTY_DUAL_TIMESTAMP("SecurityStartTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_SECURITY_START]), SD_BUS_VTABLE_PROPERTY_CONST),
2398 BUS_PROPERTY_DUAL_TIMESTAMP("SecurityFinishTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_SECURITY_FINISH]), SD_BUS_VTABLE_PROPERTY_CONST),
2399 BUS_PROPERTY_DUAL_TIMESTAMP("GeneratorsStartTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_GENERATORS_START]), SD_BUS_VTABLE_PROPERTY_CONST),
2400 BUS_PROPERTY_DUAL_TIMESTAMP("GeneratorsFinishTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_GENERATORS_FINISH]), SD_BUS_VTABLE_PROPERTY_CONST),
2401 BUS_PROPERTY_DUAL_TIMESTAMP("UnitsLoadStartTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_UNITS_LOAD_START]), SD_BUS_VTABLE_PROPERTY_CONST),
2402 BUS_PROPERTY_DUAL_TIMESTAMP("UnitsLoadFinishTimestamp", offsetof(Manager, timestamps[MANAGER_TIMESTAMP_UNITS_LOAD_FINISH]), SD_BUS_VTABLE_PROPERTY_CONST),
2403 SD_BUS_WRITABLE_PROPERTY("LogLevel", "s", property_get_log_level, property_set_log_level, 0, 0),
2404 SD_BUS_WRITABLE_PROPERTY("LogTarget", "s", property_get_log_target, property_set_log_target, 0, 0),
2405 SD_BUS_PROPERTY("NNames", "u", property_get_hashmap_size, offsetof(Manager, units), 0),
2406 SD_BUS_PROPERTY("NFailedUnits", "u", property_get_set_size, offsetof(Manager, failed_units), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
2407 SD_BUS_PROPERTY("NJobs", "u", property_get_hashmap_size, offsetof(Manager, jobs), 0),
2408 SD_BUS_PROPERTY("NInstalledJobs", "u", bus_property_get_unsigned, offsetof(Manager, n_installed_jobs), 0),
2409 SD_BUS_PROPERTY("NFailedJobs", "u", bus_property_get_unsigned, offsetof(Manager, n_failed_jobs), 0),
2410 SD_BUS_PROPERTY("Progress", "d", property_get_progress, 0, 0),
2411 SD_BUS_PROPERTY("Environment", "as", NULL, offsetof(Manager, environment), 0),
2412 SD_BUS_PROPERTY("ConfirmSpawn", "b", bus_property_get_bool, offsetof(Manager, confirm_spawn), SD_BUS_VTABLE_PROPERTY_CONST),
2413 SD_BUS_PROPERTY("ShowStatus", "b", property_get_show_status, 0, 0),
2414 SD_BUS_PROPERTY("UnitPath", "as", NULL, offsetof(Manager, lookup_paths.search_path), SD_BUS_VTABLE_PROPERTY_CONST),
2415 SD_BUS_PROPERTY("DefaultStandardOutput", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
2416 SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
2417 SD_BUS_WRITABLE_PROPERTY("RuntimeWatchdogUSec", "t", bus_property_get_usec, property_set_runtime_watchdog, offsetof(Manager, runtime_watchdog), 0),
2418 SD_BUS_WRITABLE_PROPERTY("ShutdownWatchdogUSec", "t", bus_property_get_usec, bus_property_set_usec, offsetof(Manager, shutdown_watchdog), 0),
2419 SD_BUS_WRITABLE_PROPERTY("ServiceWatchdogs", "b", bus_property_get_bool, bus_property_set_bool, offsetof(Manager, service_watchdogs), 0),
2420 SD_BUS_PROPERTY("ControlGroup", "s", NULL, offsetof(Manager, cgroup_root), 0),
2421 SD_BUS_PROPERTY("SystemState", "s", property_get_system_state, 0, 0),
2422 SD_BUS_PROPERTY("ExitCode", "y", bus_property_get_unsigned, offsetof(Manager, return_value), 0),
2423 SD_BUS_PROPERTY("DefaultTimerAccuracyUSec", "t", bus_property_get_usec, offsetof(Manager, default_timer_accuracy_usec), SD_BUS_VTABLE_PROPERTY_CONST),
2424 SD_BUS_PROPERTY("DefaultTimeoutStartUSec", "t", bus_property_get_usec, offsetof(Manager, default_timeout_start_usec), SD_BUS_VTABLE_PROPERTY_CONST),
2425 SD_BUS_PROPERTY("DefaultTimeoutStopUSec", "t", bus_property_get_usec, offsetof(Manager, default_timeout_stop_usec), SD_BUS_VTABLE_PROPERTY_CONST),
2426 SD_BUS_PROPERTY("DefaultRestartUSec", "t", bus_property_get_usec, offsetof(Manager, default_restart_usec), SD_BUS_VTABLE_PROPERTY_CONST),
2427 SD_BUS_PROPERTY("DefaultStartLimitIntervalUSec", "t", bus_property_get_usec, offsetof(Manager, default_start_limit_interval), SD_BUS_VTABLE_PROPERTY_CONST),
2428 /* The following two items are obsolete alias */
2429 SD_BUS_PROPERTY("DefaultStartLimitIntervalSec", "t", bus_property_get_usec, offsetof(Manager, default_start_limit_interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
2430 SD_BUS_PROPERTY("DefaultStartLimitInterval", "t", bus_property_get_usec, offsetof(Manager, default_start_limit_interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
2431 SD_BUS_PROPERTY("DefaultStartLimitBurst", "u", bus_property_get_unsigned, offsetof(Manager, default_start_limit_burst), SD_BUS_VTABLE_PROPERTY_CONST),
2432 SD_BUS_PROPERTY("DefaultCPUAccounting", "b", bus_property_get_bool, offsetof(Manager, default_cpu_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
2433 SD_BUS_PROPERTY("DefaultBlockIOAccounting", "b", bus_property_get_bool, offsetof(Manager, default_blockio_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
2434 SD_BUS_PROPERTY("DefaultMemoryAccounting", "b", bus_property_get_bool, offsetof(Manager, default_memory_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
2435 SD_BUS_PROPERTY("DefaultTasksAccounting", "b", bus_property_get_bool, offsetof(Manager, default_tasks_accounting), SD_BUS_VTABLE_PROPERTY_CONST),
2436 SD_BUS_PROPERTY("DefaultLimitCPU", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_CPU]), SD_BUS_VTABLE_PROPERTY_CONST),
2437 SD_BUS_PROPERTY("DefaultLimitCPUSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_CPU]), SD_BUS_VTABLE_PROPERTY_CONST),
2438 SD_BUS_PROPERTY("DefaultLimitFSIZE", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_FSIZE]), SD_BUS_VTABLE_PROPERTY_CONST),
2439 SD_BUS_PROPERTY("DefaultLimitFSIZESoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_FSIZE]), SD_BUS_VTABLE_PROPERTY_CONST),
2440 SD_BUS_PROPERTY("DefaultLimitDATA", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_DATA]), SD_BUS_VTABLE_PROPERTY_CONST),
2441 SD_BUS_PROPERTY("DefaultLimitDATASoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_DATA]), SD_BUS_VTABLE_PROPERTY_CONST),
2442 SD_BUS_PROPERTY("DefaultLimitSTACK", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_STACK]), SD_BUS_VTABLE_PROPERTY_CONST),
2443 SD_BUS_PROPERTY("DefaultLimitSTACKSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_STACK]), SD_BUS_VTABLE_PROPERTY_CONST),
2444 SD_BUS_PROPERTY("DefaultLimitCORE", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_CORE]), SD_BUS_VTABLE_PROPERTY_CONST),
2445 SD_BUS_PROPERTY("DefaultLimitCORESoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_CORE]), SD_BUS_VTABLE_PROPERTY_CONST),
2446 SD_BUS_PROPERTY("DefaultLimitRSS", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_RSS]), SD_BUS_VTABLE_PROPERTY_CONST),
2447 SD_BUS_PROPERTY("DefaultLimitRSSSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_RSS]), SD_BUS_VTABLE_PROPERTY_CONST),
2448 SD_BUS_PROPERTY("DefaultLimitNOFILE", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_NOFILE]), SD_BUS_VTABLE_PROPERTY_CONST),
2449 SD_BUS_PROPERTY("DefaultLimitNOFILESoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_NOFILE]), SD_BUS_VTABLE_PROPERTY_CONST),
2450 SD_BUS_PROPERTY("DefaultLimitAS", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_AS]), SD_BUS_VTABLE_PROPERTY_CONST),
2451 SD_BUS_PROPERTY("DefaultLimitASSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_AS]), SD_BUS_VTABLE_PROPERTY_CONST),
2452 SD_BUS_PROPERTY("DefaultLimitNPROC", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_NPROC]), SD_BUS_VTABLE_PROPERTY_CONST),
2453 SD_BUS_PROPERTY("DefaultLimitNPROCSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_NPROC]), SD_BUS_VTABLE_PROPERTY_CONST),
2454 SD_BUS_PROPERTY("DefaultLimitMEMLOCK", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_MEMLOCK]), SD_BUS_VTABLE_PROPERTY_CONST),
2455 SD_BUS_PROPERTY("DefaultLimitMEMLOCKSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_MEMLOCK]), SD_BUS_VTABLE_PROPERTY_CONST),
2456 SD_BUS_PROPERTY("DefaultLimitLOCKS", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_LOCKS]), SD_BUS_VTABLE_PROPERTY_CONST),
2457 SD_BUS_PROPERTY("DefaultLimitLOCKSSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_LOCKS]), SD_BUS_VTABLE_PROPERTY_CONST),
2458 SD_BUS_PROPERTY("DefaultLimitSIGPENDING", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_SIGPENDING]), SD_BUS_VTABLE_PROPERTY_CONST),
2459 SD_BUS_PROPERTY("DefaultLimitSIGPENDINGSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_SIGPENDING]), SD_BUS_VTABLE_PROPERTY_CONST),
2460 SD_BUS_PROPERTY("DefaultLimitMSGQUEUE", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_MSGQUEUE]), SD_BUS_VTABLE_PROPERTY_CONST),
2461 SD_BUS_PROPERTY("DefaultLimitMSGQUEUESoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_MSGQUEUE]), SD_BUS_VTABLE_PROPERTY_CONST),
2462 SD_BUS_PROPERTY("DefaultLimitNICE", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_NICE]), SD_BUS_VTABLE_PROPERTY_CONST),
2463 SD_BUS_PROPERTY("DefaultLimitNICESoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_NICE]), SD_BUS_VTABLE_PROPERTY_CONST),
2464 SD_BUS_PROPERTY("DefaultLimitRTPRIO", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_RTPRIO]), SD_BUS_VTABLE_PROPERTY_CONST),
2465 SD_BUS_PROPERTY("DefaultLimitRTPRIOSoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_RTPRIO]), SD_BUS_VTABLE_PROPERTY_CONST),
2466 SD_BUS_PROPERTY("DefaultLimitRTTIME", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_RTTIME]), SD_BUS_VTABLE_PROPERTY_CONST),
2467 SD_BUS_PROPERTY("DefaultLimitRTTIMESoft", "t", bus_property_get_rlimit, offsetof(Manager, rlimit[RLIMIT_RTTIME]), SD_BUS_VTABLE_PROPERTY_CONST),
2468 SD_BUS_PROPERTY("DefaultTasksMax", "t", NULL, offsetof(Manager, default_tasks_max), SD_BUS_VTABLE_PROPERTY_CONST),
2469 SD_BUS_PROPERTY("TimerSlackNSec", "t", property_get_timer_slack_nsec, 0, SD_BUS_VTABLE_PROPERTY_CONST),
2470
2471 SD_BUS_METHOD("GetUnit", "s", "o", method_get_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2472 SD_BUS_METHOD("GetUnitByPID", "u", "o", method_get_unit_by_pid, SD_BUS_VTABLE_UNPRIVILEGED),
2473 SD_BUS_METHOD("GetUnitByInvocationID", "ay", "o", method_get_unit_by_invocation_id, SD_BUS_VTABLE_UNPRIVILEGED),
2474 SD_BUS_METHOD("GetUnitByControlGroup", "s", "o", method_get_unit_by_control_group, SD_BUS_VTABLE_UNPRIVILEGED),
2475 SD_BUS_METHOD("LoadUnit", "s", "o", method_load_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2476 SD_BUS_METHOD("StartUnit", "ss", "o", method_start_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2477 SD_BUS_METHOD("StartUnitReplace", "sss", "o", method_start_unit_replace, SD_BUS_VTABLE_UNPRIVILEGED),
2478 SD_BUS_METHOD("StopUnit", "ss", "o", method_stop_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2479 SD_BUS_METHOD("ReloadUnit", "ss", "o", method_reload_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2480 SD_BUS_METHOD("RestartUnit", "ss", "o", method_restart_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2481 SD_BUS_METHOD("TryRestartUnit", "ss", "o", method_try_restart_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2482 SD_BUS_METHOD("ReloadOrRestartUnit", "ss", "o", method_reload_or_restart_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2483 SD_BUS_METHOD("ReloadOrTryRestartUnit", "ss", "o", method_reload_or_try_restart_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2484 SD_BUS_METHOD("KillUnit", "ssi", NULL, method_kill_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2485 SD_BUS_METHOD("ResetFailedUnit", "s", NULL, method_reset_failed_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2486 SD_BUS_METHOD("SetUnitProperties", "sba(sv)", NULL, method_set_unit_properties, SD_BUS_VTABLE_UNPRIVILEGED),
2487 SD_BUS_METHOD("RefUnit", "s", NULL, method_ref_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2488 SD_BUS_METHOD("UnrefUnit", "s", NULL, method_unref_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2489 SD_BUS_METHOD("StartTransientUnit", "ssa(sv)a(sa(sv))", "o", method_start_transient_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2490 SD_BUS_METHOD("GetUnitProcesses", "s", "a(sus)", method_get_unit_processes, SD_BUS_VTABLE_UNPRIVILEGED),
2491 SD_BUS_METHOD("AttachProcessesToUnit", "ssau", NULL, method_attach_processes_to_unit, SD_BUS_VTABLE_UNPRIVILEGED),
2492 SD_BUS_METHOD("GetJob", "u", "o", method_get_job, SD_BUS_VTABLE_UNPRIVILEGED),
2493 SD_BUS_METHOD("GetJobAfter", "u", "a(usssoo)", method_get_job_waiting, SD_BUS_VTABLE_UNPRIVILEGED),
2494 SD_BUS_METHOD("GetJobBefore", "u", "a(usssoo)", method_get_job_waiting, SD_BUS_VTABLE_UNPRIVILEGED),
2495 SD_BUS_METHOD("CancelJob", "u", NULL, method_cancel_job, SD_BUS_VTABLE_UNPRIVILEGED),
2496 SD_BUS_METHOD("ClearJobs", NULL, NULL, method_clear_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
2497 SD_BUS_METHOD("ResetFailed", NULL, NULL, method_reset_failed, SD_BUS_VTABLE_UNPRIVILEGED),
2498 SD_BUS_METHOD("ListUnits", NULL, "a(ssssssouso)", method_list_units, SD_BUS_VTABLE_UNPRIVILEGED),
2499 SD_BUS_METHOD("ListUnitsFiltered", "as", "a(ssssssouso)", method_list_units_filtered, SD_BUS_VTABLE_UNPRIVILEGED),
2500 SD_BUS_METHOD("ListUnitsByPatterns", "asas", "a(ssssssouso)", method_list_units_by_patterns, SD_BUS_VTABLE_UNPRIVILEGED),
2501 SD_BUS_METHOD("ListUnitsByNames", "as", "a(ssssssouso)", method_list_units_by_names, SD_BUS_VTABLE_UNPRIVILEGED),
2502 SD_BUS_METHOD("ListJobs", NULL, "a(usssoo)", method_list_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
2503 SD_BUS_METHOD("Subscribe", NULL, NULL, method_subscribe, SD_BUS_VTABLE_UNPRIVILEGED),
2504 SD_BUS_METHOD("Unsubscribe", NULL, NULL, method_unsubscribe, SD_BUS_VTABLE_UNPRIVILEGED),
2505 SD_BUS_METHOD("Dump", NULL, "s", method_dump, SD_BUS_VTABLE_UNPRIVILEGED),
2506 SD_BUS_METHOD("DumpByFileDescriptor", NULL, "h", method_dump_by_fd, SD_BUS_VTABLE_UNPRIVILEGED),
2507 SD_BUS_METHOD("CreateSnapshot", "sb", "o", method_refuse_snapshot, SD_BUS_VTABLE_UNPRIVILEGED|SD_BUS_VTABLE_HIDDEN),
2508 SD_BUS_METHOD("RemoveSnapshot", "s", NULL, method_refuse_snapshot, SD_BUS_VTABLE_UNPRIVILEGED|SD_BUS_VTABLE_HIDDEN),
2509 SD_BUS_METHOD("Reload", NULL, NULL, method_reload, SD_BUS_VTABLE_UNPRIVILEGED),
2510 SD_BUS_METHOD("Reexecute", NULL, NULL, method_reexecute, SD_BUS_VTABLE_UNPRIVILEGED),
2511 SD_BUS_METHOD("Exit", NULL, NULL, method_exit, 0),
2512 SD_BUS_METHOD("Reboot", NULL, NULL, method_reboot, SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)),
2513 SD_BUS_METHOD("PowerOff", NULL, NULL, method_poweroff, SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)),
2514 SD_BUS_METHOD("Halt", NULL, NULL, method_halt, SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)),
2515 SD_BUS_METHOD("KExec", NULL, NULL, method_kexec, SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)),
2516 SD_BUS_METHOD("SwitchRoot", "ss", NULL, method_switch_root, SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)),
2517 SD_BUS_METHOD("SetEnvironment", "as", NULL, method_set_environment, SD_BUS_VTABLE_UNPRIVILEGED),
2518 SD_BUS_METHOD("UnsetEnvironment", "as", NULL, method_unset_environment, SD_BUS_VTABLE_UNPRIVILEGED),
2519 SD_BUS_METHOD("UnsetAndSetEnvironment", "asas", NULL, method_unset_and_set_environment, SD_BUS_VTABLE_UNPRIVILEGED),
2520 SD_BUS_METHOD("ListUnitFiles", NULL, "a(ss)", method_list_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2521 SD_BUS_METHOD("ListUnitFilesByPatterns", "asas", "a(ss)", method_list_unit_files_by_patterns, SD_BUS_VTABLE_UNPRIVILEGED),
2522 SD_BUS_METHOD("GetUnitFileState", "s", "s", method_get_unit_file_state, SD_BUS_VTABLE_UNPRIVILEGED),
2523 SD_BUS_METHOD("EnableUnitFiles", "asbb", "ba(sss)", method_enable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2524 SD_BUS_METHOD("DisableUnitFiles", "asb", "a(sss)", method_disable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2525 SD_BUS_METHOD("ReenableUnitFiles", "asbb", "ba(sss)", method_reenable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2526 SD_BUS_METHOD("LinkUnitFiles", "asbb", "a(sss)", method_link_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2527 SD_BUS_METHOD("PresetUnitFiles", "asbb", "ba(sss)", method_preset_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2528 SD_BUS_METHOD("PresetUnitFilesWithMode", "assbb", "ba(sss)", method_preset_unit_files_with_mode, SD_BUS_VTABLE_UNPRIVILEGED),
2529 SD_BUS_METHOD("MaskUnitFiles", "asbb", "a(sss)", method_mask_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2530 SD_BUS_METHOD("UnmaskUnitFiles", "asb", "a(sss)", method_unmask_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2531 SD_BUS_METHOD("RevertUnitFiles", "as", "a(sss)", method_revert_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2532 SD_BUS_METHOD("SetDefaultTarget", "sb", "a(sss)", method_set_default_target, SD_BUS_VTABLE_UNPRIVILEGED),
2533 SD_BUS_METHOD("GetDefaultTarget", NULL, "s", method_get_default_target, SD_BUS_VTABLE_UNPRIVILEGED),
2534 SD_BUS_METHOD("PresetAllUnitFiles", "sbb", "a(sss)", method_preset_all_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2535 SD_BUS_METHOD("AddDependencyUnitFiles", "asssbb", "a(sss)", method_add_dependency_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
2536 SD_BUS_METHOD("GetUnitFileLinks", "sb", "as", method_get_unit_file_links, SD_BUS_VTABLE_UNPRIVILEGED),
2537 SD_BUS_METHOD("SetExitCode", "y", NULL, method_set_exit_code, SD_BUS_VTABLE_UNPRIVILEGED),
2538 SD_BUS_METHOD("LookupDynamicUserByName", "s", "u", method_lookup_dynamic_user_by_name, SD_BUS_VTABLE_UNPRIVILEGED),
2539 SD_BUS_METHOD("LookupDynamicUserByUID", "u", "s", method_lookup_dynamic_user_by_uid, SD_BUS_VTABLE_UNPRIVILEGED),
2540 SD_BUS_METHOD("GetDynamicUsers", NULL, "a(us)", method_get_dynamic_users, SD_BUS_VTABLE_UNPRIVILEGED),
2541
2542 SD_BUS_SIGNAL("UnitNew", "so", 0),
2543 SD_BUS_SIGNAL("UnitRemoved", "so", 0),
2544 SD_BUS_SIGNAL("JobNew", "uos", 0),
2545 SD_BUS_SIGNAL("JobRemoved", "uoss", 0),
2546 SD_BUS_SIGNAL("StartupFinished", "tttttt", 0),
2547 SD_BUS_SIGNAL("UnitFilesChanged", NULL, 0),
2548 SD_BUS_SIGNAL("Reloading", "b", 0),
2549
2550 SD_BUS_VTABLE_END
2551 };
2552
2553 static int send_finished(sd_bus *bus, void *userdata) {
2554 _cleanup_(sd_bus_message_unrefp) sd_bus_message *message = NULL;
2555 usec_t *times = userdata;
2556 int r;
2557
2558 assert(bus);
2559 assert(times);
2560
2561 r = sd_bus_message_new_signal(bus, &message, "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartupFinished");
2562 if (r < 0)
2563 return r;
2564
2565 r = sd_bus_message_append(message, "tttttt", times[0], times[1], times[2], times[3], times[4], times[5]);
2566 if (r < 0)
2567 return r;
2568
2569 return sd_bus_send(bus, message, NULL);
2570 }
2571
2572 void bus_manager_send_finished(
2573 Manager *m,
2574 usec_t firmware_usec,
2575 usec_t loader_usec,
2576 usec_t kernel_usec,
2577 usec_t initrd_usec,
2578 usec_t userspace_usec,
2579 usec_t total_usec) {
2580
2581 int r;
2582
2583 assert(m);
2584
2585 r = bus_foreach_bus(
2586 m,
2587 NULL,
2588 send_finished,
2589 (usec_t[6]) {
2590 firmware_usec,
2591 loader_usec,
2592 kernel_usec,
2593 initrd_usec,
2594 userspace_usec,
2595 total_usec
2596 });
2597 if (r < 0)
2598 log_debug_errno(r, "Failed to send finished signal: %m");
2599 }
2600
2601 static int send_reloading(sd_bus *bus, void *userdata) {
2602 _cleanup_(sd_bus_message_unrefp) sd_bus_message *message = NULL;
2603 int r;
2604
2605 assert(bus);
2606
2607 r = sd_bus_message_new_signal(bus, &message, "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "Reloading");
2608 if (r < 0)
2609 return r;
2610
2611 r = sd_bus_message_append(message, "b", PTR_TO_INT(userdata));
2612 if (r < 0)
2613 return r;
2614
2615 return sd_bus_send(bus, message, NULL);
2616 }
2617
2618 void bus_manager_send_reloading(Manager *m, bool active) {
2619 int r;
2620
2621 assert(m);
2622
2623 r = bus_foreach_bus(m, NULL, send_reloading, INT_TO_PTR(active));
2624 if (r < 0)
2625 log_debug_errno(r, "Failed to send reloading signal: %m");
2626 }
2627
2628 static int send_changed_signal(sd_bus *bus, void *userdata) {
2629 assert(bus);
2630
2631 return sd_bus_emit_properties_changed_strv(bus,
2632 "/org/freedesktop/systemd1",
2633 "org.freedesktop.systemd1.Manager",
2634 NULL);
2635 }
2636
2637 void bus_manager_send_change_signal(Manager *m) {
2638 int r;
2639
2640 assert(m);
2641
2642 r = bus_foreach_bus(m, NULL, send_changed_signal, NULL);
2643 if (r < 0)
2644 log_debug_errno(r, "Failed to send manager change signal: %m");
2645 }