Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 33 additions & 13 deletions FlyingSocks/Sources/SocketAddress.swift
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,23 @@ public extension SocketAddress where Self == sockaddr_un {
extension sockaddr_storage: SocketAddress, @unchecked Swift.Sendable {
public static let family = sa_family_t(AF_UNSPEC)

private var size: socklen_t {
switch Int32(family) {
case AF_INET:
socklen_t(MemoryLayout<sockaddr_in>.size)
case AF_INET6:
socklen_t(MemoryLayout<sockaddr_in6>.size)
case AF_UNIX:
socklen_t(MemoryLayout<sockaddr_un>.size)
default:
0
}
}

#if compiler(>=6.0)
public func withSockAddr<R, E: Error>(_ body: (UnsafePointer<sockaddr>, socklen_t) throws(E) -> R) throws(E) -> R {
try withUnsafeBytes(of: self) { (p) throws(E) -> R in
try body(p.baseAddress!.assumingMemoryBound(to: sockaddr.self), socklen_t(p.count))
try body(p.baseAddress!.assumingMemoryBound(to: sockaddr.self), size)
}
}

Expand All @@ -128,7 +141,7 @@ extension sockaddr_storage: SocketAddress, @unchecked Swift.Sendable {
#else
public func withSockAddr<R>(_ body: (UnsafePointer<sockaddr>, socklen_t) throws -> R) rethrows -> R {
try withUnsafeBytes(of: self) { p in
try body(p.baseAddress!.assumingMemoryBound(to: sockaddr.self), socklen_t(p.count))
try body(p.baseAddress!.assumingMemoryBound(to: sockaddr.self), size)
}
}

Expand All @@ -143,6 +156,10 @@ extension sockaddr_storage: SocketAddress, @unchecked Swift.Sendable {
extension sockaddr_in: SocketAddress, @unchecked Swift.Sendable {
public static let family = sa_family_t(AF_INET)

public static func make(from storage: sockaddr_storage) throws -> Self {
try makeAddress(from: storage)
}

#if compiler(>=6.0)
public func withSockAddr<R, E: Error>(_ body: (UnsafePointer<sockaddr>, socklen_t) throws(E) -> R) throws(E) -> R {
try withUnsafeBytes(of: self) { (p) throws(E) -> R in
Expand All @@ -162,6 +179,10 @@ extension sockaddr_in: SocketAddress, @unchecked Swift.Sendable {
extension sockaddr_in6: SocketAddress, @unchecked Swift.Sendable {
public static let family = sa_family_t(AF_INET6)

public static func make(from storage: sockaddr_storage) throws -> Self {
try makeAddress(from: storage)
}

#if compiler(>=6.0)
public func withSockAddr<R, E: Error>(_ body: (UnsafePointer<sockaddr>, socklen_t) throws(E) -> R) throws(E) -> R {
try withUnsafeBytes(of: self) { (p) throws(E) -> R in
Expand All @@ -181,6 +202,10 @@ extension sockaddr_in6: SocketAddress, @unchecked Swift.Sendable {
extension sockaddr_un: SocketAddress, @unchecked Swift.Sendable {
public static let family = sa_family_t(AF_UNIX)

public static func make(from storage: sockaddr_storage) throws -> Self {
try makeAddress(from: storage)
}

#if compiler(>=6.0)
public func withSockAddr<R, E: Error>(_ body: (UnsafePointer<sockaddr>, socklen_t) throws(E) -> R) throws(E) -> R {
try withUnsafeBytes(of: self) { (p) throws(E) -> R in
Expand All @@ -197,17 +222,12 @@ extension sockaddr_un: SocketAddress, @unchecked Swift.Sendable {

}

public extension SocketAddress {
static func make(from storage: sockaddr_storage) throws -> Self {
guard self is sockaddr_storage.Type || storage.ss_family == family else {
throw SocketError.unsupportedAddress
}
var storage = storage
return withUnsafePointer(to: &storage) {
$0.withMemoryRebound(to: Self.self, capacity: 1) {
$0.pointee
}
}
package func makeAddress<A: SocketAddress>(from storage: sockaddr_storage) throws -> A {
guard storage.ss_family == A.family else {
throw SocketError.unsupportedAddress
}
return withUnsafeBytes(of: storage) {
$0.load(as: A.self)
}
}

Expand Down
Loading