[GRASS-dev] diglib test.c fails on 64bit win

Glynn Clements glynn at gclements.plus.com
Tue May 18 13:00:17 EDT 2010

Markus Metz wrote:

> > In 6.x, LFS is enabled for specific libraries or modules using e.g.:
> >
> >        ifneq ($(USE_LARGEFILES),)
> >                EXTRA_CFLAGS = -D_FILE_OFFSET_BITS=64
> >        endif
> >
> > in the corresponding Makefile. This needs to be done on a case-by-case
> > basis because not all modules are LFS-aware, e.g. because they
> > calculate offsets using "int" or "long" arithmetic, or use
> > fseek/ftell.
> IOW, for 6.x and mingw32, each module would need to decide if it wants
> to use e.g. fseeko64 or fseek.

We don't use fseeko() directly. In 6.x, modules which use fseek() are
built without LFS; in 7.0, G_fseek() is used.

> So, how about

>  #ifdef __MINGW32__

#if defined(__MINGW32__) && defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64

> +/* add/remove as needed */
>  #define off_t off64_t
>  #define fseeko fseeko64
>  #define ftello ftello64
> +#define lseek lseek64
> +#define tell tell64
> +#define seek seek64
> +#define stat stat64
> +#define fstat fstat64

If you redirect stat() to stat64(), you also need to redirect
"struct stat" to "struct __stat64". But I'm not sure how to go about

Also, there are two 64-bit stat interfaces, stati64() and
"struct _stati64", and stat64() and "struct __stat64". AFAICT, the
latter requires MSVCRT >= 6.1 (and uses __time64_t instead of time_t
for the timestamps).

Glynn Clements <glynn at gclements.plus.com>

More information about the grass-dev mailing list