Got an answer here:
http://stackoverflow.com/questions/39857435/swift-getaddrinfo

Current version:
http://pastebin.com/y7nDATSH


On 4 Oct 2016, at 19:30, Etan Kissling via swift-users 
<[email protected]<mailto:[email protected]>> wrote:

Yup (BTW I'm fine with the "ai_next" item becoming useless in the copies. I 
just want to copy out the other parts in a way that gets copied reliably)

On 4 Oct 2016, at 19:26, Mike Ferenduros via swift-users 
<[email protected]<mailto:[email protected]>> wrote:

Ach, apologies - I forgot that addrinfo contains pointers. Ignore what I said :)

On Tuesday, October 4, 2016, Mike Ferenduros 
<[email protected]<mailto:[email protected]>> wrote:
Swift won't mess with memory it does't own, and memory the addrinfo list falls 
into that category.

The addrinfo you're accessing through pointee  is a struct which means that 
when you assign it somewhere you get a *copy* of the thing pointed to. Swift 
owns that copy and will manage it properly, and leave the original alone.

Fwiw, this is the wrapper I'm using for sockets right now:
https://github.com/mike-ferenduros/SwiftySockets


On Tuesday, October 4, 2016, Etan Kissling via swift-users 
<[email protected]<javascript:_e(%7B%7D,'cvml','[email protected]');>> 
wrote:
POSIX getaddrinfo allocates memory that must later be freed using freeaddrinfo.
See http://manpages.ubuntu.com/manpages/xenial/en/man3/getaddrinfo.3.html

To simplify the API, I've created this function:

        import Foundation

        enum SystemError: Swift.Error {
            case getaddrinfo(Int32, Int32?)
        }

        public func getaddrinfo(node: String?, service: String?, hints: 
addrinfo?) throws -> [addrinfo] {
            var err: Int32
            var res: UnsafeMutablePointer<addrinfo>?
            if var hints = hints {
                err = getaddrinfo(node, service, &hints, &res)
            } else {
                err = getaddrinfo(node, service, nil, &res)
            }
            if err == EAI_SYSTEM {
                throw SystemError.getaddrinfo(err, errno)
            }
            if err != 0 {
                throw SystemError.getaddrinfo(err, nil)
            }
            defer {
                freeaddrinfo(res)
            }
            var result = [addrinfo]()
            var ai = res?.pointee
            while ai != nil {
                result.append(ai!)
                ai = ai!.ai_next?.pointee
            }
            return result
        }

I don't feel that the function is correct, though.

• How can the Swift memory model know that getaddrinfo allocates memory, and 
that Swift should not overwrite that memory with own stuff?
• How can Swift know that freeaddrinfo deletes the whole list, and that it 
should copy out ai information that has been assigned to the result array?

What's the correct way to interface with getaddrinfo?

Thanks

Etan


_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]<mailto:[email protected]>
https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
[email protected]<mailto:[email protected]>
https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to