tdinit.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 --- tdinit.c (2059B) --- 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 init(void) 29 { 30 int flags; 31 32 flags = O_RDWR | O_CREAT | O_EXCL; 33 ifd = open(SNAPSF, flags, 0600); 34 if (ifd < 0) 35 err(1, "open %s", SNAPSF); 36 37 sfd = open(STOREF, flags, 0600); 38 if (sfd < 0) 39 err(1, "open %s", STOREF); 40 41 if (flock(ifd, LOCK_NB | LOCK_EX) < 0 || 42 flock(sfd, LOCK_NB | LOCK_EX) < 0) 43 err(1, "flock"); 44 45 init_snap_hdr(&snap_hdr); 46 init_blk_hdr(&blk_hdr, compr_algo, hash_algo); 47 } 48 49 static void 50 term(void) 51 { 52 xlseek(ifd, 0, SEEK_SET); 53 write_snap_hdr(ifd, &snap_hdr); 54 xlseek(sfd, 0, SEEK_SET); 55 write_blk_hdr(sfd, &blk_hdr); 56 57 fsync(ifd); 58 fsync(sfd); 59 60 close(ifd); 61 close(sfd); 62 } 63 64 static void 65 usage(void) 66 { 67 fprintf(stderr, "usage: %s [-v] [-H hash] [-Z compressor] [repo]\n", argv0); 68 exit(1); 69 } 70 71 int 72 main(int argc, char *argv[]) 73 { 74 char *hash_name = NULL, *compr_name = NULL; 75 char *repo; 76 77 ARGBEGIN { 78 case 'H': 79 hash_name = EARGF(usage()); 80 if (strcmp(hash_name, "?") == 0) { 81 hash_list(STDERR_FILENO); 82 return 0; 83 } 84 hash_algo = hash_name2type(hash_name); 85 if (hash_algo < 0) 86 errx(1, "unknown hash: %s", hash_name); 87 break; 88 case 'Z': 89 compr_name = EARGF(usage()); 90 if (strcmp(compr_name, "?") == 0) { 91 compr_list(STDERR_FILENO); 92 return 0; 93 } 94 compr_algo = compr_name2type(compr_name); 95 if (compr_algo < 0) 96 errx(1, "unknown compressor: %s", compr_name); 97 break; 98 case 'v': 99 verbose++; 100 break; 101 default: 102 usage(); 103 } ARGEND 104 105 switch (argc) { 106 case 0: 107 repo = "."; 108 break; 109 case 1: 110 repo = argv[0]; 111 break; 112 default: 113 usage(); 114 }; 115 116 mkdir(repo, 0700); 117 if (chdir(repo) < 0) 118 err(1, "chdir: %s", repo); 119 120 init(); 121 term(); 122 return 0; 123 }