39 lines
1.3 KiB
Swift
39 lines
1.3 KiB
Swift
import Darwin
|
|
import Foundation
|
|
import IOKit
|
|
|
|
enum Sysctl {
|
|
static func int(_ name: String) -> Int? {
|
|
var value: Int64 = 0
|
|
var size = MemoryLayout<Int64>.size
|
|
guard sysctlbyname(name, &value, &size, nil, 0) == 0 else { return nil }
|
|
// 32 位值只写入低 4 字节
|
|
return size == MemoryLayout<Int32>.size ? Int(Int32(truncatingIfNeeded: value)) : Int(value)
|
|
}
|
|
|
|
static func string(_ name: String) -> String? {
|
|
var size = 0
|
|
guard sysctlbyname(name, nil, &size, nil, 0) == 0, size > 0 else { return nil }
|
|
var buffer = [CChar](repeating: 0, count: size)
|
|
guard sysctlbyname(name, &buffer, &size, nil, 0) == 0 else { return nil }
|
|
return String(nullTerminated: buffer)
|
|
}
|
|
}
|
|
|
|
enum IORegistry {
|
|
static func property(_ service: io_registry_entry_t, _ key: String) -> Any? {
|
|
IORegistryEntryCreateCFProperty(service, key as CFString, kCFAllocatorDefault, 0)?.takeRetainedValue()
|
|
}
|
|
|
|
static func string(fromData value: Any?) -> String? {
|
|
guard let data = value as? Data else { return value as? String }
|
|
return String(decoding: data.prefix { $0 != 0 }, as: UTF8.self)
|
|
}
|
|
}
|
|
|
|
extension String {
|
|
init(nullTerminated buffer: [CChar]) {
|
|
self = String(decoding: buffer.prefix { $0 != 0 }.map { UInt8(bitPattern: $0) }, as: UTF8.self)
|
|
}
|
|
}
|