iImplement dup-rm(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 d6e4ca0475985f2f98e35fcfd5bdb3b4304a0eff /scm/dedup/commit/d6e4ca0475985f2f98e35fcfd5bdb3b4304a0eff.gph bitreich.org 70 1parent a5062b8799146166bf125a7f49630fa46d84639b /scm/dedup/commit/a5062b8799146166bf125a7f49630fa46d84639b.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 25 Apr 2019 22:04:37 +0100 Err bitreich.org 70 i Err bitreich.org 70 iImplement dup-rm(1) Err bitreich.org 70 i Err bitreich.org 70 idup-rm(1) relies on the fallocate system call. Not every filesystem Err bitreich.org 70 isupports it. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 12 ++++++++---- Err bitreich.org 70 i A dup-rm.1 | 26 ++++++++++++++++++++++++++ Err bitreich.org 70 i A dup-rm.c | 85 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 119 insertions(+), 4 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-unpack Err bitreich.org 70 i-MAN = dup-check.1 dup-init.1 dup-pack.1 dup-unpack.1 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 Err bitreich.org 70 i HDR = \ Err bitreich.org 70 i arg.h \ Err bitreich.org 70 i@@ -27,16 +27,17 @@ COMMOBJ = \ Err bitreich.org 70 i DCHECKOBJ = $(COMMOBJ) dup-check.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 DUNPACKOBJ = $(COMMOBJ) dup-unpack.o Err bitreich.org 70 i Err bitreich.org 70 i 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) $(DUNPACKOBJ): $(HDR) Err bitreich.org 70 i+$(DCHECKOBJ) $(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) $(DUNPACKOBJ) $(BIN) Err bitreich.org 70 i+ rm -f $(DCHECKOBJ) $(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@@ -68,5 +69,8 @@ dup-init: $(DINITOBJ) Err bitreich.org 70 i dup-pack: $(DPACKOBJ) Err bitreich.org 70 i $(CC) -o $@ $(DPACKOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i Err bitreich.org 70 i+dup-rm: $(DRMOBJ) Err bitreich.org 70 i+ $(CC) -o $@ $(DRMOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 i+ Err bitreich.org 70 i dup-unpack: $(DUNPACKOBJ) Err bitreich.org 70 i $(CC) -o $@ $(DUNPACKOBJ) $(LDFLAGS) $(LDLIBS) Err bitreich.org 70 1diff --git a/dup-rm.1 b/dup-rm.1 /scm/dedup/file/dup-rm.1.gph bitreich.org 70 i@@ -0,0 +1,26 @@ Err bitreich.org 70 i+.Dd April 25, 2019 Err bitreich.org 70 i+.Dt DUP-RM 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+.Nm dup-rm Err bitreich.org 70 i+.Nd Remove snapshot Err bitreich.org 70 i+.Sh SYNOPSIS Err bitreich.org 70 i+.Nm dup-rm Err bitreich.org 70 i+.Op Fl v Err bitreich.org 70 i+.Op Fl r Ar repo Err bitreich.org 70 i+.Ar name Err bitreich.org 70 i+.Sh DESCRIPTION Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+removes the snapshot specified by Err bitreich.org 70 i+.Ar name . Err bitreich.org 70 i+.Sh OPTIONS Err bitreich.org 70 i+.Bl -tag -width "-r repo" Err bitreich.org 70 i+.It Fl r Ar repo Err bitreich.org 70 i+Repository directory. Err bitreich.org 70 i+By default the current working directory is used. 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-rm.c b/dup-rm.c /scm/dedup/file/dup-rm.c.gph bitreich.org 70 i@@ -0,0 +1,85 @@ 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+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+#include "block.h" Err bitreich.org 70 i+#include "config.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 int Err bitreich.org 70 i+rm(struct sctx *sctx, struct bctx *bctx) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ unsigned char md[MDSIZE]; Err bitreich.org 70 i+ int sn; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while ((sn = sget(sctx, md)) == MDSIZE) { Err bitreich.org 70 i+ if (brm(bctx, md) < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (sn < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} 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 [-v] [-r repo] name\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+ char spath[PATH_MAX]; Err bitreich.org 70 i+ char bpath[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+ char *repo = "."; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARGBEGIN { Err bitreich.org 70 i+ case 'r': Err bitreich.org 70 i+ repo = 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+ if (argc != 1) Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(spath, sizeof(spath), "%s/archive/%s", repo, argv[0]); Err bitreich.org 70 i+ if (sopen(spath, O_RDONLY, 0600, &sctx) < 0) Err bitreich.org 70 i+ errx(1, "sopen: %s: failed", spath); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(bpath, sizeof(bpath), "%s/storage", repo); Err bitreich.org 70 i+ if (bopen(bpath, O_RDWR, 0600, &bparam, &bctx) <0) Err bitreich.org 70 i+ errx(1, "bopen: %s: failed", bpath); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (rm(sctx, bctx) < 0) Err bitreich.org 70 i+ errx(1, "rm: failed"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (bclose(bctx) < 0) Err bitreich.org 70 i+ errx(1, "bclose: failed"); Err bitreich.org 70 i+ if (sclose(sctx) < 0) Err bitreich.org 70 i+ errx(1, "sclose: failed"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (unlink(spath) < 0) Err bitreich.org 70 i+ errx(1, "unlink: %s", spath); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 .