1
0

Socket+File.swift 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // Socket+File.swift
  3. // Swifter
  4. //
  5. // Created by Damian Kolakowski on 13/07/16.
  6. //
  7. import Foundation
  8. extension Socket {
  9. public func writeFile(file: File) throws -> Void {
  10. var offset: off_t = 0
  11. let result = sendfile(fileno(file.pointer), self.socketFileDescriptor, 0, &offset, nil, 0)
  12. if result == -1 {
  13. throw SocketError.WriteFailed("sendfile: " + Errno.description())
  14. }
  15. }
  16. }
  17. #if os(Linux)
  18. import Glibc
  19. struct sf_hdtr { }
  20. func sendfile(source: Int32, _ target: Int32, _: off_t, _: UnsafeMutablePointer<off_t>, _: UnsafeMutablePointer<sf_hdtr>, _: Int32) -> Int32 {
  21. var buffer = [UInt8](count: 1024, repeatedValue: 0)
  22. while true {
  23. let readResult = read(source, &buffer, buffer.count)
  24. guard readResult > 0 else {
  25. return Int32(readResult)
  26. }
  27. var writeCounter = 0
  28. while writeCounter < readResult {
  29. let writeResult = write(target, &buffer + writeCounter, readResult - writeCounter)
  30. guard writeResult > 0 else {
  31. return Int32(writeResult)
  32. }
  33. writeCounter = writeCounter + writeResult
  34. }
  35. }
  36. }
  37. public class NSLock {
  38. private var mutex = pthread_mutex_t()
  39. init() { pthread_mutex_init(&mutex, nil) }
  40. public func lock() { pthread_mutex_lock(&mutex) }
  41. public func unlock() { pthread_mutex_unlock(&mutex) }
  42. deinit { pthread_mutex_destroy(&mutex) }
  43. }
  44. let DISPATCH_QUEUE_PRIORITY_BACKGROUND = 0
  45. private class dispatch_context {
  46. let block: ((Void) -> Void)
  47. init(_ block: ((Void) -> Void)) {
  48. self.block = block
  49. }
  50. }
  51. func dispatch_get_global_queue(queueId: Int, _ arg: Int) -> Int { return 0 }
  52. func dispatch_async(queueId: Int, _ block: ((Void) -> Void)) {
  53. let unmanagedDispatchContext = Unmanaged.passRetained(dispatch_context(block))
  54. let context = UnsafeMutablePointer<Void>(unmanagedDispatchContext.toOpaque())
  55. var pthread: pthread_t = 0
  56. pthread_create(&pthread, nil, { (context: UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<Void> in
  57. let unmanaged = Unmanaged<dispatch_context>.fromOpaque(COpaquePointer(context))
  58. unmanaged.takeUnretainedValue().block()
  59. unmanaged.release()
  60. return context
  61. }, context)
  62. }
  63. #endif