aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-12-08 12:04:26 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-12-08 12:04:26 +0000
commit7e6654b43fde098df6f080c6bc57489bfe3c5095 (patch)
treedbc0bcae6b54160853d087ba843a0e60c5e011ca /src/repo
parentc40145fca667f8b0243bbcf276b5aade18f7ae5b (diff)
downloads6-rc-7e6654b43fde098df6f080c6bc57489bfe3c5095.tar.gz
Some bugfixes
Diffstat (limited to 'src/repo')
-rw-r--r--src/repo/s6-rc-repo-init.c34
-rw-r--r--src/repo/s6-rc-repo-sync.c6
-rw-r--r--src/repo/s6-rc-set-change.c2
-rw-r--r--src/repo/s6-rc-set-commit.c3
-rw-r--r--src/repo/s6-rc-set-copy.c2
-rw-r--r--src/repo/s6-rc-set-delete.c2
-rw-r--r--src/repo/s6-rc-set-install.c2
-rw-r--r--src/repo/s6-rc-set-new.c3
-rw-r--r--src/repo/s6-rc-set-status.c4
-rw-r--r--src/repo/s6rc_repo_sync.c41
10 files changed, 61 insertions, 38 deletions
diff --git a/src/repo/s6-rc-repo-init.c b/src/repo/s6-rc-repo-init.c
index c18b7a3..6c8a7fa 100644
--- a/src/repo/s6-rc-repo-init.c
+++ b/src/repo/s6-rc-repo-init.c
@@ -16,6 +16,7 @@
#include <skalibs/gol.h>
#include <skalibs/prog.h>
#include <skalibs/strerr.h>
+#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <skalibs/random.h>
#include <skalibs/unix-transactional.h>
@@ -88,6 +89,7 @@ int main (int argc, char const *const *argv)
strerr_dief1x(100, "stores cannot contain newlines in their path") ;
}
repolen = strlen(wgola[GOLA_REPODIR]) ;
+ tain_now_g() ;
if (!(wgolb & GOLB_UPDATE))
{
@@ -128,14 +130,6 @@ 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) ;
-
memcpy(tmp + repolen + 12, "lock", 5) ;
if (!openwritenclose_unsafe5(tmp, "", 0, 0, 0))
{
@@ -175,6 +169,7 @@ int main (int argc, char const *const *argv)
}
}
}
+ umask(m) ;
}
lockfd = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
@@ -192,19 +187,22 @@ int main (int argc, char const *const *argv)
int r = s6rc_repo_sync(wgola[GOLA_REPODIR], verbosity, wgola[GOLA_FDHUSER]) ;
if (r <= 0)
{
- 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) ;
+ if (sold[repolen+1])
+ {
+ 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(r ? 111 : 1) ;
}
}
- rm_rf(sold) ;
+ if (sold[repolen+1]) rm_rf(sold) ;
_exit(0) ;
}
diff --git a/src/repo/s6-rc-repo-sync.c b/src/repo/s6-rc-repo-sync.c
index 282f181..ba57d49 100644
--- a/src/repo/s6-rc-repo-sync.c
+++ b/src/repo/s6-rc-repo-sync.c
@@ -2,9 +2,8 @@
#include <unistd.h>
-#include <skalibs/gol.h>
-#include <skalibs/prog.h>
-#include <skalibs/strerr.h>
+#include <skalibs/envexec.h>
+#include <skalibs/tai.h>
#include <s6-rc/config.h>
#include <s6-rc/s6rc.h>
@@ -42,6 +41,7 @@ int main (int argc, char const *const *argv)
if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &verbosity))
strerr_dief1x(100, "verbosity needs to be an unsigned integer") ;
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
diff --git a/src/repo/s6-rc-set-change.c b/src/repo/s6-rc-set-change.c
index c678357..5d5bd80 100644
--- a/src/repo/s6-rc-set-change.c
+++ b/src/repo/s6-rc-set-change.c
@@ -12,6 +12,7 @@
#include <skalibs/gol.h>
#include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
+#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <s6-rc/config.h>
@@ -137,6 +138,7 @@ int main (int argc, char const *const *argv)
strerr_dief2x(100, "service names cannot ", "contain / or newlines") ;
}
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
if (!s6rc_repo_makesvlist_byname(wgola[GOLA_REPODIR], argv[0], &storage, &svlist)) _exit(111) ;
diff --git a/src/repo/s6-rc-set-commit.c b/src/repo/s6-rc-set-commit.c
index 7612506..c4c7967 100644
--- a/src/repo/s6-rc-set-commit.c
+++ b/src/repo/s6-rc-set-commit.c
@@ -14,6 +14,7 @@
#include <skalibs/gol.h>
#include <skalibs/stralloc.h>
#include <skalibs/genalloc.h>
+#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <s6-rc/config.h>
@@ -71,7 +72,7 @@ int main (int argc, char const *const *argv)
if (!argc) dieusage() ;
if (strchr(argv[0], '/') || strchr(argv[0], '\n'))
strerr_dief1x(100, "set names cannot contain / or newlines") ;
-
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
r = s6rc_repo_checkset(wgola[GOLA_REPODIR], argv[0]) ;
diff --git a/src/repo/s6-rc-set-copy.c b/src/repo/s6-rc-set-copy.c
index 21b9cda..637093d 100644
--- a/src/repo/s6-rc-set-copy.c
+++ b/src/repo/s6-rc-set-copy.c
@@ -9,6 +9,7 @@
#include <skalibs/prog.h>
#include <skalibs/strerr.h>
#include <skalibs/gol.h>
+#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <skalibs/unix-transactional.h>
@@ -122,6 +123,7 @@ int main (int argc, char const *const *argv)
if (strchr(argv[i], '/') || strchr(argv[i], '\n'))
strerr_dief1x(100, "set names cannot contain / or newlines") ;
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
docopy(wgola[GOLA_REPODIR], argv[0], argv[1]) ;
diff --git a/src/repo/s6-rc-set-delete.c b/src/repo/s6-rc-set-delete.c
index 24459f5..0b63e4a 100644
--- a/src/repo/s6-rc-set-delete.c
+++ b/src/repo/s6-rc-set-delete.c
@@ -9,6 +9,7 @@
#include <skalibs/strerr.h>
#include <skalibs/gol.h>
#include <skalibs/direntry.h>
+#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <s6-rc/config.h>
@@ -107,6 +108,7 @@ int main (int argc, char const *const *argv)
strerr_dief2x(100, "set names cannot ", "contain / or newlines") ;
}
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
diff --git a/src/repo/s6-rc-set-install.c b/src/repo/s6-rc-set-install.c
index 22f46b4..e4f754f 100644
--- a/src/repo/s6-rc-set-install.c
+++ b/src/repo/s6-rc-set-install.c
@@ -18,6 +18,7 @@
#include <skalibs/gol.h>
#include <skalibs/stralloc.h>
#include <skalibs/djbunix.h>
+#include <skalibs/tai.h>
#include <skalibs/cspawn.h>
#include <skalibs/unix-transactional.h>
@@ -81,6 +82,7 @@ int main (int argc, char const *const *argv)
if (strchr(argv[0], '/') || strchr(argv[0], '\n'))
strerr_dief1x(100, "set names cannot contain / or newlines") ;
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 0) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
r = s6rc_repo_checkset(wgola[GOLA_REPODIR], argv[0]) ;
diff --git a/src/repo/s6-rc-set-new.c b/src/repo/s6-rc-set-new.c
index e81bee3..ba41a19 100644
--- a/src/repo/s6-rc-set-new.c
+++ b/src/repo/s6-rc-set-new.c
@@ -15,6 +15,7 @@
#include <skalibs/prog.h>
#include <skalibs/strerr.h>
#include <skalibs/direntry.h>
+#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
#include <s6-rc/config.h>
@@ -122,6 +123,8 @@ int main (int argc, char const *const *argv)
if (strchr(argv[i], '/') || strchr(argv[i], '\n'))
strerr_dief2x(100, "set names cannot ", "contain / or newlines") ;
}
+
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
diff --git a/src/repo/s6-rc-set-status.c b/src/repo/s6-rc-set-status.c
index b58811b..7c07e9d 100644
--- a/src/repo/s6-rc-set-status.c
+++ b/src/repo/s6-rc-set-status.c
@@ -11,6 +11,7 @@
#include <skalibs/bytestr.h>
#include <skalibs/direntry.h>
#include <skalibs/buffer.h>
+#include <skalibs/tai.h>
#include <s6-rc/config.h>
#include <s6-rc/repo.h>
@@ -72,6 +73,7 @@ int main (int argc, char const **argv)
strerr_dief2x(100, "service", " names cannot contain / or newlines") ;
}
+ tain_now_g() ;
fdlock = s6rc_repo_lock(wgola[GOLA_REPODIR], 1) ;
if (fdlock == -1) strerr_diefu2sys(111, "lock ", wgola[GOLA_REPODIR]) ;
@@ -113,6 +115,6 @@ int main (int argc, char const **argv)
if (errno) strerr_diefu2sys(111, "readdir ", fn) ;
dir_close(dir) ;
}
- if (!buffer_flush(buffer_1)) strerr_diefu1sys(111, "write to stdout") ;
+ if (!buffer_flush(buffer_1)) dieout() ;
_exit(0) ;
}
diff --git a/src/repo/s6rc_repo_sync.c b/src/repo/s6rc_repo_sync.c
index 6a17876..aecbd7c 100644
--- a/src/repo/s6rc_repo_sync.c
+++ b/src/repo/s6rc_repo_sync.c
@@ -97,29 +97,33 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse
len = strlen(d->d_name) ;
{
char const *x ;
- char dst[repolen + 28 + len] ;
- char src[22 + len] ;
- memcpy(src, "../../../stores/", 16) ;
- memcpy(src + 16, store + repolen + 8, 4) ;
- src[20] = '/' ;
- memcpy(src + 21, d->d_name, len+1) ;
- switch (s6rc_repo_type_check(src))
+ char dst[repolen + 27 + len] ;
+ char src[19 + len] ;
+ char fn[repolen + 14 + len] ;
+ memcpy(src, "../../stores/", 13) ;
+ memcpy(src + 13, store + repolen + 8, 4) ;
+ src[17] = '/' ;
+ memcpy(src + 18, d->d_name, len+1) ;
+ memcpy(fn, store, repolen + 12) ;
+ fn[repolen + 12] = '/' ;
+ memcpy(fn + repolen + 13, d->d_name, len+1) ;
+ switch (s6rc_repo_type_check(fn))
{
case 1 :
case 2 : x = ato ; break ;
case 3 : x = bun ; break ;
case 0 :
- strerr_warnf2x("invalid service type for ", src) ;
+ strerr_warnf2x("invalid service type for ", fn) ;
dir_close(dir) ;
goto err ;
default :
- strerr_warnfu2sys("check service type of ", src) ;
+ strerr_warnfu2sys("check service type of ", fn) ;
dir_close(dir) ;
goto err ;
}
- memcpy(dst, x, repolen + 26) ;
- dst[repolen + 26] = '/' ;
- memcpy(dst + repolen + 27, d->d_name, len+1) ;
+ memcpy(dst, x, repolen + 25) ;
+ dst[repolen + 25] = '/' ;
+ memcpy(dst + repolen + 26, d->d_name, len+1) ;
if (symlink(src, dst) == -1)
{
if (errno != EEXIST)
@@ -185,9 +189,16 @@ int s6rc_repo_sync (char const *repo, unsigned int verbosity, char const *fdhuse
}
goto err ;
}
- memcpy(ato + repolen + 9, oldato, 16) ;
- memcpy(bun + repolen + 9, oldbun, 16) ;
- cleanup(ato, bun) ;
+ if (oldato[0])
+ {
+ memcpy(ato + repolen + 9, oldato, 16) ;
+ rm_rf(ato) ;
+ }
+ if (oldbun[0])
+ {
+ memcpy(bun + repolen + 9, oldbun, 16) ;
+ rm_rf(bun) ;
+ }
}