summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2010-09-27 12:00:10 +0100
committerRichard W.M. Jones <rjones@redhat.com>2010-09-27 12:04:44 +0100
commit7e4bf29fdf3067f3e83cd818a79ee522ae28e7ef (patch)
tree469c0233fa23eb68c26b1da9faa3040888c0e5fe /daemon
parente65f5213637e71f6f88763ce177fd23c65e1033d (diff)
downloadlibguestfs-7e4bf29fdf3067f3e83cd818a79ee522ae28e7ef.tar.gz
libguestfs-7e4bf29fdf3067f3e83cd818a79ee522ae28e7ef.tar.xz
libguestfs-7e4bf29fdf3067f3e83cd818a79ee522ae28e7ef.zip
New API: pread-device, partial read for devices.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/file.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/daemon/file.c b/daemon/file.c
index 5bc5f412..c16a00a2 100644
--- a/daemon/file.c
+++ b/daemon/file.c
@@ -408,20 +408,22 @@ do_read_file (const char *path, size_t *size_r)
return r;
}
-char *
-do_pread (const char *path, int count, int64_t offset, size_t *size_r)
+static char *
+pread_fd (int fd, int count, int64_t offset, size_t *size_r,
+ const char *display_path)
{
- int fd;
ssize_t r;
char *buf;
if (count < 0) {
reply_with_error ("count is negative");
+ close (fd);
return NULL;
}
if (offset < 0) {
reply_with_error ("offset is negative");
+ close (fd);
return NULL;
}
@@ -431,16 +433,8 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r)
* will be caught later when we try to serialize the message.
*/
if (count >= GUESTFS_MESSAGE_MAX) {
- reply_with_error ("%s: count is too large for the protocol, use smaller reads", path);
- return NULL;
- }
-
- CHROOT_IN;
- fd = open (path, O_RDONLY);
- CHROOT_OUT;
-
- if (fd == -1) {
- reply_with_perror ("open: %s", path);
+ reply_with_error ("%s: count is too large for the protocol, use smaller reads", display_path);
+ close (fd);
return NULL;
}
@@ -453,14 +447,14 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r)
r = pread (fd, buf, count, offset);
if (r == -1) {
- reply_with_perror ("pread: %s", path);
+ reply_with_perror ("pread: %s", display_path);
close (fd);
free (buf);
return NULL;
}
if (close (fd) == -1) {
- reply_with_perror ("close: %s", path);
+ reply_with_perror ("close: %s", display_path);
close (fd);
free (buf);
return NULL;
@@ -473,6 +467,35 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r)
return buf;
}
+char *
+do_pread (const char *path, int count, int64_t offset, size_t *size_r)
+{
+ int fd;
+
+ CHROOT_IN;
+ fd = open (path, O_RDONLY);
+ CHROOT_OUT;
+
+ if (fd == -1) {
+ reply_with_perror ("open: %s", path);
+ return NULL;
+ }
+
+ return pread_fd (fd, count, offset, size_r, path);
+}
+
+char *
+do_pread_device (const char *device, int count, int64_t offset, size_t *size_r)
+{
+ int fd = open (device, O_RDONLY);
+ if (fd == -1) {
+ reply_with_perror ("open: %s", device);
+ return NULL;
+ }
+
+ return pread_fd (fd, count, offset, size_r, device);
+}
+
static int
pwrite_fd (int fd, const char *content, size_t size, int64_t offset,
const char *display_path)