diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/repo/s6-rc-repo-init.c | 34 | ||||
| -rw-r--r-- | src/repo/s6-rc-repo-sync.c | 6 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-change.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-commit.c | 3 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-copy.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-delete.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-install.c | 2 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-new.c | 3 | ||||
| -rw-r--r-- | src/repo/s6-rc-set-status.c | 4 | ||||
| -rw-r--r-- | src/repo/s6rc_repo_sync.c | 41 |
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) ; + } } |
