diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-24 06:59:18 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-24 06:59:18 +0000 |
| commit | 04186b51dfcada174b5372aab0c7e423a4ed3244 (patch) | |
| tree | d99d0b35c8c9c1af6b4e7826cd1d87e509895b9d /src/repo | |
| parent | a4756f00b3823952580d1fee704675c6f813a248 (diff) | |
| download | s6-rc-04186b51dfcada174b5372aab0c7e423a4ed3244.tar.gz | |
More progress: updated sync, nominal fix
Diffstat (limited to 'src/repo')
| -rw-r--r-- | src/repo/deps-exe/s6-rc-repo-sync | 3 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 42 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-sync.c | 49 |
3 files changed, 85 insertions, 9 deletions
diff --git a/src/repo/deps-exe/s6-rc-repo-sync b/src/repo/deps-exe/s6-rc-repo-sync new file mode 100644 index 0000000..6dd7af7 --- /dev/null +++ b/src/repo/deps-exe/s6-rc-repo-sync @@ -0,0 +1,3 @@ +${LIBS6RC} +-lskarnet +${SYSCLOCK_LIB} diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c index 971a00e..8c65203 100644 --- a/src/repo/s6-rc-repo-init.c +++ b/src/repo/s6-rc-repo-init.c @@ -9,6 +9,7 @@ #include <stdio.h> /* rename */ #include <errno.h> +#include <skalibs/uint32.h> #include <skalibs/stat.h> #include <skalibs/posixplz.h> #include <skalibs/gol.h> @@ -21,7 +22,7 @@ #include <s6-rc/config.h> #include <s6-rc/s6rc.h> -#define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] sources..." +#define USAGE "s6-rc-repo-init [ -v verbosity ] [ -r repo ] [ -h fdhuser ] [ -B ] [ -f ] stores..." #define dieusage() strerr_dieusage(100, USAGE) static void cleanup (char const *fn) @@ -33,12 +34,14 @@ static void cleanup (char const *fn) enum golb_e { - GOLB_FORCE = 0x01 + GOLB_FORCE = 0x01, + GOLB_BARE = 0x02 } ; static gol_bool const rgolb[] = { - { .so = 'f', .lo = "force", .clear = 0, .set = GOLB_FORCE } + { .so = 'f', .lo = "force", .clear = 0, .set = GOLB_FORCE }, + { .so = 'S', .lo = "bare", .clear = 0, .set = GOLB_BARE } } ; enum gola_e @@ -70,18 +73,22 @@ int main (int argc, char const *const *argv) golc = GOL_main(argc, argv, rgolb, rgola, &wgolb, wgola) ; argc -= golc ; argv += golc ; + if (!argc) dieusage() ; if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity)) strerr_dief1x(100, "verbosity needs to be an unsigned integer") ; for (unsigned int i = 0 ; i < argc ; i++) + { if (argv[i][0] != '/') strerr_dief2x(100, argv[i], " is not an absolute path") ; - if (!argc) strerr_warnw1x("no source directories given, creating an empty repository") ; + if (strchr(argv[i], '\n')) + strerr_dief1x(100, "stores cannot contain newlines in their path") ; + } tain_now_g() ; repolen = strlen(wgola[GOLA_REPODIR]) ; char repotmp[repolen + 12] ; - char tmp[repolen + 21] ; + char tmp[repolen + 29] ; memcpy(repotmp, wgola[GOLA_REPODIR], repolen) ; - memcpy(repotmp + repolen, "-tmp.XXXXXX", 12) ; + memcpy(repotmp + repolen, ":new:XXXXXX", 12) ; m = umask(0) ; if (!mkdtemp(repotmp)) { @@ -114,7 +121,24 @@ int main (int argc, char const *const *argv) strerr_diefu2sys(111, "mkdir ", tmp) ; } + memcpy(tmp + repolen + 12, "stores", 7) ; + if (mkdir(tmp, 02755) == -1) + { + cleanup(repotmp) ; + strerr_diefu2sys(111, "mkdir ", tmp) ; + } umask(m) ; + tmp[repolen + 19] = '/' ; + for (unsigned int i = 0 ; i < argc ; i++) + { + uint320_xfmt(tmp + repolen + 20, i, 8) ; + tmp[repolen + 28] = 0 ; + if (symlink(argv[i], tmp) == -1) + { + cleanup(repotmp) ; + strerr_diefu4sys(111, "make a symlink from ", tmp, " to ", argv[i]) ; + } + } memcpy(tmp + repolen + 12, "lock", 5) ; if (!openwritenclose_unsafe5(tmp, "", 0, 0, 0)) @@ -123,10 +147,10 @@ int main (int argc, char const *const *argv) strerr_diefu2sys(111, "create ", tmp) ; } - if (!s6rc_repo_sync(repotmp, argv, argc, verbosity, wgola[GOLA_FDHUSER])) + if (!(wgolb & GOLB_BARE) && !s6rc_repo_sync(repotmp, verbosity, wgola[GOLA_FDHUSER])) { cleanup(repotmp) ; - return 111 ; + _exit(111) ; } if (chmod(repotmp, 02755) == -1) @@ -161,5 +185,5 @@ int main (int argc, char const *const *argv) } } - return 0 ; + _exit(0) ; } diff --git a/src/repo/s6-rc-repo-sync.c b/src/repo/s6-rc-repo-sync.c new file mode 100644 index 0000000..f3768f7 --- /dev/null +++ b/src/repo/s6-rc-repo-sync.c @@ -0,0 +1,49 @@ +/* ISC license. */ + +#include <unistd.h> + +#include <skalibs/gol.h> +#include <skalibs/tai.h> +#include <skalibs/prog.h> +#include <skalibs/strerr.h> + +#include <s6-rc/config.h> +#include <s6-rc/s6rc.h> + +#define USAGE "s6-rc-repo-sync [ -v verbosity ] [ -r repo ] [ -h fdhuser ]" +#define dieusage() strerr_dieusage(100, USAGE) + +enum gola_e +{ + GOLA_VERBOSITY, + GOLA_REPODIR, + GOLA_FDHUSER, + GOLA_N +} ; + +static gol_arg const rgola[] = +{ + { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, + { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }, + { .so = 'h', .lo = "fd-holder-user", .i = GOLA_FDHUSER } +} ; + +int main (int argc, char const *const *argv) +{ + char const *wgola[GOLA_N] = { 0 } ; + unsigned int verbosity = 1 ; + unsigned int golc ; + + PROG = "s6-rc-repo-sync" ; + wgola[GOLA_REPODIR] = S6RC_REPO_BASE ; + + golc = gol_main(argc, argv, 0, 0, rgola, 3, 0, wgola) ; + argc -= golc ; argv += golc ; + if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity)) + strerr_dief1x(100, "verbosity needs to be an unsigned integer") ; + tain_now_g() ; + + if (!s6rc_repo_sync(wgola[GOLA_REPODIR], verbosity, wgola[GOLA_FDHUSER])) _exit(111) ; + + _exit(0) ; +} |
