diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-06-01 03:46:48 +0000 |
---|---|---|
committer | Laurent Bercot <ska@appnovation.com> | 2023-06-01 03:46:48 +0000 |
commit | d0b38944c50dab81755fca50a983a1bddefbfadf (patch) | |
tree | 8bab9da952d45c28e3f6dbed705c0f4c9aa78325 /src/libstddjb/hiercopy_tmp.c | |
parent | 96078d63fcd4acd96983a42abac5ab8604bc80ca (diff) | |
download | skalibs-d0b38944c50dab81755fca50a983a1bddefbfadf.tar.xz |
Refactor to add hiercopy_loose (for s6-l-i)
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libstddjb/hiercopy_tmp.c')
-rw-r--r-- | src/libstddjb/hiercopy_tmp.c | 82 |
1 files changed, 1 insertions, 81 deletions
diff --git a/src/libstddjb/hiercopy_tmp.c b/src/libstddjb/hiercopy_tmp.c index 3e147be..c820f84 100644 --- a/src/libstddjb/hiercopy_tmp.c +++ b/src/libstddjb/hiercopy_tmp.c @@ -1,88 +1,8 @@ /* ISC license. */ -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include <errno.h> -#include <fcntl.h> - -#include <skalibs/stralloc.h> -#include <skalibs/direntry.h> #include <skalibs/djbunix.h> -static int dircopy (char const *src, char const *dst, mode_t mode, stralloc *tmp) -{ - size_t tmpbase = tmp->len ; - size_t maxlen = 0 ; - if (sals(src, tmp, &maxlen) == -1) return 0 ; - - if (mkdir(dst, S_IRWXU) < 0) - { - struct stat st ; - if (errno != EEXIST) goto err ; - if (stat(dst, &st) < 0) goto err ; - if (!S_ISDIR(st.st_mode)) { errno = ENOTDIR ; goto err ; } - } - { - size_t srclen = strlen(src) ; - size_t dstlen = strlen(dst) ; - size_t i = tmpbase ; - char srcbuf[srclen + maxlen + 2] ; - char dstbuf[dstlen + maxlen + 2] ; - memcpy(srcbuf, src, srclen) ; - memcpy(dstbuf, dst, dstlen) ; - srcbuf[srclen] = '/' ; - dstbuf[dstlen] = '/' ; - while (i < tmp->len) - { - size_t n = strlen(tmp->s + i) + 1 ; - memcpy(srcbuf + srclen + 1, tmp->s + i, n) ; - memcpy(dstbuf + dstlen + 1, tmp->s + i, n) ; - i += n ; - hiercopy_tmp(srcbuf, dstbuf, tmp) ; - } - } - if (chmod(dst, mode) < 0) goto err ; - tmp->len = tmpbase ; - return 1 ; -err: - tmp->len = tmpbase ; - return 0 ; -} - int hiercopy_tmp (char const *src, char const *dst, stralloc *tmp) { - struct stat st ; - if (lstat(src, &st) < 0) return 0 ; - if (S_ISREG(st.st_mode)) - { - if (!filecopy_unsafe(src, dst, st.st_mode)) return 0 ; - } - else if (S_ISDIR(st.st_mode)) - { - if (!dircopy(src, dst, st.st_mode, tmp)) return 0 ; - } - else if (S_ISFIFO(st.st_mode)) - { - if (mkfifo(dst, st.st_mode) < 0) return 0 ; - } - else if (S_ISLNK(st.st_mode)) - { - size_t tmpbase = tmp->len ; - if (sareadlink(tmp, src) < 0) return 0 ; - if (!stralloc_0(tmp) || symlink(tmp->s + tmpbase, dst) < 0) - { - tmp->len = tmpbase ; - return 0 ; - } - tmp->len = tmpbase ; - } - else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) || S_ISSOCK(st.st_mode)) - { - if (mknod(dst, st.st_mode, st.st_rdev) < 0) return 0 ; - } - else return (errno = ENOTSUP, 0) ; - lchown(dst, st.st_uid, st.st_gid) ; - if (!S_ISLNK(st.st_mode)) chmod(dst, st.st_mode) ; - return 1 ; + return hiercopy_internal(src, dst, tmp, 0) ; } |