Richard W.M. Jones wrote:
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])
I'm adding a pread module to gnulib right now.
Once that's in, you can drop the rest of this patch, below.
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);