@@ -10,39 +10,38 @@ import (
10
10
"github.com/lima-vm/lima/pkg/guestagent/api"
11
11
guestagentclient "github.com/lima-vm/lima/pkg/guestagent/api/client"
12
12
"github.com/sirupsen/logrus"
13
+ "golang.org/x/sync/errgroup"
13
14
)
14
15
15
16
func HandleTCPConnection (ctx context.Context , client * guestagentclient.GuestAgentClient , conn net.Conn , guestAddr string ) {
16
17
defer conn .Close ()
17
18
18
19
id := fmt .Sprintf ("tcp-%s-%s" , conn .LocalAddr ().String (), conn .RemoteAddr ().String ())
19
- errCh := make (chan error , 2 )
20
20
21
21
stream , err := client .Tunnel (ctx )
22
22
if err != nil {
23
23
logrus .Errorf ("could not open tcp tunnel for id: %s error:%v" , id , err )
24
24
}
25
25
26
+ g , _ := errgroup .WithContext (ctx )
27
+
26
28
rw := & GrpcClientRW {stream : stream , id : id , addr : guestAddr }
27
- go func () {
29
+ g . Go ( func () error {
28
30
_ , err := io .Copy (rw , conn )
29
31
if errors .Is (err , io .EOF ) {
30
- errCh <- nil
31
- return
32
+ return nil
32
33
}
33
- errCh <- err
34
- }( )
35
- go func () {
34
+ return err
35
+ })
36
+ g . Go ( func () error {
36
37
_ , err := io .Copy (conn , rw )
37
38
if errors .Is (err , io .EOF ) {
38
- errCh <- nil
39
- return
39
+ return nil
40
40
}
41
- errCh <- err
42
- }( )
41
+ return err
42
+ })
43
43
44
- err = <- errCh
45
- if err != nil {
44
+ if err := g .Wait (); err != nil {
46
45
logrus .Debugf ("error in tcp tunnel for id: %s error:%v" , id , err )
47
46
}
48
47
}
@@ -57,19 +56,17 @@ func HandleUDPConnection(ctx context.Context, client *guestagentclient.GuestAgen
57
56
logrus .Errorf ("could not open udp tunnel for id: %s error:%v" , id , err )
58
57
}
59
58
60
- errCh := make ( chan error , 2 )
59
+ g , _ := errgroup . WithContext ( ctx )
61
60
62
- go func () {
61
+ g . Go ( func () error {
63
62
buf := make ([]byte , 65507 )
64
63
for {
65
64
n , addr , err := conn .ReadFrom (buf )
66
65
if errors .Is (err , io .EOF ) {
67
- errCh <- nil
68
- return
66
+ return nil
69
67
}
70
68
if err != nil {
71
- errCh <- err
72
- return
69
+ return err
73
70
}
74
71
msg := & api.TunnelMessage {
75
72
Id : id + "-" + addr .String (),
@@ -79,38 +76,32 @@ func HandleUDPConnection(ctx context.Context, client *guestagentclient.GuestAgen
79
76
UdpTargetAddr : addr .String (),
80
77
}
81
78
if err := stream .Send (msg ); err != nil {
82
- errCh <- err
83
- return
79
+ return err
84
80
}
85
81
}
86
- }( )
82
+ })
87
83
88
- go func () {
84
+ g . Go ( func () error {
89
85
for {
90
86
in , err := stream .Recv ()
91
87
if errors .Is (err , io .EOF ) {
92
- errCh <- nil
93
- return
88
+ return nil
94
89
}
95
90
if err != nil {
96
- errCh <- err
97
- return
91
+ return err
98
92
}
99
93
addr , err := net .ResolveUDPAddr ("udp" , in .UdpTargetAddr )
100
94
if err != nil {
101
- errCh <- err
102
- return
95
+ return err
103
96
}
104
97
_ , err = conn .WriteTo (in .Data , addr )
105
98
if err != nil {
106
- errCh <- err
107
- return
99
+ return err
108
100
}
109
101
}
110
- }( )
102
+ })
111
103
112
- err = <- errCh
113
- if err != nil {
104
+ if err := g .Wait (); err != nil {
114
105
logrus .Debugf ("error in udp tunnel for id: %s error:%v" , id , err )
115
106
}
116
107
}
0 commit comments