summaryrefslogtreecommitdiff
path: root/src/skaembutils/s6-update-symlinks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/skaembutils/s6-update-symlinks.c')
-rw-r--r--src/skaembutils/s6-update-symlinks.c51
1 files changed, 23 insertions, 28 deletions
diff --git a/src/skaembutils/s6-update-symlinks.c b/src/skaembutils/s6-update-symlinks.c
index 87783de..6b9a145 100644
--- a/src/skaembutils/s6-update-symlinks.c
+++ b/src/skaembutils/s6-update-symlinks.c
@@ -14,38 +14,34 @@
#define USAGE "s6-update-symlinks /destdir /srcdir [ /srcdir ... ]"
-#define MAGICNEW ":s6-update-symlinks-new"
-#define MAGICOLD ":s6-update-symlinks-old"
+#define UPDATESYMLINKS_MAGICNEW ":s6-update-symlinks-new"
+#define UPDATESYMLINKS_MAGICOLD ":s6-update-symlinks-old"
#define CONFLICT -2
#define ERROR -1
#define MODIFIED 0
#define OVERRIDEN 1
-static stralloc errdst = STRALLOC_ZERO ;
-static stralloc errsrc = STRALLOC_ZERO ;
-
-
-typedef struct stralloc3 stralloc3, *stralloc3_ref ;
-struct stralloc3
+typedef struct stralloc5 stralloc5, *stralloc5_ref ;
+struct stralloc5
{
stralloc dst ;
stralloc src ;
stralloc tmp ;
+ stralloc errdst ;
+ stralloc errsrc ;
} ;
-#define STRALLOC3_ZERO { STRALLOC_ZERO, STRALLOC_ZERO, STRALLOC_ZERO }
-
+#define STRALLOC5_ZERO { STRALLOC_ZERO, STRALLOC_ZERO, STRALLOC_ZERO, STRALLOC_ZERO, STRALLOC_ZERO }
-static void cleanup (stralloc *sa, unsigned int pos)
+static void updatesymlinks_cleanup (stralloc *sa, unsigned int pos)
{
int e = errno ;
rm_rf_in_tmp(sa, pos) ;
errno = e ;
}
-
-static int makeuniquename (stralloc *sa, char const *path, char const *magic)
+static int updatesymlinks_makeuniquename (stralloc *sa, char const *path, char const *magic)
{
size_t base = sa->len ;
int wasnull = !sa->s ;
@@ -60,8 +56,7 @@ err:
return 0 ;
}
-
-static int addlink (stralloc3 *blah, unsigned int dstpos, unsigned int srcpos)
+static int updatesymlinks_addlink (stralloc5 *blah, unsigned int dstpos, unsigned int srcpos)
{
if (symlink(blah->src.s + srcpos, blah->dst.s + dstpos) >= 0) return MODIFIED ;
if (errno != EEXIST) return ERROR ;
@@ -189,9 +184,9 @@ static int addlink (stralloc3 *blah, unsigned int dstpos, unsigned int srcpos)
blah->src.len = srcbase ;
blah->dst.len = dstbase ;
if (errno != ENOTDIR) return ERROR ;
- errdst.len = errsrc.len = 0 ;
- if (!stralloc_cats(&errdst, blah->dst.s + dstpos) || !stralloc_0(&errdst)
- || !stralloc_cats(&errsrc, blah->src.s + srcpos) || !stralloc_0(&errsrc))
+ blah->errdst.len = blah->errsrc.len = 0 ;
+ if (!stralloc_cats(&blah->errdst, blah->dst.s + dstpos) || !stralloc_0(&blah->errdst)
+ || !stralloc_cats(&blah->errsrc, blah->src.s + srcpos) || !stralloc_0(&blah->errsrc))
return ERROR ;
return CONFLICT ; /* dst is a dir but src is not */
}
@@ -245,7 +240,7 @@ static int addlink (stralloc3 *blah, unsigned int dstpos, unsigned int srcpos)
}
i += n ;
}
- switch (addlink(blah, dstbase, srcbase))
+ switch (updatesymlinks_addlink(blah, dstbase, srcbase))
{
case ERROR :
blah->tmp.len = tmpbase ;
@@ -281,7 +276,7 @@ static int addlink (stralloc3 *blah, unsigned int dstpos, unsigned int srcpos)
int main (int argc, char *const *argv)
{
- stralloc3 blah = STRALLOC3_ZERO ;
+ stralloc5 blah = STRALLOC5_ZERO ;
PROG = "s6-update-symlinks" ;
if (argc < 3) strerr_dieusage(100, USAGE) ;
{
@@ -293,7 +288,7 @@ int main (int argc, char *const *argv)
while (i && (argv[1][i-1] == '/')) argv[1][--i] = 0 ;
if (!i) strerr_diefu1x(100, "replace root directory") ;
}
- if (!makeuniquename(&blah.dst, argv[1], MAGICNEW))
+ if (!updatesymlinks_makeuniquename(&blah.dst, argv[1], UPDATESYMLINKS_MAGICNEW))
strerr_diefu2sys(111, "make random unique name based on ", argv[1]) ;
if ((unlink(blah.dst.s) == -1) && (errno != ENOENT))
strerr_diefu2sys(111, "unlink ", blah.dst.s) ;
@@ -306,15 +301,15 @@ int main (int argc, char *const *argv)
blah.src.len = 0 ;
if (!stralloc_cats(&blah.src, *p) || !stralloc_0(&blah.src))
strerr_diefu1sys(111, "make stralloc") ;
- r = addlink(&blah, 0, 0) ;
+ r = updatesymlinks_addlink(&blah, 0, 0) ;
if (r < 0)
{
stralloc_free(&blah.tmp) ;
stralloc_free(&blah.src) ;
- cleanup(&blah.dst, 0) ;
+ updatesymlinks_cleanup(&blah.dst, 0) ;
stralloc_free(&blah.dst) ;
if (r == CONFLICT)
- strerr_dief4x(100, "destination ", errdst.s, " conflicts with source ", errsrc.s) ;
+ strerr_dief4x(100, "destination ", blah.errdst.s, " conflicts with source ", blah.errsrc.s) ;
else
strerr_dief2sys(111, "error processing ", *p) ;
}
@@ -325,22 +320,22 @@ int main (int argc, char *const *argv)
if (rename(blah.dst.s, argv[1]) == -1) /* be atomic if possible */
{
blah.src.len = 0 ;
- if (!makeuniquename(&blah.src, argv[1], MAGICOLD))
+ if (!updatesymlinks_makeuniquename(&blah.src, argv[1], UPDATESYMLINKS_MAGICOLD))
{
- cleanup(&blah.dst, 0) ;
+ updatesymlinks_cleanup(&blah.dst, 0) ;
strerr_diefu2sys(111, "make random unique name based on ", argv[1]) ;
}
if (rename(argv[1], blah.src.s) == -1)
{
- cleanup(&blah.dst, 0) ;
+ updatesymlinks_cleanup(&blah.dst, 0) ;
strerr_diefu4sys(111, "rename ", argv[1], " to ", blah.src.s) ;
}
/* XXX: unavoidable race condition here: argv[1] does not exist */
if (rename(blah.dst.s, argv[1]) == -1)
{
rename(blah.src.s, argv[1]) ;
- cleanup(&blah.dst, 0) ;
+ updatesymlinks_cleanup(&blah.dst, 0) ;
strerr_diefu4sys(111, "rename ", blah.dst.s, " to ", argv[1]) ;
}
stralloc_free(&blah.dst) ;