machinectl.c revision 0b452006de98294d1690f045f6ea2f7f6630ec3b
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering This file is part of systemd.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Copyright 2013 Lennart Poettering
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is free software; you can redistribute it and/or modify it
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering under the terms of the GNU Lesser General Public License as published by
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering (at your option) any later version.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering systemd is distributed in the hope that it will be useful, but
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering Lesser General Public License for more details.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering You should have received a copy of the GNU Lesser General Public License
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_all = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_full = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_no_pager = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_legend = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_read_only = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_mkdir = false;
4b95f1798f22c1bb75295f448188560cb6ec9eceLennart Poetteringstatic bool arg_quiet = false;
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poetteringstatic bool arg_ask_password = true;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic OutputMode arg_output = OUTPUT_SHORT;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic bool arg_force = false;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic const char* arg_dkr_index_url = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic void pager_open_if_enabled(void) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poetteringstatic void polkit_agent_open_if_enabled(void) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering /* Open the polkit agent as a child process if necessary */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poetteringstatic OutputFlags get_output_flags(void) {
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering (!on_tty() || pager_have()) * OUTPUT_FULL_WIDTH |
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidttypedef struct MachineInfo {
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poetteringstatic int compare_machine_info(const void *a, const void *b) {
90ab504273a7f186ebb76e6acfb778b4e0d7c91bLennart Poettering const MachineInfo *x = a, *y = b;
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidtstatic int list_machines(int argc, char *argv[], void *userdata) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering size_t max_name = strlen("MACHINE"), max_class = strlen("CLASS"), max_service = strlen("SERVICE");
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack "org.freedesktop.machine1",
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack "org.freedesktop.machine1.Manager",
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack "ListMachines",
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack if (r < 0) {
b4f1862df2e45aba90386887d685b8bf3c840e10Daniel Mack log_error("Could not get machines: %s", bus_error_message(&error, -r));
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = sd_bus_message_enter_container(reply, 'a', "(ssso)");
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering while ((r = sd_bus_message_read(reply, "(ssso)", &name, &class, &service, &object)) > 0) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering if (!GREEDY_REALLOC(machines, n_allocated, n_machines + 1))
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering qsort_safe(machines, n_machines, sizeof(MachineInfo), compare_machine_info);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering for (j = 0; j < n_machines; j++)
6f4dedb250f2d607eceefaa491f338becbeee7c0Tom Gundersen printf("\n%zu machines listed.\n", n_machines);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringtypedef struct ImageInfo {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int compare_image_info(const void *a, const void *b) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const ImageInfo *x = a, *y = b;
4b95f1798f22c1bb75295f448188560cb6ec9eceLennart Poetteringstatic int list_images(int argc, char *argv[], void *userdata) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering size_t max_name = strlen("NAME"), max_type = strlen("TYPE"), max_size = strlen("USAGE"), max_crtime = strlen("CREATED"), max_mtime = strlen("MODIFIED");
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering "org.freedesktop.machine1",
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering "org.freedesktop.machine1.Manager",
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering log_error("Could not get images: %s", bus_error_message(&error, -r));
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssbttto)");
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering while ((r = sd_bus_message_read(reply, "(ssbttto)", &name, &type, &read_only, &crtime, &mtime, &size, &object)) > 0) {
19b50b5ba7ee8c1bfb330377309e4bab7a7531d8Lennart Poettering char buf[MAX(FORMAT_TIMESTAMP_MAX, FORMAT_BYTES_MAX)];
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen if (!GREEDY_REALLOC(images, n_allocated, n_images + 1))
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering l = strlen(strna(format_timestamp(buf, sizeof(buf), crtime)));
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering l = strlen(strna(format_timestamp(buf, sizeof(buf), mtime)));
bda2c408f8a739c19161818bcc842107f60652a2Tom Gundersen l = strlen(strna(format_bytes(buf, sizeof(buf), size)));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_bus_message_exit_container(reply);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering qsort_safe(images, n_images, sizeof(ImageInfo), compare_image_info);
a51c10485af349eb15faa4d1a63b9818bcf3e589Lennart Poettering printf("%-*s %-*s %-3s %-*s %-*s %-*s\n",
0dd25fb9f005d8ab7ac4bc10a609d00569f8c56aLennart Poettering for (j = 0; j < n_images; j++) {
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering char crtime_buf[FORMAT_TIMESTAMP_MAX], mtime_buf[FORMAT_TIMESTAMP_MAX], size_buf[FORMAT_BYTES_MAX];
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering printf("%-*s %-*s %s%-3s%s %-*s %-*s %-*s\n",
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering images[j].read_only ? ansi_highlight_red() : "", yes_no(images[j].read_only), images[j].read_only ? ansi_highlight_off() : "",
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (int) max_size, strna(format_bytes(size_buf, sizeof(size_buf), images[j].size)),
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (int) max_crtime, strna(format_timestamp(crtime_buf, sizeof(crtime_buf), images[j].crtime)),
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (int) max_mtime, strna(format_timestamp(mtime_buf, sizeof(mtime_buf), images[j].mtime)));
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering printf("\n%zu images listed.\n", n_images);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_transport == BUS_TRANSPORT_REMOTE)
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering endswith(unit, ".scope") ? "org.freedesktop.systemd1.Scope" : "org.freedesktop.systemd1.Service",
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering "ControlGroup",
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering log_error("Failed to query ControlGroup: %s", bus_error_message(&error, -r));
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering r = sd_bus_message_read(reply, "s", &cgroup);
2c27fbca2d88214bd305272308a370a962818f1eLennart Poettering if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup, false) != 0 && leader <= 0)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering show_cgroup_and_extra(SYSTEMD_CGROUP_CONTROLLER, cgroup, "\t\t ", c, false, &leader, leader > 0, get_output_flags());
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int print_addresses(sd_bus *bus, const char *name, int ifi, const char *prefix, const char *prefix2) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "org.freedesktop.machine1",
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering "org.freedesktop.machine1.Manager",
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering "GetMachineAddresses",
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_bus_message_enter_container(reply, 'a', "(iay)");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering while ((r = sd_bus_message_enter_container(reply, 'r', "iay")) > 0) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const void *a;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering char buffer[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_bus_message_read(reply, "i", &family);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_bus_message_read_array(reply, 'y', &a, &sz);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering fputs(inet_ntop(family, a, buffer, sizeof(buffer)), stdout);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering r = sd_bus_message_exit_container(reply);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering r = sd_bus_message_exit_container(reply);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int print_os_release(sd_bus *bus, const char *name, const char *prefix) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering "org.freedesktop.machine1",
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering "org.freedesktop.machine1.Manager",
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering "GetMachineOSRelease",
78c6a153c47f8d597c827bdcaf8c4e42ac87f738Lennart Poettering r = sd_bus_message_enter_container(reply, 'a', "{ss}");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering while ((r = sd_bus_message_read(reply, "{ss}", &k, &v)) > 0) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = sd_bus_message_exit_container(reply);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering if (!sd_id128_equal(i->id, SD_ID128_NULL))
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering printf("(" SD_ID128_FORMAT_STR ")\n", SD_ID128_FORMAT_VAL(i->id));
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering s1 = format_timestamp_relative(since1, sizeof(since1), i->timestamp.realtime);
4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4Lennart Poettering s2 = format_timestamp(since2, sizeof(since2), i->timestamp.realtime);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering printf("\t Leader: %u", (unsigned) i->leader);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering } else if (i->class)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering printf("\t Root: %s\n", i->root_directory);
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering for (c = 0; c < i->n_netif; c++) {
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering "\t Address: ",
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering print_os_release(bus, i->name, "\t OS: ");
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering show_unit_cgroup(bus, i->unit, i->leader);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (arg_transport == BUS_TRANSPORT_LOCAL) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering get_output_flags() | OUTPUT_BEGIN_NEWLINE,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringstatic int map_netif(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering const void *v;
return -EBADMSG;
if (!i->netif)
return -ENOMEM;
path,
map,
&info);
if (*new_line)
*new_line = true;
if (*new_line)
*new_line = true;
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
&reply,
return bus_log_parse_error(r);
if (properties)
typedef struct ImageStatusInfo {
char *name;
char *path;
char *type;
int read_only;
assert(i);
if (i->name) {
if (i->type)
if (i->path)
else if (s2)
else if (s2)
s4 = i->usage_exclusive != i->usage ? format_bytes(bs_exclusive, sizeof(bs_exclusive), i->usage_exclusive) : NULL;
else if (s3)
s4 = i->limit_exclusive != i->limit ? format_bytes(bs_exclusive, sizeof(bs_exclusive), i->limit_exclusive) : NULL;
else if (s3)
path,
map,
&info);
if (*new_line)
*new_line = true;
typedef struct PoolStatusInfo {
char *path;
if (i->path)
"/org/freedesktop/machine1",
map,
&info);
if (*new_line)
*new_line = true;
if (properties)
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
&reply,
return bus_log_parse_error(r);
if (properties)
if (!arg_kill_who)
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
bool copy_from;
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
static int on_machine_removed(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
assert(m);
if (*forward) {
char last_char = 0;
bool machine_died;
return -EOPNOTSUPP;
"path='/org/freedesktop/machine1',",
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
&reply,
return bus_log_parse_error(r);
if (machine_died)
return ret;
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
return -EINVAL;
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
return log_oom();
const char *object;
return -EINVAL;
return log_oom();
if (!unit)
return log_oom();
r = sd_bus_call_method(
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&error,
&reply,
return bus_log_parse_error(r);
return log_oom();
int carries_install_info = 0;
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
method);
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
return log_oom();
if (!unit)
return log_oom();
return bus_log_create_error(r);
r = sd_bus_message_close_container(m);
return bus_log_create_error(r);
return bus_log_create_error(r);
return bus_log_parse_error(r);
r = sd_bus_call_method(
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&error,
NULL,
NULL);
unsigned priority;
assert(m);
static int match_transfer_removed(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
assert(m);
static int transfer_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
assert(s);
if (!arg_quiet)
log_info("Continuing download in the background. Use \"machinectl cancel-transfer %" PRIu32 "\" to abort transfer.", PTR_TO_UINT32(userdata));
assert(m);
r = sd_bus_add_match(
bus,
"path='/org/freedesktop/import1'",
r = sd_bus_add_match(
bus,
return bus_log_parse_error(r);
if (!arg_quiet)
else if (path)
if (!local) {
return -EINVAL;
return log_oom();
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
else if (path)
if (!local) {
return -EINVAL;
return log_oom();
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
static void determine_compression_from_filename(const char *p) {
if (arg_format)
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
local = l;
if (local) {
return log_oom();
return -EINVAL;
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
local = l;
if (local) {
return log_oom();
return -EINVAL;
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
if (tag) {
tag++;
return -EINVAL;
return -EINVAL;
if (local)
local++;
if (local) {
return -EINVAL;
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
tag,
return bus_log_create_error(r);
typedef struct TransferInfo {
const char *type;
const char *remote;
const char *local;
double progress;
} TransferInfo;
static int compare_transfer_info(const void *a, const void *b) {
const TransferInfo *x = a, *y = b;
double progress;
r = sd_bus_call_method(
bus,
"/org/freedesktop/import1",
&error,
&reply,
NULL);
return bus_log_parse_error(r);
while ((r = sd_bus_message_read(reply, "(usssdo)", &id, &type, &remote, &local, &progress, &object)) > 0) {
size_t l;
return log_oom();
if (l > max_type)
max_type = l;
if (l > max_remote)
max_remote = l;
if (l > max_local)
max_local = l;
n_transfers ++;
return bus_log_parse_error(r);
return bus_log_parse_error(r);
if (arg_legend)
for (j = 0; j < n_transfers; j++)
if (arg_legend)
r = sd_bus_call_method(
bus,
"/org/freedesktop/import1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
" show NAME... Show properties of one or more VMs/containers\n"
" terminate NAME... Terminate one or more VMs/containers\n"
case ARG_VERSION:
return log_oom();
arg_all = true;
arg_all = true;
arg_full = true;
return -EINVAL;
if (arg_output < 0) {
return -EINVAL;
case ARG_NO_PAGER:
arg_no_pager = true;
case ARG_NO_LEGEND:
arg_legend = false;
case ARG_KILL_WHO:
if (arg_signal < 0) {
return -EINVAL;
case ARG_NO_ASK_PASSWORD:
arg_ask_password = false;
case ARG_READ_ONLY:
arg_read_only = true;
case ARG_MKDIR:
arg_mkdir = true;
arg_quiet = true;
case ARG_VERIFY:
if (arg_verify < 0) {
return -EINVAL;
case ARG_FORCE:
arg_force = true;
case ARG_DKR_INDEX_URL:
return -EINVAL;
case ARG_FORMAT:
return -EINVAL;
return -EINVAL;
log_open();
goto finish;
goto finish;
pager_close();