Skip to content

Instantly share code, notes, and snippets.

@atierian
Created August 31, 2023 15:25
Show Gist options
  • Save atierian/4fe4f49b82ffae37d7f592579843e5c1 to your computer and use it in GitHub Desktop.
Save atierian/4fe4f49b82ffae37d7f592579843e5c1 to your computer and use it in GitHub Desktop.
utsname / DeviceInfo
@dynamicMemberLookup
public struct Device {
public let info: Info
public subscript<T>(dynamicMember keyPath: KeyPath<Info, T>) -> T {
info[keyPath: keyPath]
}
}
extension Device: Equatable {
public static func == (lhs: Device, rhs: Device) -> Bool {
return lhs.info == rhs.info
}
}
extension Device: Hashable {}
extension Device {
public static var current: Device {
Device(info: info)
}
public struct Info: Equatable, Hashable {
public let sysname: String
public let nodename: String
public let release: String
public let version: String
public let machine: String
}
// https://opensource.apple.com/source/xnu/xnu-201/bsd/sys/utsname.h.auto.html
static let info: Info = {
func value(
from p: UnsafeMutablePointer<utsname>,
_ keyPath: KeyPath<utsname, utsname_prop>
) -> String {
var property = p.pointee[keyPath: keyPath]
return withUnsafePointer(to: &property) {
$0.withMemoryRebound(
to: CChar.self,
capacity: 1,
String.init(cString:)
)
}
}
let sysInfo = UnsafeMutablePointer<utsname>
.allocate(capacity: 1)
sysInfo.initialize(to: utsname())
uname(sysInfo)
return Info(
sysname: value(from: sysInfo, \.sysname),
nodename: value(from: sysInfo, \.nodename),
release: value(from: sysInfo, \.release),
version: value(from: sysInfo, \.version),
machine: value(from: sysInfo, \.machine)
)
}()
}
extension Device.Info: CustomDebugStringConvertible {
public var debugDescription: String {
"""
Info(
sysname: "\(sysname)",
nodename: "\(nodename)",
release: "\(release)",
machine: "\(machine)",
version: "\(version)"
)
"""
}
}
typealias utsname_prop = (CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment