Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dqminh/d7be637c97e4add173dd to your computer and use it in GitHub Desktop.
Save dqminh/d7be637c97e4add173dd to your computer and use it in GitHub Desktop.
From 244453b367dd0f005e71f400c698fe29ad070f1b Mon Sep 17 00:00:00 2001
From: "Daniel, Dao Quang Minh" <dqminh89@gmail.com>
Date: Wed, 8 Oct 2014 10:27:55 -0400
Subject: [PATCH] pass extra file to child process as status handler
instead of using stdout/stderr as the status handler, we pass an extra file to
the child process and write `0\n` or `1\nerror message` to it and close it
after. This allow the child process to handle stdout/stderr as normal.
Docker-DCO-1.1-Signed-off-by: Daniel, Dao Quang Minh <dqminh89@gmail.com> (github: dqminh)
---
daemon/networkdriver/portmapper/proxy.go | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/daemon/networkdriver/portmapper/proxy.go b/daemon/networkdriver/portmapper/proxy.go
index 404d461..c66effb 100644
--- a/daemon/networkdriver/portmapper/proxy.go
+++ b/daemon/networkdriver/portmapper/proxy.go
@@ -36,17 +36,18 @@ type proxyCommand struct {
// execProxy is the reexec function that is registered to start the userland proxies
func execProxy() {
- log.SetOutput(ioutil.Discard)
+ f := os.NewFile(3, "signal-parent")
host, container := parseHostContainerAddrs()
p, err := proxy.NewProxy(host, container)
if err != nil {
- os.Stdout.WriteString("1\n")
- fmt.Fprint(os.Stderr, err)
+ fmt.Fprintf(f, "1\n%s", err)
+ f.Close()
os.Exit(1)
}
go handleStopSignals(p)
- os.Stdout.WriteString("0\n")
+ fmt.Fprint(f, "0\n")
+ f.Close()
// Run will block until the proxy stops
p.Run()
@@ -112,16 +113,11 @@ func NewProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.
}
func (p *proxyCommand) Start() error {
- stdout, err := p.cmd.StdoutPipe()
+ r, w, err := os.Pipe()
if err != nil {
- return err
- }
- defer stdout.Close()
- stderr, err := p.cmd.StderrPipe()
- if err != nil {
- return err
+ return fmt.Errorf("proxy unable to open os.Pipe %s", err)
}
- defer stderr.Close()
+ p.cmd.ExtraFiles = []*os.File{w}
if err := p.cmd.Start(); err != nil {
return err
}
@@ -129,10 +125,10 @@ func (p *proxyCommand) Start() error {
errchan := make(chan error, 1)
go func() {
buf := make([]byte, 2)
- stdout.Read(buf)
+ r.Read(buf)
if string(buf) != "0\n" {
- errStr, _ := ioutil.ReadAll(stderr)
+ errStr, _ := ioutil.ReadAll(r)
errchan <- fmt.Errorf("Error starting userland proxy: %s", errStr)
return
}
--
1.8.5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment