int rsDataObjGet (rsComm_t *rsComm, dataObjInp_t *dataObjInp, portalOprOut_t **portalOprOut, bytesBuf_t *dataObjOutBBuf) { int status; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput); remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost, REMOTE_OPEN); if (remoteFlag < 0) { return (remoteFlag); } else if (remoteFlag == LOCAL_HOST) { status = _rsDataObjGet (rsComm, dataObjInp, portalOprOut, dataObjOutBBuf, BRANCH_MSG); } else { int l1descInx; status = _rcDataObjGet (rodsServerHost->conn, dataObjInp, portalOprOut, dataObjOutBBuf); if (status < 0) { return (status); } if (status == 0 || (dataObjOutBBuf != NULL && dataObjOutBBuf->len > 0)) { /* data included in buf */ return status; } else { /* have to allocate a local l1descInx to keep track of things * since the file is in remote zone. It sets remoteL1descInx, * oprType = REMOTE_ZONE_OPR and remoteZoneHost so that * rsComplete knows what to do */ l1descInx = allocAndSetL1descForZoneOpr ( (*portalOprOut)->l1descInx, dataObjInp, rodsServerHost, NULL); if (l1descInx < 0) return l1descInx; (*portalOprOut)->l1descInx = l1descInx; return status; } } return (status); }
int rsDataObjPut( rsComm_t *rsComm, dataObjInp_t *dataObjInp, bytesBuf_t *dataObjInpBBuf, portalOprOut_t **portalOprOut ) { int status; int status2; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; resolveLinkedPath( rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput ); remoteFlag = getAndConnRemoteZone( rsComm, dataObjInp, &rodsServerHost, REMOTE_CREATE ); if ( const char* acl_string = getValByKey( &dataObjInp->condInput, ACL_INCLUDED_KW ) ) { try { irods::deserialize_acl( acl_string ); } catch ( const irods::exception& e ) { rodsLog( LOG_ERROR, "%s", e.what() ); return e.code(); } } if ( const char* metadata_string = getValByKey( &dataObjInp->condInput, METADATA_INCLUDED_KW ) ) { try { irods::deserialize_metadata( metadata_string ); } catch ( const irods::exception& e ) { rodsLog( LOG_ERROR, "%s", e.what() ); return e.code(); } } if ( remoteFlag < 0 ) { return remoteFlag; } else if ( remoteFlag == LOCAL_HOST ) { // =-=-=-=-=-=-=- // working on the "home zone", determine if we need to redirect to a different // server in this zone for this operation. if there is a RESC_HIER_STR_KW then // we know that the redirection decision has already been made std::string hier; if ( getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ) == NULL ) { irods::error ret = irods::resolve_resource_hierarchy( irods::CREATE_OPERATION, rsComm, dataObjInp, hier ); if ( !ret.ok() ) { std::stringstream msg; msg << __FUNCTION__; msg << " :: failed in irods::irods::resolve_resource_hierarchy for ["; msg << dataObjInp->objPath << "]"; irods::log( PASSMSG( msg.str(), ret ) ); return ret.code(); } // =-=-=-=-=-=-=- // we resolved the redirect and have a host, set the hier str for subsequent // api calls, etc. addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() ); } // if keyword status2 = applyRuleForPostProcForWrite( rsComm, dataObjInpBBuf, dataObjInp->objPath ); if ( status2 < 0 ) { return ( status2 ); } dataObjInp->openFlags = O_RDWR; status = _rsDataObjPut( rsComm, dataObjInp, dataObjInpBBuf, portalOprOut ); } else { int l1descInx; status = _rcDataObjPut( rodsServerHost->conn, dataObjInp, dataObjInpBBuf, portalOprOut ); if ( status < 0 || getValByKey( &dataObjInp->condInput, DATA_INCLUDED_KW ) != NULL ) { return status; } else { /* have to allocate a local l1descInx to keep track of things * since the file is in remote zone. It sets remoteL1descInx, * oprType = REMOTE_ZONE_OPR and remoteZoneHost so that * rsComplete knows what to do */ l1descInx = allocAndSetL1descForZoneOpr( ( *portalOprOut )->l1descInx, dataObjInp, rodsServerHost, NULL ); if ( l1descInx < 0 ) { return l1descInx; } ( *portalOprOut )->l1descInx = l1descInx; return status; } } return status; }
int rsDataObjCreate( rsComm_t *rsComm, dataObjInp_t *dataObjInp ) { int l1descInx; int status; rodsObjStat_t *rodsObjStatOut = NULL; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; char *lockType = NULL; // JMC - backport 4604 int lockFd = -1; // JMC - backport 4604 resolveLinkedPath( rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput ); remoteFlag = getAndConnRemoteZone( rsComm, dataObjInp, &rodsServerHost, REMOTE_CREATE ); if ( remoteFlag < 0 ) { return ( remoteFlag ); } else if ( remoteFlag == REMOTE_HOST ) { openStat_t *openStat = NULL; addKeyVal( &dataObjInp->condInput, CROSS_ZONE_CREATE_KW, "" ); status = rcDataObjCreateAndStat( rodsServerHost->conn, dataObjInp, &openStat ); /* rm it to avoid confusion */ rmKeyVal( &dataObjInp->condInput, CROSS_ZONE_CREATE_KW ); if ( status < 0 ) { return status; } l1descInx = allocAndSetL1descForZoneOpr( status, dataObjInp, rodsServerHost, openStat ); if ( openStat != NULL ) { free( openStat ); } return ( l1descInx ); } // =-=-=-=-=-=-=- // working on the "home zone", determine if we need to redirect to a different // server in this zone for this operation. if there is a RESC_HIER_STR_KW then // we know that the redirection decision has already been made char* resc_hier = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ); if ( NULL == resc_hier ) { std::string hier; irods::error ret = irods::resolve_resource_hierarchy( irods::CREATE_OPERATION, rsComm, dataObjInp, hier ); if ( !ret.ok() ) { std::stringstream msg; msg << "failed in irods::resolve_resource_hierarchy for ["; msg << dataObjInp->objPath << "]"; irods::log( PASSMSG( msg.str(), ret ) ); return ret.code(); } // =-=-=-=-=-=-=- // we resolved the redirect and have a host, set the hier str for subsequent // api calls, etc. addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() ); } // if keyword // =-=-=-=-=-=-=- // JMC - backport 4604 lockType = getValByKey( &dataObjInp->condInput, LOCK_TYPE_KW ); if ( lockType != NULL ) { lockFd = rsDataObjLock( rsComm, dataObjInp ); if ( lockFd >= 0 ) { /* rm it so it won't be done again causing deadlock */ rmKeyVal( &dataObjInp->condInput, LOCK_TYPE_KW ); } else { rodsLogError( LOG_ERROR, lockFd, "rsDataObjCreate: rsDataObjLock error for %s. lockType = %s", dataObjInp->objPath, lockType ); return lockFd; } } // =-=-=-=-=-=-=- // Gets here means local zone operation stat dataObj addKeyVal( &dataObjInp->condInput, SEL_OBJ_TYPE_KW, "dataObj" ); status = rsObjStat( rsComm, dataObjInp, &rodsObjStatOut ); if ( rodsObjStatOut != NULL && rodsObjStatOut->objType == COLL_OBJ_T ) { if ( lockFd >= 0 ) { rsDataObjUnlock( rsComm, dataObjInp, lockFd ); // JMC - backport 4604 } return ( USER_INPUT_PATH_ERR ); } if ( rodsObjStatOut != NULL && rodsObjStatOut->specColl != NULL && rodsObjStatOut->specColl->collClass == LINKED_COLL ) { /* should not be here because if has been translated */ if ( lockFd >= 0 ) { rsDataObjUnlock( rsComm, dataObjInp, lockFd ); // JMC - backport 4604 } return SYS_COLL_LINK_PATH_ERR; } if ( rodsObjStatOut == NULL || ( rodsObjStatOut->objType == UNKNOWN_OBJ_T && rodsObjStatOut->specColl == NULL ) ) { /* does not exist. have to create one */ /* use L1desc[l1descInx].replStatus & OPEN_EXISTING_COPY instead */ /* newly created. take out FORCE_FLAG since it could be used by put */ /* rmKeyVal (&dataObjInp->condInput, FORCE_FLAG_KW); */ l1descInx = _rsDataObjCreate( rsComm, dataObjInp ); } else if ( rodsObjStatOut->specColl != NULL && rodsObjStatOut->objType == UNKNOWN_OBJ_T ) { /* newly created. take out FORCE_FLAG since it could be used by put */ /* rmKeyVal (&dataObjInp->condInput, FORCE_FLAG_KW); */ l1descInx = specCollSubCreate( rsComm, dataObjInp ); } else { /* dataObj exist */ if ( getValByKey( &dataObjInp->condInput, FORCE_FLAG_KW ) != NULL ) { dataObjInp->openFlags |= O_TRUNC | O_RDWR; // =-=-=-=-=-=-=- // re-determine the resource hierarchy since this is an open instead of a create std::string hier; irods::error ret = irods::resolve_resource_hierarchy( irods::WRITE_OPERATION, rsComm, dataObjInp, hier ); if ( !ret.ok() ) { std::stringstream msg; msg << __FUNCTION__; msg << " :: failed in irods::resolve_resource_hierarchy for ["; msg << dataObjInp->objPath << "]"; irods::log( PASSMSG( msg.str(), ret ) ); return ret.code(); } // =-=-=-=-=-=-=- // we resolved the redirect and have a host, set the hier str for subsequent // api calls, etc. addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() ); std::string top_resc; irods::hierarchy_parser parser; parser.set_string( hier ); parser.first_resc( top_resc ); addKeyVal( &dataObjInp->condInput, DEST_RESC_NAME_KW, top_resc.c_str() ); l1descInx = _rsDataObjOpen( rsComm, dataObjInp ); } else { l1descInx = OVERWRITE_WITHOUT_FORCE_FLAG; } } if ( rodsObjStatOut != NULL ) { freeRodsObjStat( rodsObjStatOut ); } // =-=-=-=-=-=-=- // JMC - backport 4604 if ( lockFd >= 0 ) { if ( l1descInx >= 0 ) { L1desc[l1descInx].lockFd = lockFd; } else { rsDataObjUnlock( rsComm, dataObjInp, lockFd ); } } // =-=-=-=-=-=-=- return ( l1descInx ); }
int rsDataObjOpen( rsComm_t *rsComm, dataObjInp_t *dataObjInp ) { int status, l1descInx; int remoteFlag; rodsServerHost_t *rodsServerHost; remoteFlag = getAndConnRemoteZone( rsComm, dataObjInp, &rodsServerHost, REMOTE_OPEN ); if ( remoteFlag < 0 ) { return remoteFlag; } else if ( remoteFlag == REMOTE_HOST ) { openStat_t *openStat = NULL; status = rcDataObjOpenAndStat( rodsServerHost->conn, dataObjInp, &openStat ); if ( status < 0 ) { return status; } l1descInx = allocAndSetL1descForZoneOpr( status, dataObjInp, rodsServerHost, openStat ); if ( openStat != NULL ) { free( openStat ); } return l1descInx; } else { // dataObjInfo_t linked list dataObjInfo_t *dataObjInfoHead = NULL; // resource hierarchy std::string hier; // =-=-=-=-=-=-=- // determine the resource hierarchy if one is not provided if ( getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ) == NULL ) { irods::error ret = irods::resolve_resource_hierarchy( irods::OPEN_OPERATION, rsComm, dataObjInp, hier, &dataObjInfoHead ); if (ret.ok()) { // =-=-=-=-=-=-=- // we resolved the redirect and have a host, set the hier str for subsequent // api calls, etc. addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() ); } } else { // file object for file_object_factory irods::file_object_ptr file_obj( new irods::file_object() ); // get resource hierarchy from condInput hier = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ); // get replicas vector populated irods::error fac_err = irods::file_object_factory(rsComm, dataObjInp, file_obj, &dataObjInfoHead); }// if ( getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ) == NULL ) l1descInx = _rsDataObjOpen( rsComm, dataObjInp, dataObjInfoHead ); } return l1descInx; }
int rsDataObjPut (rsComm_t *rsComm, dataObjInp_t *dataObjInp, bytesBuf_t *dataObjInpBBuf, portalOprOut_t **portalOprOut) { int status; int status2; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput); #if 0 status = resolvePathInSpecColl (rsComm, dataObjInp->objPath, READ_COLL_PERM, 0, &dataObjInfo); if (dataObjInfo != NULL) { if (dataObjInfo->specColl != NULL && dataObjInfo->specColl->collClass == LINKED_COLL) { rstrcpy (dataObjInp->objPath, dataObjInfo->objPath, MAX_NAME_LEN); } freeAllDataObjInfo (dataObjInfo); } #endif remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost, REMOTE_CREATE); if (remoteFlag < 0) { return (remoteFlag); } else if (remoteFlag == LOCAL_HOST) { /** since the object is written here, we apply pre procesing RAJA * Dec 2 2010 **/ status2 = applyRuleForPostProcForWrite(rsComm, dataObjInpBBuf, dataObjInp->objPath); if (status2 < 0) return(status2); /* need to dealloc anything??? */ /** since the object is written here, we apply pre procesing RAJA * Dec 2 2010 **/ dataObjInp->openFlags = O_RDWR; status = _rsDataObjPut (rsComm, dataObjInp, dataObjInpBBuf, portalOprOut, BRANCH_MSG); } else { int l1descInx; status = _rcDataObjPut (rodsServerHost->conn, dataObjInp, dataObjInpBBuf, portalOprOut); if (status < 0 || getValByKey (&dataObjInp->condInput, DATA_INCLUDED_KW) != NULL) { return (status); } else { /* have to allocate a local l1descInx to keep track of things * since the file is in remote zone. It sets remoteL1descInx, * oprType = REMOTE_ZONE_OPR and remoteZoneHost so that * rsComplete knows what to do */ l1descInx = allocAndSetL1descForZoneOpr ( (*portalOprOut)->l1descInx, dataObjInp, rodsServerHost, NULL); if (l1descInx < 0) return l1descInx; (*portalOprOut)->l1descInx = l1descInx; return status; } } return (status); }
int rsDataObjGet( rsComm_t *rsComm, dataObjInp_t *dataObjInp, portalOprOut_t **portalOprOut, bytesBuf_t *dataObjOutBBuf ) { int status; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; resolveLinkedPath( rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput ); remoteFlag = getAndConnRemoteZone( rsComm, dataObjInp, &rodsServerHost, REMOTE_OPEN ); if ( remoteFlag < 0 ) { return remoteFlag; } else if ( remoteFlag == LOCAL_HOST ) { // =-=-=-=-=-=-=- // working on the "home zone", determine if we need to redirect to a different // server in this zone for this operation. if there is a RESC_HIER_STR_KW then // we know that the redirection decision has already been made if ( getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW ) == NULL ) { std::string hier; irods::error ret = irods::resolve_resource_hierarchy( irods::OPEN_OPERATION, rsComm, dataObjInp, hier ); if ( !ret.ok() ) { std::stringstream msg; msg << "rsDataObjGet :: failed in irods::resolve_resource_redirect for ["; msg << dataObjInp->objPath << "]"; irods::log( PASSMSG( msg.str(), ret ) ); return ret.code(); } // =-=-=-=-=-=-=- // we resolved the redirect and have a host, set the hier str for subsequent // api calls, etc. addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() ); } // if keyword status = _rsDataObjGet( rsComm, dataObjInp, portalOprOut, dataObjOutBBuf, BRANCH_MSG ); } else { int l1descInx; status = _rcDataObjGet( rodsServerHost->conn, dataObjInp, portalOprOut, dataObjOutBBuf ); if ( status < 0 ) { return status; } if ( status == 0 || ( dataObjOutBBuf != NULL && dataObjOutBBuf->len > 0 ) ) { /* data included in buf */ return status; } else { /* have to allocate a local l1descInx to keep track of things * since the file is in remote zone. It sets remoteL1descInx, * oprType = REMOTE_ZONE_OPR and remoteZoneHost so that * rsComplete knows what to do */ l1descInx = allocAndSetL1descForZoneOpr( ( *portalOprOut )->l1descInx, dataObjInp, rodsServerHost, NULL ); if ( l1descInx < 0 ) { return l1descInx; } ( *portalOprOut )->l1descInx = l1descInx; return status; } } return status; }
int rsDataObjRsync (rsComm_t *rsComm, dataObjInp_t *dataObjInp, msParamArray_t **outParamArray) { int status; char *rsyncMode; char *remoteZoneOpr; int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; *outParamArray = NULL; if (dataObjInp == NULL) { rodsLog(LOG_ERROR, "rsDataObjRsync error. NULL input"); return (SYS_INTERNAL_NULL_INPUT_ERR); } rsyncMode = getValByKey (&dataObjInp->condInput, RSYNC_MODE_KW); if (rsyncMode == NULL) { rodsLog (LOG_ERROR, "rsDataObjRsync: RSYNC_MODE_KW input is missing"); return (USER_RSYNC_NO_MODE_INPUT_ERR); } if (strcmp (rsyncMode, LOCAL_TO_IRODS) == 0) { remoteZoneOpr = REMOTE_CREATE; } else { remoteZoneOpr = REMOTE_OPEN; } resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache, &dataObjInp->condInput); if (strcmp (rsyncMode, IRODS_TO_IRODS) == 0) { if (isLocalZone (dataObjInp->objPath) == 0) { dataObjInp_t myDataObjInp; char *destObjPath; /* source in a remote zone. try dest */ destObjPath = getValByKey (&dataObjInp->condInput, RSYNC_DEST_PATH_KW); if (destObjPath == NULL) { rodsLog (LOG_ERROR, "rsDataObjRsync: RSYNC_DEST_PATH_KW input is missing for %s", dataObjInp->objPath); return (USER_RSYNC_NO_MODE_INPUT_ERR); } myDataObjInp = *dataObjInp; remoteZoneOpr = REMOTE_CREATE; rstrcpy (myDataObjInp.objPath, destObjPath, MAX_NAME_LEN); remoteFlag = getAndConnRemoteZone (rsComm, &myDataObjInp, &rodsServerHost, remoteZoneOpr); } else { remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost, remoteZoneOpr); } } else { remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost, remoteZoneOpr); } if (remoteFlag < 0) { return (remoteFlag); } else if (remoteFlag == REMOTE_HOST) { status = _rcDataObjRsync (rodsServerHost->conn, dataObjInp, outParamArray); #if 0 int l1descInx; if (status < 0) { return (status); } if (status == SYS_SVR_TO_CLI_MSI_REQUEST) { /* server request to client */ l1descInx = allocAndSetL1descForZoneOpr (0, dataObjInp, rodsServerHost, NULL); if (l1descInx < 0) return l1descInx; if (*outParamArray == NULL) { *outParamArray = malloc (sizeof (msParamArray_t)); bzero (*outParamArray, sizeof (msParamArray_t)); } addIntParamToArray (*outParamArray, CL_ZONE_OPR_INX, l1descInx); } #endif return status; } if (strcmp (rsyncMode, IRODS_TO_LOCAL) == 0) { status = rsRsyncFileToData (rsComm, dataObjInp); } else if (strcmp (rsyncMode, LOCAL_TO_IRODS) == 0) { status = rsRsyncDataToFile (rsComm, dataObjInp); } else if (strcmp (rsyncMode, IRODS_TO_IRODS) == 0) { status = rsRsyncDataToData (rsComm, dataObjInp); } else { rodsLog (LOG_ERROR, "rsDataObjRsync: rsyncMode %s not supported"); return (USER_RSYNC_NO_MODE_INPUT_ERR); } return (status); }
int rsNcCreate( rsComm_t *rsComm, ncOpenInp_t *ncCreateInp, int **ncid ) { int remoteFlag; rodsServerHost_t *rodsServerHost; specCollCache_t *specCollCache = NULL; int status; dataObjInp_t dataObjInp; int l1descInx, myncid; if ( getValByKey( &ncCreateInp->condInput, NATIVE_NETCDF_CALL_KW ) != NULL ) { /* just do nc_open with objPath as file nc file path */ /* must to be called internally */ if ( rsComm->proxyUser.authInfo.authFlag < REMOTE_PRIV_USER_AUTH ) { return( CAT_INSUFFICIENT_PRIVILEGE_LEVEL ); } status = nc_create( ncCreateInp->objPath, ncCreateInp->mode, &myncid ); if ( status == NC_NOERR ) { *ncid = ( int * ) malloc( sizeof( int ) ); *( *ncid ) = myncid; return 0; } else { rodsLog( LOG_ERROR, "rsNccreate: nc_create %s error, status = %d, %s", ncCreateInp->objPath, status, nc_strerror( status ) ); return ( NETCDF_OPEN_ERR + status ); } } bzero( &dataObjInp, sizeof( dataObjInp ) ); rstrcpy( dataObjInp.objPath, ncCreateInp->objPath, MAX_NAME_LEN ); replKeyVal( &ncCreateInp->condInput, &dataObjInp.condInput ); resolveLinkedPath( rsComm, dataObjInp.objPath, &specCollCache, &dataObjInp.condInput ); remoteFlag = getAndConnRemoteZone( rsComm, &dataObjInp, &rodsServerHost, REMOTE_OPEN ); if ( remoteFlag < 0 ) { return ( remoteFlag ); } else if ( remoteFlag == LOCAL_HOST ) { addKeyVal( &dataObjInp.condInput, NO_OPEN_FLAG_KW, "" ); l1descInx = _rsDataObjCreate( rsComm, &dataObjInp ); clearKeyVal( &dataObjInp.condInput ); if ( l1descInx < 0 ) { return l1descInx; } l1desc_t& my_desc = irods::get_l1desc( l1descInx ); remoteFlag = resoAndConnHostByDataObjInfo( rsComm, my_desc.dataObjInfo, &rodsServerHost ); if ( remoteFlag < 0 ) { return ( remoteFlag ); } else if ( remoteFlag == LOCAL_HOST ) { status = nc_create( my_desc.dataObjInfo->filePath, ncCreateInp->mode, &myncid ); if ( status != NC_NOERR ) { rodsLog( LOG_ERROR, "rsNcCreate: nc_open %s error, status = %d, %s", ncCreateInp->objPath, status, nc_strerror( status ) ); freeL1desc( l1descInx ); return ( NETCDF_CREATE_ERR + status ); } } else { /* execute it remotely with dataObjInfo->filePath */ ncOpenInp_t myNcCreateInp; bzero( &myNcCreateInp, sizeof( myNcCreateInp ) ); rstrcpy( myNcCreateInp.objPath, my_desc.dataObjInfo->filePath, MAX_NAME_LEN ); addKeyVal( &myNcCreateInp.condInput, NATIVE_NETCDF_CALL_KW, "" ); status = rcNcCreate( rodsServerHost->conn, &myNcCreateInp, &myncid ); clearKeyVal( &myNcCreateInp.condInput ); if ( status < 0 ) { rodsLog( LOG_ERROR, "rsNcCreate: _rcNcCreate %s error, status = %d", myNcCreateInp.objPath, status ); freeL1desc( l1descInx ); return ( status ); } } my_desc.l3descInx = myncid; /* need to reg here since NO_OPEN_FLAG_KW does not do it */ if ( my_desc.dataObjInfo->specColl == NULL ) { status = svrRegDataObj( rsComm, my_desc.dataObjInfo ); if ( status < 0 ) { ncCloseInp_t myNcCloseInp; bzero( &myNcCloseInp, sizeof( myNcCloseInp ) ); myNcCloseInp.ncid = l1descInx; irods::server_api_call ( NC_CLOSE_AN, rsComm, &myNcCloseInp ); l3Unlink( rsComm, my_desc.dataObjInfo ); rodsLog( LOG_ERROR, "rsNcCreate: svrRegDataObj for %s failed, status = %d", my_desc.dataObjInfo->objPath, status ); freeL1desc( l1descInx ); return ( NETCDF_CREATE_ERR + status ); } } } else { addKeyVal( &dataObjInp.condInput, CROSS_ZONE_CREATE_KW, "" ); status = rcNcCreate( rodsServerHost->conn, ncCreateInp, &myncid ); /* rm it to avoid confusion */ rmKeyVal( &dataObjInp.condInput, CROSS_ZONE_CREATE_KW ); if ( status < 0 ) { rodsLog( LOG_ERROR, "rsNcCreate: _rcNcCreate %s error, status = %d", ncCreateInp->objPath, status ); return ( status ); } l1descInx = allocAndSetL1descForZoneOpr( myncid, &dataObjInp, rodsServerHost, NULL ); } l1desc_t& my_desc = irods::get_l1desc( l1descInx ); my_desc.oprType = NC_CREATE; *ncid = ( int * ) malloc( sizeof( int ) ); *( *ncid ) = l1descInx; return 0; }
int rsNcOpenGroup( rsComm_t *rsComm, ncOpenInp_t *ncOpenGroupInp, int **ncid ) { int remoteFlag; rodsServerHost_t *rodsServerHost; int status; dataObjInfo_t *dataObjInfo = NULL; int rl1descInx, l1descInx, myncid; int rootNcid; if ( getValByKey( &ncOpenGroupInp->condInput, NATIVE_NETCDF_CALL_KW ) != NULL ) { /* just all nc_open with objPath as file nc file path */ /* must to be called internally */ if ( rsComm->proxyUser.authInfo.authFlag < REMOTE_PRIV_USER_AUTH ) { return( CAT_INSUFFICIENT_PRIVILEGE_LEVEL ); } status = nc_inq_grp_full_ncid( ncOpenGroupInp->rootNcid, ncOpenGroupInp->objPath, &myncid ); if ( status == NC_NOERR ) { *ncid = ( int * ) malloc( sizeof( int ) ); *( *ncid ) = myncid; return 0; } else { rodsLog( LOG_ERROR, "rsNcOpenGroup: nc_open %s error, status = %d, %s", ncOpenGroupInp->objPath, status, nc_strerror( status ) ); return ( NETCDF_OPEN_ERR + status ); } } rl1descInx = ncOpenGroupInp->rootNcid; l1desc_t& my_desc = irods::get_l1desc( rl1descInx ); if ( rl1descInx < 2 || rl1descInx >= NUM_L1_DESC ) { rodsLog( LOG_ERROR, "rsNcClose: rl1descInx %d out of range", rl1descInx ); return ( SYS_FILE_DESC_OUT_OF_RANGE ); } if ( my_desc.inuseFlag != FD_INUSE ) { return BAD_INPUT_DESC_INDEX; } if ( my_desc.remoteZoneHost != NULL ) { ncOpenInp_t myNcOpenGroupInp; bzero( &myNcOpenGroupInp, sizeof( myNcOpenGroupInp ) ); rstrcpy( myNcOpenGroupInp.objPath, ncOpenGroupInp->objPath, MAX_NAME_LEN ); myNcOpenGroupInp.rootNcid = my_desc.remoteL1descInx; status = rcNcOpenGroup( my_desc.remoteZoneHost->conn, &myNcOpenGroupInp, &myncid ); if ( status < 0 ) { rodsLog( LOG_ERROR, "rsNcOpenGroup: _rcNcOpenGroup %s error, status = %d", ncOpenGroupInp->objPath, status ); return ( status ); } l1descInx = allocAndSetL1descForZoneOpr( myncid, my_desc.dataObjInp, my_desc.remoteZoneHost, NULL ); } else { /* local zone */ rootNcid = my_desc.l3descInx; remoteFlag = resoAndConnHostByDataObjInfo( rsComm, my_desc.dataObjInfo, &rodsServerHost ); if ( remoteFlag < 0 ) { return ( remoteFlag ); } else if ( remoteFlag == LOCAL_HOST ) { status = nc_inq_grp_full_ncid( rootNcid, ncOpenGroupInp->objPath, &myncid ); if ( status != NC_NOERR ) { rodsLog( LOG_ERROR, "rsNcOpenGroup: nc_inq_grp_full_ncid %s err, stat = %d, %s", ncOpenGroupInp->objPath, status, nc_strerror( status ) ); return ( NETCDF_OPEN_ERR + status ); } } else { /* execute it remotely */ ncOpenInp_t myNcOpenGroupInp; bzero( &myNcOpenGroupInp, sizeof( myNcOpenGroupInp ) ); rstrcpy( myNcOpenGroupInp.objPath, ncOpenGroupInp->objPath, MAX_NAME_LEN ); myNcOpenGroupInp.rootNcid = rootNcid; addKeyVal( &myNcOpenGroupInp.condInput, NATIVE_NETCDF_CALL_KW, "" ); status = rcNcOpenGroup( rodsServerHost->conn, &myNcOpenGroupInp, &myncid ); clearKeyVal( &myNcOpenGroupInp.condInput ); if ( status < 0 ) { rodsLog( LOG_ERROR, "rsNcOpenGroup: rcNcOpenGroup %s error, status = %d", myNcOpenGroupInp.objPath, status ); return ( status ); } } l1descInx = allocL1desc(); l1desc_t& new_desc = irods::get_l1desc( l1descInx ); new_desc.dataObjInfo = dataObjInfo = ( dataObjInfo_t * ) calloc( 1, sizeof( dataObjInfo_t ) ); rstrcpy( dataObjInfo->objPath, ncOpenGroupInp->objPath, MAX_NAME_LEN ); new_desc.l3descInx = myncid; } my_desc.oprType = NC_OPEN_GROUP; *ncid = ( int * ) malloc( sizeof( int ) ); *( *ncid ) = l1descInx; return 0; }