From d9ec9c693756ddabcc8f243c083b4f169d9e73f8 Mon Sep 17 00:00:00 2001
From: "Daniel P. Berrange" <berrange@redhat.com>
Date: Thu, 2 Apr 2009 18:42:33 +0000
Subject: [PATCH] Fix mingw32 portability

---
 ChangeLog    |  7 +++++++
 configure.in |  4 ++--
 src/util.c   | 11 ++++++++++-
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3e84344131..4bcaf13eb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Apr  2 19:41:00 BST 2009 Daniel P. Berrange <berrange@redhat.com>
+
+	Mingw portability fixes
+	* src/util.c: Fix virFileResolveLink for Win32 platform.
+	Fix offset usage in safezero for mmap() and write() impls
+	* configure.in: Add check for readlink()
+
 Thu Apr  2 15:18:00 CEST 2009 Daniel Veillard <veillard@redhat.com>
 
 	* docs/schemas/domain.rng: some missing disk bus values and cleanups
diff --git a/configure.in b/configure.in
index 392f2b9f05..70a6b1ac77 100644
--- a/configure.in
+++ b/configure.in
@@ -72,7 +72,7 @@ dnl Use --disable-largefile if you don't want this.
 AC_SYS_LARGEFILE
 
 dnl Availability of various common functions (non-fatal if missing).
-AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap])
+AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap readlink])
 
 dnl Availability of various not common threadsafe functions
 AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r])
@@ -937,8 +937,8 @@ if test "$with_storage_scsi" = "check"; then
 
    AC_DEFINE_UNQUOTED([WITH_STORAGE_SCSI], 1,
      [whether SCSI backend for storage driver is enabled])
-   AM_CONDITIONAL([WITH_STORAGE_SCSI], [test "$with_storage_scsi" = "yes"])
 fi
+AM_CONDITIONAL([WITH_STORAGE_SCSI], [test "$with_storage_scsi" = "yes"])
 
 
 LIBPARTED_CFLAGS=
diff --git a/src/util.c b/src/util.c
index 65088b04c5..5abdbbcec4 100644
--- a/src/util.c
+++ b/src/util.c
@@ -136,7 +136,7 @@ int safezero(int fd, int flags ATTRIBUTE_UNUSED, off_t offset, off_t len)
     /* memset wants the mmap'ed file to be present on disk so create a
      * sparse file
      */
-    r = ftruncate(fd, len);
+    r = ftruncate(fd, offset + len);
     if (r < 0)
         return -errno;
 
@@ -158,6 +158,9 @@ int safezero(int fd, int flags ATTRIBUTE_UNUSED, off_t offset, off_t len)
     char *buf;
     unsigned long long remain, bytes;
 
+    if (lseek(fd, offset, SEEK_SET) < 0)
+        return errno;
+
     /* Split up the write in small chunks so as not to allocate lots of RAM */
     remain = len;
     bytes = 1024 * 1024;
@@ -949,6 +952,7 @@ int virFileLinkPointsTo(const char *checkLink,
 int virFileResolveLink(const char *linkpath,
                        char **resultpath)
 {
+#ifdef HAVE_READLINK
     struct stat st;
     char *buf;
     int n;
@@ -981,6 +985,11 @@ int virFileResolveLink(const char *linkpath,
 
     *resultpath = buf;
     return 0;
+#else
+    if (!(*resultpath = strdup(linkpath)))
+        return -ENOMEM;
+    return 0;
+#endif
 }