[Libguestfs] [PATCH] daemon/Win32: Replace pread on platforms that don't have this function.

Richard W.M. Jones rjones at redhat.com
Wed Nov 25 12:19:14 UTC 2009


-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://et.redhat.com/~rjones/libguestfs/
See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html
-------------- next part --------------
>From 81982306dd5e8beb56e193ed69d840a1cb976d62 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Wed, 25 Nov 2009 11:59:20 +0000
Subject: [PATCH 1/2] daemon/Win32: Replace pread on platforms that don't have this function.

---
 daemon/configure.ac |    1 +
 daemon/file.c       |   20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/daemon/configure.ac b/daemon/configure.ac
index 89bd800..e70f05e 100644
--- a/daemon/configure.ac
+++ b/daemon/configure.ac
@@ -180,6 +180,7 @@ AC_CHECK_FUNCS([\
         lremovexattr \
         mknod \
         posix_fallocate \
+        pread \
         removexattr \
         setxattr \
         sync])
diff --git a/daemon/file.c b/daemon/file.c
index 252c02c..e6bbc19 100644
--- a/daemon/file.c
+++ b/daemon/file.c
@@ -402,6 +402,7 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r)
     return NULL;
   }
 
+#ifdef HAVE_PREAD
   r = pread (fd, buf, count, offset);
   if (r == -1) {
     reply_with_perror ("pread: %s", path);
@@ -409,6 +410,25 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r)
     free (buf);
     return NULL;
   }
+#else
+  if (lseek (fd, offset, SEEK_SET) == (off_t) -1) {
+    reply_with_perror ("lseek: %s", path);
+    close (fd);
+    free (buf);
+    return NULL;
+  }
+  r = read (fd, buf, count);
+  if (r == -1) {
+    reply_with_perror ("read: %s", path);
+    close (fd);
+    free (buf);
+    return NULL;
+  }
+  /* The real pread function would reset the file offset here,
+   * but we don't care since we're just about to close the
+   * file anyway.
+   */
+#endif /* !HAVE_PREAD */
 
   if (close (fd) == -1) {
     reply_with_perror ("close: %s", path);
-- 
1.6.5.2



More information about the Libguestfs mailing list