mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
portmapper: don't compile linux-only code on Windows
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
b9ad7b96bd
commit
4231dbca23
2 changed files with 60 additions and 60 deletions
|
|
@ -3,17 +3,11 @@ package portmapper
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/ishidawataru/sctp"
|
"github.com/ishidawataru/sctp"
|
||||||
)
|
)
|
||||||
|
|
||||||
var userlandProxyCommandName = "docker-proxy"
|
|
||||||
|
|
||||||
type userlandProxy interface {
|
type userlandProxy interface {
|
||||||
Start() error
|
Start() error
|
||||||
Stop() error
|
Stop() error
|
||||||
|
|
@ -29,60 +23,6 @@ const (
|
||||||
ipv6 ipVersion = "6"
|
ipv6 ipVersion = "6"
|
||||||
)
|
)
|
||||||
|
|
||||||
// proxyCommand wraps an exec.Cmd to run the userland TCP and UDP
|
|
||||||
// proxies as separate processes.
|
|
||||||
type proxyCommand struct {
|
|
||||||
cmd *exec.Cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *proxyCommand) Start() error {
|
|
||||||
r, w, err := os.Pipe()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("proxy unable to open os.Pipe %s", err)
|
|
||||||
}
|
|
||||||
defer r.Close()
|
|
||||||
p.cmd.ExtraFiles = []*os.File{w}
|
|
||||||
if err := p.cmd.Start(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
w.Close()
|
|
||||||
|
|
||||||
errchan := make(chan error, 1)
|
|
||||||
go func() {
|
|
||||||
buf := make([]byte, 2)
|
|
||||||
r.Read(buf)
|
|
||||||
|
|
||||||
if string(buf) != "0\n" {
|
|
||||||
errStr, err := ioutil.ReadAll(r)
|
|
||||||
if err != nil {
|
|
||||||
errchan <- fmt.Errorf("Error reading exit status from userland proxy: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
errchan <- fmt.Errorf("Error starting userland proxy: %s", errStr)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
errchan <- nil
|
|
||||||
}()
|
|
||||||
|
|
||||||
select {
|
|
||||||
case err := <-errchan:
|
|
||||||
return err
|
|
||||||
case <-time.After(16 * time.Second):
|
|
||||||
return fmt.Errorf("Timed out proxy starting the userland proxy")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *proxyCommand) Stop() error {
|
|
||||||
if p.cmd.Process != nil {
|
|
||||||
if err := p.cmd.Process.Signal(os.Interrupt); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return p.cmd.Wait()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// dummyProxy just listen on some port, it is needed to prevent accidental
|
// dummyProxy just listen on some port, it is needed to prevent accidental
|
||||||
// port allocations on bound port, because without userland proxy we using
|
// port allocations on bound port, because without userland proxy we using
|
||||||
// iptables rules and not net.Listen
|
// iptables rules and not net.Listen
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,18 @@
|
||||||
package portmapper
|
package portmapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var userlandProxyCommandName = "docker-proxy"
|
||||||
|
|
||||||
func newProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.IP, containerPort int, proxyPath string) (userlandProxy, error) {
|
func newProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.IP, containerPort int, proxyPath string) (userlandProxy, error) {
|
||||||
path := proxyPath
|
path := proxyPath
|
||||||
if proxyPath == "" {
|
if proxyPath == "" {
|
||||||
|
|
@ -36,3 +42,57 @@ func newProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// proxyCommand wraps an exec.Cmd to run the userland TCP and UDP
|
||||||
|
// proxies as separate processes.
|
||||||
|
type proxyCommand struct {
|
||||||
|
cmd *exec.Cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *proxyCommand) Start() error {
|
||||||
|
r, w, err := os.Pipe()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("proxy unable to open os.Pipe %s", err)
|
||||||
|
}
|
||||||
|
defer r.Close()
|
||||||
|
p.cmd.ExtraFiles = []*os.File{w}
|
||||||
|
if err := p.cmd.Start(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
w.Close()
|
||||||
|
|
||||||
|
errchan := make(chan error, 1)
|
||||||
|
go func() {
|
||||||
|
buf := make([]byte, 2)
|
||||||
|
r.Read(buf)
|
||||||
|
|
||||||
|
if string(buf) != "0\n" {
|
||||||
|
errStr, err := ioutil.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
errchan <- fmt.Errorf("Error reading exit status from userland proxy: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
errchan <- fmt.Errorf("Error starting userland proxy: %s", errStr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
errchan <- nil
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case err := <-errchan:
|
||||||
|
return err
|
||||||
|
case <-time.After(16 * time.Second):
|
||||||
|
return fmt.Errorf("Timed out proxy starting the userland proxy")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *proxyCommand) Stop() error {
|
||||||
|
if p.cmd.Process != nil {
|
||||||
|
if err := p.cmd.Process.Signal(os.Interrupt); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return p.cmd.Wait()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue