00001 #include "reGlobalsExtern.h"
00002 #include "dataObjChksum.h"
00003 #include "dataObjRsync.h"
00004 #include "objMetaOpr.h"
00005 #include "specColl.h"
00006 #include "dataObjOpr.h"
00007 #include "rsApiHandler.h"
00008 #include "modDataObjMeta.h"
00009 #include "getRemoteZoneResc.h"
00010
00011 int
00012 rsDataObjRsync (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00013 msParamArray_t **outParamArray)
00014 {
00015 int status;
00016 char *rsyncMode;
00017 char *remoteZoneOpr;
00018 int remoteFlag;
00019 rodsServerHost_t *rodsServerHost;
00020 specCollCache_t *specCollCache = NULL;
00021
00022 *outParamArray = NULL;
00023 if (dataObjInp == NULL) {
00024 rodsLog(LOG_ERROR, "rsDataObjRsync error. NULL input");
00025 return (SYS_INTERNAL_NULL_INPUT_ERR);
00026 }
00027
00028 rsyncMode = getValByKey (&dataObjInp->condInput, RSYNC_MODE_KW);
00029 if (rsyncMode == NULL) {
00030 rodsLog (LOG_ERROR,
00031 "rsDataObjRsync: RSYNC_MODE_KW input is missing");
00032 return (USER_RSYNC_NO_MODE_INPUT_ERR);
00033 }
00034
00035 if (strcmp (rsyncMode, LOCAL_TO_IRODS) == 0) {
00036 remoteZoneOpr = REMOTE_CREATE;
00037 } else {
00038 remoteZoneOpr = REMOTE_OPEN;
00039 }
00040
00041 resolveLinkedPath (rsComm, dataObjInp->objPath, &specCollCache,
00042 &dataObjInp->condInput);
00043 if (strcmp (rsyncMode, IRODS_TO_IRODS) == 0) {
00044 if (isLocalZone (dataObjInp->objPath) == 0) {
00045 dataObjInp_t myDataObjInp;
00046 char *destObjPath;
00047
00048 destObjPath = getValByKey (&dataObjInp->condInput,
00049 RSYNC_DEST_PATH_KW);
00050 if (destObjPath == NULL) {
00051 rodsLog (LOG_ERROR,
00052 "rsDataObjRsync: RSYNC_DEST_PATH_KW input is missing for %s",
00053 dataObjInp->objPath);
00054 return (USER_RSYNC_NO_MODE_INPUT_ERR);
00055 }
00056 myDataObjInp = *dataObjInp;
00057 remoteZoneOpr = REMOTE_CREATE;
00058 rstrcpy (myDataObjInp.objPath, destObjPath, MAX_NAME_LEN);
00059 remoteFlag = getAndConnRemoteZone (rsComm, &myDataObjInp,
00060 &rodsServerHost, remoteZoneOpr);
00061 } else {
00062 remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp,
00063 &rodsServerHost, remoteZoneOpr);
00064 }
00065 } else {
00066 remoteFlag = getAndConnRemoteZone (rsComm, dataObjInp, &rodsServerHost,
00067 remoteZoneOpr);
00068 }
00069
00070 if (remoteFlag < 0) {
00071 return (remoteFlag);
00072 } else if (remoteFlag == REMOTE_HOST) {
00073
00074 status = _rcDataObjRsync (rodsServerHost->conn, dataObjInp,
00075 outParamArray);
00076 #if 0
00077 int l1descInx;
00078 if (status < 0) {
00079 return (status);
00080 }
00081
00082 if (status == SYS_SVR_TO_CLI_MSI_REQUEST) {
00083
00084 l1descInx = allocAndSetL1descForZoneOpr (0, dataObjInp,
00085 rodsServerHost, NULL);
00086 if (l1descInx < 0) return l1descInx;
00087 if (*outParamArray == NULL) {
00088 *outParamArray = malloc (sizeof (msParamArray_t));
00089 bzero (*outParamArray, sizeof (msParamArray_t));
00090 }
00091 addIntParamToArray (*outParamArray, CL_ZONE_OPR_INX, l1descInx);
00092 }
00093 #endif
00094 return status;
00095 }
00096
00097 if (strcmp (rsyncMode, IRODS_TO_LOCAL) == 0) {
00098 status = rsRsyncFileToData (rsComm, dataObjInp);
00099 } else if (strcmp (rsyncMode, LOCAL_TO_IRODS) == 0) {
00100 status = rsRsyncDataToFile (rsComm, dataObjInp);
00101 } else if (strcmp (rsyncMode, IRODS_TO_IRODS) == 0) {
00102 status = rsRsyncDataToData (rsComm, dataObjInp);
00103 } else {
00104 rodsLog (LOG_ERROR,
00105 "rsDataObjRsync: rsyncMode %s not supported");
00106 return (USER_RSYNC_NO_MODE_INPUT_ERR);
00107 }
00108
00109 return (status);
00110 }
00111
00112 int
00113 rsRsyncDataToFile (rsComm_t *rsComm, dataObjInp_t *dataObjInp)
00114 {
00115 int status;
00116 char *fileChksumStr = NULL;
00117 char *dataObjChksumStr = NULL;
00118 dataObjInfo_t *dataObjInfoHead = NULL;
00119
00120 fileChksumStr = getValByKey (&dataObjInp->condInput, RSYNC_CHKSUM_KW);
00121
00122 if (fileChksumStr == NULL) {
00123 rodsLog (LOG_ERROR,
00124 "rsRsyncDataToFile: RSYNC_CHKSUM_KW input is missing for %s",
00125 dataObjInp->objPath);
00126 return (CHKSUM_EMPTY_IN_STRUCT_ERR);
00127 }
00128
00129 status = _rsDataObjChksum (rsComm, dataObjInp, &dataObjChksumStr,
00130 &dataObjInfoHead);
00131
00132 if (status < 0 && status != CAT_NO_ACCESS_PERMISSION &&
00133 status != CAT_NO_ROWS_FOUND) {
00134
00135
00136
00137 rodsLog (LOG_ERROR,
00138 "rsRsyncDataToFile: _rsDataObjChksum of %s error. status = %d",
00139 dataObjInp->objPath, status);
00140 return (status);
00141 }
00142
00143 freeAllDataObjInfo (dataObjInfoHead);
00144
00145 if (dataObjChksumStr != NULL &&
00146 strcmp (dataObjChksumStr, fileChksumStr) == 0) {
00147 free (dataObjChksumStr);
00148 return (0);
00149 }
00150
00151 return SYS_SVR_TO_CLI_GET_ACTION;
00152 #if 0
00153 msParamArray_t *myMsParamArray;
00154 dataObjInp_t *myDataObjInp;
00155
00156 myMsParamArray = malloc (sizeof (msParamArray_t));
00157 memset (myMsParamArray, 0, sizeof (msParamArray_t));
00158
00159 myDataObjInp = malloc (sizeof (dataObjInp_t));
00160 replDataObjInp (dataObjInp, myDataObjInp);
00161
00162 status = addMsParam (myMsParamArray, CL_GET_ACTION, DataObjInp_MS_T,
00163 (void *) myDataObjInp, NULL);
00164
00165 if (status < 0) {
00166 rodsLogAndErrorMsg (LOG_ERROR, &rsComm->rError, status,
00167 "rsRsyncDataToFile: addMsParam error. status = %d", status);
00168 return (status);
00169 }
00170
00171
00172 status = sendAndRecvBranchMsg (rsComm, rsComm->apiInx,
00173 SYS_SVR_TO_CLI_MSI_REQUEST, (void *) myMsParamArray, NULL);
00174
00175 return (status);
00176 #endif
00177 }
00178
00179 int
00180 rsRsyncFileToData (rsComm_t *rsComm, dataObjInp_t *dataObjInp)
00181 {
00182 int status;
00183 char *fileChksumStr = NULL;
00184 char *dataObjChksumStr = NULL;
00185 dataObjInfo_t *dataObjInfoHead = NULL;
00186
00187 fileChksumStr = getValByKey (&dataObjInp->condInput, RSYNC_CHKSUM_KW);
00188
00189 if (fileChksumStr == NULL) {
00190 rodsLog (LOG_ERROR,
00191 "rsRsyncFileToData: RSYNC_CHKSUM_KW input is missing");
00192 return (CHKSUM_EMPTY_IN_STRUCT_ERR);
00193 }
00194
00195 status = _rsDataObjChksum (rsComm, dataObjInp, &dataObjChksumStr,
00196 &dataObjInfoHead);
00197
00198 if (status < 0 && status != CAT_NO_ACCESS_PERMISSION &&
00199 status != CAT_NO_ROWS_FOUND) {
00200
00201
00202
00203 rodsLog (LOG_ERROR,
00204 "rsRsyncFileToData: _rsDataObjChksum of %s error. status = %d",
00205 dataObjInp->objPath, status);
00206 }
00207
00208 freeAllDataObjInfo (dataObjInfoHead);
00209
00210 if (dataObjChksumStr != NULL &&
00211 strcmp (dataObjChksumStr, fileChksumStr) == 0) {
00212 free (dataObjChksumStr);
00213 return (0);
00214 }
00215 return SYS_SVR_TO_CLI_PUT_ACTION;
00216 #if 0
00217 msParamArray_t *myMsParamArray;
00218 dataObjInp_t *myDataObjInp;
00219
00220 myMsParamArray = malloc (sizeof (msParamArray_t));
00221 memset (myMsParamArray, 0, sizeof (msParamArray_t));
00222
00223 myDataObjInp = malloc (sizeof (dataObjInp_t));
00224 replDataObjInp (dataObjInp, myDataObjInp);
00225 addKeyVal (&myDataObjInp->condInput, REG_CHKSUM_KW, fileChksumStr);
00226
00227 status = addMsParam (myMsParamArray, CL_PUT_ACTION, DataObjInp_MS_T,
00228 (void *) myDataObjInp, NULL);
00229
00230 if (status < 0) {
00231 rodsLogAndErrorMsg (LOG_ERROR, &rsComm->rError, status,
00232 "rsRsyncDataToFile: addMsParam error. status = %d", status);
00233 return (status);
00234 }
00235
00236
00237 status = sendAndRecvBranchMsg (rsComm, rsComm->apiInx,
00238 SYS_SVR_TO_CLI_MSI_REQUEST, (void *) myMsParamArray, NULL);
00239
00240 return (status);
00241 #endif
00242 }
00243
00244 int
00245 rsRsyncDataToData (rsComm_t *rsComm, dataObjInp_t *dataObjInp)
00246 {
00247 int status;
00248 char *srcChksumStr = NULL;
00249 char *destChksumStr = NULL;
00250 #if 0
00251 dataObjInfo_t *srcDataObjInfoHead = NULL;
00252 dataObjInfo_t *destDataObjInfoHead = NULL;
00253 #endif
00254 dataObjCopyInp_t dataObjCopyInp;
00255 char *destObjPath;
00256 transferStat_t *transStat = NULL;
00257
00258
00259 addKeyVal (&dataObjInp->condInput, FORCE_FLAG_KW, "");
00260
00261 destObjPath = getValByKey (&dataObjInp->condInput, RSYNC_DEST_PATH_KW);
00262 if (destObjPath == NULL) {
00263 rodsLog (LOG_ERROR,
00264 "rsRsyncDataToData: RSYNC_DEST_PATH_KW input is missing for %s",
00265 dataObjInp->objPath);
00266 return (USER_RSYNC_NO_MODE_INPUT_ERR);
00267 }
00268
00269 memset (&dataObjCopyInp, 0, sizeof (dataObjCopyInp));
00270 rstrcpy (dataObjCopyInp.srcDataObjInp.objPath, dataObjInp->objPath,
00271 MAX_NAME_LEN);
00272 dataObjCopyInp.srcDataObjInp.dataSize = dataObjInp->dataSize;
00273 replDataObjInp (dataObjInp, &dataObjCopyInp.destDataObjInp);
00274 rstrcpy (dataObjCopyInp.destDataObjInp.objPath, destObjPath,
00275 MAX_NAME_LEN);
00276
00277
00278 status = rsDataObjChksum (rsComm, &dataObjCopyInp.srcDataObjInp,
00279 &srcChksumStr);
00280
00281 if (status < 0 &&
00282 (status != CAT_NO_ACCESS_PERMISSION || srcChksumStr == NULL)) {
00283
00284
00285
00286 rodsLog (LOG_ERROR,
00287 "rsRsyncDataToData: _rsDataObjChksum error for %s, status = %d",
00288 dataObjCopyInp.srcDataObjInp.objPath, status);
00289 clearKeyVal (&dataObjCopyInp.destDataObjInp.condInput);
00290 return (status);
00291 }
00292
00293
00294 status = rsDataObjChksum (rsComm, &dataObjCopyInp.destDataObjInp,
00295 &destChksumStr);
00296
00297 if (status < 0 && status != CAT_NO_ACCESS_PERMISSION &&
00298 status != CAT_NO_ROWS_FOUND) {
00299 rodsLog (LOG_ERROR,
00300 "rsRsyncDataToData: _rsDataObjChksum error for %s, status = %d",
00301 dataObjCopyInp.destDataObjInp.objPath, status);
00302 clearKeyVal (&dataObjCopyInp.destDataObjInp.condInput);
00303 return (status);
00304 }
00305
00306 if (destChksumStr != NULL && strcmp (srcChksumStr, destChksumStr) == 0) {
00307 free (srcChksumStr);
00308 free (destChksumStr);
00309 clearKeyVal (&dataObjCopyInp.destDataObjInp.condInput);
00310 clearKeyVal (&dataObjCopyInp.srcDataObjInp.condInput);
00311 return (0);
00312 }
00313
00314 addKeyVal (&dataObjCopyInp.destDataObjInp.condInput, REG_CHKSUM_KW,
00315 srcChksumStr);
00316 status = rsDataObjCopy (rsComm, &dataObjCopyInp, &transStat);
00317 if (transStat != NULL) {
00318 free (transStat);
00319 }
00320 free (srcChksumStr);
00321 if (destChksumStr != NULL)
00322 free (destChksumStr);
00323 clearKeyVal (&dataObjCopyInp.destDataObjInp.condInput);
00324 clearKeyVal (&dataObjCopyInp.srcDataObjInp.condInput);
00325
00326 if (status >= 0) {
00327 return SYS_RSYNC_TARGET_MODIFIED;
00328 } else {
00329 return status;
00330 }
00331 }
00332