int irodsfseek(FILE *fi_stream, long offset, int whence) { int i; i = (int)fi_stream; if (debug) printf("isiofseek: %d\n", i); if (i<ISIO_MAX_OPEN_FILES && i>=ISIO_MIN_OPEN_FD && openFiles[i]>0) { return(isioFileSeek(i,offset,whence)); } else { return(fseek(fi_stream, offset, whence)); } }
int isioFileWrite( int fileIndex, void *buffer, int countToWrite ) { int status; int spaceInBuffer; int newBufSize; openedDataObjInp_t dataObjWriteInp; bytesBuf_t dataObjWriteOutBBuf; if ( debug ) { printf( "isioFileWrite: %d\n", fileIndex ); } if ( cacheInfo[fileIndex].count > 0 ) { /* buffer has read data in it, so seek to where the the app thinks the pointer is and disgard the buffered read data */ long offset; offset = - cacheInfo[fileIndex].count; status = isioFileSeek( fileIndex, offset, SEEK_CUR ); if ( status ) { return status; } cacheInfo[fileIndex].ptr = cacheInfo[fileIndex].base; cacheInfo[fileIndex].count = 0; } spaceInBuffer = cacheInfo[fileIndex].bufferSize - cacheInfo[fileIndex].written; if ( debug ) { printf( "isioFileWrite: spaceInBuffer %d\n", spaceInBuffer ); } if ( countToWrite < spaceInBuffer ) { /* Fits in the buffer, just cache it */ if ( debug ) printf( "isioFileWrite: caching 1 %x %d\n", ( int ) cacheInfo[fileIndex].ptr, countToWrite ); memcpy( cacheInfo[fileIndex].ptr, buffer, countToWrite ); cacheInfo[fileIndex].ptr += countToWrite; cacheInfo[fileIndex].written += countToWrite; return countToWrite; } status = isioFlush( fileIndex ); /* if anything is buffered, flush it */ if ( status < 0 ) { return status; } if ( countToWrite > ISIO_MAX_BUF_SIZE ) { /* Too big to cache, just send it */ dataObjWriteOutBBuf.buf = buffer; dataObjWriteOutBBuf.len = countToWrite; memset( &dataObjWriteInp, 0, sizeof( dataObjWriteInp ) ); dataObjWriteInp.l1descInx = openFiles[fileIndex]; dataObjWriteInp.len = countToWrite; status = rcDataObjWrite( Comm, &dataObjWriteInp, &dataObjWriteOutBBuf ); if ( debug ) { printf( "isioFileWrite: rcDataWrite 2 %d\n", status ); } if ( status < 0 ) { return status; } return ( status ); /* total bytes written */ } newBufSize = ( 2 * countToWrite ) + 8; /* Possible next size */ if ( newBufSize > ISIO_MAX_BUF_SIZE ) { newBufSize = ISIO_MAX_BUF_SIZE; } if ( newBufSize > cacheInfo[fileIndex].bufferSize ) { /* free old and make new larger buffer */ int i = fileIndex; if ( cacheInfo[i].usingUsersBuffer == 'n' ) { if ( debug ) { printf( "isioFilewrite calling free\n" ); } free( cacheInfo[i].base ); } if ( debug ) printf( "isioFilewrite calling malloc %d\n", newBufSize ); cacheInfo[i].base = ( char * )malloc( newBufSize ); if ( cacheInfo[i].base == NULL ) { fprintf( stderr, "Memory Allocation error\n" ); return 0; } cacheInfo[i].bufferSize = newBufSize; cacheInfo[i].usingUsersBuffer = 'n'; cacheInfo[i].ptr = cacheInfo[i].base; } /* Now it fits in the buffer, so cache it */ if ( debug ) printf( "isioFileWrite: caching 2 %x %d\n", ( int ) cacheInfo[fileIndex].ptr, countToWrite ); memcpy( cacheInfo[fileIndex].ptr, buffer, countToWrite ); cacheInfo[fileIndex].ptr += countToWrite; cacheInfo[fileIndex].count -= countToWrite; //?? cacheInfo[fileIndex].written += countToWrite; return countToWrite; }