btrfs-progs: Replace usage of list_for_each with list_for_each_entry
[platform/upstream/btrfs-progs.git] / tests / fssum.c
index c26d32b..5dde998 100644 (file)
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 021110-1307, USA.
  */
-#ifdef __LINUX__
-#define _BSD_SOURCE
-#define _LARGEFILE64_SOURCE
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-#endif
+
+#include "kerncompat.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <dirent.h>
 #include <errno.h>
-#include <sys/types.h>
+#include <sys/sysmacros.h>
 #include <sys/stat.h>
-#ifdef __SOLARIS__
-#include <sys/mkdev.h>
-#endif
-#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
 
-#ifdef __LINUX__
 #ifndef SEEK_DATA
 #define SEEK_DATA 3
 #define SEEK_HOLE 4
 #endif
 
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define htonll(x)     __bswap_64 (x)
-#else
-#define htonll(x)     (x)
-#endif
-#endif
-
 /* TODO: add hardlink recognition */
 /* TODO: add xattr/acl */
 
@@ -64,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);
@@ -190,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
@@ -214,7 +198,7 @@ sum_add_sum(sum_t *dst, sum_t *src)
 void
 sum_add_u64(sum_t *dst, uint64_t val)
 {
-       uint64_t v = htonll(val);
+       uint64_t v = cpu_to_le64(val);
        sum_add(dst, &v, sizeof(v));
 }
 
@@ -437,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;
@@ -520,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;
@@ -641,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
@@ -653,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;
@@ -753,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");
@@ -815,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);
 }