[swift-users] Casting function pointers
    Joe Groff 
    jgroff at apple.com
       
    Wed Jan 25 12:37:21 CST 2017
    
    
  
> On Jan 25, 2017, at 1:23 AM, Rien via swift-users <swift-users at swift.org> wrote:
> 
> I have a case where a callback has the following signature:
> 
> @convention(c) (_ ssl: OpaquePointer?, _ num: UnsafeMutablePointer<Int32>?, _ arg: UnsafeMutableRawPointer?) -> Int32
> 
> But to install this callback I have to use a c-function with this signature:
> 
> SSL_CTX_callback_ctrl (OpaquePointer!, Int32, (() -> Void)! )
> 
> Is it possible to cast the first function to the second? If so, how?
I think your best bet would be to write the shim closure yourself. Is `num` a pointer to the value you're supposed to receive from SSL_CTX_callback_ctrl? Is the `arg` really a function pointer? In that case, something like this might work:
func callback(_ ssl: OpaquePointer?, _ num: UnsafeMutablePointer<Int32>?, _ arg: UnsafeMutableRawPointer?) -> Int32
let shimCallback: SSL_CTX_callback_ctrl = { ctx, cmd, fp in
  var cmdNum = cmd
  callback(ctx, &cmdNum, unsafeBitCast(fp, to: UnsafeMutableRawPointer?.self))
}
-Joe
    
    
More information about the swift-users
mailing list