mirror of
https://github.com/containers/podman.git
synced 2025-06-24 19:42:56 +08:00
Complete WSL implementation, refactor a few areas
Also addresses a number of issues: - StopHostNetworking isn't plumbed, win-sshproxy leaks on hyperv - Wait api and print output doesn't work properly on Windows - API forwarding doesn't work on WSL - Terminal corruption with after start/stop on Windows - Gvproxy is forcefully killed vs gracefully quit - Switching rootful/rootless does not update /var/run/docker.sock on the guest - File already closed error on init - HyperV backend is publishing Unix sockets when it should be named pipes - User-mode networking doesn't always work - Stop state outside of lock boundaries - WSL blocks parallel machined (should be supported) [NO NEW TESTS NEEDED] Signed-off-by: Jason T. Greene <jason.greene@redhat.com>
This commit is contained in:
@ -333,11 +333,55 @@ func NewVirtualization(artifact define.Artifact, compression compression.ImageCo
|
||||
}
|
||||
}
|
||||
|
||||
func dialSocket(socket string, timeout time.Duration) (net.Conn, error) {
|
||||
scheme := "unix"
|
||||
if strings.Contains(socket, "://") {
|
||||
url, err := url.Parse(socket)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
scheme = url.Scheme
|
||||
socket = url.Path
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
||||
defer cancel()
|
||||
var dial func() (net.Conn, error)
|
||||
switch scheme {
|
||||
default:
|
||||
fallthrough
|
||||
case "unix":
|
||||
dial = func() (net.Conn, error) {
|
||||
var dialer net.Dialer
|
||||
return dialer.DialContext(ctx, "unix", socket)
|
||||
}
|
||||
case "npipe":
|
||||
dial = func() (net.Conn, error) {
|
||||
return DialNamedPipe(ctx, socket)
|
||||
}
|
||||
}
|
||||
|
||||
backoff := 500 * time.Millisecond
|
||||
for {
|
||||
conn, err := dial()
|
||||
if !errors.Is(err, os.ErrNotExist) {
|
||||
return conn, err
|
||||
}
|
||||
|
||||
select {
|
||||
case <-time.After(backoff):
|
||||
backoff *= 2
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func WaitAndPingAPI(sock string) {
|
||||
client := http.Client{
|
||||
Transport: &http.Transport{
|
||||
DialContext: func(context.Context, string, string) (net.Conn, error) {
|
||||
con, err := net.DialTimeout("unix", sock, apiUpTimeout)
|
||||
con, err := dialSocket(sock, apiUpTimeout)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
Reference in New Issue
Block a user