1
0
Fork 0

Merging upstream version 0.24.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-17 21:27:15 +01:00
parent b3a4316df0
commit d842f57fc5
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
33 changed files with 905 additions and 882 deletions

View file

@ -1,5 +1,5 @@
/* Tarlz - Archiver with multimember lzip compression
Copyright (C) 2013-2022 Antonio Diaz Diaz.
Copyright (C) 2013-2023 Antonio Diaz Diaz.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -20,7 +20,6 @@
#include <algorithm>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <pthread.h>
#include <stdint.h> // for lzlib.h
@ -31,6 +30,7 @@
#include "tarlz.h"
#include "arg_parser.h"
#include "common_mutex.h"
#include "create.h"
@ -87,9 +87,9 @@ struct Ipacket // filename, file size and headers
const uint8_t * const header;
Ipacket() : file_size( 0 ), extended( 0 ), header( 0 ) {}
Ipacket( const char * const name, const long long s,
Ipacket( const char * const name, const long long fs,
const Extended * const ext, const uint8_t * const head )
: file_size( s ), filename( name ), extended( ext ), header( head ) {}
: file_size( fs ), filename( name ), extended( ext ), header( head ) {}
};
struct Opacket // compressed data to be written to the archive
@ -269,11 +269,14 @@ int add_member_lz( const char * const filename, const struct stat *,
{ delete[] header; delete extended; return 0; }
print_removed_prefix( extended->removed_prefix );
if( gcl_opts->solidity == bsolid &&
block_is_full( extended->full_size(), file_size, gcl_opts->data_size,
partial_data_size ) )
courierp->receive_packet( new Ipacket ); // end of group
if( gcl_opts->solidity == bsolid )
{
const int ebsize = extended->full_size();
if( ebsize < 0 ) { show_error( extended->full_size_error() ); return 1; }
if( block_is_full( ebsize, file_size, gcl_opts->data_size,
partial_data_size ) )
courierp->receive_packet( new Ipacket ); // end of group
}
courierp->receive_packet( new Ipacket( filename, file_size, extended, header ) );
if( gcl_opts->solidity == no_solid ) // one tar member per group
@ -331,9 +334,9 @@ extern "C" void * grouper( void * arg )
}
/* Writes ibuf to encoder. To minimize dictionary size, it does not read
from encoder until encoder's input buffer is full or finish is true.
Sends opacket to courier and allocates new obuf each time obuf is full.
/* Write ibuf to encoder. To minimize dictionary size, do not read from
encoder until encoder's input buffer is full or finish is true.
Send opacket to courier and allocate new obuf each time obuf is full.
*/
void loop_encode( const uint8_t * const ibuf, const int isize,
uint8_t * & obuf, int & opos, Packet_courier & courier,
@ -423,8 +426,7 @@ extern "C" void * cworker( void * arg )
}
const char * const filename = ipacket->filename.c_str();
const int infd =
ipacket->file_size ? open_instream( filename ) : -1;
const int infd = ipacket->file_size ? open_instream( filename ) : -1;
if( ipacket->file_size && infd < 0 ) // can't read file data
{ delete[] ipacket->header; delete ipacket->extended; delete ipacket;
set_error_status( 1 ); continue; } // skip file
@ -444,17 +446,11 @@ extern "C" void * cworker( void * arg )
}
}
if( !ipacket->extended->empty() ) // compress extended block
{
const long long ebsize = ipacket->extended->format_block( rbuf );
if( ebsize < 0 )
{ show_error( ( ebsize == -2 ) ? mem_msg2 : eferec_msg ); exit_fail_mt(); }
/* Limit the size of the extended block to INT_MAX - 1 so that it can
be fed to lzlib as one buffer. */
if( ebsize >= INT_MAX )
{ show_error( "Extended records size >= INT_MAX." ); exit_fail_mt(); }
const int ebsize = ipacket->extended->format_block( rbuf ); // may be 0
if( ebsize < 0 )
{ show_error( ipacket->extended->full_size_error() ); exit_fail_mt(); }
if( ebsize > 0 ) // compress extended block
loop_encode( rbuf.u8(), ebsize, data, opos, courier, encoder, worker_id );
}
// compress ustar header
loop_encode( ipacket->header, header_size, data, opos, courier,
encoder, worker_id );
@ -472,9 +468,7 @@ extern "C" void * cworker( void * arg )
rest -= rd;
if( rd != size )
{
if( verbosity >= 0 )
std::fprintf( stderr, "File '%s' ends unexpectedly at pos %llu\n",
filename, ipacket->file_size - rest );
show_atpos_error( filename, ipacket->file_size - rest, false );
close( infd ); exit_fail_mt();
}
if( rest == 0 ) // last read
@ -595,6 +589,6 @@ int encode_lz( const Cl_options & cl_opts, const char * const archive_namep,
courier.ocheck_counter,
courier.owait_counter );
if( !courier.finished() ) internal_error( "courier not finished." );
if( !courier.finished() ) internal_error( conofin_msg );
return final_exit_status( retval );
}