about summary refs log tree commit diff
path: root/xe.c
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2017-10-09 20:18:31 +0200
committerLeah Neukirchen <leah@vuxu.org>2017-10-09 20:18:31 +0200
commit71f5f214dc8601749ad842559c786da9347cd1ba (patch)
tree89019cab781e25247938d55baeabe3f526f99096 /xe.c
parent857e8afe74520dab491cd15a6fd7464980c56609 (diff)
downloadxe-71f5f214dc8601749ad842559c786da9347cd1ba.tar.gz
xe-71f5f214dc8601749ad842559c786da9347cd1ba.tar.xz
xe-71f5f214dc8601749ad842559c786da9347cd1ba.zip
open stderr linewise when using it for tracing
Diffstat (limited to 'xe.c')
-rw-r--r--xe.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/xe.c b/xe.c
index 2c7e8a8..f5998e8 100644
--- a/xe.c
+++ b/xe.c
@@ -560,6 +560,18 @@ perc_subst(char *pat, char *base, char *arg)
 	return buf;
 }
 
+static void
+trace_to_stderr()
+{
+	FILE *linestderr = fdopen(2, "w");
+	if (linestderr) {
+		setvbuf(linestderr, 0, _IOLBF, 0);
+		traceout = linestderr;
+	} else {
+		traceout = stderr;
+	}
+}
+
 int
 main(int argc, char *argv[], char *envp[])
 {
@@ -602,7 +614,7 @@ main(int argc, char *argv[], char *envp[])
 		case 'p': pflag++; break;
 		case 'q': qflag++; break;
 		case 's': sflag = optarg; break;
-		case 'v': vflag++; traceout = stderr; break;
+		case 'v': vflag++; break;
 		default:
 			fprintf(stderr,
 			    "Usage: %s [-0FLRnqv] [-p | -I arg] [-N maxargs] [-j maxjobs] COMMAND...\n"
@@ -618,8 +630,8 @@ main(int argc, char *argv[], char *envp[])
 	if (!children)
 		exit(1);
 
-	if (Lflag && vflag > 1)
-		traceout = stdout;
+	if (!Lflag || vflag <= 1)
+		trace_to_stderr();
 
 	if (aflag || Aflag) {
 		input = 0;