1
0
Fork 0

Merging upstream version 0.12.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-17 21:12:33 +01:00
parent 8a1b7bb819
commit fae36bf8d8
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
18 changed files with 427 additions and 212 deletions

28
main.cc
View file

@ -62,8 +62,6 @@ const char * const program_name = "tarlz";
const char * const program_year = "2019";
const char * invocation_name = 0;
enum Mode { m_none, m_append, m_concatenate, m_create, m_extract, m_list };
void show_help( const long num_online )
{
@ -90,6 +88,8 @@ void show_help( const long num_online )
" -B, --data-size=<bytes> set target size of input data blocks [2x8=16 MiB]\n"
" -c, --create create a new archive\n"
" -C, --directory=<dir> change to directory <dir>\n"
" -d, --diff find differences between archive and file system\n"
" --ignore-ids ignore differences in owner and group IDs\n"
" -f, --file=<archive> use archive file <archive>\n"
" -n, --threads=<n> set number of (de)compression threads [%ld]\n"
" -q, --quiet suppress all messages\n"
@ -98,6 +98,7 @@ void show_help( const long num_online )
" -v, --verbose verbosely list files processed\n"
" -x, --extract extract files from an archive\n"
" -0 .. -9 set compression level [default 6]\n"
" --uncompressed don't compress the archive created\n"
" --asolid create solidly compressed appendable archive\n"
" --bsolid create per block compressed archive (default)\n"
" --dsolid create per directory compressed archive\n"
@ -108,8 +109,7 @@ void show_help( const long num_online )
" --group=<group> use <group> name/ID for files added\n"
" --keep-damaged don't delete partially extracted files\n"
" --missing-crc exit with error status if missing extended CRC\n"
// " --permissive allow repeated extended headers and records\n"
" --uncompressed don't compress the archive created\n",
/* " --permissive allow repeated extended headers and records\n"*/,
num_online );
if( verbosity >= 1 )
{
@ -185,7 +185,7 @@ unsigned long long getnum( const char * const ptr,
}
void set_mode( Mode & program_mode, const Mode new_mode )
void set_mode( Program_mode & program_mode, const Program_mode new_mode )
{
if( program_mode != m_none && program_mode != new_mode )
{
@ -245,7 +245,7 @@ int open_outstream( const std::string & name, const bool create )
//
void cleanup_and_fail( const int retval )
{
// only one thread can delete and exit
// calling 'exit' more than once results in undefined behavior
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock( &mutex ); // ignore errors to avoid loop
@ -290,7 +290,8 @@ int main( const int argc, const char * const argv[] )
int debug_level = 0;
int num_workers = -1; // start this many worker threads
int level = 6; // compression level, < 0 means uncompressed
Mode program_mode = m_none;
Program_mode program_mode = m_none;
bool ignore_ids = false;
bool keep_damaged = false;
bool missing_crc = false;
bool permissive = false;
@ -301,7 +302,7 @@ int main( const int argc, const char * const argv[] )
return 1; }
enum { opt_ano = 256, opt_aso, opt_bso, opt_crc, opt_dbg, opt_dso, opt_grp,
opt_kd, opt_nso, opt_own, opt_per, opt_sol, opt_un };
opt_id, opt_kd, opt_nso, opt_own, opt_per, opt_sol, opt_un };
const Arg_parser::Option options[] =
{
{ '0', 0, Arg_parser::no },
@ -318,6 +319,7 @@ int main( const int argc, const char * const argv[] )
{ 'B', "data-size", Arg_parser::yes },
{ 'c', "create", Arg_parser::no },
{ 'C', "directory", Arg_parser::yes },
{ 'd', "diff", Arg_parser::no },
{ 'f', "file", Arg_parser::yes },
{ 'h', "help", Arg_parser::no },
{ 'H', "format", Arg_parser::yes },
@ -334,6 +336,7 @@ int main( const int argc, const char * const argv[] )
{ opt_dbg, "debug", Arg_parser::yes },
{ opt_dso, "dsolid", Arg_parser::no },
{ opt_grp, "group", Arg_parser::yes },
{ opt_id, "ignore-ids", Arg_parser::no },
{ opt_kd, "keep-damaged", Arg_parser::no },
{ opt_crc, "missing-crc", Arg_parser::no },
{ opt_nso, "no-solid", Arg_parser::no },
@ -370,6 +373,7 @@ int main( const int argc, const char * const argv[] )
break;
case 'c': set_mode( program_mode, m_create ); break;
case 'C': break; // skip chdir
case 'd': set_mode( program_mode, m_diff ); break;
case 'f': if( sarg != "-" ) archive_name = sarg; break;
case 'h': show_help( num_online ); return 0;
case 'H': break; // ignore format
@ -387,6 +391,7 @@ int main( const int argc, const char * const argv[] )
case opt_dbg: debug_level = getnum( arg, 0, 3 ); break;
case opt_dso: solidity = dsolid; break;
case opt_grp: set_group( arg ); break;
case opt_id: ignore_ids = true; break;
case opt_kd: keep_damaged = true; break;
case opt_nso: solidity = no_solid; break;
case opt_own: set_owner( arg ); break;
@ -411,9 +416,10 @@ int main( const int argc, const char * const argv[] )
case m_create: return encode( archive_name, parser, filenames, level,
num_workers, debug_level, program_mode == m_append );
case m_concatenate: return concatenate( archive_name, parser, filenames );
case m_diff:
case m_extract:
case m_list: return decode( archive_name, parser, filenames, num_workers,
debug_level, keep_damaged, program_mode == m_list,
missing_crc, permissive );
case m_list: return decode( archive_name, parser, filenames,
num_workers, debug_level, program_mode,
ignore_ids, keep_damaged, missing_crc, permissive );
}
}