From 3df77056c1bfbbdd21b2a39f5bd44993a7164822 Mon Sep 17 00:00:00 2001 From: jbl007 Date: Sun, 24 Aug 2014 18:07:32 +0200 Subject: [PATCH 1/5] support for Amiga protection bits and create_system --- README | 3 +++ lhafile/lhafile.py | 27 ++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/README b/README index acf6c30..bed709a 100644 --- a/README +++ b/README @@ -6,3 +6,6 @@ Changes include: * Support file notes (as found in Amiga .lha files). * Support for archives with ISO-8859-1 filenames. * Fixed a bug causing crashes in lzhlib. +* Support for Amiga protection bits +* Support for archive create system + diff --git a/lhafile/lhafile.py b/lhafile/lhafile.py index 4e33772..0746d30 100644 --- a/lhafile/lhafile.py +++ b/lhafile/lhafile.py @@ -212,11 +212,12 @@ def _RealGetContent(self): filename, crc = unpack('<%dsH' % filename_length, fp.read(filename_length + 2)) if os_level == 0: ext_header_size = 0 + os_identifier = None pass elif os_level == 1: extra_data_size = header_size - (5+4+4+2+2+1+1+1+filename_length+2+1+2) os_identifier, extra_data, ext_header_size \ - = unpack(' Date: Sun, 1 Feb 2015 13:46:53 +0100 Subject: [PATCH 2/5] be less stict detecting amiga archives --- lhafile/lhafile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lhafile/lhafile.py b/lhafile/lhafile.py index 0746d30..3cc619b 100644 --- a/lhafile/lhafile.py +++ b/lhafile/lhafile.py @@ -315,7 +315,7 @@ def _RealGetContent(self): create_system = os_identifiers.get(os_identifier) # set protection bits for Amiga archives - if create_system == 'Amiga': + if create_system == 'Amiga' or ( os_level == 0 and reserved not in (0x20, 0x80) ): flag_bits_bin = bin(reserved)[2:].zfill(8) flag_bits_bin_flipped = flag_bits_bin[:4] + ''.join( '1' if x == '0' else '0' for x in flag_bits_bin[4:]) From 8ffb9ec524ed930d7897588a5e591a15ecdcca86 Mon Sep 17 00:00:00 2001 From: jbl007 Date: Thu, 19 Oct 2017 17:59:59 +0200 Subject: [PATCH 3/5] get flag_bits using bitwise xor --- lhafile/lhafile.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lhafile/lhafile.py b/lhafile/lhafile.py index 0a458a6..b94126f 100644 --- a/lhafile/lhafile.py +++ b/lhafile/lhafile.py @@ -309,7 +309,7 @@ def _RealGetContent(self): filename = os.path.join(directory, filename) # OSIDs based on - # http://homepage1.nifty.com/dangan/en/Content/Program/Java/jLHA/Notes/OSID.html + # http://dangan.g.dgdg.jp/en/Content/Program/Java/jLHA/Notes/Notes.html os_identifiers = { 0x41: 'Amiga', 0x4D: 'MS-DOS', 0x32: 'OS/2', 0x39: 'OS-9', 0x4B: 'OS/68K', 0x33: 'OS/386', 0x48: 'Human68K', 0x55: 'UNIX', 0x43: 'CP/M', 0x46: 'FLEX', 0x6D: 'Macintosh', 0x52: 'Runser', @@ -319,15 +319,13 @@ def _RealGetContent(self): # set protection bits for Amiga archives if create_system == 'Amiga' or ( os_level == 0 and reserved not in (0x20, 0x80) ): - flag_bits_bin = bin(reserved)[2:].zfill(8) - flag_bits_bin_flipped = flag_bits_bin[:4] + ''.join( - '1' if x == '0' else '0' for x in flag_bits_bin[4:]) - default_flags = flag_bits = 'hsparwed' - for flag, bit in zip(default_flags, flag_bits_bin_flipped): - if bit == '0': - flag_bits = flag_bits.replace(flag, '-') + flag_bits_bin = bin(reserved ^ 0b00001111)[2:].zfill(8) + default_flags = 'hsparwed' + flag_bits = ''.join([ flag[1] if flag[0] == '1' else '-' for flag in zip( + flag_bits_bin, default_flags)]) else: flag_bits = None + print(reserved, bin(reserved)) info.directory = directory info.filename = filename From ac8fe3d3ecf119faab573c2ae769b29f8247c857 Mon Sep 17 00:00:00 2001 From: jbl007 Date: Thu, 19 Oct 2017 18:03:02 +0200 Subject: [PATCH 4/5] removed useless print statement --- lhafile/lhafile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lhafile/lhafile.py b/lhafile/lhafile.py index b94126f..06ddd4a 100644 --- a/lhafile/lhafile.py +++ b/lhafile/lhafile.py @@ -325,7 +325,6 @@ def _RealGetContent(self): flag_bits_bin, default_flags)]) else: flag_bits = None - print(reserved, bin(reserved)) info.directory = directory info.filename = filename From 59780261cc033d944e58e7f113901b85d8486d47 Mon Sep 17 00:00:00 2001 From: jbl007 Date: Sun, 22 Oct 2017 15:10:47 +0200 Subject: [PATCH 5/5] OS ID fixes --- lhafile/lhafile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lhafile/lhafile.py b/lhafile/lhafile.py index 06ddd4a..b04247c 100644 --- a/lhafile/lhafile.py +++ b/lhafile/lhafile.py @@ -309,13 +309,13 @@ def _RealGetContent(self): filename = os.path.join(directory, filename) # OSIDs based on - # http://dangan.g.dgdg.jp/en/Content/Program/Java/jLHA/Notes/Notes.html + # http://dangan.g.dgdg.jp/en/Content/Program/Java/jLHA/Notes/OSID.html os_identifiers = { 0x41: 'Amiga', 0x4D: 'MS-DOS', 0x32: 'OS/2', 0x39: 'OS-9', 0x4B: 'OS/68K', 0x33: 'OS/386', 0x48: 'Human68K', 0x55: 'UNIX', 0x43: 'CP/M', 0x46: 'FLEX', 0x6D: 'Macintosh', 0x52: 'Runser', 0x54: 'TownOS', 0x58: 'XOSK', 0x77: 'Windows95', 0x57: 'WindowsNT', - 0x00: 'MS-DOS', 0x4A: 'Java' } - create_system = os_identifiers.get(os_identifier) + 0x00: 'generic/MS-DOS', 0x4A: 'Java' } + create_system = os_identifiers.get(os_identifier, '') # set protection bits for Amiga archives if create_system == 'Amiga' or ( os_level == 0 and reserved not in (0x20, 0x80) ):