00001 #include "reGlobalsExtern.h"
00002 #include "dataObjChksum.h"
00003 #include "objMetaOpr.h"
00004 #include "resource.h"
00005 #include "specColl.h"
00006 #include "dataObjOpr.h"
00007 #include "physPath.h"
00008 #include "rsApiHandler.h"
00009 #include "modDataObjMeta.h"
00010 #include "getRemoteZoneResc.h"
00011
00012 int
00013 rsDataObjChksum (rsComm_t *rsComm, dataObjInp_t *dataObjChksumInp,
00014 char **outChksum)
00015 {
00016 int status;
00017 dataObjInfo_t *dataObjInfoHead;
00018 int remoteFlag;
00019 rodsServerHost_t *rodsServerHost;
00020 specCollCache_t *specCollCache = NULL;
00021
00022 resolveLinkedPath (rsComm, dataObjChksumInp->objPath, &specCollCache,
00023 &dataObjChksumInp->condInput);
00024 remoteFlag = getAndConnRemoteZone (rsComm, dataObjChksumInp,
00025 &rodsServerHost, REMOTE_OPEN);
00026
00027 if (remoteFlag < 0) {
00028 return (remoteFlag);
00029 } else if (remoteFlag == REMOTE_HOST) {
00030 status = rcDataObjChksum (rodsServerHost->conn, dataObjChksumInp,
00031 outChksum);
00032 return status;
00033 } else {
00034 status = _rsDataObjChksum (rsComm, dataObjChksumInp, outChksum,
00035 &dataObjInfoHead);
00036 }
00037
00038 freeAllDataObjInfo (dataObjInfoHead);
00039 return (status);
00040 }
00041
00042 int
00043 _rsDataObjChksum (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00044 char **outChksumStr, dataObjInfo_t **dataObjInfoHead)
00045 {
00046 int status;
00047 dataObjInfo_t *tmpDataObjInfo;
00048 int allFlag;
00049 int verifyFlag;
00050 int forceFlag;
00051
00052 if (getValByKey (&dataObjInp->condInput, CHKSUM_ALL_KW) != NULL) {
00053 allFlag = 1;
00054 } else {
00055 allFlag = 0;
00056 }
00057
00058 if (getValByKey (&dataObjInp->condInput, VERIFY_CHKSUM_KW) != NULL) {
00059 verifyFlag = 1;
00060 } else {
00061 verifyFlag = 0;
00062 }
00063
00064 if (getValByKey (&dataObjInp->condInput, FORCE_CHKSUM_KW) != NULL) {
00065 forceFlag = 1;
00066 } else {
00067 forceFlag = 0;
00068 }
00069
00070 *dataObjInfoHead = NULL;
00071 *outChksumStr = NULL;
00072 status = getDataObjInfoIncSpecColl (rsComm, dataObjInp, dataObjInfoHead);
00073
00074 if (status < 0) {
00075 return status;
00076 } else if (allFlag == 0) {
00077
00078 status = sortObjInfoForOpen (rsComm, dataObjInfoHead,
00079 &dataObjInp->condInput, 0);
00080 if (status < 0) return status;
00081
00082 tmpDataObjInfo = *dataObjInfoHead;
00083 if (tmpDataObjInfo->next == NULL) {
00084
00085 if (strlen (tmpDataObjInfo->chksum) > 0) {
00086 if (verifyFlag == 0 && forceFlag == 0) {
00087 *outChksumStr = strdup (tmpDataObjInfo->chksum);
00088 return (0);
00089 }
00090 }
00091 } else {
00092 while (tmpDataObjInfo != NULL) {
00093 if (tmpDataObjInfo->replStatus > 0 &&
00094 strlen (tmpDataObjInfo->chksum) > 0) {
00095 if (verifyFlag == 0 && forceFlag == 0) {
00096 *outChksumStr = strdup (tmpDataObjInfo->chksum);
00097 return (0);
00098 } else {
00099 break;
00100 }
00101 }
00102 tmpDataObjInfo = tmpDataObjInfo->next;
00103 }
00104 }
00105
00106 if (tmpDataObjInfo == NULL) {
00107 tmpDataObjInfo = *dataObjInfoHead;
00108 }
00109 if (verifyFlag > 0 && strlen (tmpDataObjInfo->chksum) > 0) {
00110 status = verifyDatObjChksum (rsComm, tmpDataObjInfo,
00111 outChksumStr);
00112 } else {
00113 status = dataObjChksumAndRegInfo (rsComm, tmpDataObjInfo,
00114 outChksumStr);
00115 }
00116 return (status);
00117 }
00118
00119
00120 tmpDataObjInfo = *dataObjInfoHead;
00121 while (tmpDataObjInfo != NULL) {
00122 char *tmpChksumStr;
00123 dataObjInfo_t *outDataObjInfo = NULL;
00124 int rescClass = getRescClass (tmpDataObjInfo->rescInfo);
00125 if (rescClass == COMPOUND_CL) {
00126
00127 if ((status = getCacheDataInfoForRepl (rsComm, *dataObjInfoHead,
00128 NULL, tmpDataObjInfo, &outDataObjInfo)) >= 0) {
00129 tmpDataObjInfo = tmpDataObjInfo->next;
00130 status = 0;
00131 continue;
00132 }
00133 } else if (rescClass == BUNDLE_CL) {
00134
00135 tmpDataObjInfo = tmpDataObjInfo->next;
00136 status = 0;
00137 continue;
00138 }
00139 if (strlen (tmpDataObjInfo->chksum) == 0) {
00140
00141 status = dataObjChksumAndRegInfo (rsComm, tmpDataObjInfo,
00142 &tmpChksumStr);
00143 } else if (verifyFlag > 0) {
00144 status = verifyDatObjChksum (rsComm, tmpDataObjInfo,
00145 &tmpChksumStr);
00146 } else if (forceFlag > 0) {
00147 status = dataObjChksumAndRegInfo (rsComm, tmpDataObjInfo,
00148 &tmpChksumStr);
00149 } else {
00150 tmpChksumStr = strdup (tmpDataObjInfo->chksum);
00151 status = 0;
00152 }
00153
00154 if (status < 0) {
00155 return (status);
00156 }
00157 if (tmpDataObjInfo->replStatus > 0 && *outChksumStr == NULL) {
00158 *outChksumStr = tmpChksumStr;
00159 } else {
00160
00161 if (strlen (tmpDataObjInfo->chksum) == 0) {
00162 rstrcpy (tmpDataObjInfo->chksum, tmpChksumStr, NAME_LEN);
00163 }
00164 free (tmpChksumStr);
00165 }
00166 tmpDataObjInfo = tmpDataObjInfo->next;
00167 }
00168 if (*outChksumStr == NULL) {
00169 *outChksumStr = strdup ((*dataObjInfoHead)->chksum);
00170 }
00171
00172 return (status);
00173 }
00174
00175 int
00176 dataObjChksumAndRegInfo (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00177 char **outChksumStr)
00178 {
00179 modDataObjMeta_t modDataObjMetaInp;
00180 keyValPair_t regParam;
00181 int status;
00182
00183 status = _dataObjChksum (rsComm, dataObjInfo, outChksumStr);
00184
00185 if (status < 0) {
00186 rodsLog (LOG_ERROR,
00187 "dataObjChksumAndRegInfo: _dataObjChksum error for %s, status = %d",
00188 dataObjInfo->objPath, status);
00189 return status;
00190 }
00191
00192 if (dataObjInfo->specColl != NULL) {
00193 return (status);
00194 }
00195 memset (®Param, 0, sizeof (regParam));
00196 addKeyVal (®Param, CHKSUM_KW, *outChksumStr);
00197 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00198 modDataObjMetaInp.regParam = ®Param;
00199 status = rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00200 clearKeyVal (®Param);
00201
00202 return (status);
00203 }
00204
00205 int
00206 verifyDatObjChksum (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00207 char **outChksumStr)
00208 {
00209 int status;
00210
00211 status = _dataObjChksum (rsComm, dataObjInfo, outChksumStr);
00212 if (status < 0) {
00213 rodsLog (LOG_ERROR,
00214 "verifyDatObjChksum:_dataObjChksum error for %s, stat=%d",
00215 dataObjInfo->objPath, status);
00216 return (status);
00217 }
00218
00219 if (strcmp (*outChksumStr, dataObjInfo->chksum) != 0) {
00220 rodsLog (LOG_ERROR,
00221 "verifyDatObjChksum: computed chksum %s != icat value %s for %s",
00222 *outChksumStr, dataObjInfo->chksum, dataObjInfo->objPath);
00223 return (USER_CHKSUM_MISMATCH);
00224 } else {
00225 return status;
00226 }
00227 }
00228
00229