iblock.c - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iblock.c (3126B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Top-level block layer implementation */ Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 #include Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 #include "block.h" Err bitreich.org 70 i 14 #include "config.h" Err bitreich.org 70 i 15 #include "misc.h" Err bitreich.org 70 i 16 Err bitreich.org 70 i 17 static int Err bitreich.org 70 i 18 bhash(void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i 19 { Err bitreich.org 70 i 20 return crypto_generichash(md, MDSIZE, buf, n, NULL, 0); Err bitreich.org 70 i 21 } Err bitreich.org 70 i 22 Err bitreich.org 70 i 23 int Err bitreich.org 70 i 24 bcreat(char *path, int mode, struct bctx **bctx) Err bitreich.org 70 i 25 { Err bitreich.org 70 i 26 if (path == NULL || bctx == NULL) { Err bitreich.org 70 i 27 seterr("invalid params"); Err bitreich.org 70 i 28 return -1; Err bitreich.org 70 i 29 } Err bitreich.org 70 i 30 Err bitreich.org 70 i 31 if (sodium_init() < 0) { Err bitreich.org 70 i 32 seterr("sodium_init: failed"); Err bitreich.org 70 i 33 return -1; Err bitreich.org 70 i 34 } Err bitreich.org 70 i 35 Err bitreich.org 70 i 36 *bctx = calloc(1, sizeof(**bctx)); Err bitreich.org 70 i 37 if (*bctx == NULL) { Err bitreich.org 70 i 38 seterr("calloc: out of memory"); Err bitreich.org 70 i 39 return -1; Err bitreich.org 70 i 40 } Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 if (bcompressops()->creat(*bctx, path, mode) < 0) { Err bitreich.org 70 i 43 free(*bctx); Err bitreich.org 70 i 44 return -1; Err bitreich.org 70 i 45 } Err bitreich.org 70 i 46 return 0; Err bitreich.org 70 i 47 } Err bitreich.org 70 i 48 Err bitreich.org 70 i 49 int Err bitreich.org 70 i 50 bopen(char *path, int flags, int mode, struct bctx **bctx) Err bitreich.org 70 i 51 { Err bitreich.org 70 i 52 if (path == NULL || bctx == NULL) { Err bitreich.org 70 i 53 seterr("invalid params"); Err bitreich.org 70 i 54 return -1; Err bitreich.org 70 i 55 } Err bitreich.org 70 i 56 Err bitreich.org 70 i 57 if (sodium_init() < 0) { Err bitreich.org 70 i 58 seterr("sodium_init: failed"); Err bitreich.org 70 i 59 return -1; Err bitreich.org 70 i 60 } Err bitreich.org 70 i 61 Err bitreich.org 70 i 62 *bctx = calloc(1, sizeof(**bctx)); Err bitreich.org 70 i 63 if (*bctx == NULL) { Err bitreich.org 70 i 64 seterr("calloc: out of memory"); Err bitreich.org 70 i 65 return -1; Err bitreich.org 70 i 66 } Err bitreich.org 70 i 67 Err bitreich.org 70 i 68 if (bcompressops()->open(*bctx, path, flags, mode) < 0) { Err bitreich.org 70 i 69 free(*bctx); Err bitreich.org 70 i 70 return -1; Err bitreich.org 70 i 71 } Err bitreich.org 70 i 72 return 0; Err bitreich.org 70 i 73 } Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 int Err bitreich.org 70 i 76 bput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i 77 { Err bitreich.org 70 i 78 if (bctx == NULL || buf == NULL || n == 0 || md == NULL) { Err bitreich.org 70 i 79 seterr("invalid params"); Err bitreich.org 70 i 80 return -1; Err bitreich.org 70 i 81 } Err bitreich.org 70 i 82 Err bitreich.org 70 i 83 if (bhash(buf, n, md) < 0) { Err bitreich.org 70 i 84 seterr("bhash: failed"); Err bitreich.org 70 i 85 return -1; Err bitreich.org 70 i 86 } Err bitreich.org 70 i 87 Err bitreich.org 70 i 88 return bcompressops()->put(bctx, buf, n, md); Err bitreich.org 70 i 89 } Err bitreich.org 70 i 90 Err bitreich.org 70 i 91 int Err bitreich.org 70 i 92 bget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i 93 { Err bitreich.org 70 i 94 if (bctx == NULL || md == NULL || buf == NULL || n == NULL) { Err bitreich.org 70 i 95 seterr("invalid params"); Err bitreich.org 70 i 96 return -1; Err bitreich.org 70 i 97 } Err bitreich.org 70 i 98 Err bitreich.org 70 i 99 return bcompressops()->get(bctx, md, buf, n); Err bitreich.org 70 i 100 } Err bitreich.org 70 i 101 Err bitreich.org 70 i 102 int Err bitreich.org 70 i 103 brm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i 104 { Err bitreich.org 70 i 105 if (bctx == NULL || md == NULL) { Err bitreich.org 70 i 106 seterr("invalid params"); Err bitreich.org 70 i 107 return -1; Err bitreich.org 70 i 108 } Err bitreich.org 70 i 109 Err bitreich.org 70 i 110 return bcompressops()->rm(bctx, md); Err bitreich.org 70 i 111 } Err bitreich.org 70 i 112 Err bitreich.org 70 i 113 int Err bitreich.org 70 i 114 bgc(struct bctx *bctx) Err bitreich.org 70 i 115 { Err bitreich.org 70 i 116 if (bctx == NULL) { Err bitreich.org 70 i 117 seterr("invalid params"); Err bitreich.org 70 i 118 return -1; Err bitreich.org 70 i 119 } Err bitreich.org 70 i 120 Err bitreich.org 70 i 121 return bcompressops()->gc(bctx); Err bitreich.org 70 i 122 } Err bitreich.org 70 i 123 Err bitreich.org 70 i 124 /* Err bitreich.org 70 i 125 * Lookup the block given the hash and rehash it. Err bitreich.org 70 i 126 * Check that the hashes match. It returns -1 Err bitreich.org 70 i 127 * on error, 0 on success and 1 if a block hash Err bitreich.org 70 i 128 * mismatch is detected. Err bitreich.org 70 i 129 */ Err bitreich.org 70 i 130 int Err bitreich.org 70 i 131 bcheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i 132 { Err bitreich.org 70 i 133 unsigned char tmp[MDSIZE]; Err bitreich.org 70 i 134 void *buf; Err bitreich.org 70 i 135 size_t n; Err bitreich.org 70 i 136 Err bitreich.org 70 i 137 if (bctx == NULL || md == NULL) { Err bitreich.org 70 i 138 seterr("invalid params"); Err bitreich.org 70 i 139 return -1; Err bitreich.org 70 i 140 } Err bitreich.org 70 i 141 Err bitreich.org 70 i 142 buf = malloc(BSIZEMAX); Err bitreich.org 70 i 143 if (buf == NULL) { Err bitreich.org 70 i 144 seterr("malloc: out of memory"); Err bitreich.org 70 i 145 return -1; Err bitreich.org 70 i 146 } Err bitreich.org 70 i 147 n = BSIZEMAX; Err bitreich.org 70 i 148 Err bitreich.org 70 i 149 if (bcompressops()->get(bctx, md, buf, &n) < 0) { Err bitreich.org 70 i 150 free(buf); Err bitreich.org 70 i 151 return -1; Err bitreich.org 70 i 152 } Err bitreich.org 70 i 153 Err bitreich.org 70 i 154 if (bhash(buf, n, tmp) < 0) { Err bitreich.org 70 i 155 free(buf); Err bitreich.org 70 i 156 seterr("bhash: failed"); Err bitreich.org 70 i 157 return -1; Err bitreich.org 70 i 158 } Err bitreich.org 70 i 159 Err bitreich.org 70 i 160 free(buf); Err bitreich.org 70 i 161 Err bitreich.org 70 i 162 if (memcmp(tmp, md, MDSIZE) != 0) Err bitreich.org 70 i 163 return 1; Err bitreich.org 70 i 164 return 0; Err bitreich.org 70 i 165 } Err bitreich.org 70 i 166 Err bitreich.org 70 i 167 int Err bitreich.org 70 i 168 bsync(struct bctx *bctx) Err bitreich.org 70 i 169 { Err bitreich.org 70 i 170 if (bctx == NULL) { Err bitreich.org 70 i 171 seterr("invalid params"); Err bitreich.org 70 i 172 return -1; Err bitreich.org 70 i 173 } Err bitreich.org 70 i 174 Err bitreich.org 70 i 175 return bcompressops()->sync(bctx); Err bitreich.org 70 i 176 } Err bitreich.org 70 i 177 Err bitreich.org 70 i 178 int Err bitreich.org 70 i 179 bclose(struct bctx *bctx) Err bitreich.org 70 i 180 { Err bitreich.org 70 i 181 int r; Err bitreich.org 70 i 182 Err bitreich.org 70 i 183 if (bctx == NULL) { Err bitreich.org 70 i 184 seterr("invalid params"); Err bitreich.org 70 i 185 return -1; Err bitreich.org 70 i 186 } Err bitreich.org 70 i 187 Err bitreich.org 70 i 188 if (bsync(bctx) < 0) Err bitreich.org 70 i 189 return -1; Err bitreich.org 70 i 190 r = bcompressops()->close(bctx); Err bitreich.org 70 i 191 free(bctx); Err bitreich.org 70 i 192 return r; Err bitreich.org 70 i 193 } Err bitreich.org 70 .