[swift-users] C vararg: Swift Package Manager and System Modules

Daniel Eggert danieleggert at me.com
Fri Dec 18 03:52:05 CST 2015


> On 17 Dec 2015, at 22:47, Daniel Eggert via swift-users <swift-users at swift.org> wrote:
> 
> If I need access to the C fcntl(2):
> 
>  int fcntl(int, int, ...)
> 
> can I get the swift-package-manager or swift-build-tool to compile C code that wraps this into a non-vararg version:
> 
>  int SocketHelper_fcntl_setFlags(int const fildes, int const flags)
>  {
>    return fcntl(fildes, F_SETFL, flags);
>  }
> 
>  int SocketHelper_fcntl_getFlags(int const fildes)
>  {
>    return fcntl(fildes, F_GETFL);
>  }
> 
> ?

I solved it like this:

typealias fcntlType = @convention(c) (CInt, CInt, CInt) -> (CInt)
let fcntlAddr = dlsym(UnsafeMutablePointer<Void>(bitPattern: Int(-2)), "fcntl")
let fcntlType: myFcntl = unsafeBitCast(fcntlAddr, fcntlType.self)

which admittedly is a bit tacky, but it works for now.

/Daniel



More information about the swift-users mailing list