2 # -*- coding: utf-8 -*-
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the Revised BSD License.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 Revised BSD License for more details.
13 Copyright 2018-2024 Cool Dude 2k - http://idb.berlios.de/
14 Copyright 2018-2024 Game Maker 2k - http://intdb.sourceforge.net/
15 Copyright 2018-2024 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
17 $FileInfo: pycatfile.py - Last Update: 3/8/2024 Ver. 0.3.4 RC 1 - Author: cooldude2k $
20 from __future__
import absolute_import
, division
, print_function
, unicode_literals
;
21 import io
, os
, re
, sys
, time
, stat
, zlib
, base64
, shutil
, hashlib
, datetime
, logging
, binascii
, tempfile
, zipfile
, ftplib
;
23 if os
.name
== 'nt': # Only modify if on Windows
24 if sys
.version
[0] == "2":
26 sys
.stdout
= codecs
.getwriter('utf-8')(sys
.stdout
);
27 sys
.stderr
= codecs
.getwriter('utf-8')(sys
.stderr
);
30 sys
.stdout
= io
.TextIOWrapper(sys
.stdout
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
31 sys
.stderr
= io
.TextIOWrapper(sys
.stderr
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
33 hashlib_guaranteed
= False;
34 os
.environ
["PYTHONIOENCODING"] = "UTF-8";
35 os
.environ
["LC_CTYPE"] = "UTF-8";
39 sys
.setdefaultencoding('UTF-8');
42 except AttributeError:
46 except AttributeError:
50 import simplejson
as json
;
55 from zlib
import crc32
;
57 from binascii
import crc32
;
59 rarfile_support
= False;
62 rarfile_support
= True;
64 rarfile_support
= False;
67 from safetar
import is_tarfile
;
70 from xtarfile
import is_tarfile
;
72 from tarfile
import is_tarfile
;
75 import safetar
as tarfile
;
78 import xtarfile
as tarfile
;
82 if(sys
.version
[0]=="2"):
84 from io
import StringIO
, BytesIO
;
87 from cStringIO
import StringIO
;
88 from cStringIO
import StringIO
as BytesIO
;
90 from StringIO
import StringIO
;
91 from StringIO
import StringIO
as BytesIO
;
92 elif(sys
.version
[0]>="3"):
93 from io
import StringIO
, BytesIO
;
98 from cStringIO
import StringIO
as BytesIO
;
104 from StringIO
import StringIO
as BytesIO
;
110 from io
import BytesIO
;
115 __file_format_name__
= "CatFile";
116 __program_name__
= "Py"+__file_format_name__
;
117 __file_format_lower__
= __file_format_name__
.lower();
118 __file_format_len__
= len(__file_format_name__
);
119 __file_format_hex__
= binascii
.hexlify(__file_format_name__
.encode("UTF-8")).decode("UTF-8");
120 __file_format_delimiter__
= "\x00";
121 __file_format_ver__
= "001";
122 __use_new_style__
= True;
123 __file_format_list__
= [__file_format_name__
, __file_format_lower__
, __file_format_len__
, __file_format_hex__
, __file_format_delimiter__
, __file_format_ver__
, __use_new_style__
];
124 __project__
= __program_name__
;
125 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
126 __version_info__
= (0, 3, 4, "RC 1", 1);
127 __version_date_info__
= (2024, 3, 3, "RC 1", 1);
128 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
129 __revision__
= __version_info__
[3];
130 __revision_id__
= "$Id$";
131 if(__version_info__
[4] is not None):
132 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
133 if(__version_info__
[4] is None):
134 __version_date_plusrc__
= __version_date__
;
135 if(__version_info__
[3] is not None):
136 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
137 if(__version_info__
[3] is None):
138 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
140 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'xz', 'lz4', 'lzo', 'lzma'];
141 outextlist
= ['gz', 'bz2', 'zst', 'xz', 'lz4', 'lzo', 'lzma'];
142 outextlistwd
= ['.gz', '.bz2', '.zst', '.xz', '.lz4', '.lzo', '.lzma'];
144 tarfile_mimetype
= "application/tar";
145 tarfile_tar_mimetype
= tarfile_mimetype
;
146 zipfile_mimetype
= "application/zip";
147 zipfile_zip_mimetype
= zipfile_mimetype
;
148 rarfile_mimetype
= "application/rar";
149 rarfile_rar_mimetype
= rarfile_mimetype
;
150 archivefile_mimetype
= "application/x-"+__file_format_list__
[1]+"";
151 archivefile_cat_mimetype
= archivefile_mimetype
;
152 archivefile_gzip_mimetype
= "application/x-"+__file_format_list__
[1]+"+gzip";
153 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
154 archivefile_bzip2_mimetype
= "application/x-"+__file_format_list__
[1]+"+bzip2";
155 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
156 archivefile_lz4_mimetype
= "application/x-"+__file_format_list__
[1]+"+lz4";
157 archivefile_lzop_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzop";
158 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
159 archivefile_zstandard_mimetype
= "application/x-"+__file_format_list__
[1]+"+zstandard";
160 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
161 archivefile_lzma_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzma";
162 archivefile_xz_mimetype
= "application/x-"+__file_format_list__
[1]+"+xz";
163 archivefile_extensions
= ['.cat', '.cat.gz', '.cat.bz2', '.cat.zst', '.cat.lz4', '.cat.lzo', '.cat.lzop', '.cat.lzma', '.cat.xz'];
165 if __name__
== "__main__":
167 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
171 curscrpath
= curscrpath
.replace(os
.sep
, "/");
172 curscrpath
= curscrpath
+ "/";
173 scrfile
= curscrpath
+ "catfile.py";
174 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
175 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
178 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
184 "warning": logging
.warning
,
185 "error": logging
.error
,
186 "critical": logging
.critical
,
187 "exception": logging
.exception
,
188 "logalt": lambda x
: logging
.log(dgblevel
, x
),
189 "debug": logging
.debug
191 log_function
= log_functions
.get(outtype
);
193 log_function(dbgtxt
);
197 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
198 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
201 def RemoveWindowsPath(dpath
):
205 dpath
= dpath
.replace(os
.path
.sep
, "/");
206 dpath
= dpath
.rstrip("/");
207 if(dpath
=="." or dpath
==".."):
211 def NormalizeRelativePath(inpath
):
212 inpath
= RemoveWindowsPath(inpath
);
213 if(os
.path
.isabs(inpath
)):
216 if(inpath
.startswith("./") or inpath
.startswith("../")):
219 outpath
= "./" + inpath
;
222 def ListDir(dirpath
, followlink
=False, duplicates
=False):
223 if(isinstance(dirpath
, (list, tuple, ))):
224 dirpath
= list(filter(None, dirpath
));
225 elif(isinstance(dirpath
, (str, ))):
226 dirpath
= list(filter(None, [dirpath
]));
228 for mydirfile
in dirpath
:
229 if(not os
.path
.exists(mydirfile
)):
231 mydirfile
= NormalizeRelativePath(mydirfile
);
232 if(os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
)):
233 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
234 if(os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
)):
235 for root
, dirs
, filenames
in os
.walk(mydirfile
):
237 dpath
= RemoveWindowsPath(dpath
);
238 if(dpath
not in retlist
and not duplicates
):
239 retlist
.append(dpath
);
241 retlist
.append(dpath
);
242 for file in filenames
:
243 fpath
= os
.path
.join(root
, file);
244 fpath
= RemoveWindowsPath(fpath
);
245 if(fpath
not in retlist
and not duplicates
):
246 retlist
.append(fpath
);
248 retlist
.append(fpath
);
250 retlist
.append(RemoveWindowsPath(mydirfile
));
253 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
254 if isinstance(dirpath
, (list, tuple)):
255 dirpath
= list(filter(None, dirpath
));
256 elif isinstance(dirpath
, str):
257 dirpath
= list(filter(None, [dirpath
]));
259 for mydirfile
in dirpath
:
260 if not os
.path
.exists(mydirfile
):
262 mydirfile
= NormalizeRelativePath(mydirfile
);
263 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
264 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
))
265 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
266 for root
, dirs
, filenames
in os
.walk(mydirfile
):
267 # Sort dirs and filenames alphabetically in place
268 dirs
.sort(key
=lambda x
: x
.lower());
269 filenames
.sort(key
=lambda x
: x
.lower());
270 dpath
= RemoveWindowsPath(root
);
271 if not duplicates
and dpath
not in retlist
:
272 retlist
.append(dpath
);
274 retlist
.append(dpath
);
275 for file in filenames
:
276 fpath
= os
.path
.join(root
, file);
277 fpath
= RemoveWindowsPath(fpath
);
278 if not duplicates
and fpath
not in retlist
:
279 retlist
.append(fpath
);
281 retlist
.append(fpath
);
283 retlist
.append(RemoveWindowsPath(mydirfile
));
286 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
287 # Define a new function that wraps the target function
288 def alias_function(*args
, **kwargs
):
289 return target_function(*args
, **kwargs
);
291 # Create the function name by combining the prefix, base name, and the suffix
292 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
294 # Add the new function to the global namespace
295 globals()[function_name
] = alias_function
;
297 # initial_value can be 0xFFFF or 0x0000
298 def crc16_ansi(msg
, initial_value
=0xFFFF):
299 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
300 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
301 crc
= initial_value
; # Initial value
303 crc ^
= b
<< 8; # XOR byte into CRC top byte
304 for _
in range(8): # Process each bit
305 if crc
& 0x8000: # If the top bit is set
306 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
308 crc
= crc
<< 1; # Just shift left
309 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
312 # initial_value can be 0xFFFF or 0x0000
313 def crc16_ibm(msg
, initial_value
=0xFFFF):
314 return crc16_ansi(msg
, initial_value
);
316 # initial_value is 0xFFFF
318 return crc16_ansi(msg
, 0xFFFF);
320 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
321 def crc16_ccitt(msg
, initial_value
=0xFFFF):
322 # CRC-16-CCITT polynomial
323 poly
= 0x1021; # Polynomial for CRC-16-CCITT
324 # Use the specified initial value
327 crc ^
= b
<< 8; # XOR byte into CRC top byte
328 for _
in range(8): # Process each bit
329 if crc
& 0x8000: # If the top bit is set
330 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
332 crc
= crc
<< 1; # Just shift left
333 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
336 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
337 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
338 # CRC-64-ECMA polynomial and initial value
339 poly
= 0x42F0E1EBA9EA3693;
340 crc
= initial_value
; # Initial value for CRC-64-ECMA
342 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
343 for _
in range(8): # Process each bit
344 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
345 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
347 crc
<<= 1; # Just shift left if the MSB is 0
348 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
351 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
352 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
353 # CRC-64-ISO polynomial and initial value
354 poly
= 0x000000000000001B;
355 crc
= initial_value
; # Common initial value for CRC-64-ISO
357 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
358 for _
in range(8): # Process each bit
359 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
360 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
362 crc
<<= 1; # Just shift left if the MSB is 0
363 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
366 def ReadTillNullByte(fp
, delimiter
=__file_format_delimiter__
):
369 nullbyte
= delimiter
.encode("UTF-8");
371 curbyte
= fp
.read(1);
372 if(curbyte
==nullbyte
or not curbyte
):
374 curfullbyte
= curfullbyte
+ curbyte
;
375 return curfullbyte
.decode('UTF-8');
377 def ReadUntilNullByte(fp
, delimiter
=__file_format_delimiter__
):
378 return ReadTillNullByte(fp
, delimiter
);
380 def SeekToEndOfFile(fp
):
384 if(lasttell
==fp
.tell()):
386 lasttell
= fp
.tell();
389 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
393 while(rocount
<roend
):
394 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
395 rocount
= rocount
+ 1;
398 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_delimiter__
):
399 headerpresize
= ReadTillNullByte(fp
, delimiter
);
400 headersize
= int(headerpresize
, 16);
401 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
404 roend
= int(len(headercontent
));
405 HeaderOut
= [headerpresize
];
406 while(rocount
<roend
):
407 HeaderOut
.append(headercontent
[rocount
]);
408 rocount
= rocount
+ 1;
411 def ReadFileHeaderDataByList(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
413 roend
= int(len(listval
));
415 while(rocount
<roend
):
416 RoundArray
= {listval
[rocount
]: ReadTillNullByte(fp
, delimiter
)};
417 HeaderOut
.update(RoundArray
);
418 rocount
= rocount
+ 1;
421 def ReadFileHeaderDataByListSize(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
422 headerpresize
= ReadTillNullByte(fp
, delimiter
);
423 headersize
= int(headerpresize
, 16);
424 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
428 roend
= int(len(headercontent
));
429 HeaderOut
= {listval
[0]: headerpresize
};
430 while(rocount
<roend
):
431 RoundArray
= {listval
[rocount
]: headercontent
[rocount
]};
432 HeaderOut
.update(RoundArray
);
433 rocount
= rocount
+ 1;
434 listcount
= listcount
+ 1;
437 def AppendNullByte(indata
, delimiter
=__file_format_delimiter__
):
438 outdata
= str(indata
) + delimiter
;
441 def AppendNullBytes(indata
=[], delimiter
=__file_format_delimiter__
):
446 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
450 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_delimiter__
):
451 """Read bytes from file pointer until a null byte is encountered."""
452 bytes_list
= [] # Use list for efficient append operation.
454 cur_byte
= fp
.read(1);
455 if cur_byte
== delimiter
.encode() or not cur_byte
:
457 bytes_list
.append(cur_byte
);
458 return b
''.join(bytes_list
).decode('UTF-8');
460 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_delimiter__
):
461 return ReadTillNullByteAlt(fp
, delimiter
);
463 def ReadFileHeaderDataAlt(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
464 """Read multiple null-byte terminated strings from a file."""
466 for round_count
in range(rounds
):
467 header_out
[round_count
] = ReadTillNullByteAlt(fp
, delimiter
);
470 def ReadFileHeaderDataBySizeAlt(fp
, delimiter
=__file_format_delimiter__
):
471 # Read and convert header size from hexadecimal to integer
472 header_pre_size
= ReadTillNullByte(fp
, delimiter
);
473 header_size
= int(header_pre_size
, 16);
474 # Read and split the header content
475 header_content
= str(fp
.read(header_size
).decode('UTF-8')).split(delimiter
);
477 # Prepend the pre-size and return the combined list
478 return [header_pre_size
] + header_content
;
480 def ReadFileHeaderDataByListSizeAlt(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
481 # Read the size and content from the header
482 header_pre_size
= ReadTillNullByte(fp
, delimiter
);
483 header_size
= int(header_pre_size
, 16);
484 header_content
= str(fp
.read(header_size
).decode('UTF-8')).split(delimiter
);
486 # Initialize HeaderOut with the header pre-size if listval is not empty
487 HeaderOut
= {listval
[0]: header_pre_size
} if listval
else {};
488 # Map the remaining listval items to their corresponding header content, starting from the second item
489 for i
in range(1, min(len(header_content
) + 1, len(listval
))):
490 HeaderOut
[listval
[i
]] = header_content
[i
- 1]; # -1 because header_content is 0-indexed
493 def ReadFileHeaderDataByListAlt(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
494 """Read multiple null-byte terminated strings from a file."""
496 for round_count
in listval
:
497 header_out
.append(ReadTillNullByteAlt(fp
, delimiter
));
500 def AppendNullByteAlt(indata
, delimiter
=__file_format_delimiter__
):
501 """Append a null byte to the given data."""
502 return str(indata
) + delimiter
;
504 def AppendNullBytesAlt(indata
=[], delimiter
=__file_format_delimiter__
):
505 """Append a null byte to each element in the list and concatenate."""
506 return delimiter
.join(map(str, indata
)) + delimiter
; # Efficient concatenation with null byte.
508 def PrintPermissionString(fchmode
, ftype
):
509 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
511 for fmodval
in str(oct(fchmode
))[-3:]:
512 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
513 if(ftype
==0 or ftype
==7):
514 permissionstr
= "-" + permissionstr
;
516 permissionstr
= "h" + permissionstr
;
518 permissionstr
= "l" + permissionstr
;
520 permissionstr
= "c" + permissionstr
;
522 permissionstr
= "b" + permissionstr
;
524 permissionstr
= "d" + permissionstr
;
526 permissionstr
= "f" + permissionstr
;
528 permissionstr
= "D" + permissionstr
;
530 permissionstr
= "p" + permissionstr
;
532 permissionstr
= "w" + permissionstr
;
534 permissionoutstr
= stat
.filemode(fchmode
);
535 except AttributeError:
536 permissionoutstr
= permissionstr
;
538 permissionoutstr
= permissionstr
;
539 return permissionoutstr
;
541 def PrintPermissionStringAlt(fchmode
, ftype
):
543 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
544 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
546 # Translate file mode into permission string
547 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
548 # Append file type indicator
550 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
551 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
553 file_type
= type_indicators
.get(ftype
, '-');
554 permissionstr
= file_type
+ permissionstr
;
556 permissionoutstr
= stat
.filemode(fchmode
);
557 except AttributeError:
558 permissionoutstr
= permissionstr
;
559 return permissionoutstr
;
561 def CompressionSupport():
562 compression_list
= [];
565 compression_list
.append("gz");
566 compression_list
.append("gzip");
571 compression_list
.append("bz2");
572 compression_list
.append("bzip2");
577 compression_list
.append("lz4");
582 compression_list
.append("lzo");
583 compression_list
.append("lzop");
588 compression_list
.append("zstd");
589 compression_list
.append("zstandard");
594 compression_list
.append("lzma");
595 compression_list
.append("xz");
598 return compression_list
;
600 def CheckCompressionType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
601 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
605 catfp
= open(infile
, "rb");
606 except FileNotFoundError
:
609 prefp
= catfp
.read(2);
611 if(prefp
==binascii
.unhexlify("1f8b")):
614 prefp
= catfp
.read(3);
615 if(prefp
==binascii
.unhexlify("425a68")):
617 if(prefp
==binascii
.unhexlify("5d0000")):
620 prefp
= catfp
.read(4);
621 if(prefp
==binascii
.unhexlify("28b52ffd")):
623 if(prefp
==binascii
.unhexlify("04224d18")):
625 if(prefp
==binascii
.unhexlify("504B0304")):
626 filetype
= "zipfile";
628 prefp
= catfp
.read(5);
629 if(prefp
==binascii
.unhexlify("7573746172")):
630 filetype
= "tarfile";
632 prefp
= catfp
.read(6);
633 if(prefp
==binascii
.unhexlify("fd377a585a00")):
636 prefp
= catfp
.read(7);
637 if(prefp
==binascii
.unhexlify("526172211a0700")):
638 filetype
= "rarfile";
639 if(prefp
==binascii
.unhexlify("43617446696c65")):
640 filetype
= "catfile";
642 prefp
= catfp
.read(8);
643 if(prefp
==binascii
.unhexlify("526172211a070100")):
644 filetype
= "rarfile";
646 prefp
= catfp
.read(formatspecs
[2]);
647 if(prefp
==binascii
.unhexlify(formatspecs
[3])):
648 filetype
= formatspecs
[1];
650 prefp
= catfp
.read(9);
651 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
654 prefp
= catfp
.read(10);
655 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
656 filetype
= "tarfile";
662 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_list__
, closefp
=True):
664 instringsfile
= BytesIO(instring
);
666 instringsfile
= BytesIO(instring
.encode("UTF-8"));
667 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
669 def GetCompressionMimeType(infile
, formatspecs
=__file_format_list__
):
670 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
671 if(compresscheck
=="gzip" or compresscheck
=="gz"):
672 return archivefile_gzip_mimetype
;
673 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
674 return archivefile_bzip2_mimetype
;
675 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
676 return archivefile_zstandard_mimetype
;
677 if(compresscheck
=="lz4"):
678 return archivefile_lz4_mimetype
;
679 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
680 return archivefile_lzop_mimetype
;
681 if(compresscheck
=="lzma"):
682 return archivefile_lzma_mimetype
;
683 if(compresscheck
=="xz"):
684 return archivefile_xz_mimetype
;
685 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
[1]):
686 return archivefile_cat_mimetype
;
687 if(not compresscheck
):
691 def UncompressArchiveFile(fp
, formatspecs
=__file_format_list__
):
692 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
694 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
695 if(compresscheck
=="gzip"):
700 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
701 if(compresscheck
=="bzip2"):
707 catfp
.write(bz2
.decompress(fp
.read()));
708 if(compresscheck
=="zstd"):
714 catfp
.write(zstandard
.decompress(fp
.read()));
715 if(compresscheck
=="lz4"):
721 catfp
.write(lz4
.frame
.decompress(fp
.read()));
722 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
728 catfp
.write(lzo
.decompress(fp
.read()));
729 if(compresscheck
=="lzma" or compresscheck
=="xz"):
735 catfp
.write(lzma
.decompress(fp
.read()));
736 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[1]):
738 if(not compresscheck
):
744 with fp
as fpcontent
:
746 catfp
.write(lzma
.decompress(fp
.read()));
747 except lzma
.LZMAError
:
751 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
753 def UncompressFile(infile
, formatspecs
=__file_format_list__
, mode
="rb"):
754 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
755 if(sys
.version_info
[0]==2 and compresscheck
):
761 if(compresscheck
=="gzip"):
767 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
768 except (ValueError, TypeError) as e
:
769 filefp
= gzip
.open(infile
, mode
);
770 if(compresscheck
=="bzip2"):
776 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
777 except (ValueError, TypeError) as e
:
778 filefp
= bz2
.open(infile
, mode
);
779 if(compresscheck
=="zstd"):
785 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
786 except (ValueError, TypeError) as e
:
787 filefp
= zstandard
.open(infile
, mode
);
788 if(compresscheck
=="lz4"):
794 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
795 except (ValueError, TypeError) as e
:
796 filefp
= lz4
.frame
.open(infile
, mode
);
797 if(compresscheck
=="lzo"):
803 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
804 except (ValueError, TypeError) as e
:
805 filefp
= lzo
.open(infile
, mode
);
806 if(compresscheck
=="lzma"):
812 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
813 except (ValueError, TypeError) as e
:
814 filefp
= lzma
.open(infile
, mode
);
815 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[1]):
817 filefp
= open(infile
, mode
, encoding
="UTF-8");
818 except (ValueError, TypeError) as e
:
819 filefp
= open(infile
, mode
);
820 if(not compresscheck
):
822 filefp
= open(infile
, mode
, encoding
="UTF-8");
823 except (ValueError, TypeError) as e
:
824 filefp
= open(infile
, mode
);
825 except FileNotFoundError
:
829 def UncompressString(infile
):
830 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
831 if(compresscheck
=="gzip"):
836 fileuz
= gzip
.decompress(infile
);
837 if(compresscheck
=="bzip2"):
842 fileuz
= bz2
.decompress(infile
);
843 if(compresscheck
=="zstd"):
848 fileuz
= zstandard
.decompress(infile
);
849 if(compresscheck
=="lz4"):
854 fileuz
= lz4
.frame
.decompress(infile
);
855 if(compresscheck
=="lzo"):
860 fileuz
= lzo
.decompress(infile
);
861 if(compresscheck
=="lzma"):
866 fileuz
= lzma
.decompress(infile
);
867 if(not compresscheck
):
869 if(hasattr(fileuz
, 'decode')):
870 fileuz
= fileuz
.decode("UTF-8");
873 def UncompressStringAlt(infile
):
875 outstring
= UncompressString(infile
);
876 filefp
.write(outstring
);
880 def CheckCompressionSubType(infile
, formatspecs
=__file_format_list__
):
881 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
882 if(not compresscheck
):
883 fextname
= os
.path
.splitext(infile
)[1];
885 compresscheck
= "gzip";
886 if(fextname
==".bz2"):
887 compresscheck
= "bzip2";
888 if(fextname
==".zst"):
889 compresscheck
= "zstd";
890 if(fextname
==".lz4"):
891 compresscheck
= "lz4";
892 if(fextname
==".lzo" or fextname
==".lzop"):
893 compresscheck
= "lzo";
894 if(fextname
==".lzma" or fextname
==".xz"):
895 compresscheck
= "lzma";
896 if(not compresscheck
):
898 if(compresscheck
=="catfile"):
900 if(compresscheck
==formatspecs
[1]):
901 return formatspecs
[1];
902 if(compresscheck
=="tarfile"):
904 if(compresscheck
=="zipfile"):
906 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
907 catfp
= UncompressArchiveFile(infile
, formatspecs
[1]);
910 if(compresscheck
=="gzip"):
915 catfp
= gzip
.GzipFile(infile
, "rb");
916 if(compresscheck
=="bzip2"):
921 catfp
= bz2
.BZ2File(infile
, "rb");
922 if(compresscheck
=="lz4"):
927 catfp
= lz4
.frame
.open(infile
, "rb");
928 if(compresscheck
=="zstd"):
933 catfp
= zstandard
.open(infile
, "rb");
934 if(compresscheck
=="lzma" or compresscheck
=="xz"):
939 catfp
= lzma
.open(infile
, "rb");
940 except FileNotFoundError
:
943 prefp
= catfp
.read(5);
944 if(prefp
==binascii
.unhexlify("7573746172")):
945 filetype
= "tarfile";
947 prefp
= catfp
.read(7);
948 if(prefp
==binascii
.unhexlify("43617446696c65")):
949 filetype
= "catfile";
951 prefp
= catfp
.read(formatspecs
[2]);
952 if(prefp
==binascii
.unhexlify(formatspecs
[3])):
953 filetype
= formatspecs
[1];
955 prefp
= catfp
.read(10);
956 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
957 filetype
= "tarfile";
962 def GZipCompress(data
, compresslevel
=9):
967 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
969 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
973 catfp
= open(tmpfp
.name
, "rb");
974 except FileNotFoundError
:
976 catdata
= catfp
.read();
980 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_list__
):
981 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
982 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
985 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[1]):
987 if(compression
not in compressionlist
and compression
is None):
988 compression
= "auto";
989 if(compression
=="gzip"):
995 if(compressionlevel
is None):
996 compressionlevel
= 9;
998 compressionlevel
= int(compressionlevel
);
999 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
1000 if(compression
=="bzip2"):
1006 if(compressionlevel
is None):
1007 compressionlevel
= 9;
1009 compressionlevel
= int(compressionlevel
);
1010 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
1011 if(compression
=="lz4"):
1017 if(compressionlevel
is None):
1018 compressionlevel
= 9;
1020 compressionlevel
= int(compressionlevel
);
1021 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
1022 if(compression
=="lzo" or compression
=="lzop"):
1028 if(compressionlevel
is None):
1029 compressionlevel
= 9;
1031 compressionlevel
= int(compressionlevel
);
1032 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
1033 if(compression
=="zstd"):
1039 if(compressionlevel
is None):
1040 compressionlevel
= 10;
1042 compressionlevel
= int(compressionlevel
);
1043 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
1044 if(compression
=="lzma"):
1050 if(compressionlevel
is None):
1051 compressionlevel
= 9;
1053 compressionlevel
= int(compressionlevel
);
1054 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
1055 if(compression
=="xz"):
1061 if(compressionlevel
is None):
1062 compressionlevel
= 9;
1064 compressionlevel
= int(compressionlevel
);
1065 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
1066 if(compression
=="auto" or compression
is None):
1071 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
1073 def CompressOpenFile(outfile
, compressionlevel
=None):
1074 if(outfile
is None):
1076 fbasename
= os
.path
.splitext(outfile
)[0];
1077 fextname
= os
.path
.splitext(outfile
)[1];
1078 if(compressionlevel
is None and fextname
!=".zst"):
1079 compressionlevel
= 9;
1080 elif(compressionlevel
is None and fextname
==".zst"):
1081 compressionlevel
= 10;
1083 compressionlevel
= int(compressionlevel
);
1084 if(sys
.version_info
[0]==2):
1089 if(fextname
not in outextlistwd
):
1091 outfp
= open(outfile
, "wb", encoding
="UTF-8");
1092 except (ValueError, TypeError) as e
:
1093 outfp
= open(outfile
, "wb");
1094 elif(fextname
==".gz"):
1100 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
1101 except (ValueError, TypeError) as e
:
1102 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
1103 elif(fextname
==".bz2"):
1109 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
1110 except (ValueError, TypeError) as e
:
1111 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
1112 elif(fextname
==".zst"):
1118 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
1119 except (ValueError, TypeError) as e
:
1120 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
1121 elif(fextname
==".xz"):
1127 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
1128 except (ValueError, TypeError) as e
:
1129 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
1130 elif(fextname
==".lz4"):
1136 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
1137 except (ValueError, TypeError) as e
:
1138 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
1139 elif(fextname
==".lzo"):
1145 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
1146 except (ValueError, TypeError) as e
:
1147 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
1148 elif(fextname
==".lzma"):
1154 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
1155 except (ValueError, TypeError) as e
:
1156 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
1157 except FileNotFoundError
:
1161 def GetDevMajorMinor(fdev
):
1163 if(hasattr(os
, "minor")):
1164 retdev
.append(os
.minor(fdev
));
1167 if(hasattr(os
, "major")):
1168 retdev
.append(os
.major(fdev
));
1173 def CheckSumSupport(checkfor
, guaranteed
=True):
1175 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
1177 hash_list
= sorted(list(hashlib
.algorithms_available
));
1178 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
1179 if(checkfor
in checklistout
):
1184 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
1186 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
1188 hash_list
= sorted(list(hashlib
.algorithms_available
));
1189 checklistout
= hash_list
;
1190 if(checkfor
in checklistout
):
1195 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1196 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1197 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1198 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1199 advancedlist
= True;
1200 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1201 outfile
= RemoveWindowsPath(outfile
);
1202 checksumtype
= checksumtype
.lower();
1203 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1204 checksumtype
="crc32";
1205 if(checksumtype
=="none"):
1207 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[1]):
1209 if(compression
not in compressionlist
and compression
is None):
1210 compression
= "auto";
1212 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1213 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1214 if(os
.path
.exists(outfile
)):
1219 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1222 fbasename
= os
.path
.splitext(outfile
)[0];
1223 fextname
= os
.path
.splitext(outfile
)[1];
1224 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1225 catver
= formatspecs
[5];
1226 fileheaderver
= str(int(catver
.replace(".", "")));
1227 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
1228 catfp
.write(fileheader
.encode('UTF-8'));
1231 for line
in sys
.stdin
:
1232 infilelist
.append(line
.strip());
1233 infilelist
= list(filter(None, infilelist
));
1234 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1235 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1237 with
open(infiles
, "r") as finfile
:
1238 for line
in finfile
:
1239 infilelist
.append(line
.strip());
1240 infilelist
= list(filter(None, infilelist
));
1242 if(isinstance(infiles
, (list, tuple, ))):
1243 infilelist
= list(filter(None, infiles
));
1244 elif(isinstance(infiles
, (str, ))):
1245 infilelist
= list(filter(None, [infiles
]));
1247 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1249 GetDirList
= ListDir(infilelist
, followlink
, False);
1257 inodetocatinode
= {};
1258 fnumfiles
= format(int(len(GetDirList
)), 'x').lower();
1259 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[4]);
1260 if(checksumtype
=="none" or checksumtype
==""):
1261 catfileheadercshex
= format(0, 'x').lower();
1262 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1263 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1264 elif(checksumtype
=="crc16_ccitt"):
1265 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1266 elif(checksumtype
=="adler32"):
1267 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1268 elif(checksumtype
=="crc32"):
1269 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1270 elif(checksumtype
=="crc64_ecma"):
1271 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1272 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1273 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1274 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1275 checksumoutstr
= hashlib
.new(checksumtype
);
1276 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1277 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1279 catfileheadercshex
= format(0, 'x').lower
1280 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
1281 catfp
.write(fnumfilesa
.encode('UTF-8'));
1284 os
.fsync(catfp
.fileno());
1285 except io
.UnsupportedOperation
:
1287 except AttributeError:
1289 for curfname
in GetDirList
:
1290 catfhstart
= catfp
.tell();
1291 if(re
.findall("^[.|/]", curfname
)):
1294 fname
= "./"+curfname
;
1296 VerbosePrintOut(fname
);
1297 if(not followlink
or followlink
is None):
1298 fstatinfo
= os
.lstat(fname
);
1300 fstatinfo
= os
.stat(fname
);
1301 fpremode
= fstatinfo
.st_mode
;
1302 finode
= fstatinfo
.st_ino
;
1303 flinkcount
= fstatinfo
.st_nlink
;
1305 if(stat
.S_ISREG(fpremode
)):
1307 elif(stat
.S_ISLNK(fpremode
)):
1309 elif(stat
.S_ISCHR(fpremode
)):
1311 elif(stat
.S_ISBLK(fpremode
)):
1313 elif(stat
.S_ISDIR(fpremode
)):
1315 elif(stat
.S_ISFIFO(fpremode
)):
1317 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1319 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1321 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1326 fcurfid
= format(int(curfid
), 'x').lower();
1327 if(not followlink
and finode
!=0):
1329 if(finode
in inodelist
):
1331 flinkname
= inodetofile
[finode
];
1332 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1333 if(finode
not in inodelist
):
1334 inodelist
.append(finode
);
1335 inodetofile
.update({finode
: fname
});
1336 inodetocatinode
.update({finode
: curinode
});
1337 fcurinode
= format(int(curinode
), 'x').lower();
1338 curinode
= curinode
+ 1;
1340 fcurinode
= format(int(curinode
), 'x').lower();
1341 curinode
= curinode
+ 1;
1342 curfid
= curfid
+ 1;
1344 flinkname
= os
.readlink(fname
);
1345 fdev
= fstatinfo
.st_dev
;
1346 getfdev
= GetDevMajorMinor(fdev
);
1347 fdev_minor
= getfdev
[0];
1348 fdev_major
= getfdev
[1];
1349 frdev
= fstatinfo
.st_dev
;
1350 if(hasattr(fstatinfo
, "st_rdev")):
1351 frdev
= fstatinfo
.st_rdev
;
1353 frdev
= fstatinfo
.st_dev
;
1354 getfrdev
= GetDevMajorMinor(frdev
);
1355 frdev_minor
= getfrdev
[0];
1356 frdev_major
= getfrdev
[1];
1357 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1358 fsize
= format(int("0"), 'x').lower();
1359 elif(ftype
==0 or ftype
==7):
1360 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1362 fsize
= format(int(fstatinfo
.st_size
)).lower();
1363 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1364 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1365 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1366 if(hasattr(fstatinfo
, "st_birthtime")):
1367 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1369 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1370 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1371 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1372 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1373 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1374 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1379 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1380 funame
= userinfo
.pw_name
;
1389 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1390 fgname
= groupinfo
.gr_name
;
1395 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1396 fdev_major
= format(int(fdev_major
), 'x').lower();
1397 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1398 frdev_major
= format(int(frdev_major
), 'x').lower();
1399 finode
= format(int(finode
), 'x').lower();
1400 flinkcount
= format(int(flinkcount
), 'x').lower();
1401 if(hasattr(fstatinfo
, "st_file_attributes")):
1402 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1404 fwinattributes
= format(int(0), 'x').lower();
1405 fcontents
= "".encode('UTF-8');
1407 if(ftype
== 0 or ftype
== 7):
1408 with
open(fname
, "rb") as fpc
:
1410 chunk
= fpc
.read(chunk_size
);
1414 if(followlink
and (ftype
== 1 or ftype
== 2)):
1415 flstatinfo
= os
.stat(flinkname
);
1416 with
open(flinkname
, "rb") as fpc
:
1418 chunk
= fpc
.read(chunk_size
);
1422 ftypehex
= format(ftype
, 'x').lower();
1423 extrafields
= format(len(extradata
), 'x').lower();
1424 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
1425 if(len(extradata
)>0):
1426 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
1427 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1428 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[4]);
1429 if(len(extradata
)>0):
1430 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
1431 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
1432 if(checksumtype
=="none" or checksumtype
==""):
1433 catfileheadercshex
= format(0, 'x').lower();
1434 catfilecontentcshex
= format(0, 'x').lower();
1435 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1436 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1437 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1438 elif(checksumtype
=="crc16_ccitt"):
1439 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1440 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1441 elif(checksumtype
=="adler32"):
1442 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1443 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1444 elif(checksumtype
=="crc32"):
1445 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1446 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1447 elif(checksumtype
=="crc64_ecma"):
1448 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1449 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1450 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1451 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1452 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1453 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1454 checksumoutstr
= hashlib
.new(checksumtype
);
1455 checksumoutstr
.update("".encode('UTF-8'));
1456 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1457 checksumoutstr
= hashlib
.new(checksumtype
);
1458 checksumoutstr
.update(fcontents
);
1459 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1461 catfileheadercshex
= format(0, 'x').lower();
1462 catfilecontentcshex
= format(0, 'x').lower();
1463 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
1464 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
1465 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
1466 if(checksumtype
=="none" or checksumtype
==""):
1467 catfileheadercshex
= format(0, 'x').lower();
1468 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1469 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1470 elif(checksumtype
=="crc16_ccitt"):
1471 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1472 elif(checksumtype
=="adler32"):
1473 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1474 elif(checksumtype
=="crc32"):
1475 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1476 elif(checksumtype
=="crc64_ecma"):
1477 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1478 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1479 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1480 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1481 checksumoutstr
= hashlib
.new(checksumtype
);
1482 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
1483 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1485 catfileheadercshex
= format(0, 'x').lower();
1486 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
1487 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1488 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1489 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1490 nullstrecd
= formatspecs
[4].encode('UTF-8');
1491 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
1492 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
1493 catfp
.write(catfileout
);
1496 os
.fsync(catfp
.fileno());
1497 except io
.UnsupportedOperation
:
1499 except AttributeError:
1501 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1502 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1505 os
.fsync(catfp
.fileno());
1506 except io
.UnsupportedOperation
:
1508 except AttributeError:
1512 if(hasattr(sys
.stdout
, "buffer")):
1513 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1515 shutil
.copyfileobj(catfp
, sys
.stdout
);
1523 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
1525 if(hasattr(shutil
, "register_archive_format")):
1526 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
1527 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
1528 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
1530 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1531 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
1533 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1534 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1535 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1536 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1537 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1538 outfile
= RemoveWindowsPath(outfile
);
1539 checksumtype
= checksumtype
.lower();
1540 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1541 checksumtype
="crc32";
1542 if(checksumtype
=="none"):
1544 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[1]):
1546 if(compression
not in compressionlist
and compression
is None):
1547 compression
= "auto";
1549 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1550 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1551 if(os
.path
.exists(outfile
)):
1556 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1559 fbasename
= os
.path
.splitext(outfile
)[0];
1560 fextname
= os
.path
.splitext(outfile
)[1];
1561 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1562 catver
= formatspecs
[5];
1563 fileheaderver
= str(int(catver
.replace(".", "")));
1564 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
1565 catfp
.write(fileheader
.encode('UTF-8'));
1571 inodetocatinode
= {};
1572 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
1575 if(not tarfile
.is_tarfile(infile
)):
1577 except AttributeError:
1578 if(not is_tarfile(infile
)):
1581 tarfp
= tarfile
.open(infile
, "r");
1582 except FileNotFoundError
:
1584 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
1585 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[4]);
1586 if(checksumtype
=="none" or checksumtype
==""):
1587 catfileheadercshex
= format(0, 'x').lower();
1588 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1589 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1590 elif(checksumtype
=="crc16_ccitt"):
1591 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1592 elif(checksumtype
=="adler32"):
1593 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1594 elif(checksumtype
=="crc32"):
1595 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1596 elif(checksumtype
=="crc64_ecma"):
1597 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1598 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1599 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1600 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1601 checksumoutstr
= hashlib
.new(checksumtype
);
1602 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1603 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1605 catfileheadercshex
= format(0, 'x').lower();
1606 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
1607 catfp
.write(fnumfilesa
.encode('UTF-8'));
1610 os
.fsync(catfp
.fileno());
1611 except io
.UnsupportedOperation
:
1613 except AttributeError:
1615 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
1616 catfhstart
= catfp
.tell();
1617 if(re
.findall("^[.|/]", member
.name
)):
1618 fname
= member
.name
;
1620 fname
= "./"+member
.name
;
1622 VerbosePrintOut(fname
);
1623 fpremode
= member
.mode
;
1624 ffullmode
= member
.mode
;
1628 ffullmode
= member
.mode
+ stat
.S_IFREG
;
1630 elif(member
.isdev()):
1631 ffullmode
= member
.mode
;
1633 elif(member
.islnk()):
1634 ffullmode
= member
.mode
+ stat
.S_IFREG
;
1636 elif(member
.issym()):
1637 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
1639 elif(member
.ischr()):
1640 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
1642 elif(member
.isblk()):
1643 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
1645 elif(member
.isdir()):
1646 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
1648 elif(member
.isfifo()):
1649 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
1651 elif(member
.issparse()):
1652 ffullmode
= member
.mode
;
1655 ffullmode
= member
.mode
;
1658 fcurfid
= format(int(curfid
), 'x').lower();
1659 fcurinode
= format(int(0), 'x').lower();
1660 curfid
= curfid
+ 1;
1662 flinkname
= member
.linkname
;
1663 fdev_minor
= format(int(member
.devminor
), 'x').lower();
1664 fdev_major
= format(int(member
.devmajor
), 'x').lower();
1665 frdev_minor
= format(int(member
.devminor
), 'x').lower();
1666 frdev_major
= format(int(member
.devmajor
), 'x').lower();
1667 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1668 fsize
= format(int("0"), 'x').lower();
1669 elif(ftype
==0 or ftype
==7):
1670 fsize
= format(int(member
.size
), 'x').lower();
1672 fsize
= format(int(member
.size
), 'x').lower();
1673 fatime
= format(int(member
.mtime
), 'x').lower();
1674 fmtime
= format(int(member
.mtime
), 'x').lower();
1675 fctime
= format(int(member
.mtime
), 'x').lower();
1676 fbtime
= format(int(member
.mtime
), 'x').lower();
1677 fmode
= format(int(ffullmode
), 'x').lower();
1678 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
1679 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
1680 fuid
= format(int(member
.uid
), 'x').lower();
1681 fgid
= format(int(member
.gid
), 'x').lower();
1682 funame
= member
.uname
;
1683 fgname
= member
.gname
;
1684 flinkcount
= format(int(flinkcount
), 'x').lower();
1685 fcontents
= "".encode('UTF-8');
1687 if(ftype
== 0 or ftype
== 7):
1688 with tarfp
.extractfile(member
) as fpc
:
1690 chunk
= fpc
.read(chunk_size
);
1694 ftypehex
= format(ftype
, 'x').lower();
1695 extrafields
= format(len(extradata
), 'x').lower();
1696 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
1697 if(len(extradata
)>0):
1698 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
1699 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1700 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[4]);
1701 if(len(extradata
)>0):
1702 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
1703 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
1704 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1705 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1706 if(checksumtype
=="none" or checksumtype
==""):
1707 catfileheadercshex
= format(0, 'x').lower();
1708 catfilecontentcshex
= format(0, 'x').lower();
1709 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1710 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1711 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1712 elif(checksumtype
=="crc16_ccitt"):
1713 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1714 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1715 elif(checksumtype
=="adler32"):
1716 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1717 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1718 elif(checksumtype
=="crc32"):
1719 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1720 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1721 elif(checksumtype
=="crc64_ecma"):
1722 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1723 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1724 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1725 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1726 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1727 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1728 checksumoutstr
= hashlib
.new(checksumtype
);
1729 checksumoutstr
.update("".encode('UTF-8'));
1730 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1731 checksumoutstr
= hashlib
.new(checksumtype
);
1732 checksumoutstr
.update(fcontents
);
1733 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1735 catfileheadercshex
= format(0, 'x').lower();
1736 catfilecontentcshex
= format(0, 'x').lower();
1737 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
1738 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
1739 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
1740 if(checksumtype
=="none" or checksumtype
==""):
1741 catfileheadercshex
= format(0, 'x').lower();
1742 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1743 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1744 elif(checksumtype
=="crc16_ccitt"):
1745 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1746 elif(checksumtype
=="adler32"):
1747 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1748 elif(checksumtype
=="crc32"):
1749 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1750 elif(checksumtype
=="crc64_ecma"):
1751 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1752 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1753 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1754 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1755 checksumoutstr
= hashlib
.new(checksumtype
);
1756 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
1757 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1759 catfileheadercshex
= format(0, 'x').lower();
1760 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
1761 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1762 nullstrecd
= formatspecs
[4].encode('UTF-8');
1763 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
1764 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
1765 catfp
.write(catfileout
);
1768 os
.fsync(catfp
.fileno());
1769 except io
.UnsupportedOperation
:
1771 except AttributeError:
1773 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1774 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1777 os
.fsync(catfp
.fileno());
1778 except io
.UnsupportedOperation
:
1780 except AttributeError:
1784 if(hasattr(sys
.stdout
, "buffer")):
1785 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1787 shutil
.copyfileobj(catfp
, sys
.stdout
);
1795 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
1797 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1798 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1799 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1800 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1801 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1802 outfile
= RemoveWindowsPath(outfile
);
1803 checksumtype
= checksumtype
.lower();
1804 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1805 checksumtype
="crc32";
1806 if(checksumtype
=="none"):
1808 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[1]):
1810 if(compression
not in compressionlist
and compression
is None):
1811 compression
= "auto";
1813 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1814 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1815 if(os
.path
.exists(outfile
)):
1820 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1823 fbasename
= os
.path
.splitext(outfile
)[0];
1824 fextname
= os
.path
.splitext(outfile
)[1];
1825 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1826 catver
= formatspecs
[5];
1827 fileheaderver
= str(int(catver
.replace(".", "")));
1828 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
1829 catfp
.write(fileheader
.encode('UTF-8'));
1835 inodetocatinode
= {};
1836 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
1838 if(not zipfile
.is_zipfile(infile
)):
1840 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
1841 ziptest
= zipfp
.testzip();
1843 VerbosePrintOut("Bad file found!");
1844 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
1845 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[4]);
1846 if(checksumtype
=="none" or checksumtype
==""):
1847 catfileheadercshex
= format(0, 'x').lower();
1848 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1849 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1850 elif(checksumtype
=="crc16_ccitt"):
1851 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1852 elif(checksumtype
=="adler32"):
1853 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1854 elif(checksumtype
=="crc32"):
1855 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1856 elif(checksumtype
=="crc64_ecma"):
1857 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1858 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1859 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1860 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1861 checksumoutstr
= hashlib
.new(checksumtype
);
1862 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1863 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1865 catfileheadercshex
= format(0, 'x').lower();
1866 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
1867 catfp
.write(fnumfilesa
.encode('UTF-8'));
1870 os
.fsync(catfp
.fileno());
1871 except io
.UnsupportedOperation
:
1873 except AttributeError:
1875 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
1876 catfhstart
= catfp
.tell();
1877 if(re
.findall("^[.|/]", member
.filename
)):
1878 fname
= member
.filename
;
1880 fname
= "./"+member
.filename
;
1881 zipinfo
= zipfp
.getinfo(member
.filename
);
1883 VerbosePrintOut(fname
);
1884 if(not member
.is_dir()):
1885 fpremode
= int(stat
.S_IFREG
+ 438);
1886 elif(member
.is_dir()):
1887 fpremode
= int(stat
.S_IFDIR
+ 511);
1890 if(not member
.is_dir()):
1892 elif(member
.is_dir()):
1895 fcurfid
= format(int(curfid
), 'x').lower();
1896 fcurinode
= format(int(0), 'x').lower();
1897 curfid
= curfid
+ 1;
1898 fdev_minor
= format(int(0), 'x').lower();
1899 fdev_major
= format(int(0), 'x').lower();
1900 frdev_minor
= format(int(0), 'x').lower();
1901 frdev_major
= format(int(0), 'x').lower();
1903 fsize
= format(int("0"), 'x').lower();
1905 fsize
= format(int(member
.file_size
), 'x').lower();
1907 fsize
= format(int(member
.file_size
), 'x').lower();
1908 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
1909 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
1910 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
1911 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
1912 if(not member
.is_dir()):
1913 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
1914 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
1915 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
1916 if(member
.is_dir()):
1917 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
1918 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
1919 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
1921 fuid
= format(int(os
.getuid()), 'x').lower();
1922 except AttributeError:
1923 fuid
= format(int(0), 'x').lower();
1925 fuid
= format(int(0), 'x').lower();
1927 fgid
= format(int(os
.getgid()), 'x').lower();
1928 except AttributeError:
1929 fgid
= format(int(0), 'x').lower();
1931 fgid
= format(int(0), 'x').lower();
1935 userinfo
= pwd
.getpwuid(os
.getuid());
1936 funame
= userinfo
.pw_name
;
1939 except AttributeError:
1947 groupinfo
= grp
.getgrgid(os
.getgid());
1948 fgname
= groupinfo
.gr_name
;
1951 except AttributeError:
1955 fcontents
= "".encode('UTF-8');
1957 fcontents
= zipfp
.read(member
.filename
);
1958 ftypehex
= format(ftype
, 'x').lower();
1959 extrafields
= format(len(extradata
), 'x').lower();
1960 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
1961 if(len(extradata
)>0):
1962 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
1963 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1964 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[4]);
1965 if(len(extradata
)>0):
1966 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
1967 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
1968 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1969 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1970 if(checksumtype
=="none" or checksumtype
==""):
1971 catfileheadercshex
= format(0, 'x').lower();
1972 catfilecontentcshex
= format(0, 'x').lower();
1973 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1974 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1975 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1976 elif(checksumtype
=="crc16_ccitt"):
1977 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1978 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1979 elif(checksumtype
=="adler32"):
1980 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1981 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1982 elif(checksumtype
=="crc32"):
1983 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1984 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1985 elif(checksumtype
=="crc64_ecma"):
1986 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1987 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1988 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1989 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1990 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1991 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1992 checksumoutstr
= hashlib
.new(checksumtype
);
1993 checksumoutstr
.update("".encode('UTF-8'));
1994 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1995 checksumoutstr
= hashlib
.new(checksumtype
);
1996 checksumoutstr
.update(fcontents
);
1997 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1999 catfileheadercshex
= format(0, 'x').lower();
2000 catfilecontentcshex
= format(0, 'x').lower();
2001 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
2002 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2003 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
2004 if(checksumtype
=="none" or checksumtype
==""):
2005 catfileheadercshex
= format(0, 'x').lower();
2006 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2007 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2008 elif(checksumtype
=="crc16_ccitt"):
2009 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2010 elif(checksumtype
=="adler32"):
2011 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2012 elif(checksumtype
=="crc32"):
2013 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2014 elif(checksumtype
=="crc64_ecma"):
2015 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2016 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2017 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2018 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2019 checksumoutstr
= hashlib
.new(checksumtype
);
2020 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2021 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2023 catfileheadercshex
= format(0, 'x').lower();
2024 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
2025 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2026 nullstrecd
= formatspecs
[4].encode('UTF-8');
2027 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2028 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2029 catfp
.write(catfileout
);
2032 os
.fsync(catfp
.fileno());
2033 except io
.UnsupportedOperation
:
2035 except AttributeError:
2037 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2038 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2041 os
.fsync(catfp
.fileno());
2042 except io
.UnsupportedOperation
:
2044 except AttributeError:
2048 if(hasattr(sys
.stdout
, "buffer")):
2049 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2051 shutil
.copyfileobj(catfp
, sys
.stdout
);
2059 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
2061 if(not rarfile_support
):
2062 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2065 if(rarfile_support
):
2066 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2067 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
2068 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
2069 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
2070 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2071 outfile
= RemoveWindowsPath(outfile
);
2072 checksumtype
= checksumtype
.lower();
2073 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2074 checksumtype
="crc32";
2075 if(checksumtype
=="none"):
2077 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[1]):
2079 if(compression
not in compressionlist
and compression
is None):
2080 compression
= "auto";
2082 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2083 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2084 if(os
.path
.exists(outfile
)):
2089 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2092 fbasename
= os
.path
.splitext(outfile
)[0];
2093 fextname
= os
.path
.splitext(outfile
)[1];
2094 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2095 catver
= formatspecs
[5];
2096 fileheaderver
= str(int(catver
.replace(".", "")));
2097 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
2098 catfp
.write(fileheader
.encode('UTF-8'));
2104 inodetocatinode
= {};
2105 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2107 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
2109 rarfp
= rarfile
.RarFile(infile
, "r");
2110 rartest
= rarfp
.testrar();
2112 VerbosePrintOut("Bad file found!");
2113 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
2114 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[4]);
2115 if(checksumtype
=="none" or checksumtype
==""):
2116 catfileheadercshex
= format(0, 'x').lower();
2117 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2118 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2119 elif(checksumtype
=="crc16_ccitt"):
2120 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2121 elif(checksumtype
=="adler32"):
2122 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2123 elif(checksumtype
=="crc32"):
2124 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2125 elif(checksumtype
=="crc64_ecma"):
2126 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2127 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2128 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2129 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2130 checksumoutstr
= hashlib
.new(checksumtype
);
2131 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2132 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2134 catfileheadercshex
= format(0, 'x').lower();
2135 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
2136 catfp
.write(fnumfilesa
.encode('UTF-8'));
2139 os
.fsync(catfp
.fileno());
2140 except io
.UnsupportedOperation
:
2142 except AttributeError:
2144 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
2147 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
2150 member
.external_attr
2152 except AttributeError:
2154 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
2157 member
.external_attr
2159 except AttributeError:
2164 catfhstart
= catfp
.tell();
2165 if(re
.findall("^[.|/]", member
.filename
)):
2166 fname
= member
.filename
;
2168 fname
= "./"+member
.filename
;
2169 rarinfo
= rarfp
.getinfo(member
.filename
);
2171 VerbosePrintOut(fname
);
2172 if(is_unix
and member
.external_attr
!=0):
2173 fpremode
= int(member
.external_attr
);
2174 elif(member
.is_file()):
2175 fpremode
= int(stat
.S_IFREG
+ 438);
2176 elif(member
.is_symlink()):
2177 fpremode
= int(stat
.S_IFLNK
+ 438);
2178 elif(member
.is_dir()):
2179 fpremode
= int(stat
.S_IFDIR
+ 511);
2180 if(is_windows
and member
.external_attr
!=0):
2181 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
2183 fwinattributes
= format(int(0), 'x').lower();
2186 if(member
.is_file()):
2188 elif(member
.is_symlink()):
2190 elif(member
.is_dir()):
2194 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
2195 fcurfid
= format(int(curfid
), 'x').lower();
2196 fcurinode
= format(int(0), 'x').lower();
2197 curfid
= curfid
+ 1;
2198 fdev_minor
= format(int(0), 'x').lower();
2199 fdev_major
= format(int(0), 'x').lower();
2200 frdev_minor
= format(int(0), 'x').lower();
2201 frdev_major
= format(int(0), 'x').lower();
2203 fsize
= format(int("0"), 'x').lower();
2205 fsize
= format(int(member
.file_size
), 'x').lower();
2207 fsize
= format(int(member
.file_size
), 'x').lower();
2210 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
2212 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2213 except AttributeError:
2214 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2215 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2218 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
2220 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2221 except AttributeError:
2222 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2223 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2224 if(is_unix
and member
.external_attr
!=0):
2225 fmode
= format(int(member
.external_attr
), 'x').lower();
2226 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
2227 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
2228 elif(member
.is_file()):
2229 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2230 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2231 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2232 elif(member
.is_symlink()):
2233 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
2234 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2235 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2236 elif(member
.is_dir()):
2237 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2238 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2239 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2241 fuid
= format(int(os
.getuid()), 'x').lower();
2242 except AttributeError:
2243 fuid
= format(int(0), 'x').lower();
2245 fuid
= format(int(0), 'x').lower();
2247 fgid
= format(int(os
.getgid()), 'x').lower();
2248 except AttributeError:
2249 fgid
= format(int(0), 'x').lower();
2251 fgid
= format(int(0), 'x').lower();
2255 userinfo
= pwd
.getpwuid(os
.getuid());
2256 funame
= userinfo
.pw_name
;
2259 except AttributeError:
2267 groupinfo
= grp
.getgrgid(os
.getgid());
2268 fgname
= groupinfo
.gr_name
;
2271 except AttributeError:
2275 fcontents
= "".encode('UTF-8');
2277 fcontents
= rarfp
.read(member
.filename
);
2278 ftypehex
= format(ftype
, 'x').lower();
2279 extrafields
= format(len(extradata
), 'x').lower();
2280 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
2281 if(len(extradata
)>0):
2282 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
2283 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2284 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[4]);
2285 if(len(extradata
)>0):
2286 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
2287 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
2288 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2289 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2290 if(checksumtype
=="none" or checksumtype
==""):
2291 catfileheadercshex
= format(0, 'x').lower();
2292 catfilecontentcshex
= format(0, 'x').lower();
2293 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2294 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2295 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2296 elif(checksumtype
=="crc16_ccitt"):
2297 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2298 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2299 elif(checksumtype
=="adler32"):
2300 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2301 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2302 elif(checksumtype
=="crc32"):
2303 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2304 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2305 elif(checksumtype
=="crc64_ecma"):
2306 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2307 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2308 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2309 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2310 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2311 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2312 checksumoutstr
= hashlib
.new(checksumtype
);
2313 checksumoutstr
.update("".encode('UTF-8'));
2314 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2315 checksumoutstr
= hashlib
.new(checksumtype
);
2316 checksumoutstr
.update(fcontents
);
2317 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2319 catfileheadercshex
= format(0, 'x').lower();
2320 catfilecontentcshex
= format(0, 'x').lower();
2321 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
2322 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2323 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
2324 if(checksumtype
=="none" or checksumtype
==""):
2325 catfileheadercshex
= format(0, 'x').lower()
2326 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2327 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
2328 elif(checksumtype
=="crc16_ccitt"):
2329 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
2330 elif(checksumtype
=="adler32"):
2331 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
2332 elif(checksumtype
=="crc32"):
2333 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
2334 elif(checksumtype
=="crc64_ecma"):
2335 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
2336 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2337 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
2338 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2339 checksumoutstr
= hashlib
.new(checksumtype
)
2340 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
2341 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
2343 catfileheadercshex
= format(0, 'x').lower()
2344 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4])
2345 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
2346 nullstrecd
= formatspecs
[4].encode('UTF-8')
2347 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
2348 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
2349 catfp
.write(catfileout
)
2352 os
.fsync(catfp
.fileno())
2353 except io
.UnsupportedOperation
:
2355 except AttributeError:
2357 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2358 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
2361 os
.fsync(catfp
.fileno())
2362 except io
.UnsupportedOperation
:
2364 except AttributeError:
2368 if(hasattr(sys
.stdout
, "buffer")):
2369 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer)
2371 shutil
.copyfileobj(catfp
, sys
.stdout
)
2379 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
2381 def ArchiveFileSeekToFileNum(infile
, seekto
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2382 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2385 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2386 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2387 if(checkcompressfile
=="tarfile"):
2388 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2389 if(checkcompressfile
=="zipfile"):
2390 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2391 if(rarfile_support
and checkcompressfile
=="rarfile"):
2392 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2393 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[1]):
2400 if(hasattr(sys
.stdin
, "buffer")):
2401 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2403 shutil
.copyfileobj(sys
.stdin
, catfp
);
2405 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2410 infile
= RemoveWindowsPath(infile
);
2411 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2412 if(checkcompressfile
=="tarfile"):
2413 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2414 if(checkcompressfile
=="zipfile"):
2415 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2416 if(rarfile_support
and checkcompressfile
=="rarfile"):
2417 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2418 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[1]):
2420 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2421 if(not compresscheck
):
2422 fextname
= os
.path
.splitext(infile
)[1];
2423 if(fextname
==".gz"):
2424 compresscheck
= "gzip";
2425 if(fextname
==".bz2"):
2426 compresscheck
= "bzip2";
2427 if(fextname
==".zst"):
2428 compresscheck
= "zstd";
2429 if(fextname
==".lz4" or fextname
==".clz4"):
2430 compresscheck
= "lz4";
2431 if(fextname
==".lzo" or fextname
==".lzop"):
2432 compresscheck
= "lzo";
2433 if(fextname
==".lzma" or fextname
==".xz"):
2434 compresscheck
= "lzma";
2435 if(not compresscheck
):
2437 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2442 SeekToEndOfFile(catfp);
2444 SeekToEndOfFile(catfp);
2445 CatSize = catfp.tell();
2446 CatSizeEnd = CatSize;
2454 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[4]);
2455 catstring
= catheader
[0];
2456 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2457 fprenumfiles
= catheader
[1];
2458 fnumfiles
= int(fprenumfiles
, 16);
2459 fprechecksumtype
= catheader
[2];
2460 fprechecksum
= catheader
[3];
2461 fileheader
= AppendNullByte(catstring
, formatspecs
[4]);
2462 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2463 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[4]);
2464 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2465 catfileheadercshex
= format(0, 'x').lower();
2466 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2467 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2468 elif(fprechecksumtype
=="crc16_ccitt"):
2469 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2470 elif(fprechecksumtype
=="adler32"):
2471 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2472 elif(fprechecksumtype
=="crc32"):
2473 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2474 elif(fprechecksumtype
=="crc64_ecma"):
2475 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2476 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2477 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2478 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2479 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2480 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2481 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2483 catfileheadercshex
= format(0, 'x').lower();
2484 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
2485 fheadtell
= len(fileheader
);
2486 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2487 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2489 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2490 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2491 if(seekto
>=fnumfiles
):
2492 seekto
= fnumfiles
- 1;
2498 seekstart
= catfp
.tell();
2499 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[4]);
2500 prefheadsize
= int(preheaderdata
[0], 16);
2501 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2502 preftype
= int(preheaderdata
[1], 16);
2503 prefsize
= int(preheaderdata
[4], 16);
2504 catfp
.seek(prefseek
, 1);
2506 catfp
.seek(prefsize
, 1);
2509 catfp
.seek(seekstart
, 0);
2511 catfheadsize
= int(preheaderdata
[0], 16);
2512 catftype
= int(preheaderdata
[1], 16);
2513 if(re
.findall("^[.|/]", preheaderdata
[2])):
2514 catfname
= preheaderdata
[2];
2516 catfname
= "./"+preheaderdata
[2];
2517 catflinkname
= preheaderdata
[3];
2518 catfsize
= int(preheaderdata
[4], 16);
2519 catfbasedir
= os
.path
.dirname(catfname
);
2520 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
2522 catlist
.update({'catfp': catfp
});
2527 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
2529 def ArchiveFileSeekToFileName(infile
, seekfile
=None, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2530 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2533 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2534 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2535 if(checkcompressfile
=="tarfile"):
2536 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2537 if(checkcompressfile
=="zipfile"):
2538 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2539 if(rarfile_support
and checkcompressfile
=="rarfile"):
2540 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2541 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[1]):
2548 if(hasattr(sys
.stdin
, "buffer")):
2549 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2551 shutil
.copyfileobj(sys
.stdin
, catfp
);
2553 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2558 infile
= RemoveWindowsPath(infile
);
2559 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2560 if(checkcompressfile
=="tarfile"):
2561 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2562 if(checkcompressfile
=="zipfile"):
2563 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2564 if(rarfile_support
and checkcompressfile
=="rarfile"):
2565 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2566 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[1]):
2568 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2569 if(not compresscheck
):
2570 fextname
= os
.path
.splitext(infile
)[1];
2571 if(fextname
==".gz"):
2572 compresscheck
= "gzip";
2573 if(fextname
==".bz2"):
2574 compresscheck
= "bzip2";
2575 if(fextname
==".zst"):
2576 compresscheck
= "zstd";
2577 if(fextname
==".lz4" or fextname
==".clz4"):
2578 compresscheck
= "lz4";
2579 if(fextname
==".lzo" or fextname
==".lzop"):
2580 compresscheck
= "lzo";
2581 if(fextname
==".lzma" or fextname
==".xz"):
2582 compresscheck
= "lzma";
2583 if(not compresscheck
):
2585 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2590 SeekToEndOfFile(catfp);
2592 SeekToEndOfFile(catfp);
2593 CatSize = catfp.tell();
2594 CatSizeEnd = CatSize;
2602 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[4]);
2603 catstring
= catheader
[0];
2604 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2605 fprenumfiles
= catheader
[1];
2606 fnumfiles
= int(fprenumfiles
, 16);
2607 fprechecksumtype
= catheader
[2];
2608 fprechecksum
= catheader
[3];
2609 fileheader
= AppendNullByte(catstring
, formatspecs
[4]);
2610 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2611 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[4]);
2612 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2613 catfileheadercshex
= format(0, 'x').lower();
2614 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2615 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2616 elif(fprechecksumtype
=="crc16_ccitt"):
2617 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2618 elif(fprechecksumtype
=="adler32"):
2619 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2620 elif(fprechecksumtype
=="crc32"):
2621 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2622 elif(fprechecksumtype
=="crc64_ecma"):
2623 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2624 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2625 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2626 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2627 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2628 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2629 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2631 catfileheadercshex
= format(0, 'x').lower();
2632 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
2633 fheadtell
= len(fileheader
);
2634 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2635 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2637 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2638 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2639 seekto
= fnumfiles
- 1
2644 seekstart
= catfp
.tell();
2645 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[4]);
2646 prefheadsize
= int(preheaderdata
[0], 16);
2647 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2648 preftype
= int(preheaderdata
[1], 16);
2649 prefsize
= int(preheaderdata
[4], 16);
2650 catfp
.seek(prefseek
, 1);
2652 catfp
.seek(prefsize
, 1);
2656 prefname
= preheaderdata
[2];
2657 if(re
.findall("^[.|/]", preheaderdata
[2])):
2658 prefname
= preheaderdata
[2];
2660 prefname
= "./"+preheaderdata
[2];
2661 if(prefname
==seekfile
):
2664 catfp
.seek(seekstart
, 0);
2666 catfheadsize
= int(preheaderdata
[0], 16);
2667 catftype
= int(preheaderdata
[1], 16);
2668 if(re
.findall("^[.|/]", preheaderdata
[2])):
2669 catfname
= preheaderdata
[2];
2671 catfname
= "./"+preheaderdata
[2];
2672 catflinkname
= preheaderdata
[3];
2673 catfsize
= int(preheaderdata
[4], 16);
2674 catfbasedir
= os
.path
.dirname(catfname
);
2676 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
2680 catlist
.update({'catfp': catfp
});
2685 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
2687 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2688 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2691 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2692 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2693 if(checkcompressfile
=="tarfile"):
2694 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2695 if(checkcompressfile
=="zipfile"):
2696 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2697 if(rarfile_support
and checkcompressfile
=="rarfile"):
2698 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2699 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[1]):
2706 if(hasattr(sys
.stdin
, "buffer")):
2707 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2709 shutil
.copyfileobj(sys
.stdin
, catfp
);
2711 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2716 infile
= RemoveWindowsPath(infile
);
2717 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2718 if(checkcompressfile
=="tarfile"):
2719 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2720 if(checkcompressfile
=="zipfile"):
2721 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2722 if(rarfile_support
and checkcompressfile
=="rarfile"):
2723 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2724 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[1]):
2726 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2727 if(not compresscheck
):
2728 fextname
= os
.path
.splitext(infile
)[1];
2729 if(fextname
==".gz"):
2730 compresscheck
= "gzip";
2731 if(fextname
==".bz2"):
2732 compresscheck
= "bzip2";
2733 if(fextname
==".zst"):
2734 compresscheck
= "zstd";
2735 if(fextname
==".lz4" or fextname
==".clz4"):
2736 compresscheck
= "lz4";
2737 if(fextname
==".lzo" or fextname
==".lzop"):
2738 compresscheck
= "lzo";
2739 if(fextname
==".lzma" or fextname
==".xz"):
2740 compresscheck
= "lzma";
2741 if(not compresscheck
):
2743 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2748 SeekToEndOfFile(catfp);
2750 SeekToEndOfFile(catfp);
2751 CatSize = catfp.tell();
2752 CatSizeEnd = CatSize;
2760 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[4]);
2761 catstring
= catheader
[0];
2762 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2763 fprenumfiles
= catheader
[1];
2764 fnumfiles
= int(fprenumfiles
, 16);
2765 fprechecksumtype
= catheader
[2];
2766 fprechecksum
= catheader
[3];
2767 fileheader
= AppendNullByte(catstring
, formatspecs
[4]);
2768 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2769 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[4]);
2770 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2771 catfileheadercshex
= format(0, 'x').lower();
2772 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2773 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2774 elif(fprechecksumtype
=="crc16_ccitt"):
2775 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2776 elif(fprechecksumtype
=="adler32"):
2777 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2778 elif(fprechecksumtype
=="crc32"):
2779 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2780 elif(fprechecksumtype
=="crc64_ecma"):
2781 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2782 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2783 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2784 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2785 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2786 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2787 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2789 catfileheadercshex
= format(0, 'x').lower();
2790 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
2791 fheadtell
= len(fileheader
);
2792 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2793 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2795 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2796 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2797 if(seekstart
<0 and seekstart
>fnumfiles
):
2799 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
2800 seekend
= fnumfiles
;
2801 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
2802 seekend
= fnumfiles
- abs(seekend
);
2804 seekend
= fnumfiles
;
2807 while(il
< seekstart
):
2808 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[4]);
2809 prefheadsize
= int(preheaderdata
[0], 16);
2810 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2811 preftype
= int(preheaderdata
[1], 16);
2812 prefsize
= int(preheaderdata
[4], 16);
2813 catfp
.seek(prefseek
, 1);
2815 catfp
.seek(prefsize
, 1);
2818 fileidnum
= seekstart
;
2820 while(fileidnum
<seekend
):
2821 catfhstart
= catfp
.tell();
2823 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[4]);
2825 catheaderdata
= ReadFileHeaderData(catfp
, 23, formatspecs
[4]);
2826 catfheadsize
= int(catheaderdata
[0], 16);
2827 catftype
= int(catheaderdata
[1], 16);
2828 if(re
.findall("^[.|/]", catheaderdata
[2])):
2829 catfname
= catheaderdata
[2];
2831 catfname
= "./"+catheaderdata
[2];
2832 catfbasedir
= os
.path
.dirname(catfname
);
2833 catflinkname
= catheaderdata
[3];
2834 catfsize
= int(catheaderdata
[4], 16);
2835 catfatime
= int(catheaderdata
[5], 16);
2836 catfmtime
= int(catheaderdata
[6], 16);
2837 catfctime
= int(catheaderdata
[7], 16);
2838 catfbtime
= int(catheaderdata
[8], 16);
2839 catfmode
= int(catheaderdata
[9], 16);
2840 catfchmode
= stat
.S_IMODE(catfmode
);
2841 catftypemod
= stat
.S_IFMT(catfmode
);
2842 catfuid
= int(catheaderdata
[10], 16);
2843 catfuname
= catheaderdata
[11];
2844 catfgid
= int(catheaderdata
[12], 16);
2845 catfgname
= catheaderdata
[13];
2846 fid
= int(catheaderdata
[14], 16);
2847 finode
= int(catheaderdata
[15], 16);
2848 flinkcount
= int(catheaderdata
[16], 16);
2849 catfdev_minor
= int(catheaderdata
[17], 16);
2850 catfdev_major
= int(catheaderdata
[18], 16);
2851 catfrdev_minor
= int(catheaderdata
[19], 16);
2852 catfrdev_major
= int(catheaderdata
[20], 16);
2853 catfextrasize
= int(catheaderdata
[21], 16);
2854 catfextrafields
= int(catheaderdata
[22], 16);
2855 extrafieldslist
= [];
2858 extraend
= extrastart
+ catfextrafields
;
2859 extrafieldslist
= [];
2860 if(extrastart
<extraend
):
2861 extrafieldslist
.append(catheaderdata
[extrastart
]);
2862 extrastart
= extrastart
+ 1;
2863 catfchecksumtype
= catheaderdata
[extrastart
].lower();
2864 catfcs
= catheaderdata
[extrastart
+ 1].lower();
2865 catfccs
= catheaderdata
[extrastart
+ 2].lower();
2867 extrafieldslist
= [];
2868 if(catfextrafields
>0):
2869 extrafieldslist
= ReadFileHeaderData(catfp
, catfextrafields
, formatspecs
[4]);
2870 checksumsval
= ReadFileHeaderData(catfp
, 3, formatspecs
[4]);
2871 catfchecksumtype
= checksumsval
[0].lower();
2872 catfcs
= checksumsval
[1].lower();
2873 catfccs
= checksumsval
[2].lower();
2876 hcmax
= len(catheaderdata
) - 2;
2878 hcmax
= len(catheaderdata
);
2881 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[4]);
2883 catfnumfields
= 24 + catfextrafields
;
2884 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
2886 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
2887 catnewfcs
= format(crc16(hout
.encode('UTF-8')) & 0xffff, '04x').lower();
2888 elif(catfchecksumtype
=="adler32"):
2889 catnewfcs
= format(zlib
.adler32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2890 elif(catfchecksumtype
=="crc32"):
2891 catnewfcs
= format(crc32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2892 elif(catfchecksumtype
=="crc64_ecma"):
2893 catnewfcs
= format(crc64_ecma(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2894 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
2895 catnewfcs
= format(crc64_iso(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2896 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
2897 checksumoutstr
= hashlib
.new(catfchecksumtype
);
2898 checksumoutstr
.update(hout
.encode('UTF-8'));
2899 catnewfcs
= checksumoutstr
.hexdigest().lower();
2900 if(catfcs
!=catnewfcs
and not skipchecksum
):
2901 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
2903 catfhend
= catfp
.tell() - 1;
2904 catfcontentstart
= catfp
.tell();
2906 pyhascontents
= False;
2907 if(catfsize
>0 and not listonly
):
2908 catfcontents
= catfp
.read(catfsize
);
2909 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
2911 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
2912 catnewfccs
= format(crc16(catfcontents
) & 0xffff, '04x').lower();
2913 elif(catfchecksumtype
=="crc16_ccitt"):
2914 catnewfcs
= format(crc16_ccitt(catfcontents
) & 0xffff, '04x').lower();
2915 elif(catfchecksumtype
=="adler32"):
2916 catnewfccs
= format(zlib
.adler32(catfcontents
) & 0xffffffff, '08x').lower();
2917 elif(catfchecksumtype
=="crc32"):
2918 catnewfccs
= format(crc32(catfcontents
) & 0xffffffff, '08x').lower();
2919 elif(catfchecksumtype
=="crc64_ecma"):
2920 catnewfcs
= format(crc64_ecma(catfcontents
) & 0xffffffffffffffff, '016x').lower();
2921 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
2922 catnewfcs
= format(crc64_iso(catfcontents
) & 0xffffffffffffffff, '016x').lower();
2923 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
2924 checksumoutstr
= hashlib
.new(catfchecksumtype
);
2925 checksumoutstr
.update(catfcontents
);
2926 catnewfccs
= checksumoutstr
.hexdigest().lower();
2927 pyhascontents
= True;
2928 if(catfccs
!=catnewfccs
and skipchecksum
):
2929 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
2931 if(catfsize
>0 and listonly
):
2932 catfp
.seek(catfsize
, 1);
2933 pyhascontents
= False;
2935 catfcontentend
= catfp
.tell() - 1;
2936 catlist
['ffilelist'].update({realidnum
: {'fid': realidnum
, 'fidalt': fileidnum
, 'fheadersize': catfheadsize
, 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
, 'fatime': catfatime
, 'fmtime': catfmtime
, 'fctime': catfctime
, 'fbtime': catfbtime
, 'fmode': catfmode
, 'fchmode': catfchmode
, 'ftypemod': catftypemod
, 'fuid': catfuid
, 'funame': catfuname
, 'fgid': catfgid
, 'fgname': catfgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': catfdev_minor
, 'fmajor': catfdev_major
, 'frminor': catfrdev_minor
, 'frmajor': catfrdev_major
, 'fchecksumtype': catfchecksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': catfextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': catfcs
, 'fcontentchecksum': catfccs
, 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': catfcontents
} });
2937 fileidnum
= fileidnum
+ 1;
2938 realidnum
= realidnum
+ 1;
2940 catlist
.update({'catfp': catfp
});
2945 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
2947 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2948 catfp
= BytesIO(catstr
);
2949 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2950 return listcatfiles
;
2952 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
2954 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2956 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
2957 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2958 return listcatfiles
;
2960 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2962 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
2963 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2964 return listcatfiles
;
2966 if(not rarfile_support
):
2967 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2970 if(rarfile_support
):
2971 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2973 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
2974 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2975 return listcatfiles
;
2977 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
2978 catver
= formatspecs
[5];
2979 fileheaderver
= str(int(catver
.replace(".", "")));
2980 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
2981 advancedlist
= True;
2984 for line
in sys
.stdin
:
2985 infilelist
.append(line
.strip());
2986 infilelist
= list(filter(None, infilelist
));
2987 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2988 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2990 with
open(infiles
, "r") as finfile
:
2991 for line
in finfile
:
2992 infilelist
.append(line
.strip());
2993 infilelist
= list(filter(None, infilelist
));
2995 if(isinstance(infiles
, (list, tuple, ))):
2996 infilelist
= list(filter(None, infiles
));
2997 elif(isinstance(infiles
, (str, ))):
2998 infilelist
= list(filter(None, [infiles
]));
3000 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
3002 GetDirList
= ListDir(infilelist
, followlink
, False);
3010 inodetocatinode
= {};
3012 fnumfiles
= int(len(GetDirList
));
3013 catver
= formatspecs
[5];
3014 fileheaderver
= str(int(catver
.replace(".", "")));
3015 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
3016 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3017 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[4]);
3018 catversion
= fileheaderver
;
3019 if(checksumtype
=="none" or checksumtype
==""):
3020 catfileheadercshex
= format(0, 'x').lower();
3021 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3022 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3023 elif(checksumtype
=="crc16_ccitt"):
3024 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3025 elif(checksumtype
=="adler32"):
3026 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3027 elif(checksumtype
=="crc32"):
3028 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3029 elif(checksumtype
=="crc64_ecma"):
3030 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3031 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3032 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3033 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3034 checksumoutstr
= hashlib
.new(checksumtype
);
3035 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3036 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3038 catfileheadercshex
= format(0, 'x').lower();
3039 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
3040 fheadtell
= len(fileheader
);
3041 catlist
= {'fnumfiles': fnumfiles
, 'fformat': formatspecs
[0], 'fversion': catversion
, 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3042 for curfname
in GetDirList
:
3043 if(re
.findall("^[.|/]", curfname
)):
3046 fname
= "./"+curfname
;
3048 VerbosePrintOut(fname
);
3049 if(not followlink
or followlink
is None):
3050 fstatinfo
= os
.lstat(fname
);
3052 fstatinfo
= os
.stat(fname
);
3053 fpremode
= fstatinfo
.st_mode
;
3054 finode
= fstatinfo
.st_ino
;
3055 flinkcount
= fstatinfo
.st_nlink
;
3057 if(stat
.S_ISREG(fpremode
)):
3059 elif(stat
.S_ISLNK(fpremode
)):
3061 elif(stat
.S_ISCHR(fpremode
)):
3063 elif(stat
.S_ISBLK(fpremode
)):
3065 elif(stat
.S_ISDIR(fpremode
)):
3067 elif(stat
.S_ISFIFO(fpremode
)):
3069 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
3071 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
3073 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
3078 fbasedir
= os
.path
.dirname(fname
);
3080 if(not followlink
and finode
!=0):
3082 if(finode
in inodelist
):
3084 flinkname
= inodetofile
[finode
];
3085 fcurinode
= inodetocatinode
[finode
];
3086 if(finode
not in inodelist
):
3087 inodelist
.append(finode
);
3088 inodetofile
.update({finode
: fname
});
3089 inodetocatinode
.update({finode
: curinode
});
3090 fcurinode
= curinode
;
3091 curinode
= curinode
+ 1;
3093 fcurinode
= curinode
;
3094 curinode
= curinode
+ 1;
3095 curfid
= curfid
+ 1;
3097 flinkname
= os
.readlink(fname
);
3098 fdev
= fstatinfo
.st_dev
;
3099 getfdev
= GetDevMajorMinor(fdev
);
3100 fdev_minor
= getfdev
[0];
3101 fdev_major
= getfdev
[1];
3102 frdev
= fstatinfo
.st_dev
;
3103 if(hasattr(fstatinfo
, "st_rdev")):
3104 frdev
= fstatinfo
.st_rdev
;
3106 frdev
= fstatinfo
.st_dev
;
3107 getfrdev
= GetDevMajorMinor(frdev
);
3108 frdev_minor
= getfrdev
[0];
3109 frdev_major
= getfrdev
[1];
3110 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3112 if(ftype
==0 or ftype
==7):
3113 fsize
= fstatinfo
.st_size
;
3114 fatime
= fstatinfo
.st_atime
;
3115 fmtime
= fstatinfo
.st_mtime
;
3116 fctime
= fstatinfo
.st_ctime
;
3117 if(hasattr(fstatinfo
, "st_birthtime")):
3118 fbtime
= fstatinfo
.st_birthtime
;
3120 fbtime
= fstatinfo
.st_ctime
;
3121 fmode
= fstatinfo
.st_mode
;
3122 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
3123 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
3124 fuid
= fstatinfo
.st_uid
;
3125 fgid
= fstatinfo
.st_gid
;
3130 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
3131 funame
= userinfo
.pw_name
;
3140 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
3141 fgname
= groupinfo
.gr_name
;
3146 fdev_minor
= fdev_minor
;
3147 fdev_major
= fdev_major
;
3148 frdev_minor
= frdev_minor
;
3149 frdev_major
= frdev_major
;
3151 flinkcount
= flinkcount
;
3152 if(hasattr(fstatinfo
, "st_file_attributes")):
3153 fwinattributes
= fstatinfo
.st_file_attributes
;
3156 fcontents
= "".encode('UTF-8');
3158 if(ftype
== 0 or ftype
== 7):
3159 with
open(fname
, "rb") as fpc
:
3161 chunk
= fpc
.read(chunk_size
);
3165 if(followlink
and (ftype
== 1 or ftype
== 2)):
3166 flstatinfo
= os
.stat(flinkname
);
3167 with
open(flinkname
, "rb") as fpc
:
3169 chunk
= fpc
.read(chunk_size
);
3173 ftypehex
= format(ftype
, 'x').lower();
3174 extrafields
= len(extradata
);
3175 extrafieldslist
= extradata
;
3176 catfextrafields
= extrafields
;
3177 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
3178 if(len(extradata
)>0):
3179 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3180 extrasizelen
= len(extrasizestr
);
3181 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3182 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[4]);
3183 if(len(extradata
)>0):
3184 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3185 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
3186 catfnumfields
= 24 + catfextrafields
;
3187 if(checksumtype
=="none" or checksumtype
==""):
3188 catfileheadercshex
= format(0, 'x').lower();
3189 catfilecontentcshex
= format(0, 'x').lower();
3190 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3191 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3192 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3193 elif(checksumtype
=="crc16_ccitt"):
3194 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3195 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3196 elif(checksumtype
=="adler32"):
3197 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3198 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3199 elif(checksumtype
=="crc32"):
3200 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3201 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3202 elif(checksumtype
=="crc64_ecma"):
3203 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3204 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3205 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3206 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3207 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3208 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3209 checksumoutstr
= hashlib
.new(checksumtype
);
3210 checksumoutstr
.update("".encode('UTF-8'));
3211 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3212 checksumoutstr
= hashlib
.new(checksumtype
);
3213 checksumoutstr
.update(fcontents
);
3214 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3216 catfileheadercshex
= format(0, 'x').lower();
3217 catfilecontentcshex
= format(0, 'x').lower();
3218 catfhstart
= fheadtell
;
3219 fheadtell
+= len(catfileoutstr
);
3220 catfhend
= fheadtell
- 1;
3221 catfcontentstart
= fheadtell
;
3222 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3223 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3224 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
3225 if(checksumtype
=="none" or checksumtype
==""):
3226 catfileheadercshex
= format(0, 'x').lower();
3227 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3228 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3229 elif(checksumtype
=="crc16_ccitt"):
3230 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3231 elif(checksumtype
=="adler32"):
3232 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3233 elif(checksumtype
=="crc32"):
3234 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3235 elif(checksumtype
=="crc64_ecma"):
3236 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3237 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3238 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3239 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3240 checksumoutstr
= hashlib
.new(checksumtype
);
3241 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3242 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3244 catfileheadercshex
= format(0, 'x').lower();
3245 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3246 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3247 nullstrecd
= formatspecs
[4].encode('UTF-8');
3248 fheadtell
+= len(catfileoutstr
) + 1;
3249 catfcontentend
= fheadtell
- 1;
3250 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3251 pyhascontents
= False;
3252 if(int(fsize
)>0 and not listonly
):
3253 pyhascontents
= True;
3254 if(int(fsize
)>0 and listonly
):
3256 pyhascontents
= False;
3257 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3258 fileidnum
= fileidnum
+ 1;
3261 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3267 inodetocatinode
= {};
3269 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
3272 if(not tarfile
.is_tarfile(infiles
)):
3274 except AttributeError:
3275 if(not is_tarfile(infiles
)):
3278 tarfp
= tarfile
.open(infiles
, "r");
3279 except FileNotFoundError
:
3281 fnumfiles
= int(len(tarfp
.getmembers()));
3282 catver
= formatspecs
[5];
3283 fileheaderver
= str(int(catver
.replace(".", "")));
3284 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
3285 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3286 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[4]);
3287 catversion
= fileheaderver
;
3288 if(checksumtype
=="none" or checksumtype
==""):
3289 catfileheadercshex
= format(0, 'x').lower();
3290 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3291 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3292 elif(checksumtype
=="crc16_ccitt"):
3293 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3294 elif(checksumtype
=="adler32"):
3295 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3296 elif(checksumtype
=="crc32"):
3297 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3298 elif(checksumtype
=="crc64_ecma"):
3299 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3300 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3301 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3302 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3303 checksumoutstr
= hashlib
.new(checksumtype
);
3304 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3305 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3307 catfileheadercshex
= format(0, 'x').lower();
3308 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
3309 fheadtell
= len(fileheader
);
3310 catlist
= {'fnumfiles': fnumfiles
, 'fformat': formatspecs
[0], 'fversion': catversion
, 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3311 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3312 if(re
.findall("^[.|/]", member
.name
)):
3313 fname
= member
.name
;
3315 fname
= "./"+member
.name
;
3317 VerbosePrintOut(fname
);
3318 fpremode
= member
.mode
;
3319 ffullmode
= member
.mode
;
3323 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3325 elif(member
.isdev()):
3326 ffullmode
= member
.mode
;
3328 elif(member
.islnk()):
3329 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3331 elif(member
.issym()):
3332 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3334 elif(member
.ischr()):
3335 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3337 elif(member
.isblk()):
3338 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3340 elif(member
.isdir()):
3341 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3343 elif(member
.isfifo()):
3344 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3346 elif(member
.issparse()):
3347 ffullmode
= member
.mode
;
3350 ffullmode
= member
.mode
;
3353 fbasedir
= os
.path
.dirname(fname
);
3357 curfid
= curfid
+ 1;
3359 flinkname
= member
.linkname
;
3360 fdev_minor
= member
.devminor
;
3361 fdev_major
= member
.devmajor
;
3362 frdev_minor
= member
.devminor
;
3363 frdev_major
= member
.devmajor
;
3364 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3366 elif(ftype
==0 or ftype
==7):
3367 fsize
= member
.size
;
3369 fsize
= member
.size
;
3370 fatime
= member
.mtime
;
3371 fmtime
= member
.mtime
;
3372 fctime
= member
.mtime
;
3373 fbtime
= member
.mtime
;
3375 fchmode
= stat
.S_IMODE(ffullmode
);
3376 ftypemod
= stat
.S_IFMT(ffullmode
);
3379 funame
= member
.uname
;
3380 fgname
= member
.gname
;
3381 flinkcount
= flinkcount
;
3382 fcontents
= "".encode('UTF-8');
3384 if(ftype
== 0 or ftype
== 7):
3385 with tarfp
.extractfile(member
) as fpc
:
3387 chunk
= fpc
.read(chunk_size
);
3391 ftypehex
= format(ftype
, 'x').lower();
3392 extrafields
= len(extradata
);
3393 extrafieldslist
= extradata
;
3394 catfextrafields
= extrafields
;
3395 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
3396 if(len(extradata
)>0):
3397 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3398 extrasizelen
= len(extrasizestr
);
3399 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3400 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[4]);
3401 if(len(extradata
)>0):
3402 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3403 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
3404 catfnumfields
= 24 + catfextrafields
;
3405 if(checksumtype
=="none" or checksumtype
==""):
3406 catfileheadercshex
= format(0, 'x').lower();
3407 catfilecontentcshex
= format(0, 'x').lower();
3408 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3409 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3410 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3411 elif(checksumtype
=="crc16_ccitt"):
3412 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3413 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3414 elif(checksumtype
=="adler32"):
3415 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3416 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3417 elif(checksumtype
=="crc32"):
3418 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3419 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3420 elif(checksumtype
=="crc64_ecma"):
3421 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3422 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3423 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3424 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3425 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3426 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3427 checksumoutstr
= hashlib
.new(checksumtype
);
3428 checksumoutstr
.update("".encode('UTF-8'));
3429 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3430 checksumoutstr
= hashlib
.new(checksumtype
);
3431 checksumoutstr
.update(fcontents
);
3432 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3434 catfileheadercshex
= format(0, 'x').lower();
3435 catfilecontentcshex
= format(0, 'x').lower();
3436 catfhstart
= fheadtell
;
3437 fheadtell
+= len(catfileoutstr
);
3438 catfhend
= fheadtell
- 1;
3439 catfcontentstart
= fheadtell
;
3440 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3441 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3442 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
3443 if(checksumtype
=="none" or checksumtype
==""):
3444 catfileheadercshex
= format(0, 'x').lower();
3445 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3446 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3447 elif(checksumtype
=="crc16_ccitt"):
3448 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3449 elif(checksumtype
=="adler32"):
3450 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3451 elif(checksumtype
=="crc32"):
3452 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3453 elif(checksumtype
=="crc64_ecma"):
3454 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3455 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3456 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3457 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3458 checksumoutstr
= hashlib
.new(checksumtype
);
3459 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3460 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3462 catfileheadercshex
= format(0, 'x').lower();
3463 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3464 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3465 nullstrecd
= formatspecs
[4].encode('UTF-8');
3466 fheadtell
+= len(catfileoutstr
) + 1;
3467 catfcontentend
= fheadtell
- 1;
3468 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3469 pyhascontents
= False;
3470 if(int(fsize
)>0 and not listonly
):
3471 pyhascontents
= True;
3472 if(int(fsize
)>0 and listonly
):
3474 pyhascontents
= False;
3475 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3476 fileidnum
= fileidnum
+ 1;
3479 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3480 advancedlist
= True;
3486 inodetocatinode
= {};
3488 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
3490 if(not zipfile
.is_zipfile(infiles
)):
3492 zipfp
= zipfile
.ZipFile(infiles
, "r", allowZip64
=True);
3493 ziptest
= zipfp
.testzip();
3495 VerbosePrintOut("Bad file found!");
3496 fnumfiles
= int(len(zipfp
.infolist()));
3497 catver
= formatspecs
[5];
3498 fileheaderver
= str(int(catver
.replace(".", "")));
3499 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
3500 catversion
= fileheaderver
;
3501 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3502 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[4]);
3503 if(checksumtype
=="none" or checksumtype
==""):
3504 catfileheadercshex
= format(0, 'x').lower();
3505 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3506 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3507 elif(checksumtype
=="crc16_ccitt"):
3508 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3509 elif(checksumtype
=="adler32"):
3510 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3511 elif(checksumtype
=="crc32"):
3512 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3513 elif(checksumtype
=="crc64_ecma"):
3514 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3515 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3516 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3517 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3518 checksumoutstr
= hashlib
.new(checksumtype
);
3519 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3520 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3522 catfileheadercshex
= format(0, 'x').lower();
3523 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
3524 fheadtell
= len(fileheader
);
3525 catlist
= {'fnumfiles': fnumfiles
, 'fformat': formatspecs
[0], 'fversion': catversion
, 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3526 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3527 if(re
.findall("^[.|/]", member
.filename
)):
3528 fname
= member
.filename
;
3530 fname
= "./"+member
.filename
;
3531 zipinfo
= zipfp
.getinfo(member
.filename
);
3533 VerbosePrintOut(fname
);
3534 if(not member
.is_dir()):
3535 fpremode
= stat
.S_IFREG
+ 438;
3536 elif(member
.is_dir()):
3537 fpremode
= stat
.S_IFDIR
+ 511;
3540 if(not member
.is_dir()):
3542 elif(member
.is_dir()):
3545 fbasedir
= os
.path
.dirname(fname
);
3549 curfid
= curfid
+ 1;
3557 fsize
= member
.file_size
;
3559 fsize
= member
.file_size
;
3560 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3561 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3562 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3563 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3564 if(not member
.is_dir()):
3565 fmode
= stat
.S_IFREG
+ 438;
3566 fchmode
= stat
.S_IMODE(int(stat
.S_IFREG
+ 438));
3567 ftypemod
= stat
.S_IFMT(int(stat
.S_IFREG
+ 438));
3568 if(member
.is_dir()):
3569 fmode
= stat
.S_IFDIR
+ 511;
3570 fchmode
= stat
.S_IMODE(int(stat
.S_IFDIR
+ 511));
3571 ftypemod
= stat
.S_IFMT(int(stat
.S_IFDIR
+ 511));
3574 except AttributeError:
3580 except AttributeError:
3587 userinfo
= pwd
.getpwuid(os
.getuid());
3588 funame
= userinfo
.pw_name
;
3591 except AttributeError:
3599 groupinfo
= grp
.getgrgid(os
.getgid());
3600 fgname
= groupinfo
.gr_name
;
3603 except AttributeError:
3607 fcontents
= "".encode('UTF-8');
3609 fcontents
= zipfp
.read(member
.filename
);
3610 ftypehex
= format(ftype
, 'x').lower();
3611 extrafields
= len(extradata
);
3612 extrafieldslist
= extradata
;
3613 catfextrafields
= extrafields
;
3614 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
3615 if(len(extradata
)>0):
3616 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3617 extrasizelen
= len(extrasizestr
);
3618 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3619 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[4]);
3620 if(len(extradata
)>0):
3621 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3622 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
3623 catfnumfields
= 24 + catfextrafields
;
3624 if(checksumtype
=="none" or checksumtype
==""):
3625 catfileheadercshex
= format(0, 'x').lower();
3626 catfilecontentcshex
= format(0, 'x').lower();
3627 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3628 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3629 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3630 elif(checksumtype
=="crc16_ccitt"):
3631 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3632 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3633 elif(checksumtype
=="adler32"):
3634 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3635 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3636 elif(checksumtype
=="crc32"):
3637 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3638 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3639 elif(checksumtype
=="crc64_ecma"):
3640 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3641 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3642 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3643 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3644 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3645 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3646 checksumoutstr
= hashlib
.new(checksumtype
);
3647 checksumoutstr
.update("".encode('UTF-8'));
3648 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3649 checksumoutstr
= hashlib
.new(checksumtype
);
3650 checksumoutstr
.update(fcontents
);
3651 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3653 catfileheadercshex
= format(0, 'x').lower();
3654 catfilecontentcshex
= format(0, 'x').lower();
3655 catfhstart
= fheadtell
;
3656 fheadtell
+= len(catfileoutstr
);
3657 catfhend
= fheadtell
- 1;
3658 catfcontentstart
= fheadtell
;
3659 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3660 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3661 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
3662 if(checksumtype
=="none" or checksumtype
==""):
3663 catfileheadercshex
= format(0, 'x').lower();
3664 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3665 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3666 elif(checksumtype
=="crc16_ccitt"):
3667 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3668 elif(checksumtype
=="adler32"):
3669 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3670 elif(checksumtype
=="crc32"):
3671 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3672 elif(checksumtype
=="crc64_ecma"):
3673 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3674 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3675 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3676 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3677 checksumoutstr
= hashlib
.new(checksumtype
);
3678 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3679 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3681 catfileheadercshex
= format(0, 'x').lower();
3682 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3683 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3684 nullstrecd
= formatspecs
[4].encode('UTF-8');
3685 fheadtell
+= len(catfileoutstr
) + 1;
3686 catfcontentend
= fheadtell
- 1;
3687 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3688 pyhascontents
= False;
3689 if(int(fsize
)>0 and not listonly
):
3690 pyhascontents
= True;
3691 if(int(fsize
)>0 and listonly
):
3693 pyhascontents
= False;
3694 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3695 fileidnum
= fileidnum
+ 1;
3698 if(not rarfile_support
):
3699 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3702 if(rarfile_support
):
3703 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3704 advancedlist
= True;
3710 inodetocatinode
= {};
3712 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
3714 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3716 rarfp
= rarfile
.RarFile(infile
, "r");
3717 rartest
= rarfp
.testrar();
3719 VerbosePrintOut("Bad file found!");
3720 fnumfiles
= int(len(rarfp
.infolist()));
3721 catver
= formatspecs
[5];
3722 fileheaderver
= str(int(catver
.replace(".", "")));
3723 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
3724 catversion
= fileheaderver
;
3725 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3726 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[4]);
3727 if(checksumtype
=="none" or checksumtype
==""):
3728 catfileheadercshex
= format(0, 'x').lower();
3729 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3730 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3731 elif(checksumtype
=="crc16_ccitt"):
3732 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3733 elif(checksumtype
=="adler32"):
3734 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3735 elif(checksumtype
=="crc32"):
3736 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3737 elif(checksumtype
=="crc64_ecma"):
3738 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3739 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3740 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3741 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3742 checksumoutstr
= hashlib
.new(checksumtype
);
3743 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3744 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3746 catfileheadercshex
= format(0, 'x').lower();
3747 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
3748 fheadtell
= len(fileheader
);
3749 catlist
= {'fnumfiles': fnumfiles
, 'fformat': formatspecs
[0], 'fversion': catversion
, 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3750 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3753 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
3756 member
.external_attr
3758 except AttributeError:
3760 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
3763 member
.external_attr
3765 except AttributeError:
3770 if(re
.findall("^[.|/]", member
.filename
)):
3771 fname
= member
.filename
;
3773 fname
= "./"+member
.filename
;
3774 rarinfo
= rarfp
.getinfo(member
.filename
);
3776 VerbosePrintOut(fname
);
3777 if(is_unix
and member
.external_attr
!=0):
3778 fpremode
= int(member
.external_attr
);
3779 elif(member
.is_file()):
3780 fpremode
= stat
.S_IFREG
+ 438;
3781 elif(member
.is_symlink()):
3782 fpremode
= stat
.S_IFLNK
+ 438;
3783 elif(member
.is_dir()):
3784 fpremode
= stat
.S_IFDIR
+ 511;
3785 if(is_windows
and member
.external_attr
!=0):
3786 fwinattributes
= int(member
.external_attr
);
3788 fwinattributes
= int(0);
3791 if(member
.is_file()):
3793 elif(member
.is_symlink()):
3795 elif(member
.is_dir()):
3799 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3800 fbasedir
= os
.path
.dirname(fname
);
3804 curfid
= curfid
+ 1;
3812 fsize
= member
.file_size
;
3815 fatime
= int(member
.atime
.timestamp());
3817 fatime
= int(member
.mtime
.timestamp());
3818 except AttributeError:
3819 fatime
= int(member
.mtime
.timestamp());
3820 fmtime
= int(member
.mtime
.timestamp());
3823 fctime
= int(member
.ctime
.timestamp());
3825 fctime
= int(member
.mtime
.timestamp());
3826 except AttributeError:
3827 fctime
= int(member
.mtime
.timestamp());
3828 fbtime
= int(member
.mtime
.timestamp());
3829 if(is_unix
and member
.external_attr
!=0):
3830 fmode
= format(int(member
.external_attr
), 'x').lower();
3831 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3832 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3833 elif(member
.is_file()):
3834 fmode
= int(stat
.S_IFREG
+ 438)
3835 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
3836 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
3837 elif(member
.is_symlink()):
3838 fmode
= int(stat
.S_IFLNK
+ 438)
3839 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
3840 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
3841 elif(member
.is_dir()):
3842 fmode
= int(stat
.S_IFDIR
+ 511)
3843 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
3844 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
3847 except AttributeError:
3853 except AttributeError:
3860 userinfo
= pwd
.getpwuid(os
.getuid());
3861 funame
= userinfo
.pw_name
;
3864 except AttributeError:
3872 groupinfo
= grp
.getgrgid(os
.getgid());
3873 fgname
= groupinfo
.gr_name
;
3876 except AttributeError:
3880 fcontents
= "".encode('UTF-8');
3882 fcontents
= rarfp
.read(member
.filename
);
3883 ftypehex
= format(ftype
, 'x').lower();
3884 extrafields
= len(extradata
);
3885 extrafieldslist
= extradata
;
3886 catfextrafields
= extrafields
;
3887 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
3888 if(len(extradata
)>0):
3889 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3890 extrasizelen
= len(extrasizestr
);
3891 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3892 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[4]);
3893 if(len(extradata
)>0):
3894 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[4]);
3895 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[4]);
3896 catfnumfields
= 24 + catfextrafields
;
3897 if(checksumtype
=="none" or checksumtype
==""):
3898 catfileheadercshex
= format(0, 'x').lower();
3899 catfilecontentcshex
= format(0, 'x').lower();
3900 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3901 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3902 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3903 elif(checksumtype
=="crc16_ccitt"):
3904 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3905 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3906 elif(checksumtype
=="adler32"):
3907 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3908 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3909 elif(checksumtype
=="crc32"):
3910 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3911 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3912 elif(checksumtype
=="crc64_ecma"):
3913 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3914 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3915 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3916 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3917 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3918 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3919 checksumoutstr
= hashlib
.new(checksumtype
);
3920 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3921 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3923 catfileheadercshex
= format(0, 'x').lower();
3924 catfilecontentcshex
= format(0, 'x').lower();
3925 catfhstart
= fheadtell
;
3926 fheadtell
+= len(catfileoutstr
);
3927 catfhend
= fheadtell
- 1;
3928 catfcontentstart
= fheadtell
;
3929 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3930 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3931 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
3932 if(checksumtype
=="none" or checksumtype
==""):
3933 catfileheadercshex
= format(0, 'x').lower();
3934 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3935 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3936 elif(checksumtype
=="crc16_ccitt"):
3937 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3938 elif(checksumtype
=="adler32"):
3939 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3940 elif(checksumtype
=="crc32"):
3941 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3942 elif(checksumtype
=="crc64_ecma"):
3943 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3944 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3945 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3946 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3947 checksumoutstr
= hashlib
.new(checksumtype
);
3948 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3949 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3951 catfileheadercshex
= format(0, 'x').lower();
3952 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
3953 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3954 nullstrecd
= formatspecs
[4].encode('UTF-8');
3955 fheadtell
+= len(catfileoutstr
) + 1;
3956 catfcontentend
= fheadtell
- 1;
3957 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3958 pyhascontents
= False;
3959 if(int(fsize
)>0 and not listonly
):
3960 pyhascontents
= True;
3961 if(int(fsize
)>0 and listonly
):
3963 pyhascontents
= False;
3964 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3965 fileidnum
= fileidnum
+ 1;
3968 def ListDirToArray(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3969 outarray
= BytesIO();
3970 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
3971 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3972 return listcatfiles
;
3974 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3975 if(isinstance(infile
, dict)):
3976 listcatfiles
= infile
;
3978 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
3979 infile
= RemoveWindowsPath(infile
);
3980 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3981 if(not listcatfiles
):
3983 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
3985 catarray
.update({'catfp': listcatfiles
['catfp']});
3986 lenlist
= len(listcatfiles
['ffilelist']);
3991 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
3994 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
3995 lcfx
= listcatfiles
['fnumfiles'];
3997 lcfx
= int(listcatfiles
['fnumfiles']);
3999 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4000 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4001 catarray
['filetoid'].update(filetoidarray
);
4002 catarray
['idtofile'].update(idtofilearray
);
4003 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4004 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4005 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4006 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4007 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4008 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4009 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4010 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4011 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4012 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4013 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4014 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4015 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4016 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4017 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4018 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4019 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4020 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4021 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4022 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4023 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4024 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4025 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4026 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4027 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4028 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4029 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4030 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4031 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4032 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4033 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4037 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
4039 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4040 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4041 if(not listcatfiles
):
4043 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4044 lenlist
= len(listcatfiles
['ffilelist']);
4049 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4052 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4053 lcfx
= listcatfiles
['fnumfiles'];
4055 lcfx
= int(listcatfiles
['fnumfiles']);
4057 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4058 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4059 catarray
['filetoid'].update(filetoidarray
);
4060 catarray
['idtofile'].update(idtofilearray
);
4061 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4062 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4063 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4064 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4065 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4066 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4067 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4068 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4069 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4070 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4071 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4072 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4073 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4074 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4075 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4076 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4077 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4078 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4079 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4080 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4081 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4082 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4083 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4084 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4085 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4086 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4087 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4088 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4089 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4090 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4091 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4095 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4096 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4097 if(not listcatfiles
):
4099 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4100 lenlist
= len(listcatfiles
['ffilelist']);
4105 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4108 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4109 lcfx
= listcatfiles
['fnumfiles'];
4111 lcfx
= int(listcatfiles
['fnumfiles']);
4113 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4114 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4115 catarray
['filetoid'].update(filetoidarray
);
4116 catarray
['idtofile'].update(idtofilearray
);
4117 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4118 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4119 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4120 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4121 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4122 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4123 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4124 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4125 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4126 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4127 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4128 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4129 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4130 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4131 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4132 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4133 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4134 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4135 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4136 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4137 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4138 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4139 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4140 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4141 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4142 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4143 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4144 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4145 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4146 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4147 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4151 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4152 listcatfiles
= ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4153 if(not listcatfiles
):
4155 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4156 lenlist
= len(listcatfiles
['ffilelist']);
4161 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4164 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4165 lcfx
= listcatfiles
['fnumfiles'];
4167 lcfx
= int(listcatfiles
['fnumfiles']);
4169 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4170 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4171 catarray
['filetoid'].update(filetoidarray
);
4172 catarray
['idtofile'].update(idtofilearray
);
4173 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4174 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4175 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4176 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4177 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4178 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4179 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4180 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4181 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4182 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4183 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4184 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4185 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4186 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4187 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4188 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4189 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4190 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4191 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4192 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4193 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4194 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4195 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4196 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4197 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4198 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4199 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4200 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4201 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4202 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4203 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4207 if(not rarfile_support
):
4208 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4211 if(rarfile_support
):
4212 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4213 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4214 if(not listcatfiles
):
4216 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4217 lenlist
= len(listcatfiles
['ffilelist']);
4222 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4225 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4226 lcfx
= listcatfiles
['fnumfiles'];
4228 lcfx
= int(listcatfiles
['fnumfiles']);
4230 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4231 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4232 catarray
['filetoid'].update(filetoidarray
);
4233 catarray
['idtofile'].update(idtofilearray
);
4234 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4235 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4236 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4237 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4238 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4239 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4240 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4241 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4242 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4243 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4244 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4245 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4246 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4247 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4248 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4249 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4250 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4251 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4252 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4253 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4254 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4255 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4256 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4257 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4258 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4259 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4260 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4261 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4262 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4263 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4264 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4268 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4269 catfp
= BytesIO(catstr
);
4270 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4271 return listcatfiles
;
4273 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
4275 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4277 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4278 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4279 return listcatfiles
;
4281 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4283 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4284 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4285 return listcatfiles
;
4287 if(not rarfile_support
):
4288 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4291 if(rarfile_support
):
4292 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4294 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4295 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4296 return listcatfiles
;
4298 def ListDirToArrayIndex(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4299 outarray
= BytesIO();
4300 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
4301 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
4302 return listcatfiles
;
4304 def RePackArchiveFile(infile
, outfile
, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4305 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
4306 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzop', 'lzo', 'lzma', 'xz'];
4307 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', 'lzop', '.lzo', '.lzma', '.xz'];
4308 if(isinstance(infile
, dict)):
4309 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4310 listcatfiles
= prelistcatfiles
['list'];
4312 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4313 infile
= RemoveWindowsPath(infile
);
4315 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4316 listcatfiles
= prelistcatfiles
['list'];
4318 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4319 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
4320 outfile
= RemoveWindowsPath(outfile
);
4321 checksumtype
= checksumtype
.lower();
4322 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
4323 checksumtype
="crc32";
4324 if(checksumtype
=="none"):
4326 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[1]):
4328 if(compression
not in compressionlist
and compression
is None):
4329 compression
= "auto";
4331 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4332 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4333 if(os
.path
.exists(outfile
)):
4335 if(not listcatfiles
):
4340 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4343 fbasename
= os
.path
.splitext(outfile
)[0];
4344 fextname
= os
.path
.splitext(outfile
)[1];
4345 catfp
= CompressOpenFile(outfile
, compressionlevel
);
4346 catver
= formatspecs
[5];
4347 fileheaderver
= str(int(catver
.replace(".", "")));
4348 fileheader
= AppendNullByte(formatspecs
[0] + fileheaderver
, formatspecs
[4]);
4349 catfp
.write(fileheader
.encode('UTF-8'));
4350 lenlist
= len(listcatfiles
['ffilelist']);
4351 fnumfiles
= int(listcatfiles
['fnumfiles']);
4352 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
4353 fnumfiles
= lenlist
;
4354 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4355 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[4]);
4356 if(checksumtype
=="none" or checksumtype
==""):
4357 catfileheadercshex
= format(0, 'x').lower();
4358 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4359 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
4360 elif(checksumtype
=="crc16_ccitt"):
4361 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
4362 elif(checksumtype
=="adler32"):
4363 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
4364 elif(checksumtype
=="crc32"):
4365 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
4366 elif(checksumtype
=="crc64_ecma"):
4367 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4368 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4369 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4370 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4371 checksumoutstr
= hashlib
.new(checksumtype
);
4372 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
4373 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4375 catfileheadercshex
= format(0, 'x').lower();
4376 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[4]);
4377 catfp
.write(fnumfilesa
.encode('UTF-8'));
4380 os
.fsync(catfp
.fileno());
4381 except io
.UnsupportedOperation
:
4383 except AttributeError:
4389 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4392 lcfx
= int(listcatfiles
['fnumfiles']);
4400 catfhstart
= catfp
.tell();
4401 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
4402 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
4404 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
4406 VerbosePrintOut(fname
);
4407 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
4408 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
4409 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
4410 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
4411 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
4412 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
4413 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
4414 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
4415 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
4416 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
4417 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
4418 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
4419 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
4420 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
4421 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
4422 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
4423 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
4424 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
4425 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
4426 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
4427 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
4428 if(len(extradata
) > 0):
4429 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
4430 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
4431 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
4432 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
4433 if(len(extradata
)>0):
4434 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
4435 extrasizelen
= format(len(extrasizestr
), 'x').lower();
4436 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
4438 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
4439 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
4440 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
4441 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
4442 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
4443 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
4444 flinkname
= flinkinfo
['flinkname'];
4445 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
4446 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
4447 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
4448 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
4449 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
4450 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
4451 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
4452 funame
= flinkinfo
['funame'];
4453 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
4454 fgname
= flinkinfo
['fgname'];
4455 finode
= flinkinfo
['finode'];
4456 flinkcount
= flinkinfo
['flinkcount'];
4457 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
4458 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
4459 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
4460 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
4461 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
4462 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
4463 if(len(extradata
) > 0):
4464 flinkinfo
['fextrafields'] = len(extradata
);
4465 flinkinfo
['fextralist'] = extradata
;
4466 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
4467 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[4]);
4468 if(len(extradata
)>0):
4469 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[4]);
4470 extrasizelen
= format(len(extrasizestr
), 'x').lower();
4471 fcontents
= flinkinfo
['fcontents'];
4472 if(flinkinfo
['ftype']!=0 and flinkinfo
['ftype']!=7):
4474 fcontents
= fcontents
.encode('UTF-8');
4475 except AttributeError:
4477 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
4479 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=0 and listcatfiles
['ffilelist'][reallcfi
]['ftype']!=7):
4481 fcontents
= fcontents
.encode('UTF-8');
4482 except AttributeError:
4484 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
4485 fcurfid
= format(curfid
, 'x').lower();
4486 if(not followlink
and finode
!=0):
4487 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
4488 fcurinode
= format(int(curinode
), 'x').lower();
4489 inodetofile
.update({curinode
: fname
});
4490 filetoinode
.update({fname
: curinode
});
4491 curinode
= curinode
+ 1;
4493 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
4495 fcurinode
= format(int(curinode
), 'x').lower();
4496 curinode
= curinode
+ 1;
4497 curfid
= curfid
+ 1;
4498 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[4]);
4499 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
4500 extrafieldslist
= [];
4502 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
4504 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
4506 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[4]);
4507 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[4]);
4508 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
4509 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
4510 if(checksumtype
=="none" or checksumtype
==""):
4511 catfileheadercshex
= format(0, 'x').lower();
4512 catfilecontentcshex
= format(0, 'x').lower();
4513 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4514 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
4515 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
4516 elif(checksumtype
=="crc16_ccitt"):
4517 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
4518 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
4519 elif(checksumtype
=="adler32"):
4520 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
4521 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
4522 elif(checksumtype
=="crc32"):
4523 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
4524 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
4525 elif(checksumtype
=="crc64_ecma"):
4526 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4527 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
4528 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4529 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4530 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
4531 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4532 checksumoutstr
= hashlib
.new(checksumtype
);
4533 checksumoutstr
.update("".encode('UTF-8'));
4534 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4535 checksumoutstr
= hashlib
.new(checksumtype
);
4536 checksumoutstr
.update(fcontents
);
4537 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
4539 catfileheadercshex
= format(0, 'x').lower();
4540 catfilecontentcshex
= format(0, 'x').lower();
4541 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
4542 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
4543 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[4]) + catfileoutstr
;
4544 if(checksumtype
=="none" or checksumtype
==""):
4545 catfileheadercshex
= format(0, 'x').lower();
4546 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4547 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4548 elif(checksumtype
=="crc16_ccitt"):
4549 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4550 elif(checksumtype
=="adler32"):
4551 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4552 elif(checksumtype
=="crc32"):
4553 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4554 elif(checksumtype
=="crc64_ecma"):
4555 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4556 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4557 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4558 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4559 checksumoutstr
= hashlib
.new(checksumtype
);
4560 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4561 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4563 catfileheadercshex
= format(0, 'x').lower();
4564 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[4]);
4565 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4566 nullstrecd
= formatspecs
[4].encode('UTF-8');
4567 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4568 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
4569 catfp
.write(catfileout
);
4572 os
.fsync(catfp
.fileno());
4573 except io
.UnsupportedOperation
:
4575 except AttributeError:
4578 reallcfi
= reallcfi
+ 1;
4579 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4580 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
4583 os
.fsync(catfp
.fileno());
4584 except io
.UnsupportedOperation
:
4586 except AttributeError:
4590 if(hasattr(sys
.stdout
, "buffer")):
4591 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
4593 shutil
.copyfileobj(catfp
, sys
.stdout
);
4601 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
4603 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4604 catfp
= BytesIO(catstr
);
4605 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
4606 return listcatfiles
;
4608 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
4610 def PackArchiveFileFromListDir(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4611 outarray
= BytesIO();
4612 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
4613 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
4614 return listcatfiles
;
4616 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
4618 def ArchiveFileArrayBase64Encode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4620 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4621 if(isinstance(infile
, dict)):
4622 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4623 listcatfiles
= prelistcatfiles
['list'];
4625 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4626 infile
= RemoveWindowsPath(infile
);
4628 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4629 listcatfiles
= prelistcatfiles
['list'];
4631 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4632 if(not listcatfiles
):
4634 lenlist
= len(listcatfiles
['ffilelist']);
4639 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4642 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4643 lcfx
= listcatfiles
['fnumfiles'];
4645 lcfx
= int(listcatfiles
['fnumfiles']);
4646 if(lenlist
>lcfx
or lenlist
<lcfx
):
4649 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
4650 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64encode(listcatfiles
['ffilelist'][lcfi
]['fcontents']).decode("UTF-8");
4652 return listcatfiles
;
4654 create_alias_function("", __file_format_name__
, "ArrayBase64Encode", ArchiveFileArrayBase64Encode
);
4656 def ArchiveFileArrayBase64Decode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4658 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4659 if(isinstance(infile
, dict)):
4660 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4661 listcatfiles
= prelistcatfiles
['list'];
4663 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4664 infile
= RemoveWindowsPath(infile
);
4666 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4667 listcatfiles
= prelistcatfiles
['list'];
4669 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4670 if(not listcatfiles
):
4672 lenlist
= len(listcatfiles
['ffilelist']);
4677 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4680 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4681 lcfx
= listcatfiles
['fnumfiles'];
4683 lcfx
= int(listcatfiles
['fnumfiles']);
4684 if(lenlist
>lcfx
or lenlist
<lcfx
):
4687 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
4688 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64decode(listcatfiles
['ffilelist'][lcfi
]['fcontents'].encode("UTF-8"));
4690 return listcatfiles
;
4692 create_alias_function("", __file_format_name__
, "ArrayBase64Decode", ArchiveFileArrayBase64Decode
);
4694 def UnPackArchiveFile(infile
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4695 if(outdir
is not None):
4696 outdir
= RemoveWindowsPath(outdir
);
4698 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4699 if(isinstance(infile
, dict)):
4700 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4701 listcatfiles
= prelistcatfiles
['list'];
4703 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4704 infile
= RemoveWindowsPath(infile
);
4706 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4707 listcatfiles
= prelistcatfiles
['list'];
4709 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4710 if(not listcatfiles
):
4712 lenlist
= len(listcatfiles
['ffilelist']);
4717 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4720 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4721 lcfx
= listcatfiles
['fnumfiles'];
4723 lcfx
= int(listcatfiles
['fnumfiles']);
4724 if(lenlist
>lcfx
or lenlist
<lcfx
):
4731 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
4732 funame
= userinfo
.pw_name
;
4741 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
4742 fgname
= groupinfo
.gr_name
;
4748 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
4749 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4750 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
4751 fpc
.write(listcatfiles
['ffilelist'][lcfi
]['fcontents'])
4754 os
.fsync(fpc
.fileno())
4755 except io
.UnsupportedOperation
:
4757 except AttributeError:
4759 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname']):
4760 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
4761 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], int(listcatfiles
['ffilelist'][lcfi
]['fchmode'], 8));
4762 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
4763 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4765 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
4766 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
4767 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
4772 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
4773 funame
= userinfo
.pw_name
;
4782 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
4783 fgname
= groupinfo
.gr_name
;
4788 if(flinkinfo
['ftype'] == 0 or flinkinfo
['ftype'] == 7):
4789 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
4790 fpc
.write(flinkinfo
['fcontents'])
4793 os
.fsync(fpc
.fileno())
4794 except io
.UnsupportedOperation
:
4796 except AttributeError:
4798 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname']):
4799 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
4800 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4801 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
4802 if(flinkinfo
['ftype']==1):
4803 os
.link(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
4804 if(flinkinfo
['ftype']==2):
4805 os
.symlink(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
4806 if(flinkinfo
['ftype']==5):
4807 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4808 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname']):
4809 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
4810 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4811 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
4812 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
4813 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4815 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
4816 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4818 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
4819 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
4820 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
4825 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
4826 funame
= userinfo
.pw_name
;
4835 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
4836 fgname
= groupinfo
.gr_name
;
4841 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
4842 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
4843 fpc
.write(flinkinfo
['fcontents'])
4846 os
.fsync(fpc
.fileno())
4847 except io
.UnsupportedOperation
:
4849 except AttributeError:
4851 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname']):
4852 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
4853 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4854 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
4855 if(flinkinfo
['ftype']==1):
4856 os
.link(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
4857 if(flinkinfo
['ftype']==2):
4858 os
.symlink(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
4859 if(flinkinfo
['ftype']==5):
4860 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4861 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname']):
4862 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
4863 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4864 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
4865 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
4866 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], int(flinkinfo
['fchmode'], 8));
4868 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
4869 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4870 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], int(listcatfiles
['ffilelist'][lcfi
]['fchmode'], 8));
4871 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname']):
4872 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
4873 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], int(listcatfiles
['ffilelist'][lcfi
]['fchmode'], 8));
4874 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
4875 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
4876 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], int(listcatfiles
['ffilelist'][lcfi
]['fchmode'], 8));
4879 return listcatfiles
['ffilelist']['catfp'];
4883 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
4885 if(hasattr(shutil
, "register_unpack_format")):
4886 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
4887 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
4888 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
4890 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4891 catfp
= BytesIO(catstr
);
4892 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
4893 return listcatfiles
;
4895 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
4897 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4898 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4899 if(isinstance(infile
, dict)):
4900 listcatfiles
= infile
;
4902 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4903 infile
= RemoveWindowsPath(infile
);
4904 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
4905 if(not listcatfiles
):
4907 lenlist
= len(listcatfiles
['ffilelist']);
4912 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
4914 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
4916 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
4917 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
4918 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4919 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
4920 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4921 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
4922 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
4923 if(len(fuprint
)<=0):
4924 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
4925 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
4926 if(len(fgprint
)<=0):
4927 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
4928 VerbosePrintOut(PrintPermissionString(listcatfiles
['ffilelist'][lcfi
]['fmode'], listcatfiles
['ffilelist'][lcfi
]['ftype']) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(listcatfiles
['ffilelist'][lcfi
]['fsize']).rjust(15) + " " + datetime
.datetime
.utcfromtimestamp(listcatfiles
['ffilelist'][lcfi
]['fmtime']).strftime('%Y-%m-%d %H:%M') + " " + printfname
));
4931 return listcatfiles
['catfp'];
4935 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
4937 def ArchiveFileStringListFiles(catstr
, followlink
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4938 catfp
= BytesIO(catstr
);
4939 listcatfiles
= UnPackArchiveFile(catfp
, None, followlink
, skipchecksum
, formatspecs
, verbose
, returnfp
);
4940 return listcatfiles
;
4942 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileListFiles
);
4944 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
4945 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4946 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4949 if(not tarfile
.is_tarfile(infile
)):
4951 except AttributeError:
4952 if(not is_tarfile(infile
)):
4957 tarfp
= tarfile
.open(infiles
, "r");
4958 except FileNotFoundError
:
4960 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
4961 returnval
.update({lcfi
: member
.name
});
4962 fpremode
= member
.mode
;
4963 ffullmode
= member
.mode
;
4967 ffullmode
= member
.mode
+ stat
.S_IFREG
;
4969 elif(member
.isdev()):
4970 ffullmode
= member
.mode
;
4972 elif(member
.islnk()):
4973 ffullmode
= member
.mode
+ stat
.S_IFREG
;
4975 elif(member
.issym()):
4976 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
4978 elif(member
.ischr()):
4979 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
4981 elif(member
.isblk()):
4982 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
4984 elif(member
.isdir()):
4985 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
4987 elif(member
.isfifo()):
4988 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
4990 elif(member
.issparse()):
4991 ffullmode
= member
.mode
;
4994 VerbosePrintOut(member
.name
);
4996 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
4997 printfname
= member
.name
;
4999 printfname
= member
.name
+ " link to " + member
.linkname
;
5000 elif(member
.issym()):
5001 printfname
= member
.name
+ " -> " + member
.linkname
;
5002 fuprint
= member
.uname
;
5003 if(len(fuprint
)<=0):
5004 fuprint
= member
.uid
;
5005 fgprint
= member
.gname
;
5006 if(len(fgprint
)<=0):
5007 fgprint
= member
.gid
;
5008 VerbosePrintOut(PrintPermissionString(ffullmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.size
).rjust(15) + " " + datetime
.datetime
.utcfromtimestamp(member
.mtime
).strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5011 return listcatfiles
['catfp'];
5015 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
5016 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5017 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5019 if(not zipfile
.is_zipfile(infile
)):
5023 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5024 ziptest
= zipfp
.testzip();
5026 VerbosePrintOut("Bad file found!");
5027 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5028 if(not member
.is_dir()):
5029 fpremode
= int(stat
.S_IFREG
+ 438);
5030 elif(member
.is_dir()):
5031 fpremode
= int(stat
.S_IFDIR
+ 511);
5032 if(not member
.is_dir()):
5033 fmode
= int(stat
.S_IFREG
+ 438);
5034 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5035 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5036 elif(member
.is_dir()):
5037 fmode
= int(stat
.S_IFDIR
+ 511);
5038 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5039 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5040 returnval
.update({lcfi
: member
.filename
});
5042 VerbosePrintOut(member
.filename
);
5044 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
5046 for fmodval
in str(oct(fmode
))[-3:]:
5047 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
5048 if(not member
.is_dir()):
5050 permissionstr
= "-" + permissionstr
;
5051 elif(member
.is_dir()):
5053 permissionstr
= "d" + permissionstr
;
5054 printfname
= member
.filename
;
5056 fuid
= int(os
.getuid());
5057 except AttributeError:
5062 fgid
= int(os
.getgid());
5063 except AttributeError:
5070 userinfo
= pwd
.getpwuid(os
.getuid());
5071 funame
= userinfo
.pw_name
;
5074 except AttributeError:
5082 groupinfo
= grp
.getgrgid(os
.getgid());
5083 fgname
= groupinfo
.gr_name
;
5086 except AttributeError:
5091 if(len(fuprint
)<=0):
5092 fuprint
= str(fuid
);
5094 if(len(fgprint
)<=0):
5095 fgprint
= str(fgid
);
5096 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + datetime
.datetime
.utcfromtimestamp(int(time
.mktime(member
.date_time
+ (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5099 return listcatfiles
['catfp'];
5103 if(not rarfile_support
):
5104 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
5105 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5106 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5109 if(rarfile_support
):
5110 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
5111 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5112 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5114 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5118 rarfp
= rarfile
.RarFile(infile
, "r");
5119 rartest
= rarfp
.testrar();
5121 VerbosePrintOut("Bad file found!");
5122 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5125 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
5128 member
.external_attr
5130 except AttributeError:
5132 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
5135 member
.external_attr
5137 except AttributeError:
5142 if(is_unix
and member
.external_attr
!=0):
5143 fpremode
= int(member
.external_attr
);
5144 elif(member
.is_file()):
5145 fpremode
= int(stat
.S_IFREG
+ 438);
5146 elif(member
.is_symlink()):
5147 fpremode
= int(stat
.S_IFLNK
+ 438);
5148 elif(member
.is_dir()):
5149 fpremode
= int(stat
.S_IFDIR
+ 511);
5150 if(is_windows
and member
.external_attr
!=0):
5151 fwinattributes
= int(member
.external_attr
);
5153 fwinattributes
= int(0);
5154 if(is_unix
and member
.external_attr
!=0):
5155 fmode
= int(member
.external_attr
);
5156 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5157 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5158 elif(member
.is_file()):
5159 fmode
= int(stat
.S_IFREG
+ 438);
5160 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5161 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5162 elif(member
.is_symlink()):
5163 fmode
= int(stat
.S_IFLNK
+ 438);
5164 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
5165 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
5166 elif(member
.is_dir()):
5167 fmode
= int(stat
.S_IFDIR
+ 511);
5168 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5169 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5170 returnval
.update({lcfi
: member
.filename
});
5172 VerbosePrintOut(member
.filename
);
5174 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
5176 for fmodval
in str(oct(fmode
))[-3:]:
5177 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
5178 if(member
.is_file()):
5180 permissionstr
= "-" + permissionstr
;
5181 printfname
= member
.filename
;
5182 elif(member
.is_symlink()):
5184 permissionstr
= "l" + permissionstr
;
5185 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
5186 elif(member
.is_dir()):
5188 permissionstr
= "d" + permissionstr
;
5189 printfname
= member
.filename
;
5191 fuid
= int(os
.getuid());
5192 except AttributeError:
5197 fgid
= int(os
.getgid());
5198 except AttributeError:
5205 userinfo
= pwd
.getpwuid(os
.getuid());
5206 funame
= userinfo
.pw_name
;
5209 except AttributeError:
5217 groupinfo
= grp
.getgrgid(os
.getgid());
5218 fgname
= groupinfo
.gr_name
;
5221 except AttributeError:
5226 if(len(fuprint
)<=0):
5227 fuprint
= str(fuid
);
5229 if(len(fgprint
)<=0):
5230 fgprint
= str(fgid
);
5231 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5234 return listcatfiles
['catfp'];
5238 def ListDirListFiles(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5239 outarray
= BytesIO();
5240 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
5241 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5242 return listcatfiles
;
5244 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=True, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5245 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
5246 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5247 return listcatfiles
;
5249 def PackArchiveFileFromListDirAlt(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5250 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
5251 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
5252 return listcatfiles
;
5254 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
5256 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5257 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5258 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5259 return listcatfiles
;
5261 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
5263 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5264 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5265 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5266 return listcatfiles
;
5268 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
5270 if(not rarfile_support
):
5271 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5274 if(rarfile_support
):
5275 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5276 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5277 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5278 return listcatfiles
;
5280 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
5282 def download_file_from_ftp_file(url
):
5283 urlparts
= urlparse
.urlparse(url
);
5284 file_name
= os
.path
.basename(urlparts
.path
);
5285 file_dir
= os
.path
.dirname(urlparts
.path
);
5286 if(urlparts
.username
is not None):
5287 ftp_username
= urlparts
.username
;
5289 ftp_username
= "anonymous";
5290 if(urlparts
.password
is not None):
5291 ftp_password
= urlparts
.password
;
5292 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5293 ftp_password
= "anonymous";
5296 if(urlparts
.scheme
=="ftp"):
5298 elif(urlparts
.scheme
=="ftps"):
5302 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5304 ftp_port
= urlparts
.port
;
5305 if(urlparts
.port
is None):
5308 ftp
.connect(urlparts
.hostname
, ftp_port
);
5309 except socket
.gaierror
:
5310 log
.info("Error With URL "+url
);
5312 except socket
.timeout
:
5313 log
.info("Error With URL "+url
);
5315 ftp
.login(urlparts
.username
, urlparts
.password
);
5316 if(urlparts
.scheme
=="ftps"):
5318 ftpfile
= BytesIO();
5319 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
5320 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
5325 def download_file_from_ftp_string(url
):
5326 ftpfile
= download_file_from_ftp_file(url
);
5327 return ftpfile
.read();
5329 def upload_file_to_ftp_file(ftpfile
, url
):
5330 urlparts
= urlparse
.urlparse(url
);
5331 file_name
= os
.path
.basename(urlparts
.path
);
5332 file_dir
= os
.path
.dirname(urlparts
.path
);
5333 if(urlparts
.username
is not None):
5334 ftp_username
= urlparts
.username
;
5336 ftp_username
= "anonymous";
5337 if(urlparts
.password
is not None):
5338 ftp_password
= urlparts
.password
;
5339 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5340 ftp_password
= "anonymous";
5343 if(urlparts
.scheme
=="ftp"):
5345 elif(urlparts
.scheme
=="ftps"):
5349 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5351 ftp_port
= urlparts
.port
;
5352 if(urlparts
.port
is None):
5355 ftp
.connect(urlparts
.hostname
, ftp_port
);
5356 except socket
.gaierror
:
5357 log
.info("Error With URL "+url
);
5359 except socket
.timeout
:
5360 log
.info("Error With URL "+url
);
5362 ftp
.login(urlparts
.username
, urlparts
.password
);
5363 if(urlparts
.scheme
=="ftps"):
5365 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
5370 def upload_file_to_ftp_string(ftpstring
, url
):
5371 ftpfileo
= BytesIO(ftpstring
);
5372 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
5377 if(hasattr(shutil
, "register_archive_format")):
5378 # Register the packing format
5379 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
5380 except shutil
.RegistryError
:
5384 if(hasattr(shutil
, "register_unpack_format")):
5385 # Register the unpacking format
5386 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
5387 except shutil
.RegistryError
: