iImplement repo init operation - 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 514871477eab5d433ff6e942f1438d321e2e2dd0 /scm/dedup/commit/514871477eab5d433ff6e942f1438d321e2e2dd0.gph bitreich.org 70 1parent 346aca7c9992b325ea9683adf7327c55613a1c54 /scm/dedup/commit/346aca7c9992b325ea9683adf7327c55613a1c54.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Sat, 2 Mar 2019 12:30:15 +0000 Err bitreich.org 70 i Err bitreich.org 70 iImplement repo init operation Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M README | 11 +++++------ Err bitreich.org 70 i M dedup.1 | 6 ++++-- Err bitreich.org 70 i M dedup.c | 81 ++++++++++++++++++------------- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 55 insertions(+), 43 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/README b/README /scm/dedup/file/README.gph bitreich.org 70 i@@ -1,5 +1,9 @@ Err bitreich.org 70 i dedup is a simple data deduplication program. Err bitreich.org 70 i Err bitreich.org 70 i+To use dedup you have to first initialize the repository. Err bitreich.org 70 i+ Err bitreich.org 70 i+ dedup -r ~/bak -i Err bitreich.org 70 i+ Err bitreich.org 70 i dedup only handles a single file at a time, so using tar is advised. Err bitreich.org 70 i For example, to dedup a tar file you can invoke dedup as follows: Err bitreich.org 70 i Err bitreich.org 70 i@@ -22,9 +26,4 @@ To extract a file from the deduplicated store run: Err bitreich.org 70 i Err bitreich.org 70 i dedup -r ~/bak -e > dir.tar Err bitreich.org 70 i Err bitreich.org 70 i-Cheers, Err bitreich.org 70 i-sin Err bitreich.org 70 i- Err bitreich.org 70 i-Requirements: Err bitreich.org 70 i-dedup uses LZ4 compression algorithm. Err bitreich.org 70 i-You'll need a library for handling this, for example http://www.lz4.org Err bitreich.org 70 i+Dedup depends on liblz4 and openssl. Err bitreich.org 70 1diff --git a/dedup.1 b/dedup.1 /scm/dedup/file/dedup.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd Feb 22, 2019 Err bitreich.org 70 i+.Dd March 02, 2019 Err bitreich.org 70 i .Dt DEDUP 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -6,7 +6,7 @@ Err bitreich.org 70 i .Nd data deduplication program Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm dedup Err bitreich.org 70 i-.Op Fl clv Err bitreich.org 70 i+.Op Fl cilv Err bitreich.org 70 i .Op Fl e Ar id Err bitreich.org 70 i .Op Fl r Ar root Err bitreich.org 70 i .Op Fl m Ar message Err bitreich.org 70 i@@ -20,6 +20,8 @@ only handles a single file at a time, so using tar is advised. Err bitreich.org 70 i .Bl -tag -width "-r root" Err bitreich.org 70 i .It Fl c Err bitreich.org 70 i Perform a consistency check on the deduplication storage. Err bitreich.org 70 i+.It Fl i Err bitreich.org 70 i+Initialize the repository. Err bitreich.org 70 i .It Fl l Err bitreich.org 70 i List snapshots by hash. Err bitreich.org 70 i .It Fl v Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -485,19 +485,15 @@ save_cache(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i-load_blk_hdr(void) Err bitreich.org 70 i+init_blk_hdr(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct stat sb; Err bitreich.org 70 i- Err bitreich.org 70 i- if (fstat(sfd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat %s", STOREF); Err bitreich.org 70 i- if (sb.st_size == 0) { Err bitreich.org 70 i- blk_hdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i- blk_hdr.size = BLK_HDR_LEN; Err bitreich.org 70 i- write_blk_hdr(sfd, &blk_hdr); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i+ blk_hdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i+ blk_hdr.size = BLK_HDR_LEN; Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i+static void Err bitreich.org 70 i+load_blk_hdr(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i read_blk_hdr(sfd, &blk_hdr); Err bitreich.org 70 i match_ver(blk_hdr.flags); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -510,20 +506,16 @@ save_blk_hdr(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i-load_snap_hdr(void) Err bitreich.org 70 i+init_snap_hdr(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct stat sb; Err bitreich.org 70 i- Err bitreich.org 70 i- if (fstat(ifd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat %s", SNAPSF); Err bitreich.org 70 i- if (sb.st_size == 0) { Err bitreich.org 70 i- snap_hdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i- snap_hdr.size = SNAP_HDR_LEN; Err bitreich.org 70 i- snap_hdr.st.min_blk_size = comp_size(BLKSIZE_MAX); Err bitreich.org 70 i- write_snap_hdr(ifd, &snap_hdr); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i+ snap_hdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i+ snap_hdr.size = SNAP_HDR_LEN; Err bitreich.org 70 i+ snap_hdr.st.min_blk_size = comp_size(BLKSIZE_MAX); Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i+static void Err bitreich.org 70 i+load_snap_hdr(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i read_snap_hdr(ifd, &snap_hdr); Err bitreich.org 70 i match_ver(snap_hdr.flags); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -536,19 +528,25 @@ save_snap_hdr(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i-init(void) Err bitreich.org 70 i+init(int iflag) Err bitreich.org 70 i { Err bitreich.org 70 i+ int flags; Err bitreich.org 70 i+ Err bitreich.org 70 i cache = alloc_cache(); Err bitreich.org 70 i Err bitreich.org 70 i- ifd = open(SNAPSF, O_RDWR | O_CREAT, 0600); Err bitreich.org 70 i+ flags = O_RDWR; Err bitreich.org 70 i+ if (iflag) Err bitreich.org 70 i+ flags |= O_CREAT | O_EXCL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ifd = open(SNAPSF, flags, 0600); Err bitreich.org 70 i if (ifd < 0) Err bitreich.org 70 i err(1, "open %s", SNAPSF); Err bitreich.org 70 i Err bitreich.org 70 i- sfd = open(STOREF, O_RDWR | O_CREAT, 0600); Err bitreich.org 70 i+ sfd = open(STOREF, flags, 0600); Err bitreich.org 70 i if (sfd < 0) Err bitreich.org 70 i err(1, "open %s", STOREF); Err bitreich.org 70 i Err bitreich.org 70 i- cfd = open(CACHEF, O_RDWR | O_CREAT, 0600); Err bitreich.org 70 i+ cfd = open(CACHEF, flags, 0600); Err bitreich.org 70 i if (cfd < 0) Err bitreich.org 70 i err(1, "open %s", CACHEF); Err bitreich.org 70 i Err bitreich.org 70 i@@ -557,9 +555,14 @@ init(void) Err bitreich.org 70 i flock(cfd, LOCK_NB | LOCK_EX) < 0) Err bitreich.org 70 i errx(1, "busy lock"); Err bitreich.org 70 i Err bitreich.org 70 i- load_snap_hdr(); Err bitreich.org 70 i- load_blk_hdr(); Err bitreich.org 70 i- load_cache(); Err bitreich.org 70 i+ if (iflag) { Err bitreich.org 70 i+ init_snap_hdr(); Err bitreich.org 70 i+ init_blk_hdr(); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ load_snap_hdr(); Err bitreich.org 70 i+ load_blk_hdr(); Err bitreich.org 70 i+ load_cache(); Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -568,9 +571,9 @@ term(void) Err bitreich.org 70 i if (verbose > 0) Err bitreich.org 70 i print_stats(&snap_hdr.st); Err bitreich.org 70 i Err bitreich.org 70 i- save_snap_hdr(); Err bitreich.org 70 i- save_blk_hdr(); Err bitreich.org 70 i save_cache(); Err bitreich.org 70 i+ save_blk_hdr(); Err bitreich.org 70 i+ save_snap_hdr(); Err bitreich.org 70 i Err bitreich.org 70 i fsync(ifd); Err bitreich.org 70 i fsync(sfd); Err bitreich.org 70 i@@ -586,7 +589,7 @@ term(void) 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 [-clv] [-e id] [-r root] [-m message] [file]\n", argv0); Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-cilv] [-e id] [-r root] [-m message] [file]\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -595,7 +598,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i char *id = NULL, *root = NULL, *msg = NULL; Err bitreich.org 70 i- int fd = -1, lflag = 0, cflag = 0; Err bitreich.org 70 i+ int fd = -1, iflag = 0, lflag = 0, cflag = 0; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i case 'c': Err bitreich.org 70 i@@ -604,6 +607,9 @@ main(int argc, char *argv[]) Err bitreich.org 70 i case 'e': Err bitreich.org 70 i id = EARGF(usage()); Err bitreich.org 70 i break; Err bitreich.org 70 i+ case 'i': Err bitreich.org 70 i+ iflag = 1; Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'l': Err bitreich.org 70 i lflag = 1; Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -645,7 +651,12 @@ main(int argc, char *argv[]) Err bitreich.org 70 i err(1, "chdir: %s", root); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- init(); Err bitreich.org 70 i+ init(iflag); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (iflag) { Err bitreich.org 70 i+ term(); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i if (cflag) { Err bitreich.org 70 i xlseek(ifd, SNAP_HDR_LEN, SEEK_SET); Err bitreich.org 70 .