@@ -15,22 +15,12 @@ actor TunnelHandle {
1515
1616 init ( dylibPath: URL ) throws ( TunnelHandleError) {
1717 guard let dylibHandle = dlopen ( dylibPath. path, RTLD_NOW | RTLD_LOCAL) else {
18- var errStr = " UNKNOWN "
19- let e = dlerror ( )
20- if e != nil {
21- errStr = String ( cString: e!)
22- }
23- throw . dylib( errStr)
18+ throw . dylib( dlerror ( ) . flatMap { String ( cString: $0) } ?? " UNKNOWN " )
2419 }
2520 self . dylibHandle = dylibHandle
2621
2722 guard let startSym = dlsym ( dylibHandle, startSymbol) else {
28- var errStr = " UNKNOWN "
29- let e = dlerror ( )
30- if e != nil {
31- errStr = String ( cString: e!)
32- }
33- throw . symbol( startSymbol, errStr)
23+ throw . symbol( startSymbol, dlerror ( ) . flatMap { String ( cString: $0) } ?? " UNKNOWN " )
3424 }
3525 let openTunnelFn = unsafeBitCast ( startSym, to: OpenTunnel . self)
3626 tunnelReadPipe = Pipe ( )
@@ -42,21 +32,42 @@ actor TunnelHandle {
4232 }
4333 }
4434
45- func close( ) throws {
46- dlclose ( dylibHandle)
35+ // This could be an isolated deinit in Swift 6.1
36+ func close( ) throws ( TunnelHandleError) {
37+ var errs : [ Error ] = [ ]
38+ if dlclose ( dylibHandle) == 0 {
39+ errs. append ( TunnelHandleError . dylib ( dlerror ( ) . flatMap { String ( cString: $0) } ?? " UNKNOWN " ) )
40+ }
41+ do {
42+ try writeHandle. close ( )
43+ } catch {
44+ errs. append ( error)
45+ }
46+ do {
47+ try readHandle. close ( )
48+ } catch {
49+ errs. append ( error)
50+ }
51+ if !errs. isEmpty {
52+ throw . close( errs)
53+ }
4754 }
4855}
4956
5057enum TunnelHandleError : Error {
5158 case dylib( String )
5259 case symbol( String , String )
5360 case openTunnel( OpenTunnelError )
61+ case pipe( any Error )
62+ case close( [ any Error ] )
5463
5564 var description : String {
5665 switch self {
66+ case let . pipe( err) : return " pipe error: \( err) "
5767 case let . dylib( d) : return d
5868 case let . symbol( symbol, message) : return " \( symbol) : \( message) "
5969 case let . openTunnel( error) : return " OpenTunnel: \( error. message) "
70+ case let . close( errs) : return " close tunnel: \( errs. map ( \. localizedDescription) . joined ( separator: " , " ) ) "
6071 }
6172 }
6273}
0 commit comments