aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/repo/s6rc_repo_compile.c11
-rw-r--r--src/repo/s6rc_repo_setuptodate.c34
2 files changed, 40 insertions, 5 deletions
diff --git a/src/repo/s6rc_repo_compile.c b/src/repo/s6rc_repo_compile.c
index bfb7639..f89a65a 100644
--- a/src/repo/s6rc_repo_compile.c
+++ b/src/repo/s6rc_repo_compile.c
@@ -22,7 +22,7 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *rxs
size_t setlen = strlen(set) ;
size_t totrxlen = 0 ;
int needprefix = strcmp(set, ".ref") ;
- char snap[repolen + setlen + 37] ;
+ char snap[setlen + 44] ;
char newc[repolen + setlen + 45] ;
memcpy(newc, repo, repolen) ;
memcpy(newc + repolen, "/compiled/.", 11) ;
@@ -99,18 +99,19 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *rxs
if (needprefix)
{
int e ;
- memcpy(snap, ".snapshot:", 10) ;
- memcpy(snap + 10, newc + repolen + 11, setlen + 26) ;
- snap[repolen + setlen + 36] = 0 ;
+ memcpy(snap, ".snapshot", 9) ;
+ memcpy(snap + 9, newc + repolen + 10, setlen + 35) ;
e = s6rc_repo_setcopy(repo, set, snap, 1) ;
switch (e)
{
case -2 :
strerr_warnf("internal layout error while taking a snapshot of set ", set) ;
+ rm_rf(newc) ;
return (errno = EILSEQ, -1) ;
case 0 : break ;
default :
strerr_warnfusys("take a snapshot of set ", set) ;
+ rm_rf(newc) ;
return (errno = e, -1) ;
}
}
@@ -123,7 +124,7 @@ int s6rc_repo_compile (char const *repo, char const *set, char const *const *rxs
{
int e = errno ;
rm_rf(newc) ;
- s6rc_repo_setdelete(repo, snap) ;
+ if (needprefix) s6rc_repo_setdelete(repo, snap) ;
errno = e ;
strerr_warnfu4sys("atomically symlink ", newc + repolen + 10, " to ", fn) ;
return -1 ;
diff --git a/src/repo/s6rc_repo_setuptodate.c b/src/repo/s6rc_repo_setuptodate.c
index f01143f..cfc6731 100644
--- a/src/repo/s6rc_repo_setuptodate.c
+++ b/src/repo/s6rc_repo_setuptodate.c
@@ -6,6 +6,7 @@
#include <string.h>
#include <stdint.h>
#include <errno.h>
+#include <unistd.h>
#include <skalibs/stat.h>
#include <skalibs/strerr.h>
@@ -34,12 +35,43 @@ int s6rc_repo_setuptodate (char const *repo, char const *set)
strerr_warnfusys("stat ", srcfn) ;
return -1 ;
}
+
+ /* Do we have a compiled db for this set? */
if (stat(dstfn, &stcompiled) == -1)
{
if (errno == ENOENT) return 0 ;
strerr_warnfusys("stat ", dstfn) ;
return -1 ;
}
+
+ /* Do we have a snapshot of the source set for the compiled db? */
+ {
+ struct stat stsnap ;
+ char snap[repolen + 54 + setlen] ;
+ ssize_t r ;
+ memcpy(snap, srcfn, repolen + 9) ;
+ memcpy(snap + repolen + 9, ".snapshot", 9) ;
+ r = readlink(dstfn, snap + repolen + 18, setlen + 35) ;
+ if (r == -1)
+ {
+ strerr_warnfusys("readlink ", dstfn) ;
+ return -1 ;
+ }
+ if (r != setlen + 34)
+ {
+ strerr_warnf("invalid symlink: ", dstfn) ;
+ return -1 ;
+ }
+ snap[repolen + setlen + 53] = 0 ;
+ if (stat(snap, &stsnap) == -1)
+ {
+ if (errno == ENOENT) return 0 ;
+ strerr_warnfusys("stat ", snap) ;
+ return -1 ;
+ }
+ }
+
+ /* Has the compiled db been built with the latest major s6-rc version? */
{
uint32_t version = s6rc_repo_read_major(dstfn) ;
if (!version)
@@ -49,6 +81,8 @@ int s6rc_repo_setuptodate (char const *repo, char const *set)
}
if (version < s6rc_get_major(S6RC_VERSION)) return 0 ;
}
+
+ /* Is the compiled db more recent than the source set? */
return
stsource.st_mtim.tv_sec < stcompiled.st_mtim.tv_sec ? 1 :
stsource.st_mtim.tv_sec > stcompiled.st_mtim.tv_sec ? 0 :