about summary refs log tree commit diff
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) ;