Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Foundation
- public final class addrinfo {
- fileprivate(set) public var ai_flags: Int32
- fileprivate(set) public var ai_family: Int32
- fileprivate(set) public var ai_socktype: Int32
- fileprivate(set) public var ai_protocol: Int32
- fileprivate(set) public var ai_addrlen: socklen_t
- fileprivate(set) public var ai_canonname: String?
- fileprivate(set) public var ai_addr: sockaddr_storage?
- fileprivate(set) public var ai_next: addrinfo?
- fileprivate init(
- ai_flags: Int32,
- ai_family: Int32,
- ai_socktype: Int32,
- ai_protocol: Int32,
- ai_addrlen: socklen_t,
- ai_canonname: String?,
- ai_addr: sockaddr_storage?,
- ai_next: addrinfo?)
- {
- self.ai_flags = ai_flags
- self.ai_family = ai_family
- self.ai_socktype = ai_socktype
- self.ai_protocol = ai_protocol
- self.ai_addrlen = ai_addrlen
- self.ai_canonname = ai_canonname
- self.ai_addr = ai_addr
- self.ai_next = ai_next
- }
- public convenience init(ai_flags: Int32, ai_family: Int32, ai_socktype: Int32, ai_protocol: Int32) {
- self.init(
- ai_flags: ai_flags,
- ai_family: ai_family,
- ai_socktype: ai_socktype,
- ai_protocol: ai_protocol,
- ai_addrlen: 0,
- ai_canonname: nil,
- ai_addr: nil,
- ai_next: nil)
- }
- }
- public func getaddrinfo(_ node: String?, _ service: String?, _ hints: addrinfo?) throws -> addrinfo? {
- if let hints = hints {
- precondition(hints.ai_addrlen == 0)
- precondition(hints.ai_canonname == nil)
- precondition(hints.ai_addr == nil)
- precondition(hints.ai_next == nil)
- }
- let err: Int32
- var res: UnsafeMutablePointer<Foundation.addrinfo>?
- if let hints = hints {
- var hints = Foundation.addrinfo(
- ai_flags: hints.ai_flags,
- ai_family: hints.ai_family,
- ai_socktype: hints.ai_socktype,
- ai_protocol: hints.ai_protocol,
- ai_addrlen: 0,
- ai_canonname: nil,
- ai_addr: nil,
- ai_next: nil)
- if let node = node {
- if let service = service {
- err = Foundation.getaddrinfo(node, service, &hints, &res)
- } else {
- err = Foundation.getaddrinfo(node, nil, &hints, &res)
- }
- } else {
- if let service = service {
- err = Foundation.getaddrinfo(nil, service, &hints, &res)
- } else {
- err = Foundation.getaddrinfo(nil, nil, &hints, &res)
- }
- }
- } else {
- if let node = node {
- if let service = service {
- err = Foundation.getaddrinfo(node, service, nil, &res)
- } else {
- err = Foundation.getaddrinfo(node, nil, nil, &res)
- }
- } else {
- if let service = service {
- err = Foundation.getaddrinfo(nil, service, nil, &res)
- } else {
- err = Foundation.getaddrinfo(nil, nil, 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? = nil
- var ai_last: addrinfo? = nil
- if let res = res {
- for res in sequence(first: res.pointee, next: { $0.ai_next?.pointee }) {
- var ai_addr: sockaddr_storage?
- if res.ai_addr != nil {
- ai_addr = sockaddr_storage()
- assert(Int(res.ai_addrlen) <= MemoryLayout.size(ofValue: ai_addr))
- memcpy(&ai_addr, res.ai_addr!, Int(res.ai_addrlen))
- }
- let ai = addrinfo(
- ai_flags: res.ai_flags,
- ai_family: res.ai_family,
- ai_socktype: res.ai_socktype,
- ai_protocol: res.ai_protocol,
- ai_addrlen: res.ai_addrlen,
- ai_canonname: res.ai_canonname == nil ? nil : String(cString: res.ai_canonname!),
- ai_addr: ai_addr,
- ai_next: nil)
- result = result ?? ai
- ai_last?.ai_next = ai
- ai_last = ai
- }
- }
- return result
- }
Advertisement
Add Comment
Please, Sign In to add comment