Example #1
0
int
irods_file_seek_( int *fd, long *offset, char *whence ) {
    openedDataObjInp_t seekParam;
    fileLseekOut_t* seekResult = NULL;
    int status;
    int myWhence = 0;
    if ( strstr( whence, "SEEK_SET" ) != NULL ) {
        myWhence = SEEK_SET;
    }
    if ( strstr( whence, "SEEK_CUR" ) != NULL ) {
        myWhence = SEEK_CUR;
    }
    if ( strstr( whence, "SEEK_END" ) != NULL ) {
        myWhence = SEEK_END;
    }

    if ( debug ) {
        printf( "irods_file_seek_: %d\n", *fd );
    }
    memset( &seekParam,  0, sizeof( openedDataObjInp_t ) );
    seekParam.l1descInx = *fd;
    seekParam.offset  = *offset;
    seekParam.whence  = myWhence;
    status = rcDataObjLseek( Comm, &seekParam, &seekResult );
    if ( status < 0 ) {
        rodsLogError( LOG_ERROR, status, "irods_file_seek_" );
    }
    return status;
}
Example #2
0
static int irods_reli_lseek_if_needed( struct irods_file *file, INT64_T offset )
{
	openedDataObjInp_t request;
	fileLseekOut_t *response=0;
	int result;

	struct irods_server *server = connect_to_host(file->host);
	if(!server) return -1;

	if(!connect_to_file(server,file)) return -1;

	if(file->offset==offset)  return 0;

	memset(&request,0,sizeof(request));
	request.l1descInx = file->fd;
	request.offset  = offset;
	request.whence  = SEEK_SET;

	debug(D_IRODS,"rcDataObjLseek %s %d %lld",file->host,file->fd,(long long)offset);
	result = rcDataObjLseek(server->conn,&request,&response);
	debug(D_IRODS,"= %d",result);

	if(result<0) {
		errno = irods_reli_errno(result);
		return -1;
	}

	free(response);
	file->offset = offset;
	return 0;
}
Example #3
0
int
isioFileSeek(int fileIndex, long offset, int whence) {
   openedDataObjInp_t seekParam;
   fileLseekOut_t* seekResult = NULL;
   int status;
   if (debug) printf("isioFileSeek: %d\n", fileIndex);
   memset( &seekParam,  0, sizeof(openedDataObjInp_t) );
   seekParam.l1descInx = openFiles[fileIndex];
   seekParam.offset  = offset;
   seekParam.whence  = whence;
   status = rcDataObjLseek(Comm, &seekParam, &seekResult );
   if ( status < 0 ) {
      rodsLogError (LOG_ERROR, status, "isioFileSeek");
   }
   return(status);
}
Example #4
0
static off_t irods_seek(hFILE *fpv, off_t offset, int whence)
{
    hFILE_irods *fp = (hFILE_irods *) fpv;
    openedDataObjInp_t args;
    fileLseekOut_t *out = NULL;
    int ret;

    memset(&args, 0, sizeof args);
    args.l1descInx = fp->descriptor;
    args.offset = offset;
    args.whence = whence;

    ret = rcDataObjLseek(irods.conn, &args, &out);

    if (out) { offset = out->offset; free(out); }
    else offset = -1;
    if (ret < 0) { set_errno(ret); return -1; }
    return offset;
}
Example #5
0
int _iFuseFileCacheLseek( fileCache_t *fileCache, off_t offset ) {

    int status;
    if ( offset == fileCache->offset ) {
        return 0;
    }
    if ( fileCache->state == NO_FILE_CACHE ) {
        iFuseConn_t *conn = getAndUseConnByPath( fileCache->localPath, &status );
        openedDataObjInp_t dataObjLseekInp;
        fileLseekOut_t *dataObjLseekOut = NULL;

        bzero( &dataObjLseekInp, sizeof( dataObjLseekInp ) );
        dataObjLseekInp.l1descInx = fileCache->iFd;
        dataObjLseekInp.offset = offset;
        dataObjLseekInp.whence = SEEK_SET;

        status = rcDataObjLseek( conn->conn, &dataObjLseekInp, &dataObjLseekOut );
        unuseIFuseConn( conn );
        if ( dataObjLseekOut != NULL ) {
            free( dataObjLseekOut );
        }

    }
    else {
        rodsLong_t lstatus;
        lstatus = lseek( fileCache->iFd, offset, SEEK_SET );
        if ( lstatus >= 0 ) {
            status = 0;
        }
        else {
            status = lstatus;
        }
    }
    fileCache->offset = offset;

    return status;
}
int
rsDataObjLseek( rsComm_t *rsComm, openedDataObjInp_t *dataObjLseekInp,
                fileLseekOut_t **dataObjLseekOut ) {
    int status;
    int l1descInx, l3descInx;
    int rescTypeInx;
    dataObjInfo_t *dataObjInfo;

    l1descInx = dataObjLseekInp->l1descInx;

    if ( l1descInx <= 2 || l1descInx >= NUM_L1_DESC ) {
        rodsLog( LOG_NOTICE,
                 "rsDataObjLseek: l1descInx %d out of range",
                 l1descInx );
        return ( SYS_FILE_DESC_OUT_OF_RANGE );
    }
    if ( L1desc[l1descInx].inuseFlag != FD_INUSE ) {
        return BAD_INPUT_DESC_INDEX;
    }
    if ( L1desc[l1descInx].remoteZoneHost != NULL ) {
        /* cross zone operation */
        dataObjLseekInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
        status = rcDataObjLseek( L1desc[l1descInx].remoteZoneHost->conn,
                                 dataObjLseekInp, dataObjLseekOut );
        dataObjLseekInp->l1descInx = l1descInx;
        return status;
    }

    l3descInx = L1desc[l1descInx].l3descInx;

    if ( l3descInx <= 2 ) {
        rodsLog( LOG_NOTICE,
                 "rsDataObjLseek: l3descInx %d out of range",
                 l3descInx );
        return ( SYS_FILE_DESC_OUT_OF_RANGE );
    }

    dataObjInfo = L1desc[l1descInx].dataObjInfo;

    // =-=-=-=-=-=-=-
    // extract the host location from the resource hierarchy
    std::string location;
    irods::error ret = irods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
    if ( !ret.ok() ) {
        irods::log( PASSMSG( "rsDataObjLseek - failed in get_loc_for_hier_String", ret ) );
        return -1;
    }


    if ( getStructFileType( dataObjInfo->specColl ) >= 0 ) {
        subStructFileLseekInp_t subStructFileLseekInp;
        memset( &subStructFileLseekInp, 0, sizeof( subStructFileLseekInp ) );
        subStructFileLseekInp.type = dataObjInfo->specColl->type;
        subStructFileLseekInp.fd = L1desc[l1descInx].l3descInx;
        subStructFileLseekInp.offset = dataObjLseekInp->offset;
        subStructFileLseekInp.whence = dataObjLseekInp->whence;
        rstrcpy( subStructFileLseekInp.addr.hostAddr,
                 location.c_str(),
                 NAME_LEN );
        rstrcpy( subStructFileLseekInp.resc_hier,
                 dataObjInfo->rescHier,
                 NAME_LEN );
        status = rsSubStructFileLseek( rsComm, &subStructFileLseekInp, dataObjLseekOut );
    }
    else {
        *dataObjLseekOut = ( fileLseekOut_t* )malloc( sizeof( fileLseekOut_t ) );
        memset( *dataObjLseekOut, 0, sizeof( fileLseekOut_t ) );
        rescTypeInx = dataObjInfo->rescInfo->rescTypeInx;

        ( *dataObjLseekOut )->offset = _l3Lseek( rsComm, rescTypeInx, l3descInx,
                                       dataObjLseekInp->offset, dataObjLseekInp->whence );

        if ( ( *dataObjLseekOut )->offset >= 0 ) {
            status = 0;
        }
        else {
            status = ( *dataObjLseekOut )->offset;
        }
    }

    return ( status );
}
Example #7
0
int
rsDataObjLseek (rsComm_t *rsComm, openedDataObjInp_t *dataObjLseekInp, 
fileLseekOut_t **dataObjLseekOut)
{
    int status;
    int l1descInx, l3descInx;
    int rescTypeInx;
    dataObjInfo_t *dataObjInfo;

    l1descInx = dataObjLseekInp->l1descInx;

    if (l1descInx <= 2 || l1descInx >= NUM_L1_DESC) {
       rodsLog (LOG_NOTICE,
         "rsDataObjLseek: l1descInx %d out of range",
         l1descInx);
        return (SYS_FILE_DESC_OUT_OF_RANGE);
    }
    if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX;
    if (L1desc[l1descInx].remoteZoneHost != NULL) {
        /* cross zone operation */
        dataObjLseekInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
        status = rcDataObjLseek (L1desc[l1descInx].remoteZoneHost->conn,
          dataObjLseekInp, dataObjLseekOut);
        dataObjLseekInp->l1descInx = l1descInx;
	return status;
    }

    l3descInx = L1desc[l1descInx].l3descInx;

    if (l3descInx <= 2) {
       rodsLog (LOG_NOTICE,
         "rsDataObjLseek: l3descInx %d out of range",
         l3descInx);
        return (SYS_FILE_DESC_OUT_OF_RANGE);
    }

    dataObjInfo = L1desc[l1descInx].dataObjInfo;

    if (getStructFileType (dataObjInfo->specColl) >= 0) {
        subStructFileLseekInp_t subStructFileLseekInp;
        memset (&subStructFileLseekInp, 0, sizeof (subStructFileLseekInp));
	subStructFileLseekInp.type = dataObjInfo->specColl->type;
        subStructFileLseekInp.fd = L1desc[l1descInx].l3descInx;
	subStructFileLseekInp.offset = dataObjLseekInp->offset;
	subStructFileLseekInp.whence = dataObjLseekInp->whence;
        rstrcpy (subStructFileLseekInp.addr.hostAddr, dataObjInfo->rescInfo->rescLoc,
          NAME_LEN);
        status = rsSubStructFileLseek (rsComm, &subStructFileLseekInp, dataObjLseekOut);
    } else {
        *dataObjLseekOut = (fileLseekOut_t*)malloc (sizeof (fileLseekOut_t));
        memset (*dataObjLseekOut, 0, sizeof (fileLseekOut_t));
        rescTypeInx = dataObjInfo->rescInfo->rescTypeInx;

        (*dataObjLseekOut)->offset = _l3Lseek (rsComm, rescTypeInx, l3descInx,
          dataObjLseekInp->offset, dataObjLseekInp->whence); 

        if ((*dataObjLseekOut)->offset >= 0) {
	    status = 0;
        } else {
	    status = (*dataObjLseekOut)->offset;
        }
    }

    return (status);
}