tdup-list.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
---
tdup-list.c (1736B)
---
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_md(FILE *fp, uint8_t *md, size_t size)
29 {
30 size_t i;
31
32 for (i = 0; i < size; i++)
33 fprintf(fp, "%02x", md[i]);
34 }
35
36 static int
37 list(struct snap *snap, void *arg)
38 {
39 print_md(stdout, snap->md, sizeof(snap->md));
40 if (snap->msg[0] != '\0')
41 printf("\t%s\n", snap->msg);
42 else
43 putchar('\n');
44 return WALK_CONTINUE;
45 }
46
47 static void
48 init(void)
49 {
50 ifd = open(SNAPSF, O_RDONLY, 0600);
51 if (ifd < 0)
52 err(1, "open %s", SNAPSF);
53
54 sfd = open(STOREF, O_RDONLY, 0600);
55 if (sfd < 0)
56 err(1, "open %s", STOREF);
57
58 if (flock(ifd, LOCK_NB | LOCK_EX) < 0 ||
59 flock(sfd, LOCK_NB | LOCK_EX) < 0)
60 err(1, "flock");
61
62 xlseek(ifd, 0, SEEK_SET);
63 load_snap_hdr(ifd, &snap_hdr);
64 xlseek(sfd, 0, SEEK_SET);
65 load_blk_hdr(sfd, &blk_hdr, &compr_algo, &hash_algo);
66 }
67
68 static void
69 term(void)
70 {
71 close(ifd);
72 close(sfd);
73 }
74
75 static void
76 usage(void)
77 {
78 fprintf(stderr, "usage: %s [-v] [repo]\n", argv0);
79 exit(1);
80 }
81
82 int
83 main(int argc, char *argv[])
84 {
85 char *repo = NULL;
86
87 ARGBEGIN {
88 case 'v':
89 verbose++;
90 break;
91 default:
92 usage();
93 } ARGEND
94
95 switch (argc) {
96 case 0:
97 repo = ".";
98 break;
99 case 1:
100 repo = argv[0];
101 break;
102 default:
103 usage();
104 };
105
106 if (chdir(repo) < 0)
107 err(1, "chdir: %s", repo);
108
109 init();
110 walk_snap(ifd, &snap_hdr, list, NULL);
111 term();
112 return 0;
113 }