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 ); }
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); }