Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/freeport/freeport.go
2601 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
// Package freeport provides functions to find free localhost ports.
5
package freeport
6
7
import (
8
"fmt"
9
"net"
10
)
11
12
func TCP() (int, error) {
13
lAddr0, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:0")
14
if err != nil {
15
return 0, err
16
}
17
l, err := net.ListenTCP("tcp4", lAddr0)
18
if err != nil {
19
return 0, err
20
}
21
defer l.Close()
22
lAddr := l.Addr()
23
lTCPAddr, ok := lAddr.(*net.TCPAddr)
24
if !ok {
25
return 0, fmt.Errorf("expected *net.TCPAddr, got %v", lAddr)
26
}
27
port := lTCPAddr.Port
28
if port <= 0 {
29
return 0, fmt.Errorf("unexpected port %d", port)
30
}
31
return port, nil
32
}
33
34
func UDP() (int, error) {
35
lAddr0, err := net.ResolveUDPAddr("udp4", "127.0.0.1:0")
36
if err != nil {
37
return 0, err
38
}
39
l, err := net.ListenUDP("udp4", lAddr0)
40
if err != nil {
41
return 0, err
42
}
43
defer l.Close()
44
lAddr := l.LocalAddr()
45
lUDPAddr, ok := lAddr.(*net.UDPAddr)
46
if !ok {
47
return 0, fmt.Errorf("expected *net.UDPAddr, got %v", lAddr)
48
}
49
port := lUDPAddr.Port
50
if port <= 0 {
51
return 0, fmt.Errorf("unexpected port %d", port)
52
}
53
return port, nil
54
}
55
56