Avoid chdir calls in dup-gc(1) and dup-init(1) - dedup - deduplicating backup program
 (HTM) git clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dcd160319defab89c482448737c8f80a6b005570
 (DIR) parent 2fcad321a15f6d09e77b70650e9737bd2d370a6e
 (HTM) Author: sin <sin@2f30.org>
       Date:   Sun,  5 May 2019 17:50:02 +0100
       
       Avoid chdir calls in dup-gc(1) and dup-init(1)
       
       chdir() interferes with the locking logic.
       
       Diffstat:
         M dup-gc.c                            |      15 +++++++++------
         M dup-init.c                          |      24 ++++++++++++++++--------
       
       2 files changed, 25 insertions(+), 14 deletions(-)
       ---
 (DIR) diff --git a/dup-gc.c b/dup-gc.c
       @@ -3,6 +3,7 @@
        
        #include <err.h>
        #include <fcntl.h>
       +#include <limits.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
       @@ -26,6 +27,7 @@ usage(void)
        int
        main(int argc, char *argv[])
        {
       +        char path[PATH_MAX];
                unsigned char key[KEYSIZE];
                struct bctx *bctx;        /* block context */
                struct bparam bpar;
       @@ -69,14 +71,15 @@ main(int argc, char *argv[])
                        bpar.key = NULL;
                }
        
       -        if (chdir(repo) < 0)
       -                err(1, "chdir: %s", repo);
       +        if (snprintf(path, sizeof(path), "%s/%s",
       +                     repo, STORAGEPATH) >= sizeof(path))
       +                errx(1, "snprintf: %s: path too long", path);
        
       -        if (bopen(STORAGEPATH, B_RDWR, 0600, &bpar, &bctx) < 0)
       -                berr("bopen: %s", STORAGEPATH);
       +        if (bopen(path, B_RDWR, 0600, &bpar, &bctx) < 0)
       +                berr("bopen: %s", path);
                if (bgc(bctx) < 0)
       -                berr("bgc: %s", STORAGEPATH);
       +                berr("bgc: %s", path);
                if (bclose(bctx) < 0)
       -                berr("bclose: %s", STORAGEPATH);
       +                berr("bclose: %s", path);
                return 0;
        }
 (DIR) diff --git a/dup-init.c b/dup-init.c
       @@ -3,6 +3,7 @@
        
        #include <err.h>
        #include <fcntl.h>
       +#include <limits.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
       @@ -11,6 +12,7 @@
        #include "block.h"
        #include "config.h"
        #include "key.h"
       +#include "misc.h"
        #include "snap.h"
        
        int verbose;
       @@ -26,6 +28,8 @@ usage(void)
        int
        main(int argc, char *argv[])
        {
       +        char spath[PATH_MAX];
       +        char bpath[PATH_MAX];
                unsigned char key[KEYSIZE];
                struct bctx *bctx;        /* block context */
                struct bparam bpar;
       @@ -78,16 +82,20 @@ main(int argc, char *argv[])
                        bpar.key = NULL;
                }
        
       +        if (snprintf(spath, sizeof(spath), "%s/%s",
       +                     repo, ARCHIVEPATH) >= sizeof(spath))
       +                errx(1, "snprintf: %s: path too long", spath);
       +        if (snprintf(bpath, sizeof(bpath), "%s/%s",
       +                     repo, STORAGEPATH) >= sizeof(bpath))
       +                errx(1, "snprintf: %s: path too long", bpath);
       +
                if (mkdir(repo, 0700) < 0)
                        err(1, "mkdir: %s", repo);
       -        if (chdir(repo) < 0)
       -                err(1, "chdir: %s", repo);
       -
       -        if (mkdir(ARCHIVEPATH, 0700) < 0)
       -                err(1, "mkdir: %s", ARCHIVEPATH);
       -        if (bcreat(STORAGEPATH, 0600, &bpar, &bctx) < 0)
       -                berr("bcreat: %s", STORAGEPATH);
       +        if (mkdir(spath, 0700) < 0)
       +                err(1, "mkdir: %s", spath);
       +        if (bcreat(bpath, 0600, &bpar, &bctx) < 0)
       +                berr("bcreat: %s", bpath);
                if (bclose(bctx) < 0)
       -                berr("bclose: %s", STORAGEPATH);
       +                berr("bclose: %s", bpath);
                return 0;
        }