Created
October 8, 2014 14:31
-
-
Save dqminh/d7be637c97e4add173dd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 244453b367dd0f005e71f400c698fe29ad070f1b Mon Sep 17 00:00:00 2001 | |
From: "Daniel, Dao Quang Minh" <[email protected]> | |
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 <[email protected]> (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