From 04186b51dfcada174b5372aab0c7e423a4ed3244 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Wed, 24 Sep 2025 06:59:18 +0000 Subject: More progress: updated sync, nominal fix --- src/repo/deps-exe/s6-rc-repo-sync | 3 +++ src/repo/s6-rc-repo-init.c | 42 ++++++++++++++++++++++++++------- src/repo/s6-rc-repo-sync.c | 49 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 src/repo/deps-exe/s6-rc-repo-sync create mode 100644 src/repo/s6-rc-repo-sync.c (limited to 'src/repo') 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 /* rename */ #include +#include #include #include #include @@ -21,7 +22,7 @@ #include #include -#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 + +#include +#include +#include +#include + +#include +#include + +#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) ; +} -- cgit v1.3.1