Fixed up base64_dump() users and interfaces to fix memory leaks
[jigit.git] / jigsum.c
index 88b5dab..b4b1b32 100644 (file)
--- a/jigsum.c
+++ b/jigsum.c
@@ -21,6 +21,8 @@
 #include "jigdb.h"
 
 #define BUF_SIZE 65536
+#define OLD_FILE_RECORD_AGE 86400
+#define DB_NAME "jigit_db.sql"
 
 #ifndef MIN
 #define MIN(x,y)        ( ((x) < (y)) ? (x) : (y))
@@ -28,7 +30,7 @@
 
 JIGDB *database = NULL;
 
-static int check_cache(char *filename, struct stat *sb, char **base64_md5)
+static int check_cache(char *filename, struct stat *sb, char *base64_md5)
 {
     int error = 0;
     db_file_entry_t *entry;
@@ -41,7 +43,7 @@ static int check_cache(char *filename, struct stat *sb, char **base64_md5)
             /* We have a cache entry already; simply return
              * the cached sum */
         {
-            *base64_md5 = entry->md5;
+            strcpy(base64_md5, entry->md5);
             return 1;
         }
         else
@@ -49,7 +51,7 @@ static int check_cache(char *filename, struct stat *sb, char **base64_md5)
             /* We have an entry for this file, but the mtime or size
              * has changed. Delete the old entry and replace it later
              * on */
-            error = db_delete_file(database, entry->md5, entry->type, entry->filename);
+            error = db_delete_file_by_name(database, entry->md5, entry->type, entry->filename);
             if (error)
                 printf("check_cache: unable to delete old entry for file %s\n", filename);
         }
@@ -57,13 +59,14 @@ static int check_cache(char *filename, struct stat *sb, char **base64_md5)
     return 0;
 }
 
-static unsigned long long calculate_md5(char *filename, FILE *file, char **base64_md5)
+static unsigned long long calculate_md5(char *filename, FILE *file, char *base64_md5)
 {
     char buf[BUF_SIZE];
     unsigned char file_md5[16] = {0};
     int done = 0;
     struct mk_MD5Context file_context;
     unsigned long long bytes_read = 0;
+    char *tmp_md5 = NULL;
     
     mk_MD5Init(&file_context);
     while (!done)
@@ -84,14 +87,16 @@ static unsigned long long calculate_md5(char *filename, FILE *file, char **base6
         }
     }    
     mk_MD5Final(file_md5, &file_context);
-    *base64_md5 = base64_dump(file_md5, 16);
+    tmp_md5 = base64_dump(file_md5, 16);
+    strcpy(base64_md5, tmp_md5);
+    free(tmp_md5);
     return bytes_read;
 }
 
 static int md5_file(char *filename)
 {
     FILE *file = NULL;
-    char *base64_md5 = NULL;
+    char base64_md5[33] = {0};
     unsigned long long bytes_read = 0;
     db_file_entry_t entry;
     struct stat sb;
@@ -103,7 +108,7 @@ static int md5_file(char *filename)
     /* Check if we're reading from stdin */
     if (!strcmp("-", filename))
     {
-        (void)calculate_md5("<STDIN>", stdin, &base64_md5);
+        (void)calculate_md5("<STDIN>", stdin, base64_md5);
         printf("%s\n", base64_md5);
         fflush(stdout);
         return 0;
@@ -136,7 +141,7 @@ static int md5_file(char *filename)
     }
     if (S_ISDIR(sb.st_mode))
         return EISDIR;
-    found_in_db = check_cache(fullpath, &sb, &base64_md5);
+    found_in_db = check_cache(fullpath, &sb, base64_md5);
     if (!found_in_db)
     {
         file = fopen(fullpath, "rb");
@@ -153,13 +158,13 @@ static int md5_file(char *filename)
             }
             return errno;
         }
-        bytes_read = calculate_md5(fullpath, file, &base64_md5);
+        bytes_read = calculate_md5(fullpath, file, base64_md5);
         fclose(file);
         memset(&entry, 0, sizeof(entry));
         strncpy(&entry.md5[0], base64_md5, sizeof(entry.md5));
         entry.type = FT_LOCAL;
         entry.mtime = sb.st_mtime;
-        entry.age = UINT_MAX - time(NULL);
+        entry.time_added = time(NULL);
         entry.file_size = bytes_read;
         strncpy(&entry.filename[0], fullpath, sizeof(entry.filename));
         /* "extra" blanked already */
@@ -176,32 +181,13 @@ static int md5_file(char *filename)
 /* Walk through the database deleting entries more than <n> seconds old */
 static void jigsum_db_cleanup(int delay)
 {
-    time_t delete_time = UINT_MAX - time(NULL);
-    int error = 0;
-    db_file_entry_t *entry = NULL;
-
-    delete_time += delay;
-
-    while (!error)
-    {
-        error = db_lookup_file_by_age(database, delete_time, &entry);
-        if (error)
-            break;
-        error = db_delete_file(database, entry->md5, entry->type, entry->filename);
-        if (error)
-        {
-            printf("jigsum_db_cleanup: error %d from delete call\n", error);
-            break;
-        }
-    }
+    (void)db_delete_files_by_age(database, time(NULL) - delay);
 }
 
 int main(int argc, char **argv)
 {
     int i = 0;
 
-#define DB_NAME "jigit_db.sql"
-
     database = db_open(DB_NAME);
     if (!database)
     {
@@ -210,7 +196,7 @@ int main(int argc, char **argv)
     }                
 
     /* Clear out old records */
-    jigsum_db_cleanup(86400);
+    jigsum_db_cleanup(OLD_FILE_RECORD_AGE);
     
     for (i = 1; i < argc; i++)
         (void) md5_file(argv[i]);