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