New API: write-append
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 14 Jul 2011 17:18:07 +0000 (18:18 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Thu, 14 Jul 2011 17:18:07 +0000 (18:18 +0100)
Append content to the end of a file.

daemon/file.c
generator/generator_actions.ml
src/MAX_PROC_NR

index e3a3c30..691f917 100644 (file)
@@ -1,5 +1,5 @@
 /* libguestfs - the guestfsd daemon
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009-2011 Red Hat Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -349,6 +349,34 @@ do_write (const char *path, const char *content, size_t size)
   return 0;
 }
 
+int
+do_write_append (const char *path, const char *content, size_t size)
+{
+  int fd;
+
+  CHROOT_IN;
+  fd = open (path, O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY, 0666);
+  CHROOT_OUT;
+
+  if (fd == -1) {
+    reply_with_perror ("open: %s", path);
+    return -1;
+  }
+
+  if (xwrite (fd, content, size) == -1) {
+    reply_with_perror ("write");
+    close (fd);
+    return -1;
+  }
+
+  if (close (fd) == -1) {
+    reply_with_perror ("close: %s", path);
+    return -1;
+  }
+
+  return 0;
+}
+
 char *
 do_read_file (const char *path, size_t *size_r)
 {
index ebde9c9..1ccacdb 100644 (file)
@@ -5414,7 +5414,9 @@ to ensure the length of the file is exactly C<len> bytes.");
    "create a new file",
    "\
 This call creates a file called C<path>.  The content of the
-file is the string C<content> (which can contain any 8 bit data).");
+file is the string C<content> (which can contain any 8 bit data).
+
+See also C<guestfs_write_append>.");
 
   ("pwrite", (RInt "nbytes", [Pathname "path"; BufferIn "content"; Int64 "offset"], []), 247, [ProtocolLimitWarning],
    [InitScratchFS, Always, TestOutput (
@@ -6066,6 +6068,20 @@ is resized to the maximum size.
 
 See also L<btrfs(8)>.");
 
+  ("write_append", (RErr, [Pathname "path"; BufferIn "content"], []), 290, [ProtocolLimitWarning],
+   [InitScratchFS, Always, TestOutput (
+      [["write"; "/write_append"; "line1\n"];
+       ["write_append"; "/write_append"; "line2\n"];
+       ["write_append"; "/write_append"; "line3a"];
+       ["write_append"; "/write_append"; "line3b\n"];
+       ["cat"; "/write_append"]], "line1\nline2\nline3aline3b\n")],
+   "append content to end of file",
+   "\
+This call appends C<content> to the end of file C<path>.  If
+C<path> does not exist, then a new file is created.
+
+See also C<guestfs_write>.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions
index 336dd5e..8408670 100644 (file)
@@ -1 +1 @@
-289
+290