Merge pull request #24562 from hashicorp/jbardin/panicwrapped
don't call os.NewFile on unknown FDs
This commit is contained in:
commit
6da8542dc4
|
@ -10,34 +10,31 @@ import (
|
||||||
|
|
||||||
// Stdin returns the true stdin of the process.
|
// Stdin returns the true stdin of the process.
|
||||||
func Stdin() *os.File {
|
func Stdin() *os.File {
|
||||||
stdin := os.Stdin
|
stdin, _, _ := fds()
|
||||||
if panicwrap.Wrapped(nil) {
|
|
||||||
stdin = wrappedStdin
|
|
||||||
}
|
|
||||||
|
|
||||||
return stdin
|
return stdin
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stdout returns the true stdout of the process.
|
// Stdout returns the true stdout of the process.
|
||||||
func Stdout() *os.File {
|
func Stdout() *os.File {
|
||||||
stdout := os.Stdout
|
_, stdout, _ := fds()
|
||||||
if panicwrap.Wrapped(nil) {
|
|
||||||
stdout = wrappedStdout
|
|
||||||
}
|
|
||||||
|
|
||||||
return stdout
|
return stdout
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stderr returns the true stderr of the process.
|
// Stderr returns the true stderr of the process.
|
||||||
func Stderr() *os.File {
|
func Stderr() *os.File {
|
||||||
stderr := os.Stderr
|
_, _, stderr := fds()
|
||||||
if panicwrap.Wrapped(nil) {
|
|
||||||
stderr = wrappedStderr
|
|
||||||
}
|
|
||||||
|
|
||||||
return stderr
|
return stderr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fds() (stdin, stdout, stderr *os.File) {
|
||||||
|
stdin, stdout, stderr = os.Stdin, os.Stdout, os.Stderr
|
||||||
|
if panicwrap.Wrapped(nil) {
|
||||||
|
initPlatform()
|
||||||
|
stdin, stdout, stderr = wrappedStdin, wrappedStdout, wrappedStderr
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// These are the wrapped standard streams. These are setup by the
|
// These are the wrapped standard streams. These are setup by the
|
||||||
// platform specific code in initPlatform.
|
// platform specific code in initPlatform.
|
||||||
var (
|
var (
|
||||||
|
@ -45,8 +42,3 @@ var (
|
||||||
wrappedStdout *os.File
|
wrappedStdout *os.File
|
||||||
wrappedStderr *os.File
|
wrappedStderr *os.File
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
// Initialize the platform-specific code
|
|
||||||
initPlatform()
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,11 +4,18 @@ package wrappedstreams
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var initOnce sync.Once
|
||||||
|
|
||||||
func initPlatform() {
|
func initPlatform() {
|
||||||
// The standard streams are passed in via extra file descriptors.
|
// These must be initialized lazily, once it's been determined that this is
|
||||||
wrappedStdin = os.NewFile(uintptr(3), "stdin")
|
// a wrapped process.
|
||||||
wrappedStdout = os.NewFile(uintptr(4), "stdout")
|
initOnce.Do(func() {
|
||||||
wrappedStderr = os.NewFile(uintptr(5), "stderr")
|
// The standard streams are passed in via extra file descriptors.
|
||||||
|
wrappedStdin = os.NewFile(uintptr(3), "stdin")
|
||||||
|
wrappedStdout = os.NewFile(uintptr(4), "stdout")
|
||||||
|
wrappedStderr = os.NewFile(uintptr(5), "stderr")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue