machinectl.c revision 34a6778fb9d1065f3fbb8e2243b9f0f25d1d18f1
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 Poettering log_error("Failed to parse reply: %s", strerror(-r));
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;
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering if (arg_transport == BUS_TRANSPORT_REMOTE)
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen "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);
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poettering log_error("Failed to parse reply: %s", strerror(-r));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering 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);
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poetteringstatic void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering 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));
e56056e93d33619a3acf13e483900b4f8938228fThomas Hindoe Paaboel Andersen s1 = format_timestamp_relative(since1, sizeof(since1), i->timestamp);
0b63e2789f984e84f40bf6e49f5da15c87298cedLennart Poettering s2 = format_timestamp(since2, sizeof(since2), i->timestamp);
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering printf("\t Leader: %u", (unsigned) i->leader);
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering } else if (i->class)
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering printf("\t Root: %s\n", i->root_directory);
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering show_scope_cgroup(bus, i->scope, i->leader);
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poetteringstatic int show_info(const char *verb, sd_bus *bus, const char *path, bool *new_line) {
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering static const struct bus_properties_map map[] = {
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart 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",
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart 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, path, arg_property, arg_all);
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poettering log_error("Could not get properties: %s", strerror(-r));
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart Poetteringstatic int show(sd_bus *bus, char **args, unsigned n) {
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering /* If no argument is specified, inspect the manager
10f9c75519671e7c7ab8993b54fe22da7c2d0c38Lennart Poettering r = show_properties(bus, "/org/freedesktop/machine1", &new_line);
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart Poettering log_error("Failed to query properties: %s", strerror(-r));
cd61c3bfd718fb398cc53ced906266a9297782c9Lennart 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));
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering r = sd_bus_message_read(reply, "o", &path);
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering log_error("Failed to parse reply: %s", strerror(-r));
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering r = show_properties(bus, path, &new_line);
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering r = show_info(args[0], bus, path, &new_line);
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poetteringstatic int kill_machine(sd_bus *bus, char **args, unsigned n) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering for (i = 1; i < n; i++) {
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering "org.freedesktop.machine1",
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poettering "org.freedesktop.machine1.Manager",
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering "KillMachine",
9d12709626bccc0cae677a7035f62efe6aabb4abLennart Poettering "ssi", args[i], arg_kill_who, arg_signal);
9d12709626bccc0cae677a7035f62efe6aabb4abLennart Poettering log_error("Could not kill machine: %s", bus_error_message(&error, -r));
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poetteringstatic int terminate_machine(sd_bus *bus, char **args, unsigned n) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering for (i = 1; i < n; i++) {
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart 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) {
0dd25fb9f005d8ab7ac4bc10a609d00569f8c56aLennart Poettering _cleanup_close_ int nsfd = -1, rootfd = -1;
0dd25fb9f005d8ab7ac4bc10a609d00569f8c56aLennart Poettering _cleanup_free_ char *ns = NULL, *root = NULL;
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering _cleanup_close_pipe_ int sock[2] = { -1, -1 };
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering r = asprintf(&ns, "/proc/%lu/ns/mnt", (unsigned long) pid);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering nsfd = open(ns, O_RDONLY|O_NOCTTY|O_CLOEXEC);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart 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)
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers 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;
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poetteringstatic int login_machine(sd_bus *bus, char **args, unsigned n) {
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart 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));
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering r = sd_bus_message_read(reply, "o", &path);
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_error("Failed to parse reply: %s", strerror(-r));
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart 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 log_error("Failed to parse reply: %s", strerror(-r));
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering master = openpt_in_namespace(leader, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NDELAY);
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart 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));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering getty = strjoin("container-getty@", p, ".service", NULL);
e7e9b6bb0b0bc5b1eb256a44f8afec6b634f26efZbigniew Jędrzejewski-Szmek "org.freedesktop.systemd1.Manager",
f48e75cb9a8112d35855c44a156934f2ee0edb2eLennart Poettering log_error("Failed to start getty service: %s", bus_error_message(&error, r));
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering sigset_add_many(&mask, SIGWINCH, SIGTERM, SIGINT, -1);
a6c616024db23fef34152c1432892824a07799ccLennart Poettering assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering log_info("Connected to container %s. Press ^] three times within 1s to exit session.", args[1]);
8b0cc9a36c8f92f010f2e8465942d2cd7c580d78Lennart Poettering log_error("Failed to process pseudo tty: %s", strerror(-r));
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers log_info("Connection to container %s terminated.", args[1]);
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic int help(void) {
56159e0d918e9a9be07988133bb2847779325de0Lennart Poettering printf("%s [OPTIONS...] {COMMAND} ...\n\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "Send control commands to or query the virtual machine and container registration manager.\n\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " -h --help Show this help\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " --version Show package version\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " --no-pager Do not pipe output into a pager\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " --no-ask-password Don't prompt for password\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " -H --host=[USER@]HOST Operate on remote host\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " -M --machine=CONTAINER Operate on local container\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " -p --property=NAME Show only properties by this name\n"
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt " -a --all Show all properties, including empty ones\n"
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt " -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"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " list List running VMs and containers\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " status [NAME...] Show VM/container status\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " show [NAME...] Show properties of one or more VMs/containers\n"
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering " terminate [NAME...] Terminate one or more VMs/containers\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " kill [NAME...] Send signal to processes of a VM/container\n"
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers " login [NAME] Get a login prompt on a container\n",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "property", required_argument, NULL, 'p' },
27e72d6b22890ba4a8cbc05c49667cd1cccf1461Simon Peeters { "no-pager", no_argument, NULL, ARG_NO_PAGER },
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen { "kill-who", required_argument, NULL, ARG_KILL_WHO },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "host", required_argument, NULL, 'H' },
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering { "machine", required_argument, NULL, 'M' },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering while ((c = getopt_long(argc, argv, "hp:als:H:M:", options, NULL)) >= 0) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering /* If the user asked for a particular
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering * property, show it to him, even if it is
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering arg_signal = signal_from_string_try_harder(optarg);
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering log_error("Failed to parse signal string %s.", optarg);
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart 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 },
c19de71113f956809995fc68817e055e9f61f607Lennart Poettering /* Special rule: no arguments means "list-sessions" */
fefdc04b38725457a91651218feb7000f6ccc1f4Lennart Poettering log_error("Unknown operation %s", argv[optind]);
b6b1849830f5e4a6065c3b0c993668e500c954d3Lennart 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));