From ea6b397526ee830cd43beb11200b0c206d654c2d Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 19 Jul 2024 22:23:12 +0800 Subject: [PATCH] library: os/exec.Cmd.childStdin --- internal/lib/os/exec/exec.go | 3 --- internal/lib/os/exec/exec_plan9.go | 19 +++++++++++++++++++ internal/lib/os/exec/exec_unix.go | 24 ++++++++++++++++++++++++ internal/lib/os/exec/exec_windows.go | 23 +++++++++++++++++++++++ 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 internal/lib/os/exec/exec_plan9.go create mode 100644 internal/lib/os/exec/exec_unix.go create mode 100644 internal/lib/os/exec/exec_windows.go diff --git a/internal/lib/os/exec/exec.go b/internal/lib/os/exec/exec.go index d56db4e7..c54ecc3e 100644 --- a/internal/lib/os/exec/exec.go +++ b/internal/lib/os/exec/exec.go @@ -416,7 +416,6 @@ func (c *Cmd) argv() []string { } func (c *Cmd) childStdin() (*os.File, error) { - /* TODO(xsw): if c.Stdin == nil { f, err := os.Open(os.DevNull) if err != nil { @@ -448,8 +447,6 @@ func (c *Cmd) childStdin() (*os.File, error) { return err }) return pr, nil - */ - panic("todo: exec.Cmd.childStdin") } func (c *Cmd) childStdout() (*os.File, error) { diff --git a/internal/lib/os/exec/exec_plan9.go b/internal/lib/os/exec/exec_plan9.go new file mode 100644 index 00000000..8920bec1 --- /dev/null +++ b/internal/lib/os/exec/exec_plan9.go @@ -0,0 +1,19 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package exec + +import "io/fs" + +// skipStdinCopyError optionally specifies a function which reports +// whether the provided stdin copy error should be ignored. +func skipStdinCopyError(err error) bool { + // Ignore hungup errors copying to stdin if the program + // completed successfully otherwise. + // See Issue 35753. + pe, ok := err.(*fs.PathError) + return ok && + pe.Op == "write" && pe.Path == "|1" && + pe.Err.Error() == "i/o on hungup channel" +} diff --git a/internal/lib/os/exec/exec_unix.go b/internal/lib/os/exec/exec_unix.go new file mode 100644 index 00000000..3ed672a7 --- /dev/null +++ b/internal/lib/os/exec/exec_unix.go @@ -0,0 +1,24 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !plan9 && !windows + +package exec + +import ( + "io/fs" + "syscall" +) + +// skipStdinCopyError optionally specifies a function which reports +// whether the provided stdin copy error should be ignored. +func skipStdinCopyError(err error) bool { + // Ignore EPIPE errors copying to stdin if the program + // completed successfully otherwise. + // See Issue 9173. + pe, ok := err.(*fs.PathError) + return ok && + pe.Op == "write" && pe.Path == "|1" && + pe.Err == syscall.EPIPE +} diff --git a/internal/lib/os/exec/exec_windows.go b/internal/lib/os/exec/exec_windows.go new file mode 100644 index 00000000..e7a2ee6c --- /dev/null +++ b/internal/lib/os/exec/exec_windows.go @@ -0,0 +1,23 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package exec + +import ( + "io/fs" + "syscall" +) + +// skipStdinCopyError optionally specifies a function which reports +// whether the provided stdin copy error should be ignored. +func skipStdinCopyError(err error) bool { + // Ignore ERROR_BROKEN_PIPE and ERROR_NO_DATA errors copying + // to stdin if the program completed successfully otherwise. + // See Issue 20445. + const _ERROR_NO_DATA = syscall.Errno(0xe8) + pe, ok := err.(*fs.PathError) + return ok && + pe.Op == "write" && pe.Path == "|1" && + (pe.Err == syscall.ERROR_BROKEN_PIPE || pe.Err == _ERROR_NO_DATA) +}