1
0
Fork 0
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:
Sebastiaan van Stijn 2020-09-23 17:33:03 +02:00
parent b9ad7b96bd
commit 4231dbca23
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
2 changed files with 60 additions and 60 deletions

View file

@ -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

View file

@ -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
}