int CompareFileHashes(const char *file1, const char *file2, struct stat *sstat, struct stat *dstat, FileCopy fc, AgentConnection *conn) { unsigned char digest1[EVP_MAX_MD_SIZE + 1] = { 0 }, digest2[EVP_MAX_MD_SIZE + 1] = { 0 }; int i; if (sstat->st_size != dstat->st_size) { Log(LOG_LEVEL_DEBUG, "File sizes differ, no need to compute checksum"); return true; } if (conn == NULL) { HashFile(file1, digest1, CF_DEFAULT_DIGEST); HashFile(file2, digest2, CF_DEFAULT_DIGEST); for (i = 0; i < EVP_MAX_MD_SIZE; i++) { if (digest1[i] != digest2[i]) { return true; } } Log(LOG_LEVEL_DEBUG, "Files were identical"); return false; /* only if files are identical */ } else { assert(fc.servers && strcmp(RlistScalarValue(fc.servers), "localhost")); return CompareHashNet(file1, file2, fc.encrypt, conn); /* client.c */ } }
int CompareFileHashes(char *file1, char *file2, struct stat *sstat, struct stat *dstat, Attributes attr, Promise *pp) { unsigned char digest1[EVP_MAX_MD_SIZE + 1] = { 0 }, digest2[EVP_MAX_MD_SIZE + 1] = { 0 }; int i; CfDebug("CompareFileHashes(%s,%s)\n", file1, file2); if (sstat->st_size != dstat->st_size) { CfDebug("File sizes differ, no need to compute checksum\n"); return true; } if ((attr.copy.servers == NULL) || (strcmp(attr.copy.servers->item, "localhost") == 0)) { HashFile(file1, digest1, CF_DEFAULT_DIGEST); HashFile(file2, digest2, CF_DEFAULT_DIGEST); for (i = 0; i < EVP_MAX_MD_SIZE; i++) { if (digest1[i] != digest2[i]) { return true; } } CfDebug("Files were identical\n"); return false; /* only if files are identical */ } else { return CompareHashNet(file1, file2, attr, pp); /* client.c */ } }
int CompareBinaryFiles(char *file1, char *file2, struct stat *sstat, struct stat *dstat, Attributes attr, Promise *pp) { int fd1, fd2, bytes1, bytes2; char buff1[BUFSIZ], buff2[BUFSIZ]; CfDebug("CompareBinarySums(%s,%s)\n", file1, file2); if (sstat->st_size != dstat->st_size) { CfDebug("File sizes differ, no need to compute checksum\n"); return true; } if ((attr.copy.servers == NULL) || (strcmp(attr.copy.servers->item, "localhost") == 0)) { fd1 = open(file1, O_RDONLY | O_BINARY, 0400); fd2 = open(file2, O_RDONLY | O_BINARY, 0400); do { bytes1 = read(fd1, buff1, BUFSIZ); bytes2 = read(fd2, buff2, BUFSIZ); if ((bytes1 != bytes2) || (memcmp(buff1, buff2, bytes1) != 0)) { CfOut(OUTPUT_LEVEL_VERBOSE, "", "Binary Comparison mismatch...\n"); close(fd2); close(fd1); return true; } } while (bytes1 > 0); close(fd2); close(fd1); return false; /* only if files are identical */ } else { CfDebug("Using network checksum instead\n"); return CompareHashNet(file1, file2, attr, pp); /* client.c */ } }
int CompareBinaryFiles(const char *file1, const char *file2, struct stat *sstat, struct stat *dstat, FileCopy fc, AgentConnection *conn) { int fd1, fd2, bytes1, bytes2; char buff1[BUFSIZ], buff2[BUFSIZ]; if (sstat->st_size != dstat->st_size) { Log(LOG_LEVEL_DEBUG, "File sizes differ, no need to compute checksum"); return true; } if (conn == NULL) { fd1 = safe_open(file1, O_RDONLY | O_BINARY, 0400); fd2 = safe_open(file2, O_RDONLY | O_BINARY, 0400); do { bytes1 = read(fd1, buff1, BUFSIZ); bytes2 = read(fd2, buff2, BUFSIZ); if ((bytes1 != bytes2) || (memcmp(buff1, buff2, bytes1) != 0)) { Log(LOG_LEVEL_VERBOSE, "Binary Comparison mismatch..."); close(fd2); close(fd1); return true; } } while (bytes1 > 0); close(fd2); close(fd1); return false; /* only if files are identical */ } else { assert(fc.servers && strcmp(RlistScalarValue(fc.servers), "localhost")); Log(LOG_LEVEL_DEBUG, "Using network checksum instead"); return CompareHashNet(file1, file2, fc.encrypt, conn); /* client.c */ } }