tdinfo.c - dedup - data deduplication program HTML git clone git://bitreich.org/dedup/ git://hg6vgqziawt5s4dj.onion/dedup/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- tdinfo.c (2945B) --- 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <sys/file.h> 4 5 #include <err.h> 6 #include <fcntl.h> 7 #include <stdio.h> 8 #include <stdint.h> 9 #include <stdlib.h> 10 #include <string.h> 11 #include <unistd.h> 12 13 #include "arg.h" 14 #include "blake2.h" 15 #include "dedup.h" 16 17 static struct snap_hdr snap_hdr; 18 static struct blk_hdr blk_hdr; 19 static int ifd; 20 static int sfd; 21 static int hash_algo = HASH_BLAKE2B; 22 static int compr_algo = COMPR_LZ4; 23 24 int verbose; 25 char *argv0; 26 27 static void 28 print_info(int tflag) 29 { 30 struct stats *st = &snap_hdr.st; 31 32 if (verbose > 0) { 33 fprintf(stderr, "Compression algorithm: %s\n", 34 compr_type2name(compr_algo)); 35 fprintf(stderr, "Hash algorithm: %s\n", 36 hash_type2name(hash_algo)); 37 } 38 39 if (st->nr_blks == 0) 40 return; 41 42 if (!tflag) { 43 fprintf(stderr, "Original size: %llu bytes\n", 44 (unsigned long long)st->orig_size); 45 fprintf(stderr, "Compressed size: %llu bytes\n", 46 (unsigned long long)st->compr_size); 47 fprintf(stderr, "Deduplicated size: %llu bytes\n", 48 (unsigned long long)st->dedup_size); 49 fprintf(stderr, "Deduplication ratio: %.2f\n", 50 (double)st->orig_size / st->dedup_size); 51 fprintf(stderr, "Min/avg/max block size: %llu/%llu/%llu bytes\n", 52 (unsigned long long)st->min_blk_size, 53 (unsigned long long)st->dedup_size / st->nr_blks, 54 (unsigned long long)st->max_blk_size); 55 fprintf(stderr, "Number of unique blocks: %llu\n", 56 (unsigned long long)st->nr_blks); 57 } else { 58 /* terse mode */ 59 fprintf(stderr, "%llu %llu %llu %.2f %llu %llu %llu %llu\n", 60 (unsigned long long)st->orig_size, 61 (unsigned long long)st->compr_size, 62 (unsigned long long)st->dedup_size, 63 (double)st->orig_size / st->dedup_size, 64 (unsigned long long)st->min_blk_size, 65 (unsigned long long)st->dedup_size / st->nr_blks, 66 (unsigned long long)st->max_blk_size, 67 (unsigned long long)st->nr_blks); 68 } 69 } 70 71 static void 72 init(void) 73 { 74 ifd = open(SNAPSF, O_RDONLY, 0600); 75 if (ifd < 0) 76 err(1, "open %s", SNAPSF); 77 78 sfd = open(STOREF, O_RDONLY, 0600); 79 if (sfd < 0) 80 err(1, "open %s", STOREF); 81 82 if (flock(ifd, LOCK_NB | LOCK_EX) < 0 || 83 flock(sfd, LOCK_NB | LOCK_EX) < 0) 84 err(1, "flock"); 85 86 xlseek(ifd, 0, SEEK_SET); 87 load_snap_hdr(ifd, &snap_hdr); 88 xlseek(sfd, 0, SEEK_SET); 89 load_blk_hdr(sfd, &blk_hdr, &compr_algo, &hash_algo); 90 } 91 92 static void 93 term(void) 94 { 95 close(ifd); 96 close(sfd); 97 } 98 99 static void 100 usage(void) 101 { 102 fprintf(stderr, "usage: %s [-tv] [repo]\n", argv0); 103 exit(1); 104 } 105 106 int 107 main(int argc, char *argv[]) 108 { 109 char *repo = NULL; 110 int tflag = 0; 111 112 ARGBEGIN { 113 case 't': 114 tflag = 1; 115 break; 116 case 'v': 117 verbose++; 118 break; 119 default: 120 usage(); 121 } ARGEND 122 123 switch (argc) { 124 case 0: 125 repo = "."; 126 break; 127 case 1: 128 repo = argv[0]; 129 break; 130 default: 131 usage(); 132 }; 133 134 if (chdir(repo) < 0) 135 err(1, "chdir: %s", repo); 136 137 init(); 138 print_info(tflag); 139 term(); 140 return 0; 141 }