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
00096 i = applyRuleForPostProcForRead(rsComm, dataObjReadOutBBuf,
00097 L1desc[l1descInx].dataObjInfo->objPath);
00098 if (i < 0)
00099 return(i);
00100 #if 0
00101
00102
00103 bytesRead = dataObjReadOutBBuf->len;
00104 #endif
00105
00106 }
00107
00108 return (bytesRead);
00109 }
00110
00111 int
00112 l3Read (rsComm_t *rsComm, int l1descInx, int len,
00113 bytesBuf_t *dataObjReadOutBBuf)
00114 {
00115 int rescTypeInx;
00116 int bytesRead;
00117
00118 dataObjInfo_t *dataObjInfo;
00119 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00120
00121
00122
00123 std::string location;
00124 eirods::error ret = eirods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
00125 if( !ret.ok() ) {
00126 eirods::log( PASSMSG( "failed in get_loc_for_hier_String", ret ) );
00127 return -1;
00128 }
00129
00130
00131 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00132 subStructFileFdOprInp_t subStructFileReadInp;
00133 memset (&subStructFileReadInp, 0, sizeof (subStructFileReadInp));
00134 subStructFileReadInp.type = dataObjInfo->specColl->type;
00135 subStructFileReadInp.fd = L1desc[l1descInx].l3descInx;
00136 subStructFileReadInp.len = len;
00137 rstrcpy (subStructFileReadInp.addr.hostAddr, location.c_str(), NAME_LEN );
00138 bytesRead = rsSubStructFileRead (rsComm, &subStructFileReadInp, dataObjReadOutBBuf);
00139 } else {
00140 fileReadInp_t fileReadInp;
00141
00142 rescTypeInx = L1desc[l1descInx].dataObjInfo->rescInfo->rescTypeInx;
00143
00144 int category = 0;
00145 eirods::error err = eirods::get_resource_property< int >( dataObjInfo->rescInfo->rescName, "category", category );
00146 if( !err.ok() ) {
00147 eirods::log( PASS( err ) );
00148 }
00149
00150
00151 switch( category ) {
00152 case FILE_CAT:
00153 memset (&fileReadInp, 0, sizeof (fileReadInp));
00154 fileReadInp.fileInx = L1desc[l1descInx].l3descInx;
00155 fileReadInp.len = len;
00156 bytesRead = rsFileRead (rsComm, &fileReadInp, dataObjReadOutBBuf);
00157 break;
00158
00159 default:
00160 rodsLog (LOG_NOTICE,
00161 "l3Read: rescCat type %d is not recognized", category );
00162
00163 bytesRead = SYS_INVALID_RESC_TYPE;
00164 break;
00165 }
00166 }
00167 return (bytesRead);
00168 }
00169
00170 int
00171 _l3Read (rsComm_t *rsComm, int rescTypeInx, int l3descInx, void *buf, int len ) {
00172 fileReadInp_t fileReadInp;
00173 bytesBuf_t dataObjReadInpBBuf;
00174 int bytesRead;
00175
00176 dataObjReadInpBBuf.len = len;
00177 dataObjReadInpBBuf.buf = buf;
00178
00179
00180 #if 0 // JMC - legacy resource
00181 switch (RescTypeDef[rescTypeInx].rescCat) {
00182 case FILE_CAT:
00183 #endif // JMC - legacy resource
00184 memset (&fileReadInp, 0, sizeof (fileReadInp));
00185 fileReadInp.fileInx = l3descInx;
00186 fileReadInp.len = len;
00187 bytesRead = rsFileRead( rsComm, &fileReadInp, &dataObjReadInpBBuf );
00188
00189 #if 0 // JMC - legacy resource
00190 break;
00191 default:
00192 rodsLog (LOG_NOTICE,
00193 "_l3Read: rescCat type %d is not recognized", category );
00194
00195 bytesRead = SYS_INVALID_RESC_TYPE;
00196 break;
00197 }
00198 #endif // JMC - legacy resource
00199 return (bytesRead);
00200 }
00201
00202 #ifdef COMPAT_201
00203 int
00204 rsDataObjRead201 (rsComm_t *rsComm, dataObjReadInp_t *dataObjReadInp,
00205 bytesBuf_t *dataObjReadOutBBuf)
00206 {
00207 openedDataObjInp_t openedDataObjInp;
00208 int status;
00209
00210 bzero (&openedDataObjInp, sizeof (openedDataObjInp));
00211
00212 openedDataObjInp.l1descInx = dataObjReadInp->l1descInx;
00213 openedDataObjInp.len = dataObjReadInp->len;
00214
00215 status = rsDataObjRead (rsComm, &openedDataObjInp, dataObjReadOutBBuf);
00216
00217 return status;
00218 }
00219 #endif