0001 #if os(Linux) 0002 import Glibc 0003 0004 private let sock_stream = Int32(SOCK_STREAM.rawValue) 0005 0006 private let system_accept = Glibc.accept 0007 private let system_bind = Glibc.bind 0008 private let system_close = Glibc.close 0009 private let system_listen = Glibc.listen 0010 private let system_read = Glibc.read 0011 private let system_send = Glibc.send 0012 private let system_write = Glibc.write 0013 private let system_shutdown = Glibc.shutdown 0014 private let system_select = Glibc.select 0015 private let system_pipe = Glibc.pipe 0016 #else 0017 import Darwin.C 0018 0019 private let sock_stream= SOCK_STREAM 0020 0021 private let system_accept
Socket.swift:68 descriptor = socket(family, sock_stream, family == AF_UNIX ? 0 : IPPROTO_TCP)= Darwin.accept 0022 private let system_bind
Socket.swift:136 let descriptor = system_accept(self.descriptor, nil, nil)= Darwin.bind 0023 private let system_close
Socket.swift:102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {Socket.swift:130 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {= Darwin.close 0024 private let system_listen
Socket.swift:144 system_close(descriptor)= Darwin.listen 0025 private let system_read
Socket.swift:89 if system_listen(descriptor, backlog) == -1 {= Darwin.read 0026 private let system_send
Socket.swift:170 let bytes = system_read(descriptor, data.bytes, data.capacity)= Darwin.send 0027 private let system_write
Socket.swift:158 system_send(descriptor, bytes, Int(strlen(bytes)), flags)= Darwin.write 0028 private let system_shutdown
Socket.swift:164 system_write(descriptor, bytes, Int(strlen(bytes)))= Darwin.shutdown 0029 private let system_select
Socket.swift:148 system_shutdown(descriptor, Int32(SHUT_RDWR))= Darwin.select 0030 private let system_pipe
Socket.swift:252 let result = system_select(maxFD + 1, &readFDs, &writeFDs, &errorFDs, &timeout)= Darwin.pipe 0031 #endif 0032 0033 0034 struct SocketError
Socket.swift:58 if system_pipe(&fds) == -1 {: ErrorType, CustomStringConvertible { 0035 let function
Socket.swift:59 throw SocketError()Socket.swift:74 throw SocketError(function: "setsockopt()")Socket.swift:79 throw SocketError(function: "setsockopt()")Socket.swift:90 throw SocketError()Socket.swift:103 throw SocketError()Socket.swift:114 throw SocketError()Socket.swift:131 throw SocketError()Socket.swift:138 throw SocketError()Socket.swift:172 throw SocketError(): String 0036 let number
Socket.swift:39 self.function = functionSocket.swift:44 return "Socket.\(function) failed [\(number)]": Int32 0037 0038 init
Socket.swift:40 self.number = errnoSocket.swift:44 return "Socket.\(function) failed [\(number)]"(function: String = __FUNCTION__) { 0039 self.function = function 0040 self.number = errno 0041 } 0042 0043 var description: String { 0044 return "Socket.\(function) failed [\(number)]" 0045 } 0046 } 0047 0048 0049 /// Represents a TCP AF_INET/AF_UNIX socket 0050 public final class Socket
Socket.swift:59 throw SocketError()Socket.swift:74 throw SocketError(function: "setsockopt()")Socket.swift:79 throw SocketError(function: "setsockopt()")Socket.swift:90 throw SocketError()Socket.swift:103 throw SocketError()Socket.swift:114 throw SocketError()Socket.swift:131 throw SocketError()Socket.swift:138 throw SocketError()Socket.swift:172 throw SocketError(){ 0051 typealias Descriptor
Arbiter.swift:16 func socket(backlog: Int32) throws -> Socket {Arbiter.swift:19 let socket = try Socket()Arbiter.swift:28 let socket = try Socket(family: AF_UNIX)Arbiter.swift:51 var listeners: [Socket] = []HTTPParser.swift:32 let socket: SocketHTTPParser.swift:34 init(socket: Socket) {Signals.swift:28 var pipe: [Socket]Signals.swift:32 pipe = try Socket.pipe()Socket.swift:56 class func pipe() throws -> [Socket] {Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:135 func accept() throws -> Socket {Socket.swift:140 return Socket(descriptor: descriptor)Socket.swift:229 func filter(sockets: [Socket], inout _ set: fd_set) -> [Socket] {Socket.swift:229 func filter(sockets: [Socket], inout _ set: fd_set) -> [Socket] {Socket.swift:236 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:236 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:236 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:236 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:236 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {Socket.swift:236 func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {SynchronousWorker.swift:14 let listeners: [Socket]SynchronousWorker.swift:26 public init(configuration: Configuration, logger: Logger, listeners: [Socket], notify: Void -> Void, application: Application) {SynchronousWorker.swift:73 func runOne(listener: Socket) {SynchronousWorker.swift:87 func runMultiple(listeners: [Socket]) {SynchronousWorker.swift:114 func wait() -> [Socket] {SynchronousWorker.swift:127 func accept(listener: Socket) {SynchronousWorker.swift:134 func handle(client: Socket) {SynchronousWorker.swift:158 func sendResponse(client: Socket, response: ResponseType) {Worker.swift:25 init(configuration: Configuration, logger: Logger, listeners: [Socket], notify: Void -> Void, application: Application)= Int32 0052 typealias Port
Socket.swift:54 let descriptor: DescriptorSocket.swift:84 init(descriptor: Descriptor) {= UInt16 0053 0054 let descriptor
Socket.swift:94 func bind(address: String, port: Port) throws {: Descriptor 0055 0056 class func pipe
Socket.swift:68 descriptor = socket(family, sock_stream, family == AF_UNIX ? 0 : IPPROTO_TCP)Socket.swift:70 assert(descriptor > 0)Socket.swift:73 guard setsockopt(descriptor, SOL_SOCKET, SO_REUSEADDR, &value, socklen_t(sizeof(Int32))) != -1 else {Socket.swift:78 guard setsockopt(descriptor, SOL_SOCKET, SO_NOSIGPIPE, &value, socklen_t(sizeof(Int32))) != -1 else {Socket.swift:85 self.descriptor = descriptorSocket.swift:89 if system_listen(descriptor, backlog) == -1 {Socket.swift:102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {Socket.swift:130 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {Socket.swift:136 let descriptor = system_accept(self.descriptor, nil, nil)Socket.swift:144 system_close(descriptor)Socket.swift:148 system_shutdown(descriptor, Int32(SHUT_RDWR))Socket.swift:158 system_send(descriptor, bytes, Int(strlen(bytes)), flags)Socket.swift:164 system_write(descriptor, bytes, Int(strlen(bytes)))Socket.swift:170 let bytes = system_read(descriptor, data.bytes, data.capacity)Socket.swift:180 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:185 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:194 let _ = fcntl(descriptor, F_SETFL, newFlags)Socket.swift:201 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:206 let flags = fcntl(descriptor, F_GETFL, 0)Socket.swift:215 let _ = fcntl(descriptor, F_SETFL, newFlags)Socket.swift:231 fdIsSet($0.descriptor, &set)Socket.swift:241 reads.forEach { fdSet($0.descriptor, &readFDs) }Socket.swift:245 writes.forEach { fdSet($0.descriptor, &writeFDs) }Socket.swift:249 errors.forEach { fdSet($0.descriptor, &errorFDs) }Socket.swift:251 let maxFD = (reads + writes + errors).map { $0.descriptor }.reduce(0, combine: max)SynchronousWorker.swift:93 $0.descriptor != sharedHandler!.pipe[0].descriptorSynchronousWorker.swift:93 $0.descriptor != sharedHandler!.pipe[0].descriptor() throws -> [Socket] { 0057 var fds: [Int32] = [0, 0] 0058 if system_pipe(&fds) == -1 { 0059 throw SocketError() 0060 } 0061 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])] 0062 } 0063 0064 init
Signals.swift:32 pipe = try Socket.pipe()(family: Int32 = AF_INET) throws { 0065 #if os(Linux) 0066 descriptor = socket(family, sock_stream, 0) 0067 #else 0068 descriptor = socket(family, sock_stream, family == AF_UNIX ? 0 : IPPROTO_TCP) 0069 #endif 0070 assert(descriptor > 0) 0071 0072 var value: Int32 = 1; 0073 guard setsockopt(descriptor, SOL_SOCKET, SO_REUSEADDR, &value, socklen_t(sizeof(Int32))) != -1 else { 0074 throw SocketError(function: "setsockopt()") 0075 } 0076 0077 #if !os(Linux) 0078 guard setsockopt(descriptor, SOL_SOCKET, SO_NOSIGPIPE, &value, socklen_t(sizeof(Int32))) != -1 else { 0079 throw SocketError(function: "setsockopt()") 0080 } 0081 #endif 0082 } 0083 0084 init
Arbiter.swift:19 let socket = try Socket()Arbiter.swift:28 let socket = try Socket(family: AF_UNIX)(descriptor: Descriptor) { 0085 self.descriptor = descriptor 0086 } 0087 0088 func listen
Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:61 return [Socket(descriptor: fds[0]), Socket(descriptor: fds[1])]Socket.swift:140 return Socket(descriptor: descriptor)(backlog: Int32) throws { 0089 if system_listen(descriptor, backlog) == -1 { 0090 throw SocketError() 0091 } 0092 } 0093 0094 func bind
Arbiter.swift:21 try socket.listen(backlog)Arbiter.swift:30 try socket.listen(backlog)(address: String, port: Port) throws { 0095 var addr = sockaddr_in() 0096 addr.sin_family = sa_family_t(AF_INET) 0097 addr.sin_port = in_port_t(htons(in_port_t(port))) 0098 addr.sin_addr = in_addr(s_addr: address.withCString { inet_addr($0) }) 0099 addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0) 0100 0101 let len = socklen_t(UInt8(sizeof(sockaddr_in))) 0102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else { 0103 throw SocketError() 0104 } 0105 } 0106 0107 func bind
Arbiter.swift:20 try socket.bind(hostname, port: port)(path: String) throws { 0108 var addr = sockaddr_un() 0109 addr.sun_family = sa_family_t(AF_UNIX) 0110 0111 let lengthOfPath = path.withCString { Int(strlen($0)) } 0112 0113 guard lengthOfPath < sizeofValue(addr.sun_path) else { 0114 throw SocketError() 0115 } 0116 0117 withUnsafeMutablePointer(&addr.sun_path.0) { ptr in 0118 path.withCString { 0119 strncpy(ptr, $0, lengthOfPath) 0120 } 0121 } 0122 0123 #if os(Linux) 0124 let len = socklen_t(UInt8(sizeof(sockaddr_un))) 0125 #else 0126 addr.sun_len = UInt8(sizeof(sockaddr_un) - sizeofValue(addr.sun_path) + lengthOfPath) 0127 let len = socklen_t(addr.sun_len) 0128 #endif 0129 0130 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else { 0131 throw SocketError() 0132 } 0133 } 0134 0135 func accept
Arbiter.swift:29 try socket.bind(path)() throws -> Socket { 0136 let descriptor = system_accept(self.descriptor, nil, nil) 0137 if descriptor == -1 { 0138 throw SocketError() 0139 } 0140 return Socket(descriptor: descriptor) 0141 } 0142 0143 func close
SynchronousWorker.swift:128 if let client = try? listener.accept() {() { 0144 system_close(descriptor) 0145 } 0146 0147 func shutdown
Arbiter.swift:108 listeners.forEach { $0.close() }SynchronousWorker.swift:153 client.close()() { 0148 system_shutdown(descriptor, Int32(SHUT_RDWR)) 0149 } 0150 0151 func send
SynchronousWorker.swift:152 client.shutdown()(output: String) { 0152 output.withCString { bytes in 0153 #if os(Linux) 0154 let flags = Int32(MSG_NOSIGNAL) 0155 #else 0156 let flags = Int32(0) 0157 #endif 0158 system_send(descriptor, bytes, Int(strlen(bytes)), flags) 0159 } 0160 } 0161 0162 func write(output: String) { 0163 output.withCString { bytes in 0164 system_write(descriptor, bytes, Int(strlen(bytes))) 0165 } 0166 } 0167 0168 func read
Signals.swift:42 pipe[1].send(".")SynchronousWorker.swift:161 client.send("Connection: close\r\n")SynchronousWorker.swift:178 client.send("Content-Length: 0\r\n")SynchronousWorker.swift:182 client.send("\r\n")(bytes: Int) throws -> [CChar] { 0169 let data = Data(capacity: bytes) 0170 let bytes = system_read(descriptor, data.bytes, data.capacity) 0171 guard bytes != -1 else { 0172 throw SocketError() 0173 } 0174 return Array(data.characters[0..<bytes]) 0175 } 0176 0177 /// Returns whether the socket is set to non-blocking or blocking 0178 var blocking
Arbiter.swift:139 while try signalHandler.pipe[0].read(1).count > 0 {}HTTPParser.swift:48 let bytes = try socket.read(nextSize): Bool { 0179 get { 0180 let flags = fcntl(descriptor, F_GETFL, 0) 0181 return flags & O_NONBLOCK == 0 0182 } 0183 0184 set { 0185 let flags = fcntl(descriptor, F_GETFL, 0) 0186 let newFlags: Int32 0187 0188 if newValue { 0189 newFlags = flags & ~O_NONBLOCK 0190 } else { 0191 newFlags = flags | O_NONBLOCK 0192 } 0193 0194 let _ = fcntl(descriptor, F_SETFL, newFlags) 0195 } 0196 } 0197 0198 /// Returns whether the socket is has the FD_CLOEXEC flag set 0199 var closeOnExec
Signals.swift:36 socket.blocking = falseSynchronousWorker.swift:55 listeners.forEach { $0.blocking = false }SynchronousWorker.swift:129 client.blocking = true: Bool { 0200 get { 0201 let flags = fcntl(descriptor, F_GETFL, 0) 0202 return flags & FD_CLOEXEC == 1 0203 } 0204 0205 set { 0206 let flags = fcntl(descriptor, F_GETFL, 0) 0207 let newFlags: Int32 0208 0209 if newValue { 0210 newFlags = flags ^ FD_CLOEXEC 0211 } else { 0212 newFlags = flags | FD_CLOEXEC 0213 } 0214 0215 let _ = fcntl(descriptor, F_SETFL, newFlags) 0216 } 0217 } 0218 0219 private func htons
Signals.swift:35 socket.closeOnExec = true(value: CUnsignedShort) -> CUnsignedShort { 0220 return (value << 8) + (value >> 8) 0221 } 0222 0223 private func sockaddr_cast
Socket.swift:97 addr.sin_port = in_port_t(htons(in_port_t(port)))(p: UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<sockaddr> { 0224 return UnsafeMutablePointer<sockaddr>(p) 0225 } 0226 } 0227 0228 0229 func filter
Socket.swift:102 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {Socket.swift:130 guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {(sockets: [Socket], inout _ set: fd_set) -> [Socket] { 0230 return sockets.filter { 0231 fdIsSet($0.descriptor, &set) 0232 } 0233 } 0234 0235 0236 func select
Socket.swift:258 filter(reads, &readFDs),Socket.swift:259 filter(writes, &writeFDs),Socket.swift:260 filter(errors, &errorFDs)(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) { 0237 var timeout = timeout 0238 0239 var readFDs = fd_set() 0240 fdZero(&readFDs) 0241 reads.forEach { fdSet($0.descriptor, &readFDs) } 0242 0243 var writeFDs = fd_set() 0244 fdZero(&writeFDs) 0245 writes.forEach { fdSet($0.descriptor, &writeFDs) } 0246 0247 var errorFDs = fd_set() 0248 fdZero(&errorFDs) 0249 errors.forEach { fdSet($0.descriptor, &errorFDs) } 0250 0251 let maxFD = (reads + writes + errors).map { $0.descriptor }.reduce(0, combine: max) 0252 let result = system_select(maxFD + 1, &readFDs, &writeFDs, &errorFDs, &timeout) 0253 0254 if result == 0 { 0255 return ([], [], []) 0256 } else if result > 0 { 0257 return ( 0258 filter(reads, &readFDs), 0259 filter(writes, &writeFDs), 0260 filter(errors, &errorFDs) 0261 ) 0262 } 0263 0264 // error 0265 return ([], [], []) 0266 } 0267
Arbiter.swift:135 let (read, _, _) = select([signalHandler.pipe[0]], [], [], timeout: timeout)SynchronousWorker.swift:123 let (read, _, _) = select(listeners + [sharedHandler!.pipe[0]], [], [], timeout: timeout)