From 442cf4f7834077c38320fa7c8aee6ff6d576bfde Mon Sep 17 00:00:00 2001 From: Ruud van Asseldonk Date: Sat, 7 Sep 2019 16:12:07 +0200 Subject: [PATCH 1/4] squashfsTools: 4.4dev_20180612 -> 4.4 A new release has been made upstream. Reproducibility issues were fixed in that release, so we no longer need those patches. For a full overview of the changes, see the 4.4-specific readme at [1]. The alignment patch no longer applies cleanly; I disabled it for now, and I will try to restore it in a follow-up commit. [1]: https://github.com/plougher/squashfs-tools/blob/52eb4c279cd283ed9802dd1ceb686560b22ffb67/README-4.4 --- ...POCH-is-set-override-timestamps-with.patch | 90 ------- ...POCH-is-set-also-clamp-content-times.patch | 83 ------- .../0003-remove-frag-deflator-thread.patch | 220 ------------------ pkgs/tools/filesystems/squashfs/default.nix | 17 +- 4 files changed, 6 insertions(+), 404 deletions(-) delete mode 100644 pkgs/tools/filesystems/squashfs/0001-If-SOURCE_DATE_EPOCH-is-set-override-timestamps-with.patch delete mode 100644 pkgs/tools/filesystems/squashfs/0002-If-SOURCE_DATE_EPOCH-is-set-also-clamp-content-times.patch delete mode 100644 pkgs/tools/filesystems/squashfs/0003-remove-frag-deflator-thread.patch diff --git a/pkgs/tools/filesystems/squashfs/0001-If-SOURCE_DATE_EPOCH-is-set-override-timestamps-with.patch b/pkgs/tools/filesystems/squashfs/0001-If-SOURCE_DATE_EPOCH-is-set-override-timestamps-with.patch deleted file mode 100644 index 5626800e723c..000000000000 --- a/pkgs/tools/filesystems/squashfs/0001-If-SOURCE_DATE_EPOCH-is-set-override-timestamps-with.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 0ab12a8585373be2de5129e14d979c62e7a90d82 Mon Sep 17 00:00:00 2001 -From: Chris Lamb -Date: Mon, 21 Nov 2016 09:33:05 +0100 -Subject: [PATCH] If SOURCE_DATE_EPOCH is set, override timestamps with that - value. - -See https://reproducible-builds.org/specs/source-date-epoch/ for more -information about this environment variable. - -Based on a patch by Alexander Couzens posted on -https://sourceforge.net/p/squashfs/mailman/message/34673610/ - -Signed-off-by: Chris Lamb ---- - squashfs-tools/mksquashfs.c | 38 ++++++++++++++++++++++++++++++++++++- - 1 file changed, 37 insertions(+), 1 deletion(-) - -diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index c2098bd..b49e956 100644 ---- a/squashfs-tools/mksquashfs.c -+++ b/squashfs-tools/mksquashfs.c -@@ -137,6 +137,9 @@ unsigned int cache_bytes = 0, cache_size = 0, inode_count = 0; - /* inode lookup table */ - squashfs_inode *inode_lookup_table = NULL; - -+/* override filesystem creation time */ -+time_t mkfs_fixed_time = -1; -+ - /* in memory directory data */ - #define I_COUNT_SIZE 128 - #define DIR_ENTRIES 32 -@@ -5104,6 +5107,9 @@ int main(int argc, char *argv[]) - int total_mem = get_default_phys_mem(); - int progress = TRUE; - int force_progress = FALSE; -+ char *source_date_epoch, *endptr; -+ unsigned long long epoch; -+ - struct file_buffer **fragment = NULL; - - if(argc > 1 && strcmp(argv[1], "-version") == 0) { -@@ -5641,6 +5647,36 @@ printOptions: - } - } - -+ /* if SOURCE_DATE_EPOCH is set, use that timestamp for the mkfs time */ -+ source_date_epoch = getenv("SOURCE_DATE_EPOCH"); -+ if(source_date_epoch) { -+ errno = 0; -+ epoch = strtoull(source_date_epoch, &endptr, 10); -+ if((errno == ERANGE && (epoch == ULLONG_MAX || epoch == 0)) -+ || (errno != 0 && epoch == 0)) { -+ ERROR("Environment variable $SOURCE_DATE_EPOCH: " -+ "strtoull: %s\n", strerror(errno)); -+ EXIT_MKSQUASHFS(); -+ } -+ if(endptr == source_date_epoch) { -+ ERROR("Environment variable $SOURCE_DATE_EPOCH: " -+ "No digits were found: %s\n", endptr); -+ EXIT_MKSQUASHFS(); -+ } -+ if(*endptr != '\0') { -+ ERROR("Environment variable $SOURCE_DATE_EPOCH: " -+ "Trailing garbage: %s\n", endptr); -+ EXIT_MKSQUASHFS(); -+ } -+ if(epoch > ULONG_MAX) { -+ ERROR("Environment variable $SOURCE_DATE_EPOCH: " -+ "value must be smaller than or equal to " -+ "%lu but was found to be: %llu \n", ULONG_MAX, epoch); -+ EXIT_MKSQUASHFS(); -+ } -+ mkfs_fixed_time = (time_t)epoch; -+ } -+ - /* - * Some compressors may need the options to be checked for validity - * once all the options have been processed -@@ -5993,7 +6029,7 @@ printOptions: - sBlk.flags = SQUASHFS_MKFLAGS(noI, noD, noF, noX, no_fragments, - always_use_fragments, duplicate_checking, exportable, - no_xattrs, comp_opts); -- sBlk.mkfs_time = time(NULL); -+ sBlk.mkfs_time = mkfs_fixed_time != -1 ? mkfs_fixed_time : time(NULL); - - disable_info(); - --- -2.17.0 - diff --git a/pkgs/tools/filesystems/squashfs/0002-If-SOURCE_DATE_EPOCH-is-set-also-clamp-content-times.patch b/pkgs/tools/filesystems/squashfs/0002-If-SOURCE_DATE_EPOCH-is-set-also-clamp-content-times.patch deleted file mode 100644 index 5002375887fb..000000000000 --- a/pkgs/tools/filesystems/squashfs/0002-If-SOURCE_DATE_EPOCH-is-set-also-clamp-content-times.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 32a07d4156a281084c90a4b78affc8b0b32a26fc Mon Sep 17 00:00:00 2001 -From: intrigeri -Date: Mon, 21 Nov 2016 11:41:28 +0000 -Subject: [PATCH] If SOURCE_DATE_EPOCH is set, also clamp content timestamps - with that value. - -Based on a patch by Alexander Couzens posted on -https://sourceforge.net/p/squashfs/mailman/message/34673610/ ---- - squashfs-tools/mksquashfs.c | 15 ++++++++++++--- - 1 file changed, 12 insertions(+), 3 deletions(-) - -diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index b49e956..9f020bf 100644 ---- a/squashfs-tools/mksquashfs.c -+++ b/squashfs-tools/mksquashfs.c -@@ -137,6 +137,9 @@ unsigned int cache_bytes = 0, cache_size = 0, inode_count = 0; - /* inode lookup table */ - squashfs_inode *inode_lookup_table = NULL; - -+/* clamp all timestamps to SOURCE_DATE_EPOCH */ -+time_t content_clamp_time = -1; -+ - /* override filesystem creation time */ - time_t mkfs_fixed_time = -1; - -@@ -2246,6 +2249,8 @@ restat: - pathname_reader(dir_ent), strerror(errno)); - goto read_err; - } -+ if(content_clamp_time != -1 && buf2.st_mtime >= content_clamp_time) -+ buf2.st_mtime = content_clamp_time; - - if(read_size != buf2.st_size) { - close(file); -@@ -3101,7 +3106,7 @@ void dir_scan(squashfs_inode *inode, char *pathname, - buf.st_mode = S_IRWXU | S_IRWXG | S_IRWXO | S_IFDIR; - buf.st_uid = getuid(); - buf.st_gid = getgid(); -- buf.st_mtime = time(NULL); -+ buf.st_mtime = content_clamp_time != -1 ? content_clamp_time : time(NULL); - buf.st_dev = 0; - buf.st_ino = 0; - dir_ent->inode = lookup_inode2(&buf, PSEUDO_FILE_OTHER, 0); -@@ -3127,6 +3115,8 @@ void dir_scan(squashfs_inode *inode, char *pathname, - /* source directory has disappeared? */ - BAD_ERROR("Cannot stat source directory %s because %s\n", - pathname, strerror(errno)); -+ if(content_clamp_time != -1 && buf.st_mtime >= content_clamp_time) -+ buf.st_mtime = content_clamp_time; - dir_ent->inode = lookup_inode(&buf); - } - -@@ -3365,6 +3372,8 @@ struct dir_info *dir_scan1(char *filename, char *subpath, - free_dir_entry(dir_ent); - continue; - } -+ if(content_clamp_time != -1 && buf.st_mtime >= content_clamp_time) -+ buf.st_mtime = content_clamp_time; - - if((buf.st_mode & S_IFMT) != S_IFREG && - (buf.st_mode & S_IFMT) != S_IFDIR && -@@ -3544,7 +3553,7 @@ void dir_scan2(struct dir_info *dir, struct pseudo *pseudo) - buf.st_gid = pseudo_ent->dev->gid; - buf.st_rdev = makedev(pseudo_ent->dev->major, - pseudo_ent->dev->minor); -- buf.st_mtime = time(NULL); -+ buf.st_mtime = content_clamp_time != -1 ? content_clamp_time : time(NULL); - buf.st_ino = pseudo_ino ++; - - if(pseudo_ent->dev->type == 'd') { -@@ -5674,7 +5683,7 @@ printOptions: - "%lu but was found to be: %llu \n", ULONG_MAX, epoch); - EXIT_MKSQUASHFS(); - } -- mkfs_fixed_time = (time_t)epoch; -+ mkfs_fixed_time = content_clamp_time = (time_t)epoch; - } - - /* --- -2.17.0 - diff --git a/pkgs/tools/filesystems/squashfs/0003-remove-frag-deflator-thread.patch b/pkgs/tools/filesystems/squashfs/0003-remove-frag-deflator-thread.patch deleted file mode 100644 index 4be4b96369a8..000000000000 --- a/pkgs/tools/filesystems/squashfs/0003-remove-frag-deflator-thread.patch +++ /dev/null @@ -1,220 +0,0 @@ -From afc0c76a170bd17cbd29bbec6ae6d2227e398570 Mon Sep 17 00:00:00 2001 -From: Alexander Couzens -Date: Fri, 13 Jan 2017 22:00:37 +0100 -Subject: [PATCH] remove frag_deflator_thread - -frag_deflator_thread compress fragments. -Replace the deflator_thread with a function and -use the function instead of the to_frag queue. ---- - squashfs-tools/info.c | 5 --- - squashfs-tools/mksquashfs.c | 76 +++++++++++++------------------------ - squashfs-tools/mksquashfs.h | 2 +- - squashfs-tools/restore.c | 15 +------- - 4 files changed, 30 insertions(+), 68 deletions(-) - -diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c -index 7968c77..028d578 100644 ---- a/squashfs-tools/info.c -+++ b/squashfs-tools/info.c -@@ -96,11 +96,6 @@ void dump_state() - printf("compressed block queue (deflate thread(s) -> main thread)\n"); - dump_seq_queue(to_main, 0); - -- printf("uncompressed packed fragment queue (main thread -> fragment" -- " deflate thread(s))\n"); -- dump_queue(to_frag); -- -- - printf("locked frag queue (compressed frags waiting while multi-block" - " file is written)\n"); - dump_queue(locked_fragment); -diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index cf48e40..cacf14c 100644 ---- a/squashfs-tools/mksquashfs.c -+++ b/squashfs-tools/mksquashfs.c -@@ -270,10 +270,10 @@ unsigned int sid_count = 0, suid_count = 0, sguid_count = 0; - struct cache *reader_buffer, *fragment_buffer, *reserve_cache; - struct cache *bwriter_buffer, *fwriter_buffer; - struct queue *to_reader, *to_deflate, *to_writer, *from_writer, -- *to_frag, *locked_fragment, *to_process_frag; -+ *locked_fragment, *to_process_frag; - struct seq_queue *to_main; - pthread_t reader_thread, writer_thread, main_thread; --pthread_t *deflator_thread, *frag_deflator_thread, *frag_thread; -+pthread_t *deflator_thread, *frag_thread; - pthread_t *restore_thread = NULL; - pthread_mutex_t fragment_mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_t pos_mutex = PTHREAD_MUTEX_INITIALIZER; -@@ -323,7 +323,7 @@ struct dir_info *scan1_opendir(char *pathname, char *subpath, int depth); - void write_filesystem_tables(struct squashfs_super_block *sBlk, int nopad); - unsigned short get_checksum_mem(char *buff, int bytes); - void check_usable_phys_mem(int total_mem); -- -+void frag_deflator(struct file_buffer *file_buffer); - - void prep_exit() - { -@@ -1540,7 +1540,7 @@ void write_fragment(struct file_buffer *fragment) - pthread_mutex_lock(&fragment_mutex); - fragment_table[fragment->block].unused = 0; - fragments_outstanding ++; -- queue_put(to_frag, fragment); -+ frag_deflator(fragment); - pthread_cleanup_pop(1); - } - -@@ -2412,51 +2412,34 @@ void *deflator(void *arg) - } - - --void *frag_deflator(void *arg) -+void frag_deflator(struct file_buffer *file_buffer) - { -- void *stream = NULL; -- int res; - -- res = compressor_init(comp, &stream, block_size, 1); -- if(res) -- BAD_ERROR("frag_deflator:: compressor_init failed\n"); -- -- pthread_cleanup_push((void *) pthread_mutex_unlock, &fragment_mutex); -- -- while(1) { -- int c_byte, compressed_size; -- struct file_buffer *file_buffer = queue_get(to_frag); -- struct file_buffer *write_buffer = -+ int c_byte, compressed_size; -+ struct file_buffer *write_buffer = - cache_get(fwriter_buffer, file_buffer->block); - -- c_byte = mangle2(stream, write_buffer->data, file_buffer->data, -- file_buffer->size, block_size, noF, 1); -- compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); -- write_buffer->size = compressed_size; -- pthread_mutex_lock(&fragment_mutex); -- if(fragments_locked == FALSE) { -- fragment_table[file_buffer->block].size = c_byte; -- fragment_table[file_buffer->block].start_block = bytes; -- write_buffer->block = bytes; -- bytes += compressed_size; -- fragments_outstanding --; -- queue_put(to_writer, write_buffer); -- pthread_mutex_unlock(&fragment_mutex); -- TRACE("Writing fragment %lld, uncompressed size %d, " -- "compressed size %d\n", file_buffer->block, -- file_buffer->size, compressed_size); -- } else { -- add_pending_fragment(write_buffer, c_byte, -- file_buffer->block); -- pthread_mutex_unlock(&fragment_mutex); -- } -- cache_block_put(file_buffer); -+ c_byte = mangle2(stream, write_buffer->data, file_buffer->data, -+ file_buffer->size, block_size, noF, 1); -+ compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); -+ write_buffer->size = compressed_size; -+ if(fragments_locked == FALSE) { -+ fragment_table[file_buffer->block].size = c_byte; -+ fragment_table[file_buffer->block].start_block = bytes; -+ write_buffer->block = bytes; -+ bytes += compressed_size; -+ fragments_outstanding --; -+ queue_put(to_writer, write_buffer); -+ TRACE("Writing fragment %lld, uncompressed size %d, " -+ "compressed size %d\n", file_buffer->block, -+ file_buffer->size, compressed_size); -+ } else { -+ add_pending_fragment(write_buffer, c_byte, -+ file_buffer->block); - } -- -- pthread_cleanup_pop(0); -+ cache_block_put(file_buffer); - } - -- - struct file_buffer *get_file_buffer() - { - struct file_buffer *file_buffer = seq_queue_get(to_main); -@@ -4257,19 +4240,17 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, - multiply_overflow(processors * 3, sizeof(pthread_t))) - BAD_ERROR("Processors too large\n"); - -- deflator_thread = malloc(processors * 3 * sizeof(pthread_t)); -+ deflator_thread = malloc(processors * 2 * sizeof(pthread_t)); - if(deflator_thread == NULL) - MEM_ERROR(); - -- frag_deflator_thread = &deflator_thread[processors]; -- frag_thread = &frag_deflator_thread[processors]; -+ frag_thread = &deflator_thread[processors]; - - to_reader = queue_init(1); - to_deflate = queue_init(reader_size); - to_process_frag = queue_init(reader_size); - to_writer = queue_init(bwriter_size + fwriter_size); - from_writer = queue_init(1); -- to_frag = queue_init(fragment_size); - locked_fragment = queue_init(fragment_size); - to_main = seq_queue_init(); - reader_buffer = cache_init(block_size, reader_size, 0, 0); -@@ -4285,9 +4266,6 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, - for(i = 0; i < processors; i++) { - if(pthread_create(&deflator_thread[i], NULL, deflator, NULL)) - BAD_ERROR("Failed to create thread\n"); -- if(pthread_create(&frag_deflator_thread[i], NULL, frag_deflator, -- NULL) != 0) -- BAD_ERROR("Failed to create thread\n"); - if(pthread_create(&frag_thread[i], NULL, frag_thrd, - (void *) destination_file) != 0) - BAD_ERROR("Failed to create thread\n"); -diff --git a/squashfs-tools/mksquashfs.h b/squashfs-tools/mksquashfs.h -index 55708a3..dc5bde4 100644 ---- a/squashfs-tools/mksquashfs.h -+++ b/squashfs-tools/mksquashfs.h -@@ -135,7 +135,7 @@ struct append_file { - extern struct cache *reader_buffer, *fragment_buffer, *reserve_cache; - struct cache *bwriter_buffer, *fwriter_buffer; - extern struct queue *to_reader, *to_deflate, *to_writer, *from_writer, -- *to_frag, *locked_fragment, *to_process_frag; -+ *locked_fragment, *to_process_frag; - extern struct append_file **file_mapping; - extern struct seq_queue *to_main; - extern pthread_mutex_t fragment_mutex, dup_mutex; -diff --git a/squashfs-tools/restore.c b/squashfs-tools/restore.c -index 5e336b3..a7aaf2e 100644 ---- a/squashfs-tools/restore.c -+++ b/squashfs-tools/restore.c -@@ -47,8 +47,8 @@ - #define TRUE 1 - - extern pthread_t reader_thread, writer_thread, main_thread; --extern pthread_t *deflator_thread, *frag_deflator_thread, *frag_thread; --extern struct queue *to_deflate, *to_writer, *to_frag, *to_process_frag; -+extern pthread_t *deflator_thread, *frag_thread; -+extern struct queue *to_deflate, *to_writer, *to_process_frag; - extern struct seq_queue *to_main; - extern void restorefs(); - extern int processors; -@@ -120,17 +120,6 @@ void *restore_thrd(void *arg) - pthread_cancel(main_thread); - pthread_join(main_thread, NULL); - -- /* then flush the main thread to fragment deflator thread(s) -- * queue. The fragment deflator thread(s) will idle -- */ -- queue_flush(to_frag); -- -- /* now kill the fragment deflator thread(s) */ -- for(i = 0; i < processors; i++) -- pthread_cancel(frag_deflator_thread[i]); -- for(i = 0; i < processors; i++) -- pthread_join(frag_deflator_thread[i], NULL); -- - /* - * then flush the main thread/fragment deflator thread(s) - * to writer thread queue. The writer thread will idle --- -2.17.0 - diff --git a/pkgs/tools/filesystems/squashfs/default.nix b/pkgs/tools/filesystems/squashfs/default.nix index 5bd3b27eded1..19a56a9466fc 100644 --- a/pkgs/tools/filesystems/squashfs/default.nix +++ b/pkgs/tools/filesystems/squashfs/default.nix @@ -8,26 +8,21 @@ assert lz4Support -> (lz4 != null); stdenv.mkDerivation { pname = "squashfs"; - version = "4.4dev_20180612"; + version = "4.4"; src = fetchFromGitHub { owner = "plougher"; repo = "squashfs-tools"; - sha256 = "1y53z8dkph3khdyhkmkmy0sg9p1n8czv3vj4l324nj8kxyih3l2c"; - rev = "6e242dc95485ada8d1d0b3dd9346c5243d4a517f"; + sha256 = "0697fv8n6739mcyn57jclzwwbbqwpvjdfkv1qh9s56lvyqnplwaw"; + # Tag "4.4" points to this commit. + rev = "52eb4c279cd283ed9802dd1ceb686560b22ffb67"; }; patches = [ - # These patches ensures that mksquashfs output is reproducible. - # See also https://reproducible-builds.org/docs/system-images/ - # and https://github.com/NixOS/nixpkgs/issues/40144. - ./0001-If-SOURCE_DATE_EPOCH-is-set-override-timestamps-with.patch - ./0002-If-SOURCE_DATE_EPOCH-is-set-also-clamp-content-times.patch - ./0003-remove-frag-deflator-thread.patch - # This patch adds an option to pad filesystems (increasing size) in # exchange for better chunking / binary diff calculation. - ./squashfs-tools-4.4-4k-align.patch + # TODO(ruuda): make this patch apply to the proper 4.4 release. + # ./squashfs-tools-4.4-4k-align.patch ] ++ stdenv.lib.optional stdenv.isDarwin ./darwin.patch; buildInputs = [ zlib xz zstd ] From a60ee9a74c8f9305469e2b8962aef05f33f64afc Mon Sep 17 00:00:00 2001 From: Ruud van Asseldonk Date: Sat, 7 Sep 2019 18:58:31 +0200 Subject: [PATCH 2/4] squashfsTools: make alignment patch apply to 4.4 I took the patch, and applied it on top of the previous squashfs-tools commit that we packaged (which required editing one line in the patch, as it assumed to be applied on top of the reproducibility patches). Then I rebased that on top of master, resolved one conflict, and I formatted a new patch for this. --- ...ools-4.4-4k-align.patch => 4k-align.patch} | 51 +++++++++++-------- pkgs/tools/filesystems/squashfs/default.nix | 3 +- 2 files changed, 32 insertions(+), 22 deletions(-) rename pkgs/tools/filesystems/squashfs/{squashfs-tools-4.4-4k-align.patch => 4k-align.patch} (67%) diff --git a/pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch b/pkgs/tools/filesystems/squashfs/4k-align.patch similarity index 67% rename from pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch rename to pkgs/tools/filesystems/squashfs/4k-align.patch index c9c3dd3d7604..e73c06788756 100644 --- a/pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch +++ b/pkgs/tools/filesystems/squashfs/4k-align.patch @@ -1,3 +1,7 @@ +This patch has been edited to apply to squashfs 4.4, commit +52eb4c279cd283ed9802dd1ceb686560b22ffb67. Below is the original +message body of the patch. + From 7bda7c75748f36b0a50f93e46144d5a4de4974ad Mon Sep 17 00:00:00 2001 From: Amin Hassani Date: Thu, 15 Dec 2016 10:43:15 -0800 @@ -16,20 +20,24 @@ increased_size = (number_of_unfragmented_files_in_image + number of fragments) * The 4k alignment can be enabled by flag '-4k-align' --- -diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c ---- a/squashfs-tools/mksquashfs.c 2019-07-06 15:50:22.214873176 +0000 -+++ b/squashfs-tools/mksquashfs.c 2019-07-06 15:51:22.244802582 +0000 -@@ -100,7 +100,9 @@ + squashfs-tools/mksquashfs.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c +index a45b77f..07b1c06 100644 +--- a/squashfs-tools/mksquashfs.c ++++ b/squashfs-tools/mksquashfs.c +@@ -102,7 +102,9 @@ int old_exclude = TRUE; int use_regex = FALSE; int nopad = FALSE; int exit_on_error = FALSE; +int do_4k_align = FALSE; - static off_t squashfs_start_offset = 0; + long long start_offset = 0; +#define ALIGN_UP(bytes, size) (bytes = (bytes + size - 1) & ~(size - 1)) long long global_uid = -1, global_gid = -1; -@@ -1495,6 +1497,9 @@ +@@ -1546,6 +1548,9 @@ void unlock_fragments() * queue at this time. */ while(!queue_empty(locked_fragment)) { @@ -39,17 +47,17 @@ diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c write_buffer = queue_get(locked_fragment); frg = write_buffer->block; size = SQUASHFS_COMPRESSED_SIZE_BLOCK(fragment_table[frg].size); -@@ -2414,6 +2419,9 @@ - compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); - write_buffer->size = compressed_size; - if(fragments_locked == FALSE) { -+ // 4k align the start of each fragment. -+ if(do_4k_align) -+ ALIGN_UP(bytes, 4096); - fragment_table[file_buffer->block].size = c_byte; - fragment_table[file_buffer->block].start_block = bytes; - write_buffer->block = bytes; -@@ -2728,6 +2736,10 @@ +@@ -2478,6 +2483,9 @@ void *frag_deflator(void *arg) + write_buffer->size = compressed_size; + pthread_mutex_lock(&fragment_mutex); + if(fragments_locked == FALSE) { ++ // 4k align the start of each fragment. ++ if(do_4k_align) ++ ALIGN_UP(bytes, 4096); + fragment_table[file_buffer->block].size = c_byte; + fragment_table[file_buffer->block].start_block = bytes; + write_buffer->block = bytes; +@@ -2877,6 +2885,10 @@ int write_file_blocks(squashfs_inode *inode, struct dir_ent *dir_ent, long long sparse = 0; struct file_buffer *fragment_buffer = NULL; @@ -60,7 +68,7 @@ diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c if(pre_duplicate(read_size)) return write_file_blocks_dup(inode, dir_ent, read_buffer, dup); -@@ -4808,6 +4820,7 @@ +@@ -4972,6 +4984,7 @@ void write_filesystem_tables(struct squashfs_super_block *sBlk, int nopad) "compressed", no_fragments ? "no" : noF ? "uncompressed" : "compressed", no_xattrs ? "no" : noX ? "uncompressed" : "compressed", noI || noId ? "uncompressed" : "compressed"); @@ -68,7 +76,7 @@ diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c printf("\tduplicates are %sremoved\n", duplicate_checking ? "" : "not "); printf("Filesystem size %.2f Kbytes (%.2f Mbytes)\n", bytes / 1024.0, -@@ -5570,6 +5583,8 @@ +@@ -5853,6 +5866,8 @@ print_compressor_options: root_name = argv[i]; } else if(strcmp(argv[i], "-version") == 0) { VERSION(); @@ -77,7 +85,7 @@ diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c } else { ERROR("%s: invalid option\n\n", argv[0]); printOptions: -@@ -5613,6 +5628,7 @@ +@@ -5904,6 +5919,7 @@ printOptions: ERROR("\t\t\tdirectory containing that directory, " "rather than the\n"); ERROR("\t\t\tcontents of the directory\n"); @@ -85,3 +93,6 @@ diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c ERROR("\nFilesystem filter options:\n"); ERROR("-p \tAdd pseudo file " "definition\n"); +-- +2.23.0 + diff --git a/pkgs/tools/filesystems/squashfs/default.nix b/pkgs/tools/filesystems/squashfs/default.nix index 19a56a9466fc..15a535eed3ba 100644 --- a/pkgs/tools/filesystems/squashfs/default.nix +++ b/pkgs/tools/filesystems/squashfs/default.nix @@ -21,8 +21,7 @@ stdenv.mkDerivation { patches = [ # This patch adds an option to pad filesystems (increasing size) in # exchange for better chunking / binary diff calculation. - # TODO(ruuda): make this patch apply to the proper 4.4 release. - # ./squashfs-tools-4.4-4k-align.patch + ./4k-align.patch ] ++ stdenv.lib.optional stdenv.isDarwin ./darwin.patch; buildInputs = [ zlib xz zstd ] From 14d2c3669faa5d0703610b8fc3d6f5d5bfbc6332 Mon Sep 17 00:00:00 2001 From: Ruud van Asseldonk Date: Sat, 7 Sep 2019 19:16:57 +0200 Subject: [PATCH 3/4] squashfsTools: make Darwin patch apply to 4.4 I took the patch, and applied it on top of the previous squashfs-tools commit that we packaged. It applied cleanly. Then I rebased that on top of master, and resolved the conflicts. I'm not sure I resolved them correctly though, I don't have access to Darwin. Somebody needs to review this. --- pkgs/tools/filesystems/squashfs/darwin.patch | 141 ++++--------------- 1 file changed, 31 insertions(+), 110 deletions(-) diff --git a/pkgs/tools/filesystems/squashfs/darwin.patch b/pkgs/tools/filesystems/squashfs/darwin.patch index 6022e65be479..28d70cdf03d1 100644 --- a/pkgs/tools/filesystems/squashfs/darwin.patch +++ b/pkgs/tools/filesystems/squashfs/darwin.patch @@ -28,10 +28,10 @@ index 4b06ccb..26365e7 100644 /* diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c -index 7968c77..c8e4c52 100644 +index fe23d78..8efefe6 100644 --- a/squashfs-tools/info.c +++ b/squashfs-tools/info.c -@@ -134,31 +134,22 @@ void dump_state() +@@ -144,31 +144,22 @@ void dump_state() void *info_thrd(void *arg) { sigset_t sigmask; @@ -68,7 +68,7 @@ index 7968c77..c8e4c52 100644 "because %s\n", strerror(errno)); } } -@@ -169,8 +160,12 @@ void *info_thrd(void *arg) +@@ -179,8 +170,12 @@ void *info_thrd(void *arg) /* set one second interval period, if ^\ received within then, dump queue and cache status */ waiting = 1; @@ -83,12 +83,12 @@ index 7968c77..c8e4c52 100644 } diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index d696a51..c86d1b3 100644 +index a45b77f..6d186ea 100644 --- a/squashfs-tools/mksquashfs.c +++ b/squashfs-tools/mksquashfs.c -@@ -50,6 +50,10 @@ - #include +@@ -52,6 +52,10 @@ #include + #include +#ifndef FNM_EXTMATCH /* glibc extension */ + #define FNM_EXTMATCH 0 @@ -97,101 +97,15 @@ index d696a51..c86d1b3 100644 #ifndef linux #define __BYTE_ORDER BYTE_ORDER #define __BIG_ENDIAN BIG_ENDIAN -@@ -831,13 +835,13 @@ char *subpathname(struct dir_ent *dir_ent) - } - - --inline unsigned int get_inode_no(struct inode_info *inode) -+static inline unsigned int get_inode_no(struct inode_info *inode) - { - return inode->inode_number; - } - - --inline unsigned int get_parent_no(struct dir_info *dir) -+static inline unsigned int get_parent_no(struct dir_info *dir) - { - return dir->depth ? get_inode_no(dir->dir_ent->inode) : inode_no; - } -@@ -2030,7 +2034,7 @@ struct file_info *duplicate(long long file_size, long long bytes, - } - - --inline int is_fragment(struct inode_info *inode) -+static inline int is_fragment(struct inode_info *inode) - { - off_t file_size = inode->buf.st_size; - -@@ -2999,13 +3003,13 @@ struct inode_info *lookup_inode2(struct stat *buf, int pseudo, int id) - } - - --inline struct inode_info *lookup_inode(struct stat *buf) -+static inline struct inode_info *lookup_inode(struct stat *buf) - { - return lookup_inode2(buf, 0, 0); - } - - --inline void alloc_inode_no(struct inode_info *inode, unsigned int use_this) -+static inline void alloc_inode_no(struct inode_info *inode, unsigned int use_this) - { - if (inode->inode_number == 0) { - inode->inode_number = use_this ? : inode_no ++; -@@ -3016,7 +3020,7 @@ inline void alloc_inode_no(struct inode_info *inode, unsigned int use_this) - } - - --inline struct dir_ent *create_dir_entry(char *name, char *source_name, -+static inline struct dir_ent *create_dir_entry(char *name, char *source_name, - char *nonstandard_pathname, struct dir_info *dir) - { - struct dir_ent *dir_ent = malloc(sizeof(struct dir_ent)); -@@ -3034,7 +3038,7 @@ inline struct dir_ent *create_dir_entry(char *name, char *source_name, - } - - --inline void add_dir_entry(struct dir_ent *dir_ent, struct dir_info *sub_dir, -+static inline void add_dir_entry(struct dir_ent *dir_ent, struct dir_info *sub_dir, - struct inode_info *inode_info) - { - struct dir_info *dir = dir_ent->our_dir; -@@ -3050,7 +3054,7 @@ inline void add_dir_entry(struct dir_ent *dir_ent, struct dir_info *sub_dir, - } - - --inline void add_dir_entry2(char *name, char *source_name, -+static inline void add_dir_entry2(char *name, char *source_name, - char *nonstandard_pathname, struct dir_info *sub_dir, - struct inode_info *inode_info, struct dir_info *dir) - { -@@ -3062,7 +3066,7 @@ inline void add_dir_entry2(char *name, char *source_name, - } - - --inline void free_dir_entry(struct dir_ent *dir_ent) -+static inline void free_dir_entry(struct dir_ent *dir_ent) - { - if(dir_ent->name) - free(dir_ent->name); -@@ -3083,7 +3087,7 @@ inline void free_dir_entry(struct dir_ent *dir_ent) - } - - --inline void add_excluded(struct dir_info *dir) -+static inline void add_excluded(struct dir_info *dir) - { - dir->excluded ++; - } -@@ -4200,6 +4204,7 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, +@@ -4348,6 +4352,7 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, sigemptyset(&sigmask); sigaddset(&sigmask, SIGQUIT); sigaddset(&sigmask, SIGHUP); + sigaddset(&sigmask, SIGALRM); - if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == -1) + if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) != 0) BAD_ERROR("Failed to set signal mask in intialise_threads\n"); -@@ -4987,6 +4992,36 @@ int parse_num(char *arg, int *res) +@@ -5184,6 +5189,36 @@ int parse_mode(char *arg, mode_t *res) int get_physical_memory() { @@ -228,21 +142,24 @@ index d696a51..c86d1b3 100644 /* * Long longs are used here because with PAE, a 32-bit * machine can have more than 4GB of physical memory -@@ -4996,10 +5031,11 @@ int get_physical_memory() +@@ -5193,7 +5228,6 @@ int get_physical_memory() */ long long num_pages = sysconf(_SC_PHYS_PAGES); long long page_size = sysconf(_SC_PAGESIZE); -- int phys_mem = num_pages * page_size >> 20; -+ phys_mem = num_pages * page_size >> 20; +- int phys_mem; - if(num_pages == -1 || page_size == -1) - return 0; + if(num_pages == -1 || page_size == -1) { + struct sysinfo sys; +@@ -5207,6 +5241,7 @@ int get_physical_memory() + } + + phys_mem = num_pages * page_size >> 20; +#endif if(phys_mem < SQUASHFS_LOWMEM) BAD_ERROR("Mksquashfs requires more physical memory than is " diff --git a/squashfs-tools/mksquashfs.h b/squashfs-tools/mksquashfs.h -index 55708a3..d44d1fd 100644 +index 1beefef..88d0b5c 100644 --- a/squashfs-tools/mksquashfs.h +++ b/squashfs-tools/mksquashfs.h @@ -24,6 +24,7 @@ @@ -254,7 +171,7 @@ index 55708a3..d44d1fd 100644 struct dir_info { char *pathname; diff --git a/squashfs-tools/pseudo.c b/squashfs-tools/pseudo.c -index cb74cf6..fe2b4bc 100644 +index 48e6b27..f8fd529 100644 --- a/squashfs-tools/pseudo.c +++ b/squashfs-tools/pseudo.c @@ -30,6 +30,7 @@ @@ -266,7 +183,7 @@ index cb74cf6..fe2b4bc 100644 #include #include diff --git a/squashfs-tools/read_xattrs.c b/squashfs-tools/read_xattrs.c -index 42106f5..837d3fb 100644 +index 4debedf..3257c30 100644 --- a/squashfs-tools/read_xattrs.c +++ b/squashfs-tools/read_xattrs.c @@ -39,13 +39,13 @@ @@ -286,10 +203,10 @@ index 42106f5..837d3fb 100644 extern int read_block(int, long long, long long *, int, void *); diff --git a/squashfs-tools/unsquashfs.c b/squashfs-tools/unsquashfs.c -index f190e96..927e441 100644 +index 727f1d5..00615ce 100644 --- a/squashfs-tools/unsquashfs.c +++ b/squashfs-tools/unsquashfs.c -@@ -32,7 +32,12 @@ +@@ -32,8 +32,13 @@ #include "stdarg.h" #include "fnmatch_compat.h" @@ -297,21 +214,22 @@ index f190e96..927e441 100644 +#include +#else #include + #include +#endif + #include #include #include -@@ -2185,6 +2190,7 @@ void initialise_threads(int fragment_buffer_size, int data_buffer_size) +@@ -2235,6 +2240,7 @@ void initialise_threads(int fragment_buffer_size, int data_buffer_size) sigemptyset(&sigmask); sigaddset(&sigmask, SIGQUIT); sigaddset(&sigmask, SIGHUP); + sigaddset(&sigmask, SIGALRM); - if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == -1) + if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) != 0) EXIT_UNSQUASH("Failed to set signal mask in initialise_threads" "\n"); diff --git a/squashfs-tools/unsquashfs.h b/squashfs-tools/unsquashfs.h -index 0edbd25..cea9caa 100644 +index 934618b..329eb9e 100644 --- a/squashfs-tools/unsquashfs.h +++ b/squashfs-tools/unsquashfs.h @@ -46,6 +46,10 @@ @@ -381,7 +299,7 @@ index c8e2b9b..7d4f7af 100644 } diff --git a/squashfs-tools/unsquashfs_xattr.c b/squashfs-tools/unsquashfs_xattr.c -index 59f4aae..13f0e35 100644 +index 7742dfe..26ccd39 100644 --- a/squashfs-tools/unsquashfs_xattr.c +++ b/squashfs-tools/unsquashfs_xattr.c @@ -27,6 +27,11 @@ @@ -397,7 +315,7 @@ index 59f4aae..13f0e35 100644 extern int root_process; diff --git a/squashfs-tools/xattr.c b/squashfs-tools/xattr.c -index b46550c..5b32eca 100644 +index 64dfd82..9c4532d 100644 --- a/squashfs-tools/xattr.c +++ b/squashfs-tools/xattr.c @@ -22,6 +22,14 @@ @@ -429,3 +347,6 @@ index b46550c..5b32eca 100644 #include "squashfs_fs.h" #include "squashfs_swap.h" #include "mksquashfs.h" +-- +2.23.0 + From f6e8ee75338e2322513f5bd05b73f2e8f06eaf55 Mon Sep 17 00:00:00 2001 From: Ruud van Asseldonk Date: Tue, 10 Sep 2019 21:02:51 +0200 Subject: [PATCH 4/4] squashfsTools: use updated Darwin patch This new patch is the patch between 4.4, and commit [1], a pull request at [2] to upsteam Mac and BSD compatibility. That pull request is itself a rebase of an older pull request for an earlier version of squashfs-tools. I squashed all commits between 4.4 and [1], apart from the BSD-specific ones, and exported the new patch from that. Attached below is the git diff --ignore-space-change between squashfs-tools 4.4 with the previous patch applied, and with the new patch applied. [1]: 7d31beec53e6245d3405d6ef2b96e9811ae07044 [2]: https://github.com/plougher/squashfs-tools/pull/69 --- diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c index 8efefe6..5c2f835 100644 --- a/squashfs-tools/info.c +++ b/squashfs-tools/info.c @@ -159,7 +159,7 @@ void *info_thrd(void *arg) case EINTR: continue; default: - BAD_ERROR("sigwaitfailed " + BAD_ERROR("sigwait failed " "because %s\n", strerror(errno)); } } diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c index 67d86a5..3607448 100644 --- a/squashfs-tools/mksquashfs.c +++ b/squashfs-tools/mksquashfs.c @@ -35,7 +35,10 @@ #include #include #include -#ifdef linux +#ifndef linux +#include +#else +#include #include #endif #include @@ -52,7 +55,6 @@ #include #include #include -#include #ifndef FNM_EXTMATCH /* glibc extension */ #define FNM_EXTMATCH 0 @@ -5191,7 +5193,17 @@ int parse_mode(char *arg, mode_t *res) int get_physical_memory() { + /* + * Long longs are used here because with PAE, a 32-bit + * machine can have more than 4GB of physical memory + * + * sysconf(_SC_PHYS_PAGES) relies on /proc being mounted. + * If it fails use sysinfo, if that fails return 0 + */ + long long num_pages = sysconf(_SC_PHYS_PAGES); + long long page_size = sysconf(_SC_PAGESIZE); int phys_mem; + #ifndef linux #ifdef HW_MEMSIZE #define SYSCTL_PHYSMEM HW_MEMSIZE @@ -5221,16 +5233,6 @@ int get_physical_memory() } #undef SYSCTL_PHYSMEM #else - /* - * Long longs are used here because with PAE, a 32-bit - * machine can have more than 4GB of physical memory - * - * sysconf(_SC_PHYS_PAGES) relies on /proc being mounted. - * If it fails use sysinfo, if that fails return 0 - */ - long long num_pages = sysconf(_SC_PHYS_PAGES); - long long page_size = sysconf(_SC_PAGESIZE); - if(num_pages == -1 || page_size == -1) { struct sysinfo sys; int res = sysinfo(&sys); diff --git a/squashfs-tools/mksquashfs.h b/squashfs-tools/mksquashfs.h index 88d0b5c..1beefef 100644 --- a/squashfs-tools/mksquashfs.h +++ b/squashfs-tools/mksquashfs.h @@ -24,7 +24,6 @@ * mksquashfs.h * */ -#include struct dir_info { char *pathname; diff --git a/squashfs-tools/pseudo.c b/squashfs-tools/pseudo.c index f8fd529..48e6b27 100644 --- a/squashfs-tools/pseudo.c +++ b/squashfs-tools/pseudo.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/squashfs-tools/unsquashfs.c b/squashfs-tools/unsquashfs.c index 00615ce..c1a6183 100644 --- a/squashfs-tools/unsquashfs.c +++ b/squashfs-tools/unsquashfs.c @@ -38,7 +38,6 @@ #include #include #endif - #include #include #include @@ -1085,7 +1084,7 @@ int create_inode(char *pathname, struct inode *i) break; case SQUASHFS_SYMLINK_TYPE: case SQUASHFS_LSYMLINK_TYPE: { - struct timespec times[2] = { + struct timeval times[2] = { { i->time, 0 }, { i->time, 0 } }; @@ -1104,8 +1103,7 @@ int create_inode(char *pathname, struct inode *i) goto failed; } - res = utimensat(AT_FDCWD, pathname, times, - AT_SYMLINK_NOFOLLOW); + res = lutimes(pathname, times); if(res == -1) { EXIT_UNSQUASH_STRICT("create_inode: failed to set time on " "%s, because %s\n", pathname, --- pkgs/tools/filesystems/squashfs/darwin.patch | 141 ++++++++++--------- 1 file changed, 73 insertions(+), 68 deletions(-) diff --git a/pkgs/tools/filesystems/squashfs/darwin.patch b/pkgs/tools/filesystems/squashfs/darwin.patch index 28d70cdf03d1..eb2dc24ec1a8 100644 --- a/pkgs/tools/filesystems/squashfs/darwin.patch +++ b/pkgs/tools/filesystems/squashfs/darwin.patch @@ -1,5 +1,11 @@ +Patch based on commits by Dave Vasilevsky and +Blake Riley , squashed into a single patch, +with BSD-specific changes omitted. + +See also https://github.com/plougher/squashfs-tools/pull/69. + diff --git a/squashfs-tools/action.c b/squashfs-tools/action.c -index 4b06ccb..26365e7 100644 +index 4b06ccb..3cad2ab 100644 --- a/squashfs-tools/action.c +++ b/squashfs-tools/action.c @@ -38,6 +38,10 @@ @@ -7,7 +13,7 @@ index 4b06ccb..26365e7 100644 #include +#ifndef FNM_EXTMATCH /* glibc extension */ -+ #define FNM_EXTMATCH 0 ++ #define FNM_EXTMATCH 0 +#endif + #include "squashfs_fs.h" @@ -28,7 +34,7 @@ index 4b06ccb..26365e7 100644 /* diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c -index fe23d78..8efefe6 100644 +index fe23d78..5c2f835 100644 --- a/squashfs-tools/info.c +++ b/squashfs-tools/info.c @@ -144,31 +144,22 @@ void dump_state() @@ -37,12 +43,12 @@ index fe23d78..8efefe6 100644 sigset_t sigmask; - struct timespec timespec = { .tv_sec = 1, .tv_nsec = 0 }; - int sig, waiting = 0; -+ int sig, err, waiting = 0; ++ int sig, err, waiting = 0; sigemptyset(&sigmask); sigaddset(&sigmask, SIGQUIT); sigaddset(&sigmask, SIGHUP); -+ sigaddset(&sigmask, SIGALRM); ++ sigaddset(&sigmask, SIGALRM); while(1) { - if(waiting) @@ -64,7 +70,7 @@ index fe23d78..8efefe6 100644 continue; default: - BAD_ERROR("sigtimedwait/sigwaitinfo failed " -+ BAD_ERROR("sigwaitfailed " ++ BAD_ERROR("sigwait failed " "because %s\n", strerror(errno)); } } @@ -83,21 +89,35 @@ index fe23d78..8efefe6 100644 } diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index a45b77f..6d186ea 100644 +index a45b77f..3607448 100644 --- a/squashfs-tools/mksquashfs.c +++ b/squashfs-tools/mksquashfs.c -@@ -52,6 +52,10 @@ - #include - #include - -+#ifndef FNM_EXTMATCH /* glibc extension */ -+ #define FNM_EXTMATCH 0 +@@ -35,7 +35,12 @@ + #include + #include + #include ++#ifndef linux ++#include ++#else ++#include + #include +#endif + #include + #include + #include +@@ -50,7 +55,10 @@ + #include + #include + #include +-#include + ++#ifndef FNM_EXTMATCH /* glibc extension */ ++ #define FNM_EXTMATCH 0 ++#endif + #ifndef linux #define __BYTE_ORDER BYTE_ORDER - #define __BIG_ENDIAN BIG_ENDIAN -@@ -4348,6 +4352,7 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, +@@ -4348,6 +4356,7 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, sigemptyset(&sigmask); sigaddset(&sigmask, SIGQUIT); sigaddset(&sigmask, SIGHUP); @@ -105,11 +125,10 @@ index a45b77f..6d186ea 100644 if(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) != 0) BAD_ERROR("Failed to set signal mask in intialise_threads\n"); -@@ -5184,6 +5189,36 @@ int parse_mode(char *arg, mode_t *res) +@@ -5195,6 +5204,35 @@ int get_physical_memory() + long long page_size = sysconf(_SC_PAGESIZE); + int phys_mem; - int get_physical_memory() - { -+ int phys_mem; +#ifndef linux + #ifdef HW_MEMSIZE + #define SYSCTL_PHYSMEM HW_MEMSIZE @@ -137,20 +156,12 @@ index a45b77f..6d186ea 100644 + ERROR_EXIT(" Defaulting to least viable amount\n"); + phys_mem = SQUASHFS_LOWMEM; + } -+ #undef SYSCTL_PHYSMEM ++ #undef SYSCTL_PHYSMEM +#else - /* - * Long longs are used here because with PAE, a 32-bit - * machine can have more than 4GB of physical memory -@@ -5193,7 +5228,6 @@ int get_physical_memory() - */ - long long num_pages = sysconf(_SC_PHYS_PAGES); - long long page_size = sysconf(_SC_PAGESIZE); -- int phys_mem; - if(num_pages == -1 || page_size == -1) { struct sysinfo sys; -@@ -5207,6 +5241,7 @@ int get_physical_memory() + int res = sysinfo(&sys); +@@ -5207,6 +5245,7 @@ int get_physical_memory() } phys_mem = num_pages * page_size >> 20; @@ -158,30 +169,6 @@ index a45b77f..6d186ea 100644 if(phys_mem < SQUASHFS_LOWMEM) BAD_ERROR("Mksquashfs requires more physical memory than is " -diff --git a/squashfs-tools/mksquashfs.h b/squashfs-tools/mksquashfs.h -index 1beefef..88d0b5c 100644 ---- a/squashfs-tools/mksquashfs.h -+++ b/squashfs-tools/mksquashfs.h -@@ -24,6 +24,7 @@ - * mksquashfs.h - * - */ -+#include - - struct dir_info { - char *pathname; -diff --git a/squashfs-tools/pseudo.c b/squashfs-tools/pseudo.c -index 48e6b27..f8fd529 100644 ---- a/squashfs-tools/pseudo.c -+++ b/squashfs-tools/pseudo.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/squashfs-tools/read_xattrs.c b/squashfs-tools/read_xattrs.c index 4debedf..3257c30 100644 --- a/squashfs-tools/read_xattrs.c @@ -203,10 +190,10 @@ index 4debedf..3257c30 100644 extern int read_block(int, long long, long long *, int, void *); diff --git a/squashfs-tools/unsquashfs.c b/squashfs-tools/unsquashfs.c -index 727f1d5..00615ce 100644 +index 727f1d5..c1a6183 100644 --- a/squashfs-tools/unsquashfs.c +++ b/squashfs-tools/unsquashfs.c -@@ -32,8 +32,13 @@ +@@ -32,8 +32,12 @@ #include "stdarg.h" #include "fnmatch_compat.h" @@ -216,11 +203,29 @@ index 727f1d5..00615ce 100644 #include #include +#endif -+ #include #include #include -@@ -2235,6 +2240,7 @@ void initialise_threads(int fragment_buffer_size, int data_buffer_size) +@@ -1080,7 +1084,7 @@ int create_inode(char *pathname, struct inode *i) + break; + case SQUASHFS_SYMLINK_TYPE: + case SQUASHFS_LSYMLINK_TYPE: { +- struct timespec times[2] = { ++ struct timeval times[2] = { + { i->time, 0 }, + { i->time, 0 } + }; +@@ -1099,8 +1103,7 @@ int create_inode(char *pathname, struct inode *i) + goto failed; + } + +- res = utimensat(AT_FDCWD, pathname, times, +- AT_SYMLINK_NOFOLLOW); ++ res = lutimes(pathname, times); + if(res == -1) { + EXIT_UNSQUASH_STRICT("create_inode: failed to set time on " + "%s, because %s\n", pathname, +@@ -2235,6 +2238,7 @@ void initialise_threads(int fragment_buffer_size, int data_buffer_size) sigemptyset(&sigmask); sigaddset(&sigmask, SIGQUIT); sigaddset(&sigmask, SIGHUP); @@ -229,7 +234,7 @@ index 727f1d5..00615ce 100644 EXIT_UNSQUASH("Failed to set signal mask in initialise_threads" "\n"); diff --git a/squashfs-tools/unsquashfs.h b/squashfs-tools/unsquashfs.h -index 934618b..329eb9e 100644 +index 934618b..0e680ab 100644 --- a/squashfs-tools/unsquashfs.h +++ b/squashfs-tools/unsquashfs.h @@ -46,6 +46,10 @@ @@ -237,7 +242,7 @@ index 934618b..329eb9e 100644 #include +#ifndef FNM_EXTMATCH /* glibc extension */ -+ #define FNM_EXTMATCH 0 ++ #define FNM_EXTMATCH 0 +#endif + #ifndef linux @@ -299,7 +304,7 @@ index c8e2b9b..7d4f7af 100644 } diff --git a/squashfs-tools/unsquashfs_xattr.c b/squashfs-tools/unsquashfs_xattr.c -index 7742dfe..26ccd39 100644 +index 7742dfe..f8cd3b6 100644 --- a/squashfs-tools/unsquashfs_xattr.c +++ b/squashfs-tools/unsquashfs_xattr.c @@ -27,6 +27,11 @@ @@ -307,15 +312,15 @@ index 7742dfe..26ccd39 100644 #include +#ifdef XATTR_NOFOLLOW /* Apple's xattrs */ -+ #define lsetxattr(path_, name_, val_, sz_, flags_) \ -+ setxattr(path_, name_, val_, sz_, 0, flags_ | XATTR_NOFOLLOW) ++ #define lsetxattr(path_, name_, val_, sz_, flags_) \ ++ setxattr(path_, name_, val_, sz_, 0, flags_ | XATTR_NOFOLLOW) +#endif + #define NOSPACE_MAX 10 extern int root_process; diff --git a/squashfs-tools/xattr.c b/squashfs-tools/xattr.c -index 64dfd82..9c4532d 100644 +index 64dfd82..d82d186 100644 --- a/squashfs-tools/xattr.c +++ b/squashfs-tools/xattr.c @@ -22,6 +22,14 @@ @@ -338,10 +343,10 @@ index 64dfd82..9c4532d 100644 #include +#ifdef XATTR_NOFOLLOW /* Apple's xattrs */ -+ #define llistxattr(path_, buf_, sz_) \ -+ listxattr(path_, buf_, sz_, XATTR_NOFOLLOW) -+ #define lgetxattr(path_, name_, val_, sz_) \ -+ getxattr(path_, name_, val_, sz_, 0, XATTR_NOFOLLOW) ++ #define llistxattr(path_, buf_, sz_) \ ++ listxattr(path_, buf_, sz_, XATTR_NOFOLLOW) ++ #define lgetxattr(path_, name_, val_, sz_) \ ++ getxattr(path_, name_, val_, sz_, 0, XATTR_NOFOLLOW) +#endif + #include "squashfs_fs.h"