[GRASS-dev] [GRASS GIS] #1971: 64bit LFS support for G_ftell() and PRI_OFF_T gis.h

GRASS GIS trac at osgeo.org
Thu May 9 18:32:28 PDT 2013


#1971: 64bit LFS support for G_ftell() and PRI_OFF_T gis.h
-------------------------------------------------+--------------------------
 Reporter:  hamish                               |       Owner:  grass-dev@…              
     Type:  defect                               |      Status:  new                      
 Priority:  critical                             |   Milestone:  6.4.3                    
Component:  LibGIS                               |     Version:  svn-develbranch6         
 Keywords:  r.in.bin, LFS, G_ftell(), PRI_OFF_T  |    Platform:  Linux                    
      Cpu:  x86-64                               |  
-------------------------------------------------+--------------------------
 Hi,

 as reported on the users' ML, r.in.bin is failing for input files bigger
 than 2GB. thread: "ERROR: Bytes do not match file size with r.in.bin (but
 file size is correct!!)"
  http://thread.gmane.org/gmane.comp.gis.grass.user/47202

 It works in trunk, but not 6.x. Just after 6.4.1 was released r.in.bin got
 upgraded to off_t, but PRI_OFF_T in GRASS 6 set by gis.h remains as "ld"
 because
    `LFS_CFLAGS = -D_FILE_OFFSET_BITS=64`
 is missing from Grass.make (it is there in G7). That may just be the
 overflow in the error message though, I think the real problem is
 G_ftell() is always returning int, even when ftello() should be returning
 off_t.

 fwiw in G6 only the flags for wxWidgets get D_FILE_OFFSET'd.
 In G7 PRI_OFF_T is "lld" and r.in.bin works on a >2GB test file.

 here's a little Matlab/Octave code to make one:
 {{{
 %%%% make a >2GB binary data file
 fd1 = fopen('lfs_test.bin', 'w');
 rows=19450
 cols=29404
 for i = 1:rows
    row_content = [1:cols] * sqrt(i);
    fwrite(fd1, row_content, 'real*4');
 end
 fclose(fd1)
 %%%%
 }}}

 and import command:
 {{{
 $ ls -l lfs_test.bin
 -rw-r--r-- 1 hamish hamish 2287631200 May 10 12:43 lfs_test.bin

 GRASS> r.in.bin -f input=lfs_test.bin output=outputmap bytes=4 \
          n=51:05:20.4N s=41:21:50.4N w=5:08:31.2W e=9:33:36E \
          r=19450 c=29404 anull=-9999.0
 }}}

 the error in GRASS 6 is:
 {{{
 WARNING: File Size -2007336096 ... Total Bytes 2287631200
 ERROR: Bytes do not match file size
 }}}

 This is a 64bit system, and `GRASS6> g.version -b | tr ' ' '\n'` has the
 --enable-64bit option, but I'm not really sure why that's needed, as
 autoconf already knows the platform. (for cross-compiling from 32bit?)


 thanks,
 Hamish

-- 
Ticket URL: <https://trac.osgeo.org/grass/ticket/1971>
GRASS GIS <http://grass.osgeo.org>



More information about the grass-dev mailing list