From 634a6bfc0f31a1e8e9ab777a77590005f2b9bcaf Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 24 Feb 2025 05:07:04 +0100 Subject: [PATCH] Merging upstream version 0.9~rc2. Signed-off-by: Daniel Baumann --- ChangeLog | 16 +++++++++---- INSTALL | 2 +- Makefile.in | 11 +++++---- NEWS | 5 ++++ configure | 4 ++-- doc/zcat.1 | 2 +- doc/zcmp.1 | 2 +- doc/zdiff.1 | 2 +- doc/zgrep.1 | 2 +- doc/ztest.1 | 2 +- doc/zutils.info | 18 +++++++-------- doc/zutils.texinfo | 6 ++--- main.cc | 1 + testsuite/check.sh | 51 ++++++++++++++++++++++++++++------------- testsuite/test.txt.tar | Bin 0 -> 40960 bytes zcat.cc | 4 ++-- zcmp.cc | 14 +++++++---- zgrep.cc | 18 ++++++++++----- ztest.cc | 34 +++++++++++++++++++-------- zutils.cc | 7 +++--- zutils.h | 3 ++- 21 files changed, 133 insertions(+), 71 deletions(-) create mode 100644 testsuite/test.txt.tar diff --git a/ChangeLog b/ChangeLog index 681e746..9105618 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,18 @@ +2010-12-05 Antonio Diaz Diaz + + * Version 0.9-rc2 released. + * zcmp.cc: Fixed deadlock when files differ. + * zgrep.cc: Fixed deadlock when binary file matches. + 2010-11-20 Antonio Diaz Diaz * Version 0.9-rc1 released. - * configure: Added new options "DIFF" and "GREP". + * configure: Added new options `DIFF' and `GREP'. 2010-11-15 Antonio Diaz Diaz * Version 0.8 released. - * main.cc: Added new options "--zcat", "--zgrep" and "--ztest". + * main.cc: Added new options `--zcat', `--zgrep' and `--ztest'. * zcat.cc: New file implementing zcat+cat functionality in C++. * zcmp.cc: New file implementing zcmp+cmp functionality in C++. * doc/zcmp.1: New file. @@ -18,7 +24,7 @@ documentation because egrep and fgrep are deprecated. * ztest.cc: New file implementing ztest functionality in C++. * Makefile.in: Added quotes to directory names. - * testsuite/check.sh: Use "test.txt" instead of "COPYING" for testing. + * testsuite/check.sh: Use `test.txt' instead of `COPYING' for testing. * Removed environment safeguards from configure as requested by Richard Stallman. Now environment variables affect configure. @@ -26,14 +32,14 @@ * Version 0.7 released. * Added new utility; ztest. - * zcat.in: Added new option "--recursive". + * zcat.in: Added new option `--recursive'. 2009-10-05 Antonio Diaz Diaz * Version 0.6 released. * zcat.in, zgrep.in: Removed again default compressor. Format of data read from stdin is now automatically detected. - * Makefile.in: Added "--name" option to help2man invocation. + * Makefile.in: Added `--name' option to help2man invocation. 2009-10-01 Antonio Diaz Diaz diff --git a/INSTALL b/INSTALL index 9c7b683..f6350dd 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ Requirements ------------ You will need a C++ compiler. -I use gcc 4.3.4 and 3.3.6, but the code should compile with any +I use gcc 4.3.5 and 3.3.6, but the code should compile with any standards compliant compiler. Gcc is available at http://gcc.gnu.org. diff --git a/Makefile.in b/Makefile.in index 2fc8ccb..cb987ca 100644 --- a/Makefile.in +++ b/Makefile.in @@ -26,7 +26,7 @@ $(progname)_profiled : $(objs) $(CXX) $(LDFLAGS) -pg -o $@ $(objs) zcat : zcat.in - cat $(VPATH)/zcat.in > zcat + cat $(VPATH)/zcat.in > $@ chmod a+x zcat zcmp : $(zcmp_objs) @@ -36,19 +36,19 @@ zdiff : $(zdiff_objs) $(CXX) $(LDFLAGS) -o $@ $(zdiff_objs) zegrep : zegrep.in - cat $(VPATH)/zegrep.in > zegrep + cat $(VPATH)/zegrep.in > $@ chmod a+x zegrep zfgrep : zfgrep.in - cat $(VPATH)/zfgrep.in > zfgrep + cat $(VPATH)/zfgrep.in > $@ chmod a+x zfgrep zgrep : zgrep.in - cat $(VPATH)/zgrep.in > zgrep + cat $(VPATH)/zgrep.in > $@ chmod a+x zgrep ztest : ztest.in - cat $(VPATH)/ztest.in > ztest + cat $(VPATH)/ztest.in > $@ chmod a+x ztest main.o : main.cc @@ -175,6 +175,7 @@ dist : doc $(DISTNAME)/doc/$(pkgname).texinfo \ $(DISTNAME)/testsuite/check.sh \ $(DISTNAME)/testsuite/test.txt \ + $(DISTNAME)/testsuite/test.txt.tar \ $(DISTNAME)/*.h \ $(DISTNAME)/*.cc \ $(DISTNAME)/z*.in diff --git a/NEWS b/NEWS index 16d3c00..7d896a7 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ Changes in version 0.9: Configure now allows the selection of diff and grep programs to use. + +A deadlock in zcmp.cc, which happened when files differ, has been fixed. + +A deadlock in zgrep.cc, which happened when a binary file matches, has +been fixed. diff --git a/configure b/configure index 4d3753c..0f0b82e 100755 --- a/configure +++ b/configure @@ -5,12 +5,12 @@ # This configure script is free software: you have unlimited permission # to copy, distribute and modify it. # -# Date of this version: 2010-11-20 +# Date of this version: 2010-12-05 args= no_create= pkgname=zutils -pkgversion=0.9-rc1 +pkgversion=0.9-rc2 progname=zutils srctrigger=zutils.h diff --git a/doc/zcat.1 b/doc/zcat.1 index be5d381..efa2fcb 100644 --- a/doc/zcat.1 +++ b/doc/zcat.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.37.1. -.TH ZCAT "1" "November 2010" "Zcat (zutils) 0.9-rc1" "User Commands" +.TH ZCAT "1" "December 2010" "Zcat (zutils) 0.9-rc2" "User Commands" .SH NAME Zcat \- decompress and concatenate files to standard output .SH SYNOPSIS diff --git a/doc/zcmp.1 b/doc/zcmp.1 index f1e8472..6098ec2 100644 --- a/doc/zcmp.1 +++ b/doc/zcmp.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.37.1. -.TH ZCMP "1" "November 2010" "Zcmp (zutils) 0.9-rc1" "User Commands" +.TH ZCMP "1" "December 2010" "Zcmp (zutils) 0.9-rc2" "User Commands" .SH NAME Zcmp \- decompress and compare two files byte by byte .SH SYNOPSIS diff --git a/doc/zdiff.1 b/doc/zdiff.1 index 6ed05de..7d1c747 100644 --- a/doc/zdiff.1 +++ b/doc/zdiff.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.37.1. -.TH ZDIFF "1" "November 2010" "Zdiff (zutils) 0.9-rc1" "User Commands" +.TH ZDIFF "1" "December 2010" "Zdiff (zutils) 0.9-rc2" "User Commands" .SH NAME Zdiff \- decompress and compare two files line by line .SH SYNOPSIS diff --git a/doc/zgrep.1 b/doc/zgrep.1 index 2ec43dc..233c433 100644 --- a/doc/zgrep.1 +++ b/doc/zgrep.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.37.1. -.TH ZGREP "1" "November 2010" "Zgrep (zutils) 0.9-rc1" "User Commands" +.TH ZGREP "1" "December 2010" "Zgrep (zutils) 0.9-rc2" "User Commands" .SH NAME Zgrep \- search compressed files for a regular expression .SH SYNOPSIS diff --git a/doc/ztest.1 b/doc/ztest.1 index 8db8692..97f5916 100644 --- a/doc/ztest.1 +++ b/doc/ztest.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.37.1. -.TH ZTEST "1" "November 2010" "Ztest (zutils) 0.9-rc1" "User Commands" +.TH ZTEST "1" "December 2010" "Ztest (zutils) 0.9-rc2" "User Commands" .SH NAME Ztest \- verify integrity of compressed files .SH SYNOPSIS diff --git a/doc/zutils.info b/doc/zutils.info index 38e6746..910d140 100644 --- a/doc/zutils.info +++ b/doc/zutils.info @@ -12,7 +12,7 @@ File: zutils.info, Node: Top, Next: Introduction, Up: (dir) Zutils Manual ************* -This manual is for Zutils (version 0.9-rc1, 20 November 2010). +This manual is for Zutils (version 0.9-rc2, 5 December 2010). * Menu: @@ -531,13 +531,13 @@ Concept Index  Tag Table: Node: Top224 -Node: Introduction991 -Node: Zcat2446 -Node: Zcmp4330 -Node: Zdiff6387 -Node: Zgrep8624 -Node: Ztest11391 -Node: Problems12474 -Node: Concept Index13003 +Node: Introduction990 +Node: Zcat2445 +Node: Zcmp4329 +Node: Zdiff6386 +Node: Zgrep8623 +Node: Ztest11390 +Node: Problems12473 +Node: Concept Index13002  End Tag Table diff --git a/doc/zutils.texinfo b/doc/zutils.texinfo index dbae4bb..7121f1d 100644 --- a/doc/zutils.texinfo +++ b/doc/zutils.texinfo @@ -5,8 +5,8 @@ @finalout @c %**end of header -@set UPDATED 20 November 2010 -@set VERSION 0.9-rc1 +@set UPDATED 5 December 2010 +@set VERSION 0.9-rc2 @dircategory Data Compression @direntry @@ -14,6 +14,7 @@ @end direntry +@ifnothtml @titlepage @title Zutils @subtitle Utilities dealing with compressed files @@ -24,7 +25,6 @@ @vskip 0pt plus 1filll @end titlepage -@ifnothtml @contents @end ifnothtml diff --git a/main.cc b/main.cc index 56cbf06..d752489 100644 --- a/main.cc +++ b/main.cc @@ -19,6 +19,7 @@ #include #include +#include #include #include #include diff --git a/testsuite/check.sh b/testsuite/check.sh index 073843e..c32c3fe 100755 --- a/testsuite/check.sh +++ b/testsuite/check.sh @@ -37,6 +37,9 @@ done printf "testing zutils-%s..." "$2" cat "${testdir}"/test.txt > in || framework_failure +cat "${testdir}"/test.txt.tar > in.tar || framework_failure +printf "01234567890" > pin.tar || framework_failure +cat in.tar in.tar in.tar in.tar >> pin.tar || framework_failure cat in > -in- || framework_failure cat in.lz > -in-.lz || framework_failure cat in.lz > lz_only.lz || framework_failure @@ -84,6 +87,8 @@ for i in ${extensions}; do printf . done +"${ZCMP}" in.tar pin.tar > /dev/null +if [ $? != 1 ] ; then fail=1 ; printf - ; else printf . ; fi "${ZCMP}" - || fail=1 printf . "${ZCMP}" in in || fail=1 @@ -130,6 +135,8 @@ for i in ${extensions}; do printf . done +#"${ZDIFF}" in.tar pin.tar > /dev/null +#if [ $? != 1 ] ; then fail=1 ; printf - ; else printf . ; fi "${ZDIFF}" - || fail=1 printf . "${ZDIFF}" in in || fail=1 @@ -168,44 +175,56 @@ printf . printf "\ntesting zgrep-%s..." "$2" for i in ${extensions}; do - "${ZGREP}" License in.$i > /dev/null || fail=1 - "${ZGREP}" nx_pattern in.$i > /dev/null && fail=1 + "${ZGREP}" "GNU" in.$i > /dev/null || fail=1 + "${ZGREP}" "nx_pattern" in.$i > /dev/null && fail=1 printf . done -"${ZGREP}" -r License . > /dev/null || fail=1 +"${ZGREP}" "GNU" < pin.tar > /dev/null || fail=1 printf . -"${ZGREP}" nx_pattern -r . in > /dev/null && fail=1 +"${ZGREP}" "GNU" pin.tar > /dev/null || fail=1 printf . -"${ZGREP}" License < in > /dev/null || fail=1 +"${ZGREP}" -r "GNU" . > /dev/null || fail=1 printf . -"${ZGREP}" License < in.gz > /dev/null || fail=1 +"${ZGREP}" "nx_pattern" -r . in > /dev/null && fail=1 printf . -"${ZGREP}" License < in.bz2 > /dev/null || fail=1 +"${ZGREP}" "GNU" < in > /dev/null || fail=1 printf . -"${ZGREP}" License < in.lz > /dev/null || fail=1 +"${ZGREP}" "GNU" < in.gz > /dev/null || fail=1 printf . -"${ZGREP}" License in > /dev/null || fail=1 +"${ZGREP}" "GNU" < in.bz2 > /dev/null || fail=1 printf . -"${ZGREP}" License -- -in- > /dev/null || fail=1 +"${ZGREP}" "GNU" < in.lz > /dev/null || fail=1 printf . -"${ZGREP}" License -- -in-.lz > /dev/null || fail=1 +"${ZGREP}" "GNU" in > /dev/null || fail=1 printf . -"${ZGREP}" License in in.gz in.bz2 in.lz -- -in- > /dev/null || fail=1 +"${ZGREP}" "GNU" -- -in- > /dev/null || fail=1 printf . -"${ZEGREP}" License in > /dev/null || fail=1 +"${ZGREP}" "GNU" -- -in-.lz > /dev/null || fail=1 printf . -"${ZFGREP}" License in > /dev/null || fail=1 +"${ZGREP}" "GNU" in in.gz in.bz2 in.lz -- -in- > /dev/null || fail=1 +printf . +"${ZEGREP}" "GNU" in > /dev/null || fail=1 +printf . +"${ZFGREP}" "GNU" in > /dev/null || fail=1 printf . printf "\ntesting ztest-%s..." "$2" "${ZTEST}" in in.gz in.bz2 in.lz -- -in- || fail=1 printf . +"${ZTEST}" < in.gz || fail=1 +printf . +"${ZTEST}" < in.bz2 || fail=1 +printf . +"${ZTEST}" < in.lz || fail=1 +printf . "${ZTEST}" -r . || fail=1 printf . -printf "LZIPvs0000000000000000000000" | "${ZTEST}" 2>/dev/null && fail=1 -printf . +"${ZTEST}" < in 2>/dev/null +if [ $? = 0 ] ; then fail=1 ; printf - ; else printf . ; fi +printf "LZIPvs0000000000000000000000" | "${ZTEST}" 2>/dev/null +if [ $? = 0 ] ; then fail=1 ; printf - ; else printf . ; fi echo if [ ${fail} = 0 ] ; then diff --git a/testsuite/test.txt.tar b/testsuite/test.txt.tar new file mode 100644 index 0000000000000000000000000000000000000000..4937a77adfc332f798416eb6d2421760721a951d GIT binary patch literal 40960 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�Yf^~Cq=^H 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 U9Qe$E&m8#7fzKTHzu>_C2Jcg&0{{R3 literal 0 HcmV?d00001 diff --git a/zcat.cc b/zcat.cc index 1ead9f4..cb29db9 100644 --- a/zcat.cc +++ b/zcat.cc @@ -198,13 +198,13 @@ int cat( int infd, const std::string & input_filename, int retval = 0; if( !set_data_feeder( &infd, &pid ) ) retval = 1; else - { retval = do_cat( infd, buffer_size, inbuf, outbuf, input_filename, cat_options ); + if( retval == 0 ) if( pid && wait_for_child( pid, "data feeder" ) != 0 ) retval = 1; + if( retval == 0 ) if( close( infd ) != 0 ) { show_close_error( "data feeder" ); retval = 1; } - } delete[] inbuf; delete[] outbuf; return retval; } diff --git a/zcmp.cc b/zcmp.cc index a2779b9..7951046 100644 --- a/zcmp.cc +++ b/zcmp.cc @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -469,10 +470,15 @@ int main( const int argc, const char * const argv[] ) int retval = cmp( max_size, infd, filenames, print_bytes ); - if( ( ( pid[0] && wait_for_child( pid[0], "data feeder" ) != 0 ) || - ( pid[1] && wait_for_child( pid[1], "data feeder" ) != 0 ) ) && - retval == 0 ) - retval = 2; + if( retval != 0 ) + { + if( pid[0] ) kill( pid[0], SIGTERM ); + if( pid[1] ) kill( pid[1], SIGTERM ); + } + else + if( ( pid[0] && wait_for_child( pid[0], "data feeder" ) != 0 ) || + ( pid[1] && wait_for_child( pid[1], "data feeder" ) != 0 ) ) + retval = 2; for( int i = 0; i < 2; ++i ) { diff --git a/zgrep.cc b/zgrep.cc index 41317a5..d0e69e3 100644 --- a/zgrep.cc +++ b/zgrep.cc @@ -84,9 +84,12 @@ int zgrep_stdin( int infd, const std::vector< const char * > & grep_args ) // parent if( grep_pid < 0 ) { show_fork_error( GREP ); return 2; } - int retval = 0; - if( pid && wait_for_child( pid, "data feeder" ) != 0 ) retval = 2; - if( wait_for_child( grep_pid, GREP ) != 0 ) retval = 2; + + int retval = wait_for_child( grep_pid, GREP ); + if( retval != 1 ) + { if( pid ) kill( pid, SIGTERM ); } + else + if( pid && wait_for_child( pid, "data feeder" ) != 0 ) retval = 2; if( close( infd ) != 0 ) { show_close_error( "data feeder" ); return 2; } return retval; @@ -146,9 +149,12 @@ int zgrep_file( int infd, const std::string & input_filename, } if( size < buffer_size ) break; } - int retval = 0; - if( pid && wait_for_child( pid, "data feeder" ) != 0 ) retval = 2; - if( wait_for_child( grep_pid, GREP ) != 0 ) retval = 2; + + int retval = wait_for_child( grep_pid, GREP ); + if( retval != 1 ) + { if( pid ) kill( pid, SIGTERM ); } + else + if( pid && wait_for_child( pid, "data feeder" ) != 0 ) retval = 2; if( grep_list && retval == 0 ) std::printf( "%s\n", input_filename.c_str() ); if( close( infd ) != 0 ) diff --git a/ztest.cc b/ztest.cc index 3672aa8..0193bfa 100644 --- a/ztest.cc +++ b/ztest.cc @@ -42,12 +42,12 @@ int ztest_stdin( const int infd, int magic_size = 0; if( !test_format( infd, file_type, &magic_data, &magic_size ) ) { show_error( "Unknown data format read from stdin." ); return 2; } - int fda[2]; + int fda[2]; // pipe from feeder if( pipe( fda ) < 0 ) { show_error( "Can't create pipe", errno ); return 1; } - const pid_t pid = fork(); - if( pid == 0 ) // child (decompressor) + const pid_t pid = fork(); + if( pid == 0 ) // child1 (decompressor) { if( dup2( fda[0], STDIN_FILENO ) >= 0 && close( fda[0] ) == 0 && close( fda[1] ) == 0 ) @@ -66,11 +66,26 @@ int ztest_stdin( const int infd, // parent if( pid < 0 ) { show_fork_error( file_type.c_str() ); return 1; } - close( fda[0] ); - if( !feed_data( infd, fda[1], magic_data, magic_size ) ) return 1; - if( close( fda[1] ) != 0 ) - { show_close_error( "data feeder" ); return 1; } - return wait_for_child( pid, file_type.c_str() ); + + const pid_t pid2 = fork(); + if( pid2 == 0 ) // child2 (decompressor feeder) + { + if( close( fda[0] ) != 0 || + !feed_data( infd, fda[1], magic_data, magic_size ) ) + _exit( 1 ); + if( close( fda[1] ) != 0 ) + { show_close_error( "decompressor feeder" ); _exit( 1 ); } + _exit( 0 ); + } + // parent + if( pid2 < 0 ) + { show_fork_error( "decompressor feeder" ); return 1; } + + close( fda[0] ); close( fda[1] ); + int retval = wait_for_child( pid, file_type.c_str(), 1 ); + if( retval == 0 && wait_for_child( pid2, "decompressor feeder" ) != 0 ) + retval = 1; + return retval; } @@ -101,5 +116,6 @@ int ztest_file( const int infd, const std::string & input_filename, // parent if( pid < 0 ) { show_fork_error( file_type.c_str() ); return 1; } - return wait_for_child( pid, file_type.c_str() ); + + return wait_for_child( pid, file_type.c_str(), 1 ); } diff --git a/zutils.cc b/zutils.cc index 01a0152..7b86c7d 100644 --- a/zutils.cc +++ b/zutils.cc @@ -305,7 +305,8 @@ bool test_format( const int infd, std::string & file_type, } -int wait_for_child( const pid_t pid, const char * const name ) +int wait_for_child( const pid_t pid, const char * const name, + const int eretval ) { int status; while( waitpid( pid, &status, 0 ) == -1 ) @@ -315,10 +316,10 @@ int wait_for_child( const pid_t pid, const char * const name ) if( verbosity >= 0 ) std::fprintf( stderr, "%s: Error waiting termination of `%s': %s.\n", util_name, name, std::strerror( errno ) ); - _exit( 1 ); + _exit( eretval ); } } if( WIFEXITED( status ) ) return WEXITSTATUS( status ); - else return 1; + return eretval; } diff --git a/zutils.h b/zutils.h index 87eddca..5a2f167 100644 --- a/zutils.h +++ b/zutils.h @@ -54,4 +54,5 @@ void internal_error( const char * const msg ); bool test_format( const int infd, std::string & file_type, const uint8_t ** magic_data, int * magic_sizep ); -int wait_for_child( const pid_t pid, const char * const name ); +int wait_for_child( const pid_t pid, const char * const name, + const int eretval = 2 );