delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2016/04/20/01:33:19

X-Recipient: archive-cygwin AT delorie DOT com
DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:subject:to:references:cc:from:message-id:date
:mime-version:in-reply-to:content-type; q=dns; s=default; b=EInU
ROq4bMiwIwzCX6Y9fKQszWOd9HRuzV4w9db1q6/PTN/Sjn9mhYUXXmA9ueY5vXZB
uLj47UgtCRGZyHwyRaQfrmWn8szzVtFPxOoLFGBKikJ92r3P7hFui7Rh6EphFWCF
KJdhx+ZHejbGSQgwCAm95CDkGA7vcLJ5L7v1Z8E=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:subject:to:references:cc:from:message-id:date
:mime-version:in-reply-to:content-type; s=default; bh=HCIfh1X1Xu
jR6CQEcZ8V9a7Hz74=; b=K9O5vB8rklPKWP+RkUdgreoQ2tsOtDA109ElKq/f6b
6QjEVHWCFpZYfqLsm88xdBl39moCDJLxnE5yZGkAbV9LZTB4kvaCCMoZL6GsFyLE
6uBJFnX/9AyG5mH/IL5fPYC7HlsbDgZ8SRKx1jBGW96WbYPOlDxZqlfWBZfSZv66
k=
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Authentication-Results: sourceware.org; auth=none
X-Virus-Found: No
X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=Close, H*r:ip*192.168.1.9, U*eggert, sk:eggert
X-HELO: zimbra.cs.ucla.edu
Subject: Re: bug#23314: gzip-1.7-1 regression: cannot redirect output of gzip -l
To: 23314-done AT debbugs DOT gnu DOT org
References: <1461059351776 DOT 571881 DOT 3e60150cb042ecb2c8733407f23d3f30c0d10aa5 AT spica DOT telekom DOT de> <57163ADD DOT 1080005 AT redhat DOT com> <5716D21F DOT 1020505 AT cs DOT ucla DOT edu>
Cc: Eric Blake <eblake AT redhat DOT com>, cygwin AT cygwin DOT com
From: Paul Eggert <eggert AT cs DOT ucla DOT edu>
Message-ID: <57171473.7060701@cs.ucla.edu>
Date: Tue, 19 Apr 2016 22:32:35 -0700
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0
MIME-Version: 1.0
In-Reply-To: <5716D21F.1020505@cs.ucla.edu>

--------------080008010903080804060601
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

Come to think of it, that part of gzip can be simplified considerably, which 
should make future problems like this less likely. I installed the attached 
additional patch. Yay, 46 fewer files in the gzip tarball!


--------------080008010903080804060601
Content-Type: text/x-diff;
 name="0001-gzip-simplify-by-closing-ourselves.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="0001-gzip-simplify-by-closing-ourselves.patch"

From 02b67e301e66c8641230afbe8663f2d503c0f57b Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert AT cs DOT ucla DOT edu>
Date: Tue, 19 Apr 2016 22:05:57 -0700
Subject: [PATCH] gzip: simplify by closing ourselves

This simplifies the previous fix, by avoiding the use of the
closein module.  That module was problematic, as gzip normally
does not use stdio for output and never uses it for input.
Also, it is a heavyweight module, as it drags many files into lib
(c-ctype.c, c-ctype.h, closein.c, closein.h, closeout.c, closeout.h,
close-stream.c, close-stream.h, config.charset, c-strcasecmp.c,
c-strcaseeq.h, c-strcase.h, c-strncasecmp.c, fpending.c, fpending.h,
freadahead.c, freadahead.h, localcharset.c, localcharset.h, mbrtowc.c,
mbsinit.c, quotearg.c, quotearg.h, quote.h, ref-add.sin, ref-del.sin,
streq.h, wctype-h.c, wctype.in.h) and into m4 (closein.m4, closeout.m4,
close-stream.m4, codeset.m4, configmake.m4, fpending.m4, freadahead.m4,
glibc21.m4, localcharset.m4, locale-fr.m4, locale-ja.m4, locale-zh.m4,
mbrtowc.m4, mbsinit.m4, mbstate_t.m4, quotearg.m4, wctype_h.m4),
and these files are thus no longer needed.
* bootstrap.conf (gnulib_modules): Remove closein.
* gzip.c: Don't include closein.h.
(stdin_was_read): New static var.
(main): Don't use close_stdin.
Invoke finish_out to exit after outputting via stdio's stdout.
Close stdin after reading it.
Restore previous way of closing stdout.
(treat_stdin): Record that stdin was read.
(finish_out): New function.
---
 bootstrap.conf |  1 -
 gzip.c         | 33 +++++++++++++++++++++++++--------
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/bootstrap.conf b/bootstrap.conf
index 25acaac..6cbaaa2 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -24,7 +24,6 @@ gnulib_modules='
 announce-gen
 calloc
 close
-closein
 dirname-lgpl
 fclose
 fcntl
diff --git a/gzip.c b/gzip.c
index 3b8de4d..4a51b13 100644
--- a/gzip.c
+++ b/gzip.c
@@ -63,7 +63,6 @@ static char const *const license_msg[] = {
 #include <sys/stat.h>
 #include <errno.h>
 
-#include "closein.h"
 #include "tailor.h"
 #include "gzip.h"
 #include "intprops.h"
@@ -206,6 +205,8 @@ static int volatile exiting_signal;
 /* If nonnegative, close this file descriptor and unlink ofname on error.  */
 static int volatile remove_ofname_fd = -1;
 
+static bool stdin_was_read;
+
 off_t bytes_in;             /* number of input bytes */
 off_t bytes_out;            /* number of output bytes */
 static off_t total_in;      /* input bytes for all files */
@@ -317,6 +318,7 @@ local void install_signal_handlers (void);
 local void remove_output_file (void);
 local RETSIGTYPE abort_gzip_signal (int);
 local void do_exit      (int exitcode) ATTRIBUTE_NORETURN;
+static void finish_out (void);
       int main          (int argc, char **argv);
 static int (*work) (int infile, int outfile) = zip; /* function to call */
 
@@ -427,8 +429,6 @@ int main (int argc, char **argv)
     program_name = gzip_base_name (argv[0]);
     proglen = strlen (program_name);
 
-    atexit (close_stdin);
-
     /* Suppress .exe for MSDOS, OS/2 and VMS: */
     if (4 < proglen && strequ (program_name + proglen - 4, ".exe"))
       program_name[proglen - 4] = '\0';
@@ -527,13 +527,13 @@ int main (int argc, char **argv)
         case 'f':
             force++; break;
         case 'h': case 'H':
-            help(); do_exit(OK); break;
+            help (); finish_out (); break;
         case 'k':
             keep = 1; break;
         case 'l':
             list = decompress = to_stdout = 1; break;
         case 'L':
-            license(); do_exit(OK); break;
+            license (); finish_out (); break;
         case 'm': /* undocumented, may change later */
             no_time = 1; break;
         case 'M': /* undocumented, may change later */
@@ -580,7 +580,7 @@ int main (int argc, char **argv)
         case 'v' + ENV_OPTION:
             verbose++; quiet = 0; break;
         case 'V':
-            version(); do_exit(OK); break;
+            version (); finish_out (); break;
         case 'Z':
 #ifdef LZW
             do_lzw = 1; break;
@@ -664,6 +664,11 @@ int main (int argc, char **argv)
     } else {  /* Standard input */
         treat_stdin();
     }
+    if (stdin_was_read && close (STDIN_FILENO) != 0)
+      {
+        strcpy (ifname, "stdin");
+        read_error ();
+      }
     if (list)
       {
         /* Output any totals, and check for output errors.  */
@@ -672,8 +677,11 @@ int main (int argc, char **argv)
         if (fflush (stdout) != 0)
           write_error ();
       }
-    if (to_stdout && synchronous && fdatasync (STDOUT_FILENO) != 0
-        && errno != EINVAL && errno != EBADF)
+    if (to_stdout
+        && ((synchronous
+             && fdatasync (STDOUT_FILENO) != 0 && errno != EINVAL)
+            || close (STDOUT_FILENO) != 0)
+        && errno != EBADF)
       write_error ();
     do_exit(exit_code);
     return exit_code; /* just to avoid lint warning */
@@ -759,6 +767,7 @@ local void treat_stdin()
     to_stdout = 1;
     part_nb = 0;
     ifd = STDIN_FILENO;
+    stdin_was_read = true;
 
     if (decompress) {
         method = get_method(ifd);
@@ -2093,6 +2102,14 @@ local void do_exit(exitcode)
     exit(exitcode);
 }
 
+static void
+finish_out (void)
+{
+  if (fclose (stdout) != 0)
+    write_error ();
+  do_exit (OK);
+}
+
 /* ========================================================================
  * Close and unlink the output file.
  */
-- 
2.5.5



--------------080008010903080804060601
Content-Type: text/plain; charset=us-ascii

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
--------------080008010903080804060601--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019