aboutsummaryrefslogtreecommitdiffstats
path: root/src/repo/s6rc_repo_makesetbundles.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/repo/s6rc_repo_makesetbundles.c')
-rw-r--r--src/repo/s6rc_repo_makesetbundles.c116
1 files changed, 55 insertions, 61 deletions
diff --git a/src/repo/s6rc_repo_makesetbundles.c b/src/repo/s6rc_repo_makesetbundles.c
index 64e269c..5053ac5 100644
--- a/src/repo/s6rc_repo_makesetbundles.c
+++ b/src/repo/s6rc_repo_makesetbundles.c
@@ -17,6 +17,24 @@
#include <s6-rc/repo.h>
+static int dosymlink (char const *dst, size_t dstlen, char const *name)
+{
+ size_t len = strlen(name) ;
+ char target[16 + len] ;
+ char fn[dstlen + len + 2] ;
+ memcpy(target, "../../.bundles/", 15) ;
+ memcpy(target + 15, name, len+1) ;
+ memcpy(fn, dst, dstlen) ;
+ fn[dstlen] = '/' ;
+ memcpy(fn + dstlen + 1, name, len+1) ;
+ if (symlink(target, fn) == -1)
+ {
+ strerr_warnfu4sys("symlink ", target, " to ", fn) ;
+ return 0 ;
+ }
+ return 1 ;
+}
+
int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int verbosity)
{
size_t repolen = strlen(repo) ;
@@ -32,17 +50,29 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
memcpy(dst + repolen + 9 + setlen, "/bundle", 8) ;
memcpy(src, dst, repolen + 9) ;
memcpy(src + repolen + 9, ".bundles", 9) ;
- rm_rf_tmp(dst, &sa) ;
+ rm_rf(dst) ;
+ if (mkdir(dst, 02755) == -1)
+ {
+ strerr_warnfu2sys("mkdir ", dst) ;
+ return 0 ;
+ }
n = s6rc_repo_listsub(repo, set, s6rc_repo_subnames[0], &sa, &ga) ;
if (n < 0)
{
- strerr_warnfu6sys("list sub ", s6rc_repo_subnames[0], " of set ", set, " in repository ", repo) ;
+ strerr_warnfu6sys("list sub ", s6rc_repo_subnames[0], " of set ", set, " in repository ", repo) ;
+ goto err ;
+ }
+
+ DIR *dir = opendir(src) ;
+ if (!dir)
+ {
+ strerr_warnfu2sys("opendir ", src) ;
goto err ;
}
+
if (n)
{
- DIR *dir ;
char const *masked[n] ;
char maskedstorage[sa.len] ;
memcpy(maskedstorage, sa.s, sa.len) ;
@@ -51,20 +81,10 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
genalloc_setlen(size_t, &ga, 0) ;
qsort(masked, n, sizeof(char const *), &str_cmp) ;
- if (mkdir(dst, 02755) == -1)
- {
- strerr_warnfu2sys("mkdir ", dst) ;
- goto errga ;
- }
- dir = opendir(src) ;
- if (!dir)
- {
- strerr_warnfu2sys("opendir ", src) ;
- goto err0 ;
- }
for (;;)
{
- int e, i = 0 ;
+ int e ;
+ unsigned int i = 0 ;
direntry *d ;
errno = 0 ;
d = readdir(dir) ;
@@ -74,11 +94,7 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
sa.len = 0 ;
genalloc_setlen(size_t, &ga, 0) ;
e = s6rc_repo_listcontents(repo, d->d_name, &sa, &ga) ;
- if (e)
- {
- dir_close(dir) ;
- goto err0 ;
- }
+ if (e) goto err0 ;
for (; i < genalloc_len(size_t, &ga) ; i++)
{
@@ -91,64 +107,42 @@ int s6rc_repo_makesetbundles (char const *repo, char const *set, unsigned int ve
}
}
if (i < genalloc_len(size_t, &ga)) continue ;
-
- size_t len = strlen(d->d_name) ;
- char target[16 + len] ;
- char fn[repolen + setlen + 18 + len] ;
- memcpy(target, "../../.bundles/", 15) ;
- memcpy(target + 15, d->d_name, len+1) ;
- memcpy(fn, dst, repolen + setlen + 16) ;
- fn[repolen + setlen + 16] = '/' ;
- memcpy(fn + repolen + setlen + 17, d->d_name, len+1) ;
- if (symlink(target, fn) == -1)
- {
- strerr_warnfu4sys("symlink ", target, " to ", fn) ;
- dir_close(dir) ;
- goto err0 ;
- }
- }
- dir_close(dir) ;
- if (errno)
- {
- strerr_warnfu2sys("readdir ", src) ;
- goto err0 ;
+ if (!dosymlink(dst, repolen + setlen + 16, d->d_name)) goto err0 ;
}
}
else
{
- int r ;
- char realsrc[repolen + 28] ;
- memcpy(realsrc, src, repolen + 9) ;
- r = readlink(src, realsrc + repolen + 9, 17) ;
- if (r == -1)
- {
- strerr_warnfu2sys("readlink ", src) ;
- goto err0 ;
- }
- if (r != 16)
- {
- strerr_warnf2x("invalid symlink for ", src) ;
- goto err0 ;
- }
- if (!hiercopy_tmp(realsrc, dst, &sa))
+ for (;;)
{
- strerr_warnfu4sys("recursively copy ", realsrc, " to ", dst) ;
- goto err0 ;
+ direntry *d ;
+ errno = 0 ;
+ d = readdir(dir) ;
+ if (!d) break ;
+ if (d->d_name[0] == '.') continue ;
+ if (!dosymlink(dst, repolen + setlen + 16, d->d_name)) goto err0 ;
}
}
+ if (errno)
+ {
+ strerr_warnfu2sys("readdir ", src) ;
+ goto err0 ;
+ }
+
+ dir_close(dir) ;
+ genalloc_free(size_t, &ga) ;
stralloc_free(&sa) ;
return 1 ;
err0:
+ dir_close(dir) ;
+ err:
{
int e = errno ;
- rm_rf_tmp(dst, &sa) ;
+ rm_rf(dst) ;
errno = e ;
}
- errga:
genalloc_free(size_t, &ga) ;
- err:
stralloc_free(&sa) ;
return 0 ;
}