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
Socket.swift:68
    descriptor = socket(AF_INET, sock_stream, IPPROTO_TCP)
= SOCK_STREAM 0020 0021 private let system_accept
Socket.swift:108
    let descriptor = system_accept(self.descriptor, nil, nil)
= Darwin.accept 0022 private let system_bind
Socket.swift:102
    guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {
= Darwin.bind 0023 private let system_close
Socket.swift:116
    system_close(descriptor)
= Darwin.close 0024 private let system_listen
Socket.swift:89
    if system_listen(descriptor, backlog) == -1 {
= Darwin.listen 0025 private let system_read
Socket.swift:142
    let bytes = system_read(descriptor, data.bytes, data.capacity)
= Darwin.read 0026 private let system_send
Socket.swift:130
      system_send(descriptor, bytes, Int(strlen(bytes)), flags)
= Darwin.send 0027 private let system_write
Socket.swift:136
      system_write(descriptor, bytes, Int(strlen(bytes)))
= Darwin.write 0028 private let system_shutdown
Socket.swift:120
    system_shutdown(descriptor, Int32(SHUT_RDWR))
= Darwin.shutdown 0029 private let system_select
Socket.swift:224
  let result = system_select(maxFD + 1, &readFDs, &writeFDs, &errorFDs, &timeout)
= Darwin.select 0030 private let system_pipe
Socket.swift:58
    if system_pipe(&fds) == -1 {
= Darwin.pipe 0031 #endif 0032 0033 0034 struct SocketError
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:110
      throw SocketError()
Socket.swift:144
        throw SocketError()
: ErrorType, CustomStringConvertible { 0035 let function
Socket.swift:39
    self.function = function
Socket.swift:44
    return "Socket.\(function) failed [\(number)]"
: String 0036 let number
Socket.swift:40
    self.number = errno
Socket.swift:44
    return "Socket.\(function) failed [\(number)]"
: Int32 0037 0038 init
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:110
      throw SocketError()
Socket.swift:144
        throw SocketError()
(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 socket 0050 class Socket
Arbiter.swift:15
  func socket(backlog: Int32) throws -> Socket {
Arbiter.swift:18
      let socket = try Socket()
Arbiter.swift:38
  var listeners: [Socket] = []
HTTPParser.swift:32
  let socket: Socket
HTTPParser.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:107
  func accept() throws -> Socket {
Socket.swift:112
    return Socket(descriptor: descriptor)
Socket.swift:201
func filter(sockets: [Socket], inout _ set: fd_set) -> [Socket] {
Socket.swift:201
func filter(sockets: [Socket], inout _ set: fd_set) -> [Socket] {
Socket.swift:208
func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {
Socket.swift:208
func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {
Socket.swift:208
func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {
Socket.swift:208
func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {
Socket.swift:208
func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {
Socket.swift:208
func select(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) {
SyncronousWorker.swift:13
  let listeners: [Socket]
SyncronousWorker.swift:20
  init(logger: Logger, listeners: [Socket], timeout: Int, application: RequestType -> ResponseType) {
SyncronousWorker.swift:58
  func runOne(listener: Socket) {
SyncronousWorker.swift:67
  func runMultiple(listeners: [Socket]) {
SyncronousWorker.swift:86
  func wait() -> [Socket] {
SyncronousWorker.swift:92
  func accept(listener: Socket) {
SyncronousWorker.swift:99
  func handle(client: Socket) {
SyncronousWorker.swift:123
func sendResponse(client: Socket, response: ResponseType) {
Worker.swift:13
  init(logger: Logger, listeners: [Socket], timeout: Int, application: RequestType -> ResponseType)
{ 0051 typealias Descriptor
Socket.swift:54
  let descriptor: Descriptor
Socket.swift:84
  init(descriptor: Descriptor) {
= Int32 0052 typealias Port
Socket.swift:94
  func bind(address: String, port: Port) throws {
= UInt16 0053 0054 let descriptor
Socket.swift:68
    descriptor = socket(AF_INET, sock_stream, 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 = descriptor
Socket.swift:89
    if system_listen(descriptor, backlog) == -1 {
Socket.swift:102
    guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {
Socket.swift:108
    let descriptor = system_accept(self.descriptor, nil, nil)
Socket.swift:116
    system_close(descriptor)
Socket.swift:120
    system_shutdown(descriptor, Int32(SHUT_RDWR))
Socket.swift:130
      system_send(descriptor, bytes, Int(strlen(bytes)), flags)
Socket.swift:136
      system_write(descriptor, bytes, Int(strlen(bytes)))
Socket.swift:142
    let bytes = system_read(descriptor, data.bytes, data.capacity)
Socket.swift:152
      let flags = fcntl(descriptor, F_GETFL, 0)
Socket.swift:157
      let flags = fcntl(descriptor, F_GETFL, 0)
Socket.swift:166
      let _ = fcntl(descriptor, F_SETFL, newFlags)
Socket.swift:173
      let flags = fcntl(descriptor, F_GETFL, 0)
Socket.swift:178
      let flags = fcntl(descriptor, F_GETFL, 0)
Socket.swift:187
      let _ = fcntl(descriptor, F_SETFL, newFlags)
Socket.swift:203
    fdIsSet($0.descriptor, &set)
Socket.swift:213
  reads.forEach { fdSet($0.descriptor, &readFDs) }
Socket.swift:217
  writes.forEach { fdSet($0.descriptor, &writeFDs) }
Socket.swift:221
  errors.forEach { fdSet($0.descriptor, &errorFDs) }
Socket.swift:223
  let maxFD = (reads + writes + errors).map { $0.descriptor }.reduce(0, combine: max)
: Descriptor 0055 0056 class func pipe
Signals.swift:32
    pipe = try Socket.pipe()
() 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
Arbiter.swift:18
      let socket = try Socket()
() throws { 0065 #if os(Linux) 0066 descriptor = socket(AF_INET, sock_stream, 0) 0067 #else 0068 descriptor = socket(AF_INET, sock_stream, 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
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:112
    return Socket(descriptor: descriptor)
(descriptor: Descriptor) { 0085 self.descriptor = descriptor 0086 } 0087 0088 func listen
Arbiter.swift:20
      try socket.listen(backlog)
(backlog: Int32) throws { 0089 if system_listen(descriptor, backlog) == -1 { 0090 throw SocketError() 0091 } 0092 } 0093 0094 func bind
Arbiter.swift:19
      try socket.bind(hostname, port: port)
(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 accept
SyncronousWorker.swift:93
    if let client = try? listener.accept() {
() throws -> Socket { 0108 let descriptor = system_accept(self.descriptor, nil, nil) 0109 if descriptor == -1 { 0110 throw SocketError() 0111 } 0112 return Socket(descriptor: descriptor) 0113 } 0114 0115 func close
Arbiter.swift:99
    listeners.forEach { $0.close() }
SyncronousWorker.swift:118
    client.close()
() { 0116 system_close(descriptor) 0117 } 0118 0119 func shutdown
SyncronousWorker.swift:117
    client.shutdown()
() { 0120 system_shutdown(descriptor, Int32(SHUT_RDWR)) 0121 } 0122 0123 func send
Signals.swift:42
    pipe[1].send(".")
SyncronousWorker.swift:126
  client.send("Connection: close\r\n")
SyncronousWorker.swift:144
      client.send("Content-Length: 0\r\n")
SyncronousWorker.swift:148
  client.send("\r\n")
(output: String) { 0124 output.withCString { bytes in 0125 #if os(Linux) 0126 let flags = Int32(MSG_NOSIGNAL) 0127 #else 0128 let flags = Int32(0) 0129 #endif 0130 system_send(descriptor, bytes, Int(strlen(bytes)), flags) 0131 } 0132 } 0133 0134 func write(output: String) { 0135 output.withCString { bytes in 0136 system_write(descriptor, bytes, Int(strlen(bytes))) 0137 } 0138 } 0139 0140 func read
Arbiter.swift:123
        while try signalHandler.pipe[0].read(1).count > 0 {}
HTTPParser.swift:48
      let bytes = try socket.read(nextSize)
(bytes: Int) throws -> [CChar] { 0141 let data = Data(capacity: bytes) 0142 let bytes = system_read(descriptor, data.bytes, data.capacity) 0143 guard bytes != -1 else { 0144 throw SocketError() 0145 } 0146 return Array(data.characters[0..<bytes]) 0147 } 0148 0149 /// Returns whether the socket is set to non-blocking or blocking 0150 var blocking
Signals.swift:36
      socket.blocking = false
SyncronousWorker.swift:49
    listeners.forEach { $0.blocking = false }
SyncronousWorker.swift:94
      client.blocking = true
: Bool { 0151 get { 0152 let flags = fcntl(descriptor, F_GETFL, 0) 0153 return flags & O_NONBLOCK == 0 0154 } 0155 0156 set { 0157 let flags = fcntl(descriptor, F_GETFL, 0) 0158 let newFlags: Int32 0159 0160 if newValue { 0161 newFlags = flags & ~O_NONBLOCK 0162 } else { 0163 newFlags = flags | O_NONBLOCK 0164 } 0165 0166 let _ = fcntl(descriptor, F_SETFL, newFlags) 0167 } 0168 } 0169 0170 /// Returns whether the socket is has the FD_CLOEXEC flag set 0171 var closeOnExec
Signals.swift:35
      socket.closeOnExec = true
: Bool { 0172 get { 0173 let flags = fcntl(descriptor, F_GETFL, 0) 0174 return flags & FD_CLOEXEC == 1 0175 } 0176 0177 set { 0178 let flags = fcntl(descriptor, F_GETFL, 0) 0179 let newFlags: Int32 0180 0181 if newValue { 0182 newFlags = flags ^ FD_CLOEXEC 0183 } else { 0184 newFlags = flags | FD_CLOEXEC 0185 } 0186 0187 let _ = fcntl(descriptor, F_SETFL, newFlags) 0188 } 0189 } 0190 0191 private func htons
Socket.swift:97
    addr.sin_port = in_port_t(htons(in_port_t(port)))
(value: CUnsignedShort) -> CUnsignedShort { 0192 return (value << 8) + (value >> 8) 0193 } 0194 0195 private func sockaddr_cast
Socket.swift:102
    guard system_bind(descriptor, sockaddr_cast(&addr), len) != -1 else {
(p: UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<sockaddr> { 0196 return UnsafeMutablePointer<sockaddr>(p) 0197 } 0198 } 0199 0200 0201 func filter
Socket.swift:230
      filter(reads, &readFDs),
Socket.swift:231
      filter(writes, &writeFDs),
Socket.swift:232
      filter(errors, &errorFDs)
(sockets: [Socket], inout _ set: fd_set) -> [Socket] { 0202 return sockets.filter { 0203 fdIsSet($0.descriptor, &set) 0204 } 0205 } 0206 0207 0208 func select
Arbiter.swift:119
    let (read, _, _) = select([signalHandler.pipe[0]], [], [], timeout: timeout)
SyncronousWorker.swift:88
    let (read, _, _) = select(listeners + [sharedHandler!.pipe[0]], [], [], timeout: timeout)
(reads: [Socket], _ writes: [Socket], _ errors: [Socket], timeout: timeval) -> ([Socket], [Socket], [Socket]) { 0209 var timeout = timeout 0210 0211 var readFDs = fd_set() 0212 fdZero(&readFDs) 0213 reads.forEach { fdSet($0.descriptor, &readFDs) } 0214 0215 var writeFDs = fd_set() 0216 fdZero(&writeFDs) 0217 writes.forEach { fdSet($0.descriptor, &writeFDs) } 0218 0219 var errorFDs = fd_set() 0220 fdZero(&errorFDs) 0221 errors.forEach { fdSet($0.descriptor, &errorFDs) } 0222 0223 let maxFD = (reads + writes + errors).map { $0.descriptor }.reduce(0, combine: max) 0224 let result = system_select(maxFD + 1, &readFDs, &writeFDs, &errorFDs, &timeout) 0225 0226 if result == 0 { 0227 return ([], [], []) 0228 } else if result > 0 { 0229 return ( 0230 filter(reads, &readFDs), 0231 filter(writes, &writeFDs), 0232 filter(errors, &errorFDs) 0233 ) 0234 } 0235 0236 // error 0237 return ([], [], []) 0238 } 0239