idup-pack.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 idup-pack.c (2805B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 Err bitreich.org 70 i 4 #include 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 #include Err bitreich.org 70 i 11 Err bitreich.org 70 i 12 #include "arg.h" Err bitreich.org 70 i 13 #include "block.h" Err bitreich.org 70 i 14 #include "chunker.h" Err bitreich.org 70 i 15 #include "config.h" Err bitreich.org 70 i 16 #include "key.h" Err bitreich.org 70 i 17 #include "lock.h" Err bitreich.org 70 i 18 #include "misc.h" Err bitreich.org 70 i 19 #include "snap.h" Err bitreich.org 70 i 20 #include "state.h" Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 struct param param; Err bitreich.org 70 i 23 int verbose; Err bitreich.org 70 i 24 char *argv0; Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 static void Err bitreich.org 70 i 27 loadstate(char *repo) Err bitreich.org 70 i 28 { Err bitreich.org 70 i 29 char path[PATH_MAX]; Err bitreich.org 70 i 30 int fd; Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path)) Err bitreich.org 70 i 33 errx(1, "snprintf: %s: path too long", path); Err bitreich.org 70 i 34 fd = open(path, O_RDONLY); Err bitreich.org 70 i 35 if (fd < 0) Err bitreich.org 70 i 36 err(1, "open: %s", path); Err bitreich.org 70 i 37 if (readstate(fd, ¶m) < 0) Err bitreich.org 70 i 38 printerr("readstate: %s", path); Err bitreich.org 70 i 39 if (close(fd) < 0) Err bitreich.org 70 i 40 err(1, "close: %s", path); Err bitreich.org 70 i 41 } Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 static void Err bitreich.org 70 i 44 loadkey(char *keyfile) Err bitreich.org 70 i 45 { Err bitreich.org 70 i 46 int fd; Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 if (keyfile == NULL) Err bitreich.org 70 i 49 return; Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 fd = open(keyfile, O_RDONLY); Err bitreich.org 70 i 52 if (fd < 0) Err bitreich.org 70 i 53 err(1, "open: %s", keyfile); Err bitreich.org 70 i 54 if (readkey(fd, param.key, sizeof(param.key)) < 0) Err bitreich.org 70 i 55 printerr("readkey: %s", keyfile); Err bitreich.org 70 i 56 param.keyloaded = 1; Err bitreich.org 70 i 57 if (close(fd) < 0) Err bitreich.org 70 i 58 err(1, "close: %s", keyfile); Err bitreich.org 70 i 59 } Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 static void Err bitreich.org 70 i 62 pack(struct sctx *sctx, struct bctx *bctx) Err bitreich.org 70 i 63 { Err bitreich.org 70 i 64 struct chunker *c; Err bitreich.org 70 i 65 Err bitreich.org 70 i 66 if ((c = copen(0, BSIZEMIN, BSIZEMAX, HMASKBITS, WINSIZE, Err bitreich.org 70 i 67 param.seed)) == NULL) Err bitreich.org 70 i 68 printerr("copen"); Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 while (cfill(c) > 0) { Err bitreich.org 70 i 71 unsigned char md[MDSIZE]; Err bitreich.org 70 i 72 void *buf; Err bitreich.org 70 i 73 size_t n; Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 buf = cget(c, &n); Err bitreich.org 70 i 76 if (buf == NULL) Err bitreich.org 70 i 77 printerr("cget"); Err bitreich.org 70 i 78 if (bput(bctx, buf, n, md) < 0) Err bitreich.org 70 i 79 printerr("bput"); Err bitreich.org 70 i 80 if (sput(sctx, md) < 0) Err bitreich.org 70 i 81 printerr("sput"); Err bitreich.org 70 i 82 cdrain(c); Err bitreich.org 70 i 83 } Err bitreich.org 70 i 84 cclose(c); Err bitreich.org 70 i 85 } Err bitreich.org 70 i 86 Err bitreich.org 70 i 87 static void Err bitreich.org 70 i 88 usage(void) Err bitreich.org 70 i 89 { Err bitreich.org 70 i 90 fprintf(stderr, "usage: %s [-v] [-k keyfile] [-r repo] name\n", argv0); Err bitreich.org 70 i 91 exit(1); Err bitreich.org 70 i 92 } Err bitreich.org 70 i 93 Err bitreich.org 70 i 94 int Err bitreich.org 70 i 95 main(int argc, char *argv[]) Err bitreich.org 70 i 96 { Err bitreich.org 70 i 97 char spath[PATH_MAX]; Err bitreich.org 70 i 98 char bpath[PATH_MAX]; Err bitreich.org 70 i 99 struct sctx *sctx; Err bitreich.org 70 i 100 struct bctx *bctx; Err bitreich.org 70 i 101 char *keyfile = NULL; Err bitreich.org 70 i 102 char *repo = "."; Err bitreich.org 70 i 103 int lfd; Err bitreich.org 70 i 104 Err bitreich.org 70 i 105 ARGBEGIN { Err bitreich.org 70 i 106 case 'k': Err bitreich.org 70 i 107 keyfile = EARGF(usage()); Err bitreich.org 70 i 108 break; Err bitreich.org 70 i 109 case 'r': Err bitreich.org 70 i 110 repo = EARGF(usage()); Err bitreich.org 70 i 111 break; Err bitreich.org 70 i 112 case 'v': Err bitreich.org 70 i 113 verbose++; Err bitreich.org 70 i 114 break; Err bitreich.org 70 i 115 default: Err bitreich.org 70 i 116 usage(); Err bitreich.org 70 i 117 } ARGEND Err bitreich.org 70 i 118 Err bitreich.org 70 i 119 if (argc != 1) Err bitreich.org 70 i 120 usage(); Err bitreich.org 70 i 121 Err bitreich.org 70 i 122 if (snprintf(spath, sizeof(spath), "%s/archive/%s", Err bitreich.org 70 i 123 repo, argv[0]) >= sizeof(spath)) Err bitreich.org 70 i 124 errx(1, "snprintf: %s: path too long", spath); Err bitreich.org 70 i 125 if (snprintf(bpath, sizeof(bpath), "%s/storage", Err bitreich.org 70 i 126 repo) >= sizeof(bpath)) Err bitreich.org 70 i 127 errx(1, "snprintf: %s: path too long", bpath); Err bitreich.org 70 i 128 Err bitreich.org 70 i 129 if ((lfd = lockrepo(repo)) < 0) Err bitreich.org 70 i 130 errx(1, "failed to lock repository"); Err bitreich.org 70 i 131 Err bitreich.org 70 i 132 loadkey(keyfile); Err bitreich.org 70 i 133 loadstate(repo); Err bitreich.org 70 i 134 Err bitreich.org 70 i 135 if (screat(spath, 0600, &sctx) < 0) Err bitreich.org 70 i 136 printerr("screat: %s", spath); Err bitreich.org 70 i 137 if (bopen(bpath, B_RDWR, 0600, &bctx) < 0) Err bitreich.org 70 i 138 printerr("bopen: %s", bpath); Err bitreich.org 70 i 139 Err bitreich.org 70 i 140 pack(sctx, bctx); Err bitreich.org 70 i 141 Err bitreich.org 70 i 142 if (bclose(bctx) < 0) Err bitreich.org 70 i 143 printerr("bclose: %s", bpath); Err bitreich.org 70 i 144 if (sclose(sctx) < 0) Err bitreich.org 70 i 145 printerr("sclose: %s", spath); Err bitreich.org 70 i 146 Err bitreich.org 70 i 147 if (unlockrepo(lfd) < 0) Err bitreich.org 70 i 148 errx(1, "failed to unlock repository"); Err bitreich.org 70 i 149 return 0; Err bitreich.org 70 i 150 } Err bitreich.org 70 .