aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'modified.c')
-rw-r--r--modified.c94
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);
+}