summarylogtreecommitdiffstats
path: root/0020-Fall-back-to-readlink-on-Linux.patch
blob: 02b96aee1be3154a8cd56372378550abdb7ef3b4 (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
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Randy Eckenrode <randy@largeandhighquality.com>
Date: Wed, 30 Oct 2024 20:19:20 -0400
Subject: [PATCH 20/20] Fall back to readlink on Linux

---
 xar/lib/archive.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/xar/lib/archive.c b/xar/lib/archive.c
index b7f9cbf..3a79c74 100644
--- a/xar/lib/archive.c
+++ b/xar/lib/archive.c
@@ -507,10 +507,31 @@ xar_t xar_fdopen_digest_verify(int fd, int32_t flags, void *expected_toc_digest,
 	// If there are hardlinks, the path we pick is the most recently opened by
 	// the filesystem; which is effectively random.
 	char path_buff[PATH_MAX];
+#if defined(__APPLE__)
 	if (fcntl(fd, F_GETPATH, path_buff) < 0) {
 		close(fd);
 		return NULL;
 	}
+#elif defined(__linux__)
+	// Linux has to get the path to the file via `/proc`.
+	char proc_buff[PATH_MAX];
+	if (snprintf(proc_buff, PATH_MAX, "/proc/self/fd/%i", fd) < 0) {
+		close(fd);
+		return NULL;
+	}
+	if (readlink(proc_buff, &path_buff, PATH_MAX) < 0) {
+		close(fd);
+		return NULL;
+	}
+	// The filename is the file’s when the fd was created. Check to make sure it still exists.
+	struct stat stat_buff;
+	if (stat(path_buff, &stat_buff) < 0) {
+		close(fd);
+		return NULL;
+	}
+#else
+#error "Unknown platform. Please update with an implementation of `F_GETPATH`."
+#endif
 	
 	// Don't trust the position of the descriptor we were given, reset it back to 0
 	if (lseek(fd, 0, SEEK_SET) != 0) {
-- 
2.47.0