aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-core/swupd-server/swupd-server/fullfiles.c-work-around-pseudo-bug.patch
blob: aa0305465806f1566d28fff9ba5b9d4efc14d8d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
From 939a50bf2fec9463fb721fa9188f98e991dfddc9 Mon Sep 17 00:00:00 2001
From: Patrick Ohly <patrick.ohly@intel.com>
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 <patrick.ohly@intel.com>
---
 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 <assert.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/xattr.h>
 #include <stdint.h>
 #include <errno.h>
 #include <libgen.h>
@@ -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