Dan Sully <[EMAIL PROTECTED]> writes: >* Nick Ing-Simmons <[EMAIL PROTECTED]> shaped the electrons > to say... > >>>> I have seen weird fails like this when varying large file support and >>>> 64/32 bit IV Configure options. >>>> >>>> What happens is that 'offset' (your variable) is wrong size for Off_t and >>>> PerlIO_seek mis-interprets what it gets in its incoming args. >>>> >>>> You seem to have a small-file 32-bit perl (from -V output below). >>> >>>That is correct. And yes, the 'offset' is really a 'ogg_int64_t'. Although >>>it's certainly not a 64bit value. >> >>'ogg' ?? How big is it. > >It depends on the platform: > > typedef __int64 ogg_int64_t; typedef _G_int64_t ogg_int64_t; typedef SInt64 > ogg_int64_t; typedef int64_t ogg_int64_t; typedef int64_t ogg_int64_t; > typedef long long ogg_int64_t; typedef long long ogg_int64_t; typedef long > ogg_int64_t;
How big is it on the platform that is having the problem? But you answer this below. > >>>I've tried casting it to a Off_t to no effect. >> >>Hmm, perhaps Off_t itself is off. Did you pass same -D flags to your compile >>as perl build? For 32-bit build perl uses off_t as Off_t - which is all very >>well but Linux at least varies size of off_t based on -D options of _your_ >>compile. So if your command line or one of headers included by your XS code >>defines (say) __USE_FILE_OFFSET64 things get confused. > >This is debian unstable, and it appears that -D_FILE_OFFSET_BITS=64 is passed. > >cc -c -I/usr/include/vorbis -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS - >DDEBIAN -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE - >D_FILE_OFFSET_BITS=64 -O3 -DVERSION=\"0.5\" -DXS_VERSION=\"0.5\" -fPIC "- >I/usr/lib/perl/5.8/CORE" -g Decoder.c > >>>Suggestions here? >> >>Add some diagnostics to XS code e.g. warn("Passing offset size=%d >>Off_t=%d",sizeof(offset),sizeof(Off_t)); > >Passing offset size=8 Off_t=8 at test.pl line 12. So that would seem to have been a red-herring. > >>Can I/we see: >> A. Your declaration of "offset" > >static int ovcb_seek(void *vdatasource, ogg_int64_t offset, int whence) { > >> B. Typedef(s) of types involved from any system/library .h files? > >typedef int64_t ogg_int64_t; > >> C. CPP-ed code of call to PerlIO_seek(). > >int Perl_PerlIO_seek(register PerlInterpreter *my_perl >__attribute__((unused)), PerlIO *, off64_t, int); > >and > >return Perl_PerlIO_seek(((PerlInterpreter >*)pthread_getspecific((*Perl_Gthr_key_ptr(((void *)0))))), datasource- >>stream,offset,whence); > >-D