iImplement dup-gc(1) - 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 1commit e814b11f226f19a9a60a5bfc53e0be2128d91ef0 /scm/dedup/commit/e814b11f226f19a9a60a5bfc53e0be2128d91ef0.gph bitreich.org 70 1parent cc34761d0d55ea6c036421cf4fee677ccbe657a4 /scm/dedup/commit/cc34761d0d55ea6c036421cf4fee677ccbe657a4.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 26 Apr 2019 12:49:03 +0100 Err bitreich.org 70 i Err bitreich.org 70 iImplement dup-gc(1) Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 12 ++++++++---- Err bitreich.org 70 i M TODO | 1 - Err bitreich.org 70 i M bcompress.c | 6 +++--- Err bitreich.org 70 i M block.c | 6 +++--- Err bitreich.org 70 i M block.h | 4 ++-- Err bitreich.org 70 i M bstorage.c | 4 ++-- Err bitreich.org 70 i A dup-gc.1 | 24 ++++++++++++++++++++++++ Err bitreich.org 70 i A dup-gc.c | 67 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M dup-pack.c | 4 ++-- Err bitreich.org 70 i M dup-unpack.c | 4 ++-- Err bitreich.org 70 i Err bitreich.org 70 i10 files changed, 113 insertions(+), 19 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/dedup/file/Makefile.gph bitreich.org 70 i@@ -1,7 +1,7 @@ Err bitreich.org 70 i include config.mk Err bitreich.org 70 i Err bitreich.org 70 i-BIN = dup-check dup-init dup-pack dup-rm dup-unpack Err bitreich.org 70 i-MAN = dup-check.1 dup-init.1 dup-pack.1 dup-rm.1 dup-unpack.1 Err bitreich.org 70 i+BIN = dup-check dup-gc dup-init dup-pack dup-rm dup-unpack Err bitreich.org 70 i+MAN = dup-check.1 dup-gc.1 dup-init.1 dup-pack.1 dup-rm.1 dup-unpack.1 Err bitreich.org 70 i Err bitreich.org 70 i HDR = \ Err bitreich.org 70 i arg.h \ Err bitreich.org 70 i@@ -26,6 +26,7 @@ COMMOBJ = \ Err bitreich.org 70 i unpack.o \ Err bitreich.org 70 i Err bitreich.org 70 i DCHECKOBJ = $(COMMOBJ) dup-check.o Err bitreich.org 70 i+DGCOBJ = $(COMMOBJ) dup-gc.o Err bitreich.org 70 i DINITOBJ = $(COMMOBJ) dup-init.o Err bitreich.org 70 i DPACKOBJ = $(COMMOBJ) dup-pack.o Err bitreich.org 70 i DRMOBJ = $(COMMOBJ) dup-rm.o Err bitreich.org 70 i@@ -35,10 +36,10 @@ LDLIBS = -lsnappy Err bitreich.org 70 i Err bitreich.org 70 i all: $(BIN) Err bitreich.org 70 i Err bitreich.org 70 i-$(DCHECKOBJ) $(DINITOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ): $(HDR) Err bitreich.org 70 i+$(DCHECKOBJ) $(DGCOBJ) $(DINITOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ): $(HDR) Err bitreich.org 70 i Err bitreich.org 70 i clean: Err bitreich.org 70 i- rm -f $(DCHECKOBJ) $(DINITOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ) $(BIN) Err bitreich.org 70 i+ rm -f $(DCHECKOBJ) $(DGCOBJ) $(DINITOBJ) $(DPACKOBJ) $(DRMOBJ) $(DUNPACKOBJ) $(BIN) Err bitreich.org 70 i rm -rf dedup-$(VERSION) dedup-$(VERSION).tar.gz Err bitreich.org 70 i Err bitreich.org 70 i install: all Err bitreich.org 70 i@@ -64,6 +65,9 @@ dist: clean Err bitreich.org 70 i dup-check: $(DCHECKOBJ) Err bitreich.org 70 i $(CC) -o $@ $(DCHECKOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i Err bitreich.org 70 i+dup-gc: $(DGCOBJ) Err bitreich.org 70 i+ $(CC) -o $@ $(DGCOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i+ Err bitreich.org 70 i dup-init: $(DINITOBJ) Err bitreich.org 70 i $(CC) -o $@ $(DINITOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/dedup/file/TODO.gph bitreich.org 70 i@@ -2,4 +2,3 @@ Use a ring buffer in the chunker (avoid memmove() call) Err bitreich.org 70 i Create a library archive out of the blake2b files and link with it Err bitreich.org 70 i pledge/unveil support Err bitreich.org 70 i Use flock() to avoid corruption Err bitreich.org 70 i-Implement dup-gc(1) Err bitreich.org 70 1diff --git a/bcompress.c b/bcompress.c /scm/dedup/file/bcompress.c.gph bitreich.org 70 i@@ -26,7 +26,7 @@ static int bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bpa Err bitreich.org 70 i static int bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i static int bcrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i-static int bcgc(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+static int bcgc(struct bctx *bctx); Err bitreich.org 70 i static int bccheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bcsync(struct bctx *bctx); Err bitreich.org 70 i static int bcclose(struct bctx *bctx); Err bitreich.org 70 i@@ -250,11 +250,11 @@ bcrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-bcgc(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+bcgc(struct bctx *bctx) Err bitreich.org 70 i { Err bitreich.org 70 i struct bops *bops = bstorageops(); Err bitreich.org 70 i Err bitreich.org 70 i- return bops->gc(bctx, md); Err bitreich.org 70 i+ return bops->gc(bctx); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 1diff --git a/block.c b/block.c /scm/dedup/file/block.c.gph bitreich.org 70 i@@ -90,15 +90,15 @@ brm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-bgc(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+bgc(struct bctx *bctx) Err bitreich.org 70 i { Err bitreich.org 70 i struct bops *bops; Err bitreich.org 70 i Err bitreich.org 70 i- if (bctx == NULL || md == NULL) Err bitreich.org 70 i+ if (bctx == NULL) Err bitreich.org 70 i return -1; Err bitreich.org 70 i Err bitreich.org 70 i bops = bcompressops(); Err bitreich.org 70 i- return bops->gc(bctx, md); Err bitreich.org 70 i+ return bops->gc(bctx); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 1diff --git a/block.h b/block.h /scm/dedup/file/block.h.gph bitreich.org 70 i@@ -18,7 +18,7 @@ struct bops { Err bitreich.org 70 i int (*put)(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i int (*get)(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i int (*rm)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i- int (*gc)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+ int (*gc)(struct bctx *bctx); Err bitreich.org 70 i int (*check)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i int (*sync)(struct bctx *bctx); Err bitreich.org 70 i int (*close)(struct bctx *bctx); Err bitreich.org 70 i@@ -30,7 +30,7 @@ extern int bopen(char *path, int flags, int mode, struct bparam *bpar, struct bc Err bitreich.org 70 i extern int bput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i extern int bget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i extern int brm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i-extern int bgc(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+extern int bgc(struct bctx *bctx); Err bitreich.org 70 i extern int bcheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i extern int bsync(struct bctx *bctx); Err bitreich.org 70 i extern int bclose(struct bctx *bctx); Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -57,7 +57,7 @@ static int bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bpa Err bitreich.org 70 i static int bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bsget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i static int bsrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i-static int bsgc(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+static int bsgc(struct bctx *bctx); Err bitreich.org 70 i static int bscheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bssync(struct bctx *bctx); Err bitreich.org 70 i static int bsclose(struct bctx *bctx); Err bitreich.org 70 i@@ -586,7 +586,7 @@ bsrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-bsgc(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+bsgc(struct bctx *bctx) Err bitreich.org 70 i { Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bd key, *bd; Err bitreich.org 70 1diff --git a/dup-gc.1 b/dup-gc.1 /scm/dedup/file/dup-gc.1.gph bitreich.org 70 i@@ -0,0 +1,24 @@ Err bitreich.org 70 i+.Dd April 26, 2019 Err bitreich.org 70 i+.Dt DUP-GC 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+.Nm dup-gc Err bitreich.org 70 i+.Nd Garbage collect dedup repository Err bitreich.org 70 i+.Sh SYNOPSIS Err bitreich.org 70 i+.Nm dup-gc Err bitreich.org 70 i+.Op Fl v Err bitreich.org 70 i+.Op repo Err bitreich.org 70 i+.Sh DESCRIPTION Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+performs garbage collection on a dedup repository. Err bitreich.org 70 i+If no Err bitreich.org 70 i+.Ar repo Err bitreich.org 70 i+is specified the current working directory is used. Err bitreich.org 70 i+.Sh OPTIONS Err bitreich.org 70 i+.Bl -tag -width "-v" Err bitreich.org 70 i+.It Fl v Err bitreich.org 70 i+Enable verbose mode. Err bitreich.org 70 i+.El Err bitreich.org 70 i+.Sh AUTHORS Err bitreich.org 70 i+.An Dimitris Papastamos Aq Mt sin@2f30.org , Err bitreich.org 70 i+.An z3bra Aq Mt contactatz3bradotorg . Err bitreich.org 70 1diff --git a/dup-gc.c b/dup-gc.c /scm/dedup/file/dup-gc.c.gph bitreich.org 70 i@@ -0,0 +1,67 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+#include "config.h" Err bitreich.org 70 i+#include "block.h" Err bitreich.org 70 i+#include "snap.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+int verbose; Err bitreich.org 70 i+char *argv0; Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [repo]\n", argv0); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(int argc, char *argv[]) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bctx *bctx; /* block context */ Err bitreich.org 70 i+ struct bparam bpar; Err bitreich.org 70 i+ char *repo; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARGBEGIN { Err bitreich.org 70 i+ case 'H': Err bitreich.org 70 i+ bpar.halgo = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'Z': Err bitreich.org 70 i+ bpar.calgo = EARGF(usage()); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'v': Err bitreich.org 70 i+ verbose++; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } ARGEND Err bitreich.org 70 i+ Err bitreich.org 70 i+ switch (argc) { Err bitreich.org 70 i+ case 0: Err bitreich.org 70 i+ repo = "."; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 1: Err bitreich.org 70 i+ repo = argv[0]; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ }; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (chdir(repo) < 0) Err bitreich.org 70 i+ err(1, "chdir: %s", repo); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (bopen(STORAGEPATH, O_RDWR, 0600, &bpar, &bctx) < 0) Err bitreich.org 70 i+ errx(1, "bopen: failed"); Err bitreich.org 70 i+ if (bgc(bctx) < 0) Err bitreich.org 70 i+ errx(1, "bgc: failed"); Err bitreich.org 70 i+ if (bclose(bctx) < 0) Err bitreich.org 70 i+ errx(1, "bclose: failed"); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/dup-pack.c b/dup-pack.c /scm/dedup/file/dup-pack.c.gph bitreich.org 70 i@@ -61,7 +61,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i char path[PATH_MAX]; Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bctx *bctx; Err bitreich.org 70 i- struct bparam bparam; Err bitreich.org 70 i+ struct bparam bpar; Err bitreich.org 70 i char *repo = "."; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i@@ -83,7 +83,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i errx(1, "screat: %s: failed", path); Err bitreich.org 70 i Err bitreich.org 70 i snprintf(path, sizeof(path), "%s/storage", repo); Err bitreich.org 70 i- if (bopen(path, O_RDWR, 0600, &bparam, &bctx) <0) Err bitreich.org 70 i+ if (bopen(path, O_RDWR, 0600, &bpar, &bctx) <0) Err bitreich.org 70 i errx(1, "bopen: %s: failed", path); Err bitreich.org 70 i Err bitreich.org 70 i if (pack(sctx, bctx) < 0) Err bitreich.org 70 1diff --git a/dup-unpack.c b/dup-unpack.c /scm/dedup/file/dup-unpack.c.gph bitreich.org 70 i@@ -77,7 +77,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i char path[PATH_MAX]; Err bitreich.org 70 i struct sctx *sctx; Err bitreich.org 70 i struct bctx *bctx; Err bitreich.org 70 i- struct bparam bparam; Err bitreich.org 70 i+ struct bparam bpar; Err bitreich.org 70 i char *repo = "."; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i@@ -99,7 +99,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i errx(1, "sopen: %s: failed", path); Err bitreich.org 70 i Err bitreich.org 70 i snprintf(path, sizeof(path), "%s/storage", repo); Err bitreich.org 70 i- if (bopen(path, O_RDONLY, 0600, &bparam, &bctx) <0) Err bitreich.org 70 i+ if (bopen(path, O_RDONLY, 0600, &bpar, &bctx) <0) Err bitreich.org 70 i errx(1, "bopen: %s: failed", path); Err bitreich.org 70 i Err bitreich.org 70 i if (unpack(sctx, bctx) < 0) Err bitreich.org 70 .