Files
coder/vpn/dylib/lib.go
T
Ethan ba48069325 chore: implement CoderVPN client & tunnel (#15612)
Addresses #14734.

This PR wires up `tunnel.go` to a `tailnet.Conn` via the new `/tailnet` endpoint, with all the necessary controllers such that a VPN connection can be started, stopped and inspected via the CoderVPN protocol.
2024-12-05 13:30:22 +11:00

64 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(cReadFD), uintptr(cWriteFD))
if err != nil {
unix.Close(readFD)
unix.Close(writeFD)
return ErrOpenPipe
}
_, err = vpn.NewTunnel(ctx, slog.Make(), conn, vpn.NewClient(),
vpn.UseAsDNSConfig(),
vpn.UseAsRouter(),
vpn.UseAsLogger(),
)
if err != nil {
unix.Close(readFD)
unix.Close(writeFD)
return ErrNewTunnel
}
return 0
}
func main() {}