Преглед на файлове

Merge pull request #170 from xlc/fix-sendfile

fix sendfile on iOS
Damian Kołakowski преди 10 години
родител
ревизия
100817d2e0
променени са 1 файла, в които са добавени 26 реда и са изтрити 27 реда
  1. 26 27
      Sources/Socket+File.swift

+ 26 - 27
Sources/Socket+File.swift

@@ -11,40 +11,39 @@
     import Foundation
 #endif
 
+#if os(iOS) || os (Linux)
+    struct sf_hdtr { }
+    
+    private func sendfileImpl(source: Int32, _ target: Int32, _: off_t, _: UnsafeMutablePointer<off_t>, _: UnsafeMutablePointer<sf_hdtr>, _: Int32) -> Int32 {
+        var buffer = [UInt8](count: 1024, repeatedValue: 0)
+        while true {
+            let readResult = read(source, &buffer, buffer.count)
+            guard readResult > 0 else {
+                return Int32(readResult)
+            }
+            var writeCounter = 0
+            while writeCounter < readResult {
+                let writeResult = write(target, &buffer + writeCounter, readResult - writeCounter)
+                guard writeResult > 0 else {
+                    return Int32(writeResult)
+                }
+                writeCounter = writeCounter + writeResult
+            }
+        }
+    }
+#else
+    private let sendfileImpl = sendfile
+
+#endif
+
 extension Socket {
     
     public func writeFile(file: File) throws -> Void {
         var offset: off_t = 0
-        let result = sendfile(fileno(file.pointer), self.socketFileDescriptor, 0, &offset, nil, 0)
+        let result = sendfileImpl(fileno(file.pointer), self.socketFileDescriptor, 0, &offset, nil, 0)
         if result == -1 {
             throw SocketError.WriteFailed("sendfile: " + Errno.description())
         }
     }
     
 }
-
-#if os(Linux)
-    
-import Glibc
-
-struct sf_hdtr { }
-
-func sendfile(source: Int32, _ target: Int32, _: off_t, _: UnsafeMutablePointer<off_t>, _: UnsafeMutablePointer<sf_hdtr>, _: Int32) -> Int32 {
-    var buffer = [UInt8](count: 1024, repeatedValue: 0)
-    while true {
-        let readResult = read(source, &buffer, buffer.count)
-        guard readResult > 0 else {
-            return Int32(readResult)
-        }
-        var writeCounter = 0
-        while writeCounter < readResult {
-            let writeResult = write(target, &buffer + writeCounter, readResult - writeCounter)
-            guard writeResult > 0 else {
-                return Int32(writeResult)
-            }
-            writeCounter = writeCounter + writeResult
-        }
-    }
-}
-
-#endif