aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-10-05 00:05:59 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-10-05 00:05:59 +0000
commit399184cad0c0dd63a39de775130a2a73d0325913 (patch)
tree978b8c5dc3f494a9627f601bf8728bf6e8324b57
parent92ef99d90574ebd4732c10a0a127945a40271c87 (diff)
downloads6-rc-399184cad0c0dd63a39de775130a2a73d0325913.tar.gz
Do not delete old store before the sync succeeds
-rw-r--r--NEWS6
-rw-r--r--doc/index.html18
-rw-r--r--doc/overview.html13
-rw-r--r--doc/upgrade.html2
-rw-r--r--package/info2
-rw-r--r--src/include/s6-rc/repo.h2
-rw-r--r--src/libs6rc/s6rc_livedir_create.c9
-rw-r--r--src/libs6rc/s6rc_repo_makestores.c7
-rw-r--r--src/libs6rc/s6rc_repo_sync.c7
-rw-r--r--src/libs6rc/s6rc_repo_syncset_tmp.c2
-rw-r--r--src/repo/DESIGN.txt12
-rw-r--r--src/repo/s6-rc-repo-init.c19
12 files changed, 69 insertions, 30 deletions
diff --git a/NEWS b/NEWS
index 71f9578..0ae4acc 100644
--- a/NEWS
+++ b/NEWS
@@ -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&nbsp;? </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 &mdash; typically using a package manager &mdash;
+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) ;
}