Ejemplo n.º 1
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;

    // =-=-=-=-=-=-=-
    // 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 );
}
Ejemplo n.º 2
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);
}