]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/systemctl/systemctl-set-default.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
4 #include "bus-locator.h"
5 #include "proc-cmdline.h"
6 #include "systemctl-daemon-reload.h"
7 #include "systemctl-set-default.h"
8 #include "systemctl-util.h"
11 static int parse_proc_cmdline_item(const char *key
, const char *value
, void *data
) {
14 if (streq(key
, "systemd.unit")) {
15 if (proc_cmdline_value_missing(key
, value
))
17 if (!unit_name_is_valid(value
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
)) {
18 log_warning("Unit name specified on %s= is not valid, ignoring: %s", key
, value
);
22 return free_and_strdup_warn(ret
, key
);
25 if (runlevel_to_target(key
))
26 return free_and_strdup_warn(ret
, key
);
32 static void emit_cmdline_warning(void) {
33 if (arg_quiet
|| arg_root
)
34 /* don't bother checking the commandline if we're operating on a container */
37 _cleanup_free_
char *override
= NULL
;
40 r
= proc_cmdline_parse(parse_proc_cmdline_item
, &override
, 0);
42 log_debug_errno(r
, "Failed to parse kernel command line, ignoring: %m");
44 log_notice("Note: found \"%s\" on the kernel commandline, which overrides the default unit.",
48 static int determine_default(char **ret_name
) {
51 if (install_client_side()) {
52 r
= unit_file_get_default(arg_runtime_scope
, arg_root
, ret_name
);
54 return log_error_errno(r
, "Failed to get default target: Unit file is masked.");
56 return log_error_errno(r
, "Failed to get default target: %m");
61 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
62 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
65 r
= acquire_bus(BUS_MANAGER
, &bus
);
69 r
= bus_call_method(bus
, bus_systemd_mgr
, "GetDefaultTarget", &error
, &reply
, NULL
);
71 return log_error_errno(r
, "Failed to get default target: %s", bus_error_message(&error
, r
));
73 r
= sd_bus_message_read(reply
, "s", &name
);
75 return bus_log_parse_error(r
);
77 return free_and_strdup_warn(ret_name
, name
);
81 int verb_get_default(int argc
, char *argv
[], void *userdata
) {
82 _cleanup_free_
char *name
= NULL
;
85 r
= determine_default(&name
);
91 emit_cmdline_warning();
96 int verb_set_default(int argc
, char *argv
[], void *userdata
) {
97 _cleanup_free_
char *unit
= NULL
;
98 InstallChange
*changes
= NULL
;
105 r
= unit_name_mangle_with_suffix(argv
[1], "set-default",
106 arg_quiet
? 0 : UNIT_NAME_MANGLE_WARN
,
109 return log_error_errno(r
, "Failed to mangle unit name: %m");
111 if (install_client_side()) {
112 r
= unit_file_set_default(arg_runtime_scope
, UNIT_FILE_FORCE
, arg_root
, unit
, &changes
, &n_changes
);
113 install_changes_dump(r
, "set default", changes
, n_changes
, arg_quiet
);
117 _cleanup_(sd_bus_error_free
) sd_bus_error error
= SD_BUS_ERROR_NULL
;
118 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
121 polkit_agent_open_maybe();
123 r
= acquire_bus(BUS_MANAGER
, &bus
);
127 r
= bus_call_method(bus
, bus_systemd_mgr
, "SetDefaultTarget", &error
, &reply
, "sb", unit
, 1);
129 return log_error_errno(r
, "Failed to set default target: %s", bus_error_message(&error
, r
));
131 r
= bus_deserialize_and_dump_unit_file_changes(reply
, arg_quiet
, &changes
, &n_changes
);
135 /* Try to reload if enabled */
136 if (!arg_no_reload
) {
137 r
= daemon_reload(ACTION_RELOAD
, /* graceful= */ false);
143 emit_cmdline_warning();
146 _cleanup_free_
char *final
= NULL
;
148 r
= determine_default(&final
);
152 if (!streq(final
, unit
))
153 log_notice("Note: \"%s\" is the default unit (possibly a runtime override).", final
);
157 install_changes_free(changes
, n_changes
);
159 return r
< 0 ? r
: 0;