From 939a50bf2fec9463fb721fa9188f98e991dfddc9 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 30 Mar 2016 13:14:42 +0200 Subject: [PATCH] fullfiles.c: work around pseudo bug Hard-linking the actual file looses the xattrs due to a pseudo bug. We work around that here by explicitly copying the xattrs. Upstream-Status: Inappropriate [workaround] Signed-off-by: Patrick Ohly --- src/fullfiles.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/fullfiles.c b/src/fullfiles.c index fa78293..949d8f0 100644 --- a/src/fullfiles.c +++ b/src/fullfiles.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -144,6 +145,35 @@ static void create_fullfile(struct file *file) } } + /* step 1a: work around pseudo bug https://bugzilla.yoctoproject.org/show_bug.cgi?id=9317: + pseudo fails to share xattrs between files sharing the same inode. We have to copy + all xattrs explicitly. */ + { + /* Intentionally simplistic code with static buffer sizes. + Pseudo bug fix is scheduled for the near future. */ + char list[1024]; + char *name; + ssize_t listsize; + listsize = llistxattr(origin, list, sizeof(list)); + if (listsize < 0) { + fprintf(stderr, "Copying xattrs: llistxattr(%s): %s\n", origin, strerror(errno)); + assert(0); + } + for (name = list; name < list + listsize; name += strlen(name) + 1) { + char value[2048]; + ssize_t valuesize; + valuesize = lgetxattr(origin, name, value, sizeof(value)); + if (valuesize < 0) { + fprintf(stderr, "Copying xattrs: lgetxattr(%s): %s\n", origin, strerror(errno)); + assert(0); + } + if (lsetxattr(tempfile, name, value, valuesize, 0)) { + fprintf(stderr, "Copying xattrs: lsetxattr(%s, %s): %s\n", tempfile, name, strerror(errno)); + assert(0); + } + } + } + /* step 2a: tar it with each compression type */ // lzma string_or_die(&tarcommand, "tar --directory=%s " TAR_PERM_ATTR_ARGS " -Jcf %s/%i/files/%s.tar.xz %s", -- 2.1.4