diff options
Diffstat (limited to '')
-rw-r--r-- | main.cc | 106 |
1 files changed, 55 insertions, 51 deletions
@@ -86,7 +86,7 @@ struct lzma_options enum Mode { m_compress = 0, m_decompress, m_test }; std::string output_filename; -int outhandle = -1; +int outfd = -1; bool delete_output_on_interrupt = false; pthread_t main_thread; pid_t main_thread_pid; @@ -227,7 +227,7 @@ int open_instream( const std::string & name, struct stat * in_statsp, const Mode program_mode, const int eindex, const bool force, const bool to_stdout ) throw() { - int inhandle = -1; + int infd = -1; if( program_mode == m_compress && !force && eindex >= 0 ) { if( verbosity >= 0 ) @@ -237,8 +237,8 @@ int open_instream( const std::string & name, struct stat * in_statsp, } else { - inhandle = open( name.c_str(), O_RDONLY | o_binary ); - if( inhandle < 0 ) + infd = open( name.c_str(), O_RDONLY | o_binary ); + if( infd < 0 ) { if( verbosity >= 0 ) std::fprintf( stderr, "%s: Can't open input file `%s': %s.\n", @@ -246,7 +246,7 @@ int open_instream( const std::string & name, struct stat * in_statsp, } else { - const int i = fstat( inhandle, in_statsp ); + const int i = fstat( infd, in_statsp ); const mode_t & mode = in_statsp->st_mode; if( i < 0 || !( S_ISREG( mode ) || ( to_stdout && ( S_ISFIFO( mode ) || S_ISSOCK( mode ) || @@ -256,12 +256,12 @@ int open_instream( const std::string & name, struct stat * in_statsp, std::fprintf( stderr, "%s: input file `%s' is not a regular file%s.\n", program_name, name.c_str(), to_stdout ? "" : " and `--stdout' was not specified" ); - close( inhandle ); - inhandle = -1; + close( infd ); + infd = -1; } } } - return inhandle; + return infd; } @@ -294,18 +294,18 @@ void set_d_outname( const std::string & name, const int i ) throw() bool open_outstream( const bool force ) throw() { if( force ) - outhandle = open( output_filename.c_str(), - O_CREAT | O_TRUNC | O_WRONLY | o_binary, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); - else outhandle = open( output_filename.c_str(), - O_CREAT | O_EXCL | O_WRONLY | o_binary, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); - if( outhandle < 0 ) + outfd = open( output_filename.c_str(), + O_CREAT | O_TRUNC | O_WRONLY | o_binary, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); + else outfd = open( output_filename.c_str(), + O_CREAT | O_EXCL | O_WRONLY | o_binary, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); + if( outfd < 0 ) { - if( errno == EEXIST ) outhandle = -2; else outhandle = -1; + if( errno == EEXIST ) outfd = -2; else outfd = -1; if( verbosity >= 0 ) { - if( outhandle == -2 ) + if( outfd == -2 ) std::fprintf( stderr, "%s: Output file %s already exists, skipping.\n", program_name, output_filename.c_str() ); else @@ -313,19 +313,19 @@ bool open_outstream( const bool force ) throw() program_name, output_filename.c_str(), std::strerror( errno ) ); } } - return ( outhandle >= 0 ); + return ( outfd >= 0 ); } -bool check_tty( const int inhandle, const Mode program_mode ) throw() +bool check_tty( const int infd, const Mode program_mode ) throw() { - if( program_mode == m_compress && isatty( outhandle ) ) + if( program_mode == m_compress && isatty( outfd ) ) { show_error( "I won't write compressed data to a terminal.", 0, true ); return false; } if( ( program_mode == m_decompress || program_mode == m_test ) && - isatty( inhandle ) ) + isatty( infd ) ) { show_error( "I won't read compressed data from a terminal.", 0, true ); return false; @@ -338,10 +338,11 @@ void cleanup_and_fail( const int retval ) throw() { if( delete_output_on_interrupt ) { + delete_output_on_interrupt = false; if( verbosity >= 0 ) std::fprintf( stderr, "%s: Deleting output file `%s', if it exists.\n", program_name, output_filename.c_str() ); - if( outhandle >= 0 ) { close( outhandle ); outhandle = -1; } + if( outfd >= 0 ) { close( outfd ); outfd = -1; } if( std::remove( output_filename.c_str() ) != 0 ) show_error( "WARNING: deletion of output file (apparently) failed." ); } @@ -355,11 +356,11 @@ void close_and_set_permissions( const struct stat * const in_statsp ) bool error = false; if( in_statsp ) { - if( fchmod( outhandle, in_statsp->st_mode ) != 0 ) error = true; - else (void)fchown( outhandle, in_statsp->st_uid, in_statsp->st_gid ); + if( fchmod( outfd, in_statsp->st_mode ) != 0 ) error = true; + else (void)fchown( outfd, in_statsp->st_uid, in_statsp->st_gid ); // fchown will in many cases return with EPERM, which can be safely ignored. } - if( close( outhandle ) == 0 ) outhandle = -1; + if( close( outfd ) == 0 ) outfd = -1; else cleanup_and_fail( 1 ); delete_output_on_interrupt = false; if( !in_statsp ) return; @@ -388,11 +389,14 @@ extern "C" void signal_handler( int sig ) throw() } -void set_signals() throw() +void set_signals( const bool to_file ) throw() { - signal( SIGHUP, signal_handler ); - signal( SIGINT, signal_handler ); - signal( SIGTERM, signal_handler ); + if( to_file ) + { + signal( SIGHUP, signal_handler ); + signal( SIGINT, signal_handler ); + signal( SIGTERM, signal_handler ); + } signal( SIGUSR1, signal_handler ); } @@ -504,7 +508,7 @@ int main( const int argc, const char * argv[] ) lzma_options encoder_options = option_mapping[5]; // default = "-6" int data_size = 0; int debug_level = 0; - int inhandle = -1; + int infd = -1; int num_workers = 0; // Start this many worker threads Mode program_mode = m_compress; bool force = false; @@ -574,7 +578,7 @@ int main( const int argc, const char * argv[] ) case '7': case '8': case '9': encoder_options = option_mapping[code-'1']; break; case 'b': break; - case 'B': data_size = getnum( arg, 0, 100000, + case 'B': data_size = getnum( arg, 0, 2 * LZ_min_dictionary_size(), 2 * LZ_max_dictionary_size() ); break; case 'c': to_stdout = true; break; case 'd': program_mode = m_decompress; break; @@ -608,7 +612,7 @@ int main( const int argc, const char * argv[] ) if( num_online <= 0 ) num_online = 1; num_workers = std::min( num_online, max_workers ); } - const int num_slots = std::max( 1, ( num_workers * slots_per_worker ) - 1 ); + const int num_slots = num_workers * slots_per_worker; bool filenames_given = false; for( ; argind < parser.arguments(); ++argind ) @@ -618,13 +622,12 @@ int main( const int argc, const char * argv[] ) } if( filenames.empty() ) filenames.push_back("-"); - if( !to_stdout && program_mode != m_test && - ( filenames_given || default_output_filename.size() ) ) - set_signals(); + set_signals( !to_stdout && program_mode != m_test && + ( filenames_given || default_output_filename.size() ) ); Pretty_print pp( filenames ); if( program_mode == m_test ) - outhandle = -1; + outfd = -1; int retval = 0; for( unsigned int i = 0; i < filenames.size(); ++i ) @@ -635,11 +638,11 @@ int main( const int argc, const char * argv[] ) if( !filenames[i].size() || filenames[i] == "-" ) { input_filename.clear(); - inhandle = STDIN_FILENO; + infd = STDIN_FILENO; if( program_mode != m_test ) { if( to_stdout || !default_output_filename.size() ) - outhandle = STDOUT_FILENO; + outfd = STDOUT_FILENO; else { if( program_mode == m_compress ) @@ -647,8 +650,8 @@ int main( const int argc, const char * argv[] ) else output_filename = default_output_filename; if( !open_outstream( force ) ) { - if( outhandle == -1 && retval < 1 ) retval = 1; - close( inhandle ); inhandle = -1; + if( outfd == -1 && retval < 1 ) retval = 1; + close( infd ); infd = -1; continue; } } @@ -658,12 +661,12 @@ int main( const int argc, const char * argv[] ) { input_filename = filenames[i]; const int eindex = extension_index( input_filename ); - inhandle = open_instream( input_filename, &in_stats, program_mode, - eindex, force, to_stdout ); - if( inhandle < 0 ) { if( retval < 1 ) retval = 1; continue; } + infd = open_instream( input_filename, &in_stats, program_mode, + eindex, force, to_stdout ); + if( infd < 0 ) { if( retval < 1 ) retval = 1; continue; } if( program_mode != m_test ) { - if( to_stdout ) outhandle = STDOUT_FILENO; + if( to_stdout ) outfd = STDOUT_FILENO; else { if( program_mode == m_compress ) @@ -671,15 +674,15 @@ int main( const int argc, const char * argv[] ) else set_d_outname( input_filename, eindex ); if( !open_outstream( force ) ) { - if( outhandle == -1 && retval < 1 ) retval = 1; - close( inhandle ); inhandle = -1; + if( outfd == -1 && retval < 1 ) retval = 1; + close( infd ); infd = -1; continue; } } } } - if( !check_tty( inhandle, program_mode ) ) return 1; + if( !check_tty( infd, program_mode ) ) return 1; if( output_filename.size() && !to_stdout && program_mode != m_test ) delete_output_on_interrupt = true; @@ -690,9 +693,10 @@ int main( const int argc, const char * argv[] ) if( program_mode == m_compress ) tmp = compress( data_size, encoder_options.dictionary_size, encoder_options.match_len_limit, num_workers, - num_slots, inhandle, outhandle, debug_level ); + num_slots, infd, outfd, pp, debug_level ); else - tmp = decompress( inhandle, outhandle, pp, program_mode == m_test ); + tmp = decompress( num_workers, num_slots, infd, outfd, pp, + debug_level, program_mode == m_test ); if( tmp > retval ) retval = tmp; if( tmp && program_mode != m_test ) cleanup_and_fail( retval ); @@ -700,12 +704,12 @@ int main( const int argc, const char * argv[] ) close_and_set_permissions( in_statsp ); if( input_filename.size() ) { - close( inhandle ); inhandle = -1; + close( infd ); infd = -1; if( !keep_input_files && !to_stdout && program_mode != m_test ) std::remove( input_filename.c_str() ); } } - if( outhandle >= 0 && close( outhandle ) != 0 ) + if( outfd >= 0 && close( outfd ) != 0 ) { if( verbosity >= 0 ) std::fprintf( stderr, "%s: Can't close stdout: %s.\n", |