/
local.go
50 lines (42 loc) · 1.42 KB
/
local.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package local
import (
"context"
"net"
"os"
"strings"
"github.com/wzshiming/bridge"
"github.com/wzshiming/bridge/internal/wrapping"
"github.com/wzshiming/commandproxy"
)
var LOCAL = &Local{
Dialer: &net.Dialer{},
ListenConfig: &net.ListenConfig{},
LocalAddr: wrapping.NewNetAddr("local", "local"),
}
type Local struct {
Dialer bridge.Dialer
ListenConfig bridge.ListenConfig
LocalAddr net.Addr
}
func (l *Local) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
return l.Dialer.DialContext(ctx, network, address)
}
func (l *Local) Listen(ctx context.Context, network, address string) (net.Listener, error) {
return l.ListenConfig.Listen(ctx, network, address)
}
func (l *Local) CommandDialContext(ctx context.Context, name string, args ...string) (net.Conn, error) {
proxy := commandproxy.ProxyCommand(ctx, name, args...)
proxy.Stderr = os.Stderr
conn, err := proxy.Stdio()
if err != nil {
return nil, err
}
remoteAddr := wrapping.NewNetAddr("cmd", strings.Join(append([]string{name}, args...), " "))
conn = wrapping.ConnWithAddr(conn, l.LocalAddr, remoteAddr)
return conn, nil
}
func (l *Local) CommandListen(ctx context.Context, name string, args ...string) (net.Listener, error) {
proxy := append([]string{name}, args...)
remoteAddr := wrapping.NewNetAddr("cmd", strings.Join(proxy, " "))
return wrapping.NewCommandListener(ctx, l, l.LocalAddr, remoteAddr, proxy)
}