mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
63 lines
1.0 KiB
Go
63 lines
1.0 KiB
Go
//go:build darwin
|
|
|
|
package main
|
|
|
|
import "C"
|
|
|
|
import (
|
|
"context"
|
|
|
|
"golang.org/x/sys/unix"
|
|
|
|
"cdr.dev/slog"
|
|
|
|
"github.com/coder/coder/v2/vpn"
|
|
)
|
|
|
|
const (
|
|
ErrDupReadFD = -2
|
|
ErrDupWriteFD = -3
|
|
ErrOpenPipe = -4
|
|
ErrNewTunnel = -5
|
|
)
|
|
|
|
// OpenTunnel creates a new VPN tunnel by `dup`ing the provided 'PIPE'
|
|
// file descriptors for reading and writing.
|
|
//
|
|
//export OpenTunnel
|
|
func OpenTunnel(cReadFD, cWriteFD int32) int32 {
|
|
ctx := context.Background()
|
|
|
|
readFD, err := unix.Dup(int(cReadFD))
|
|
if err != nil {
|
|
return ErrDupReadFD
|
|
}
|
|
|
|
writeFD, err := unix.Dup(int(cWriteFD))
|
|
if err != nil {
|
|
unix.Close(readFD)
|
|
return ErrDupWriteFD
|
|
}
|
|
|
|
conn, err := vpn.NewBidirectionalPipe(uintptr(readFD), uintptr(writeFD))
|
|
if err != nil {
|
|
unix.Close(readFD)
|
|
unix.Close(writeFD)
|
|
return ErrOpenPipe
|
|
}
|
|
|
|
_, err = vpn.NewTunnel(ctx, slog.Make(), conn, vpn.NewClient(),
|
|
vpn.UseOSNetworkingStack(),
|
|
vpn.UseAsLogger(),
|
|
)
|
|
if err != nil {
|
|
unix.Close(readFD)
|
|
unix.Close(writeFD)
|
|
return ErrNewTunnel
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
func main() {}
|