Ejemplo n.º 1
0
Archivo: rar.py Proyecto: vadmium/rerar
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())
Ejemplo n.º 2
0
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())
Ejemplo n.º 3
0
Archivo: rar.py Proyecto: vadmium/rerar
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
Ejemplo n.º 4
0
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