diff options
author | Richard Jones <rjones@redhat.com> | 2010-05-18 21:51:05 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-05-20 10:30:12 +0100 |
commit | 3920ad95f6b2db8fbf20aa26692877a09070cb04 (patch) | |
tree | eb3ffe5779f720c96a33506d1b50807c430ca977 /daemon | |
parent | bda6cf75f259992bcba23c3c4c2339c50552f491 (diff) | |
download | libguestfs-3920ad95f6b2db8fbf20aa26692877a09070cb04.tar.gz libguestfs-3920ad95f6b2db8fbf20aa26692877a09070cb04.tar.xz libguestfs-3920ad95f6b2db8fbf20aa26692877a09070cb04.zip |
New API: write for creating files with fixed content (RHBZ#501889).
The guestfs_write call can be used to create small files with
arbitrary 8 bit content, including \0 bytes.
This replaces and deprecates write-file, which cannot be modified
to use BufferIn because of an unfortunate choice in the ABI: the
size parameter to write-file, if zero, means that the daemon tries
to calculate the length of the buffer using strlen. However this
fails if we pass a zero-length buffer using BufferIn because then
the daemon tries to do strlen on a (really) zero length buffer, not
even containing a terminating \0 character, thus segfaulting.
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/file.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/daemon/file.c b/daemon/file.c index 2399828e..7d37f569 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -314,6 +314,34 @@ do_write_file (const char *path, const char *content, int size) return 0; } +int +do_write (const char *path, const char *content, size_t size) +{ + int fd; + + CHROOT_IN; + fd = open (path, O_WRONLY | O_TRUNC | 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) { |