X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachinectl.c;h=053c8fbbe78d8181f908dd810652092673f3b54d;hb=19e887e709c31ee4366ec44a770d3963cd48cb86;hp=c1cc5e7eb53029e1f5eb738b792c23ececa42ae3;hpb=90adaa25e894a580930ef2c3e65ab8db8295515a;p=elogind.git diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index c1cc5e7eb..053c8fbbe 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -32,12 +32,6 @@ #include #include -/* When we include libgen.h because we need dirname() we immediately - * undefine basename() since libgen.h defines it as a macro to the XDG - * version which is really broken. */ -#include -#undef basename - #include "sd-bus.h" #include "log.h" #include "util.h" @@ -975,15 +969,13 @@ static int poweroff_machine(int argc, char *argv[], void *userdata) { static int terminate_machine(int argc, char *argv[], void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int i; + int r, i; assert(bus); polkit_agent_open_if_enabled(); for (i = 1; i < argc; i++) { - int r; - r = sd_bus_call_method( bus, "org.freedesktop.machine1", @@ -1002,141 +994,35 @@ static int terminate_machine(int argc, char *argv[], void *userdata) { return 0; } -static int machine_get_leader(sd_bus *bus, const char *name, pid_t *ret) { +static int copy_files(int argc, char *argv[], void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - _cleanup_bus_message_unref_ sd_bus_message *reply = NULL, *reply2 = NULL; - const char *object; - uint32_t leader; + sd_bus *bus = userdata; + bool copy_from; int r; assert(bus); - assert(name); - assert(ret); + + polkit_agent_open_if_enabled(); + + copy_from = streq(argv[0], "copy-from"); r = sd_bus_call_method( bus, "org.freedesktop.machine1", "/org/freedesktop/machine1", "org.freedesktop.machine1.Manager", - "GetMachine", + copy_from ? "CopyFromMachine" : "CopyToMachine", &error, - &reply, - "s", name); + NULL, + "sss", + argv[1], + argv[2], + argv[3]); if (r < 0) { - log_error("Could not get path to machine: %s", bus_error_message(&error, -r)); + log_error("Failed to copy: %s", bus_error_message(&error, -r)); return r; } - r = sd_bus_message_read(reply, "o", &object); - if (r < 0) - return bus_log_parse_error(r); - - r = sd_bus_get_property( - bus, - "org.freedesktop.machine1", - object, - "org.freedesktop.machine1.Machine", - "Leader", - &error, - &reply2, - "u"); - if (r < 0) - return log_error_errno(r, "Failed to retrieve PID of leader: %m"); - - r = sd_bus_message_read(reply2, "u", &leader); - if (r < 0) - return bus_log_parse_error(r); - - *ret = leader; - return 0; -} - -static int copy_files(int argc, char *argv[], void *userdata) { - char *dest, *host_path, *container_path, *host_dirname, *host_basename, *container_dirname, *container_basename, *t; - _cleanup_close_ int hostfd = -1; - sd_bus *bus = userdata; - pid_t child, leader; - bool copy_from; - siginfo_t si; - int r; - - assert(bus); - - copy_from = streq(argv[0], "copy-from"); - dest = argv[3] ?: argv[2]; - host_path = strdupa(copy_from ? dest : argv[2]); - container_path = strdupa(copy_from ? argv[2] : dest); - - if (!path_is_absolute(container_path)) { - log_error("Container path not absolute."); - return -EINVAL; - } - - t = strdupa(host_path); - host_basename = basename(t); - host_dirname = dirname(host_path); - - t = strdupa(container_path); - container_basename = basename(t); - container_dirname = dirname(container_path); - - r = machine_get_leader(bus, argv[1], &leader); - if (r < 0) - return r; - - hostfd = open(host_dirname, O_CLOEXEC|O_RDONLY|O_NOCTTY|O_DIRECTORY); - if (r < 0) - return log_error_errno(errno, "Failed to open source directory: %m"); - - child = fork(); - if (child < 0) - return log_error_errno(errno, "Failed to fork(): %m"); - - if (child == 0) { - int containerfd; - const char *q; - int mntfd; - - q = procfs_file_alloca(leader, "ns/mnt"); - mntfd = open(q, O_RDONLY|O_NOCTTY|O_CLOEXEC); - if (mntfd < 0) { - log_error_errno(errno, "Failed to open mount namespace of leader: %m"); - _exit(EXIT_FAILURE); - } - - if (setns(mntfd, CLONE_NEWNS) < 0) { - log_error_errno(errno, "Failed to join namespace of leader: %m"); - _exit(EXIT_FAILURE); - } - - containerfd = open(container_dirname, O_CLOEXEC|O_RDONLY|O_NOCTTY|O_DIRECTORY); - if (containerfd < 0) { - log_error_errno(errno, "Failed top open destination directory: %m"); - _exit(EXIT_FAILURE); - } - - if (copy_from) - r = copy_tree_at(containerfd, container_basename, hostfd, host_basename, true); - else - r = copy_tree_at(hostfd, host_basename, containerfd, container_basename, true); - if (r < 0) { - log_error_errno(errno, "Failed to copy tree: %m"); - _exit(EXIT_FAILURE); - } - - _exit(EXIT_SUCCESS); - } - - r = wait_for_terminate(child, &si); - if (r < 0) - return log_error_errno(r, "Failed to wait for client: %m"); - if (si.si_code != CLD_EXITED) { - log_error("Client died abnormally."); - return -EIO; - } - if (si.si_status != EXIT_SUCCESS) - return -EIO; - return 0; } @@ -1147,6 +1033,8 @@ static int bind_mount(int argc, char *argv[], void *userdata) { assert(bus); + polkit_agent_open_if_enabled(); + r = sd_bus_call_method( bus, "org.freedesktop.machine1", @@ -1196,7 +1084,7 @@ static int on_machine_removed(sd_bus *bus, sd_bus_message *m, void *userdata, sd static int login_machine(int argc, char *argv[], void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *reply = NULL; + _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_slot_unref_ sd_bus_slot *slot = NULL; _cleanup_(pty_forward_freep) PTYForward *forward = NULL; _cleanup_event_unref_ sd_event *event = NULL; @@ -1237,24 +1125,15 @@ static int login_machine(int argc, char *argv[], void *userdata) { if (r < 0) return log_error_errno(r, "Failed to add machine removal match: %m"); - r = sd_bus_message_new_method_call(bus, - &m, - "org.freedesktop.machine1", - "/org/freedesktop/machine1", - "org.freedesktop.machine1.Manager", - "OpenMachineLogin"); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_message_append(m, "s", argv[1]); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_call(bus, m, 0, &error, &reply); + r = sd_bus_call_method( + bus, + "org.freedesktop.machine1", + "/org/freedesktop/machine1", + "org.freedesktop.machine1.Manager", + "OpenMachineLogin", + &error, + &reply, + "s", argv[1]); if (r < 0) { log_error("Failed to get machine PTY: %s", bus_error_message(&error, -r)); return r; @@ -1419,7 +1298,7 @@ static int start_machine(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *reply = NULL; + _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_free_ char *e = NULL, *unit = NULL; const char *object; @@ -1436,25 +1315,15 @@ static int start_machine(int argc, char *argv[], void *userdata) { if (!unit) return log_oom(); - r = sd_bus_message_new_method_call( + r = sd_bus_call_method( bus, - &m, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "StartUnit"); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_message_append(m, "ss", unit, "fail"); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_call(bus, m, 0, &error, &reply); + "StartUnit", + &error, + &reply, + "ss", unit, "fail"); if (r < 0) { log_error("Failed to start unit: %s", bus_error_message(&error, -r)); return r; @@ -1500,10 +1369,6 @@ static int enable_machine(int argc, char *argv[], void *userdata) { if (r < 0) return bus_log_create_error(r); - r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password); - if (r < 0) - return bus_log_create_error(r); - r = sd_bus_message_open_container(m, 'a', "s"); if (r < 0) return bus_log_create_error(r); @@ -1556,23 +1421,15 @@ static int enable_machine(int argc, char *argv[], void *userdata) { if (r < 0) return r; - m = sd_bus_message_unref(m); - - r = sd_bus_message_new_method_call( + r = sd_bus_call_method( bus, - &m, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "Reload"); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password); - if (r < 0) - return bus_log_create_error(r); - - r = sd_bus_call(bus, m, 0, &error, NULL); + "Reload", + &error, + NULL, + NULL); if (r < 0) { log_error("Failed to reload daemon: %s", bus_error_message(&error, -r)); return r; @@ -1661,10 +1518,6 @@ static int pull_image_common(sd_bus *bus, sd_bus_message *m) { if (r < 0) return log_error_errno(r, "Failed to attach bus to event loop: %m"); - r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password); - if (r < 0) - return bus_log_create_error(r); - r = sd_bus_add_match( bus, &slot_job_removed, @@ -2337,6 +2190,8 @@ int main(int argc, char*argv[]) { goto finish; } + sd_bus_set_allow_interactive_authorization(bus, arg_ask_password); + r = machinectl_main(argc, argv, bus); finish: