diff options
Diffstat (limited to 'app-arch')
-rw-r--r-- | app-arch/tarsync/files/tarsync-0.2.1-symlink.patch | 139 | ||||
-rw-r--r-- | app-arch/tarsync/tarsync-0.2.1-r2.ebuild | 34 |
2 files changed, 173 insertions, 0 deletions
diff --git a/app-arch/tarsync/files/tarsync-0.2.1-symlink.patch b/app-arch/tarsync/files/tarsync-0.2.1-symlink.patch new file mode 100644 index 000000000000..cb0efd01b1ba --- /dev/null +++ b/app-arch/tarsync/files/tarsync-0.2.1-symlink.patch @@ -0,0 +1,139 @@ +From 6654d41a14da2fc521e889f01669f0dbb89aef15 Mon Sep 17 00:00:00 2001 +From: Zac Medico <zmedico@gentoo.org> +Date: Tue, 5 Oct 2021 23:21:53 -0700 +Subject: [PATCH] Symlink support + +Bug: https://bugs.gentoo.org/815823 +Signed-off-by: Zac Medico <zmedico@gentoo.org> +--- + main.c | 37 +++++++++++++++++++++++++++++++++++-- + tar.c | 16 ++++++++++++++-- + tar.h | 2 ++ + 3 files changed, 51 insertions(+), 4 deletions(-) + +diff --git a/main.c b/main.c +index 2c2da3e..448a9d0 100644 +--- a/main.c ++++ b/main.c +@@ -257,7 +257,14 @@ main(int argc, char **argv) + // no need to seek. cfile handles resetting streams as needed + + for(x=0; x < missing_count; x++) { +- if(copy_whole_file(&tar_cfh, missing[x]) != 0) { ++ if (missing[x]->type == SYMTYPE) { ++ if(copy_symlink(&tar_cfh, missing[x]) != 0) { ++ v0printf("failed transfering symlink %s\n", missing[x]->fullname); ++ exit(9); ++ } ++ continue; ++ } ++ else if(copy_whole_file(&tar_cfh, missing[x]) != 0) { + v0printf("failed transfering file %s\n", missing[x]->fullname); + exit(9); + } +@@ -673,6 +680,8 @@ int + check_existing_node(const struct dirent *de, const tar_entry *t, struct stat *st) + { + int type; ++ unsigned char linkname[TAR_LINKNAME_LEN]; ++ ssize_t linkname_len; + type = convert_lstat_type_tar_type(de->d_name, st); + if(type < 0) + return -1; +@@ -682,6 +691,15 @@ check_existing_node(const struct dirent *de, const tar_entry *t, struct stat *st + return 2; + if(REGTYPE == type && (st->st_size != t->size || (check_mtime && t->mtime != st->st_mtime))) + return 3; ++ if (SYMTYPE == type) { ++ if ((linkname_len = readlink(de->d_name, linkname, TAR_LINKNAME_LEN)) == -1) { ++ return -1; ++ } ++ if(strncmp((const char *)linkname, (const char *)t->linkname, linkname_len) != 0) { ++ remove_node(de->d_name, st); ++ return 3; ++ } ++ } + return 0; + } + +@@ -703,7 +721,22 @@ enforce_owner(const char *path, const tar_entry *t, struct stat *st) + } + return 0; + } +- ++ ++int ++copy_symlink(cfile *tar_cfh, const tar_entry *ttent) ++{ ++ v1printf("creating %s\n", ttent->fullname); ++ ++ if (symlink(ttent->linkname, ttent->fullname) != 0) { ++ v0printf("failed creating symlink %s -> %s\n", ttent->fullname, ttent->linkname); ++ return -1; ++ } ++ if(lchown(ttent->fullname, ttent->uid, ttent->gid) != 0) { ++ v0printf("failed chown'ing %s\n", ttent->fullname); ++ return -1; ++ } ++ return 0; ++} + + int + copy_whole_file(cfile *tar_cfh, const tar_entry *ttent) +diff --git a/tar.c b/tar.c +index 42dc8e7..514e5fb 100644 +--- a/tar.c ++++ b/tar.c +@@ -214,8 +214,7 @@ read_entry(cfile *src_cfh, off_u64 start, tar_entry *entry) + case AREGTYPE: + entry->type = REGTYPE; break; + case SYMTYPE: +- v0printf("symlinks not supported\n"); +- entry->type = TTAR_UNSUPPORTED_TYPE; break; ++ entry->type = SYMTYPE; break; + case LNKTYPE: + v0printf("hardlinks not supported!\n"); + entry->type = TTAR_UNSUPPORTED_TYPE; break; +@@ -242,6 +241,17 @@ read_entry(cfile *src_cfh, off_u64 start, tar_entry *entry) + if(get_uid(block + TAR_UNAME_LOC, &entry->uid)) + entry->uid = octal_str2long(block + TAR_UID_LOC, TAR_UID_LOC); + ++ if (entry->type == SYMTYPE) { ++ name_len = strnlen((char *)block + TAR_LINKNAME_LOC, TAR_LINKNAME_LEN); ++ if((entry->linkname = (char *)malloc(name_len + 1)) == NULL){ ++ v0printf("unable to allocate needed memory, bailing\n"); ++ return MEM_ERROR; ++ } ++ memcpy(entry->linkname, block + TAR_LINKNAME_LOC, name_len); ++ entry->linkname[name_len] = '\0'; ++ entry->linkname_len = name_len; ++ } ++ + // if(entry->end % 512) + // entry->end += 512 - (entry->end % 512); + return 0; +@@ -256,6 +266,8 @@ convert_lstat_type_tar_type(const char *path, struct stat *st) + if(S_ISREG(st->st_mode)) { + if(st->st_nlink == 1) + return REGTYPE; ++ } else if(S_ISLNK(st->st_mode)) { ++ return SYMTYPE; + } else if(S_ISDIR(st->st_mode)) + return DIRTYPE; + +diff --git a/tar.h b/tar.h +index e9d9ee9..95f957c 100644 +--- a/tar.h ++++ b/tar.h +@@ -78,6 +78,8 @@ typedef struct { + off_u64 size; + unsigned int fullname_len; + char *fullname; ++ unsigned int linkname_len; ++ char *linkname; + time_t mtime; + uid_t uid; + gid_t gid; +-- +2.32.0 + diff --git a/app-arch/tarsync/tarsync-0.2.1-r2.ebuild b/app-arch/tarsync/tarsync-0.2.1-r2.ebuild new file mode 100644 index 000000000000..295c7e7cbef1 --- /dev/null +++ b/app-arch/tarsync/tarsync-0.2.1-r2.ebuild @@ -0,0 +1,34 @@ +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +inherit toolchain-funcs + +DESCRIPTION="Delta compression suite for using/generating binary patches" +HOMEPAGE="https://wiki.gentoo.org/wiki/No_homepage" +SRC_URI="mirror://gentoo/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~hppa ~ppc ~x86 ~amd64-linux" + +DEPEND=">=dev-util/diffball-0.7" +RDEPEND="${DEPEND}" + +S="${WORKDIR}/${PN}" + +PATCHES=( + "${FILESDIR}"/${P}-make.patch + "${FILESDIR}"/${P}-gcc5.patch + "${FILESDIR}"/${P}-symlink.patch +) + +src_configure() { + tc-export CC +} + +src_install() { + dobin tarsync #make install doesn't support prefix + einstalldocs +} |