Module Name:    src
Committed By:   christos
Date:           Sat Jan 22 14:00:45 UTC 2022

Modified Files:
        src/usr.bin/gzip: gzip.c

Log Message:
make siginfo handler print to /dev/tty.


To generate a diff of this commit:
cvs rdiff -u -r1.117 -r1.118 src/usr.bin/gzip/gzip.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/gzip/gzip.c
diff -u src/usr.bin/gzip/gzip.c:1.117 src/usr.bin/gzip/gzip.c:1.118
--- src/usr.bin/gzip/gzip.c:1.117	Thu Jun 24 03:16:49 2021
+++ src/usr.bin/gzip/gzip.c	Sat Jan 22 09:00:45 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: gzip.c,v 1.117 2021/06/24 07:16:49 simonb Exp $	*/
+/*	$NetBSD: gzip.c,v 1.118 2022/01/22 14:00:45 christos Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998, 2003, 2004, 2006, 2008, 2009, 2010, 2011, 2015, 2017
@@ -31,7 +31,7 @@
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1997, 1998, 2003, 2004, 2006, 2008,\
  2009, 2010, 2011, 2015, 2017 Matthew R. Green.  All rights reserved.");
-__RCSID("$NetBSD: gzip.c,v 1.117 2021/06/24 07:16:49 simonb Exp $");
+__RCSID("$NetBSD: gzip.c,v 1.118 2022/01/22 14:00:45 christos Exp $");
 #endif /* not lint */
 
 /*
@@ -65,6 +65,7 @@ __RCSID("$NetBSD: gzip.c,v 1.117 2021/06
 #include <stdarg.h>
 #include <getopt.h>
 #include <time.h>
+#include <paths.h>
 
 #ifndef PRIdOFF
 #define PRIdOFF PRId64
@@ -1708,19 +1709,39 @@ file_uncompress(char *file, char *outfil
 static void
 check_siginfo(void)
 {
+	static int ttyfd = -2;
+	char buf[2048];
+	int n;
+
 	if (print_info == 0)
 		return;
-	if (infile) {
-		if (infile_total) {
-			int pcent = (int)((100.0 * infile_current) / infile_total);
-
-			fprintf(stderr, "%s: done %llu/%llu bytes %d%%\n",
-				infile, (unsigned long long)infile_current,
-				(unsigned long long)infile_total, pcent);
-		} else
-			fprintf(stderr, "%s: done %llu bytes\n",
-				infile, (unsigned long long)infile_current);
+
+	if (!infile)
+		goto out;
+
+	if (ttyfd == -2)
+		ttyfd = open(_PATH_TTY, O_RDWR | O_CLOEXEC);
+
+	if (ttyfd == -1)
+		goto out;
+
+	if (infile_total) {
+		const double pcent = (100.0 * infile_current) / infile_total;
+
+		n = snprintf(buf, sizeof(buf),
+		    "%s: %s: done %ju/%ju bytes (%3.2f%%)\n",
+		    getprogname(), infile, (uintmax_t)infile_current,
+		    (uintmax_t)infile_total, pcent);
+	} else {
+		n = snprintf(buf, sizeof(buf), "%s: %s: done %ju bytes\n",
+		    getprogname(), infile, (uintmax_t)infile_current);
 	}
+
+	if (n <= 0)
+		goto out;
+
+	write(ttyfd, buf, (size_t)n);
+out:
 	print_info = 0;
 }
 
@@ -1883,7 +1904,7 @@ handle_stdout(void)
 	uint32_t mtime;
 	int ret;
 
-	infile_set("(stdout)", 0);
+	infile_set("<stdout>", 0);
 
 	if (fflag == 0 && isatty(STDOUT_FILENO)) {
 		maybe_warnx("standard output is a terminal -- ignoring");
@@ -1898,7 +1919,7 @@ handle_stdout(void)
 	}
 
 	if (S_ISREG(sb.st_mode)) {
-		infile_set("(stdout)", sb.st_size);
+		infile_set("<stdout>", sb.st_size);
 		mtime = (uint32_t)sb.st_mtime;
 	} else {
 		systime = time(NULL);

Reply via email to