machinectl: Add plumbing for a --force flag for file copy
machine: Add APIs CopyTo[Machine]WithFlags + CopyFrom[Machine]WithFlags - Same API to those without `WithFlags` (except this can take flags) - Initially, only a flag to allow replacing a file if it already exists
This commit is contained in:
@@ -928,6 +928,20 @@ int bus_machine_method_copy(sd_bus_message *message, void *userdata, sd_bus_erro
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (endswith(sd_bus_message_get_member(message), "WithFlags")) {
|
||||
uint64_t raw_flags;
|
||||
|
||||
r = sd_bus_message_read(message, "t", &raw_flags);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if ((raw_flags & ~_MACHINE_COPY_FLAGS_MASK_PUBLIC) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (raw_flags & MACHINE_COPY_REPLACE)
|
||||
copy_flags |= COPY_REPLACE;
|
||||
}
|
||||
|
||||
if (!path_is_absolute(src))
|
||||
return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Source path must be absolute.");
|
||||
|
||||
@@ -1328,6 +1342,16 @@ static const sd_bus_vtable machine_vtable[] = {
|
||||
SD_BUS_NO_RESULT,
|
||||
bus_machine_method_copy,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD_WITH_ARGS("CopyFromWithFlags",
|
||||
SD_BUS_ARGS("s", source, "s", destination, "t", flags),
|
||||
SD_BUS_NO_RESULT,
|
||||
bus_machine_method_copy,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD_WITH_ARGS("CopyToWithFlags",
|
||||
SD_BUS_ARGS("s", source, "s", destination, "t", flags),
|
||||
SD_BUS_NO_RESULT,
|
||||
bus_machine_method_copy,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD_WITH_ARGS("OpenRootDirectory",
|
||||
SD_BUS_NO_ARGS,
|
||||
SD_BUS_RESULT("h", fd),
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
#include "bus-util.h"
|
||||
#include "machine.h"
|
||||
|
||||
typedef enum {
|
||||
MACHINE_COPY_REPLACE = 1 << 0, /* Public API via DBUS, do not change */
|
||||
_MACHINE_COPY_FLAGS_MASK_PUBLIC = MACHINE_COPY_REPLACE,
|
||||
} MachineCopyFlags;
|
||||
|
||||
extern const BusObjectImplementation machine_object;
|
||||
|
||||
char *machine_bus_path(Machine *s);
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "locale-util.h"
|
||||
#include "log.h"
|
||||
#include "logs-show.h"
|
||||
#include "machine-dbus.h"
|
||||
#include "macro.h"
|
||||
#include "main-func.h"
|
||||
#include "mkdir.h"
|
||||
@@ -1093,6 +1094,13 @@ static int terminate_machine(int argc, char *argv[], void *userdata) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *select_copy_method(bool copy_from, bool force) {
|
||||
if (force)
|
||||
return copy_from ? "CopyFromMachineWithFlags" : "CopyToMachineWithFlags";
|
||||
else
|
||||
return copy_from ? "CopyFromMachine" : "CopyToMachine";
|
||||
}
|
||||
|
||||
static int copy_files(int argc, char *argv[], void *userdata) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
||||
@@ -1123,7 +1131,7 @@ static int copy_files(int argc, char *argv[], void *userdata) {
|
||||
bus,
|
||||
&m,
|
||||
bus_machine_mgr,
|
||||
copy_from ? "CopyFromMachine" : "CopyToMachine");
|
||||
select_copy_method(copy_from, arg_force));
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
@@ -1136,6 +1144,12 @@ static int copy_files(int argc, char *argv[], void *userdata) {
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
if (arg_force) {
|
||||
r = sd_bus_message_append(m, "t", MACHINE_COPY_REPLACE);
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
}
|
||||
|
||||
/* This is a slow operation, hence turn off any method call timeouts */
|
||||
r = sd_bus_call(bus, m, USEC_INFINITY, &error, NULL);
|
||||
if (r < 0)
|
||||
|
||||
@@ -1110,6 +1110,16 @@ const sd_bus_vtable manager_vtable[] = {
|
||||
SD_BUS_NO_RESULT,
|
||||
method_copy_machine,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD_WITH_ARGS("CopyFromMachineWithFlags",
|
||||
SD_BUS_ARGS("s", name, "s", source, "s", destination, "t", flags),
|
||||
SD_BUS_NO_RESULT,
|
||||
method_copy_machine,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD_WITH_ARGS("CopyToMachineWithFlags",
|
||||
SD_BUS_ARGS("s", name, "s", source, "s", destination, "t", flags),
|
||||
SD_BUS_NO_RESULT,
|
||||
method_copy_machine,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD_WITH_ARGS("OpenMachineRootDirectory",
|
||||
SD_BUS_ARGS("s", name),
|
||||
SD_BUS_RESULT("h", fd),
|
||||
|
||||
Reference in New Issue
Block a user