executable_template + {
'name' : 'systemd-analyze',
'public' : conf.get('ENABLE_ANALYZE') == 1,
- 'sources' : [systemd_analyze_sources, systemd_analyze_extract_sources],
+ 'sources' : systemd_analyze_sources + systemd_analyze_extract_sources,
'extract' : systemd_analyze_extract_sources,
'include_directories' : core_includes,
'link_with' : [
executable_template + {
'name' : 'busctl',
'public' : true,
- 'sources' : [busctl_sources, busctl_extract_sources],
+ 'sources' : busctl_sources + busctl_extract_sources,
'extract' : busctl_extract_sources,
},
test_template + {
executables += [
libexec_template + {
'name' : 'systemd-coredump',
- 'sources' : [systemd_coredump_sources, systemd_coredump_extract_sources],
+ 'sources' : systemd_coredump_sources + systemd_coredump_extract_sources,
'extract' : systemd_coredump_extract_sources,
'link_with' : [libshared],
'dependencies' : common_dependencies + [libacl],
endif
executables += [
- generator_template + {
- 'name' : 'systemd-hibernate-resume-generator',
- 'sources' : files(
- 'hibernate-resume-generator.c',
- 'hibernate-resume-config.c',
- ),
- },
libexec_template + {
'name' : 'systemd-hibernate-resume',
'sources' : files(
'hibernate-resume.c',
'hibernate-resume-config.c',
),
+ 'extract' : files('hibernate-resume-config.c'),
+ },
+ generator_template + {
+ 'name' : 'systemd-hibernate-resume-generator',
+ 'sources' : files('hibernate-resume-generator.c'),
+ 'objects' : ['systemd-hibernate-resume'],
},
]
libexec_template + {
'name' : 'systemd-homed',
'dbus' : true,
- 'sources' : [systemd_homed_sources, systemd_homed_extract_sources],
+ 'sources' : systemd_homed_sources + systemd_homed_extract_sources,
'include_directories' : includes +
include_directories('.'),
'extract' : systemd_homed_extract_sources,
libexec_template + {
'name' : 'systemd-importd',
'dbus' : true,
- 'sources' : [systemd_importd_sources, systemd_importd_extract_sources],
+ 'sources' : systemd_importd_sources + systemd_importd_extract_sources,
'extract' : systemd_importd_extract_sources,
'dependencies' : [common_deps, threads],
},
'integrity-util.c',
'integritysetup.c',
),
+ 'extract' : files('integrity-util.c'),
'dependencies' : libcryptsetup,
},
generator_template + {
'name' : 'systemd-integritysetup-generator',
- 'sources' : files(
- 'integrity-util.c',
- 'integritysetup-generator.c',
- ),
+ 'sources' : files('integritysetup-generator.c'),
+ 'objects' : ['systemd-integritysetup'],
},
]
subdir_done()
endif
-systemd_journal_upload_sources = files(
- 'journal-compression-util.c',
- 'journal-upload-journal.c',
- 'journal-upload.c',
+systemd_journal_gatewayd_sources = files(
+ 'journal-gatewayd.c',
)
-systemd_journal_upload_extract_sources = files(
- 'journal-header-util.c',
+systemd_journal_gatewayd_extract_sources = files(
+ 'microhttpd-util.c',
)
systemd_journal_remote_sources = files('journal-remote-main.c')
'journal-remote.c',
)
-if conf.get('HAVE_MICROHTTPD') == 1
- systemd_journal_remote_extract_sources += files(
- 'microhttpd-util.c',
- )
-endif
-
-systemd_journal_gatewayd_sources = files(
- 'journal-gatewayd.c',
- 'microhttpd-util.c',
+systemd_journal_upload_sources = files(
+ 'journal-upload-journal.c',
+ 'journal-upload.c',
+)
+systemd_journal_upload_extract_sources = files(
+ 'journal-header-util.c',
)
common_deps = [
executables += [
libexec_template + {
- 'name' : 'systemd-journal-upload',
+ 'name' : 'systemd-journal-gatewayd',
'public' : true,
- 'conditions' : ['HAVE_LIBCURL'],
- 'sources' : [systemd_journal_upload_sources, systemd_journal_upload_extract_sources],
- 'extract' : systemd_journal_upload_extract_sources,
- 'dependencies' : common_deps + [libcurl],
+ 'conditions' : ['HAVE_MICROHTTPD'],
+ 'sources' : systemd_journal_gatewayd_sources + systemd_journal_gatewayd_extract_sources,
+ 'extract' : systemd_journal_gatewayd_extract_sources,
+ 'dependencies' : common_deps + [libmicrohttpd],
},
libexec_template + {
'name' : 'systemd-journal-remote',
'public' : true,
- 'sources' : [systemd_journal_remote_sources, systemd_journal_remote_extract_sources],
+ 'sources' : systemd_journal_remote_sources + systemd_journal_remote_extract_sources,
+ 'objects' : conf.get('HAVE_MICROHTTPD') == 1 ? ['systemd-journal-gatewayd'] : [],
'extract' : systemd_journal_remote_extract_sources,
'dependencies' : common_deps + [libmicrohttpd],
},
libexec_template + {
- 'name' : 'systemd-journal-gatewayd',
+ 'name' : 'systemd-journal-upload',
'public' : true,
- 'conditions' : ['HAVE_MICROHTTPD'],
- 'sources' : systemd_journal_gatewayd_sources,
- 'dependencies' : common_deps + [libmicrohttpd],
+ 'conditions' : ['HAVE_LIBCURL'],
+ 'sources' : systemd_journal_upload_sources + systemd_journal_upload_extract_sources,
+ 'objects' : ['systemd-journal-remote'],
+ 'extract' : systemd_journal_upload_extract_sources,
+ 'dependencies' : common_deps + [libcurl],
},
test_template + {
'sources' : files('test-journal-header-util.c'),
executables += [
libexec_template + {
'name' : 'systemd-journald',
- 'sources' : [systemd_journald_sources, systemd_journald_extract_sources],
+ 'sources' : systemd_journald_sources + systemd_journald_extract_sources,
'include_directories' : [libexec_template['include_directories'], include_directories('.')],
'extract' : systemd_journald_extract_sources,
'dependencies' : [
'test-ndisc-ra.c',
'icmp6-test-util.c',
),
+ 'extract' : files('icmp6-test-util.c'),
},
network_test_template + {
- 'sources' : files(
- 'test-ndisc-rs.c',
- 'icmp6-test-util.c',
- ),
+ 'sources' : files('test-ndisc-rs.c'),
+ 'objects' : ['test-ndisc-ra'],
},
network_test_template + {
'sources' : files('test-ndisc-send.c'),
'sources' : files('fuzz-lldp-rx.c'),
},
network_fuzz_template + {
- 'sources' : files(
- 'fuzz-ndisc-rs.c',
- 'icmp6-test-util.c',
- ),
+ 'sources' : files('fuzz-ndisc-rs.c'),
+ 'objects' : ['test-ndisc-ra'],
},
]
libexec_template + {
'name' : 'systemd-localed',
'dbus' : true,
- 'sources' : [systemd_localed_sources, systemd_localed_extract_sources],
+ 'sources' : systemd_localed_sources + systemd_localed_extract_sources,
'extract' : systemd_localed_extract_sources,
'dependencies' : libxkbcommon_deps,
},
libexec_template + {
'name' : 'systemd-logind',
'dbus' : true,
- 'sources' : [systemd_logind_sources, systemd_logind_extract_sources],
+ 'sources' : systemd_logind_sources + systemd_logind_extract_sources,
'include_directories' : [libexec_template['include_directories'], include_directories('.')],
'extract' : systemd_logind_extract_sources,
'dependencies' : [
libexec_template + {
'name' : 'systemd-machined',
'dbus' : true,
- 'sources' : [systemd_machined_sources, systemd_machined_extract_sources],
+ 'sources' : systemd_machined_sources + systemd_machined_extract_sources,
'extract' : systemd_machined_extract_sources,
},
executable_template + {
'name' : 'systemd-networkd',
'dbus' : true,
'conditions' : ['ENABLE_NETWORKD'],
- 'sources' : [systemd_networkd_sources, systemd_networkd_extract_sources],
+ 'sources' : systemd_networkd_sources + systemd_networkd_extract_sources,
'extract' : systemd_networkd_extract_sources,
'include_directories' : network_includes,
'link_with' : [
'nspawn.c',
'nspawn-bind-user.c',
'nspawn-cgroup.c',
- 'nspawn-network.c',
'nspawn-register.c',
'nspawn-seccomp.c',
'nspawn-setuid.c',
executable_template + {
'name' : 'systemd-nspawn',
'public' : true,
- 'sources' : [nspawn_sources, nspawn_extract_sources],
+ 'sources' : nspawn_sources + nspawn_extract_sources,
'include_directories' : [
executable_template['include_directories'],
include_directories('.')
executables += [
libexec_template + {
'name' : 'systemd-nsresourced',
- 'sources' : [systemd_nsresourced_sources, systemd_nsresourced_extract_sources],
+ 'sources' : systemd_nsresourced_sources + systemd_nsresourced_extract_sources,
'include_directories' : [libexec_template['include_directories'], include_directories('.')],
'extract' : systemd_nsresourced_extract_sources,
'dependencies' : threads,
libexec_template + {
'name' : 'systemd-oomd',
'dbus' : true,
- 'sources' : [systemd_oomd_sources, systemd_oomd_extract_sources],
+ 'sources' : systemd_oomd_sources + systemd_oomd_extract_sources,
'extract' : systemd_oomd_extract_sources,
'dependencies' : libatomic,
},
libexec_template + resolve_common_template + {
'name' : 'systemd-resolved',
'dbus' : true,
- 'sources' : [systemd_resolved_sources, systemd_resolved_extract_sources],
+ 'sources' : systemd_resolved_sources + systemd_resolved_extract_sources,
'include_directories' : [libexec_template['include_directories'], include_directories('.')],
'extract' : systemd_resolved_extract_sources,
},
executables += [
libexec_template + {
'name' : 'systemd-shutdown',
- 'sources' : [systemd_shutdown_sources, systemd_shutdown_extract_sources],
+ 'sources' : systemd_shutdown_sources + systemd_shutdown_extract_sources,
'extract' : systemd_shutdown_extract_sources,
'dependencies' : libmount,
},
libexec_template + {
'name' : 'systemd-shutdown.standalone',
- 'sources' : [systemd_shutdown_sources, systemd_shutdown_extract_sources],
+ 'sources' : systemd_shutdown_sources + systemd_shutdown_extract_sources,
'c_args' : '-DSTANDALONE',
'link_with' : [
libbasic_static,
executables += [
libexec_template + {
'name' : 'systemd-sleep',
- 'sources' : [sleep_sources, sleep_extract_sources],
+ 'sources' : sleep_sources + sleep_extract_sources,
'include_directories' : [libexec_template['include_directories'], include_directories('.')],
'extract' : sleep_extract_sources,
},
'systemctl-add-dependency.c',
'systemctl-cancel-job.c',
'systemctl-clean-or-freeze.c',
- 'systemctl-compat-halt.c',
- 'systemctl-compat-runlevel.c',
- 'systemctl-compat-shutdown.c',
- 'systemctl-compat-telinit.c',
- 'systemctl-daemon-reload.c',
'systemctl-edit.c',
'systemctl-enable.c',
'systemctl-is-active.c',
'systemctl-list-unit-files.c',
'systemctl-list-units.c',
'systemctl-log-setting.c',
- 'systemctl-logind.c',
+ 'systemctl-main.c',
'systemctl-mount.c',
'systemctl-preset-all.c',
'systemctl-reset-failed.c',
'systemctl-set-property.c',
'systemctl-show.c',
'systemctl-start-special.c',
- 'systemctl-start-unit.c',
'systemctl-switch-root.c',
- 'systemctl-sysv-compat.c',
'systemctl-trivial-method.c',
- 'systemctl-util.c',
'systemctl-whoami.c',
+)
+systemctl_extract_sources = files(
+ 'systemctl-compat-halt.c',
+ 'systemctl-compat-runlevel.c',
+ 'systemctl-compat-shutdown.c',
+ 'systemctl-compat-telinit.c',
+ 'systemctl-daemon-reload.c',
+ 'systemctl-logind.c',
+ 'systemctl-start-unit.c',
+ 'systemctl-sysv-compat.c',
+ 'systemctl-util.c',
'systemctl.c',
)
executable_template + {
'name' : 'systemctl',
'public' : true,
- 'sources' : systemctl_sources,
+ 'sources' : systemctl_sources + systemctl_extract_sources,
+ 'extract' : systemctl_extract_sources,
'link_with' : systemctl_link_with,
'dependencies' : [
libcap,
'install_tag' : 'systemctl',
},
fuzz_template + {
- 'sources' : [
- files('fuzz-systemctl-parse-argv.c'),
- systemctl_sources,
- ],
+ 'sources' : files('fuzz-systemctl-parse-argv.c'),
+ 'objects' : ['systemctl'],
'link_with' : systemctl_link_with,
- 'c_args' : ['-DFUZZ_SYSTEMCTL_PARSE_ARGV'],
},
]
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <getopt.h>
+#include <locale.h>
+#include <unistd.h>
+
+#include "dissect-image.h"
+#include "glyph-util.h"
+#include "log.h"
+#include "logs-show.h"
+#include "loop-util.h"
+#include "main-func.h"
+#include "mount-util.h"
+#include "stat-util.h"
+#include "systemctl.h"
+#include "systemctl-add-dependency.h"
+#include "systemctl-cancel-job.h"
+#include "systemctl-clean-or-freeze.h"
+#include "systemctl-compat-halt.h"
+#include "systemctl-compat-runlevel.h"
+#include "systemctl-compat-telinit.h"
+#include "systemctl-daemon-reload.h"
+#include "systemctl-edit.h"
+#include "systemctl-enable.h"
+#include "systemctl-is-active.h"
+#include "systemctl-is-enabled.h"
+#include "systemctl-is-system-running.h"
+#include "systemctl-kill.h"
+#include "systemctl-list-dependencies.h"
+#include "systemctl-list-jobs.h"
+#include "systemctl-list-machines.h"
+#include "systemctl-list-unit-files.h"
+#include "systemctl-list-units.h"
+#include "systemctl-log-setting.h"
+#include "systemctl-logind.h"
+#include "systemctl-mount.h"
+#include "systemctl-preset-all.h"
+#include "systemctl-reset-failed.h"
+#include "systemctl-service-watchdogs.h"
+#include "systemctl-set-default.h"
+#include "systemctl-set-environment.h"
+#include "systemctl-set-property.h"
+#include "systemctl-show.h"
+#include "systemctl-start-special.h"
+#include "systemctl-start-unit.h"
+#include "systemctl-switch-root.h"
+#include "systemctl-trivial-method.h"
+#include "systemctl-util.h"
+#include "systemctl-whoami.h"
+#include "verbs.h"
+#include "virt.h"
+
+static int systemctl_main(int argc, char *argv[]) {
+ static const Verb verbs[] = {
+ { "list-units", VERB_ANY, VERB_ANY, VERB_DEFAULT|VERB_ONLINE_ONLY, verb_list_units },
+ { "list-unit-files", VERB_ANY, VERB_ANY, 0, verb_list_unit_files },
+ { "list-automounts", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_automounts },
+ { "list-paths", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_paths },
+ { "list-sockets", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_sockets },
+ { "list-timers", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_timers },
+ { "list-jobs", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_jobs },
+ { "list-machines", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_machines },
+ { "clear-jobs", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_trivial_method },
+ { "cancel", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_cancel },
+ { "start", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "stop", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "condstop", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with ALTLinux */
+ { "reload", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "try-restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "reload-or-restart", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "reload-or-try-restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with old systemctl <= 228 */
+ { "try-reload-or-restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
+ { "force-reload", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with SysV */
+ { "condreload", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with ALTLinux */
+ { "condrestart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with RH */
+ { "isolate", 2, 2, VERB_ONLINE_ONLY, verb_start },
+ { "kill", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_kill },
+ { "clean", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
+ { "freeze", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
+ { "thaw", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
+ { "is-active", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active },
+ { "check", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active }, /* deprecated alias of is-active */
+ { "is-failed", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_is_failed },
+ { "show", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
+ { "cat", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_cat },
+ { "status", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
+ { "help", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
+ { "daemon-reload", 1, 1, VERB_ONLINE_ONLY, verb_daemon_reload },
+ { "daemon-reexec", 1, 1, VERB_ONLINE_ONLY, verb_daemon_reload },
+ { "log-level", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_log_setting },
+ { "log-target", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_log_setting },
+ { "service-log-level", 2, 3, VERB_ONLINE_ONLY, verb_service_log_setting },
+ { "service-log-target", 2, 3, VERB_ONLINE_ONLY, verb_service_log_setting },
+ { "service-watchdogs", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_service_watchdogs },
+ { "show-environment", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_show_environment },
+ { "set-environment", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_set_environment },
+ { "unset-environment", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_set_environment },
+ { "import-environment", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_import_environment },
+ { "halt", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "poweroff", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "reboot", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "kexec", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "soft-reboot", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "sleep", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "suspend", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "hibernate", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "hybrid-sleep", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "suspend-then-hibernate",VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "default", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_special },
+ { "rescue", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "emergency", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
+ { "exit", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_start_special },
+ { "reset-failed", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_reset_failed },
+ { "enable", 2, VERB_ANY, 0, verb_enable },
+ { "disable", 2, VERB_ANY, 0, verb_enable },
+ { "is-enabled", 2, VERB_ANY, 0, verb_is_enabled },
+ { "reenable", 2, VERB_ANY, 0, verb_enable },
+ { "preset", 2, VERB_ANY, 0, verb_enable },
+ { "preset-all", VERB_ANY, 1, 0, verb_preset_all },
+ { "mask", 2, VERB_ANY, 0, verb_enable },
+ { "unmask", 2, VERB_ANY, 0, verb_enable },
+ { "link", 2, VERB_ANY, 0, verb_enable },
+ { "revert", 2, VERB_ANY, 0, verb_enable },
+ { "switch-root", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_switch_root },
+ { "list-dependencies", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_dependencies },
+ { "set-default", 2, 2, 0, verb_set_default },
+ { "get-default", VERB_ANY, 1, 0, verb_get_default },
+ { "set-property", 3, VERB_ANY, VERB_ONLINE_ONLY, verb_set_property },
+ { "is-system-running", VERB_ANY, 1, 0, verb_is_system_running },
+ { "add-wants", 3, VERB_ANY, 0, verb_add_dependency },
+ { "add-requires", 3, VERB_ANY, 0, verb_add_dependency },
+ { "edit", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_edit },
+ { "bind", 3, 4, VERB_ONLINE_ONLY, verb_bind },
+ { "mount-image", 4, 5, VERB_ONLINE_ONLY, verb_mount_image },
+ { "whoami", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_whoami },
+ {}
+ };
+
+ const Verb *verb = verbs_find_verb(argv[optind], verbs);
+ if (verb && (verb->flags & VERB_ONLINE_ONLY) && arg_root)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Verb '%s' cannot be used with --root= or --image=.",
+ argv[optind] ?: verb->verb);
+
+ return dispatch_verb(argc, argv, verbs, NULL);
+}
+
+static int run(int argc, char *argv[]) {
+ _cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
+ _cleanup_(umount_and_freep) char *mounted_dir = NULL;
+ int r;
+
+ setlocale(LC_ALL, "");
+ log_setup();
+
+ r = systemctl_dispatch_parse_argv(argc, argv);
+ if (r <= 0)
+ goto finish;
+
+ journal_browse_prepare();
+
+ if (proc_mounted() == 0)
+ log_full(arg_no_warn ? LOG_DEBUG : LOG_WARNING,
+ "%s%s/proc/ is not mounted. This is not a supported mode of operation. Please fix\n"
+ "your invocation environment to mount /proc/ and /sys/ properly. Proceeding anyway.\n"
+ "Your mileage may vary.",
+ optional_glyph(GLYPH_WARNING_SIGN),
+ optional_glyph(GLYPH_SPACE));
+
+ if (arg_action != ACTION_SYSTEMCTL && running_in_chroot() > 0) {
+ if (!arg_quiet)
+ log_info("Running in chroot, ignoring request.");
+ r = 0;
+ goto finish;
+ }
+
+ /* systemctl_main() will print an error message for the bus connection, but only if it needs to */
+
+ if (arg_image) {
+ assert(!arg_root);
+
+ r = mount_image_privately_interactively(
+ arg_image,
+ arg_image_policy,
+ DISSECT_IMAGE_GENERIC_ROOT |
+ DISSECT_IMAGE_REQUIRE_ROOT |
+ DISSECT_IMAGE_RELAX_VAR_CHECK |
+ DISSECT_IMAGE_VALIDATE_OS |
+ DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
+ &mounted_dir,
+ /* ret_dir_fd= */ NULL,
+ &loop_device);
+ if (r < 0)
+ return r;
+
+ arg_root = strdup(mounted_dir);
+ if (!arg_root)
+ return log_oom();
+ }
+
+ switch (arg_action) {
+
+ case ACTION_SYSTEMCTL:
+ r = systemctl_main(argc, argv);
+ break;
+
+ /* Legacy command aliases set arg_action. They provide some fallbacks, e.g. to tell sysvinit to
+ * reboot after you have installed systemd binaries. */
+
+ case ACTION_HALT:
+ case ACTION_POWEROFF:
+ case ACTION_REBOOT:
+ case ACTION_KEXEC:
+ r = halt_main();
+ break;
+
+ case ACTION_RUNLEVEL2:
+ case ACTION_RUNLEVEL3:
+ case ACTION_RUNLEVEL4:
+ case ACTION_RUNLEVEL5:
+ case ACTION_RESCUE:
+ r = start_with_fallback();
+ break;
+
+ case ACTION_RELOAD:
+ case ACTION_REEXEC:
+ r = reload_with_fallback();
+ break;
+
+ case ACTION_CANCEL_SHUTDOWN:
+ r = logind_cancel_shutdown();
+ break;
+
+ case ACTION_SHOW_SHUTDOWN:
+ case ACTION_SYSTEMCTL_SHOW_SHUTDOWN:
+ r = logind_show_shutdown();
+ break;
+
+ case ACTION_RUNLEVEL:
+ r = runlevel_main();
+ break;
+
+ case ACTION_EXIT:
+ case ACTION_SLEEP:
+ case ACTION_SUSPEND:
+ case ACTION_HIBERNATE:
+ case ACTION_HYBRID_SLEEP:
+ case ACTION_SUSPEND_THEN_HIBERNATE:
+ case ACTION_EMERGENCY:
+ case ACTION_DEFAULT:
+ /* systemctl verbs with no equivalent in the legacy commands. These cannot appear in
+ * arg_action. Fall through. */
+
+ case _ACTION_INVALID:
+ default:
+ assert_not_reached();
+ }
+
+finish:
+ release_busses();
+
+ /* Note that we return r here, not 0, so that we can implement the LSB-like return codes */
+ return r;
+}
+
+DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);
#include "stat-util.h"
#include "string-table.h"
#include "systemctl.h"
-#include "systemctl-add-dependency.h"
-#include "systemctl-cancel-job.h"
-#include "systemctl-clean-or-freeze.h"
#include "systemctl-compat-halt.h"
#include "systemctl-compat-runlevel.h"
#include "systemctl-compat-shutdown.h"
#include "systemctl-compat-telinit.h"
-#include "systemctl-daemon-reload.h"
-#include "systemctl-edit.h"
-#include "systemctl-enable.h"
-#include "systemctl-is-active.h"
-#include "systemctl-is-enabled.h"
-#include "systemctl-is-system-running.h"
-#include "systemctl-kill.h"
-#include "systemctl-list-dependencies.h"
-#include "systemctl-list-jobs.h"
-#include "systemctl-list-machines.h"
-#include "systemctl-list-unit-files.h"
-#include "systemctl-list-units.h"
-#include "systemctl-log-setting.h"
#include "systemctl-logind.h"
#include "systemctl-mount.h"
#include "systemctl-preset-all.h"
arg_action = ACTION_SYSTEMCTL;
return systemctl_parse_argv(argc, argv);
}
-
-#ifndef FUZZ_SYSTEMCTL_PARSE_ARGV
-static int systemctl_main(int argc, char *argv[]) {
- static const Verb verbs[] = {
- { "list-units", VERB_ANY, VERB_ANY, VERB_DEFAULT|VERB_ONLINE_ONLY, verb_list_units },
- { "list-unit-files", VERB_ANY, VERB_ANY, 0, verb_list_unit_files },
- { "list-automounts", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_automounts },
- { "list-paths", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_paths },
- { "list-sockets", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_sockets },
- { "list-timers", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_timers },
- { "list-jobs", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_jobs },
- { "list-machines", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_machines },
- { "clear-jobs", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_trivial_method },
- { "cancel", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_cancel },
- { "start", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "stop", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "condstop", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with ALTLinux */
- { "reload", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "try-restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "reload-or-restart", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "reload-or-try-restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with old systemctl <= 228 */
- { "try-reload-or-restart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start },
- { "force-reload", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with SysV */
- { "condreload", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with ALTLinux */
- { "condrestart", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_start }, /* For compatibility with RH */
- { "isolate", 2, 2, VERB_ONLINE_ONLY, verb_start },
- { "kill", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_kill },
- { "clean", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
- { "freeze", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
- { "thaw", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_clean_or_freeze },
- { "is-active", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active },
- { "check", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_is_active }, /* deprecated alias of is-active */
- { "is-failed", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_is_failed },
- { "show", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
- { "cat", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_cat },
- { "status", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
- { "help", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_show },
- { "daemon-reload", 1, 1, VERB_ONLINE_ONLY, verb_daemon_reload },
- { "daemon-reexec", 1, 1, VERB_ONLINE_ONLY, verb_daemon_reload },
- { "log-level", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_log_setting },
- { "log-target", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_log_setting },
- { "service-log-level", 2, 3, VERB_ONLINE_ONLY, verb_service_log_setting },
- { "service-log-target", 2, 3, VERB_ONLINE_ONLY, verb_service_log_setting },
- { "service-watchdogs", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_service_watchdogs },
- { "show-environment", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_show_environment },
- { "set-environment", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_set_environment },
- { "unset-environment", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_set_environment },
- { "import-environment", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_import_environment },
- { "halt", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "poweroff", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "reboot", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "kexec", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "soft-reboot", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "sleep", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "suspend", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "hibernate", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "hybrid-sleep", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "suspend-then-hibernate",VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "default", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_special },
- { "rescue", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "emergency", VERB_ANY, 1, VERB_ONLINE_ONLY, verb_start_system_special },
- { "exit", VERB_ANY, 2, VERB_ONLINE_ONLY, verb_start_special },
- { "reset-failed", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_reset_failed },
- { "enable", 2, VERB_ANY, 0, verb_enable },
- { "disable", 2, VERB_ANY, 0, verb_enable },
- { "is-enabled", 2, VERB_ANY, 0, verb_is_enabled },
- { "reenable", 2, VERB_ANY, 0, verb_enable },
- { "preset", 2, VERB_ANY, 0, verb_enable },
- { "preset-all", VERB_ANY, 1, 0, verb_preset_all },
- { "mask", 2, VERB_ANY, 0, verb_enable },
- { "unmask", 2, VERB_ANY, 0, verb_enable },
- { "link", 2, VERB_ANY, 0, verb_enable },
- { "revert", 2, VERB_ANY, 0, verb_enable },
- { "switch-root", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_switch_root },
- { "list-dependencies", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_list_dependencies },
- { "set-default", 2, 2, 0, verb_set_default },
- { "get-default", VERB_ANY, 1, 0, verb_get_default },
- { "set-property", 3, VERB_ANY, VERB_ONLINE_ONLY, verb_set_property },
- { "is-system-running", VERB_ANY, 1, 0, verb_is_system_running },
- { "add-wants", 3, VERB_ANY, 0, verb_add_dependency },
- { "add-requires", 3, VERB_ANY, 0, verb_add_dependency },
- { "edit", 2, VERB_ANY, VERB_ONLINE_ONLY, verb_edit },
- { "bind", 3, 4, VERB_ONLINE_ONLY, verb_bind },
- { "mount-image", 4, 5, VERB_ONLINE_ONLY, verb_mount_image },
- { "whoami", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, verb_whoami },
- {}
- };
-
- const Verb *verb = verbs_find_verb(argv[optind], verbs);
- if (verb && (verb->flags & VERB_ONLINE_ONLY) && arg_root)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Verb '%s' cannot be used with --root= or --image=.",
- argv[optind] ?: verb->verb);
-
- return dispatch_verb(argc, argv, verbs, NULL);
-}
-
-static int run(int argc, char *argv[]) {
- _cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
- _cleanup_(umount_and_freep) char *mounted_dir = NULL;
- int r;
-
- setlocale(LC_ALL, "");
- log_setup();
-
- r = systemctl_dispatch_parse_argv(argc, argv);
- if (r <= 0)
- goto finish;
-
- journal_browse_prepare();
-
- if (proc_mounted() == 0)
- log_full(arg_no_warn ? LOG_DEBUG : LOG_WARNING,
- "%s%s/proc/ is not mounted. This is not a supported mode of operation. Please fix\n"
- "your invocation environment to mount /proc/ and /sys/ properly. Proceeding anyway.\n"
- "Your mileage may vary.",
- optional_glyph(GLYPH_WARNING_SIGN),
- optional_glyph(GLYPH_SPACE));
-
- if (arg_action != ACTION_SYSTEMCTL && running_in_chroot() > 0) {
- if (!arg_quiet)
- log_info("Running in chroot, ignoring request.");
- r = 0;
- goto finish;
- }
-
- /* systemctl_main() will print an error message for the bus connection, but only if it needs to */
-
- if (arg_image) {
- assert(!arg_root);
-
- r = mount_image_privately_interactively(
- arg_image,
- arg_image_policy,
- DISSECT_IMAGE_GENERIC_ROOT |
- DISSECT_IMAGE_REQUIRE_ROOT |
- DISSECT_IMAGE_RELAX_VAR_CHECK |
- DISSECT_IMAGE_VALIDATE_OS |
- DISSECT_IMAGE_ALLOW_USERSPACE_VERITY,
- &mounted_dir,
- /* ret_dir_fd= */ NULL,
- &loop_device);
- if (r < 0)
- return r;
-
- arg_root = strdup(mounted_dir);
- if (!arg_root)
- return log_oom();
- }
-
- switch (arg_action) {
-
- case ACTION_SYSTEMCTL:
- r = systemctl_main(argc, argv);
- break;
-
- /* Legacy command aliases set arg_action. They provide some fallbacks, e.g. to tell sysvinit to
- * reboot after you have installed systemd binaries. */
-
- case ACTION_HALT:
- case ACTION_POWEROFF:
- case ACTION_REBOOT:
- case ACTION_KEXEC:
- r = halt_main();
- break;
-
- case ACTION_RUNLEVEL2:
- case ACTION_RUNLEVEL3:
- case ACTION_RUNLEVEL4:
- case ACTION_RUNLEVEL5:
- case ACTION_RESCUE:
- r = start_with_fallback();
- break;
-
- case ACTION_RELOAD:
- case ACTION_REEXEC:
- r = reload_with_fallback();
- break;
-
- case ACTION_CANCEL_SHUTDOWN:
- r = logind_cancel_shutdown();
- break;
-
- case ACTION_SHOW_SHUTDOWN:
- case ACTION_SYSTEMCTL_SHOW_SHUTDOWN:
- r = logind_show_shutdown();
- break;
-
- case ACTION_RUNLEVEL:
- r = runlevel_main();
- break;
-
- case ACTION_EXIT:
- case ACTION_SLEEP:
- case ACTION_SUSPEND:
- case ACTION_HIBERNATE:
- case ACTION_HYBRID_SLEEP:
- case ACTION_SUSPEND_THEN_HIBERNATE:
- case ACTION_EMERGENCY:
- case ACTION_DEFAULT:
- /* systemctl verbs with no equivalent in the legacy commands. These cannot appear in
- * arg_action. Fall through. */
-
- case _ACTION_INVALID:
- default:
- assert_not_reached();
- }
-
-finish:
- release_busses();
-
- /* Note that we return r here, not 0, so that we can implement the LSB-like return codes */
- return r;
-}
-
-DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);
-#endif
extern int arg_kill_value;
extern bool arg_kill_value_set;
extern char *arg_root;
+extern char *arg_image;
extern usec_t arg_when;
extern bool arg_stdin;
extern const char *arg_reboot_argument;
'sysupdate-resource.c',
'sysupdate-transfer.c',
'sysupdate-update-set.c',
+ 'sysupdate.c',
+)
+systemd_sysupdate_extract_sources = files(
'sysupdate-update-set-flags.c',
'sysupdate-util.c',
- 'sysupdate.c',
)
systemd_updatectl_sources = files(
- 'sysupdate-update-set-flags.c',
- 'sysupdate-util.c',
'updatectl.c',
)
'name' : 'systemd-sysupdate',
'public' : true,
'conditions' : ['ENABLE_SYSUPDATE'],
- 'sources' : systemd_sysupdate_sources,
+ 'sources' : systemd_sysupdate_sources + systemd_sysupdate_extract_sources,
+ 'extract' : systemd_sysupdate_extract_sources,
'link_with' : [
libshared,
libshared_fdisk,
'name' : 'updatectl',
'public' : true,
'sources' : systemd_updatectl_sources,
+ 'objects' : ['systemd-sysupdate'],
'conditions' : ['ENABLE_SYSUPDATED'],
},
]
'test-nss-hosts.c',
'nss-test-util.c',
),
+ 'extract' : files('nss-test-util.c'),
'dependencies' : libdl,
'conditions' : ['ENABLE_NSS'],
'timeout' : 120,
},
test_template + {
- 'sources' : files(
- 'test-nss-users.c',
- 'nss-test-util.c',
- ),
+ 'sources' : files('test-nss-users.c'),
+ 'objects' : ['test-nss-hosts'],
'dependencies' : libdl,
'conditions' : ['ENABLE_NSS'],
},
executables += [
libexec_template + {
'name' : 'systemd-timesyncd',
- 'sources' : [timesyncd_sources, timesyncd_extract_sources],
+ 'sources' : timesyncd_sources + timesyncd_extract_sources,
'include_directories' : [libexec_template['include_directories'], include_directories('.')],
'extract' : timesyncd_extract_sources,
'link_with' : timesyncd_link_with,
executable_template + {
'name' : 'systemd-tmpfiles',
'public' : true,
- 'sources' : [systemd_tmpfiles_sources, systemd_tmpfiles_extract_sources],
+ 'sources' : systemd_tmpfiles_sources + systemd_tmpfiles_extract_sources,
'extract' : systemd_tmpfiles_extract_sources,
'dependencies' : libacl,
},
executable_template + {
'name' : 'systemd-tmpfiles.standalone',
'public' : have_standalone_binaries,
- 'sources' : [systemd_tmpfiles_sources, systemd_tmpfiles_extract_sources],
+ 'sources' : systemd_tmpfiles_sources + systemd_tmpfiles_extract_sources,
'c_args' : '-DSTANDALONE',
'link_with' : [
libbasic_static,
executable_template + {
'name' : 'udevadm',
'public' : true,
- 'sources' : [
- udevadm_sources,
- udevadm_extract_sources,
- keyboard_keys_from_name_h,
- ],
+ 'sources' : udevadm_sources +
+ udevadm_extract_sources +
+ keyboard_keys_from_name_h,
'include_directories' : [
libexec_template['include_directories'],
include_directories('.', 'net'),
executable_template + {
'name' : 'systemd-vmspawn',
'public' : true,
- 'sources' : [vmspawn_sources, vmspawn_extract_sources],
+ 'sources' : vmspawn_sources + vmspawn_extract_sources,
'extract' : vmspawn_extract_sources,
'dependencies' : [libblkid]
},
executables += [
executable_template + {
'name' : 'systemd-xdg-autostart-generator',
- 'sources' : [
- systemd_xdg_autostart_generator_sources,
- systemd_xdg_autostart_generator_extract_sources,
- ],
+ 'sources' : systemd_xdg_autostart_generator_sources +
+ systemd_xdg_autostart_generator_extract_sources,
'extract' : systemd_xdg_autostart_generator_extract_sources,
'install_dir' : usergeneratordir,
},