OK, let's do the background... on Unix systems where by default off_t is
a "long", a 32-bit integer, there are two different ways to get "large
file" support, i.e. the ability to manipulate files bigger than 2Gb:

1) you compile using -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.  This
makes sys/types.h expose off_t as a "long long", a 64-bit integer, and
changes the size of a few other types too.  The C library headers
automatically arrange to expose a correct implementation of functions
like lseek() which take off_t parameters.

2) you compile using -D_LARGEFILE64_SOURCE, and use what is called the
"transitional" interface.  This means that the system headers expose a
new type, "off64_t", which is a long long, but the size of off_t is not
changed.   A bunch of new functions like lseek64() are exposed by the C 
library headers, which take off64_t parameters in place of off_t.

Perl built with -Duselargefiles uses approach (1).

APR HEAD uses (2) by default. APR 0.9 does not by default use either
approach, but random users can take a httpd-2.0.49 tarball, and do:

export CPPFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
./configure

to build a copy of apr/httpd which uses approach (1), though this isn't
really a supported configuration.

The problem that mod_perl has to work around is when you take a package
built with approach (1), i.e. Perl, and any package which was *not*
built with (1), i.e. APR, and want to interface between them. [1]

So what you want to know is whether APR was built using approach (1) or
not.  APR_HAS_LARGE_FILES in HEAD just tells you whether APR was built
using approach (2) or not, which isn't useful in solving this problem.

Does that make sense?

joe

[1]: In some cases, it may be OK to interface between packages which use
(1) and packages which use (2).  APR HEAD is currently not such a case, 
since the size of apr_ino_t is still changing when _FILE_OFFSET_BITS is 
defined.

If you want to see how this matters, get some httpd function to do at
the very beginning of main():

printf("sizeof(request_rec) = %lu, sizeof(apr_finfo_t) = %ul",
       sizeof(request_rec), sizeof(apr_finfo_t));

and then put the same printf in mod_perl somewhere, and see the
differences. This is why it is a really terribly silly idea to ever use
approach (1) in anything other than an entirely self-contained
application.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to