00001
00002
00003
00004
00005
00006 #include "dataObjWrite.h"
00007 #include "rodsLog.h"
00008 #include "objMetaOpr.h"
00009 #include "subStructFileWrite.h"
00010 #include "rsGlobalExtern.h"
00011 #include "rcGlobalExtern.h"
00012 #include "subStructFileRead.h"
00013 #include "reGlobalsExtern.h"
00014
00015 int
00016 applyRuleForPostProcForWrite(rsComm_t *rsComm, bytesBuf_t *dataObjWriteInpBBuf, char *objPath)
00017 {
00018 int i;
00019 ruleExecInfo_t rei2;
00020 msParamArray_t msParamArray;
00021 int *myInOutStruct;
00022
00023 if (ReadWriteRuleState != ON_STATE) return 0;
00024
00025 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00026 memset ((char*)&msParamArray, 0, sizeof(msParamArray_t));
00027
00028 rei2.rsComm = rsComm;
00029 if (rsComm != NULL) {
00030 rei2.uoic = &rsComm->clientUser;
00031 rei2.uoip = &rsComm->proxyUser;
00032 }
00033 rei2.doi = (dataObjInfo_t*)mallocAndZero(sizeof(dataObjInfo_t));
00034 strcpy(rei2.doi->objPath,objPath);
00035
00036 #if 0
00037 addMsParam(&msParamArray, "*WriteBuf", BUF_LEN_MS_T,
00038 (void *) dataObjWriteInpBBuf->len , dataObjWriteInpBBuf);
00039 #else
00040 bzero (&msParamArray, sizeof (msParamArray));
00041 myInOutStruct = (int*)malloc (sizeof (int));
00042 *myInOutStruct = dataObjWriteInpBBuf->len;
00043 addMsParamToArray (&msParamArray, "*WriteBuf", BUF_LEN_MS_T, myInOutStruct,
00044 dataObjWriteInpBBuf, 0);
00045 #endif
00046 i = applyRule("acPostProcForDataObjWrite(*WriteBuf)",&msParamArray, &rei2, 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 "rsDataObjWrite: acPostProcForDataObjWrite 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 rsDataObjWrite (rsComm_t *rsComm, openedDataObjInp_t *dataObjWriteInp,
00065 bytesBuf_t *dataObjWriteInpBBuf)
00066 {
00067 int bytesWritten;
00068
00069 int l1descInx = dataObjWriteInp->l1descInx;
00070
00071 if (l1descInx < 2 || l1descInx >= NUM_L1_DESC) {
00072 rodsLog (LOG_NOTICE,
00073 "rsDataObjWrite: l1descInx %d out of range",
00074 l1descInx);
00075 return (SYS_FILE_DESC_OUT_OF_RANGE);
00076 }
00077 if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX;
00078 if (L1desc[l1descInx].remoteZoneHost != NULL) {
00079
00080 dataObjWriteInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00081 bytesWritten = rcDataObjWrite (L1desc[l1descInx].remoteZoneHost->conn,
00082 dataObjWriteInp, dataObjWriteInpBBuf);
00083 dataObjWriteInp->l1descInx = l1descInx;
00084 } else {
00085
00086 int i;
00087 i = applyRuleForPostProcForWrite(rsComm, dataObjWriteInpBBuf,
00088 L1desc[l1descInx].dataObjInfo->objPath);
00089 if (i < 0)
00090 return(i);
00091 dataObjWriteInp->len = dataObjWriteInpBBuf->len;
00092
00093 bytesWritten = l3Write (rsComm, l1descInx, dataObjWriteInp->len,
00094 dataObjWriteInpBBuf);
00095 }
00096
00097 return (bytesWritten);
00098 }
00099
00100 int
00101 l3Write (rsComm_t *rsComm, int l1descInx, int len,
00102 bytesBuf_t *dataObjWriteInpBBuf)
00103 {
00104 int rescTypeInx;
00105 fileWriteInp_t fileWriteInp;
00106 int bytesWritten;
00107
00108 dataObjInfo_t *dataObjInfo;
00109 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00110
00111 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00112 subStructFileFdOprInp_t subStructFileWriteInp;
00113 memset (&subStructFileWriteInp, 0, sizeof (subStructFileWriteInp));
00114 subStructFileWriteInp.type = dataObjInfo->specColl->type;
00115 subStructFileWriteInp.fd = L1desc[l1descInx].l3descInx;
00116 subStructFileWriteInp.len = len;
00117 rstrcpy (subStructFileWriteInp.addr.hostAddr, dataObjInfo->rescInfo->rescLoc,
00118 NAME_LEN);
00119 bytesWritten = rsSubStructFileWrite (rsComm, &subStructFileWriteInp,
00120 dataObjWriteInpBBuf);
00121 } else {
00122 rescTypeInx = L1desc[l1descInx].dataObjInfo->rescInfo->rescTypeInx;
00123
00124 switch (RescTypeDef[rescTypeInx].rescCat) {
00125 case FILE_CAT:
00126 memset (&fileWriteInp, 0, sizeof (fileWriteInp));
00127 fileWriteInp.fileInx = L1desc[l1descInx].l3descInx;
00128 fileWriteInp.len = len;
00129 bytesWritten = rsFileWrite (rsComm, &fileWriteInp,
00130 dataObjWriteInpBBuf);
00131 if (bytesWritten > 0) {
00132 L1desc[l1descInx].bytesWritten+=bytesWritten;
00133 }
00134 break;
00135
00136 default:
00137 rodsLog (LOG_NOTICE,
00138 "l3Write: rescCat type %d is not recognized",
00139 RescTypeDef[rescTypeInx].rescCat);
00140 bytesWritten = SYS_INVALID_RESC_TYPE;
00141 break;
00142 }
00143 }
00144 return (bytesWritten);
00145 }
00146
00147 int
00148 _l3Write (rsComm_t *rsComm, int rescTypeInx, int l3descInx,
00149 void *buf, int len)
00150 {
00151 fileWriteInp_t fileWriteInp;
00152 bytesBuf_t dataObjWriteInpBBuf;
00153 int bytesWritten;
00154
00155 dataObjWriteInpBBuf.len = len;
00156 dataObjWriteInpBBuf.buf = buf;
00157
00158 switch (RescTypeDef[rescTypeInx].rescCat) {
00159 case FILE_CAT:
00160 memset (&fileWriteInp, 0, sizeof (fileWriteInp));
00161 fileWriteInp.fileInx = l3descInx;
00162 fileWriteInp.len = len;
00163 bytesWritten = rsFileWrite (rsComm, &fileWriteInp,
00164 &dataObjWriteInpBBuf);
00165 break;
00166 default:
00167 rodsLog (LOG_NOTICE,
00168 "_l3Write: rescCat type %d is not recognized",
00169 RescTypeDef[rescTypeInx].rescCat);
00170 bytesWritten = SYS_INVALID_RESC_TYPE;
00171 break;
00172 }
00173 return (bytesWritten);
00174 }
00175
00176 #ifdef COMPAT_201
00177 int
00178 rsDataObjWrite201 (rsComm_t *rsComm, dataObjWriteInp_t *dataObjWriteInp,
00179 bytesBuf_t *dataObjWriteInpBBuf)
00180 {
00181 openedDataObjInp_t openedDataObjInp;
00182 int status;
00183
00184 bzero (&openedDataObjInp, sizeof (openedDataObjInp));
00185
00186 openedDataObjInp.l1descInx = dataObjWriteInp->l1descInx;
00187 openedDataObjInp.len = dataObjWriteInp->len;
00188
00189 status = rsDataObjWrite (rsComm, &openedDataObjInp, dataObjWriteInpBBuf);
00190
00191 return status;
00192 }
00193 #endif
00194