On Tue, Jun 23, 2015 at 07:40:57PM +0200, Pino Toscano wrote:
In data martedì 23 giugno 2015 13:25:28, Richard W.M. Jones ha scritto:
This allows you to append one file to another:
copy-file-to-file /input.txt /output.txt append:true
will append the contents of /input.txt to /output.txt. --- daemon/copy.c | 38 +++++++++++++++++++++++++++++++------- generator/actions.ml | 29 +++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 15 deletions(-)
diff --git a/daemon/copy.c b/daemon/copy.c index bab00fe..6f3e844 100644 --- a/daemon/copy.c +++ b/daemon/copy.c @@ -30,7 +30,6 @@ #include "actions.h"
/* wrflags */ -#define DEST_FILE_FLAGS O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY|O_CLOEXEC, 0666 #define DEST_DEVICE_FLAGS O_WRONLY|O_CLOEXEC, 0
/* flags */ @@ -210,8 +209,13 @@ copy (const char *src, const char *src_display, int do_copy_device_to_device (const char *src, const char *dest, int64_t srcoffset, int64_t destoffset, int64_t size, - int sparse) + int sparse, int append) { + if ((optargs_bitmask & GUESTFS_COPY_DEVICE_TO_DEVICE_APPEND_BITMASK) && + append) { + reply_with_error ("the append flag cannot be set for this call"); + return -1; + } return copy (src, src, dest, dest, DEST_DEVICE_FLAGS, 0, srcoffset, destoffset, size, sparse); } @@ -219,23 +223,30 @@ do_copy_device_to_device (const char *src, const char *dest, int do_copy_device_to_file (const char *src, const char *dest, int64_t srcoffset, int64_t destoffset, int64_t size, - int sparse) + int sparse, int append) { CLEANUP_FREE char *dest_buf = sysroot_path (dest); + int wrflags = O_WRONLY|O_CREAT|O_NOCTTY|O_CLOEXEC;
Cannot DEST_FILE_FLAGS (without O_TRUNC, of course) be used here (and below) to avoid copying&pasting these attributes?
That was my original version. I just questioned whether the code was really any easier to read versus defining the set of O_ flags that we're all pretty familiar with.
tests = [ InitScratchFS, Always, TestResult ( [["mkdir"; "/copyff"]; ["write"; "/copyff/src"; "hello, world"]; - ["copy_file_to_file"; "/copyff/src"; "/copyff/dest"; ""; ""; ""; ""]; + ["copy_file_to_file"; "/copyff/src"; "/copyff/dest"; ""; ""; ""; ""; "false"]; ["read_file"; "/copyff/dest"]], "compare_buffers (ret, size, \"hello, world\", 12) == 0"), []; - let size = 1024 * 1024 in InitScratchFS, Always, TestResultTrue ( + let size = 1024 * 1024 in
This seems unused? Or is it supposed to be used and its usage has been forgotten?
[["mkdir"; "/copyff2"]; ["fill"; "0"; string_of_int size; "/copyff2/src"]; ["touch"; "/copyff2/dest"]; ["truncate_size"; "/copyff2/dest"; string_of_int size];
It's used here ^^ [...]
It would seem okay for me, although maybe we should decouple the enums for flags, so there's no need to add non-functional append flags to the *_to_device variants.
This is an assumption of the current code, if you look at: https://github.com/libguestfs/libguestfs/blob/master/daemon/copy.c#L39 Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into KVM guests. http://libguestfs.org/virt-v2v