Exemplo n.º 1
0
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));
   }
}
Exemplo n.º 2
0
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;

}