diff options
Diffstat (limited to '')
-rw-r--r-- | create_lz.cc | 50 |
1 files changed, 22 insertions, 28 deletions
diff --git a/create_lz.cc b/create_lz.cc index 1acaf23..5436bf5 100644 --- a/create_lz.cc +++ b/create_lz.cc @@ -1,5 +1,5 @@ /* Tarlz - Archiver with multimember lzip compression - Copyright (C) 2013-2022 Antonio Diaz Diaz. + Copyright (C) 2013-2024 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 ); } |