Files

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)
}
}