def write_rr(version, host_os, volume, rr_count): prot_size = volume.tell() (rr_crcs, rr_sects) = rr_calc(volume, rr_count, prot_size) crc = crc32(rr_crcs, RR_CRC_INIT) for s in rr_sects: crc = crc32(s.buffer(), crc) prot_sect_count = len(rr_crcs) // S_SHORT.size size = prot_sect_count * RR_CRC_SIZE + rr_count * RR_SECT_SIZE if version < 3: write_block(volume, type=RAR_BLOCK_OLD_RECOVERY, flags=RAR_LONG_BLOCK ^ RAR_SKIP_IF_UNKNOWN, data=( S_LONG.pack(size), (20,), S_SHORT.pack(rr_count), S_LONG.pack(prot_sect_count), RR_PROTECT_2, )) else: write_block(volume, type=RAR_BLOCK_SUB, flags=RAR_LONG_BLOCK ^ RAR_SKIP_IF_UNKNOWN, data=( S_FILE_HDR.pack(size, size, host_os, crc, 0, 29, ord("0"), len(RR_SUB_NAME), 0), RR_SUB_NAME, RR_PROTECT_3, S_LONG.pack(rr_count), struct.pack("<Q", prot_sect_count), )) volume.write(rr_crcs) for s in rr_sects: volume.write(s.buffer())
def write_rr(version, host_os, volume, rr_count): prot_size = volume.tell() (rr_crcs, rr_sects) = rr_calc(volume, rr_count, prot_size) crc = crc32(rr_crcs, RR_CRC_INIT) for s in rr_sects: crc = crc32(s.buffer(), crc) prot_sect_count = len(rr_crcs) // S_SHORT.size size = prot_sect_count * RR_CRC_SIZE + rr_count * RR_SECT_SIZE if version < 3: write_block(volume, type=RAR_BLOCK_OLD_RECOVERY, flags=RAR_LONG_BLOCK ^ RAR_SKIP_IF_UNKNOWN, data=( S_LONG.pack(size), (20, ), S_SHORT.pack(rr_count), S_LONG.pack(prot_sect_count), RR_PROTECT_2, )) else: write_block(volume, type=RAR_BLOCK_SUB, flags=RAR_LONG_BLOCK ^ RAR_SKIP_IF_UNKNOWN, data=( S_FILE_HDR.pack(size, size, host_os, crc, 0, 29, ord("0"), len(RR_SUB_NAME), 0), RR_SUB_NAME, RR_PROTECT_3, S_LONG.pack(rr_count), struct.pack("<Q", prot_sect_count), )) volume.write(rr_crcs) for s in rr_sects: volume.write(s.buffer())
def write_end(volume, version, flags, volnum, is_last_vol): size = volume.tell() volume.seek(0) crc = file_crc32(volume, size) if version >= 3: flags |= (RAR_SKIP_IF_UNKNOWN ^ (not is_last_vol) * RAR_ENDARC_NEXT_VOLUME) parts = list() if flags & RAR_ENDARC_DATACRC: parts.append(S_LONG.pack(crc)) if flags & RAR_ENDARC_VOLNR: parts.append(S_SHORT.pack(volnum)) if flags & RAR_ENDARC_REVSPACE: parts.append(0 for i in range(END_EXTRA)) write_block(volume, RAR_BLOCK_ENDARC, flags, parts) return crc
def write_end(volume, version, flags, volnum, is_last_vol): size = volume.tell() volume.seek(0) crc = file_crc32(volume, size) if version >= 3: flags |= (RAR_SKIP_IF_UNKNOWN ^ (not is_last_vol) * RAR_ENDARC_NEXT_VOLUME) parts = list() if flags & RAR_ENDARC_DATACRC: parts.append(S_LONG.pack(crc)) if flags & RAR_ENDARC_VOLNR: parts.append(S_SHORT.pack(volnum)) if flags & RAR_ENDARC_REVSPACE: parts.append(0 for _ in range(END_EXTRA)) write_block(volume, RAR_BLOCK_ENDARC, flags, parts) return crc