From 8699412a4c4f7d5f081fc6c13cfcba000f40560b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sun, 9 Apr 2023 22:32:15 +0800 Subject: [PATCH] platform: Add stderr redirect --- experimental/libbox/command_log.go | 2 +- experimental/libbox/log.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 experimental/libbox/log.go diff --git a/experimental/libbox/command_log.go b/experimental/libbox/command_log.go index b70e9884..851f0ed3 100644 --- a/experimental/libbox/command_log.go +++ b/experimental/libbox/command_log.go @@ -63,7 +63,7 @@ func (s *CommandServer) handleLogConn(conn net.Conn) error { for { select { case <-ctx.Done(): - return ctx.Err() + return nil case message := <-subscription: err = writeLog(conn, []byte(message)) if err != nil { diff --git a/experimental/libbox/log.go b/experimental/libbox/log.go new file mode 100644 index 00000000..58d78edb --- /dev/null +++ b/experimental/libbox/log.go @@ -0,0 +1,29 @@ +//go:build darwin || linux + +package libbox + +import ( + "os" + + "golang.org/x/sys/unix" +) + +var stderrFile *os.File + +func RedirectStderr(path string) error { + if stats, err := os.Stat(path); err == nil && stats.Size() > 0 { + _ = os.Rename(path, path+".old") + } + outputFile, err := os.Create(path) + if err != nil { + return err + } + err = unix.Dup2(int(outputFile.Fd()), int(os.Stderr.Fd())) + if err != nil { + outputFile.Close() + os.Remove(outputFile.Name()) + return err + } + stderrFile = outputFile + return nil +}