Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1Patch based on commits by Dave Vasilevsky <dave@vasilevsky.ca> and
2Blake Riley <blake.riley@gmail.com>, squashed into a single patch,
3with BSD-specific changes omitted.
4
5See also https://github.com/plougher/squashfs-tools/pull/69.
6
7diff --git a/squashfs-tools/action.c b/squashfs-tools/action.c
8index ea2f604..9c979f8 100644
9--- a/squashfs-tools/action.c
10+++ b/squashfs-tools/action.c
11@@ -39,6 +39,10 @@
12 #include <errno.h>
13 #include <ctype.h>
14
15+#ifndef FNM_EXTMATCH /* glibc extension */
16+ #define FNM_EXTMATCH 0
17+#endif
18+
19 #include "squashfs_fs.h"
20 #include "mksquashfs.h"
21 #include "action.h"
22@@ -2415,9 +2419,12 @@ static char *get_start(char *s, int n)
23
24 static int subpathname_fn(struct atom *atom, struct action_data *action_data)
25 {
26- return fnmatch(atom->argv[0], get_start(strdupa(action_data->subpath),
27+ char *path = strdup(action_data->subpath);
28+ int is_match = fnmatch(atom->argv[0], get_start(path,
29 count_components(atom->argv[0])),
30 FNM_PATHNAME|FNM_EXTMATCH) == 0;
31+ free(path);
32+ return is_match;
33 }
34
35 /*
36diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c
37index 216b979..eea2ec9 100644
38--- a/squashfs-tools/info.c
39+++ b/squashfs-tools/info.c
40@@ -144,31 +144,22 @@ void dump_state()
41 void *info_thrd(void *arg)
42 {
43 sigset_t sigmask;
44- struct timespec timespec = { .tv_sec = 1, .tv_nsec = 0 };
45- int sig, waiting = 0;
46+ int sig, err, waiting = 0;
47
48 sigemptyset(&sigmask);
49 sigaddset(&sigmask, SIGQUIT);
50 sigaddset(&sigmask, SIGHUP);
51+ sigaddset(&sigmask, SIGALRM);
52
53 while(1) {
54- if(waiting)
55- sig = sigtimedwait(&sigmask, NULL, ×pec);
56- else
57- sig = sigwaitinfo(&sigmask, NULL);
58+ err = sigwait(&sigmask, &sig);
59
60- if(sig == -1) {
61+ if(err == -1) {
62 switch(errno) {
63- case EAGAIN:
64- /* interval timed out */
65- waiting = 0;
66- /* FALLTHROUGH */
67 case EINTR:
68- /* if waiting, the wait will be longer, but
69- that's OK */
70 continue;
71 default:
72- BAD_ERROR("sigtimedwait/sigwaitinfo failed "
73+ BAD_ERROR("sigwait failed "
74 "because %s\n", strerror(errno));
75 }
76 }
77@@ -179,8 +170,12 @@ void *info_thrd(void *arg)
78 /* set one second interval period, if ^\ received
79 within then, dump queue and cache status */
80 waiting = 1;
81- } else
82+ alarm(1);
83+ } else if (sig == SIGQUIT) {
84 dump_state();
85+ } else if (sig == SIGALRM) {
86+ waiting = 0;
87+ }
88 }
89 }
90
91diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c
92index 843f9f4..ed2c3a6 100644
93--- a/squashfs-tools/mksquashfs.c
94+++ b/squashfs-tools/mksquashfs.c
95@@ -35,7 +35,12 @@
96 #include <stddef.h>
97 #include <sys/types.h>
98 #include <sys/stat.h>
99+#ifndef linux
100+#include <sys/sysctl.h>
101+#else
102+#include <sys/sysinfo.h>
103 #include <sys/sysmacros.h>
104+#endif
105 #include <fcntl.h>
106 #include <errno.h>
107 #include <dirent.h>
108@@ -50,7 +55,10 @@
109 #include <sys/wait.h>
110 #include <limits.h>
111 #include <ctype.h>
112-#include <sys/sysinfo.h>
113+
114+#ifndef FNM_EXTMATCH /* glibc extension */
115+ #define FNM_EXTMATCH 0
116+#endif
117
118 #ifndef linux
119 #include <sys/sysctl.h>
120@@ -5064,6 +5072,7 @@ static void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq,
121 sigemptyset(&sigmask);
122 sigaddset(&sigmask, SIGQUIT);
123 sigaddset(&sigmask, SIGHUP);
124+ sigaddset(&sigmask, SIGALRM);
125 if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) != 0)
126 BAD_ERROR("Failed to set signal mask in intialise_threads\n");
127
128@@ -5802,6 +5811,35 @@ static int get_physical_memory()
129 long long page_size = sysconf(_SC_PAGESIZE);
130 int phys_mem;
131
132+#ifndef linux
133+ #ifdef HW_MEMSIZE
134+ #define SYSCTL_PHYSMEM HW_MEMSIZE
135+ #elif defined(HW_PHYSMEM64)
136+ #define SYSCTL_PHYSMEM HW_PHYSMEM64
137+ #else
138+ #define SYSCTL_PHYSMEM HW_PHYSMEM
139+ #endif
140+
141+ int mib[2];
142+ uint64_t sysctl_physmem = 0;
143+ size_t sysctl_len = sizeof(sysctl_physmem);
144+
145+ mib[0] = CTL_HW;
146+ mib[1] = SYSCTL_PHYSMEM;
147+
148+ if(sysctl(mib, 2, &sysctl_physmem, &sysctl_len, NULL, 0) == 0) {
149+ /* some systems use 32-bit values, work with what we're given */
150+ if (sysctl_len == 4)
151+ sysctl_physmem = *(uint32_t*)&sysctl_physmem;
152+ phys_mem = sysctl_physmem >> 20;
153+ } else {
154+ ERROR_START("Failed to get amount of available "
155+ "memory.");
156+ ERROR_EXIT(" Defaulting to least viable amount\n");
157+ phys_mem = SQUASHFS_LOWMEM;
158+ }
159+ #undef SYSCTL_PHYSMEM
160+#else
161 if(num_pages == -1 || page_size == -1) {
162 struct sysinfo sys;
163 int res = sysinfo(&sys);
164@@ -5814,6 +5852,7 @@ static int get_physical_memory()
165 }
166
167 phys_mem = num_pages * page_size >> 20;
168+#endif
169
170 if(phys_mem < SQUASHFS_LOWMEM)
171 BAD_ERROR("Mksquashfs requires more physical memory than is "
172diff --git a/squashfs-tools/read_xattrs.c b/squashfs-tools/read_xattrs.c
173index 2067f80..ca8b7f4 100644
174--- a/squashfs-tools/read_xattrs.c
175+++ b/squashfs-tools/read_xattrs.c
176@@ -31,13 +31,13 @@
177 #include <stdio.h>
178 #include <string.h>
179
180+#include <stdlib.h>
181+
182 #include "squashfs_fs.h"
183 #include "squashfs_swap.h"
184 #include "xattr.h"
185 #include "error.h"
186
187-#include <stdlib.h>
188-
189 extern int read_fs_bytes(int, long long, long long, void *);
190 extern int read_block(int, long long, long long *, int, void *);
191
192diff --git a/squashfs-tools/unsquashfs.c b/squashfs-tools/unsquashfs.c
193index d434b42..1208e45 100644
194--- a/squashfs-tools/unsquashfs.c
195+++ b/squashfs-tools/unsquashfs.c
196@@ -32,8 +32,12 @@
197 #include "stdarg.h"
198 #include "fnmatch_compat.h"
199
200+#ifndef linux
201+#include <sys/sysctl.h>
202+#else
203 #include <sys/sysinfo.h>
204 #include <sys/sysmacros.h>
205+#endif
206 #include <sys/types.h>
207 #include <sys/time.h>
208 #include <sys/resource.h>
209@@ -1182,7 +1186,7 @@ int create_inode(char *pathname, struct inode *i)
210 break;
211 case SQUASHFS_SYMLINK_TYPE:
212 case SQUASHFS_LSYMLINK_TYPE: {
213- struct timespec times[2] = {
214+ struct timeval times[2] = {
215 { i->time, 0 },
216 { i->time, 0 }
217 };
218@@ -1201,8 +1205,7 @@ int create_inode(char *pathname, struct inode *i)
219 goto failed;
220 }
221
222- res = utimensat(AT_FDCWD, pathname, times,
223- AT_SYMLINK_NOFOLLOW);
224+ res = lutimes(pathname, times);
225 if(res == -1) {
226 EXIT_UNSQUASH_STRICT("create_inode: failed to"
227 " set time on %s, because %s\n",
228@@ -2687,6 +2690,7 @@ void initialise_threads(int fragment_buffer_size, int data_buffer_size, int cat_
229 sigemptyset(&sigmask);
230 sigaddset(&sigmask, SIGQUIT);
231 sigaddset(&sigmask, SIGHUP);
232+ sigaddset(&sigmask, SIGALRM);
233 if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) != 0)
234 EXIT_UNSQUASH("Failed to set signal mask in initialise_threads\n");
235
236diff --git a/squashfs-tools/unsquashfs.h b/squashfs-tools/unsquashfs.h
237index 1099678..5b6a038 100644
238--- a/squashfs-tools/unsquashfs.h
239+++ b/squashfs-tools/unsquashfs.h
240@@ -46,6 +46,10 @@
241 #include <sys/ioctl.h>
242 #include <sys/time.h>
243
244+#ifndef FNM_EXTMATCH /* glibc extension */
245+ #define FNM_EXTMATCH 0
246+#endif
247+
248 #include "endian_compat.h"
249 #include "squashfs_fs.h"
250 #include "unsquashfs_error.h"
251diff --git a/squashfs-tools/unsquashfs_info.c b/squashfs-tools/unsquashfs_info.c
252index e906eaf..f1e68c2 100644
253--- a/squashfs-tools/unsquashfs_info.c
254+++ b/squashfs-tools/unsquashfs_info.c
255@@ -96,31 +96,22 @@ void dump_state()
256 void *info_thrd(void *arg)
257 {
258 sigset_t sigmask;
259- struct timespec timespec = { .tv_sec = 1, .tv_nsec = 0 };
260- int sig, waiting = 0;
261+ int sig, err, waiting = 0;
262
263 sigemptyset(&sigmask);
264 sigaddset(&sigmask, SIGQUIT);
265 sigaddset(&sigmask, SIGHUP);
266+ sigaddset(&sigmask, SIGALRM);
267
268 while(1) {
269- if(waiting)
270- sig = sigtimedwait(&sigmask, NULL, ×pec);
271- else
272- sig = sigwaitinfo(&sigmask, NULL);
273+ err = sigwait(&sigmask, &sig);
274
275- if(sig == -1) {
276+ if(err == -1) {
277 switch(errno) {
278- case EAGAIN:
279- /* interval timed out */
280- waiting = 0;
281- /* FALLTHROUGH */
282 case EINTR:
283- /* if waiting, the wait will be longer, but
284- that's OK */
285 continue;
286 default:
287- BAD_ERROR("sigtimedwait/sigwaitinfo failed "
288+ BAD_ERROR("sigwait failed "
289 "because %s\n", strerror(errno));
290 }
291 }
292@@ -132,8 +123,12 @@ void *info_thrd(void *arg)
293 /* set one second interval period, if ^\ received
294 within then, dump queue and cache status */
295 waiting = 1;
296- } else
297+ alarm(1);
298+ } else if (sig == SIGQUIT) {
299 dump_state();
300+ } else if (sig == SIGALRM) {
301+ waiting = 0;
302+ }
303 }
304 }
305
306diff --git a/squashfs-tools/unsquashfs_xattr.c b/squashfs-tools/unsquashfs_xattr.c
307index 61910e1..73e0090 100644
308--- a/squashfs-tools/unsquashfs_xattr.c
309+++ b/squashfs-tools/unsquashfs_xattr.c
310@@ -27,6 +27,11 @@
311
312 #include <sys/xattr.h>
313
314+#ifdef XATTR_NOFOLLOW /* Apple's xattrs */
315+ #define lsetxattr(path_, name_, val_, sz_, flags_) \
316+ setxattr(path_, name_, val_, sz_, 0, flags_ | XATTR_NOFOLLOW)
317+#endif
318+
319 #define NOSPACE_MAX 10
320
321 extern int root_process;
322diff --git a/squashfs-tools/xattr.c b/squashfs-tools/xattr.c
323index b1c0089..6d7ed98 100644
324--- a/squashfs-tools/xattr.c
325+++ b/squashfs-tools/xattr.c
326@@ -22,6 +22,14 @@
327 * xattr.c
328 */
329
330+#ifndef linux
331+#define __BYTE_ORDER BYTE_ORDER
332+#define __BIG_ENDIAN BIG_ENDIAN
333+#define __LITTLE_ENDIAN LITTLE_ENDIAN
334+#else
335+#include <endian.h>
336+#endif
337+
338 #define TRUE 1
339 #define FALSE 0
340
341@@ -36,6 +44,13 @@
342 #include <stdlib.h>
343 #include <sys/xattr.h>
344
345+#ifdef XATTR_NOFOLLOW /* Apple's xattrs */
346+ #define llistxattr(path_, buf_, sz_) \
347+ listxattr(path_, buf_, sz_, XATTR_NOFOLLOW)
348+ #define lgetxattr(path_, name_, val_, sz_) \
349+ getxattr(path_, name_, val_, sz_, 0, XATTR_NOFOLLOW)
350+#endif
351+
352 #include "squashfs_fs.h"
353 #include "squashfs_swap.h"
354 #include "mksquashfs.h"
355--
3562.35.1
357