#!/usr/bin/env python3 import sys import os import time import zlib import struct from collections import namedtuple CFHEADER_s = struct.Struct("<4sLLLLLBBHHHHH") CFHEADER = namedtuple("CFHEADER", "sig res0 size res1 firstfile res2 " "verminor vermajor folders files flags setid icabinet") CFHEADER_sig = b"MSCF" CFFOLDER_s = struct.Struct("> 1)) def checksum(data): data_fullwords_len = len(data) & ~3 data_last_word = data[data_fullwords_len:] data_last_word = bytes(reversed(data_last_word)) data_last_word += b"\0" * (3 & -len(data)) # pad to multiple of 4 bytes toret = 0 for part, partlen in ((data, data_fullwords_len), (data_last_word, len(data_last_word))): for offset in range(0, partlen, 4): toret ^= struct.unpack_from(" 0: cabname = args.pop(0) filename = args.pop(0) with open(filename, "rb") as f: filedata = f.read() files.append((cabname, filedata, os.stat(filename).st_mtime)) cabdata = build_cab(files) with open(outfile, "wb") as f: f.write(cabdata) if __name__ == '__main__': main()