diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-10-05 00:05:59 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-10-05 00:05:59 +0000 |
| commit | 399184cad0c0dd63a39de775130a2a73d0325913 (patch) | |
| tree | 978b8c5dc3f494a9627f601bf8728bf6e8324b57 | |
| parent | 92ef99d90574ebd4732c10a0a127945a40271c87 (diff) | |
| download | s6-rc-399184cad0c0dd63a39de775130a2a73d0325913.tar.gz | |
Do not delete old store before the sync succeeds
| -rw-r--r-- | NEWS | 6 | ||||
| -rw-r--r-- | doc/index.html | 18 | ||||
| -rw-r--r-- | doc/overview.html | 13 | ||||
| -rw-r--r-- | doc/upgrade.html | 2 | ||||
| -rw-r--r-- | package/info | 2 | ||||
| -rw-r--r-- | src/include/s6-rc/repo.h | 2 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_livedir_create.c | 9 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_makestores.c | 7 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_sync.c | 7 | ||||
| -rw-r--r-- | src/libs6rc/s6rc_repo_syncset_tmp.c | 2 | ||||
| -rw-r--r-- | src/repo/DESIGN.txt | 12 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 19 |
12 files changed, 69 insertions, 30 deletions
@@ -1,11 +1,13 @@ Changelog for s6-rc. -In 0.5.7.0 +In 0.6.0.0 ---------- - Bugfixes. - Support for shared libraries on MacOS. - - New set of s6-rc-repo-* and s6-rc-set-* binaries. + - New: s6-rc-repo-* and s6-rc-set-* binaries, the "repo" +collection of tools to help with management of source definition +directories. In 0.5.6.0 diff --git a/doc/index.html b/doc/index.html index c02c966..9ede9bc 100644 --- a/doc/index.html +++ b/doc/index.html @@ -36,6 +36,7 @@ scripts are also run in a controlled environment. <li> <a href="why.html">Why</a> such a program ? </li> <li> A <a href="overview.html">high-level overview</a> of s6-rc </li> <li> <a href="faq.html">FAQ</a> for s6-rc </li> + <li> An <a href="repodefs.html">overview</a> of the <em>repo</em> tools in s6-rc </li> </ul> <hr /> @@ -67,8 +68,8 @@ requirement if you link against the shared version of the skalibs library. </li> <ul> <li> The current released version of s6-rc is -<a href="s6-rc-0.5.7.0.tar.gz">0.5.7.0</a>. -You can access its checksum <a href="s6-rc-0.5.7.0.tar.gz.sha256">here</a>. </li> +<a href="s6-rc-0.6.0.0.tar.gz">0.5.7.0</a>. +You can access its checksum <a href="s6-rc-0.6.0.0.tar.gz.sha256">here</a>. </li> <li> Alternatively, you can checkout a copy of the <a href="//git.skarnet.org/cgi-bin/cgit.cgi/s6-rc/">s6-rc git repository</a>: @@ -128,6 +129,19 @@ the previous versions of s6-rc and the current one. </li> <li> <a href="s6-rc-fdholder-filler.html">The <tt>s6-rc-fdholder-filler</tt> internal program</a> </li> </ul> +<h4> Management of source definition directories: the <em>repo</em> collection of tools </h4> + +<ul> + <li> An <a href="repodefs.html">overview</a> of the <em>repo</em> tools </li> + <li> <a href="s6-rc-repo-init.html">The <tt>s6-rc-repo-init</tt> program</a> </li> + <li> <a href="s6-rc-repo-sync.html">The <tt>s6-rc-repo-sync</tt> program</a> </li> + <li> <a href="s6-rc-repo-set-new.html">The <tt>s6-rc-set-new</tt> program</a> </li> + <li> <a href="s6-rc-repo-set-copy.html">The <tt>s6-rc-set-copy</tt> program</a> </li> + <li> <a href="s6-rc-repo-set-delete.html">The <tt>s6-rc-set-delete</tt> program</a> </li> + <li> <a href="s6-rc-repo-set-changestate.html">The <tt>s6-rc-set-changestate</tt> program</a> </li> + <li> <a href="s6-rc-repo-set-commit.html">The <tt>s6-rc-set-commit</tt> program</a> </li> +</ul> + <h2> Related resources </h2> <p> diff --git a/doc/overview.html b/doc/overview.html index 87a33bb..45ebdbe 100644 --- a/doc/overview.html +++ b/doc/overview.html @@ -228,5 +228,18 @@ calling <a href="s6-rc-compile.html">s6-rc-compile</a>. The databases to add bundles to them, or delete bundles from them. </p> +<h2> Management of source definition directories <h2> + +<p> + Starting with version 0.6.0.0, s6-rc provides tools to help users +and distributions — typically using a package manager — +organize their source definition directories and their compiled +service databases. This is known as the "repo" subset of the s6-rc +programs, identifiable by their names starting with <tt>s6-rc-repo-</tt> +and <tt>s6-rc-set</tt>. The key concepts behind these programs and +links to their documentation are listed +<a href="repodefs.html">here</a>. +</p> + </body> </html> diff --git a/doc/upgrade.html b/doc/upgrade.html index 5ded408..e77f2d6 100644 --- a/doc/upgrade.html +++ b/doc/upgrade.html @@ -30,7 +30,7 @@ minor and bugfix version changes. <h1> What has changed in s6-rc </h1> -<h2> in 0.5.7.0 </h2> +<h2> in 0.6.0.0 </h2> <ul> <li> <a href="//skarnet.org/software/skalibs/">skalibs</a> diff --git a/package/info b/package/info index 6bbd306..c5c0398 100644 --- a/package/info +++ b/package/info @@ -1,4 +1,4 @@ package=s6-rc -version=0.5.7.0 +version=0.6.0.0 category=admin package_macro_name=S6RC diff --git a/src/include/s6-rc/repo.h b/src/include/s6-rc/repo.h index 7122404..5d0426a 100644 --- a/src/include/s6-rc/repo.h +++ b/src/include/s6-rc/repo.h @@ -21,7 +21,7 @@ extern int s6rc_repo_sv_bcmpr (void const *a, void const *b, void *aux) ; extern char const s6rc_repo_subnames[4][7] ; -extern int s6rc_repo_makestores (char const *, char const *const *, uint16_t) ; +extern int s6rc_repo_makestores (char const *, char const *const *, uint16_t, char *) ; extern int s6rc_repo_fillset (char const *, char const *, char const *const *, uint32_t) ; diff --git a/src/libs6rc/s6rc_livedir_create.c b/src/libs6rc/s6rc_livedir_create.c index 0fa4696..7695dfd 100644 --- a/src/libs6rc/s6rc_livedir_create.c +++ b/src/libs6rc/s6rc_livedir_create.c @@ -18,17 +18,20 @@ int s6rc_livedir_create (stralloc *sa, char const *live, char const *suffix, cha { size_t newlen, ddirlen ; size_t sabase = sa->len ; + mode_t m ; int wasnull = !sa->s ; if (!s6rc_sanitize_dir(sa, live, &ddirlen)) return 0 ; if (!stralloc_cats(sa, ":")) goto err ; if (!stralloc_cats(sa, suffix)) goto err ; if (!stralloc_cats(sa, ":XXXXXX")) goto err ; if (!stralloc_0(sa)) goto err ; - if (!mkdtemp(sa->s + sabase)) goto err ; + m = umask(0) ; + if (!mkdtemp(sa->s + sabase)) { umask(m) ; goto err ; } newlen = sa->len-- ; + if (!stralloc_catb(sa, "/servicedirs", 13)) { umask(m) ; goto delerr ; } /* allocates enough for the next strcpys */ + if (mkdir(sa->s + sabase, 0755) < 0) { umask(m) ; goto delerr ; } + umask(m) ; if (chmod(sa->s + sabase, 0755) < 0) goto delerr ; - if (!stralloc_catb(sa, "/servicedirs", 13)) goto delerr ; /* allocates enough for the next strcpys */ - if (mkdir(sa->s + sabase, 0755) < 0) goto delerr ; strcpy(sa->s + newlen, "compiled") ; if (symlink(compiled, sa->s + sabase) < 0) goto delerr ; strcpy(sa->s + newlen, "scandir") ; diff --git a/src/libs6rc/s6rc_repo_makestores.c b/src/libs6rc/s6rc_repo_makestores.c index 5568ec5..f61f94c 100644 --- a/src/libs6rc/s6rc_repo_makestores.c +++ b/src/libs6rc/s6rc_repo_makestores.c @@ -15,19 +15,17 @@ #include <s6-rc/repo.h> -int s6rc_repo_makestores (char const *repo, char const *const *stores, uint16_t n) +int s6rc_repo_makestores (char const *repo, char const *const *stores, uint16_t n, char *sold) { size_t repolen = strlen(repo) ; mode_t m = umask(0) ; char slink[repolen + 8] ; char sdir[repolen + 21] ; - char sold[repolen + 16] ; memcpy(slink, repo, repolen) ; memcpy(slink + repolen, "/stores", 8) ; memcpy(sdir, slink, repolen + 1) ; memcpy(sdir + repolen + 1, ".stores:XXXXXX", 15) ; - memcpy(sold, slink, repolen + 1) ; if (!mkdtemp(sdir)) { @@ -54,12 +52,11 @@ int s6rc_repo_makestores (char const *repo, char const *const *stores, uint16_t strerr_warnfu2sys("chmod ", sdir) ; goto err ; } - if (!atomic_symlink4(sdir + repolen + 1, slink, sold + repolen + 1, 15)) + if (!atomic_symlink4(sdir + repolen + 1, slink, sold, 15)) { strerr_warnfu4sys("atomically symlink ", sdir + repolen + 1, " to ", slink) ; goto err ; } - rm_rf(sold) ; return 1 ; err: diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c index df462ad..2ec1356 100644 --- a/src/libs6rc/s6rc_repo_sync.c +++ b/src/libs6rc/s6rc_repo_sync.c @@ -9,6 +9,7 @@ #include <errno.h> #include <skalibs/uint16.h> +#include <skalibs/stat.h> #include <skalibs/direntry.h> #include <skalibs/posixplz.h> #include <skalibs/strerr.h> @@ -31,6 +32,7 @@ static inline void cleanup (char const *ato, char const *bun) int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuser) { size_t repolen = strlen(repo) ; + mode_t m ; char store[repolen + 13] ; char ato[repolen + 26] ; char bun[repolen + 26] ; @@ -46,14 +48,17 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse memcpy(ato + repolen, "/sources/..atomics:XXXXXX", 26) ; memcpy(bun, ato, repolen + 26) ; memcpy(bun + repolen + 11, "bundle", 6) ; + m = umask(0) ; if (!mkdtemp(ato)) { strerr_warnfu2sys("mkdtemp ", ato) ; + umask(m) ; return 0 ; } if (chmod(ato, 02755) == -1) { strerr_warnfu2sys("chmod ", ato) ; + umask(m) ; return 0 ; } @@ -61,8 +66,10 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse { strerr_warnfu2sys("mkdtemp ", bun) ; rmdir(ato) ; + umask(m) ; return 0 ; } + umask(m) ; if (chmod(bun, 02755) == -1) { strerr_warnfu2sys("chmod ", bun) ; diff --git a/src/libs6rc/s6rc_repo_syncset_tmp.c b/src/libs6rc/s6rc_repo_syncset_tmp.c index d9bb358..b555bc2 100644 --- a/src/libs6rc/s6rc_repo_syncset_tmp.c +++ b/src/libs6rc/s6rc_repo_syncset_tmp.c @@ -1,7 +1,5 @@ /* ISC license. */ -#include <skalibs/nonposix.h> /* mkdtemp */ - #include <string.h> #include <stdint.h> #include <unistd.h> diff --git a/src/repo/DESIGN.txt b/src/repo/DESIGN.txt deleted file mode 100644 index 990e573..0000000 --- a/src/repo/DESIGN.txt +++ /dev/null @@ -1,12 +0,0 @@ - -/var/lib/s6-rc/repository: base - -compiled/$name-$stamp -compiled/$name-current -> -compiled/$name-previous -> - -sources/.everything -sources/$name -> sources/.$name:XXXXXX -sources/$name/active -sources/$name/masked -sources/$name/onboot diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c index b105200..335d83f 100644 --- a/src/repo/s6-rc-repo-init.c +++ b/src/repo/s6-rc-repo-init.c @@ -18,6 +18,7 @@ #include <skalibs/strerr.h> #include <skalibs/djbunix.h> #include <skalibs/random.h> +#include <skalibs/unix-transactional.h> #include <s6-rc/config.h> #include <s6-rc/s6rc.h> @@ -180,13 +181,29 @@ int main (int argc, char const *const *argv) if (lockfd == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ; - if (!s6rc_repo_makestores(wgola[GOLA_REPODIR], argv, argc)) _exit(111) ; + char sold[repolen + 16] ; + memcpy(sold, wgola[GOLA_REPODIR], repolen) ; + sold[repolen] = '/' ; + + if (!s6rc_repo_makestores(wgola[GOLA_REPODIR], argv, argc, sold + repolen + 1)) _exit(111) ; if (!(wgolb & GOLB_BARE)) { if (!s6rc_repo_sync(wgola[GOLA_REPODIR], verbosity, wgola[GOLA_FDHUSER])) + { + char stores[repolen + 8] ; + char snew[repolen + 16] ; + memcpy(stores, wgola[GOLA_REPODIR], repolen) ; + memcpy(stores + repolen, "/stores", 8) ; + memcpy(snew, wgola[GOLA_REPODIR], repolen) ; + snew[repolen] = '/' ; + if (!atomic_symlink4(sold + repolen + 1, stores, snew + repolen + 1, 15)) + strerr_diefu7sys(111, "atomically switch back stores at ", wgola[GOLA_REPODIR], " - old store is ", sold + repolen + 1, " and new (invalid) store is ", snew + repolen + 1, " - reported error was") ; + rm_rf(snew) ; _exit(111) ; + } } + rm_rf(sold) ; _exit(0) ; } |
