From 7844883f802c9611cd30d421ce6e208fc554eb9f Mon Sep 17 00:00:00 2001 From: Han Date: Fri, 2 Oct 2015 17:13:01 -0500 Subject: [PATCH] Swift 2.0 compatible --- cowhacker/cowhacker | Bin 49652 -> 55628 bytes cowhacker/src/main.swift | 49 +++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/cowhacker/cowhacker b/cowhacker/cowhacker index 4f7adaae956901f9062fe632ec2ca337f5878753..8437f52edf255358ea153f52213b856e38a8f1c2 100755 GIT binary patch literal 55628 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 literal 49652 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 YLvWqTHOc2y?x%{8C;jaOT$3CB3;YP_9RL6T diff --git a/cowhacker/src/main.swift b/cowhacker/src/main.swift index dd9a857..99c3b75 100644 --- a/cowhacker/src/main.swift +++ b/cowhacker/src/main.swift @@ -13,7 +13,7 @@ func parseBasePath (file: NSFileHandle) -> String { let pathMaxLen = 512 let readBuffer = UnsafeMutablePointer.alloc(pathMaxLen) data.getBytes(readBuffer, range: NSMakeRange(pathOffset, pathMaxLen)) - + let buf = UnsafeMutablePointer(readBuffer) buf[pathMaxLen - 1] = 0 var str = "" @@ -24,26 +24,27 @@ func parseBasePath (file: NSFileHandle) -> String { return str } -func updateBasePath (file: NSFileHandle, newPath: String) -> Int { - if newPath.characters.count > 256 - { - print("Path too long") - return 1 +enum UpdateError : ErrorType { + case TooLong +} + +func updateBasePath (file: NSFileHandle, newPath: String) throws { + if newPath.characters.count > 256 { + print("Path too long") + throw(UpdateError.TooLong) } // Write length byte let lengthByteOffset: UInt64 = 0x13 file.seekToFileOffset(lengthByteOffset) let lengthByte = NSData(bytes: [ UInt8(newPath.characters.count) ], length: 1) file.writeData(lengthByte) - + // Write path let pathOffset: UInt64 = 0xA0 + 24 file.seekToFileOffset(pathOffset) let strData = NSMutableData(data: newPath.dataUsingEncoding(NSUTF8StringEncoding)!) strData.appendBytes([ UInt8(0) ], length: 1) file.writeData(strData) - - return 0 } // Entry point @@ -74,25 +75,23 @@ if let modeStr = String.fromCString(Process.arguments[1]) { func main () -> Int32 { if let path = String.fromCString(Process.arguments[2]) { if let file = NSFileHandle(forUpdatingAtPath: path) { - // defer { - // file.closeFile() - // } - let error: Int - if mode == Mode.Patch { - print(parseBasePath(file)) - error = updateBasePath(file, newPath:"C:\\ece391\\devel\\ece391.qcow") - } else { - if let newPath = Process.arguments.count >= 4 ? String.fromCString(Process.arguments[3]) : nil { - error = updateBasePath(file, newPath:newPath) + defer { + file.closeFile() + } + do { + if mode == Mode.Patch { + print(parseBasePath(file)) + try updateBasePath(file, newPath: "C:\\ece391\\devel\\ece391.qcow") } else { - print("Please specify new backing image path") - file.closeFile() - return 1 + if let newPath = Process.arguments.count >= 4 ? String.fromCString(Process.arguments[3]) : nil { + try updateBasePath(file, newPath: newPath) + } else { + print("Please specify new backing image path") + return 1 + } } - } - if error != 0 { + } catch { print("Error occurred") - file.closeFile() return 1 } } else {