btrfs-progs: Replace usage of list_for_each with list_for_each_entry
[platform/upstream/btrfs-progs.git] / tests / fssum.c
index 2d62ba6..5dde998 100644 (file)
  * Boston, MA 021110-1307, USA.
  */
 
-#define _BSD_SOURCE
-#define _LARGEFILE64_SOURCE
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
 #include "kerncompat.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <dirent.h>
 #include <errno.h>
-#include <sys/types.h>
+#include <sys/sysmacros.h>
 #include <sys/stat.h>
-#include <openssl/md5.h>
-#include <netinet/in.h>
-#include <inttypes.h>
 #include <assert.h>
+#include <time.h>
+#include <stdint.h>
+#include "tests/sha.h"
 
-#define CS_SIZE 16
+#define CS_SIZE 32
 #define CHUNKS 128
 
 #ifndef SEEK_DATA
@@ -54,8 +48,8 @@ struct excludes {
 };
 
 typedef struct _sum {
-       MD5_CTX         md5;
-       unsigned char   out[16];
+       SHA256Context   sha;
+       unsigned char   out[CS_SIZE];
 } sum_t;
 
 typedef int (*sum_file_data_t)(int fd, sum_t *dst);
@@ -180,19 +174,19 @@ alloc(size_t sz)
 void
 sum_init(sum_t *cs)
 {
-       MD5_Init(&cs->md5);
+       SHA256Reset(&cs->sha);
 }
 
 void
 sum_fini(sum_t *cs)
 {
-       MD5_Final(cs->out, &cs->md5);
+       SHA256Result(&cs->sha, cs->out);
 }
 
 void
 sum_add(sum_t *cs, void *buf, int size)
 {
-       MD5_Update(&cs->md5, buf, size);
+       SHA256Input(&cs->sha, buf, size);
 }
 
 void
@@ -427,6 +421,9 @@ check_manifest(char *fn, char *m, char *c, int last_call)
        while ((l = getln(line, sizeof(line), in_fp))) {
                rem_c = strrchr(l, ' ');
                if (!rem_c) {
+                       if (checksum)
+                               free(checksum);
+
                        /* final cs */
                        checksum = strdup(l);
                        break;
@@ -510,6 +507,7 @@ sum(int dirfd, int level, sum_t *dircs, char *path_prefix, char *path_in)
                }
                ++entries;
        }
+
        qsort(namelist, entries, sizeof(*namelist), namecmp);
        for (i = 0; i < entries; ++i) {
                struct stat64 st;
@@ -631,7 +629,11 @@ sum(int dirfd, int level, sum_t *dircs, char *path_prefix, char *path_in)
                sum_add_sum(dircs, &meta);
 next:
                free(path);
+               free(namelist[i]);
        }
+
+       free(namelist);
+       closedir(d);
 }
 
 int
@@ -643,7 +645,9 @@ main(int argc, char *argv[])
        char *path;
        int fd;
        sum_t cs;
+       char *sumstring;
        char flagstring[sizeof(flchar)];
+       int ret = 0;
        int i;
        int plen;
        int elen;
@@ -743,6 +747,9 @@ main(int argc, char *argv[])
                } else if ((p = strchr(l, ':'))) {
                        *p++ = 0;
                        parse_flags(l);
+
+                       if (checksum)
+                               free(checksum);
                        checksum = strdup(p);
                } else {
                        fprintf(stderr, "invalid input file format\n");
@@ -805,16 +812,28 @@ main(int argc, char *argv[])
                if (!gen_manifest)
                        fprintf(out_fp, "%s:", flagstring);
 
-               fprintf(out_fp, "%s\n", sum_to_string(&cs));
+               sumstring = sum_to_string(&cs);
+               fprintf(out_fp, "%s\n", sumstring);
+               free(sumstring);
        } else {
-               if (strcmp(checksum, sum_to_string(&cs)) == 0) {
+               sumstring = sum_to_string(&cs);
+               if (strcmp(checksum, sumstring) == 0) {
                        printf("OK\n");
-                       exit(0);
+                       ret = 0;
                } else {
                        printf("FAIL\n");
-                       exit(1);
+                       ret = 1;
                }
+
+               free(checksum);
+               free(sumstring);
        }
 
-       exit(0);
+       if (in_fp)
+               fclose(in_fp);
+
+       if (out_fp != stdout)
+               fclose(out_fp);
+
+       exit(ret);
 }