From jbrzusto at fastmail.fm  Mon Aug 27 16:33:48 2007
From: jbrzusto at fastmail.fm (jbrzusto at fastmail.fm)
Date: Mon, 27 Aug 2007 16:33:48 +0200 (CEST)
Subject: [Rd] fix for broken largefile seek() on 32-bit linux (PR#9883)
Message-ID: <20070827143348.0302E668E6@slim.kubism.ku.dk>

Full_Name: John Brzustowski
Version: R-devel-trunk, R-2.4.0
OS: linux
Submission from: (NULL) (206.248.132.197)


DESCRIPTION

seek() on files larger than 2 gigabytes fails for large values of "where" on
i386 linux 2.6.13 (and presumably other 32-bit unix-like platforms).

e.g.:

> f<-file("3gigabytefile.dat", "rb")
> seek(f, 3e9, "start", "r")
[1] 0  ## correct
> seek(f, NA, "start", "r")
[1] 0  ## should be 3e+09

DIAGNOSIS

Typo: the compile-time tests for large file support use "HAVE_SEEKO" instead of
"HAVE_FSEEKO", and so fail.  

The same typo appears in one of the extra/zlib files, so I'm fixing
it in the patch below, but I haven't tested whether that actually
produces a bug.

PATCH
Index: src/extra/zlib/gzio.c
===================================================================
--- src/extra/zlib/gzio.c	(revision 42664)
+++ src/extra/zlib/gzio.c	(working copy)
@@ -25,7 +25,7 @@
 #include "zutil.h"
 
 /* R ADDITION */
-#if defined(HAVE_OFF_T) && defined(HAVE_SEEKO)
+#if defined(HAVE_OFF_T) && defined(HAVE_FSEEKO)
 #define f_seek fseeko
 #define f_tell ftello
 #else
Index: src/include/Rconnections.h
===================================================================
--- src/include/Rconnections.h	(revision 42664)
+++ src/include/Rconnections.h	(working copy)
@@ -63,7 +63,7 @@
 
 typedef struct fileconn {
     FILE *fp;
-#if defined(HAVE_OFF_T) && defined(HAVE_SEEKO)
+#if defined(HAVE_OFF_T) && defined(HAVE_FSEEKO)
     off_t rpos, wpos;
 #else
 #ifdef Win32
Index: src/main/connections.c
===================================================================
--- src/main/connections.c	(revision 42664)
+++ src/main/connections.c	(working copy)
@@ -446,7 +446,7 @@
 
 /* ------------------- file connections --------------------- */
 
-#if defined(HAVE_OFF_T) && defined(HAVE_SEEKO)
+#if defined(HAVE_OFF_T) && defined(HAVE_FSEEKO)
 #define f_seek fseeko
 #define f_tell ftello
 #else
@@ -570,7 +570,7 @@
 {
     Rfileconn this = con->private;
     FILE *fp = this->fp;
-#if defined(HAVE_OFF_T) && defined(HAVE_SEEKO)
+#if defined(HAVE_OFF_T) && defined(HAVE_FSEEKO)
     off_t pos;
 #else
 #ifdef Win32



[Rd] fix for broken largefile seek() on 32-bit linux (PR#9883)
jbrzusto at fastmail.fm