aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs6rc')
-rw-r--r--src/libs6rc/deps-lib/s6rc1
-rw-r--r--src/libs6rc/s6rc_repo_makestores.c68
-rw-r--r--src/libs6rc/s6rc_repo_sync.c18
3 files changed, 78 insertions, 9 deletions
diff --git a/src/libs6rc/deps-lib/s6rc b/src/libs6rc/deps-lib/s6rc
index 87feaee..d847297 100644
--- a/src/libs6rc/deps-lib/s6rc
+++ b/src/libs6rc/deps-lib/s6rc
@@ -30,6 +30,7 @@ s6rc_repo_listsub.o
s6rc_repo_lock.o
s6rc_repo_makedefbundle.o
s6rc_repo_makesetbundles.o
+s6rc_repo_makestores.o
s6rc_repo_makesvlist.o
s6rc_repo_makesvlist_byname.o
s6rc_repo_moveservices.o
diff --git a/src/libs6rc/s6rc_repo_makestores.c b/src/libs6rc/s6rc_repo_makestores.c
new file mode 100644
index 0000000..5568ec5
--- /dev/null
+++ b/src/libs6rc/s6rc_repo_makestores.c
@@ -0,0 +1,68 @@
+/* ISC license. */
+
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <skalibs/uint16.h>
+#include <skalibs/posixplz.h>
+#include <skalibs/stat.h>
+#include <skalibs/strerr.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/unix-transactional.h>
+
+#include <s6-rc/repo.h>
+
+int s6rc_repo_makestores (char const *repo, char const *const *stores, uint16_t n)
+{
+ 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))
+ {
+ umask(m) ;
+ strerr_warnfu2sys("mkdtemp ", sdir) ;
+ return 0 ;
+ }
+ umask(m) ;
+ sdir[repolen + 15] = '/' ;
+ sdir[repolen + 20] = 0 ;
+ for (uint16_t i = 0 ; i < n ; i++)
+ {
+ uint160_xfmt(sdir + repolen + 16, i, 4) ;
+ if (symlink(stores[i], sdir) == -1)
+ {
+ strerr_warnfu4sys("symlink ", stores[i], " to ", sdir) ;
+ sdir[repolen + 15] = 0 ;
+ goto err ;
+ }
+ }
+ sdir[repolen + 15] = 0 ;
+ if (chmod(sdir, 02755) == -1)
+ {
+ strerr_warnfu2sys("chmod ", sdir) ;
+ goto err ;
+ }
+ if (!atomic_symlink4(sdir + repolen + 1, slink, sold + repolen + 1, 15))
+ {
+ strerr_warnfu4sys("atomically symlink ", sdir + repolen + 1, " to ", slink) ;
+ goto err ;
+ }
+ rm_rf(sold) ;
+ return 1 ;
+
+ err:
+ rm_rf(sdir) ;
+ return 0 ;
+}
diff --git a/src/libs6rc/s6rc_repo_sync.c b/src/libs6rc/s6rc_repo_sync.c
index 8e5956b..df462ad 100644
--- a/src/libs6rc/s6rc_repo_sync.c
+++ b/src/libs6rc/s6rc_repo_sync.c
@@ -8,7 +8,7 @@
#include <stdlib.h>
#include <errno.h>
-#include <skalibs/uint32.h>
+#include <skalibs/uint16.h>
#include <skalibs/direntry.h>
#include <skalibs/posixplz.h>
#include <skalibs/strerr.h>
@@ -31,13 +31,13 @@ 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) ;
- char store[repolen + 17] ;
+ char store[repolen + 13] ;
char ato[repolen + 26] ;
char bun[repolen + 26] ;
memcpy(store, repo, repolen) ;
memcpy(store + repolen, "/stores/", 8) ;
- store[repolen + 16] = 0 ;
+ store[repolen + 12] = 0 ;
/* Fill new .atomics/ and .bundles/ with symlinks to real stores */
@@ -69,10 +69,10 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse
return 0 ;
}
- for (uint32_t istore = 0 ;; istore++)
+ for (uint16_t istore = 0 ;; istore++)
{
DIR *dir ;
- uint320_xfmt(store + repolen + 8, istore, 8) ;
+ uint160_xfmt(store + repolen + 8, istore, 4) ;
dir = opendir(store) ;
if (!dir)
{
@@ -92,11 +92,11 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse
{
char const *x ;
char dst[repolen + 28 + len] ;
- char src[26 + len] ;
+ char src[22 + len] ;
memcpy(src, "../../../stores/", 16) ;
- memcpy(src + 16, store + repolen + 8, 8) ;
- src[24] = '/' ;
- memcpy(src + 25, d->d_name, len+1) ;
+ memcpy(src + 16, store + repolen + 8, 4) ;
+ src[20] = '/' ;
+ memcpy(src + 21, d->d_name, len+1) ;
switch (s6rc_type_check(-1, src))
{
case 1 :