1
0
Fork 0

Adding upstream version 0.8.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-17 21:09:53 +01:00
parent 481ef88a11
commit 9bbbd387b8
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
28 changed files with 2668 additions and 574 deletions

70
tarlz.h
View file

@ -32,7 +32,8 @@ enum Lengths {
enum Typeflag {
tf_regular = '0', tf_link = '1', tf_symlink = '2', tf_chardev = '3',
tf_blockdev = '4', tf_directory = '5', tf_fifo = '6', tf_hiperf = '7' };
tf_blockdev = '4', tf_directory = '5', tf_fifo = '6', tf_hiperf = '7',
tf_extended = 'x' };
const uint8_t ustar_magic[magic_l] =
{ 0x75, 0x73, 0x74, 0x61, 0x72, 0 }; // "ustar\0"
@ -41,6 +42,68 @@ inline bool verify_ustar_magic( const uint8_t * const buf )
{ return std::memcmp( buf + magic_o, ustar_magic, magic_l ) == 0; }
class CRC32C // Uses CRC32-C (Castagnoli) polynomial.
{
uint32_t data[256]; // Table of CRCs of all 8-bit messages.
public:
CRC32C()
{
for( unsigned n = 0; n < 256; ++n )
{
unsigned c = n;
for( int k = 0; k < 8; ++k )
{ if( c & 1 ) c = 0x82F63B78U ^ ( c >> 1 ); else c >>= 1; }
data[n] = c;
}
}
void update_buf( uint32_t & crc, const uint8_t * const buffer,
const int size ) const
{
uint32_t c = crc;
for( int i = 0; i < size; ++i )
c = data[(c^buffer[i])&0xFF] ^ ( c >> 8 );
crc = c;
}
// Calculates the crc of size bytes except a window of 8 bytes at pos
uint32_t windowed_crc( const uint8_t * const buffer, const int pos,
const int size ) const
{
uint32_t crc = 0xFFFFFFFFU;
update_buf( crc, buffer, pos );
update_buf( crc, buffer + pos + 8, size - pos - 8 );
return crc ^ 0xFFFFFFFFU;
}
};
extern const CRC32C crc32c;
// Round "size" to the next multiple of header size (512).
//
inline unsigned long long round_up( unsigned long long size )
{
const int rem = size % header_size;
const int padding = rem ? header_size - rem : 0;
return size + padding;
}
struct Extended // stores metadata from/for extended records
{
std::string linkpath;
std::string path;
unsigned long long size;
bool crc_present;
Extended() : size( 0 ), crc_present( false ) {}
void reset()
{ linkpath.clear(); path.clear(); size = 0; crc_present = false; }
bool empty() { return linkpath.empty() && path.empty() && size == 0; }
bool parse( const int infd, const Tar_header header, const bool permissive );
};
// defined in create.cc
extern int cl_owner;
extern int cl_group;
@ -48,12 +111,15 @@ extern int cl_solid;
unsigned ustar_chksum( const uint8_t * const buf );
bool verify_ustar_chksum( const uint8_t * const buf );
class Arg_parser;
int concatenate( const std::string & archive_name, const Arg_parser & parser,
const int filenames );
int encode( const std::string & archive_name, const Arg_parser & parser,
const int filenames, const int level, const bool append );
// defined in extract.cc
int decode( const std::string & archive_name, const Arg_parser & parser,
const int filenames, const bool listing );
const int filenames, const bool keep_damaged, const bool listing,
const bool missing_crc, const bool permissive );
// defined in main.cc
extern int verbosity;