1
0
Fork 0

Merging upstream version 0.9~rc1.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-24 05:04:40 +01:00
parent 4f4c7c8781
commit 6503461316
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
19 changed files with 126 additions and 131 deletions

View file

@ -122,9 +122,8 @@ void show_help() throw()
int open_instream( const std::string & input_filename ) throw()
{
int infd = open( input_filename.c_str(), O_RDONLY | o_binary );
if( infd < 0 && verbosity >= 0 )
std::fprintf( stderr, "%s: Can't open input file `%s': %s.\n",
util_name, input_filename.c_str(), std::strerror( errno ) );
if( infd < 0 )
show_error2( "Can't open input file", input_filename.c_str() );
return infd;
}
@ -169,7 +168,7 @@ const char * my_basename( const char * filename ) throw()
}
void remove_fifos() throw()
extern "C" void remove_fifos() throw()
{
if( fifonames[0].size() )
{ std::remove( fifonames[0].c_str() ); fifonames[0].clear(); }
@ -209,9 +208,7 @@ bool set_fifonames( const std::string filenames[2] )
if( mkfifo( fifonames[i].c_str(), S_IRUSR | S_IWUSR ) == 0 )
continue;
}
if( verbosity >= 0 )
std::fprintf( stderr, "%s: Can't create FIFO `%s': %s.\n",
util_name, fifonames[i].c_str(), std::strerror( errno ) );
show_error2( "Can't create FIFO", fifonames[i].c_str() );
return false;
}
return true;
@ -251,30 +248,23 @@ bool set_data_feeder( const std::string & fifoname, const int infd,
close( fda[0] ) == 0 && close( fda[1] ) == 0 &&
close( outfd ) == 0 )
execlp( file_type.c_str(), file_type.c_str(), "-cdfq", (char *)0 );
if( verbosity >= 0 )
std::fprintf( stderr, "%s: Can't exec `%s': %s.\n",
util_name, file_type.c_str(), std::strerror( errno ) );
show_exec_error( file_type.c_str() );
_exit( 2 );
}
if( pid2 < 0 )
{
if( verbosity >= 0 )
std::fprintf( stderr, "%s: Can't fork `%s': %s.\n",
util_name, file_type.c_str(), std::strerror( errno ) );
_exit( 2 );
}
{ show_fork_error( file_type.c_str() ); _exit( 2 ); }
if( close( fda[0] ) != 0 ||
!feed_data( infd, fda[1], magic_data, magic_size ) )
_exit( 2 );
if( close( fda[1] ) != 0 )
{ show_error( "Can't close output of feeder", errno ); _exit( 2 ); }
{ show_close_error( "data feeder" ); _exit( 2 ); }
_exit( wait_for_child( pid2, file_type.c_str() ) );
}
// parent
close( fda[0] ); close( fda[1] );
if( pid < 0 )
{ show_error( "Can't fork decompressor feeder", errno ); return false; }
{ show_fork_error( "decompressor feeder" ); return false; }
*pidp = pid;
}
else // not compressed
@ -293,12 +283,12 @@ bool set_data_feeder( const std::string & fifoname, const int infd,
if( !feed_data( infd, outfd, magic_data, magic_size ) )
_exit( 2 );
if( close( outfd ) != 0 )
{ show_error( "Can't close output of feeder", errno ); _exit( 2 ); }
{ show_close_error( "data feeder" ); _exit( 2 ); }
_exit( 0 );
}
// parent
if( pid < 0 )
{ show_error( "Can't fork data feeder", errno ); return false; }
{ show_fork_error( "data feeder" ); return false; }
*pidp = pid;
}
return true;
@ -431,7 +421,7 @@ int main( const int argc, const char * const argv[] )
if( diff_pid == 0 ) // child (diff)
{
const char ** const argv = new const char *[diff_args.size()+5];
argv[0] = "diff";
argv[0] = DIFF;
for( unsigned int i = 0; i < diff_args.size(); ++i )
argv[i+1] = diff_args[i];
argv[diff_args.size()+1] = "--";
@ -439,19 +429,19 @@ int main( const int argc, const char * const argv[] )
argv[diff_args.size()+3] = fifonames[1].c_str();
argv[diff_args.size()+4] = 0;
execvp( argv[0], (char **)argv );
show_error( "Can't exec `diff'." );
show_exec_error( DIFF );
_exit( 2 );
}
// parent
if( diff_pid < 0 )
{ show_error( "Can't fork `diff'", errno ); return 2; }
{ show_fork_error( DIFF ); return 2; }
pid_t pid[2];
if( !set_data_feeder( fifonames[0], infd[0], &pid[0] ) ||
!set_data_feeder( fifonames[1], infd[1], &pid[1] ) )
return 2;
int retval = wait_for_child( diff_pid, "diff" );
int retval = wait_for_child( diff_pid, DIFF );
if( retval != 0 )
{
@ -466,9 +456,7 @@ int main( const int argc, const char * const argv[] )
for( int i = 0; i < 2; ++i )
if( filenames[i] != "-" && close( infd[i] ) != 0 )
{
if( verbosity >= 0 )
std::fprintf( stderr, "%s: Can't close input file `%s': %s.\n",
util_name, filenames[i].c_str(), std::strerror( errno ) );
show_error2( "Can't close input file", filenames[i].c_str() );
retval = 2;
}