Skip to content

Commit 241fbbd

Browse files
committed
WIP: accept, connect, bind
1 parent 3d532f3 commit 241fbbd

File tree

2 files changed

+90
-4
lines changed

2 files changed

+90
-4
lines changed

Sources/System/Internals/Syscalls.swift

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,10 @@ internal func system_send(
147147
}
148148

149149
internal func system_recv(
150-
_ socket: Int32, _ buffer: UnsafeMutableRawPointer!, _ len: Int, _ flags: Int32
150+
_ socket: Int32,
151+
_ buffer: UnsafeMutableRawPointer!,
152+
_ len: Int,
153+
_ flags: Int32
151154
) -> Int {
152155
#if ENABLE_MOCKING
153156
if mockingEnabled { return _mockInt(socket, buffer, len, flags) }
@@ -197,12 +200,41 @@ internal func system_inet_ntop(
197200
}
198201

199202
internal func system_inet_pton(
200-
_ af: CInt,
201-
_ src: UnsafePointer<CChar>,
202-
_ dst: UnsafeMutableRawPointer
203+
_ af: CInt, _ src: UnsafePointer<CChar>, _ dst: UnsafeMutableRawPointer
203204
) -> CInt {
204205
#if ENABLE_MOCKING
205206
if mockingEnabled { return _mock(af, src, dst) }
206207
#endif
207208
return inet_pton(af, src, dst)
208209
}
210+
211+
internal func system_bind(
212+
_ socket: CInt, _ addr: UnsafePointer<sockaddr>!, _ len: socklen_t
213+
) -> CInt {
214+
#if ENABLE_MOCKING
215+
if mockingEnabled { return _mock(socket, addr, len) }
216+
#endif
217+
return bind(socket, addr, len)
218+
}
219+
220+
internal func system_connect(
221+
_ socket: CInt, _ addr: UnsafePointer<sockaddr>!, _ len: socklen_t
222+
) -> CInt {
223+
#if ENABLE_MOCKING
224+
if mockingEnabled { return _mock(socket, addr, len) }
225+
#endif
226+
return connect(socket, addr, len)
227+
}
228+
229+
internal func system_accept(
230+
_ socket: CInt,
231+
_ addr: UnsafeMutablePointer<sockaddr>!,
232+
_ len: UnsafeMutablePointer<socklen_t>!
233+
) -> CInt {
234+
#if ENABLE_MOCKING
235+
if mockingEnabled { return _mock(socket, addr, len) }
236+
#endif
237+
return accept(socket, addr, len)
238+
}
239+
240+

Sources/System/Sockets/SocketOperations.swift

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,60 @@ extension SocketDescriptor {
142142
system_recv(self.rawValue, buffer.baseAddress!, buffer.count, flags.rawValue)
143143
}
144144
}
145+
146+
/// Accept a connection on a socket
147+
///
148+
/// The corresponding C function is `accept`
149+
@_alwaysEmitIntoClient
150+
public func accept(retryOnInterrupt: Bool = true) throws -> SocketDescriptor {
151+
try _accept(retryOnInterrupt: retryOnInterrupt).get()
152+
}
153+
154+
@usableFromInline
155+
internal func _accept(
156+
retryOnInterrupt: Bool = true
157+
) -> Result<SocketDescriptor, Errno> {
158+
let fd = valueOrErrno(retryOnInterrupt: retryOnInterrupt) {
159+
system_accept(self.rawValue, nil, nil)
160+
}
161+
return fd.map { SocketDescriptor(rawValue: $0) }
162+
}
163+
164+
// TODO: acceptAndSockaddr or something that (tries to) returns the sockaddr
165+
// at least, for sockaddrs up to some sane length
166+
167+
/// Bind a name to a socket
168+
///
169+
/// The corresponding C function is `bind`
170+
@_alwaysEmitIntoClient
171+
public func bind(to address: SocketAddress) throws {
172+
try _bind(to: address).get()
173+
}
174+
175+
@usableFromInline
176+
internal func _bind(to address: SocketAddress) -> Result<(), Errno> {
177+
let success = address.withRawAddress { addr, len in
178+
system_bind(self.rawValue, addr, len)
179+
}
180+
return nothingOrErrno(success)
181+
}
182+
183+
/// Initiate a connection on a socket
184+
///
185+
/// The corresponding C function is `connect`
186+
@_alwaysEmitIntoClient
187+
public func connect(to address: SocketAddress) throws {
188+
try _connect(to: address).get()
189+
}
190+
191+
@usableFromInline
192+
internal func _connect(to address: SocketAddress) -> Result<(), Errno> {
193+
let success = address.withRawAddress { addr, len in
194+
system_connect(self.rawValue, addr, len)
195+
}
196+
return nothingOrErrno(success)
197+
}
198+
145199
}
146200

147201
// MARK: - Forward FileDescriptor methods

0 commit comments

Comments
 (0)