Skip to content

Commit 7a1d74a

Browse files
committed
hostagent: split pkg/freeport
Signed-off-by: Akihiro Suda <[email protected]>
1 parent d750162 commit 7a1d74a

File tree

7 files changed

+72
-61
lines changed

7 files changed

+72
-61
lines changed

pkg/freeport/freeport.go

Lines changed: 51 additions & 0 deletions
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

Lines changed: 9 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 5 additions & 48 deletions
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
}
@@ -250,57 +251,13 @@ func determineSSHLocalPort(confLocalPort int, instName string) (int, error) {
250251
// use hard-coded value for "default" instance, for backward compatibility
251252
return 60022, nil
252253
}
253-
sshLocalPort, err := findFreeTCPLocalPort()
254+
sshLocalPort, err := freeport.TCP()
254255
if err != nil {
255256
return 0, fmt.Errorf("failed to find a free port, try setting `ssh.localPort` manually: %w", err)
256257
}
257258
return sshLocalPort, nil
258259
}
259260

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

pkg/hostagent/port_darwin.go

Lines changed: 0 additions & 4 deletions
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

Lines changed: 0 additions & 4 deletions
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

Lines changed: 0 additions & 5 deletions
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)