Skip to content

Commit 9306aa9

Browse files
committed
Added Socket.address()
1 parent be06591 commit 9306aa9

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

Sources/Socket/System/SocketOperations.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,4 +616,27 @@ extension SocketDescriptor {
616616
system_write(self.rawValue, buffer.baseAddress, buffer.count)
617617
}
618618
}
619+
620+
@_alwaysEmitIntoClient
621+
public func address<Address: SocketAddress>(
622+
_ address: Address.Type,
623+
retryOnInterrupt: Bool = true
624+
) throws -> Address {
625+
return try _getAddress(address, retryOnInterrupt: retryOnInterrupt).get()
626+
}
627+
628+
@usableFromInline
629+
internal func _getAddress<Address: SocketAddress>(
630+
_ address: Address.Type,
631+
retryOnInterrupt: Bool
632+
) -> Result<Address, Errno> {
633+
var result: Result<CInt, Errno> = .success(0)
634+
let address = Address.withUnsafePointer { socketPointer, socketLength in
635+
var length = socketLength
636+
result = valueOrErrno(retryOnInterrupt: retryOnInterrupt) {
637+
system_getsockname(self.rawValue, socketPointer, &length)
638+
}
639+
}
640+
return result.map { _ in address }
641+
}
619642
}

Sources/Socket/System/Syscalls.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,3 +467,10 @@ internal func system_link_ntoa(_ address: UnsafePointer<sockaddr_dl>) -> UnsafeM
467467
return link_ntoa(address)
468468
}
469469
#endif
470+
471+
internal func system_getsockname(_ fd: CInt, _ address: UnsafeMutablePointer<CInterop.SocketAddress>, _ length: UnsafeMutablePointer<UInt32>) -> CInt {
472+
#if ENABLE_MOCKING
473+
if mockingEnabled { return _mock(fd, address) }
474+
#endif
475+
return getsockname(fd, address, length)
476+
}

Tests/SocketTests/SocketTests.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ final class SocketTests: XCTestCase {
4848
IPv4Protocol.tcp,
4949
bind: address
5050
)
51+
XCTAssertEqual(try server.fileDescriptor.address(IPv4SocketAddress.self), address)
5152
defer { Task { await server.close() } }
5253
NSLog("Server: Created server socket \(server.fileDescriptor)")
5354
try server.fileDescriptor.listen(backlog: 10)
@@ -58,6 +59,7 @@ final class SocketTests: XCTestCase {
5859
fileDescriptor: try await server.fileDescriptor.accept()
5960
)
6061
NSLog("Server: Got incoming connection \(newConnection.fileDescriptor)")
62+
XCTAssertEqual(try newConnection.fileDescriptor.address(IPv4SocketAddress.self).address.rawValue, "127.0.0.1")
6163
let _ = try await newConnection.write(data)
6264
NSLog("Server: Wrote outgoing data")
6365
} catch {
@@ -69,13 +71,15 @@ final class SocketTests: XCTestCase {
6971
let client = try await Socket(
7072
IPv4Protocol.tcp
7173
)
74+
XCTAssertEqual(try client.fileDescriptor.address(IPv4SocketAddress.self).address, .any)
7275
defer { Task { await client.close() } }
7376
NSLog("Client: Created client socket \(client.fileDescriptor)")
7477

7578
NSLog("Client: Will connect to server")
7679
do { try await client.fileDescriptor.connect(to: address, sleep: 100_000_000) }
7780
catch Errno.socketIsConnected { }
7881
NSLog("Client: Connected to server")
82+
XCTAssertEqual(try client.fileDescriptor.address(IPv4SocketAddress.self).address.rawValue, "127.0.0.1")
7983
let read = try await client.read(data.count)
8084
NSLog("Client: Read incoming data")
8185
XCTAssertEqual(data, read)

0 commit comments

Comments
 (0)