00001
00002
00003
00004
00005
00006 #include "dataObjRead.h"
00007 #include "rodsLog.h"
00008 #include "objMetaOpr.h"
00009 #include "rsGlobalExtern.h"
00010 #include "rcGlobalExtern.h"
00011 #include "subStructFileRead.h"
00012 #include "reGlobalsExtern.h"
00013
00014
00015
00016 #include "eirods_resource_backport.h"
00017 #include "eirods_hierarchy_parser.h"
00018
00019 int
00020 applyRuleForPostProcForRead(rsComm_t *rsComm, bytesBuf_t *dataObjReadOutBBuf, char *objPath)
00021 {
00022 int i;
00023 ruleExecInfo_t rei2;
00024 msParamArray_t msParamArray;
00025 int *myInOutStruct;
00026
00027 if (ReadWriteRuleState != ON_STATE) return 0;
00028
00029 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00030 memset ((char*)&msParamArray, 0, sizeof(msParamArray_t));
00031
00032 rei2.rsComm = rsComm;
00033 if (rsComm != NULL) {
00034 rei2.uoic = &rsComm->clientUser;
00035 rei2.uoip = &rsComm->proxyUser;
00036 }
00037 rei2.doi = (dataObjInfo_t*)mallocAndZero(sizeof(dataObjInfo_t));
00038 strcpy(rei2.doi->objPath,objPath);
00039
00040 #if 0
00041 addMsParam(&msParamArray, "*ReadBuf", BUF_LEN_MS_T,
00042 (void *) dataObjReadOutBBuf->len , dataObjReadOutBBuf);
00043 #else
00044 bzero (&msParamArray, sizeof (msParamArray));
00045 myInOutStruct = (int*)malloc (sizeof (int));
00046 *myInOutStruct = dataObjReadOutBBuf->len;
00047 addMsParamToArray (&msParamArray, "*ReadBuf", BUF_LEN_MS_T, myInOutStruct,
00048 dataObjReadOutBBuf, 0);
00049 #endif
00050 i = applyRule("acPostProcForDataObjRead(*ReadBuf)",&msParamArray, &rei2,
00051 NO_SAVE_REI);
00052 free (rei2.doi);
00053 if (i < 0) {
00054 if (rei2.status < 0) {
00055 i = rei2.status;
00056 }
00057 rodsLog (LOG_ERROR,
00058 "rsDataObjRead: acPostProcForDataObjRead error=%d",i);
00059 clearMsParamArray(&msParamArray,0);
00060 return i;
00061 }
00062 clearMsParamArray(&msParamArray,0);
00063
00064 return(0);
00065
00066 }
00067
00068 int
00069 rsDataObjRead (rsComm_t *rsComm, openedDataObjInp_t *dataObjReadInp,
00070 bytesBuf_t *dataObjReadOutBBuf)
00071 {
00072 int bytesRead;
00073 int l1descInx = dataObjReadInp->l1descInx;
00074
00075 if (l1descInx < 2 || l1descInx >= NUM_L1_DESC) {
00076 rodsLog (LOG_NOTICE,
00077 "rsDataObjRead: l1descInx %d out of range",
00078 l1descInx);
00079 return (SYS_FILE_DESC_OUT_OF_RANGE);
00080 }
00081 if (L1desc[l1descInx].inuseFlag != FD_INUSE) {
00082 return BAD_INPUT_DESC_INDEX;
00083 }
00084
00085 if (L1desc[l1descInx].remoteZoneHost != NULL) {
00086
00087 dataObjReadInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00088 bytesRead = rcDataObjRead (L1desc[l1descInx].remoteZoneHost->conn,
00089 dataObjReadInp, dataObjReadOutBBuf);
00090 dataObjReadInp->l1descInx = l1descInx;
00091 } else {
00092 int i;
00093 bytesRead = l3Read (rsComm, l1descInx, dataObjReadInp->len,
00094 dataObjReadOutBBuf);
00095 i = applyRuleForPostProcForRead(rsComm, dataObjReadOutBBuf,
00096 L1desc[l1descInx].dataObjInfo->objPath);
00097 if (i < 0)
00098 return(i);
00099 #if 0
00100
00101
00102 bytesRead = dataObjReadOutBBuf->len;
00103 #endif
00104 }
00105
00106 return (bytesRead);
00107 }
00108
00109 int
00110 l3Read (rsComm_t *rsComm, int l1descInx, int len,
00111 bytesBuf_t *dataObjReadOutBBuf)
00112 {
00113 int bytesRead;
00114
00115 dataObjInfo_t *dataObjInfo;
00116 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00117
00118
00119
00120 std::string location;
00121 eirods::error ret = eirods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
00122 if( !ret.ok() ) {
00123 eirods::log( PASSMSG( "failed in get_loc_for_hier_String", ret ) );
00124 return -1;
00125 }
00126
00127
00128 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00129 subStructFileFdOprInp_t subStructFileReadInp;
00130 memset (&subStructFileReadInp, 0, sizeof (subStructFileReadInp));
00131 subStructFileReadInp.type = dataObjInfo->specColl->type;
00132 subStructFileReadInp.fd = L1desc[l1descInx].l3descInx;
00133 subStructFileReadInp.len = len;
00134 rstrcpy (subStructFileReadInp.addr.hostAddr, location.c_str(), NAME_LEN );
00135 bytesRead = rsSubStructFileRead (rsComm, &subStructFileReadInp, dataObjReadOutBBuf);
00136 } else {
00137 fileReadInp_t fileReadInp;
00138 int category = FILE_CAT;
00139 switch( category ) {
00140 case FILE_CAT:
00141 memset (&fileReadInp, 0, sizeof (fileReadInp));
00142 fileReadInp.fileInx = L1desc[l1descInx].l3descInx;
00143 fileReadInp.len = len;
00144 bytesRead = rsFileRead (rsComm, &fileReadInp, dataObjReadOutBBuf);
00145 break;
00146
00147 default:
00148 rodsLog (LOG_NOTICE,
00149 "l3Read: rescCat type %d is not recognized", category );
00150 bytesRead = SYS_INVALID_RESC_TYPE;
00151 break;
00152 }
00153 }
00154 return (bytesRead);
00155 }
00156
00157 int
00158 _l3Read (rsComm_t *rsComm, int rescTypeInx, int l3descInx, void *buf, int len ) {
00159 fileReadInp_t fileReadInp;
00160 bytesBuf_t dataObjReadInpBBuf;
00161 int bytesRead;
00162
00163 dataObjReadInpBBuf.len = len;
00164 dataObjReadInpBBuf.buf = buf;
00165
00166
00167 memset (&fileReadInp, 0, sizeof (fileReadInp));
00168 fileReadInp.fileInx = l3descInx;
00169 fileReadInp.len = len;
00170 bytesRead = rsFileRead( rsComm, &fileReadInp, &dataObjReadInpBBuf );
00171
00172 return (bytesRead);
00173 }
00174
00175 #ifdef COMPAT_201
00176 int
00177 rsDataObjRead201 (rsComm_t *rsComm, dataObjReadInp_t *dataObjReadInp,
00178 bytesBuf_t *dataObjReadOutBBuf)
00179 {
00180 openedDataObjInp_t openedDataObjInp;
00181 int status;
00182
00183 bzero (&openedDataObjInp, sizeof (openedDataObjInp));
00184
00185 openedDataObjInp.l1descInx = dataObjReadInp->l1descInx;
00186 openedDataObjInp.len = dataObjReadInp->len;
00187
00188 status = rsDataObjRead (rsComm, &openedDataObjInp, dataObjReadOutBBuf);
00189
00190 return status;
00191 }
00192 #endif