@@ -6,37 +6,32 @@ let startSymbol = "OpenTunnel"
66actor TunnelHandle {
77private let logger = Logger ( subsystem: " com.coder.Coder.CoderPacketTunnelProvider " , category: " tunnel-handle " )
88
9- private var openTunnelFn : OpenTunnel !
10- private var tunnelPipe : Pipe !
11- private var dylibHandle : UnsafeMutableRawPointer !
9+ private let tunnelWritePipe : Pipe
10+ private let tunnelReadPipe : Pipe
11+ private let dylibHandle : UnsafeMutableRawPointer
12+
13+ var writeFD : Int32 { tunnelReadPipe. fileHandleForWriting. fileDescriptor}
14+ var readFD : Int32 { tunnelWritePipe. fileHandleForReading. fileDescriptor}
1215
1316init ( dylibPath: URL ) throws ( TunnelHandleError) {
1417 dylibHandle= dlopen ( dylibPath. path, RTLD_NOW | RTLD_LOCAL)
1518
16- guard dylibHandle!= nil else {
17- var errStr = " UNKNOWN "
18- let e = dlerror ( )
19- if e!= nil {
20- errStr= String ( cString: e!)
21- }
22- throw TunnelHandleError . dylib ( errStr)
23- }
24-
2519let startSym = dlsym ( dylibHandle, startSymbol)
2620guard startSym!= nil else {
2721var errStr = " UNKNOWN "
2822let e = dlerror ( )
2923if e!= nil {
3024 errStr= String ( cString: e!)
3125}
32- throw TunnelHandleError . symbol ( startSymbol, errStr)
26+ throw . symbol( startSymbol, errStr)
3327}
34- openTunnelFn= unsafeBitCast ( startSym, to: OpenTunnel . self)
35- tunnelPipe= Pipe ( )
36- let res = openTunnelFn ( tunnelPipe. fileHandleForReading. fileDescriptor,
37- tunnelPipe. fileHandleForWriting. fileDescriptor)
28+ let openTunnelFn = unsafeBitCast ( startSym, to: OpenTunnel . self)
29+ tunnelReadPipe= Pipe ( )
30+ tunnelWritePipe= Pipe ( )
31+ let res = openTunnelFn ( tunnelReadPipe. fileHandleForReading. fileDescriptor,
32+ tunnelWritePipe. fileHandleForWriting. fileDescriptor)
3833guard res== 0 else {
39- throw TunnelHandleError . openTunnel ( OpenTunnelError ( rawValue: res) ?? . unknown)
34+ throw . openTunnel( OpenTunnelError ( rawValue: res) ?? . unknown)
4035}
4136}
4237
@@ -46,13 +41,11 @@ actor TunnelHandle {
4641}
4742
4843enum TunnelHandleError : Error {
49- case dylib( String )
5044case symbol( String , String )
5145case openTunnel( OpenTunnelError )
5246
5347var description : String {
5448switch self {
55- case let . dylib( d) : return d
5649case let . symbol( symbol, message) : return " \( symbol) : \( message) "
5750case let . openTunnel( error) : return " OpenTunnel: \( error. message) "
5851}