diff options
Diffstat (limited to 'modified.c')
-rw-r--r-- | modified.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/modified.c b/modified.c new file mode 100644 index 0000000..81e8664 --- /dev/null +++ b/modified.c @@ -0,0 +1,94 @@ +#include "conf-update.h" + +bool user_modified(char *file) { + FILE *indexpipe, *filepipe; + char *line = NULL; + char *filedump = NULL; + size_t len = 0, len2 = 0; + char *md5sum; + char filemd5[MD5_DIGEST_LENGTH]; + char hexdigest[32]; + bool user_mod = TRUE; + if (access(MD5SUM_INDEX, R_OK) != 0) { + return TRUE; + } else { + indexpipe = fopen(MD5SUM_INDEX, "r"); + exit_error(indexpipe, MD5SUM_INDEX); + while (getline(&line, &len, indexpipe) != -1) { + if (!strncmp(line, file, strlen(file)) && *(line + strlen(file)) == ' ') { + md5sum = strrchr(line, ' ') + 1; + filepipe = fopen(file, "r"); + exit_error(filepipe, file); + if (getdelim(&filedump, &len2, EOF, filepipe) != -1) { + MD5(filedump, strlen(filedump), filemd5); + md52hex(filemd5, hexdigest); + if (!strncmp(md5sum, hexdigest, 32)) { + user_mod = FALSE; + } + } + fclose(filepipe); + free(filedump); + } + } + fclose(indexpipe); + free(line); + return user_mod; + } +} + +void md52hex(char *md5sum, char *hexdigest) { + // this one is stolen from python's md5module.c + char c; + int i, j = 0; + + for(i=0; i<16; i++) { + c = (md5sum[i] >> 4) & 0xf; + hexdigest[j] = (c>9) ? c+'a'-10 : c + '0'; + j++; + c = (md5sum[i] & 0xf); + hexdigest[j] = (c>9) ? c+'a'-10 : c + '0'; + j++; + } +} + +void calc_md5(char *file, char* hexdigest) { + FILE *fp; + char *dump = NULL; + size_t len = 0; + + char md5sum[MD5_DIGEST_LENGTH]; + + fp = fopen(file, "r"); + if (getdelim(&dump, &len, EOF, fp) != -1) { + MD5(dump, strlen(dump), md5sum); + md52hex(md5sum, hexdigest); + free(dump); + } + fclose(fp); +} + +void md5sum_update(char *file, char *hexdigest) { + FILE *oldpipe; + char *dump = NULL; + size_t len = 0; + char *entry; + oldpipe = fopen(MD5SUM_INDEX, "r"); + exit_error(oldpipe, MD5SUM_INDEX); + + getdelim(&dump, &len, EOF, oldpipe); + if ((entry = strstr(dump, file))) { + entry = strchr(entry, '\n') - 32; + strncpy(entry, hexdigest, 32); + exit_error(freopen(MD5SUM_INDEX, "w", oldpipe), MD5SUM_INDEX); + exit_error(fwrite(dump, strlen(dump), sizeof(char), oldpipe), MD5SUM_INDEX); + } else { + // there's no entry at all yet + exit_error(freopen(MD5SUM_INDEX, "a", oldpipe), MD5SUM_INDEX); + exit_error(fwrite(file, strlen(file), sizeof(char), oldpipe), MD5SUM_INDEX); + exit_error(fwrite(" ", strlen(" "), sizeof(char), oldpipe), MD5SUM_INDEX); + exit_error(fwrite(hexdigest, 32, sizeof(char), oldpipe), MD5SUM_INDEX); + exit_error(fwrite("\n", strlen("\n"), sizeof(char), oldpipe), MD5SUM_INDEX); + } + free(dump); + fclose(oldpipe); +} |