00001
00002
00003
00004
00005
00006 #include "fileChksum.h"
00007 #include "miscServerFunct.h"
00008
00009 #define SVR_MD5_BUF_SZ (1024*1024)
00010
00011 int
00012 rsFileChksum (rsComm_t *rsComm, fileChksumInp_t *fileChksumInp,
00013 char **chksumStr)
00014 {
00015 rodsServerHost_t *rodsServerHost;
00016 int remoteFlag;
00017 int status;
00018
00019 remoteFlag = resolveHost (&fileChksumInp->addr, &rodsServerHost);
00020 if (remoteFlag == LOCAL_HOST) {
00021 status = _rsFileChksum (rsComm, fileChksumInp, chksumStr);
00022 } else if (remoteFlag == REMOTE_HOST) {
00023 status = remoteFileChksum (rsComm, fileChksumInp, chksumStr,
00024 rodsServerHost);
00025 } else {
00026 if (remoteFlag < 0) {
00027 return (remoteFlag);
00028 } else {
00029 rodsLog (LOG_NOTICE,
00030 "rsFileChksum: resolveHost returned unrecognized value %d",
00031 remoteFlag);
00032 return (SYS_UNRECOGNIZED_REMOTE_FLAG);
00033 }
00034 }
00035
00036 return (status);
00037 }
00038
00039 int
00040 remoteFileChksum (rsComm_t *rsComm, fileChksumInp_t *fileChksumInp,
00041 char **chksumStr, rodsServerHost_t *rodsServerHost)
00042 {
00043 int status;
00044
00045 if (rodsServerHost == NULL) {
00046 rodsLog (LOG_NOTICE,
00047 "remoteFileChksum: Invalid rodsServerHost");
00048 return SYS_INVALID_SERVER_HOST;
00049 }
00050
00051 if ((status = svrToSvrConnect (rsComm, rodsServerHost)) < 0) {
00052 return status;
00053 }
00054
00055
00056 status = rcFileChksum (rodsServerHost->conn, fileChksumInp, chksumStr);
00057
00058 if (status < 0) {
00059 rodsLog (LOG_NOTICE,
00060 "remoteFileChksum: rcFileChksum failed for %s",
00061 fileChksumInp->fileName);
00062 }
00063
00064 return status;
00065 }
00066
00067 int
00068 _rsFileChksum (rsComm_t *rsComm, fileChksumInp_t *fileChksumInp,
00069 char **chksumStr)
00070 {
00071 int status;
00072
00073 *chksumStr = (char*)malloc (NAME_LEN);
00074
00075 status = fileChksum (fileChksumInp->fileType, rsComm,
00076 fileChksumInp->fileName, *chksumStr);
00077
00078 if (status < 0) {
00079 rodsLog (LOG_NOTICE,
00080 "_rsFileChksum: fileChksum for %s, status = %d",
00081 fileChksumInp->fileName, status);
00082 free (*chksumStr);
00083 *chksumStr = NULL;
00084 return (status);
00085 }
00086
00087 return (status);
00088 }
00089
00090 int
00091 fileChksum (int fileType, rsComm_t *rsComm, char *fileName, char *chksumStr)
00092 {
00093 int fd;
00094 MD5_CTX context;
00095 int len;
00096 unsigned char buffer[SVR_MD5_BUF_SZ], digest[16];
00097 int status;
00098 #ifdef MD5_DEBUG
00099 rodsLong_t bytesRead = 0;
00100 #endif
00101
00102 if ((fd = fileOpen ((fileDriverType_t)fileType, rsComm, fileName, O_RDONLY, 0)) < 0) {
00103 status = UNIX_FILE_OPEN_ERR - errno;
00104 rodsLog (LOG_NOTICE,
00105 "fileChksum; fileOpen failed for %s. status = %d", fileName, status);
00106 return (status);
00107 }
00108
00109 MD5Init (&context);
00110 while ((len = fileRead ((fileDriverType_t)fileType, rsComm, fd, buffer, SVR_MD5_BUF_SZ)) > 0) {
00111 #ifdef MD5_DEBUG
00112 bytesRead += len;
00113 #endif
00114 MD5Update (&context, buffer, len);
00115 }
00116 MD5Final (digest, &context);
00117
00118 fileClose ((fileDriverType_t)fileType, rsComm, fd);
00119
00120 md5ToStr (digest, chksumStr);
00121
00122 #ifdef MD5_DEBUG
00123 rodsLog (LOG_NOTICE,
00124 "fileChksum: chksum = %s, bytesRead = %lld", chksumStr, bytesRead);
00125 #endif
00126
00127 return (0);
00128
00129 }
00130