From 705beb4c25f976f6bce40818bd835e235c2babf4 Mon Sep 17 00:00:00 2001
From: Felix Lange <fjl@twurst.com>
Date: Wed, 27 May 2015 15:48:07 +0200
Subject: cmd/utils: print errors only once if stdout and stderr are the same
 file

---
 cmd/utils/cmd.go | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

(limited to 'cmd/utils')

diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go
index 550ac1c51..06c240bd4 100644
--- a/cmd/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -125,10 +125,17 @@ func initDataDir(Datadir string) {
 	}
 }
 
-// Fatalf formats a message to standard output and exits the program.
+// Fatalf formats a message to standard error and exits the program.
+// The message is also printed to standard output if standard error
+// is redirected to a different file.
 func Fatalf(format string, args ...interface{}) {
-	fmt.Fprintf(os.Stderr, "Fatal: "+format+"\n", args...)
-	fmt.Fprintf(os.Stdout, "Fatal: "+format+"\n", args...)
+	w := io.MultiWriter(os.Stdout, os.Stderr)
+	outf, _ := os.Stdout.Stat()
+	errf, _ := os.Stderr.Stat()
+	if outf != nil && errf != nil && os.SameFile(outf, errf) {
+		w = os.Stderr
+	}
+	fmt.Fprintf(w, "Fatal: "+format+"\n", args...)
 	logger.Flush()
 	os.Exit(1)
 }
-- 
cgit v1.2.3