Adding upstream version 0.24.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
9a8733dd3b
commit
4f5d0de2b2
33 changed files with 905 additions and 882 deletions
50
create_lz.cc
50
create_lz.cc
|
@ -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 );
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue