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 int
00015 applyRuleForPostProcForRead(rsComm_t *rsComm, bytesBuf_t *dataObjReadOutBBuf, char *objPath)
00016 {
00017 int i;
00018 ruleExecInfo_t rei2;
00019 msParamArray_t msParamArray;
00020 int *myInOutStruct;
00021
00022 if (ReadWriteRuleState != ON_STATE) return 0;
00023
00024 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00025 memset ((char*)&msParamArray, 0, sizeof(msParamArray_t));
00026
00027 rei2.rsComm = rsComm;
00028 if (rsComm != NULL) {
00029 rei2.uoic = &rsComm->clientUser;
00030 rei2.uoip = &rsComm->proxyUser;
00031 }
00032 rei2.doi = (dataObjInfo_t*)mallocAndZero(sizeof(dataObjInfo_t));
00033 strcpy(rei2.doi->objPath,objPath);
00034
00035 #if 0
00036 addMsParam(&msParamArray, "*ReadBuf", BUF_LEN_MS_T,
00037 (void *) dataObjReadOutBBuf->len , dataObjReadOutBBuf);
00038 #else
00039 bzero (&msParamArray, sizeof (msParamArray));
00040 myInOutStruct = (int*)malloc (sizeof (int));
00041 *myInOutStruct = dataObjReadOutBBuf->len;
00042 addMsParamToArray (&msParamArray, "*ReadBuf", BUF_LEN_MS_T, myInOutStruct,
00043 dataObjReadOutBBuf, 0);
00044 #endif
00045 i = applyRule("acPostProcForDataObjRead(*ReadBuf)",&msParamArray, &rei2,
00046 NO_SAVE_REI);
00047 free (rei2.doi);
00048 if (i < 0) {
00049 if (rei2.status < 0) {
00050 i = rei2.status;
00051 }
00052 rodsLog (LOG_ERROR,
00053 "rsDataObjRead: acPostProcForDataObjRead error=%d",i);
00054 clearMsParamArray(&msParamArray,0);
00055 return i;
00056 }
00057 clearMsParamArray(&msParamArray,0);
00058
00059 return(0);
00060
00061 }
00062
00063 int
00064 rsDataObjRead (rsComm_t *rsComm, openedDataObjInp_t *dataObjReadInp,
00065 bytesBuf_t *dataObjReadOutBBuf)
00066 {
00067 int bytesRead;
00068 int l1descInx = dataObjReadInp->l1descInx;
00069
00070 if (l1descInx < 2 || l1descInx >= NUM_L1_DESC) {
00071 rodsLog (LOG_NOTICE,
00072 "rsDataObjRead: l1descInx %d out of range",
00073 l1descInx);
00074 return (SYS_FILE_DESC_OUT_OF_RANGE);
00075 }
00076 if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX;
00077 if (L1desc[l1descInx].remoteZoneHost != NULL) {
00078
00079 dataObjReadInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00080 bytesRead = rcDataObjRead (L1desc[l1descInx].remoteZoneHost->conn,
00081 dataObjReadInp, dataObjReadOutBBuf);
00082 dataObjReadInp->l1descInx = l1descInx;
00083 } else {
00084 int i;
00085 bytesRead = l3Read (rsComm, l1descInx, dataObjReadInp->len,
00086 dataObjReadOutBBuf);
00087
00088 i = applyRuleForPostProcForRead(rsComm, dataObjReadOutBBuf,
00089 L1desc[l1descInx].dataObjInfo->objPath);
00090 if (i < 0)
00091 return(i);
00092 #if 0
00093
00094
00095 bytesRead = dataObjReadOutBBuf->len;
00096 #endif
00097
00098 }
00099
00100 return (bytesRead);
00101 }
00102
00103 int
00104 l3Read (rsComm_t *rsComm, int l1descInx, int len,
00105 bytesBuf_t *dataObjReadOutBBuf)
00106 {
00107 int rescTypeInx;
00108 int bytesRead;
00109
00110 dataObjInfo_t *dataObjInfo;
00111 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00112
00113 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00114 subStructFileFdOprInp_t subStructFileReadInp;
00115 memset (&subStructFileReadInp, 0, sizeof (subStructFileReadInp));
00116 subStructFileReadInp.type = dataObjInfo->specColl->type;
00117 subStructFileReadInp.fd = L1desc[l1descInx].l3descInx;
00118 subStructFileReadInp.len = len;
00119 rstrcpy (subStructFileReadInp.addr.hostAddr, dataObjInfo->rescInfo->rescLoc,
00120 NAME_LEN);
00121 bytesRead = rsSubStructFileRead (rsComm, &subStructFileReadInp, dataObjReadOutBBuf);
00122 } else {
00123 fileReadInp_t fileReadInp;
00124
00125 rescTypeInx = L1desc[l1descInx].dataObjInfo->rescInfo->rescTypeInx;
00126
00127 switch (RescTypeDef[rescTypeInx].rescCat) {
00128 case FILE_CAT:
00129 memset (&fileReadInp, 0, sizeof (fileReadInp));
00130 fileReadInp.fileInx = L1desc[l1descInx].l3descInx;
00131 fileReadInp.len = len;
00132 bytesRead = rsFileRead (rsComm, &fileReadInp, dataObjReadOutBBuf);
00133 break;
00134
00135 default:
00136 rodsLog (LOG_NOTICE,
00137 "l3Read: rescCat type %d is not recognized",
00138 RescTypeDef[rescTypeInx].rescCat);
00139 bytesRead = SYS_INVALID_RESC_TYPE;
00140 break;
00141 }
00142 }
00143 return (bytesRead);
00144 }
00145
00146 int
00147 _l3Read (rsComm_t *rsComm, int rescTypeInx, int l3descInx,
00148 void *buf, int len)
00149 {
00150 fileReadInp_t fileReadInp;
00151 bytesBuf_t dataObjReadInpBBuf;
00152 int bytesRead;
00153
00154 dataObjReadInpBBuf.len = len;
00155 dataObjReadInpBBuf.buf = buf;
00156
00157 switch (RescTypeDef[rescTypeInx].rescCat) {
00158 case FILE_CAT:
00159 memset (&fileReadInp, 0, sizeof (fileReadInp));
00160 fileReadInp.fileInx = l3descInx;
00161 fileReadInp.len = len;
00162 bytesRead = rsFileRead (rsComm, &fileReadInp,
00163 &dataObjReadInpBBuf);
00164 break;
00165 default:
00166 rodsLog (LOG_NOTICE,
00167 "_l3Read: rescCat type %d is not recognized",
00168 RescTypeDef[rescTypeInx].rescCat);
00169 bytesRead = SYS_INVALID_RESC_TYPE;
00170 break;
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