Clover.app v1.05 Beta

Added Serbian translation by  crusher and Indonesian bu Badruzeus.
Changing boot1 boot sectors installation to use boo1-intsall only.
Rework on how the nvram get dumped for CloverEFI.
This commit is contained in:
vectorsigma72 2019-11-17 18:06:44 +01:00
parent 3c176ec6ba
commit 66f30d4dc0
22 changed files with 2239 additions and 375 deletions

View File

@ -13,6 +13,8 @@
953BC20323720C0A0039755D /* FixedWidthViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953BC20223720C0A0039755D /* FixedWidthViews.swift */; };
9542ABC02373783400DC03E6 /* boot1-install in Copy tools */ = {isa = PBXBuildFile; fileRef = 9542ABBD2373780C00DC03E6 /* boot1-install */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
9542ABC22373786700DC03E6 /* CloverV2 in Copy CloverV2 */ = {isa = PBXBuildFile; fileRef = 9542ABC12373786700DC03E6 /* CloverV2 */; };
9546AE1B23806299007155A6 /* CloverLogOut in Copy tools */ = {isa = PBXBuildFile; fileRef = 95524B88238051F4005F6425 /* CloverLogOut */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
954BBE99238196EE0032425F /* Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954BBE98238196EE0032425F /* Locale.swift */; };
9552D748236F33CA00C93377 /* CloverDaemonNew in Copy tools */ = {isa = PBXBuildFile; fileRef = 9552D745236F33A700C93377 /* CloverDaemonNew */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
958861DA235F75FB00B64173 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958861D9235F75FB00B64173 /* Driver.swift */; };
95ACABCA236B7463008F80A4 /* Unzip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95ACABC9236B7463008F80A4 /* Unzip.swift */; };
@ -64,6 +66,20 @@
remoteGlobalIDString = 12F2E5461A30F7E70058A333;
remoteInfo = "boot1-install";
};
9546AE1823806286007155A6 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 95524B78238051AC005F6425;
remoteInfo = CloverLogOut;
};
95524B87238051F4005F6425 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 95524B79238051AC005F6425;
remoteInfo = CloverLogOut;
};
9552D744236F33A700C93377 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 9552D740236F33A700C93377 /* CloverDaemonNew.xcodeproj */;
@ -101,6 +117,7 @@
dstPath = "";
dstSubfolderSpec = 6;
files = (
9546AE1B23806299007155A6 /* CloverLogOut in Copy tools */,
9542ABC02373783400DC03E6 /* boot1-install in Copy tools */,
95337172237070CD003F1AF4 /* Cloverhelper in Copy tools */,
9552D748236F33CA00C93377 /* CloverDaemonNew in Copy tools */,
@ -147,8 +164,13 @@
/* Begin PBXFileReference section */
9533718223709517003F1AF4 /* bootsectors-install */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "bootsectors-install"; sourceTree = SOURCE_ROOT; };
953BC20223720C0A0039755D /* FixedWidthViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixedWidthViews.swift; sourceTree = "<group>"; };
9540AED42379F43D001AD0C8 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Main.strings; sourceTree = "<group>"; };
9540AED52379F43E001AD0C8 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Installer.strings; sourceTree = "<group>"; };
9542ABB82373780C00DC03E6 /* boot1-inst.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "boot1-inst.xcodeproj"; path = "../CloverPackage/utils/boot1-install/boot1-inst.xcodeproj"; sourceTree = "<group>"; };
9542ABC12373786700DC03E6 /* CloverV2 */ = {isa = PBXFileReference; lastKnownFileType = folder; name = CloverV2; path = ../CloverPackage/CloverV2; sourceTree = "<group>"; };
954BBE98238196EE0032425F /* Locale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Locale.swift; sourceTree = "<group>"; };
954C3DF0237DF0250059C698 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CloverLogOut.xcodeproj; path = CloverLogOut/CloverLogOut.xcodeproj; sourceTree = "<group>"; };
9552D740236F33A700C93377 /* CloverDaemonNew.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CloverDaemonNew.xcodeproj; path = CloverDaemonNew/CloverDaemonNew.xcodeproj; sourceTree = "<group>"; };
958505B4236594C000BCB4A3 /* Cloverhelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Cloverhelper.xcodeproj; path = cloverhelper/Cloverhelper.xcodeproj; sourceTree = "<group>"; };
958861D9235F75FB00B64173 /* Driver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Driver.swift; sourceTree = "<group>"; };
@ -247,6 +269,16 @@
95E68AE4235B89D9002B37A5 /* Installer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Installer.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
954C3DEE237DF0130059C698 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9533716B237070B3003F1AF4 /* Products */ = {
isa = PBXGroup;
@ -264,6 +296,22 @@
name = Products;
sourceTree = "<group>";
};
954C3DEF237DF0250059C698 /* Frameworks */ = {
isa = PBXGroup;
children = (
954C3DF0237DF0250059C698 /* ServiceManagement.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
95524B84238051F3005F6425 /* Products */ = {
isa = PBXGroup;
children = (
95524B88238051F4005F6425 /* CloverLogOut */,
);
name = Products;
sourceTree = "<group>";
};
9552D741236F33A700C93377 /* Products */ = {
isa = PBXGroup;
children = (
@ -284,6 +332,7 @@
isa = PBXGroup;
children = (
95E68AC8235B862F002B37A5 /* Clover */,
95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */,
9542ABB82373780C00DC03E6 /* boot1-inst.xcodeproj */,
958505B4236594C000BCB4A3 /* Cloverhelper.xcodeproj */,
95C51577236B21AE00E4A3A8 /* CloverRunAtLogin.xcodeproj */,
@ -291,6 +340,7 @@
95C5C0A22365D2250049940D /* Lang.bundle */,
9542ABC12373786700DC03E6 /* CloverV2 */,
95E68AC7235B862F002B37A5 /* Products */,
954C3DEF237DF0250059C698 /* Frameworks */,
);
sourceTree = "<group>";
};
@ -312,6 +362,7 @@
95E68ADE235B86A1002B37A5 /* bdmesg.swift */,
95E68ADD235B86A1002B37A5 /* Disks.swift */,
95E68ADB235B86A1002B37A5 /* Extensions.swift */,
954BBE98238196EE0032425F /* Locale.swift */,
95E68ADA235B86A0002B37A5 /* Release.swift */,
95E68ADC235B86A1002B37A5 /* Shared.swift */,
95C515212369BAF500E4A3A8 /* NVRAM.swift */,
@ -352,10 +403,12 @@
95850588236439D500BCB4A3 /* Copy tools */,
95C5C0A12365D1FB0049940D /* Copy Languages */,
95C51581236B224800E4A3A8 /* Copy CloverRunAtLogin */,
954C3DEE237DF0130059C698 /* Frameworks */,
);
buildRules = (
);
dependencies = (
9546AE1923806286007155A6 /* PBXTargetDependency */,
95337171237070BB003F1AF4 /* PBXTargetDependency */,
9552D747236F33B900C93377 /* PBXTargetDependency */,
9542ABBF2373781300DC03E6 /* PBXTargetDependency */,
@ -424,6 +477,7 @@
"bg-BG",
lv,
lt,
sr,
);
mainGroup = 95E68ABD235B862F002B37A5;
productRefGroup = 95E68AC7235B862F002B37A5 /* Products */;
@ -441,6 +495,10 @@
ProductGroup = 9533716B237070B3003F1AF4 /* Products */;
ProjectRef = 958505B4236594C000BCB4A3 /* Cloverhelper.xcodeproj */;
},
{
ProductGroup = 95524B84238051F3005F6425 /* Products */;
ProjectRef = 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */;
},
{
ProductGroup = 95C51578236B21AE00E4A3A8 /* Products */;
ProjectRef = 95C51577236B21AE00E4A3A8 /* CloverRunAtLogin.xcodeproj */;
@ -468,6 +526,13 @@
remoteRef = 9542ABBC2373780C00DC03E6 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
95524B88238051F4005F6425 /* CloverLogOut */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = CloverLogOut;
remoteRef = 95524B87238051F4005F6425 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
9552D745236F33A700C93377 /* CloverDaemonNew */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
@ -530,6 +595,7 @@
95E68ACC235B862F002B37A5 /* ViewController.swift in Sources */,
95E68AE2235B86A1002B37A5 /* Disks.swift in Sources */,
95E68ADF235B86A1002B37A5 /* Release.swift in Sources */,
954BBE99238196EE0032425F /* Locale.swift in Sources */,
95E68ACA235B862F002B37A5 /* AppDelegate.swift in Sources */,
958861DA235F75FB00B64173 /* Driver.swift in Sources */,
95E68AE3235B86A1002B37A5 /* bdmesg.swift in Sources */,
@ -555,6 +621,11 @@
name = "boot1-install";
targetProxy = 9542ABBE2373781300DC03E6 /* PBXContainerItemProxy */;
};
9546AE1923806286007155A6 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = CloverLogOut;
targetProxy = 9546AE1823806286007155A6 /* PBXContainerItemProxy */;
};
9552D747236F33B900C93377 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = CloverDaemonNew;
@ -608,6 +679,7 @@
95C5151B2368D76800E4A3A8 /* bg-BG */,
95C5151D2368D7AD00E4A3A8 /* lv */,
95C5151F2368D7C300E4A3A8 /* lt */,
9540AED42379F43D001AD0C8 /* sr */,
);
name = Main.storyboard;
sourceTree = "<group>";
@ -652,6 +724,7 @@
95C5151C2368D76800E4A3A8 /* bg-BG */,
95C5151E2368D7AD00E4A3A8 /* lv */,
95C515202368D7C300E4A3A8 /* lt */,
9540AED52379F43E001AD0C8 /* sr */,
);
name = Installer.storyboard;
sourceTree = "<group>";
@ -782,7 +855,7 @@
CODE_SIGN_ENTITLEMENTS = Clover/Clover.entitlements;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1.04;
CURRENT_PROJECT_VERSION = 1.05;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Clover/Frameworks",
@ -796,7 +869,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Clover/Frameworks",
);
MARKETING_VERSION = 1.04;
MARKETING_VERSION = 1.05;
PRODUCT_BUNDLE_IDENTIFIER = org.slice.Clover;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
@ -811,7 +884,7 @@
CODE_SIGN_ENTITLEMENTS = Clover/Clover.entitlements;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1.04;
CURRENT_PROJECT_VERSION = 1.05;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Clover/Frameworks",
@ -825,7 +898,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Clover/Frameworks",
);
MARKETING_VERSION = 1.04;
MARKETING_VERSION = 1.05;
PRODUCT_BUNDLE_IDENTIFIER = org.slice.Clover;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;

View File

@ -8,6 +8,8 @@
import Cocoa
// MARK: NSApplication shared delegate
let AppSD = NSApplication.shared.delegate as! AppDelegate
let localeBundle = Bundle(path: Bundle.main.sharedSupportPath! + "/Lang.bundle")
@NSApplicationMain

View File

@ -80,7 +80,6 @@ func getPartitionSchemeMap(from diskOrMtp: String) -> String? {
/// Find the mountpoint for the given disk object. You can pass also a mount point to se if it is valid.
func getMountPoint(from diskOrMtp: String) -> String? {
// kDADiskDescriptionVolumePathKey
var mountPoint : String? = nil
if let dict : NSDictionary = getDAdiskDescription(from: diskOrMtp) {
if (dict.object(forKey: kDADiskDescriptionVolumePathKey) != nil) {
@ -98,7 +97,6 @@ func getMountPoint(from diskOrMtp: String) -> String? {
/// Find the Volume name: be aware that this is not the mount point name.
func getVolumeName(from diskOrMtp: String) -> String? {
// kDADiskDescriptionVolumeNameKey
var name : String? = nil
if let dict : NSDictionary = getDAdiskDescription(from: diskOrMtp) {
if (dict.object(forKey: kDADiskDescriptionVolumeNameKey) != nil) {
@ -110,7 +108,6 @@ func getVolumeName(from diskOrMtp: String) -> String? {
/// Get partition UUID for the given volume: This is not a disk UUID.
func getVolumeUUID(from diskOrMtp: String) -> String? {
// kDADiskDescriptionVolumeUUIDKey
var uuid : String? = nil
if let dict : NSDictionary = getDAdiskDescription(from: diskOrMtp) {
if (dict.object(forKey: kDADiskDescriptionVolumeUUIDKey) != nil) {
@ -125,9 +122,9 @@ func getVolumeUUID(from diskOrMtp: String) -> String? {
/// Get disk uuid for the given diskx. This is not a Volume UUID but a media UUID.
func getDiskUUID(from diskOrMtp: String) -> String? {
// kDADiskDescriptionVolumeUUIDKey
var uuid : String? = nil
if let dict : NSDictionary = getDAdiskDescription(from: getBSDParent(of: diskOrMtp)!) {
print(dict)
if (dict.object(forKey: kDADiskDescriptionMediaUUIDKey) != nil) {
let temp : AnyObject = dict.object(forKey: kDADiskDescriptionMediaUUIDKey) as AnyObject
if temp is NSUUID {
@ -169,8 +166,6 @@ func getAlldisks() -> NSDictionary {
var entry_iterator: io_iterator_t = 0
let allDisks = NSMutableDictionary()
if IOServiceGetMatchingServices(kIOMasterPortDefault, match_dictionary, &entry_iterator) == kIOReturnSuccess {
//let serviceObject: io_registry_entry_t
//var serviceObject : UnsafeMutablePointer<io_registry_entry_t>
var serviceObject : io_registry_entry_t = 0
repeat {
@ -282,7 +277,6 @@ func getBSDName(of mountpoint: String) -> String? {
/// Find the BSDName of the given parent disk.
func getBSDParent(of mountpointORDevDisk: String) -> String? {
// DAMediaBSDUnit
if let dict : NSDictionary = getDAdiskDescription(from: mountpointORDevDisk) {
if (dict.object(forKey: kDADiskDescriptionMediaBSDUnitKey) != nil) {
return "disk" + ((dict.object(forKey: kDADiskDescriptionMediaBSDUnitKey) as? NSNumber)?.stringValue)!
@ -325,7 +319,6 @@ func getIconFor(volume mountpointORDevDisk: String) -> NSImage? {
let identifier = iconDict.object(forKey: kCFBundleIdentifierKey as String) as! CFString
let url : CFURL = Unmanaged.takeRetainedValue(KextManagerCreateURLForBundleIdentifier(kCFAllocatorDefault, identifier))()
//print(url)
if let kb = Bundle(url: url as URL) {
image = NSImage(byReferencingFile:
kb.path(forResource: iconName.deletingFileExtension, ofType: iconName.fileExtension) ?? "")
@ -350,3 +343,266 @@ func isMountPoint(path: String) -> Bool {
let mtp : String? = getMountPoint(from: path)
return (mtp != nil)
}
func mount(disk bsdName: String, at path: String?) {
var disk : String = bsdName
if disk.hasPrefix("disk") || disk.hasPrefix("/dev/disk") {
if disk.hasPrefix("/dev/disk") {
disk = disk.components(separatedBy: "dev/")[1]
}
var isLeaf : Bool = false
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 */
let mountpoint : String? = getMountPoint(from: disk)
if ((mountpoint != nil) && FileManager.default.fileExists(atPath: mountpoint!)) {
// already mounted
return
}
if let session = DASessionCreate(kCFAllocatorDefault) {
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
var url : CFURL? = nil
if (path != nil) {
url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
path?.toPointer(),
(path?.count)!,
true)
}
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
context.initialize(repeating: 0, count: 1)
context.pointee = 0
DASessionScheduleWithRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
DADiskMountWithArguments(bsd,
url,
DADiskMountOptions(kDADiskMountOptionDefault), {
(o, dis, ctx) in
if (dis != nil) && (ctx != nil) {
print("mount failure: " + printDAReturn(r: DADissenterGetStatus(dis!)))
}
CFRunLoopStop(CFRunLoopGetCurrent())
}, &context, nil)
CFRunLoopRun()
DASessionUnscheduleFromRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
context.deallocate()
}
}
}
}
}
func mount(disk bsdName: String,
at path: String?,
reply: @escaping (Bool) -> ()) {
var disk : String = bsdName
if disk.hasPrefix("disk") || disk.hasPrefix("/dev/disk") {
if disk.hasPrefix("/dev/disk") {
disk = disk.components(separatedBy: "dev/")[1]
}
var isLeaf : Bool = false
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 (is a partition?)*/
let mountpoint : String? = getMountPoint(from: disk)
if ((mountpoint != nil) && FileManager.default.fileExists(atPath: mountpoint!)) {
// already mounted
reply(true)
return
}
if let session = DASessionCreate(kCFAllocatorDefault) {
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
var url : CFURL? = nil
if (path != nil) {
url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
path?.toPointer(),
(path?.count)!,
true)
}
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
context.initialize(repeating: 0, count: 1)
context.pointee = 0
DASessionScheduleWithRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
DADiskMountWithArguments(bsd, url, DADiskMountOptions(kDADiskMountOptionDefault), {
(o, dis, ctx) in
if (dis != nil) && (ctx != nil) {
print("mount failure: " + printDAReturn(r: DADissenterGetStatus(dis!)))
}
CFRunLoopStop(CFRunLoopGetCurrent())
}, &context, nil)
let result : Bool = (context.pointee == 0)
CFRunLoopRun()
DASessionUnscheduleFromRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
context.deallocate()
reply(result)
return
}
}
}
}
reply(false)
}
func umount(disk diskOrMtp: String, force: Bool) {
let disk : String = diskOrMtp
let mtp : String? = getMountPoint(from: diskOrMtp)
if mtp != nil {
return
}
if disk.hasPrefix("disk") {
var isLeaf : Bool = false
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 */
let mountpoint : String? = getMountPoint(from: disk)
if (mountpoint == nil) {
return
}
if let session = DASessionCreate(kCFAllocatorDefault) {
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
context.initialize(repeating: 0, count: 1)
context.pointee = 0
DASessionScheduleWithRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
DADiskUnmount(bsd,
DADiskUnmountOptions(force ? kDADiskUnmountOptionForce : kDADiskUnmountOptionDefault),
{ (dadisk, dissenter, ctx) in
if (dissenter != nil) && (ctx != nil) {
print("un mount failure: " + printDAReturn(r: DADissenterGetStatus(dissenter!)))
}
CFRunLoopStop(CFRunLoopGetCurrent())
}, &context)
CFRunLoopRun()
DASessionUnscheduleFromRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
context.deallocate()
}
}
}
}
}
func umount(disk diskOrMtp: String,
force: Bool,
reply: @escaping (Bool) -> ()) {
let disk : String = diskOrMtp
let mtp : String? = getMountPoint(from: diskOrMtp)
if (mtp == nil) || (mtp == "/private/var/vm" || mtp == "/") {
reply(false)
return
}
if disk.hasPrefix("disk") {
var isLeaf : Bool = false
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 */
let mountpoint : String? = getMountPoint(from: disk)
if (mountpoint == nil) {
reply(true)
return
}
if let session = DASessionCreate(kCFAllocatorDefault) {
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
context.initialize(repeating: 0, count: 1)
context.pointee = 0
DASessionScheduleWithRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
DADiskUnmount(bsd,
DADiskUnmountOptions(force ? kDADiskUnmountOptionForce : kDADiskUnmountOptionDefault),
{ (dadisk, dissenter, ctx) in
if (dissenter != nil) && (ctx != nil) {
print("un mount failure: " + printDAReturn(r: DADissenterGetStatus(dissenter!)))
}
CFRunLoopStop(CFRunLoopGetCurrent())
}, &context)
let result : Bool = (context.pointee == 0)
CFRunLoopRun()
DASessionUnscheduleFromRunLoop(session,
CFRunLoopGetCurrent(),
CFRunLoopMode.defaultMode.rawValue)
context.deallocate()
reply(result)
}
}
}
}
reply(false)
}
fileprivate func printDAReturn(r: DAReturn) -> String {
switch Int(r) {
case kDAReturnError:
return "Error"
case kDAReturnBusy:
return "Busy"
case kDAReturnBadArgument:
return "Bad Argument"
case kDAReturnExclusiveAccess:
return "Exclusive Access"
case kDAReturnNoResources:
return "No Resources"
case kDAReturnNotFound:
return "Not Found"
case kDAReturnNotMounted:
return "Not Mounted"
case kDAReturnNotPermitted:
return "Not Permitted"
case kDAReturnNotPrivileged:
return "Not Privileged"
case kDAReturnNotReady:
return "Not Ready"
case kDAReturnNotWritable:
return "Not Writable"
case kDAReturnUnsupported:
return "Unsupported"
default:
return "Unknown"
}
}

View File

@ -45,11 +45,16 @@
<string>Copyright © 2019 CloverHackyColor. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>SMPrivilegedExecutables</key>
<dict>
<key>org.slice.CloverDaemonNew</key>
<string>identifier &quot;org.slice.CloverDaemonNew&quot;</string>
</dict>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<false/>
<key>NSSupportsSuddenTermination</key>
<true/>
<false/>
</dict>
</plist>

View File

@ -962,6 +962,7 @@ class InstallerViewController: NSViewController {
Cloverapp.setValue(Cloverv2Path, forKey: "CloverV2")
let filesystem = (getFS(from: disk)?.lowercased()) ?? kNotAvailable
Cloverapp.setValue(filesystem, forKey: "filesystem")
// drivers
for sect in self.driversUEFI {

View File

@ -0,0 +1,39 @@
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "0Jk-9o-xwr"; */
"0Jk-9o-xwr.title" = "Item 1";
/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "4pt-DA-Vl6"; */
"4pt-DA-Vl6.title" = "Item 2";
/* Class = "NSTextFieldCell"; title = "boot1"; ObjectID = "DSK-8g-GVR"; */
"DSK-8g-GVR.title" = "boot1";
/* Class = "NSButtonCell"; title = "Install"; ObjectID = "HOQ-B0-pLp"; */
"HOQ-B0-pLp.title" = "Install";
/* Class = "NSButtonCell"; title = "CloverEFI"; ObjectID = "cO6-AP-j0b"; */
"cO6-AP-j0b.title" = "CloverEFI";
/* Class = "NSButtonCell"; title = "MBR/PBR"; ObjectID = "itH-zW-i1Y"; */
"itH-zW-i1Y.title" = "MBR/PBR";
/* Class = "NSMenuItem"; title = "boot7"; ObjectID = "oOc-2T-rwc"; */
"oOc-2T-rwc.title" = "boot7";
/* Class = "NSButtonCell"; title = "AltBoot"; ObjectID = "rc0-N7-2xy"; */
"rc0-N7-2xy.title" = "AltBoot";
/* Class = "NSMenuItem"; title = "Item 3"; ObjectID = "sCy-bb-OOm"; */
"sCy-bb-OOm.title" = "Item 3";
/* Class = "NSMenuItem"; title = "boot0af"; ObjectID = "v1t-y6-CSK"; */
"v1t-y6-CSK.title" = "boot0af";
/* Class = "NSMenuItem"; title = "boot6"; ObjectID = "v2m-Hs-R3O"; */
"v2m-Hs-R3O.title" = "boot6";
/* Class = "NSMenuItem"; title = "boot0ss"; ObjectID = "xP1-AF-6KH"; */
"xP1-AF-6KH.title" = "boot0ss";
/* Class = "NSWindow"; title = "Clover Installer"; ObjectID = "ysg-ml-Ysp"; */
"ysg-ml-Ysp.title" = "Clover Installer";

View File

@ -0,0 +1,58 @@
//
// Locale.swift
// Clover
//
// Created by vector sigma on 17/11/2019.
// Copyright © 2019 CloverHackyColor. All rights reserved.
//
import Cocoa
extension String {
var locale: String {
get {
let preferred : [String] = Bundle.main.preferredLocalizations
var table : String = "en"
if preferred.count > 0 {
table = preferred[0]
}
var result = localeBundle?.localizedString(forKey: self, value: nil, table: table)
if result == self {
result = localeBundle?.localizedString(forKey: self, value: nil, table: "en")
}
return (result != nil) ? result! : self
}
}
public func locale(_ localized: Bool) -> String {
return (localized ? self.locale : self)
}
}
// MARK: localize view and sub views
func localize(view: NSView) {
for o in view.subviews {
if o is NSButton {
let x = (o as! NSButton)
if x.title.count > 0 {
x.title = x.title.locale
}
} else if o is NSTextField {
let x = (o as! NSTextField)
if x.stringValue.count > 0 {
x.stringValue = x.stringValue.locale
}
} else if o is NSBox {
let x = (o as! NSBox)
if x.title.count > 0 {
x.title = x.title.locale
}
}
if o.subviews.count > 0 {
localize(view: o)
}
}
}

View File

@ -8,9 +8,6 @@
import Cocoa
// MARK: NSApplication shared delegate
let AppSD = NSApplication.shared.delegate as! AppDelegate
// MARK: Paths
let Cloverv2Path : String = Bundle.main.sharedSupportPath! + "/CloverV2"
let kDaemonPath = "/Library/Application Support/Clover/CloverDaemonNew"
@ -40,55 +37,6 @@ let kUpdateSearchInterval = "UpdateSearchInterval"
let kLastUpdateLink = "LastUpdateLink"
let kLastUpdateRevision = "LastUpdateRevision"
extension String {
var locale: String {
get {
let preferred : [String] = Bundle.main.preferredLocalizations
var table : String = "en"
if preferred.count > 0 {
table = preferred[0]
}
var result = localeBundle?.localizedString(forKey: self, value: nil, table: table)
if result == self {
result = localeBundle?.localizedString(forKey: self, value: nil, table: "en")
}
return (result != nil) ? result! : self
}
}
public func locale(_ localized: Bool) -> String {
return (localized ? self.locale : self)
}
}
// MARK: localize view and sub views
func localize(view: NSView) {
for o in view.subviews {
if o is NSButton {
let x = (o as! NSButton)
if x.title.count > 0 {
x.title = x.title.locale
}
} else if o is NSTextField {
let x = (o as! NSTextField)
if x.stringValue.count > 0 {
x.stringValue = x.stringValue.locale
}
} else if o is NSBox {
let x = (o as! NSBox)
if x.title.count > 0 {
x.title = x.title.locale
}
}
if o.subviews.count > 0 {
localize(view: o)
}
}
}
// MARK: find Clover Revision
func findCloverRevision(at EFIdir: String) -> String? {

View File

@ -0,0 +1,399 @@
/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
"1UK-8n-QPP.title" = "Customize Toolbar…";
/* Class = "NSMenuItem"; title = "Clover"; ObjectID = "1Xt-HY-uBw"; */
"1Xt-HY-uBw.title" = "Clover";
/* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
"1b7-l0-nxx.title" = "Find";
/* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
"1tx-W0-xDw.title" = "Lower";
/* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
"2h7-ER-AoG.title" = "Raise";
/* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
"2oI-Rn-ZJC.title" = "Transformations";
/* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
"3IN-sU-3Bg.title" = "Spelling";
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
"3Om-Ey-2VK.title" = "Use Default";
/* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
"3rS-ZA-NoH.title" = "Speech";
/* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
"46P-cB-AYj.title" = "Tighten";
/* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
"4EN-yA-p0u.title" = "Find";
/* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
"4J7-dP-txa.title" = "Enter Full Screen";
/* Class = "NSMenuItem"; title = "Quit Clover"; ObjectID = "4sb-4s-VLi"; */
"4sb-4s-VLi.title" = "Quit Clover";
/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
"5QF-Oa-p0T.title" = "Edit";
/* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
"5Vv-lz-BsD.title" = "Copy Style";
/* Class = "NSMenuItem"; title = "About Clover"; ObjectID = "5kV-Vb-QxS"; */
"5kV-Vb-QxS.title" = "About Clover";
/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
"6dh-zS-Vam.title" = "Redo";
/* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
"78Y-hA-62v.title" = "Correct Spelling Automatically";
/* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
"8mr-sm-Yjd.title" = "Writing Direction";
/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
"9ic-FL-obx.title" = "Substitutions";
/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
"9yt-4B-nSM.title" = "Smart Copy/Paste";
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
"AYu-sK-qS6.title" = "Main Menu";
/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
"BOF-NM-1cW.title" = "Preferences…";
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
"BgM-ve-c93.title" = "\tLeft to Right";
/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
"Bw7-FT-i3A.title" = "Save As…";
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
"DVo-aG-piG.title" = "Close";
/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
"Dv1-io-Yv7.title" = "Spelling and Grammar";
/* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
"F2S-fz-NVQ.title" = "Help";
/* Class = "NSMenuItem"; title = "Clover Help"; ObjectID = "FKE-Sm-Kum"; */
"FKE-Sm-Kum.title" = "Clover Help";
/* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
"Fal-I4-PZk.title" = "Text";
/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
"FeM-D8-WVr.title" = "Substitutions";
/* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
"GB9-OM-e27.title" = "Bold";
/* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
"GEO-Iw-cKr.title" = "Format";
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
"GUa-eO-cwY.title" = "Use Default";
/* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
"Gi5-1S-RQB.title" = "Font";
/* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
"H1b-Si-o9J.title" = "Writing Direction";
/* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
"H8h-7b-M4v.title" = "View";
/* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
"HFQ-gK-NFA.title" = "Text Replacement";
/* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
"HFo-cy-zxI.title" = "Show Spelling and Grammar";
/* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
"HyV-fh-RgO.title" = "View";
/* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
"I0S-gh-46l.title" = "Subscript";
/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
"IAo-SY-fd9.title" = "Open…";
/* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
"IQv-IB-iLA.title" = "Window";
/* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
"J5U-5w-g23.title" = "Justify";
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
"J7y-lM-qPV.title" = "Use None";
/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
"KaW-ft-85H.title" = "Revert to Saved";
/* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
"Kd2-mp-pUS.title" = "Show All";
/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
"LE2-aR-0XJ.title" = "Bring All to Front";
/* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
"LVM-kO-fVI.title" = "Paste Ruler";
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
"Lbh-J2-qVU.title" = "\tLeft to Right";
/* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
"MkV-Pr-PK5.title" = "Copy Ruler";
/* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
"NMo-om-nkz.title" = "Services";
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
"Nop-cj-93Q.title" = "\tDefault";
/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
"OY7-WF-poV.title" = "Minimize";
/* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
"OaQ-X3-Vso.title" = "Baseline";
/* Class = "NSMenuItem"; title = "Hide Clover"; ObjectID = "Olw-nP-bQN"; */
"Olw-nP-bQN.title" = "Hide Clover";
/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
"OwM-mh-QMV.title" = "Find Previous";
/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
"Oyz-dy-DGm.title" = "Stop Speaking";
/* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
"Ptp-SP-VEL.title" = "Bigger";
/* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
"Q5e-8K-NDq.title" = "Show Fonts";
/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
"R4o-n2-Eq4.title" = "Zoom";
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
"RB4-Sm-HuC.title" = "\tRight to Left";
/* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
"Rqc-34-cIF.title" = "Superscript";
/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
"Ruw-6m-B2m.title" = "Select All";
/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
"S0p-oC-mLd.title" = "Jump to Selection";
/* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
"Td7-aD-5lo.title" = "Window";
/* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
"UEZ-Bs-lqG.title" = "Capitalize";
/* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
"VIY-Ag-zcb.title" = "Center";
/* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
"Vdr-fp-XzO.title" = "Hide Others";
/* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
"Vjx-xi-njq.title" = "Italic";
/* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
"W48-6f-4Dl.title" = "Edit";
/* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
"WRG-CD-K1S.title" = "Underline";
/* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
"Was-JA-tGl.title" = "New";
/* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
"WeT-3V-zwk.title" = "Paste and Match Style";
/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
"Xz5-n4-O0W.title" = "Find…";
/* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
"YEy-JH-Tfz.title" = "Find and Replace…";
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
"YGs-j5-SAR.title" = "\tDefault";
/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
"Ynk-f8-cLZ.title" = "Start Speaking";
/* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
"ZM1-6Q-yy1.title" = "Align Left";
/* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
"ZvO-Gk-QUH.title" = "Paragraph";
/* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
"aTl-1u-JFS.title" = "Print…";
/* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
"aUF-d1-5bR.title" = "Window";
/* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
"aXa-aM-Jaq.title" = "Font";
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
"agt-UL-0e3.title" = "Use Default";
/* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
"bgn-CT-cEk.title" = "Show Colors";
/* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
"bib-Uj-vzu.title" = "File";
/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
"buJ-ug-pKt.title" = "Use Selection for Find";
/* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
"c8a-y6-VQd.title" = "Transformations";
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
"cDB-IK-hbR.title" = "Use None";
/* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
"cqv-fj-IhA.title" = "Selection";
/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
"cwL-P1-jid.title" = "Smart Links";
/* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
"d9M-CD-aMd.title" = "Make Lower Case";
/* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
"d9c-me-L2H.title" = "Text";
/* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
"dMs-cI-mzQ.title" = "File";
/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
"dRJ-4n-Yzg.title" = "Undo";
/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
"gVA-U4-sdL.title" = "Paste";
/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
"hQb-2v-fYv.title" = "Smart Quotes";
/* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
"hz2-CU-CR7.title" = "Check Document Now";
/* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
"hz9-B4-Xy5.title" = "Services";
/* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
"i1d-Er-qST.title" = "Smaller";
/* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
"ijk-EB-dga.title" = "Baseline";
/* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
"jBQ-r6-VK2.title" = "Kern";
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
"jFq-tB-4Kx.title" = "\tRight to Left";
/* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
"jxT-CU-nIS.title" = "Format";
/* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
"kIP-vf-haE.title" = "Show Sidebar";
/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
"mK6-2p-4JG.title" = "Check Grammar With Spelling";
/* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
"o6e-r0-MWq.title" = "Ligatures";
/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
"oas-Oc-fiZ.title" = "Open Recent";
/* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
"ogc-rX-tC1.title" = "Loosen";
/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
"pa3-QI-u2k.title" = "Delete";
/* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
"pxx-59-PXV.title" = "Save…";
/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
"q09-fT-Sye.title" = "Find Next";
/* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
"qIS-W8-SiK.title" = "Page Setup…";
/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
"rbD-Rh-wIN.title" = "Check Spelling While Typing";
/* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
"rgM-f4-ycn.title" = "Smart Dashes";
/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
"snW-S8-Cw5.title" = "Show Toolbar";
/* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
"tRr-pd-1PS.title" = "Data Detectors";
/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
"tXI-mr-wws.title" = "Open Recent";
/* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
"tlD-Oa-oAM.title" = "Kern";
/* Class = "NSMenu"; title = "Clover"; ObjectID = "uQy-DD-JDr"; */
"uQy-DD-JDr.title" = "Clover";
/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
"uRl-iY-unG.title" = "Cut";
/* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
"vKC-jM-MkH.title" = "Paste Style";
/* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
"vLm-3I-IUL.title" = "Show Ruler";
/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
"vNY-rz-j42.title" = "Clear Menu";
/* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
"vmV-6d-7jI.title" = "Make Upper Case";
/* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
"w0m-vy-SC9.title" = "Ligatures";
/* Class = "NSTextFieldCell"; title = "Main Clover.app"; ObjectID = "wA3-rG-VSC"; */
"wA3-rG-VSC.title" = "Main Clover.app";
/* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
"wb2-vD-lq4.title" = "Align Right";
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
"wpr-3q-Mcd.title" = "Help";
/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
"x3v-GG-iWU.title" = "Copy";
/* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
"xQD-1f-W4t.title" = "Use All";
/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
"xrE-MZ-jX0.title" = "Speech";
/* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
"z6F-FW-3nz.title" = "Show Substitutions";

View File

@ -17,18 +17,6 @@
954FF2102371B16300C3D94C /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 954FF20F2371B16300C3D94C /* IOKit.framework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
953DBFD9236F037400B0C4FB /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
953B8DED2370BB1A007E36E3 /* bdmesg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = bdmesg.swift; path = ../../Clover/bdmesg.swift; sourceTree = "<group>"; };
953B8DEF2370BB5C007E36E3 /* NVRAM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NVRAM.swift; path = ../../Clover/NVRAM.swift; sourceTree = "<group>"; };
@ -106,7 +94,6 @@
buildPhases = (
953DBFD7236F037400B0C4FB /* Sources */,
953DBFD8236F037400B0C4FB /* Frameworks */,
953DBFD9236F037400B0C4FB /* CopyFiles */,
);
buildRules = (
);
@ -292,6 +279,7 @@
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.9;
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "CloverDaemonNew/CloverDaemonNew-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -311,6 +299,7 @@
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.9;
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "CloverDaemonNew/CloverDaemonNew-Bridging-Header.h";
SWIFT_VERSION = 5.0;

View File

@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)registerPowerNotifications;
- (void)powerDidReceiveMessage:(natural_t)type argument:(void *)argument;
- (void)removeNVRAMPlist;
- (void)readAndCleanConflictingsKeys;
@end
NS_ASSUME_NONNULL_END

View File

@ -52,24 +52,49 @@ void powerCallback(void *refCon, io_service_t service, natural_t type, void *arg
}
case kIOMessageSystemHasPoweredOn:{
printf("System awaken at %s\n", [date UTF8String]);
// who will come first? ..I don't know so do that after 3 seconds
[self performSelector:@selector(removeNVRAMPlist) withObject:nil afterDelay:3];
[self performSelector:@selector(readAndCleanConflictingsKeys) withObject:nil afterDelay:3];
break;
}
}
}
- (void)removeNVRAMPlist {
- (void)readAndCleanConflictingsKeys {
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/nvram.plist"]) {
printf("Found /nvram.plist after waking from sleep, checking fro Apple GUIDs..\n");
NSDictionary *nvram = [NSDictionary dictionaryWithContentsOfFile:@"/nvram.plist"];
NSMutableDictionary *nvram = [NSMutableDictionary dictionaryWithContentsOfFile:@"/nvram.plist"];
if (nvram != nil) {
NSArray *keys = [nvram allKeys];
int removed = 0;
for (int i = 0; i < [keys count]; i++) {
NSString *key = [keys objectAtIndex:i];
if ([key hasPrefix:@"8BE4DF61-93CA-11D2-AA0D-00E098032B8C:"]) {
printf("/nvram.plist contains %s\n", [key UTF8String]);
}
if ([key isEqualToString: @"efi-backup-boot-device"]) {
printf("removing %s.\n", [key UTF8String]);
[nvram removeObjectForKey:@"efi-backup-boot-device"];
}
if ([key isEqualToString: @"efi-backup-boot-device-data"]) {
printf("removing %s.\n", [key UTF8String]);
[nvram removeObjectForKey:@"efi-backup-boot-device-data"];
}
if ([key isEqualToString: @"install-product-url"]) {
printf("removing %s.\n", [key UTF8String]);
[nvram removeObjectForKey:@"install-product-url"];
}
if ([key isEqualToString: @"previous-system-uuid"]) {
printf("removing %s.\n", [key UTF8String]);
[nvram removeObjectForKey:@"previous-system-uuid"];
}
}
if (removed > 0) {
if (![nvram writeToFile:@"/nvram.plist" atomically:YES]) {
printf("Error: cannot write back to /nvram.plist.\n");
} else {
system("/usr/bin/chflags hidden /nvram.plist");
}
}
}

View File

@ -7,21 +7,13 @@
//
import Foundation
import CoreFoundation
let daemonVersion = "1.01"
let fm = FileManager.default
let daemonVersion = "1.0.3"
/*
Store a session reference to contact Disk Arbitration,
..it will be usefull during the shut down.
this is weird, but make some chances for the last stand (SIGTERM)
*/
var BootDeviceUUID : String? = nil
var BootDeviceFS : String? = nil
var BootDevice : String? = nil
let wrapperPath = "/Library/Application Support/Clover/CloverWrapper.sh"
let loginwindow = "/var/root/Library/Preferences/com.apple.loginwindow.plist"
let lh = "/Library/Application Support/Clover/CloverLogOut"
func execAttr() -> [FileAttributeKey : Any] {
var attributes = [FileAttributeKey : Any]()
@ -58,24 +50,7 @@ func run(cmd: String) {
}
func doJob() {
/*
Don't lose time.. We're shutting down, so try to make root writable anyway
*/
if !fm.isWritableFile(atPath: "/") {
run(cmd: "mount -uw /")
}
if let nvram = getNVRAM() {
// first time is to dump nvram (time is running out..)
if (nvram.object(forKey: "EmuVariableUefiPresent") != nil ||
nvram.object(forKey: "TestEmuVariableUefiPresent") != nil) {
// mount -t "$filesystem" "$bootdev" "$mnt_pt"
if let bootDevice = BootDevice, let fs = BootDeviceFS {
saveNVRAM(bootDevice: bootDevice, filesystem: fs, nvram: nvram)
}
}
checkSleepProxyClient(nvram: nvram)
} else {
print("nvram not present in this machine.")
@ -83,114 +58,72 @@ func doJob() {
exit(EXIT_SUCCESS)
}
func saveNVRAM(bootDevice: String, filesystem: String, nvram: NSMutableDictionary) {
nvram.removeObject(forKey: "efi-backup-boot-device")
nvram.removeObject(forKey: "efi-backup-boot-device-data")
nvram.removeObject(forKey: "install-product-url")
nvram.removeObject(forKey: "previous-system-uuid")
nvram.write(toFile: "/tmp/nvramsaved.plist", atomically: false)
let uuid = (BootDeviceUUID != nil) ? "\(BootDeviceUUID!)" : "NO UUID"
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
let mp = "/Volumes/\(String((0..<10).map{ _ in letters.randomElement()! }))"
let type : String = (filesystem.hasPrefix("fat") || filesystem.hasPrefix("exf")) ? "msdos" : filesystem
let cmd = """
if [[ ! -f /tmp/nvramsaved.plist ]]; then
echo "Error: nvram not found to a temporary location."
exit 0
fi
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist > /dev/null 2>&1
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskmanagementd.plist > /dev/null 2>&1
diskutil mount \(bootDevice) > /dev/null 2>&1
mp=$(LC_ALL=C mount | egrep "^/dev/\(bootDevice) on" | sed 's/^.* on *//;s/ ([^(]*//')
if [[ "${mp}" == "/"* ]]; then
cat /tmp/nvramsaved.plist > "${mp}"/nvram.plist
echo 'nvram saved to disk with UUID \(uuid)'
else
mkdir -p '\(mp)'
attempts=1
until [ $attempts -ge 11 ]
do
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist > /dev/null 2>&1
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskmanagementd.plist > /dev/null 2>&1
sleep 0.2
mount -t \(type) /dev/\(bootDevice) '\(mp)' > /dev/null 2>&1
sleep 0.3
if [ $? -eq 0 ]; then
cat /tmp/nvramsaved.plist > '\(mp)/nvram.plist'
echo 'nvram saved to disk with UUID \(uuid)'
echo "$attempts attempts required."
break
else
attempts=$[$attempts+1]
if [ $attempts -eq 11 ]; then
echo "Error: \(bootDevice) doesn't want to mount after $attempts attempts, try to save in /."
cat /tmp/nvramsaved.plist > /nvram.plist
fi
fi
done
fi
"""
let task = Process()
task.launchPath = "/bin/bash"
task.arguments = ["-c", cmd]
task.launch()
}
func checkSleepProxyClient(nvram: NSDictionary) {
let mDNSResponderPath = "/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist"
let disableOption = "-DisableSleepProxyClient"
if let nvdata = nvram.object(forKey: "Clover.DisableSleepProxyClient") as? Data {
let value = String(decoding: nvdata, as: UTF8.self)
if value == "true" {
if !fm.fileExists(atPath: mDNSResponderPath) {
print("Error: cannot found \(mDNSResponderPath)")
return
}
if !fm.isWritableFile(atPath: "/") {
print("try to making '/' writable as Clover.DisableSleepProxyClient=true.")
run(cmd: "mount -uw /")
}
// check if already disabled
if let mDNSResponder = NSDictionary(contentsOfFile: mDNSResponderPath) {
if let ProgramArguments = mDNSResponder.object(forKey: "ProgramArguments") as? NSArray {
var toDisable : Bool = true
for a in ProgramArguments {
if let arg = a as? String {
if arg == disableOption {
print("DisableSleepProxyClient: service already disabled\n")
toDisable = false
break
}
print("Clover.DisableSleepProxyClient=\(value)")
if !fm.fileExists(atPath: mDNSResponderPath) {
print("Error: cannot found \(mDNSResponderPath)")
return
}
if !fm.isWritableFile(atPath: "/") {
print("Cannot go ahead as / is still read-only at this moment, will try again at power off.")
return
}
// check if enabled or disabled
if let mDNSResponder = NSDictionary(contentsOfFile: mDNSResponderPath) {
if let ProgramArguments = mDNSResponder.object(forKey: "ProgramArguments") as? NSArray {
var index : Int = -1
var serviceDisabled = false
for i in 0..<ProgramArguments.count {
if let arg = ProgramArguments.object(at: i) as? String {
if arg == disableOption {
index = i
serviceDisabled = true
break
}
}
if toDisable {
print("DisableSleepProxyClient: trying to disable the service.. SIP permitting.\n")
let cmd = "/usr/libexec/PlistBuddy -c \"Add ProgramArguments: string \(disableOption)\" \(mDNSResponderPath)"
}
if value == "true" && !serviceDisabled {
print("Trying to disable Sleep Proxy Client service as requested.")
let cmd = "/usr/libexec/PlistBuddy -c \"Add ProgramArguments: string \(disableOption)\" \(mDNSResponderPath)"
run(cmd: cmd)
} else if value != "true" && serviceDisabled {
print("Trying to enable Sleep Proxy Client service as requested.")
if index >= 0 {
let cmd = "/usr/libexec/PlistBuddy -c \"delete :ProgramArguments:\(index)\" \(mDNSResponderPath)"
run(cmd: cmd)
} else {
print("Bug: cant find the index of '\(disableOption)'.\n")
}
} else {
print("Sleep Proxy Client \(serviceDisabled ? "disabled" : "enabled") as requested.")
}
}
}
}
}
func getLogOutHook() -> String? {
return NSDictionary(contentsOfFile: loginwindow)?.object(forKey: "LogoutHook") as? String
}
func main() {
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd hh:mm:ss"
var now = df.string(from: Date())
print("--------------------------------------------")
print("\n\n--------------------------------------------")
print("- CloverDaemonNew v\(daemonVersion)")
print("- macOS \(ProcessInfo().operatingSystemVersionString)")
print("- System start at \(now)")
print("--------------------------------------------")
var powerObserver : PowerObserver? = PowerObserver() // I want it to be var
print("------")
run(cmd: "kextunload /System/Library/Extensions/msdosfs.kext 2>/dev/null")
let _ : PowerObserver? = PowerObserver()
if let volname = getMediaName(from: "/") {
print("root mount point is '/Volumes/\(volname)'")
}
@ -213,6 +146,7 @@ func main() {
This is not going to go into the System log and is not
controllable by the nvram.
*/
let logLinesMax : Int = 500
let logDir = "/Library/Logs/CloverEFI"
let logPath = "/Library/Logs/CloverEFI/clover.daemon.log"
@ -235,35 +169,117 @@ func main() {
}
}
// get the boot device UUID, will be of help later
if let bootDevice = findBootPartitionDevice() {
BootDevice = bootDevice
BootDeviceUUID = getVolumeUUID(from: bootDevice)
BootDeviceFS = getFS(from: bootDevice)?.lowercased()
}
// check options in nvram
var mountRWCalled = fm.isWritableFile(atPath: "/")
if let nvram = getNVRAM() {
if let nvdata = nvram.object(forKey: "Clover.RootRW") as? Data {
let value = String(decoding: nvdata, as: UTF8.self)
if value == "true" && !fm.isWritableFile(atPath: "/") {
print("making '/' writable as Clover.RootRW=true")
run(cmd: "mount -uw /")
if value == "true" {
if !mountRWCalled {
mountRWCalled = true
print("making '/' writable as Clover.RootRW=true.")
run(cmd: "mount -uw /")
}
}
}
checkSleepProxyClient(nvram: nvram)
}
/*
Clean old nvram.plist user may have in other volumes,
but not if it is our boot device
*/
for v in getVolumes() {
let nvramtPath = v.addPath("nvram.plist")
let bootDevice = findBootPartitionDevice()
let vbsd = getBSDName(of: v)
if vbsd != bootDevice {
// using the logout Hook only if EmuVariableUefiPresent
let loh = getLogOutHook()
if (nvram.object(forKey: "EmuVariableUefiPresent") != nil ||
nvram.object(forKey: "TestEmuVariableUefiPresent") != nil) {
// if a hook exist and is not our one, then add a wrapper
if (loh != nil) {
if loh! != lh && fm.fileExists(atPath: loh!) {
let wrapper =
"""
#!/bin/sh
'\(lh)'
# This file is automatically generated by CloverDaemonNew because
# it has detected you added a logout script somewhere else.
# if you edit this file, be aware that if you start to boot in UEFI
# CloverDaemonNew will take care to restore your custom logout script,
# but your script must be the last line to be detected again.
# The script path must be escaped within '' if contains spaces in the middle.
# NOTE: if your will is to add multiple scripts, please add them to
# the following script (and so not in this script):
'\(loh!)'
"""
print("Detected user logout hook at \(loh!), merging with it with CloverLogOut in CloverWrapper.sh.")
do {
try wrapper.write(toFile: wrapperPath, atomically: false, encoding: .utf8)
try fm.setAttributes(execAttr(), ofItemAtPath: wrapperPath)
run(cmd: "defaults write com.apple.loginwindow LogoutHook '\(wrapperPath)'")
} catch {
print(error)
}
} else {
run(cmd: "defaults write com.apple.loginwindow LogoutHook '\(lh)'")
}
} else {
run(cmd: "defaults write com.apple.loginwindow LogoutHook '\(lh)'")
}
if !fm.isWritableFile(atPath: "/") {
if !mountRWCalled {
print("making '/' writable as EmuVariableUefiPresent is present to save nvram.")
}
run(cmd: "mount -uw /")
}
} else {
// what to do? remove the logout hook if it's our
if (loh != nil) {
if loh! == lh {
// it is CloverLogOut
print("Removing CloverLogOut hook as EmuVariable is no longer present.")
run(cmd: "defaults delete com.apple.loginwindow LogoutHook")
} else if loh! == wrapperPath {
print("Removing CloverWrapper.sh logout hook as EmuVariable is no longer present.")
// it is CloverWrapper.sh. We have to mantain user script!
// get the user script path:
var script : String? = nil
if let lines = try? String(contentsOf: URL(fileURLWithPath: wrapperPath),
encoding: .utf8).components(separatedBy: .newlines) {
if lines.count > 0 {
script = lines.last
}
}
if script != nil {
print("..but taking user logout hook script at \(script!).")
run(cmd: "defaults write com.apple.loginwindow LogoutHook \(script!)")
} else {
run(cmd: "defaults delete com.apple.loginwindow LogoutHook")
}
}
}
}
if let nvdata = nvram.object(forKey: "Clover.DisableSleepProxyClient") as? Data {
let value = String(decoding: nvdata, as: UTF8.self)
if value == "true" {
if !fm.isWritableFile(atPath: "/") {
if !mountRWCalled {
print("making '/' writable as Clover.DisableSleepProxyClient=true.")
}
run(cmd: "mount -uw /")
sleep(2)
}
}
checkSleepProxyClient(nvram: nvram)
}
/*
Clean old nvram.plist user may have in all volumes
*/
for v in getVolumes() {
let nvramtPath = v.addPath("nvram.plist")
if fm.fileExists(atPath: nvramtPath) {
if fm.isDeletableFile(atPath: nvramtPath) {
do {
@ -277,20 +293,22 @@ func main() {
}
}
}
} else {
print("Error: nvram not present in this System.")
}
// SIGTERM? This is a daemon so we are shutting down
signal(SIGTERM, SIG_IGN)
let termSource = DispatchSource.makeSignalSource(signal: SIGTERM)
termSource.setEventHandler {
print("Logout hook is: \(getLogOutHook() ?? "none")")
signal(SIGTERM, SIG_IGN) //preferred
let sigtermSource = DispatchSource.makeSignalSource(signal: SIGTERM)
sigtermSource.setEventHandler {
now = df.string(from: Date())
print("")
print("- System power off at \(now)")
print("- CloverDaemonNew v\(daemonVersion)")
powerObserver = nil // no longer needed
print("SIGTERM received at \(now)")
//print("- CloverDaemonNew v\(daemonVersion)")
doJob()
}
termSource.resume()
sigtermSource.resume()
RunLoop.current.run()
//dispatchMain()
}
@ -337,6 +355,17 @@ if CommandLine.arguments.contains("--install") {
ofItemAtPath: "/Library/Application Support/Clover/\(myName)")
let logouthookSrc = myPath.deletingLastPath.addPath("CloverLogOut")
if fm.fileExists(atPath: lh) {
try fm.removeItem(atPath: lh)
}
if fm.fileExists(atPath: logouthookSrc) {
try fm.copyItem(atPath: logouthookSrc,
toPath: lh)
try fm.setAttributes(execAttr(),
ofItemAtPath: lh)
}
try fm.setAttributes(launchAttr(),
ofItemAtPath: "/Library/LaunchDaemons/com.slice.CloverDaemonNew.plist")
if fm.fileExists(atPath: "/Library/LaunchDaemons/com.slice.CloverDaemonNew.plist") {
@ -365,7 +394,6 @@ if CommandLine.arguments.contains("--install") {
}
} else {
main()
CFRunLoopRun()
}
exit(EXIT_FAILURE)

View File

@ -0,0 +1,307 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
954BBE972381964F0032425F /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954BBE962381964F0032425F /* Shared.swift */; };
95524B7D238051AC005F6425 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B7C238051AC005F6425 /* main.swift */; };
95524B8A23805210005F6425 /* NVRAM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8923805210005F6425 /* NVRAM.swift */; };
95524B8C2380521D005F6425 /* Disks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8B2380521D005F6425 /* Disks.swift */; };
95524B8E2380522A005F6425 /* bdmesg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8D2380522A005F6425 /* bdmesg.swift */; };
95524B9023805233005F6425 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8F23805232005F6425 /* Extensions.swift */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
95524B77238051AC005F6425 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
954BBE962381964F0032425F /* Shared.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Shared.swift; path = ../../Clover/Shared.swift; sourceTree = "<group>"; };
95524B79238051AC005F6425 /* CloverLogOut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CloverLogOut; sourceTree = BUILT_PRODUCTS_DIR; };
95524B7C238051AC005F6425 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
95524B8923805210005F6425 /* NVRAM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NVRAM.swift; path = ../../Clover/NVRAM.swift; sourceTree = "<group>"; };
95524B8B2380521D005F6425 /* Disks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Disks.swift; path = ../../Clover/Disks.swift; sourceTree = "<group>"; };
95524B8D2380522A005F6425 /* bdmesg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = bdmesg.swift; path = ../../Clover/bdmesg.swift; sourceTree = "<group>"; };
95524B8F23805232005F6425 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = ../../Clover/Extensions.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
95524B76238051AC005F6425 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
95524B70238051AC005F6425 = {
isa = PBXGroup;
children = (
95524B7B238051AC005F6425 /* CloverLogOut */,
95524B7A238051AC005F6425 /* Products */,
);
sourceTree = "<group>";
};
95524B7A238051AC005F6425 /* Products */ = {
isa = PBXGroup;
children = (
95524B79238051AC005F6425 /* CloverLogOut */,
);
name = Products;
sourceTree = "<group>";
};
95524B7B238051AC005F6425 /* CloverLogOut */ = {
isa = PBXGroup;
children = (
95524B7C238051AC005F6425 /* main.swift */,
954BBE962381964F0032425F /* Shared.swift */,
95524B8923805210005F6425 /* NVRAM.swift */,
95524B8B2380521D005F6425 /* Disks.swift */,
95524B8D2380522A005F6425 /* bdmesg.swift */,
95524B8F23805232005F6425 /* Extensions.swift */,
);
path = CloverLogOut;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
95524B78238051AC005F6425 /* CloverLogOut */ = {
isa = PBXNativeTarget;
buildConfigurationList = 95524B80238051AC005F6425 /* Build configuration list for PBXNativeTarget "CloverLogOut" */;
buildPhases = (
95524B75238051AC005F6425 /* Sources */,
95524B76238051AC005F6425 /* Frameworks */,
95524B77238051AC005F6425 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = CloverLogOut;
productName = CloverLogOut;
productReference = 95524B79238051AC005F6425 /* CloverLogOut */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
95524B71238051AC005F6425 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1120;
LastUpgradeCheck = 1120;
ORGANIZATIONNAME = CloverHackyColor;
TargetAttributes = {
95524B78238051AC005F6425 = {
CreatedOnToolsVersion = 11.2;
};
};
};
buildConfigurationList = 95524B74238051AC005F6425 /* Build configuration list for PBXProject "CloverLogOut" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 95524B70238051AC005F6425;
productRefGroup = 95524B7A238051AC005F6425 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
95524B78238051AC005F6425 /* CloverLogOut */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
95524B75238051AC005F6425 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
954BBE972381964F0032425F /* Shared.swift in Sources */,
95524B9023805233005F6425 /* Extensions.swift in Sources */,
95524B8A23805210005F6425 /* NVRAM.swift in Sources */,
95524B8E2380522A005F6425 /* bdmesg.swift in Sources */,
95524B7D238051AC005F6425 /* main.swift in Sources */,
95524B8C2380521D005F6425 /* Disks.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
95524B7E238051AC005F6425 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
95524B7F238051AC005F6425 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
};
95524B81238051AC005F6425 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 10.9;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
95524B82238051AC005F6425 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
MACOSX_DEPLOYMENT_TARGET = 10.9;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
95524B74238051AC005F6425 /* Build configuration list for PBXProject "CloverLogOut" */ = {
isa = XCConfigurationList;
buildConfigurations = (
95524B7E238051AC005F6425 /* Debug */,
95524B7F238051AC005F6425 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
95524B80238051AC005F6425 /* Build configuration list for PBXNativeTarget "CloverLogOut" */ = {
isa = XCConfigurationList;
buildConfigurations = (
95524B81238051AC005F6425 /* Debug */,
95524B82238051AC005F6425 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 95524B71238051AC005F6425 /* Project object */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:CloverLogOut.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,177 @@
//
// main.swift
// CloverLogOut
//
// Created by vector sigma on 16/11/2019.
// Copyright © 2019 CloverHackyColor. All rights reserved.
//
import Foundation
func log(_ str: String) {
let logUrl = URL(fileURLWithPath: "/Library/Logs/CloverEFI/clover.daemon.log")
if !fm.fileExists(atPath: "/Library/Logs/CloverEFI") {
try? fm.createDirectory(at: URL(fileURLWithPath: "/Library/Logs/CloverEFI"),
withIntermediateDirectories: false,
attributes: nil)
}
if !fm.fileExists(atPath: "/Library/Logs/CloverEFI/clover.daemon.log") {
try? "".write(to: logUrl, atomically: false, encoding: .utf8)
}
if let fh = try? FileHandle(forUpdating: logUrl) {
fh.seekToEndOfFile()
fh.write("\n\(str)".data(using: .utf8)!)
fh.closeFile()
}
}
func run(cmd: String) {
let task = Process()
if #available(OSX 10.13, *) {
task.executableURL = URL(fileURLWithPath: "/bin/bash")
} else {
task.launchPath = "/bin/bash"
}
task.environment = ProcessInfo.init().environment
task.arguments = ["-c", cmd]
task.launch()
}
func saveNVRAM(nvram: NSMutableDictionary, volume: String) {
if (nvram.object(forKey: "efi-backup-boot-device") != nil) {
nvram.removeObject(forKey: "efi-backup-boot-device")
}
if (nvram.object(forKey: "efi-backup-boot-device-data") != nil) {
nvram.removeObject(forKey: "efi-backup-boot-device-data")
}
if (nvram.object(forKey: "install-product-url") != nil) {
nvram.removeObject(forKey: "install-product-url")
}
if (nvram.object(forKey: "previous-system-uuid") != nil) {
nvram.removeObject(forKey: "previous-system-uuid")
}
if fm.fileExists(atPath: "/nvram.plist") {
do {
try fm.removeItem(atPath: "/nvram.plist")
} catch {
log("\(error)")
}
}
let bsdname = getBSDName(of: volume) ?? ""
let uuid = getVolumeUUID(from: bsdname) ?? kNotAvailable
if nvram.write(toFile: volume.addPath("nvram.plist"), atomically: false) {
if volume == "/" {
run(cmd: "chflags hidden /nvram.plist")
}
log("nvram correctly saved to \(volume) with UUID: \(uuid).")
} else {
log("Error: nvram cannot be saved to \(volume) with UUID: \(uuid).")
}
}
func main() {
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd hh:mm:ss"
var now = df.string(from: Date())
log("- CloverLogOut: begin at \(now)")
if let nvram = getNVRAM() {
// Check if we're running from CloverEFI
if (nvram.object(forKey: "EmuVariableUefiPresent") != nil ||
nvram.object(forKey: "TestEmuVariableUefiPresent") != nil) {
var disk : String? = nil
var espList = [String]()
/* find all internal ESP in the System as we don't want
to save the nvram in a USB pen drive (user will lost the nvram if not plugged in)
*/
for esp in getAllESPs() {
if isInternalDevice(diskOrMtp: esp) {
espList.append(esp)
}
}
// find the boot partition device and check if it is a ESP
if let bd = findBootPartitionDevice() {
if espList.contains(bd) {
// boot device is a ESP :-)
disk = bd
log("Detected ESP \(bd) as boot device.")
}
}
if (disk == nil) {
// boot device not found
if espList.count > 0 {
// we have an internal ESP, using that
disk = espList[0]
log("Will use ESP \(disk!) as boot device is not found.")
} else {
// use root
disk = getBSDName(of: "/")
log("Will use / as no boot device nor an internal ESP are found.")
}
}
if (disk != nil) {
// get the mount point or mount it
var mounted : Bool = false
if let mp = getMountPoint(from: disk!) {
mounted = true
saveNVRAM(nvram: nvram, volume: mp)
return
}
if !mounted {
log("mount begin for \(disk!)..")
var mountattempts : Int = 0
repeat {
mount(disk: disk!, at: nil) { (result) in
mountattempts+=1
sleep(1)
if result == true {
var attempts = 0
repeat {
sleep(1)
attempts+=1
if let mp = getMountPoint(from: disk!) {
mounted = true
mountattempts = 5
saveNVRAM(nvram: nvram, volume: mp)
sleep(1)
umount(disk: disk!, force: true)
break
}
} while (getMountPoint(from: disk!) == nil || attempts > 10)
}
}
} while mountattempts < 5
if !mounted {
log("mount failed for \(disk!).")
saveNVRAM(nvram: nvram, volume: "/")
}
} else {
// CloverDaemonNew should have made the fs read-write for us.
saveNVRAM(nvram: nvram, volume: "/")
}
}
}
}
now = df.string(from: Date())
log("- CloverLogOut: end at \(now)")
}
main()
exit(EXIT_SUCCESS)

View File

@ -15,6 +15,7 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
9540AED62379F43E001AD0C8 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Main.strings; sourceTree = "<group>"; };
95C51560236B211200E4A3A8 /* CloverRunAtLogin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CloverRunAtLogin.app; sourceTree = BUILT_PRODUCTS_DIR; };
95C51563236B211200E4A3A8 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
95C51564236B211200E4A3A8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@ -111,6 +112,7 @@
knownRegions = (
en,
Base,
sr,
);
mainGroup = 95C51557236B211100E4A3A8;
productRefGroup = 95C51561236B211200E4A3A8 /* Products */;
@ -152,6 +154,7 @@
isa = PBXVariantGroup;
children = (
95C5156C236B211400E4A3A8 /* Base */,
9540AED62379F43E001AD0C8 /* sr */,
);
name = Main.storyboard;
sourceTree = "<group>";

View File

@ -0,0 +1,399 @@
/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
"1UK-8n-QPP.title" = "Customize Toolbar…";
/* Class = "NSMenuItem"; title = "CloverRunAtLogin"; ObjectID = "1Xt-HY-uBw"; */
"1Xt-HY-uBw.title" = "CloverRunAtLogin";
/* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
"1b7-l0-nxx.title" = "Find";
/* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
"1tx-W0-xDw.title" = "Lower";
/* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
"2h7-ER-AoG.title" = "Raise";
/* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
"2oI-Rn-ZJC.title" = "Transformations";
/* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
"3IN-sU-3Bg.title" = "Spelling";
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
"3Om-Ey-2VK.title" = "Use Default";
/* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
"3rS-ZA-NoH.title" = "Speech";
/* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
"46P-cB-AYj.title" = "Tighten";
/* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
"4EN-yA-p0u.title" = "Find";
/* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
"4J7-dP-txa.title" = "Enter Full Screen";
/* Class = "NSMenuItem"; title = "Quit CloverRunAtLogin"; ObjectID = "4sb-4s-VLi"; */
"4sb-4s-VLi.title" = "Quit CloverRunAtLogin";
/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
"5QF-Oa-p0T.title" = "Edit";
/* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
"5Vv-lz-BsD.title" = "Copy Style";
/* Class = "NSMenuItem"; title = "About CloverRunAtLogin"; ObjectID = "5kV-Vb-QxS"; */
"5kV-Vb-QxS.title" = "About CloverRunAtLogin";
/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
"6dh-zS-Vam.title" = "Redo";
/* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
"78Y-hA-62v.title" = "Correct Spelling Automatically";
/* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
"8mr-sm-Yjd.title" = "Writing Direction";
/* Class = "NSTextFieldCell"; title = "Main RunAtLogin"; ObjectID = "97q-mb-A90"; */
"97q-mb-A90.title" = "Main RunAtLogin";
/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
"9ic-FL-obx.title" = "Substitutions";
/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
"9yt-4B-nSM.title" = "Smart Copy/Paste";
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
"AYu-sK-qS6.title" = "Main Menu";
/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
"BOF-NM-1cW.title" = "Preferences…";
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
"BgM-ve-c93.title" = "\tLeft to Right";
/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
"Bw7-FT-i3A.title" = "Save As…";
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
"DVo-aG-piG.title" = "Close";
/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
"Dv1-io-Yv7.title" = "Spelling and Grammar";
/* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
"F2S-fz-NVQ.title" = "Help";
/* Class = "NSMenuItem"; title = "CloverRunAtLogin Help"; ObjectID = "FKE-Sm-Kum"; */
"FKE-Sm-Kum.title" = "CloverRunAtLogin Help";
/* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
"Fal-I4-PZk.title" = "Text";
/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
"FeM-D8-WVr.title" = "Substitutions";
/* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
"GB9-OM-e27.title" = "Bold";
/* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
"GEO-Iw-cKr.title" = "Format";
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
"GUa-eO-cwY.title" = "Use Default";
/* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
"Gi5-1S-RQB.title" = "Font";
/* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
"H1b-Si-o9J.title" = "Writing Direction";
/* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
"H8h-7b-M4v.title" = "View";
/* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
"HFQ-gK-NFA.title" = "Text Replacement";
/* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
"HFo-cy-zxI.title" = "Show Spelling and Grammar";
/* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
"HyV-fh-RgO.title" = "View";
/* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
"I0S-gh-46l.title" = "Subscript";
/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
"IAo-SY-fd9.title" = "Open…";
/* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
"IQv-IB-iLA.title" = "Window";
/* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
"J5U-5w-g23.title" = "Justify";
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
"J7y-lM-qPV.title" = "Use None";
/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
"KaW-ft-85H.title" = "Revert to Saved";
/* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
"Kd2-mp-pUS.title" = "Show All";
/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
"LE2-aR-0XJ.title" = "Bring All to Front";
/* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
"LVM-kO-fVI.title" = "Paste Ruler";
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
"Lbh-J2-qVU.title" = "\tLeft to Right";
/* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
"MkV-Pr-PK5.title" = "Copy Ruler";
/* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
"NMo-om-nkz.title" = "Services";
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
"Nop-cj-93Q.title" = "\tDefault";
/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
"OY7-WF-poV.title" = "Minimize";
/* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
"OaQ-X3-Vso.title" = "Baseline";
/* Class = "NSMenuItem"; title = "Hide CloverRunAtLogin"; ObjectID = "Olw-nP-bQN"; */
"Olw-nP-bQN.title" = "Hide CloverRunAtLogin";
/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
"OwM-mh-QMV.title" = "Find Previous";
/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
"Oyz-dy-DGm.title" = "Stop Speaking";
/* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
"Ptp-SP-VEL.title" = "Bigger";
/* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
"Q5e-8K-NDq.title" = "Show Fonts";
/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
"R4o-n2-Eq4.title" = "Zoom";
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
"RB4-Sm-HuC.title" = "\tRight to Left";
/* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
"Rqc-34-cIF.title" = "Superscript";
/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
"Ruw-6m-B2m.title" = "Select All";
/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
"S0p-oC-mLd.title" = "Jump to Selection";
/* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
"Td7-aD-5lo.title" = "Window";
/* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
"UEZ-Bs-lqG.title" = "Capitalize";
/* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
"VIY-Ag-zcb.title" = "Center";
/* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
"Vdr-fp-XzO.title" = "Hide Others";
/* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
"Vjx-xi-njq.title" = "Italic";
/* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
"W48-6f-4Dl.title" = "Edit";
/* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
"WRG-CD-K1S.title" = "Underline";
/* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
"Was-JA-tGl.title" = "New";
/* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
"WeT-3V-zwk.title" = "Paste and Match Style";
/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
"Xz5-n4-O0W.title" = "Find…";
/* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
"YEy-JH-Tfz.title" = "Find and Replace…";
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
"YGs-j5-SAR.title" = "\tDefault";
/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
"Ynk-f8-cLZ.title" = "Start Speaking";
/* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
"ZM1-6Q-yy1.title" = "Align Left";
/* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
"ZvO-Gk-QUH.title" = "Paragraph";
/* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
"aTl-1u-JFS.title" = "Print…";
/* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
"aUF-d1-5bR.title" = "Window";
/* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
"aXa-aM-Jaq.title" = "Font";
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
"agt-UL-0e3.title" = "Use Default";
/* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
"bgn-CT-cEk.title" = "Show Colors";
/* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
"bib-Uj-vzu.title" = "File";
/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
"buJ-ug-pKt.title" = "Use Selection for Find";
/* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
"c8a-y6-VQd.title" = "Transformations";
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
"cDB-IK-hbR.title" = "Use None";
/* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
"cqv-fj-IhA.title" = "Selection";
/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
"cwL-P1-jid.title" = "Smart Links";
/* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
"d9M-CD-aMd.title" = "Make Lower Case";
/* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
"d9c-me-L2H.title" = "Text";
/* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
"dMs-cI-mzQ.title" = "File";
/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
"dRJ-4n-Yzg.title" = "Undo";
/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
"gVA-U4-sdL.title" = "Paste";
/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
"hQb-2v-fYv.title" = "Smart Quotes";
/* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
"hz2-CU-CR7.title" = "Check Document Now";
/* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
"hz9-B4-Xy5.title" = "Services";
/* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
"i1d-Er-qST.title" = "Smaller";
/* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
"ijk-EB-dga.title" = "Baseline";
/* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
"jBQ-r6-VK2.title" = "Kern";
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
"jFq-tB-4Kx.title" = "\tRight to Left";
/* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
"jxT-CU-nIS.title" = "Format";
/* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
"kIP-vf-haE.title" = "Show Sidebar";
/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
"mK6-2p-4JG.title" = "Check Grammar With Spelling";
/* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
"o6e-r0-MWq.title" = "Ligatures";
/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
"oas-Oc-fiZ.title" = "Open Recent";
/* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
"ogc-rX-tC1.title" = "Loosen";
/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
"pa3-QI-u2k.title" = "Delete";
/* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
"pxx-59-PXV.title" = "Save…";
/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
"q09-fT-Sye.title" = "Find Next";
/* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
"qIS-W8-SiK.title" = "Page Setup…";
/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
"rbD-Rh-wIN.title" = "Check Spelling While Typing";
/* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
"rgM-f4-ycn.title" = "Smart Dashes";
/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
"snW-S8-Cw5.title" = "Show Toolbar";
/* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
"tRr-pd-1PS.title" = "Data Detectors";
/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
"tXI-mr-wws.title" = "Open Recent";
/* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
"tlD-Oa-oAM.title" = "Kern";
/* Class = "NSMenu"; title = "CloverRunAtLogin"; ObjectID = "uQy-DD-JDr"; */
"uQy-DD-JDr.title" = "CloverRunAtLogin";
/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
"uRl-iY-unG.title" = "Cut";
/* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
"vKC-jM-MkH.title" = "Paste Style";
/* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
"vLm-3I-IUL.title" = "Show Ruler";
/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
"vNY-rz-j42.title" = "Clear Menu";
/* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
"vmV-6d-7jI.title" = "Make Upper Case";
/* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
"w0m-vy-SC9.title" = "Ligatures";
/* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
"wb2-vD-lq4.title" = "Align Right";
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
"wpr-3q-Mcd.title" = "Help";
/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
"x3v-GG-iWU.title" = "Copy";
/* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
"xQD-1f-W4t.title" = "Use All";
/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
"xrE-MZ-jX0.title" = "Speech";
/* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
"z6F-FW-3nz.title" = "Show Substitutions";

View File

@ -12,13 +12,13 @@
/* top bar menu */
"N/A" = "N/D"; // not available (please be short)
"Install Clover" = "Install Clover";
"Current Clover revision" = "Current Clover revision";
"Boot device" = "Boot Device";
"config path:" = "config path:";
"Install Clover" = "Pasang Clover";
"Current Clover revision" = "Revisi Clover Terkini";
"Boot device" = "Device Boot";
"config path:" = "Lokasi config:";
"Clover wants to mount %@" = "Clover wants to mount %@";
"Clover wants to umount %@" = "Clover wants to umount %@";
"Clover wants to mount %@" = "Clover ingin mount %@";
"Clover wants to umount %@" = "Clover ingin umount %@";
"Mount" = "Mount";
"umount" = "umount";
"mount point" = "mount point";
@ -28,136 +28,131 @@
"Theme:" = "Theme:";
"Sound:" = "Sound:";
"*Make filesystem read-write" = "*Make filesystem read-write";
"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client";
"*Require CloverDaemon" = "*Require CloverDaemon";
"Read daemon log" = "Read daemon log";
"Read bdmesg" = "Read boot log";
"*Make filesystem read-write" = "*Jadikan FileSystem Read-Write";
"*Disable Sleep Proxy Client" = "*Tiadakan Sleep Proxy Client";
"*Require CloverDaemon" = "*Butuh CloverDaemon";
"Read daemon log" = "Baca daemon log";
"Read bdmesg" = "Baca boot log";
"Install CloverDaemonNew" = "Install CloverDaemonNew";
"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew";
"Install CloverDaemonNew" = "Pasang CloverDaemonNew";
"Uninstall CloverDaemonNew" = "Copot CloverDaemonNew";
"Update" = "Update";
"Update to r%d" = "Update to r%d"; // "Update to r5101"
"Check update:" = "Check update:";
"Check now" = "Check now";
"Update" = "Perbarui";
"Update to r%d" = "Perbarui ke r%d"; // "Update to r5101"
"Check update:" = "Periksa Pembaruan:";
"Check now" = "Periksa Sekarang";
"never" = "never";
"daily" = "daily";
"weekly" = "weekly";
"monthly" = "monthly";
"last checked:" = "last checked:"; // last date update was checked. Please be short.
"never" = "Tak Pernah";
"daily" = "Harian";
"weekly" = "Mingguan";
"monthly" = "Bulanan";
"last checked:" = "Terakhir Periksa:"; // last date update was checked. Please be short.
"Run at login" = "Run at login";
"Close" = "Close"; // Close the Clover.app
"Run at login" = "Jalankan saat Login";
"Close" = "Tutup"; // Close the Clover.app
/* Installer */
"Clover Installer" = "Clover Installer";
"Select a disk.." = "Select a disk..";
"Install" = "Install";
"Uninstall" = "Uninstall";
"AltBoot" = "Alternative boot";
"Clover Installer" = "Installer Clover";
"Select a disk.." = "Pilih Disk..";
"Install" = "Pasang";
"Uninstall" = "Copot";
"AltBoot" = "Boot Alternatif";
/* Drivers */
"UEFI mandatory" = "UEFI mandatory";
"BIOS mandatory" = "BIOS mandatory";
"UEFI/Other" = "UEFI/Other";
"BIOS/Other" = "BIOS/Other";
"UEFI, but not from this installer" = "UEFI, but not from this installer";
"BIOS, but not from this installer" = "BIOS, but not from this installer";
"UEFI mandatory" = "Penting bagi UEFI";
"BIOS mandatory" = "Penting bagi BIOS";
"UEFI/Other" = "UEFI (Tambahan)";
"BIOS/Other" = "BIOS (Tambahan)";
"UEFI, but not from this installer" = "UEFI, dari sumber lain";
"BIOS, but not from this installer" = "BIOS, dari sumber lain";
"UEFI/FileSystem" = "UEFI, filesystem drivers";
"BIOS/FileSystem" = "BIOS, filesystem drivers";
"UEFI/FileSystem" = "UEFI, drivers File System";
"BIOS/FileSystem" = "BIOS, drivers File System";
"UEFI/HID" = "UEFI, Human Interface Devices";
"BIOS/HID" = "BIOS, Human Interface Devices";
"UEFI/HID" = "UEFI, drivers Perangkat HID";
"BIOS/HID" = "BIOS, drivers Perangkat HID";
"UEFI/FileVault2" = "UEFI, FileVault 2 drivers";
"BIOS/FileVault2" = "BIOS, FileVault 2 drivers";
"UEFI/FileVault2" = "UEFI, drivers FileVault2";
"BIOS/FileVault2" = "BIOS, drivers FileVault2";
"UEFI/MemoryFix" = "UEFI, memory fix drivers";
"UEFI/MemoryFix" = "UEFI, drivers Memory Fix";
"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers";
"ApfsDriverLoader.efi" = "Driver untuk memuat File System APFS dari Container bagi macOS 10.13 atau yang lebih baru.";
"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2.";
"AppleImageCodec.efi" = "Untuk decode gambar PNG dan BMP pada UI Boot.";
"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification.";
"AppleImageLoader.efi" = "Mengamankan binary driver AppleEfiFat menggunakan implementasi protokol AppleLoadImage dengan verifikasi signature EfiBinary.";
"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2.";
"AppleKeyAggregator.efi" = "Dukungan bagi Dialog UI Boot untuk FileVault2.";
"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2.";
"AppleKeyFeeder.efi" = "Dukungan Keyboard PS/2 untuk digunakan dengan FileVault2.";
"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault.";
"AppleUISupport.efi" = "Rangkaian protokol untuk mendukung EfiLoginUi bagi FileVault2.";
"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2.";
"AppleUITheme.efi" = "Mendukung Themes UI saat boot.";
"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio.";
"AptioInputFix.efi" = "Driver untuk membenahi masalah Input pada firmware UEFI, misalnya AMI Aptio.";
"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together.";
"AptioMemoryFix.efi" = "Driver pilihan untuk membenahi masalah Memori pada firmware UEFI, misalnya AMI Aptio. Firmware lainnya mungkin juga kompatibel.";
"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot.
Configure it via Startup sound output from Option menu, including:
Volume and Audio device (for supported IOAudio devices only).";
"AudioDxe.efi" = "Driver HDA untuk memainkan Startup Sound ketika Boot. Atur terlebih dahulu perangkat dan Volume Audio melalui Startup sound output yang ada di menu Options. Tidak semua perangkat IOAudio didukung, butuh NVRAM aktif.";
"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2.";
"FirmwareVolume.efi" = "Membuat FirmwareVolume dengan gambar cursor untuk FileVault2.";
"FSInject.efi" = "Provide injection of kernel extensions from Clover folder.";
"FSInject.efi" = "Menyediakan injeksi kexts dari folder CLOVER.";
"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB.";
"GrubEXFAT.efi" = "Driver File System ExFAT dari GRUB.";
"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB.";
"GrubISO9660.efi" = "Driver File System ISO9600 dari GRUB.";
"GrubNTFS.efi" = "NTFS filesystem driver from GRUB.";
"GrubNTFS.efi" = "Driver File System NTFS dari GRUB.";
"GrubUDF.efi" = "UDF filesystem driver from GRUB.";
"GrubUDF.efi" = "Driver File System UDF dari GRUB.";
"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC.";
"SMCHelper.efi" = "Memulihkan keys FakeSMC dari NVRAM";
"XhciDxe.efi" = "USB 3.0 driver";
"XhciDxe.efi" = "Driver USB 3.0";
"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2.";
"AppleEvent.uefi" = "Membuat protokol AppleEvent untuk FileVault2.";
"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol.";
"AppleGraphicsConfig.uefi" = "Membuat protokol AppleGraphicsConfig opsional.";
"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled.
Clover may not started with it and you may have wake problem in system. Use with precautions.";
"CsmVideoDxe.efi" = "Driver video untuk GUI Clover yang mendukung lebih banyak resolusi. Bergantung modul CSM di UEFI BIOS, sehingga ia menjadi enabled. Ini bisa berakibat Clover gagal Boot dan Wake di sistem bermasalah. Gunakan dengan hati-hati.";
"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS.
Usually it is already present but sometime it may be missed. In this case you should see warning on screen.";
"DataHubDxe.efi" = "Dukungan protokol DataHub yang dibutuhkan oleh MacOS. Biasanya sudah tersedia namun kadang-kadang hilang. Jika terlewatkan, maka akan muncul peringatan di layar.";
"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware.
Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it";
"EmuVariableUefi.efi" = "Solusi masalah penyimpanan variabel NVRAM di Sistem tanpa perangkat UEFI. Biasanya UEFI boot memakai NVRAM dari perangkat, namun dalam kasus tertentu driver ini tetap dibutuhkan. Gunakan (hanya) jika tanpa memakainya, Anda menemui kendala.";
"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI.";
"EnglishDxe.efi" = "Dukungan protokol UnicodeCollation bagi EFI Shell jika firmware UEFI tidak menyediakan.";
"Fat.efi" = "FAT filesystem driver.";
"Fat.efi" = "Driver File System FAT.";
"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS.";
"HashServiceFix.efi" = "Mendukung Hash jika firmware UEFI native tidak menyediakan.";
"HFSPlus.efi" = "Alternate HFS+ filesystem driver.";
"HFSPlus.efi" = "Driver File System HFS+ (versi alternatif).";
"NvmExpressDxe.efi" = "Driver for support NVM Express devices.";
"NvmExpressDxe.efi" = "Driver untuk mendukung perangkat NVMExpress.";
"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together.";
"OsxAptioFix3Drv.efi" = "Driver alternatif (v3) untuk membenahi masalah Memory di firmware UEFI.";
"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together.";
"OsxAptioFixDrv.efi" = "Driver lawas untuk membenahi masalah Memory pada firmware UEFI misalnya AMI Aptio.";
"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older.";
"OsxFatBinaryDrv.efi" = "Driver untuk mendukung FAT Binary executables bagi OS X 10.9 atau versi sebelumnya.";
"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together.";
"OsxLowMemFixDrv.efi" = "Varian sederhana driver OsxAptioFixDrv (jangan pakai bersamaan).";
"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map.";
"PartitionDxe.efi" = "Driver untuk dukungan Skema Partisi yang tidak biasa, semisal: Hybrid GPT/MBR atau Apple Partition Map.";
"Ps2MouseDxe.efi" = "PS/2 mouse driver";
"Ps2MouseDxe.efi" = "Driver Mouse PS/2";
"UsbKbDxe.efi" = "Keyboard driver for boot UI support.";
"UsbKbDxe.efi" = "Driver Keyboard USB, untuk dukungan UI boot";
"UsbMouseDxe.efi" = "USB mouse driver";
"UsbMouseDxe.efi" = "Driver Mouse USB";
"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox.";
"VBoxExt2.efi" = "Driver File System EXT2/3 dari VirtualBox.";
"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox.";
"VBoxExt4.efi" = "Driver File System EXT4 dari VirtualBox.";
"VBoxHfs.efi" = "HFS+ filesystem driver.";
"VBoxHfs.efi" = "Driver File System HFS+ dari VirtualBox.";
"VBoxIso9600.efi" = "ISO 9600 filesystem driver.";
"VBoxIso9600.efi" = "Driver File System ISO 9600.";

View File

@ -0,0 +1,163 @@
/*
Clover.app
Created by vector sigma on 27/10/2019.
Copyright © 2019 CloverHackyColor. All rights reserved.
*/
/*
Hi, some of the views are set to have a fixed width, but other may automatically
enlarge the affecting view, so please consider to translate this file keeping in mind this.
*/
/* top bar menu */
"N/A" = "N/V"; // not available (please be short)
"Install Clover" = "Instalirajte Clover";
"Current Clover revision" = "Trenutna verzija Clover-a";
"Boot device" = "Uređaj za podizanje sastava";
"config path:" = "Putanja za konfiguraciju:";
"Clover wants to mount %@" = "Clover želi %@ mount";
"Clover wants to umount %@" = "Clover želi %@ unmount";
"Mount" = "Mount";
"umount" = "Unmount";
"mount point" = "mount point";
"true" = "tačno";
"false" = "Lažno";
"Theme:" = "Tema:";
"Sound:" = "Zvuk:";
"*Make filesystem read-write" = "*Filesystem čine čitanje-Pisanje";
"*Disable Sleep Proxy Client" = "*Sleep Proxy Client deaktiviran";
"*Require CloverDaemon" = "*Tražiti CloverDaemon";
"Read daemon log" = " Čitanje Daemon log";
"Read bdmesg" = " Čitanje Boot log";
"Install CloverDaemonNew" = "Instalirati CloverDaemonNew";
"Uninstall CloverDaemonNew" = "Deinstalirati CloverDaemonNew";
"Update" = "Ažuriranje";
"Update to r%d" = "Ažurirati Verziju r%d Aktuelnu"; // "Update to r5101"
"Check update:" = "Proveriti trenutnu verziju:";
"Check now" = "Proveriti sada";
"never" = "Nikada";
"daily" = "Dnevno";
"weekly" = "Nedeljno";
"monthly" = "Mesečno";
"last checked:" = "Poslednja proverat:"; // last date update was checked. Please be short.
"Run at login" = "Pokrenuti pri prijavi";
"Close" = "Zatvoriti"; // Close the Clover.app
/* Installer */
"Clover Installer" = "Clover Instalacija";
"Select a disk.." = "Selektuj disk..";
"Install" = "Instaliraj";
"Uninstall" = "Deinstaliraj";
"AltBoot" = "AltBoot";
/* Drivers */
"UEFI mandatory" = "UEFI mandatory";
"BIOS mandatory" = "BIOS mandatory";
"UEFI/Other" = "UEFI/Other";
"BIOS/Other" = "BIOS/Other";
"UEFI, but not from this installer" = "UEFI, ali ne sa ovog instalera";
"BIOS, but not from this installer" = "BIOS, ali ne sa ovog instalera";
"UEFI/FileSystem" = "UEFI, Filesystem";
"BIOS/FileSystem" = "BIOS, Filesystem";
"UEFI/HID" = "UEFI, Human Interface Uređaj";
"BIOS/HID" = "BIOS, Human Interface Uređaj";
"UEFI/FileVault2" = "UEFI, FileVault 2 Uređaj";
"BIOS/FileVault2" = "BIOS, FileVault 2 Uređaj";
"UEFI/MemoryFix" = "UEFI, Popravka Memorijskog Uređaj";
"ApfsDriverLoader.efi" = "Podržava APFS Filesystem za =>macOS 10.13 Containern";
"AppleImageCodec.efi" = "Dekodira PNG und BMP za FileVault2.";
"AppleImageLoader.efi" = "Osigurajte AppleEfiFat binarni upravljački program s implementacijom AppleLoadImage protokola i provjerom potpisa EfiBinary.";
"AppleKeyAggregator.efi" = "Podrška za boot UI dijalog za FileVault2.";
"AppleKeyFeeder.efi" = "PS/2 Tastatura Podrška za korišćenje FileVault 2.";
"AppleUISupport.efi" = "Podrška za protokol EfiLoginUi za FileVault.";
"AppleUITheme.efi" = "Stvaranje UI Themes Boot podrške za FileVault2.";
"AptioInputFix.efi" = "Drajver za pomoć kod problema sa UEFI firmware kod AMI Aptio.";
"AptioMemoryFix.efi" = "Trenutno se preporučuje 64-bitni upravljački program za rešavanje problema s memorijom u UEFI firmware-u AMI Aptio. Ovaj upravljački program NE sme da se koristiti s drugim upravljačkim programima AptioFix.";
"AudioDxe.efi" = "HDA Dajver koji podržava zvuki pri pokretanju.
Konfigurisanje zvuka pokretanja putem izbornika Option, uključujući:
Glasnoća i audio uređaj (samo za podržane audio uređaje).";
"FirmwareVolume.efi" = "Stvara volumen firmvera sa slikama kursora za FileVault2.";
"FSInject.efi" = "Omogućuje integraciju proširenja kernela spremljenih u mapi Clover.";
"GrubEXFAT.efi" = "Upravljački program za datotečni sistem ExFAT.";
"GrubISO9660.efi" = "Upravljački program za datoteku sistema ISO9600.";
"GrubNTFS.efi" = "Upravljački program za NTFS datoteku sistema.";
"GrubUDF.efi" = "Upravljački program za UDF datoteku sistema.";
"SMCHelper.efi" = "Vraćanje NVRAM SMC ključa pomoću FakeSMC.";
"XhciDxe.efi" = "USB 3.0 Podrška";
"AppleEvent.uefi" = "Stvara AppleEvent Protokol za FileVault2.";
"AppleGraphicsConfig.uefi" = "Stvaranje opcionalnog AppleGraphicsConfig Protokola.";
"CsmVideoDxe.efi" = "64-bitni upravljački program za Clovers GUI omogućava vam više rezolucija. Na osnovu CSM modula UEFI biosa, CSM se tamo mora aktivirati. Clover se možda neće pokrenuti, mogu nastati i problemi s buđenjem sistema..
Molimo vas poduzmite mere predostrožnosti.";
"DataHubDxe.efi" = "Podrška za protokol Essential DataHub za macOS.
Obično su već dostupni, ali ponekad nedostaju. U tom slučaju trebali biste vidjeti poruku o pogrešci.";
"EmuVariableUefi.efi" = "Zaustavljanje za pripremu UEFI varijabli bez postojećeg UEFI. 64-bitni upravljački program za podršku NVRAM varijabli koje zahtijeva macOS. Većinu vremena UEFI dizanje koristi hardverski NVRAM, ali u nekoliko slučajeva je ovaj driajver potreban.
Ovaj upravljački program koristite samo ako postoje problemi bez njega.";
"EnglishDxe.efi" = "Podrška za Unicode Collation protokol za EFI Shell ne bi trebala postojati u UEFI.";
"Fat.efi" = "Upravljački program za FAT datoteku sistema.";
"HashServiceFix.efi" = "Pruža hash podršku ako nijedna nije prisutna u rodnom UEFI BIOS-u.";
"HFSPlus.efi" = "Alternativni drajver za HFS + datoteka sistema.";
"NvmExpressDxe.efi" = "Drajver za podršku NVM Express uređaje.";
"OsxAptioFix3Drv.efi" = "Alternativni drajver (v3) za rešavanje problema s memorijom u UEFI firmveru. Ovaj upravljački program NE sme se koristiti s drugim upravljačkim programima AptioFix.";
"OsxAptioFixDrv.efi" = "Stari upravljački program za ispravljanje problema s memorijom softvera UEFI, kao što je u AMI Aptio. Ovaj upravljački program NE sme se koristiti s drugim upravljačkim programima AptioFix.";
"OsxFatBinaryDrv.efi" = "Upravljački program za podršku FAT Binary izvršnih datoteka za macOS 10.9 i starije verzije.";
"OsxLowMemFixDrv.efi" = "Jednostavna verzija OsxAptioFixDrv, 64bit. ! Nikada ne koristite ovaj upravljački program s drugim AptioFix upravljačkim programima !";
"PartitionDxe.efi" = "64-bitni upravljački program koji podržava neobične tablice particija, kao što su GPT / MBR ili Apple particijska mapa.";
"Ps2MouseDxe.efi" = "Podrška PS/2 Maus, 64bit";
"UsbKbDxe.efi" = "Upravljački program za podršku tastature u korisničko sučelje tokom pokretanja.";
"UsbMouseDxe.efi" = "Drajver za USB miš, 64bit";
"VBoxExt2.efi" = "Upravljački program za datoteku sistema ext2 / 3 iz VirtualBox-a, 64bit";
"VBoxExt4.efi" = "Upravljački program za datoteku sistema ext4 iz VirtualBoxa, 64bit";
"VBoxHfs.efi" = "Upravljački program za HFS + datoteku sistema.";
"VBoxIso9600.efi" = "Upravljački program za ISO 9600 datoteku sistema.";

View File

@ -5,25 +5,26 @@
cd /tmp
journaled=0
boot1install="/tmp/boot1-install" # must be there
disk="${1}"
filesystem="${2}"
partition_scheme="${3}"
boot0="/tmp/${4}"
boot1="/tmp/${5}"
# arguments
disk="${1}" # disk0s1
filesystem="${2}" # fat32, hfs, exfat
partition_scheme="${3}" # FDisk_partition_scheme, GUID_partition_scheme
boot0="/tmp/${4}" # /tmp/boot0af, /tmp/boot0ss
boot1="/tmp/${5}" # /tmp/boot1h, /tmp/boot1f32, /tmp/boot1x etc.
bootdev="/dev/${disk}"
bootrdev=${bootdev/disk/rdisk}
bootdisk="${bootdev%s*}"
bootrdisk="${bootdisk/disk/rdisk}"
bootslice="${bootdev#*disk*s}"
boot1install="/tmp/boot1-install"
keepmounted=0
journaled=0
echo
echo "Installing boot sectors (version of Wed 6 2019, 12:03)"
echo "Installing boot sectors (version of Sun 17 2019, 12:14)"
echo
echo "disk: ${disk}"
echo "bootdev: ${bootdev}"
@ -35,8 +36,8 @@ echo "filesystem: ${filesystem}"
echo "partition_scheme: ${partition_scheme}"
echo
if [[ "$disk" != disk* ]]; then
echo "Error: target disk not specified."
if [[ "$disk" != disk*s* ]]; then
echo "Error: target disk not specified or not in the correct format as diskXsY."
exit 1
fi
@ -54,20 +55,31 @@ if [ "${filesystem}" != fat32 ] && \
exit 1
fi
if [[ ! -f "${boot0}" ]] || [[ ! -f "${boot1}" ]]; then
echo "Error: cannot found boot sectors."
if [[ ! -f "${boot0}" ]]; then
echo "Error: cannot found /tmp/boot0[af-ss] sector."
exit 1
fi
if [[ ! -f "${boot1}" ]]; then
echo "Error: cannot found /tmp/boot1[1f32-h-x] sector."
exit 1
fi
if [[ ! -f "${boot1install}" ]]; then
echo "Error: cannot found boot1-install."
echo "Error: cannot found /tmp/boot1-install."
exit 1
fi
chmod +x "${boot1install}"
rootdisk=$(LC_ALL=C diskutil info / | grep -i 'device identifier:' | awk '{print $NF}')
if [[ "${rootdisk}" == "${disk}" ]]; then
keepmounted=1
fi
echo
diskutil list
LC_ALL=C diskutil list
echo
# hfs can cause a panic writing boot sectors if journaled
@ -77,14 +89,15 @@ echo
# panic("jnl: end_tr: !!!DANGER!!! bp %p flags (0x%x) not LOCKED & DELWRI\n", bp, buf_flags(bp));
# fix? disable the journal (will be reactivated later)
if [[ $(LC_ALL=C diskutil info "${disk}" | grep 'File System Personality:') == *ournaled* ]]; then
if [[ $(LC_ALL=C diskutil info "${disk}" | grep -i 'file system personality:') == *ournaled* ]]; then
diskutil disableJournal "${disk}"
journaled=1
fi
# Try to unmount the partition first
mnt_pt=$(LC_ALL=C mount | egrep "^$bootdev on" | sed 's/^.* on *//;s/ ([^(]*//')
if [[ -n "$mnt_pt" ]]; then
if [[ $keepmounted -eq 0 ]]; then
if [[ -n "$mnt_pt" ]]; then
# Try to umount the partition with umount
umount $bootdev 2>/dev/null
if [[ $? -ne 0 ]]; then
@ -92,6 +105,7 @@ if [[ -n "$mnt_pt" ]]; then
diskutil unmount $bootdev 2>/dev/null
[[ $? -ne 0 ]] && mnt_pt=''
fi
fi
fi
### Stage 0 ###
@ -105,48 +119,16 @@ dd if="${boot0}" of=/tmp/CloverNewMBR bs=440 count=1 conv=notrunc
echo "Executing: fdisk -f /tmp/CloverNewMBR -u -y ${bootrdisk}"
fdisk -f /tmp/CloverNewMBR -u -y "${bootrdisk}"
if [[ ${filesystem} = "hfs" ]]; then
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
echo "File system is HFS."
echo "Executing: dd if=${boot1} of=${bootrdev}"
dd if="${boot1}" of="${bootrdev}"
elif [[ ${filesystem} = "fat32" ]]; then
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
# copy partition boot sector to CloverOrigPBR
echo "Executing: dd if=${bootrdev} count=1 bs=512 of=/tmp/CloverOrigPBR"
dd if="${bootrdev}" count=1 bs=512 of=/tmp/CloverOrigPBR
if [[ -n $(cat /tmp/CloverOrigPBR | grep FAT16) ]]; then
echo "boot volume format is FAT16"
echo "No Stage1 was written"
else
echo "boot volume format is FAT32"
# copy boot1f32 to CloverNewPBR
echo "Executing: cp ${boot1} /tmp/CloverNewPBR"
cp -f "${boot1}" /tmp/CloverNewPBR
# "merge" CloverOrigPBR into CloverNewPBR
echo "Executing: dd if=/tmp/CloverOrigPBR of=/tmp/CloverNewPBR skip=3 seek=3 bs=1 count=87 conv=notrunc"
dd if=/tmp/CloverOrigPBR of=/tmp/CloverNewPBR skip=3 seek=3 bs=1 count=87 conv=notrunc
# write CloverNewPBR to the partition boot sector
echo "Executing: dd if=/tmp/CloverNewPBR of=${bootrdev}"
dd if=/tmp/CloverNewPBR count=1 bs=512 of="${bootrdev}"
fi
elif [[ ${filesystem} = "exfat" ]]; then
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
echo "File system is ExFat."
echo "Executing: $boot1install -y -f ${boot1} ${bootrdev}"
"$boot1install" -y -f "${boot1}" "${bootrdev}"
### Stage 1 ###
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
if [[ $keepmounted -eq 0 ]]; then
echo "Executing: boot1-install -y -f -M "${boot1}" "${bootrdev}"
"$boot1install" -y -f -M "${boot1}" "${bootrdev}"
else
echo "Unknown boot volume format: $filesystem"
echo "No Stage1 was written"
echo "Executing: boot1-install -y -f "${boot1}" "${bootrdev}"
"$boot1install" -y -f "${boot1}" "${bootrdev}"
fi
# Now try to remount the partition
if [[ -n "$mnt_pt" ]]; then
[[ ! -d "$mnt_pt" ]] && mkdir -p "$mnt_pt"