I have no problem admitting that I've traced through the innards of
_fseeko a few times now and am no closer to finding out exactly where
the problem is, though I have a suspicion it has to do with when the
file pointer's buffer is allocated and initially populated. In any
case, here's a particularly weird one from the Apple Files that also
occurs on FreeBSD
The following program, also available from
http://narcissus.queasyweasel.com/fump.c, demonstrates the problem.
If you change the top #define of FIRST_SEEK to 0 instead of 1, the
program will work. If you leave it at 1, the initial (and
theoretically redundant and no-op) fseek on readMidFP will bugger up
stdio's internal state somehow.
If anyone with more stdio-fu than me would like to poke at it, I'd be
interested in hearing what you find out. If this is breaking some
undocumented rule of stdio I'd like to know that too so that I can
document it both in FreeBSD and Mac OS X. Thanks.
- Jordan
#include <stdio.h>
#define SIZE 40
#define NBS 5
#define FIRST_SEEK 1
int main( void ) {
FILE *writeFP ;
FILE *readMidFP ;
int err , i , n = 0 , count , SizeOfFile , nerr = 0 ;
char ch ;
writeFP = fopen( "test_fseek_outfile" , "w" ) ;
if ( writeFP == NULL ) {
fprintf( stderr , "open for write failed.\n" ) ;
exit( 1 ) ;
}
readMidFP = fopen( "test_fseek_outfile" , "r" ) ;
if ( readMidFP == NULL ) {
fprintf( stderr , "open readMidFP for read failed.\n" ) ;
exit( 1 ) ;
}
/* write SIZE a's to output file. */
SizeOfFile = SIZE ;
for ( count = 0 ; ( count <= SizeOfFile ) && ( n != -1 ) ; count++ ) {
n = fprintf( writeFP , "a" ) ;
if ( n == -1 )
break ;
}
fflush( writeFP ) ;
/* seek to middle of file. */
// THIS IS CRUCIAL TO MAKING IT FAIL
// REMOVE THIS fseek() AND THE PROGRAM SUCCEEDS
#if FIRST_SEEK
err = fseek( readMidFP , (long) (SizeOfFile / 2) , SEEK_SET ) ;
if ( err != 0 ) {
fprintf( stderr , "first fseek() to middle of file on
readMidFP failed.\n" ) ;
exit( 1 ) ;
}
#endif
/* seek to middle of file. */
err = fseek( writeFP , (long) (SizeOfFile / 2) , SEEK_SET ) ;
if ( err != 0 ) {
fprintf( stderr , "first fseek() to middle of file on
writeFP failed.\n" ) ;
exit( 1 ) ;
}
/* write NBS b's. */
for ( i = 0 ; i < NBS ; i++ )
fprintf( writeFP , "b" ) ;
fflush( writeFP ) ;
/* seek to middle of file. should be NBS b's there. */
err = fseek( readMidFP , (long) (SizeOfFile / 2) , SEEK_SET ) ;
if ( err != 0 ) {
fprintf( stderr , "second fseek() to middle of file on
readMidFP failed.\n" ) ;
exit( 1 ) ;
}
for ( i = 0 ; i < NBS ; i++ ) {
fscanf( readMidFP , "%c" , &ch ) ;
if ( ch != 'b' ) {
fprintf( stderr , "** ERROR ** \'%c\' at position:
%d\n" , ch , (SizeOfFile / 2)+i ) ;
nerr++ ;
}
}
if ( nerr == 0 )
fprintf( stderr , "Program was succesful.\n" ) ;
else
fprintf( stderr , "Program failed.\n" ) ;
return( 0 ) ;
}
--
Jordan K. Hubbard
Engineering Manager, BSD technology group
Apple Computer
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message
- Re: Anyone like obscure stdio problems? Jordan Hubbard
- Re: Anyone like obscure stdio problems? Chris Costello

