[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