Skip to content

Commit 2f93592

Browse files
committed
hostagent: split pkg/freeport
Signed-off-by: Akihiro Suda <[email protected]>
1 parent 5a98e62 commit 2f93592

File tree

7 files changed

+72
-61
lines changed

7 files changed

+72
-61
lines changed

pkg/freeport/freeport.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Package freeport provides functions to find free localhost ports.
2+
package freeport
3+
4+
import (
5+
"fmt"
6+
"net"
7+
)
8+
9+
func TCP() (int, error) {
10+
lAddr0, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:0")
11+
if err != nil {
12+
return 0, err
13+
}
14+
l, err := net.ListenTCP("tcp4", lAddr0)
15+
if err != nil {
16+
return 0, err
17+
}
18+
defer l.Close()
19+
lAddr := l.Addr()
20+
lTCPAddr, ok := lAddr.(*net.TCPAddr)
21+
if !ok {
22+
return 0, fmt.Errorf("expected *net.TCPAddr, got %v", lAddr)
23+
}
24+
port := lTCPAddr.Port
25+
if port <= 0 {
26+
return 0, fmt.Errorf("unexpected port %d", port)
27+
}
28+
return port, nil
29+
}
30+
31+
func UDP() (int, error) {
32+
lAddr0, err := net.ResolveUDPAddr("udp4", "127.0.0.1:0")
33+
if err != nil {
34+
return 0, err
35+
}
36+
l, err := net.ListenUDP("udp4", lAddr0)
37+
if err != nil {
38+
return 0, err
39+
}
40+
defer l.Close()
41+
lAddr := l.LocalAddr()
42+
lUDPAddr, ok := lAddr.(*net.UDPAddr)
43+
if !ok {
44+
return 0, fmt.Errorf("expected *net.UDPAddr, got %v", lAddr)
45+
}
46+
port := lUDPAddr.Port
47+
if port <= 0 {
48+
return 0, fmt.Errorf("unexpected port %d", port)
49+
}
50+
return port, nil
51+
}

pkg/freeport/freeport_unix.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//go:build !windows
2+
3+
package freeport
4+
5+
import "errors"
6+
7+
func VSock() (int, error) {
8+
return 0, errors.New("freeport.VSock is not implemented for non-Windows hosts")
9+
}

pkg/freeport/freeport_windows.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package freeport
2+
3+
import "github.com/lima-vm/lima/pkg/windows"
4+
5+
func VSock() (int, error) {
6+
return windows.GetRandomFreeVSockPort(0, 2147483647)
7+
}

pkg/hostagent/hostagent.go

+5-48
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/lima-vm/lima/pkg/cidata"
2323
"github.com/lima-vm/lima/pkg/driver"
2424
"github.com/lima-vm/lima/pkg/driverutil"
25+
"github.com/lima-vm/lima/pkg/freeport"
2526
guestagentapi "github.com/lima-vm/lima/pkg/guestagent/api"
2627
guestagentclient "github.com/lima-vm/lima/pkg/guestagent/api/client"
2728
hostagentapi "github.com/lima-vm/lima/pkg/hostagent/api"
@@ -108,11 +109,11 @@ func New(instName string, stdout io.Writer, signalCh chan os.Signal, opts ...Opt
108109

109110
var udpDNSLocalPort, tcpDNSLocalPort int
110111
if *inst.Config.HostResolver.Enabled {
111-
udpDNSLocalPort, err = findFreeUDPLocalPort()
112+
udpDNSLocalPort, err = freeport.UDP()
112113
if err != nil {
113114
return nil, err
114115
}
115-
tcpDNSLocalPort, err = findFreeTCPLocalPort()
116+
tcpDNSLocalPort, err = freeport.TCP()
116117
if err != nil {
117118
return nil, err
118119
}
@@ -123,7 +124,7 @@ func New(instName string, stdout io.Writer, signalCh chan os.Signal, opts ...Opt
123124
if *inst.Config.VMType == limayaml.VZ {
124125
vSockPort = 2222
125126
} else if *inst.Config.VMType == limayaml.WSL2 {
126-
port, err := getFreeVSockPort()
127+
port, err := freeport.VSock()
127128
if err != nil {
128129
logrus.WithError(err).Error("failed to get free VSock port")
129130
}
@@ -252,57 +253,13 @@ func determineSSHLocalPort(confLocalPort int, instName string) (int, error) {
252253
// use hard-coded value for "default" instance, for backward compatibility
253254
return 60022, nil
254255
}
255-
sshLocalPort, err := findFreeTCPLocalPort()
256+
sshLocalPort, err := freeport.TCP()
256257
if err != nil {
257258
return 0, fmt.Errorf("failed to find a free port, try setting `ssh.localPort` manually: %w", err)
258259
}
259260
return sshLocalPort, nil
260261
}
261262

262-
func findFreeTCPLocalPort() (int, error) {
263-
lAddr0, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:0")
264-
if err != nil {
265-
return 0, err
266-
}
267-
l, err := net.ListenTCP("tcp4", lAddr0)
268-
if err != nil {
269-
return 0, err
270-
}
271-
defer l.Close()
272-
lAddr := l.Addr()
273-
lTCPAddr, ok := lAddr.(*net.TCPAddr)
274-
if !ok {
275-
return 0, fmt.Errorf("expected *net.TCPAddr, got %v", lAddr)
276-
}
277-
port := lTCPAddr.Port
278-
if port <= 0 {
279-
return 0, fmt.Errorf("unexpected port %d", port)
280-
}
281-
return port, nil
282-
}
283-
284-
func findFreeUDPLocalPort() (int, error) {
285-
lAddr0, err := net.ResolveUDPAddr("udp4", "127.0.0.1:0")
286-
if err != nil {
287-
return 0, err
288-
}
289-
l, err := net.ListenUDP("udp4", lAddr0)
290-
if err != nil {
291-
return 0, err
292-
}
293-
defer l.Close()
294-
lAddr := l.LocalAddr()
295-
lUDPAddr, ok := lAddr.(*net.UDPAddr)
296-
if !ok {
297-
return 0, fmt.Errorf("expected *net.UDPAddr, got %v", lAddr)
298-
}
299-
port := lUDPAddr.Port
300-
if port <= 0 {
301-
return 0, fmt.Errorf("unexpected port %d", port)
302-
}
303-
return port, nil
304-
}
305-
306263
func (a *HostAgent) emitEvent(_ context.Context, ev events.Event) {
307264
a.eventEncMu.Lock()
308265
defer a.eventEncMu.Unlock()

pkg/hostagent/port_darwin.go

-4
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,3 @@ func (plf *pseudoLoopbackForwarder) Close() error {
155155
_ = plf.ln.Close()
156156
return plf.onClose()
157157
}
158-
159-
func getFreeVSockPort() (int, error) {
160-
return 0, nil
161-
}

pkg/hostagent/port_others.go

-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,3 @@ import (
1111
func forwardTCP(ctx context.Context, sshConfig *ssh.SSHConfig, port int, local, remote, verb string) error {
1212
return forwardSSH(ctx, sshConfig, port, local, remote, verb, false)
1313
}
14-
15-
func getFreeVSockPort() (int, error) {
16-
return 0, nil
17-
}

pkg/hostagent/port_windows.go

-5
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,9 @@ package hostagent
33
import (
44
"context"
55

6-
"github.com/lima-vm/lima/pkg/windows"
76
"github.com/lima-vm/sshocker/pkg/ssh"
87
)
98

109
func forwardTCP(ctx context.Context, sshConfig *ssh.SSHConfig, port int, local, remote, verb string) error {
1110
return forwardSSH(ctx, sshConfig, port, local, remote, verb, false)
1211
}
13-
14-
func getFreeVSockPort() (int, error) {
15-
return windows.GetRandomFreeVSockPort(0, 2147483647)
16-
}

0 commit comments

Comments
 (0)