00001
00002
00003
00004
00005
00006 #include "getRemoteZoneResc.h"
00007 #include "rodsLog.h"
00008 #include "objMetaOpr.h"
00009 #include "dataObjOpr.h"
00010 #include "physPath.h"
00011 #include "regDataObj.h"
00012 #include "rcGlobalExtern.h"
00013 #include "reGlobalsExtern.h"
00014 #include "reDefines.h"
00015 #include "dataObjCreate.h"
00016 #include "dataObjOpen.h"
00017
00018 #include "eirods_resource_redirect.h"
00019
00020 int
00021 rsGetRemoteZoneResc (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00022 rodsHostAddr_t **rescAddr)
00023 {
00024 char *remoteOprType;
00025 int status;
00026 rescInfo_t *rescInfo = NULL;
00027 rescGrpInfo_t *myRescGrpInfo = NULL;
00028 dataObjInfo_t *dataObjInfoHead = NULL;
00029
00030 *rescAddr = NULL;
00031 if ((remoteOprType =
00032 getValByKey (&dataObjInp->condInput, REMOTE_ZONE_OPR_KW)) == NULL) {
00033 rodsLog (LOG_ERROR,
00034 "rsGetRemoteZoneResc: EMOTE_ZONE_OPR_KW not defined for %s",
00035 dataObjInp->objPath);
00036 return (USER_BAD_KEYWORD_ERR);
00037 }
00038
00039 if (strcmp (remoteOprType, REMOTE_CREATE) == 0) {
00040 status = getRescGrpForCreate (rsComm, dataObjInp, &myRescGrpInfo);
00041 if (status < 0 || NULL == myRescGrpInfo ) return status;
00042 rescInfo = myRescGrpInfo->rescInfo;
00043 } else if (strcmp (remoteOprType, REMOTE_OPEN) == 0) {
00044 status = getDataObjInfoIncSpecColl (rsComm, dataObjInp,
00045 &dataObjInfoHead);
00046 if (status < 0) {
00047
00048 status = getRescGrpForCreate (rsComm, dataObjInp, &myRescGrpInfo);
00049 if (status < 0 || NULL == myRescGrpInfo ) return status;
00050 rescInfo = myRescGrpInfo->rescInfo;
00051 } else {
00052
00053
00054
00055 std::string hier;
00056 eirods::error ret = eirods::resolve_resource_hierarchy( eirods::EIRODS_OPEN_OPERATION, rsComm,
00057 dataObjInp, hier );
00058 if( !ret.ok() ) {
00059 std::stringstream msg;
00060 msg << "failed in eirods::resolve_resource_hierarchy for [";
00061 msg << dataObjInp->objPath << "]";
00062 eirods::log( PASSMSG( msg.str(), ret ) );
00063 return ret.code();
00064 }
00065
00066
00067
00068 addKeyVal( &dataObjInp->condInput, RESC_HIER_STR_KW, hier.c_str() );
00069
00070 int writeFlag;
00071
00072 writeFlag = getWriteFlag( dataObjInp->openFlags );
00073 status = sortObjInfoForOpen( rsComm, &dataObjInfoHead, &dataObjInp->condInput, writeFlag );
00074
00075 if (status < 0) return status;
00076 status = applyPreprocRuleForOpen (rsComm, dataObjInp,
00077 &dataObjInfoHead);
00078 if (status < 0 || NULL == dataObjInfoHead ) {
00079 freeAllDataObjInfo (dataObjInfoHead);
00080 return status;
00081 } else {
00082 rescInfo = dataObjInfoHead->rescInfo;
00083 freeAllDataObjInfo (dataObjInfoHead);
00084 }
00085 }
00086 } else {
00087 rodsLog (LOG_ERROR,
00088 "rsGetRemoteZoneResc: bad EMOTE_ZONE_OPR_KW %s for %s",
00089 remoteOprType, dataObjInp->objPath);
00090 return (USER_BAD_KEYWORD_ERR);
00091 }
00092 *rescAddr = (rodsHostAddr_t*)malloc (sizeof (rodsHostAddr_t));
00093 bzero (*rescAddr, sizeof (rodsHostAddr_t));
00094 rstrcpy ((*rescAddr)->hostAddr, rescInfo->rescLoc, NAME_LEN);
00095 rstrcpy ((*rescAddr)->zoneName, ZoneInfoHead->zoneName, NAME_LEN);
00096 if (myRescGrpInfo != NULL) freeAllRescGrpInfo (myRescGrpInfo);
00097
00098 return (0);
00099 }
00100