SMOLNET PORTAL home about changes
iUse a state file to store repository settings - 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 6b21cc335d619eb1bdf2ea285087e98e4c78d7e4	/scm/dedup/commit/6b21cc335d619eb1bdf2ea285087e98e4c78d7e4.gph	bitreich.org	70
1parent 8ef5e9d6666a818d610e1e1b1ffefa552f2c76f6	/scm/dedup/commit/8ef5e9d6666a818d610e1e1b1ffefa552f2c76f6.gph	bitreich.org	70
hAuthor: sin <sin@2f30.org>	URL:mailto:sin@2f30.org	bitreich.org	70
iDate:   Sun, 12 May 2019 10:03:14 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
iUse a state file to store repository settings	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M bcompress.c                         |      32 +++++++++++++++++--------------	Err	bitreich.org	70
i  M bencrypt.c                          |      37 ++++++++++++++++---------------	Err	bitreich.org	70
i  M block.c                             |      25 +++++--------------------	Err	bitreich.org	70
i  M block.h                             |      15 ++++-----------	Err	bitreich.org	70
i  M bstorage.c                          |      80 ++-----------------------------	Err	bitreich.org	70
i  M dup-check.c                         |      61 ++++++++++++++++++++++---------	Err	bitreich.org	70
i  M dup-gc.c                            |      61 ++++++++++++++++++++++---------	Err	bitreich.org	70
i  M dup-init.c                          |      66 +++++++++++++++++++++-----------	Err	bitreich.org	70
i  M dup-keygen.c                        |       2 ++	Err	bitreich.org	70
i  M dup-pack.c                          |      60 ++++++++++++++++++++++---------	Err	bitreich.org	70
i  M dup-rm.c                            |      60 ++++++++++++++++++++++---------	Err	bitreich.org	70
i  M dup-unpack.c                        |      60 ++++++++++++++++++++++---------	Err	bitreich.org	70
i  M state.c                             |       1 +	Err	bitreich.org	70
i  M state.h                             |       5 +++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i14 files changed, 317 insertions(+), 248 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/bcompress.c b/bcompress.c	/scm/dedup/file/bcompress.c.gph	bitreich.org	70
i@@ -16,17 +16,21 @@	Err	bitreich.org	70
i #include <snappy-c.h>	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #include "block.h"	Err	bitreich.org	70
i+#include "config.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #define CDNONETYPE        0x200	Err	bitreich.org	70
i #define CDSNAPPYTYPE        0x201	Err	bitreich.org	70
i #define CDLZ4TYPE        0x202	Err	bitreich.org	70
i #define CDSIZE                (8 + 8)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+extern struct param param;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i extern int pack(unsigned char *, char *, ...);	Err	bitreich.org	70
i extern int unpack(unsigned char *, char *, ...);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-static int bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar);	Err	bitreich.org	70
i-static int bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar);	Err	bitreich.org	70
i+static int bccreat(struct bctx *bctx, char *path, int mode);	Err	bitreich.org	70
i+static int bcopen(struct bctx *bctx, char *path, int flags, int mode);	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@@ -90,19 +94,19 @@ packcd(void *buf, struct cd *cd)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i+bccreat(struct bctx *bctx, char *path, int mode)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct cctx *cctx;	Err	bitreich.org	70
i         int type;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (strcasecmp(bpar->calgo, "none") == 0) {	Err	bitreich.org	70
i+        if (strcasecmp(param.calgo, "none") == 0) {	Err	bitreich.org	70
i                 type = CDNONETYPE;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->calgo, "snappy") == 0) {	Err	bitreich.org	70
i+        } else if (strcasecmp(param.calgo, "snappy") == 0) {	Err	bitreich.org	70
i                 type = CDSNAPPYTYPE;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->calgo, "lz4") == 0) {	Err	bitreich.org	70
i+        } else if (strcasecmp(param.calgo, "lz4") == 0) {	Err	bitreich.org	70
i                 type = CDLZ4TYPE;	Err	bitreich.org	70
i         } else {	Err	bitreich.org	70
i-                bseterr("invalid compression type: %s", bpar->calgo);	Err	bitreich.org	70
i+                bseterr("invalid compression type: %s", param.calgo);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -114,7 +118,7 @@ bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i         cctx = bctx->cctx;	Err	bitreich.org	70
i         cctx->type = type;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (bencryptops()->creat(bctx, path, mode, bpar) < 0) {	Err	bitreich.org	70
i+        if (bencryptops()->creat(bctx, path, mode) < 0) {	Err	bitreich.org	70
i                 free(cctx);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i@@ -122,7 +126,7 @@ bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)	Err	bitreich.org	70
i+bcopen(struct bctx *bctx, char *path, int flags, int mode)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct cctx *cctx;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -133,21 +137,21 @@ bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         cctx = bctx->cctx;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (bencryptops()->open(bctx, path, flags, mode, bpar) < 0) {	Err	bitreich.org	70
i+        if (bencryptops()->open(bctx, path, flags, mode) < 0) {	Err	bitreich.org	70
i                 free(cctx);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (strcasecmp(bpar->calgo, "none") == 0) {	Err	bitreich.org	70
i+        if (strcasecmp(param.calgo, "none") == 0) {	Err	bitreich.org	70
i                 cctx->type = CDNONETYPE;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->calgo, "snappy") == 0) {	Err	bitreich.org	70
i+        } else if (strcasecmp(param.calgo, "snappy") == 0) {	Err	bitreich.org	70
i                 cctx->type = CDSNAPPYTYPE;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->calgo, "lz4") == 0) {	Err	bitreich.org	70
i+        } else if (strcasecmp(param.calgo, "lz4") == 0) {	Err	bitreich.org	70
i                 cctx->type = CDLZ4TYPE;	Err	bitreich.org	70
i         } else {	Err	bitreich.org	70
i                 bencryptops()->close(bctx);	Err	bitreich.org	70
i                 free(cctx);	Err	bitreich.org	70
i-                bseterr("invalid compression type: %s", bpar->calgo);	Err	bitreich.org	70
i+                bseterr("invalid compression type: %s", param.calgo);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
1diff --git a/bencrypt.c b/bencrypt.c	/scm/dedup/file/bencrypt.c.gph	bitreich.org	70
i@@ -16,6 +16,9 @@	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #include "block.h"	Err	bitreich.org	70
i #include "config.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+extern struct param param;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #define EDNONETYPE        0x300	Err	bitreich.org	70
i #define EDCHACHATYPE        0x301	Err	bitreich.org	70
i@@ -24,8 +27,8 @@	Err	bitreich.org	70
i extern int pack(unsigned char *, char *, ...);	Err	bitreich.org	70
i extern int unpack(unsigned char *, char *, ...);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-static int becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar);	Err	bitreich.org	70
i-static int beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar);	Err	bitreich.org	70
i+static int becreat(struct bctx *bctx, char *path, int mode);	Err	bitreich.org	70
i+static int beopen(struct bctx *bctx, char *path, int flags, int mode);	Err	bitreich.org	70
i static int beput(struct bctx *bctx, void *buf, size_t n, unsigned char *md);	Err	bitreich.org	70
i static int beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n);	Err	bitreich.org	70
i static int berm(struct bctx *bctx, unsigned char *md);	Err	bitreich.org	70
i@@ -93,23 +96,23 @@ packed(void *buf, struct ed *ed)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i+becreat(struct bctx *bctx, char *path, int mode)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct ectx *ectx;	Err	bitreich.org	70
i         int type;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         /* Determine algorithm type */	Err	bitreich.org	70
i-        if (strcasecmp(bpar->ealgo, "none") == 0) {	Err	bitreich.org	70
i+        if (strcasecmp(param.ealgo, "none") == 0) {	Err	bitreich.org	70
i                 type = EDNONETYPE;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->ealgo, "XChaCha20-Poly1305") == 0) {	Err	bitreich.org	70
i+        } else if (strcasecmp(param.ealgo, "XChaCha20-Poly1305") == 0) {	Err	bitreich.org	70
i                 type = EDCHACHATYPE;	Err	bitreich.org	70
i         } else {	Err	bitreich.org	70
i-                bseterr("invalid encryption type: %s", bpar->ealgo);	Err	bitreich.org	70
i+                bseterr("invalid encryption type: %s", param.ealgo);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         /* Ensure that if caller requested encryption, a key was provided */	Err	bitreich.org	70
i-        if (type != EDNONETYPE && bpar->key == NULL) {	Err	bitreich.org	70
i+        if (type != EDNONETYPE && !param.keyloaded) {	Err	bitreich.org	70
i                 bseterr("expected encryption key");	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i@@ -126,10 +129,9 @@ becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         ectx = bctx->ectx;	Err	bitreich.org	70
i         ectx->type = type;	Err	bitreich.org	70
i-        if (bpar->key != NULL)	Err	bitreich.org	70
i-                memcpy(ectx->key, bpar->key, KEYSIZE);	Err	bitreich.org	70
i+        memcpy(ectx->key, param.key, KEYSIZE);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (bstorageops()->creat(bctx, path, mode, bpar) < 0) {	Err	bitreich.org	70
i+        if (bstorageops()->creat(bctx, path, mode) < 0) {	Err	bitreich.org	70
i                 free(ectx);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i@@ -137,7 +139,7 @@ becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)	Err	bitreich.org	70
i+beopen(struct bctx *bctx, char *path, int flags, int mode)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct ectx *ectx;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -147,28 +149,27 @@ beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         ectx = bctx->ectx;	Err	bitreich.org	70
i-        if (bpar->key != NULL)	Err	bitreich.org	70
i-                memcpy(ectx->key, bpar->key, KEYSIZE);	Err	bitreich.org	70
i+        memcpy(ectx->key, param.key, KEYSIZE);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (bstorageops()->open(bctx, path, flags, mode, bpar) < 0) {	Err	bitreich.org	70
i+        if (bstorageops()->open(bctx, path, flags, mode) < 0) {	Err	bitreich.org	70
i                 free(ectx);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         /* Determine algorithm type */	Err	bitreich.org	70
i-        if (strcasecmp(bpar->ealgo, "none") == 0)	Err	bitreich.org	70
i+        if (strcasecmp(param.ealgo, "none") == 0)	Err	bitreich.org	70
i                 ectx->type = EDNONETYPE;	Err	bitreich.org	70
i-        else if (strcasecmp(bpar->ealgo, "XChaCha20-Poly1305") == 0)	Err	bitreich.org	70
i+        else if (strcasecmp(param.ealgo, "XChaCha20-Poly1305") == 0)	Err	bitreich.org	70
i                 ectx->type = EDCHACHATYPE;	Err	bitreich.org	70
i         else {	Err	bitreich.org	70
i                 bstorageops()->close(bctx);	Err	bitreich.org	70
i                 free(ectx);	Err	bitreich.org	70
i-                bseterr("invalid encryption type: %s", bpar->ealgo);	Err	bitreich.org	70
i+                bseterr("invalid encryption type: %s", param.ealgo);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         /* Ensure that if repo is encrypted, a key was provided */	Err	bitreich.org	70
i-        if (ectx->type != EDNONETYPE && bpar->key == NULL) {	Err	bitreich.org	70
i+        if (ectx->type != EDNONETYPE && !param.keyloaded) {	Err	bitreich.org	70
i                 bstorageops()->close(bctx);	Err	bitreich.org	70
i                 free(ectx);	Err	bitreich.org	70
i                 bseterr("expected encryption key");	Err	bitreich.org	70
1diff --git a/block.c b/block.c	/scm/dedup/file/block.c.gph	bitreich.org	70
i@@ -16,7 +16,7 @@	Err	bitreich.org	70
i static char errbuf[NERRBUF];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i int	Err	bitreich.org	70
i-bcreat(char *path, int mode, struct bparam *bpar, struct bctx **bctx)	Err	bitreich.org	70
i+bcreat(char *path, int mode, 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@@ -25,9 +25,6 @@ bcreat(char *path, int mode, struct bparam *bpar, struct bctx **bctx)	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (bpar == NULL)	Err	bitreich.org	70
i-                bpar = bparamdef();	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         *bctx = calloc(1, sizeof(**bctx));	Err	bitreich.org	70
i         if (*bctx == NULL) {	Err	bitreich.org	70
i                 bseterr("calloc: %s", strerror(errno));	Err	bitreich.org	70
i@@ -35,7 +32,7 @@ bcreat(char *path, int mode, struct bparam *bpar, struct bctx **bctx)	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         bops = bcompressops();	Err	bitreich.org	70
i-        if (bops->creat(*bctx, path, mode, bpar) < 0) {	Err	bitreich.org	70
i+        if (bops->creat(*bctx, path, mode) < 0) {	Err	bitreich.org	70
i                 free(*bctx);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i@@ -43,11 +40,11 @@ bcreat(char *path, int mode, struct bparam *bpar, struct bctx **bctx)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i int	Err	bitreich.org	70
i-bopen(char *path, int flags, int mode, struct bparam *bpar, struct bctx **bctx)	Err	bitreich.org	70
i+bopen(char *path, int flags, int mode, 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 (path == NULL || bpar == NULL || bctx == NULL) {	Err	bitreich.org	70
i+        if (path == NULL || bctx == NULL) {	Err	bitreich.org	70
i                 bseterr("invalid params");	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i@@ -59,7 +56,7 @@ bopen(char *path, int flags, int mode, struct bparam *bpar, struct bctx **bctx)	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         bops = bcompressops();	Err	bitreich.org	70
i-        if (bops->open(*bctx, path, flags, mode, bpar) < 0) {	Err	bitreich.org	70
i+        if (bops->open(*bctx, path, flags, mode) < 0) {	Err	bitreich.org	70
i                 free(*bctx);	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i@@ -169,18 +166,6 @@ bclose(struct bctx *bctx)	Err	bitreich.org	70
i         return r;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-struct bparam *	Err	bitreich.org	70
i-bparamdef(void)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        static struct bparam bpar = {	Err	bitreich.org	70
i-                .calgo = "snappy",	Err	bitreich.org	70
i-                .ealgo = "none",	Err	bitreich.org	70
i-                .key = NULL	Err	bitreich.org	70
i-        };	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return &bpar;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i void	Err	bitreich.org	70
i bseterr(char *fmt, ...)	Err	bitreich.org	70
i {	Err	bitreich.org	70
1diff --git a/block.h b/block.h	/scm/dedup/file/block.h.gph	bitreich.org	70
i@@ -10,19 +10,13 @@ struct bctx {	Err	bitreich.org	70
i         void *sctx;        /* storage layer context */	Err	bitreich.org	70
i };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-struct bparam {	Err	bitreich.org	70
i-        char *calgo;	Err	bitreich.org	70
i-        char *ealgo;	Err	bitreich.org	70
i-        unsigned char *key;	Err	bitreich.org	70
i-};	Err	bitreich.org	70
i-	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i  * Block operations structure.	Err	bitreich.org	70
i  * This is implemented by each of the block layers.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i struct bops {	Err	bitreich.org	70
i-        int (*creat)(struct bctx *, char *, int, struct bparam *);	Err	bitreich.org	70
i-        int (*open)(struct bctx *, char *, int, int, struct bparam *);	Err	bitreich.org	70
i+        int (*creat)(struct bctx *, char *, int);	Err	bitreich.org	70
i+        int (*open)(struct bctx *, char *, int, int);	Err	bitreich.org	70
i         int (*put)(struct bctx *, void *, size_t, unsigned char *);	Err	bitreich.org	70
i         int (*get)(struct bctx *, unsigned char *, void *, size_t *);	Err	bitreich.org	70
i         int (*rm)(struct bctx *, unsigned char *);	Err	bitreich.org	70
i@@ -33,8 +27,8 @@ struct bops {	Err	bitreich.org	70
i };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* block.c */	Err	bitreich.org	70
i-extern int bcreat(char *, int, struct bparam *, struct bctx **);	Err	bitreich.org	70
i-extern int bopen(char *, int, int, struct bparam *, struct bctx **);	Err	bitreich.org	70
i+extern int bcreat(char *, int, struct bctx **);	Err	bitreich.org	70
i+extern int bopen(char *, int, int, struct bctx **);	Err	bitreich.org	70
i extern int bput(struct bctx *, void *, size_t, unsigned char *);	Err	bitreich.org	70
i extern int bget(struct bctx *, unsigned char *, void *, size_t *);	Err	bitreich.org	70
i extern int brm(struct bctx *, unsigned char *);	Err	bitreich.org	70
i@@ -42,7 +36,6 @@ extern int bgc(struct bctx *);	Err	bitreich.org	70
i extern int bcheck(struct bctx *, unsigned char *);	Err	bitreich.org	70
i extern int bsync(struct bctx *);	Err	bitreich.org	70
i extern int bclose(struct bctx *);	Err	bitreich.org	70
i-extern struct bparam *bparamdef(void);	Err	bitreich.org	70
i extern void bseterr(char *, ...);	Err	bitreich.org	70
i extern void berr(char *, ...);	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/bstorage.c b/bstorage.c	/scm/dedup/file/bstorage.c.gph	bitreich.org	70
i@@ -40,17 +40,6 @@	Err	bitreich.org	70
i #define VMAJSHIFT        8	Err	bitreich.org	70
i #define VMAJMASK        0xff	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-#define CALGOSHIFT        16	Err	bitreich.org	70
i-#define CALGOMASK        0x7	Err	bitreich.org	70
i-#define CNONETYPE        0	Err	bitreich.org	70
i-#define CSNAPPYTYPE        1	Err	bitreich.org	70
i-#define CLZ4TYPE        2	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define EALGOSHIFT        19	Err	bitreich.org	70
i-#define EALGOMASK        0x7	Err	bitreich.org	70
i-#define ENONETYPE        0	Err	bitreich.org	70
i-#define ECHACHATYPE        1	Err	bitreich.org	70
i-	Err	bitreich.org	70
i #define BHDRSIZE        (NBHDRMAGIC + 8 + 8)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* block descriptor constants */	Err	bitreich.org	70
i@@ -61,8 +50,8 @@	Err	bitreich.org	70
i extern int pack(unsigned char *, char *, ...);	Err	bitreich.org	70
i extern int unpack(unsigned char *, char *, ...);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-static int bscreat(struct bctx *, char *, int, struct bparam *);	Err	bitreich.org	70
i-static int bsopen(struct bctx *, char *, int, int, struct bparam *);	Err	bitreich.org	70
i+static int bscreat(struct bctx *, char *, int);	Err	bitreich.org	70
i+static int bsopen(struct bctx *, char *, int, int);	Err	bitreich.org	70
i static int bsput(struct bctx *, void *, size_t, unsigned char *);	Err	bitreich.org	70
i static int bsget(struct bctx *, unsigned char *, void *, size_t *);	Err	bitreich.org	70
i static int bsrm(struct bctx *, unsigned char *);	Err	bitreich.org	70
i@@ -307,7 +296,7 @@ initbdcache(struct sctx *sctx)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* Create storage file */	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i+bscreat(struct bctx *bctx, char *path, int mode)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct sctx *sctx;	Err	bitreich.org	70
i         struct bhdr *bhdr;	Err	bitreich.org	70
i@@ -339,32 +328,6 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i         bhdr = &sctx->bhdr;	Err	bitreich.org	70
i         memcpy(bhdr->magic, BHDRMAGIC, NBHDRMAGIC);	Err	bitreich.org	70
i         bhdr->flags = (VMAJ << VMAJSHIFT) | VMIN;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* Set compression type */	Err	bitreich.org	70
i-        if (strcasecmp(bpar->calgo, "none") == 0) {	Err	bitreich.org	70
i-                bhdr->flags |= CNONETYPE << CALGOSHIFT;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->calgo, "snappy") == 0) {	Err	bitreich.org	70
i-                bhdr->flags |= CSNAPPYTYPE << CALGOSHIFT;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->calgo, "lz4") == 0) {	Err	bitreich.org	70
i-                bhdr->flags |= CLZ4TYPE << CALGOSHIFT;	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                free(sctx);	Err	bitreich.org	70
i-                close(fd);	Err	bitreich.org	70
i-                bseterr("invalid compression type: %s", bpar->calgo);	Err	bitreich.org	70
i-                return -1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* Set encryption type */	Err	bitreich.org	70
i-        if (strcasecmp(bpar->ealgo, "none") == 0) {	Err	bitreich.org	70
i-                bhdr->flags |= ENONETYPE << EALGOSHIFT;	Err	bitreich.org	70
i-        } else if (strcasecmp(bpar->ealgo, "XChaCha20-Poly1305") == 0) {	Err	bitreich.org	70
i-                bhdr->flags |= ECHACHATYPE << EALGOSHIFT;	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                free(sctx);	Err	bitreich.org	70
i-                close(fd);	Err	bitreich.org	70
i-                bseterr("invalid encryption type: %s", bpar->ealgo);	Err	bitreich.org	70
i-                return -1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i         bhdr->nbd = 0;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if (packbhdr(fd, bhdr) < 0) {	Err	bitreich.org	70
i@@ -377,7 +340,7 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* Open storage file */	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)	Err	bitreich.org	70
i+bsopen(struct bctx *bctx, char *path, int flags, int mode)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct sctx *sctx;	Err	bitreich.org	70
i         struct bhdr *bhdr;	Err	bitreich.org	70
i@@ -439,41 +402,6 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)	Err	bitreich.org	70
i                 return -1;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        /* Populate bparam compression algo */	Err	bitreich.org	70
i-        algo = (bhdr->flags >> CALGOSHIFT) & CALGOMASK;	Err	bitreich.org	70
i-        switch (algo) {	Err	bitreich.org	70
i-        case CNONETYPE:	Err	bitreich.org	70
i-                bpar->calgo = "none";	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        case CSNAPPYTYPE:	Err	bitreich.org	70
i-                bpar->calgo = "snappy";	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        case CLZ4TYPE:	Err	bitreich.org	70
i-                bpar->calgo = "lz4";	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        default:	Err	bitreich.org	70
i-                free(sctx);	Err	bitreich.org	70
i-                close(fd);	Err	bitreich.org	70
i-                bseterr("invalid compression type: %d", algo);	Err	bitreich.org	70
i-                return -1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* Populate bparam encryption algo */	Err	bitreich.org	70
i-        algo = (bhdr->flags >> EALGOSHIFT) & EALGOMASK;	Err	bitreich.org	70
i-        switch (algo) {	Err	bitreich.org	70
i-        case ENONETYPE:	Err	bitreich.org	70
i-                bpar->ealgo = "none";	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        case ECHACHATYPE:	Err	bitreich.org	70
i-                bpar->ealgo = "XChaCha20-Poly1305";	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-        default:	Err	bitreich.org	70
i-                free(sctx);	Err	bitreich.org	70
i-                close(fd);	Err	bitreich.org	70
i-                bseterr("invalid encryption type: %d", algo);	Err	bitreich.org	70
i-                return -1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         sctx->fd = fd;	Err	bitreich.org	70
i         sctx->rdonly = flags == O_RDONLY;	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/dup-check.c b/dup-check.c	/scm/dedup/file/dup-check.c.gph	bitreich.org	70
i@@ -16,11 +16,48 @@	Err	bitreich.org	70
i #include "key.h"	Err	bitreich.org	70
i #include "lock.h"	Err	bitreich.org	70
i #include "snap.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;	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+initparam(char *repo)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char path[PATH_MAX];	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path))	Err	bitreich.org	70
i+                errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i+        fd = open(path, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", path);	Err	bitreich.org	70
i+        if (loadstate(fd, &param) < 0)	Err	bitreich.org	70
i+                errx(1, "loadstate: failed");	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", path);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+initkey(char *keyfile)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (keyfile == NULL)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", keyfile);	Err	bitreich.org	70
i+        if (loadkey(fd, param.key, sizeof(param.key)) < 0)	Err	bitreich.org	70
i+                errx(1, "loadkey: failed");	Err	bitreich.org	70
i+        param.keyloaded = 1;	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", keyfile);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i check(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@@ -56,10 +93,8 @@ 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-        unsigned char key[KEYSIZE];	Err	bitreich.org	70
i         struct sctx *sctx;	Err	bitreich.org	70
i         struct bctx *bctx;	Err	bitreich.org	70
i-        struct bparam bpar;	Err	bitreich.org	70
i         char *keyfile = NULL;	Err	bitreich.org	70
i         char *repo = ".";	Err	bitreich.org	70
i         int lfd;	Err	bitreich.org	70
i@@ -81,21 +116,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         if (argc != 1)	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (keyfile != NULL) {	Err	bitreich.org	70
i-                int fd;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i-                if (fd < 0)	Err	bitreich.org	70
i-                        err(1, "open: %s", keyfile);	Err	bitreich.org	70
i-                if (loadkey(fd, key, sizeof(key)) < 0)	Err	bitreich.org	70
i-                        errx(1, "loadkey: failed");	Err	bitreich.org	70
i-                bpar.key = key;	Err	bitreich.org	70
i-                if (close(fd) < 0)	Err	bitreich.org	70
i-                        err(1, "close: %s", keyfile);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                bpar.key = NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         if (snprintf(spath, sizeof(spath), "%s/archive/%s",	Err	bitreich.org	70
i                      repo, argv[0]) >= sizeof(spath))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", spath);	Err	bitreich.org	70
i@@ -105,9 +125,13 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if ((lfd = lockrepo(repo)) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to lock repository");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        initparam(repo);	Err	bitreich.org	70
i+        initkey(keyfile);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (sopen(spath, S_READ, 0600, &sctx) < 0)	Err	bitreich.org	70
i                 serr("sopen: %s", spath);	Err	bitreich.org	70
i-        if (bopen(bpath, B_READ, 0600, &bpar, &bctx) <0)	Err	bitreich.org	70
i+        if (bopen(bpath, B_READ, 0600, &bctx) <0)	Err	bitreich.org	70
i                 berr("bopen: %s", bpath);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         check(sctx, bctx);	Err	bitreich.org	70
i@@ -116,6 +140,7 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                 berr("bclose: %s", bpath);	Err	bitreich.org	70
i         if (sclose(sctx) < 0)	Err	bitreich.org	70
i                 serr("sclose: %s", spath);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (unlockrepo(lfd) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to unlock repository");	Err	bitreich.org	70
i         	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@@ -14,11 +14,48 @@	Err	bitreich.org	70
i #include "key.h"	Err	bitreich.org	70
i #include "lock.h"	Err	bitreich.org	70
i #include "snap.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;	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+initparam(char *repo)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char path[PATH_MAX];	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path))	Err	bitreich.org	70
i+                errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i+        fd = open(path, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", path);	Err	bitreich.org	70
i+        if (loadstate(fd, &param) < 0)	Err	bitreich.org	70
i+                errx(1, "loadstate: failed");	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", path);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+initkey(char *keyfile)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (keyfile == NULL)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", keyfile);	Err	bitreich.org	70
i+        if (loadkey(fd, param.key, sizeof(param.key)) < 0)	Err	bitreich.org	70
i+                errx(1, "loadkey: failed");	Err	bitreich.org	70
i+        param.keyloaded = 1;	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", keyfile);	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] [-k keyfile] [repo]\n", argv0);	Err	bitreich.org	70
i@@ -29,9 +66,7 @@ int	Err	bitreich.org	70
i main(int argc, char *argv[])	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         char path[PATH_MAX];	Err	bitreich.org	70
i-        unsigned char key[KEYSIZE];	Err	bitreich.org	70
i         struct bctx *bctx;	Err	bitreich.org	70
i-        struct bparam bpar;	Err	bitreich.org	70
i         char *keyfile = NULL;	Err	bitreich.org	70
i         char *repo;	Err	bitreich.org	70
i         int lfd;	Err	bitreich.org	70
i@@ -58,33 +93,23 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i         };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (keyfile != NULL) {	Err	bitreich.org	70
i-                int fd;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i-                if (fd < 0)	Err	bitreich.org	70
i-                        err(1, "open: %s", keyfile);	Err	bitreich.org	70
i-                if (loadkey(fd, key, sizeof(key)) < 0)	Err	bitreich.org	70
i-                        errx(1, "loadkey: failed");	Err	bitreich.org	70
i-                bpar.key = key;	Err	bitreich.org	70
i-                if (close(fd) < 0)	Err	bitreich.org	70
i-                        err(1, "close: %s", keyfile);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                bpar.key = NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         if (snprintf(path, sizeof(path), "%s/%s",	Err	bitreich.org	70
i                      repo, STORAGEPATH) >= sizeof(path))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if ((lfd = lockrepo(repo)) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to lock repository");	Err	bitreich.org	70
i-        if (bopen(path, B_RDWR, 0600, &bpar, &bctx) < 0)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        initparam(repo);	Err	bitreich.org	70
i+        initkey(keyfile);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (bopen(path, B_RDWR, 0600, &bctx) < 0)	Err	bitreich.org	70
i                 berr("bopen: %s", path);	Err	bitreich.org	70
i         if (bgc(bctx) < 0)	Err	bitreich.org	70
i                 berr("bgc: %s", path);	Err	bitreich.org	70
i         if (bclose(bctx) < 0)	Err	bitreich.org	70
i                 berr("bclose: %s", path);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (unlockrepo(lfd) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to unlock repository");	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
1diff --git a/dup-init.c b/dup-init.c	/scm/dedup/file/dup-init.c.gph	bitreich.org	70
i@@ -15,11 +15,48 @@	Err	bitreich.org	70
i #include "lock.h"	Err	bitreich.org	70
i #include "misc.h"	Err	bitreich.org	70
i #include "snap.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;	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+initparam(char *repo)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char path[PATH_MAX];	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path))	Err	bitreich.org	70
i+                errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i+        fd = open(path, O_RDWR | O_CREAT | O_EXCL, 0600);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", path);	Err	bitreich.org	70
i+        if (savestate(fd, &param) < 0)	Err	bitreich.org	70
i+                errx(1, "loadstate: failed");	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", path);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+initkey(char *keyfile)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (keyfile == NULL)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", keyfile);	Err	bitreich.org	70
i+        if (loadkey(fd, param.key, sizeof(param.key)) < 0)	Err	bitreich.org	70
i+                errx(1, "loadkey: failed");	Err	bitreich.org	70
i+        param.keyloaded = 1;	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", keyfile);	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] [-E algo] [-Z algo] [-k keyfile] [repo]\n", argv0);	Err	bitreich.org	70
i@@ -31,25 +68,23 @@ 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-        unsigned char key[KEYSIZE];	Err	bitreich.org	70
i         struct bctx *bctx;	Err	bitreich.org	70
i-        struct bparam bpar;	Err	bitreich.org	70
i         char *keyfile = NULL;	Err	bitreich.org	70
i         char *repo;	Err	bitreich.org	70
i         int lfd;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        bpar.calgo = bparamdef()->calgo;	Err	bitreich.org	70
i-        bpar.ealgo = bparamdef()->ealgo;	Err	bitreich.org	70
i+        param.calgo = "snappy";	Err	bitreich.org	70
i+        param.ealgo = "none";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         ARGBEGIN {	Err	bitreich.org	70
i         case 'k':	Err	bitreich.org	70
i                 keyfile = EARGF(usage());	Err	bitreich.org	70
i                 break;	Err	bitreich.org	70
i         case 'E':	Err	bitreich.org	70
i-                bpar.ealgo = EARGF(usage());	Err	bitreich.org	70
i+                param.ealgo = 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+                param.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@@ -69,21 +104,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i         };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (keyfile != NULL) {	Err	bitreich.org	70
i-                int fd;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i-                if (fd < 0)	Err	bitreich.org	70
i-                        err(1, "open: %s", keyfile);	Err	bitreich.org	70
i-                if (loadkey(fd, key, sizeof(key)) < 0)	Err	bitreich.org	70
i-                        errx(1, "loadkey: failed");	Err	bitreich.org	70
i-                bpar.key = key;	Err	bitreich.org	70
i-                if (close(fd) < 0)	Err	bitreich.org	70
i-                        err(1, "close: %s", keyfile);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                bpar.key = NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         if (snprintf(spath, sizeof(spath), "%s/%s",	Err	bitreich.org	70
i                      repo, ARCHIVEPATH) >= sizeof(spath))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", spath);	Err	bitreich.org	70
i@@ -91,13 +111,15 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                      repo, STORAGEPATH) >= sizeof(bpath))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", bpath);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+        initkey(keyfile);	Err	bitreich.org	70
i         if (mkdir(repo, 0700) < 0)	Err	bitreich.org	70
i                 err(1, "mkdir: %s", repo);	Err	bitreich.org	70
i         if ((lfd = lockrepo(repo)) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to lock repository");	Err	bitreich.org	70
i         if (mkdir(spath, 0700) < 0)	Err	bitreich.org	70
i                 err(1, "mkdir: %s", spath);	Err	bitreich.org	70
i-        if (bcreat(bpath, 0600, &bpar, &bctx) < 0)	Err	bitreich.org	70
i+        initparam(repo);	Err	bitreich.org	70
i+        if (bcreat(bpath, 0600, &bctx) < 0)	Err	bitreich.org	70
i                 berr("bcreat: %s", bpath);	Err	bitreich.org	70
i         if (bclose(bctx) < 0)	Err	bitreich.org	70
i                 berr("bclose: %s", bpath);	Err	bitreich.org	70
1diff --git a/dup-keygen.c b/dup-keygen.c	/scm/dedup/file/dup-keygen.c.gph	bitreich.org	70
i@@ -10,7 +10,9 @@	Err	bitreich.org	70
i #include "arg.h"	Err	bitreich.org	70
i #include "config.h"	Err	bitreich.org	70
i #include "key.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;        /* unused */	Err	bitreich.org	70
i int verbose;	Err	bitreich.org	70
i char *argv0;	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@@ -15,11 +15,48 @@	Err	bitreich.org	70
i #include "key.h"	Err	bitreich.org	70
i #include "lock.h"	Err	bitreich.org	70
i #include "snap.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;	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+initparam(char *repo)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char path[PATH_MAX];	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path))	Err	bitreich.org	70
i+                errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i+        fd = open(path, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", path);	Err	bitreich.org	70
i+        if (loadstate(fd, &param) < 0)	Err	bitreich.org	70
i+                errx(1, "loadstate: failed");	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", path);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+initkey(char *keyfile)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (keyfile == NULL)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", keyfile);	Err	bitreich.org	70
i+        if (loadkey(fd, param.key, sizeof(param.key)) < 0)	Err	bitreich.org	70
i+                errx(1, "loadkey: failed");	Err	bitreich.org	70
i+        param.keyloaded = 1;	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", keyfile);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i pack(struct sctx *sctx, struct bctx *bctx)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         struct chunker *c;	Err	bitreich.org	70
i@@ -61,7 +98,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         unsigned char key[KEYSIZE];	Err	bitreich.org	70
i         struct sctx *sctx;	Err	bitreich.org	70
i         struct bctx *bctx;	Err	bitreich.org	70
i-        struct bparam bpar;	Err	bitreich.org	70
i         char *keyfile = NULL;	Err	bitreich.org	70
i         char *repo = ".";	Err	bitreich.org	70
i         int lfd;	Err	bitreich.org	70
i@@ -83,21 +119,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         if (argc != 1)	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (keyfile != NULL) {	Err	bitreich.org	70
i-                int fd;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i-                if (fd < 0)	Err	bitreich.org	70
i-                        err(1, "open: %s", keyfile);	Err	bitreich.org	70
i-                if (loadkey(fd, key, sizeof(key)) < 0)	Err	bitreich.org	70
i-                        errx(1, "loadkey: failed");	Err	bitreich.org	70
i-                bpar.key = key;	Err	bitreich.org	70
i-                if (close(fd) < 0)	Err	bitreich.org	70
i-                        err(1, "close: %s", keyfile);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                bpar.key = NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         if (snprintf(spath, sizeof(spath), "%s/archive/%s",	Err	bitreich.org	70
i                      repo, argv[0]) >= sizeof(spath))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", spath);	Err	bitreich.org	70
i@@ -107,9 +128,13 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if ((lfd = lockrepo(repo)) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to lock repository");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        initparam(repo);	Err	bitreich.org	70
i+        initkey(keyfile);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (screat(spath, 0600, &sctx) < 0)	Err	bitreich.org	70
i                 serr("screat: %s", spath);	Err	bitreich.org	70
i-        if (bopen(bpath, B_RDWR, 0600, &bpar, &bctx) <0)	Err	bitreich.org	70
i+        if (bopen(bpath, B_RDWR, 0600, &bctx) <0)	Err	bitreich.org	70
i                 berr("bopen: %s", bpath);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         pack(sctx, bctx);	Err	bitreich.org	70
i@@ -118,6 +143,7 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                 berr("bclose: %s", bpath);	Err	bitreich.org	70
i         if (sclose(sctx) < 0)	Err	bitreich.org	70
i                 serr("sclose: %s", spath);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (unlockrepo(lfd) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to unlock repository");	Err	bitreich.org	70
i         return 0;	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@@ -14,11 +14,48 @@	Err	bitreich.org	70
i #include "key.h"	Err	bitreich.org	70
i #include "lock.h"	Err	bitreich.org	70
i #include "snap.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;	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+initparam(char *repo)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char path[PATH_MAX];	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path))	Err	bitreich.org	70
i+                errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i+        fd = open(path, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", path);	Err	bitreich.org	70
i+        if (loadstate(fd, &param) < 0)	Err	bitreich.org	70
i+                errx(1, "loadstate: failed");	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", path);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+initkey(char *keyfile)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (keyfile == NULL)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", keyfile);	Err	bitreich.org	70
i+        if (loadkey(fd, param.key, sizeof(param.key)) < 0)	Err	bitreich.org	70
i+                errx(1, "loadkey: failed");	Err	bitreich.org	70
i+        param.keyloaded = 1;	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", keyfile);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	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@@ -47,7 +84,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         unsigned char key[KEYSIZE];	Err	bitreich.org	70
i         struct sctx *sctx;	Err	bitreich.org	70
i         struct bctx *bctx;	Err	bitreich.org	70
i-        struct bparam bpar;	Err	bitreich.org	70
i         char *keyfile = NULL;	Err	bitreich.org	70
i         char *repo = ".";	Err	bitreich.org	70
i         int lfd;	Err	bitreich.org	70
i@@ -69,21 +105,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         if (argc != 1)	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (keyfile != NULL) {	Err	bitreich.org	70
i-                int fd;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i-                if (fd < 0)	Err	bitreich.org	70
i-                        err(1, "open: %s", keyfile);	Err	bitreich.org	70
i-                if (loadkey(fd, key, sizeof(key)) < 0)	Err	bitreich.org	70
i-                        errx(1, "loadkey: failed");	Err	bitreich.org	70
i-                bpar.key = key;	Err	bitreich.org	70
i-                if (close(fd) < 0)	Err	bitreich.org	70
i-                        err(1, "close: %s", keyfile);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                bpar.key = NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         if (snprintf(spath, sizeof(spath), "%s/archive/%s",	Err	bitreich.org	70
i                      repo, argv[0]) >= sizeof(spath))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", spath);	Err	bitreich.org	70
i@@ -93,9 +114,13 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if ((lfd = lockrepo(repo)) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to lock repository");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        initparam(repo);	Err	bitreich.org	70
i+        initkey(keyfile);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (sopen(spath, S_READ, 0600, &sctx) < 0)	Err	bitreich.org	70
i                 serr("sopen: %s", spath);	Err	bitreich.org	70
i-        if (bopen(bpath, B_RDWR, 0600, &bpar, &bctx) <0)	Err	bitreich.org	70
i+        if (bopen(bpath, B_RDWR, 0600, &bctx) <0)	Err	bitreich.org	70
i                 berr("bopen: %s", bpath);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         rm(sctx, bctx);	Err	bitreich.org	70
i@@ -106,6 +131,7 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                 serr("sclose: %s", spath);	Err	bitreich.org	70
i         if (unlink(spath) < 0)	Err	bitreich.org	70
i                 err(1, "unlink: %s", spath);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (unlockrepo(lfd) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to unlock repository");	Err	bitreich.org	70
i         	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@@ -15,11 +15,48 @@	Err	bitreich.org	70
i #include "lock.h"	Err	bitreich.org	70
i #include "misc.h"	Err	bitreich.org	70
i #include "snap.h"	Err	bitreich.org	70
i+#include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+struct param param;	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+initparam(char *repo)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char path[PATH_MAX];	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (snprintf(path, sizeof(path), "%s/state", repo) >= sizeof(path))	Err	bitreich.org	70
i+                errx(1, "snprintf: %s: path too long", path);	Err	bitreich.org	70
i+        fd = open(path, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", path);	Err	bitreich.org	70
i+        if (loadstate(fd, &param) < 0)	Err	bitreich.org	70
i+                errx(1, "loadstate: failed");	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", path);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+initkey(char *keyfile)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int fd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (keyfile == NULL)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i+        if (fd < 0)	Err	bitreich.org	70
i+                err(1, "open: %s", keyfile);	Err	bitreich.org	70
i+        if (loadkey(fd, param.key, sizeof(param.key)) < 0)	Err	bitreich.org	70
i+                errx(1, "loadkey: failed");	Err	bitreich.org	70
i+        param.keyloaded = 1;	Err	bitreich.org	70
i+        if (close(fd) < 0)	Err	bitreich.org	70
i+                err(1, "close: %s", keyfile);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i unpack(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@@ -57,7 +94,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         unsigned char key[KEYSIZE];	Err	bitreich.org	70
i         struct sctx *sctx;	Err	bitreich.org	70
i         struct bctx *bctx;	Err	bitreich.org	70
i-        struct bparam bpar;	Err	bitreich.org	70
i         char *keyfile = NULL;	Err	bitreich.org	70
i         char *repo = ".";	Err	bitreich.org	70
i         int lfd;	Err	bitreich.org	70
i@@ -79,21 +115,6 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         if (argc != 1)	Err	bitreich.org	70
i                 usage();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (keyfile != NULL) {	Err	bitreich.org	70
i-                int fd;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-                fd = open(keyfile, O_RDONLY);	Err	bitreich.org	70
i-                if (fd < 0)	Err	bitreich.org	70
i-                        err(1, "open: %s", keyfile);	Err	bitreich.org	70
i-                if (loadkey(fd, key, sizeof(key)) < 0)	Err	bitreich.org	70
i-                        errx(1, "loadkey: failed");	Err	bitreich.org	70
i-                bpar.key = key;	Err	bitreich.org	70
i-                if (close(fd) < 0)	Err	bitreich.org	70
i-                        err(1, "close: %s", keyfile);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                bpar.key = NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i         if (snprintf(spath, sizeof(spath), "%s/archive/%s",	Err	bitreich.org	70
i                      repo, argv[0]) >= sizeof(spath))	Err	bitreich.org	70
i                 errx(1, "snprintf: %s: path too long", spath);	Err	bitreich.org	70
i@@ -103,9 +124,13 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if ((lfd = lockrepo(repo)) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to lock repository");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        initparam(repo);	Err	bitreich.org	70
i+        initkey(keyfile);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (sopen(spath, S_READ, 0600, &sctx) < 0)	Err	bitreich.org	70
i                 serr("sopen: %s", spath);	Err	bitreich.org	70
i-        if (bopen(bpath, B_READ, 0600, &bpar, &bctx) <0)	Err	bitreich.org	70
i+        if (bopen(bpath, B_READ, 0600, &bctx) <0)	Err	bitreich.org	70
i                 berr("bopen: %s", bpath);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         unpack(sctx, bctx);	Err	bitreich.org	70
i@@ -114,6 +139,7 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                 berr("bclose: %s", bpath);	Err	bitreich.org	70
i         if (sclose(sctx) < 0)	Err	bitreich.org	70
i                 serr("sclose: %s", spath);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         if (unlockrepo(lfd) < 0)	Err	bitreich.org	70
i                 errx(1, "failed to unlock repository");	Err	bitreich.org	70
i         	Err	bitreich.org	70
1diff --git a/state.c b/state.c	/scm/dedup/file/state.c.gph	bitreich.org	70
i@@ -4,6 +4,7 @@	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i #include <strings.h>	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+#include "config.h"	Err	bitreich.org	70
i #include "misc.h"	Err	bitreich.org	70
i #include "state.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
1diff --git a/state.h b/state.h	/scm/dedup/file/state.h.gph	bitreich.org	70
i@@ -1,4 +1,9 @@	Err	bitreich.org	70
i struct param {	Err	bitreich.org	70
i         char *calgo;	Err	bitreich.org	70
i         char *ealgo;	Err	bitreich.org	70
i+        unsigned char key[KEYSIZE];	Err	bitreich.org	70
i+        int keyloaded;	Err	bitreich.org	70
i };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int savestate(int, struct param *);	Err	bitreich.org	70
i+int loadstate(int fd, struct param *);	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/dedup/commit/6b21cc335d619eb1...
Content-Typetext/plain; charset=utf-8