machinectl.c revision a6c616024db23fef34152c1432892824a07799cc
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering This file is part of systemd.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering Copyright 2013 Lennart Poettering
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering systemd is free software; you can redistribute it and/or modify it
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering under the terms of the GNU Lesser General Public License as published by
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering (at your option) any later version.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering systemd is distributed in the hope that it will be useful, but
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering Lesser General Public License for more details.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering You should have received a copy of the GNU Lesser General Public License
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poetteringstatic bool arg_all = false;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic bool arg_full = false;
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poetteringstatic bool arg_no_pager = false;
023fb90b83871a15ef7f57e8cd126e3426f99b9eLennart Poetteringstatic bool arg_ask_password = true;
785890acf6d629ff881a1f065f431df1b7fc8c7aLennart Poetteringstatic BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
56159e0d918e9a9be07988133bb2847779325de0Lennart Poetteringstatic void pager_open_if_enabled(void) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering /* Cache result before we open the pager */
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int list_machines(sd_bus *bus, char **args, unsigned n) {
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
785890acf6d629ff881a1f065f431df1b7fc8c7aLennart Poettering const char *name, *class, *service, *object;
785890acf6d629ff881a1f065f431df1b7fc8c7aLennart Poettering unsigned k = 0;
3d7415f43f0fe6a821d7bc4a341ba371e8a30ef3Lennart Poettering "org.freedesktop.machine1",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1.Manager",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "ListMachines",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering log_error("Could not get machines: %s", bus_error_message(&error, -r));
acf97e213e69a97e63ab8f7fad7ecd53608c757aLennart Poettering printf("%-32s %-9s %-16s\n", "MACHINE", "CONTAINER", "SERVICE");
acf97e213e69a97e63ab8f7fad7ecd53608c757aLennart Poettering r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssso)");
acf97e213e69a97e63ab8f7fad7ecd53608c757aLennart Poettering while ((r = sd_bus_message_read(reply, "(ssso)", &name, &class, &service, &object)) > 0) {
acf97e213e69a97e63ab8f7fad7ecd53608c757aLennart Poettering printf("%-32s %-9s %-16s\n", name, class, service);
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering r = sd_bus_message_exit_container(reply);
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poetteringstatic int show_scope_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering if (arg_transport == BUS_TRANSPORT_REMOTE)
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "ControlGroup",
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen log_error("Failed to query ControlGroup: %s", bus_error_message(&error, -r));
3d7415f43f0fe6a821d7bc4a341ba371e8a30ef3Lennart Poettering r = sd_bus_message_read(reply, "s", &cgroup);
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup, false) != 0 && leader <= 0)
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering show_cgroup_and_extra(SYSTEMD_CGROUP_CONTROLLER, cgroup, "\t\t ", c, false, &leader, leader > 0, output_flags);
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poetteringstatic void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering if (!sd_id128_equal(i->id, SD_ID128_NULL))
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering printf("(" SD_ID128_FORMAT_STR ")\n", SD_ID128_FORMAT_VAL(i->id));
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering s1 = format_timestamp_relative(since1, sizeof(since1), i->timestamp);
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering s2 = format_timestamp(since2, sizeof(since2), i->timestamp);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering printf("\t Leader: %u", (unsigned) i->leader);
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering } else if (i->class)
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering printf("\t Root: %s\n", i->root_directory);
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering show_scope_cgroup(bus, i->scope, i->leader);
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poetteringstatic int show_info(const char *verb, sd_bus *bus, const char *path, bool *new_line) {
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering static const struct bus_properties_map map[] = {
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering { "Name", "s", NULL, offsetof(MachineStatusInfo, name) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "Class", "s", NULL, offsetof(MachineStatusInfo, class) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "Service", "s", NULL, offsetof(MachineStatusInfo, service) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "Scope", "s", NULL, offsetof(MachineStatusInfo, scope) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "RootDirectory", "s", NULL, offsetof(MachineStatusInfo, root_directory) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "Leader", "u", NULL, offsetof(MachineStatusInfo, leader) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "Timestamp", "t", NULL, offsetof(MachineStatusInfo, timestamp) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering { "Id", "ay", bus_map_id128, offsetof(MachineStatusInfo, id) },
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering "org.freedesktop.machine1",
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering log_error("Could not get properties: %s", strerror(-r));
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poetteringstatic int show_properties(sd_bus *bus, const char *path, bool *new_line) {
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering r = bus_print_all_properties(bus, "org.freedesktop.machine1", path, arg_property, arg_all);
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering log_error("Could not get properties: %s", strerror(-r));
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poetteringstatic int show(sd_bus *bus, char **args, unsigned n) {
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering /* If no argument is specified, inspect the manager
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering r = show_properties(bus, "/org/freedesktop/machine1", &new_line);
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering log_error("Failed to query properties: %s", strerror(-r));
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering for (i = 1; i < n; i++) {
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering "org.freedesktop.machine1",
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering "org.freedesktop.machine1.Manager",
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering log_error("Could not get path to machine: %s", bus_error_message(&error, -r));
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering r = sd_bus_message_read(reply, "o", &path);
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering r = show_info(args[0], bus, path, &new_line);
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poetteringstatic int kill_machine(sd_bus *bus, char **args, unsigned n) {
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering for (i = 1; i < n; i++) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering "org.freedesktop.machine1",
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering "org.freedesktop.machine1.Manager",
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering "KillMachine",
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering "ssi", args[i], arg_kill_who, arg_signal);
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering log_error("Could not kill machine: %s", bus_error_message(&error, -r));
9d12709626bccc0cae677a7035f62efe6aabb4abLennart Poetteringstatic int terminate_machine(sd_bus *bus, char **args, unsigned n) {
9d12709626bccc0cae677a7035f62efe6aabb4abLennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering for (i = 1; i < n; i++) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering "org.freedesktop.machine1",
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering "org.freedesktop.machine1.Manager",
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering "TerminateMachine",
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering log_error("Could not terminate machine: %s", bus_error_message(&error, -r));
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poetteringstatic int openpt_in_namespace(pid_t pid, int flags) {
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering _cleanup_close_ int nsfd = -1, rootfd = -1;
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering _cleanup_free_ char *ns = NULL, *root = NULL;
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering _cleanup_close_pipe_ int sock[2] = { -1, -1 };
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering r = asprintf(&ns, "/proc/%lu/ns/mnt", (unsigned long) pid);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering nsfd = open(ns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering r = asprintf(&root, "/proc/%lu/root", (unsigned long) pid);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering rootfd = open(root, O_RDONLY|O_NOCTTY|O_CLOEXEC|O_DIRECTORY);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sock) < 0)
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering memcpy(CMSG_DATA(cmsg), &master, sizeof(int));
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering if (recvmsg(sock[0], &mh, MSG_NOSIGNAL|MSG_CMSG_CLOEXEC) < 0)
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS || master < 0) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering return r < 0 ? r : -EIO;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int login_machine(sd_bus *bus, char **args, unsigned n) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL, *reply2 = NULL, *reply3 = NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_bus_unref_ sd_bus *container_bus = NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering if (arg_transport != BUS_TRANSPORT_LOCAL) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering log_error("Login only support on local machines.");
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1.Manager",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering log_error("Could not get path to machine: %s", bus_error_message(&error, -r));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering r = sd_bus_message_read(reply, "o", &path);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1",
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering "org.freedesktop.machine1.Machine",
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_error("Failed to retrieve PID of leader: %s", strerror(-r));
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering r = sd_bus_message_read(reply2, "u", &leader);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering master = openpt_in_namespace(leader, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NDELAY);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_error("Failed to acquire pseudo tty: %s", strerror(-master));
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering r = sd_bus_open_system_container(args[1], &container_bus);
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering log_error("Failed to get container bus: %s", strerror(-r));
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering getty = strjoin("container-getty@", p, ".service", NULL);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.systemd1.Manager",
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_error("Failed to start getty service: %s", bus_error_message(&error, r));
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering container_bus = sd_bus_unref(container_bus);
e7e9b6bb0b0bc5b1eb256a44f8afec6b634f26efZbigniew Jędrzejewski-Szmek assert_se(sigemptyset(&mask) == 0);
e7e9b6bb0b0bc5b1eb256a44f8afec6b634f26efZbigniew Jędrzejewski-Szmek sigset_add_many(&mask, SIGWINCH, SIGTERM, SIGINT, -1);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_info("Connected to container %s. Press ^] three times within 1s to exit session.", args[1]);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_error("Failed to process pseudo tty: %s", strerror(-r));
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering log_info("Connection to container %s terminated.", args[1]);
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poetteringstatic int help(void) {
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering printf("%s [OPTIONS...] {COMMAND} ...\n\n"
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering "Send control commands to or query the virtual machine and container registration manager.\n\n"
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering " -h --help Show this help\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " --version Show package version\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " --no-pager Do not pipe output into a pager\n"
a6c616024db23fef34152c1432892824a07799ccLennart Poettering " --no-ask-password Don't prompt for password\n"
a6c616024db23fef34152c1432892824a07799ccLennart Poettering " -H --host=[USER@]HOST Operate on remote host\n"
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen " -M --machine=CONTAINER Operate on local container\n"
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen " -p --property=NAME Show only properties by this name\n"
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering " -a --all Show all properties, including empty ones\n"
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering " -l --full Do not ellipsize output\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " --kill-who=WHO Who to send signal to\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " -s --signal=SIGNAL Which signal to send\n\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " list List running VMs and containers\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " status [NAME...] Show VM/container status\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " show [NAME...] Show properties of one or more VMs/containers\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " terminate [NAME...] Terminate one or more VMs/containers\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " kill [NAME...] Send signal to processes of a VM/container\n"
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt " login [NAME] Get a login prompt on a container\n",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int parse_argv(int argc, char *argv[]) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "property", required_argument, NULL, 'p' },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "no-pager", no_argument, NULL, ARG_NO_PAGER },
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering { "kill-who", required_argument, NULL, ARG_KILL_WHO },
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering { "signal", required_argument, NULL, 's' },
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering { "host", required_argument, NULL, 'H' },
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering { "machine", required_argument, NULL, 'M' },
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering while ((c = getopt_long(argc, argv, "hp:als:H:M:", options, NULL)) >= 0) {
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering /* If the user asked for a particular
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen * property, show it to him, even if it is
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poettering arg_signal = signal_from_string_try_harder(optarg);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering log_error("Failed to parse signal string %s.", optarg);
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringstatic int machinectl_main(sd_bus *bus, int argc, char *argv[]) {
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering static const struct {
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering int (* const dispatch)(sd_bus *bus, char **args, unsigned n);
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering { "terminate", MORE, 2, terminate_machine },
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering /* Special rule: no arguments means "list" */
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering log_error("Unknown operation %s", argv[optind]);
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering log_error("Invalid number of arguments.");
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering assert_not_reached("Unknown comparison operator.");
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering return verbs[i].dispatch(bus, argv + optind, left);
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering r = bus_open_transport(arg_transport, arg_host, false, &bus);
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering log_error("Failed to create bus connection: %s", strerror(-r));