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
00016
00017 #include "eirods_resource_backport.h"
00018 #include "eirods_hierarchy_parser.h"
00019
00020
00021 int
00022 applyRuleForPostProcForWrite(rsComm_t *rsComm, bytesBuf_t *dataObjWriteInpBBuf, char *objPath)
00023 {
00024 int i;
00025 ruleExecInfo_t rei2;
00026 msParamArray_t msParamArray;
00027 int *myInOutStruct;
00028
00029 if (ReadWriteRuleState != ON_STATE) return 0;
00030
00031 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00032 memset ((char*)&msParamArray, 0, sizeof(msParamArray_t));
00033
00034 rei2.rsComm = rsComm;
00035 if (rsComm != NULL) {
00036 rei2.uoic = &rsComm->clientUser;
00037 rei2.uoip = &rsComm->proxyUser;
00038 }
00039 rei2.doi = (dataObjInfo_t*)mallocAndZero(sizeof(dataObjInfo_t));
00040 strcpy(rei2.doi->objPath,objPath);
00041
00042 #if 0
00043 addMsParam(&msParamArray, "*WriteBuf", BUF_LEN_MS_T,
00044 (void *) dataObjWriteInpBBuf->len , dataObjWriteInpBBuf);
00045 #else
00046 bzero (&msParamArray, sizeof (msParamArray));
00047 myInOutStruct = (int*)malloc (sizeof (int));
00048 *myInOutStruct = dataObjWriteInpBBuf->len;
00049 addMsParamToArray (&msParamArray, "*WriteBuf", BUF_LEN_MS_T, myInOutStruct,
00050 dataObjWriteInpBBuf, 0);
00051 #endif
00052 i = applyRule("acPostProcForDataObjWrite(*WriteBuf)",&msParamArray, &rei2, NO_SAVE_REI);
00053 free (rei2.doi);
00054 if (i < 0) {
00055 if (rei2.status < 0) {
00056 i = rei2.status;
00057 }
00058 rodsLog (LOG_ERROR,
00059 "rsDataObjWrite: acPostProcForDataObjWrite error=%d",i);
00060 clearMsParamArray(&msParamArray,0);
00061 return i;
00062 }
00063 clearMsParamArray(&msParamArray,0);
00064
00065 return(0);
00066
00067 }
00068
00069 int
00070 rsDataObjWrite (rsComm_t *rsComm, openedDataObjInp_t *dataObjWriteInp,
00071 bytesBuf_t *dataObjWriteInpBBuf)
00072 {
00073 int bytesWritten;
00074
00075 int l1descInx = dataObjWriteInp->l1descInx;
00076
00077 if (l1descInx < 2 || l1descInx >= NUM_L1_DESC) {
00078 rodsLog (LOG_NOTICE,
00079 "rsDataObjWrite: l1descInx %d out of range",
00080 l1descInx);
00081 return (SYS_FILE_DESC_OUT_OF_RANGE);
00082 }
00083 if (L1desc[l1descInx].inuseFlag != FD_INUSE) return BAD_INPUT_DESC_INDEX;
00084 if (L1desc[l1descInx].remoteZoneHost != NULL) {
00085
00086 dataObjWriteInp->l1descInx = L1desc[l1descInx].remoteL1descInx;
00087 bytesWritten = rcDataObjWrite (L1desc[l1descInx].remoteZoneHost->conn,
00088 dataObjWriteInp, dataObjWriteInpBBuf);
00089 dataObjWriteInp->l1descInx = l1descInx;
00090 } else {
00091 int i;
00092 i = applyRuleForPostProcForWrite(rsComm, dataObjWriteInpBBuf,
00093 L1desc[l1descInx].dataObjInfo->objPath);
00094 if (i < 0)
00095 return(i);
00096 dataObjWriteInp->len = dataObjWriteInpBBuf->len;
00097 bytesWritten = l3Write (rsComm, l1descInx, dataObjWriteInp->len,
00098 dataObjWriteInpBBuf);
00099 }
00100
00101 return (bytesWritten);
00102 }
00103
00104 int
00105 l3Write (rsComm_t *rsComm, int l1descInx, int len,
00106 bytesBuf_t *dataObjWriteInpBBuf)
00107 {
00108 fileWriteInp_t fileWriteInp;
00109 int bytesWritten;
00110
00111 dataObjInfo_t *dataObjInfo;
00112 dataObjInfo = L1desc[l1descInx].dataObjInfo;
00113
00114 std::string location;
00115 eirods::error ret = eirods::get_loc_for_hier_string( dataObjInfo->rescHier, location );
00116 if( !ret.ok() ) {
00117 eirods::log( PASSMSG( "l3Write - failed in get_loc_for_hier_string", ret ) );
00118 return -1;
00119 }
00120
00121 if (getStructFileType (dataObjInfo->specColl) >= 0) {
00122 subStructFileFdOprInp_t subStructFileWriteInp;
00123 memset (&subStructFileWriteInp, 0, sizeof (subStructFileWriteInp));
00124 subStructFileWriteInp.type = dataObjInfo->specColl->type;
00125 subStructFileWriteInp.fd = L1desc[l1descInx].l3descInx;
00126 subStructFileWriteInp.len = len;
00127 rstrcpy( subStructFileWriteInp.addr.hostAddr, location.c_str(), NAME_LEN );
00128 bytesWritten = rsSubStructFileWrite( rsComm, &subStructFileWriteInp, dataObjWriteInpBBuf );
00129
00130 } else {
00131 memset (&fileWriteInp, 0, sizeof (fileWriteInp));
00132 fileWriteInp.fileInx = L1desc[l1descInx].l3descInx;
00133 fileWriteInp.len = len;
00134 bytesWritten = rsFileWrite (rsComm, &fileWriteInp,
00135 dataObjWriteInpBBuf);
00136 if (bytesWritten > 0) {
00137 L1desc[l1descInx].bytesWritten+=bytesWritten;
00138 }
00139 }
00140 return (bytesWritten);
00141 }
00142
00143 int
00144 _l3Write (rsComm_t *rsComm, int rescTypeInx, int l3descInx,
00145 void *buf, int len)
00146 {
00147 fileWriteInp_t fileWriteInp;
00148 bytesBuf_t dataObjWriteInpBBuf;
00149 int bytesWritten;
00150
00151 dataObjWriteInpBBuf.len = len;
00152 dataObjWriteInpBBuf.buf = buf;
00153 memset (&fileWriteInp, 0, sizeof (fileWriteInp));
00154 fileWriteInp.fileInx = l3descInx;
00155 fileWriteInp.len = len;
00156 bytesWritten = rsFileWrite (rsComm, &fileWriteInp,
00157 &dataObjWriteInpBBuf);
00158 return (bytesWritten);
00159 }
00160
00161 #ifdef COMPAT_201
00162 int
00163 rsDataObjWrite201 (rsComm_t *rsComm, dataObjWriteInp_t *dataObjWriteInp,
00164 bytesBuf_t *dataObjWriteInpBBuf)
00165 {
00166 openedDataObjInp_t openedDataObjInp;
00167 int status;
00168
00169 bzero (&openedDataObjInp, sizeof (openedDataObjInp));
00170
00171 openedDataObjInp.l1descInx = dataObjWriteInp->l1descInx;
00172 openedDataObjInp.len = dataObjWriteInp->len;
00173
00174 status = rsDataObjWrite (rsComm, &openedDataObjInp, dataObjWriteInpBBuf);
00175
00176 return status;
00177 }
00178 #endif
00179