@@ -77,15 +77,23 @@ open class ProcessInfo: NSObject {
77
77
}
78
78
79
79
open var operatingSystemVersionString : String {
80
- return CFCopySystemVersionString ( ) ? . _swiftObject ?? " Unknown "
80
+ let fallback = " Unknown "
81
+ #if os(Linux)
82
+ let version = try ? String ( contentsOf: URL ( fileURLWithPath: " /proc/version_signature " , isDirectory: false ) , encoding: . utf8)
83
+ return version ?? fallback
84
+ #else
85
+ return CFCopySystemVersionString ( ) ? . _swiftObject ?? fallback
86
+ #endif
81
87
}
82
88
83
89
open var operatingSystemVersion : OperatingSystemVersion {
84
90
// The following fallback values match Darwin Foundation
85
91
let fallbackMajor = - 1
86
92
let fallbackMinor = 0
87
93
let fallbackPatch = 0
88
-
94
+ let versionString : String
95
+
96
+ #if canImport(Darwin)
89
97
guard let systemVersionDictionary = _CFCopySystemVersionDictionary ( ) else {
90
98
return OperatingSystemVersion ( majorVersion: fallbackMajor, minorVersion: fallbackMinor, patchVersion: fallbackPatch)
91
99
}
@@ -94,8 +102,19 @@ open class ProcessInfo: NSObject {
94
102
guard let productVersion = unsafeBitCast ( CFDictionaryGetValue ( systemVersionDictionary, productVersionKey) , to: NSString ? . self) else {
95
103
return OperatingSystemVersion ( majorVersion: fallbackMajor, minorVersion: fallbackMinor, patchVersion: fallbackPatch)
96
104
}
97
-
98
- let versionComponents = productVersion. _swiftObject. split ( separator: " . " ) . map ( String . init) . compactMap ( { Int ( $0) } )
105
+ versionString = productVersion. _swiftObject
106
+ #else
107
+ var utsNameBuffer = utsname ( )
108
+ guard uname ( & utsNameBuffer) == 0 else {
109
+ return OperatingSystemVersion ( majorVersion: fallbackMajor, minorVersion: fallbackMinor, patchVersion: fallbackPatch)
110
+ }
111
+ let release = withUnsafePointer ( to: & utsNameBuffer. release. 0 ) {
112
+ return String ( cString: $0)
113
+ }
114
+ let idx = release. firstIndex ( of: " - " ) ?? release. endIndex
115
+ versionString = String ( release [ ..< idx] )
116
+ #endif
117
+ let versionComponents = versionString. split ( separator: " . " ) . map ( String . init) . compactMap ( { Int ( $0) } )
99
118
let majorVersion = versionComponents. dropFirst ( 0 ) . first ?? fallbackMajor
100
119
let minorVersion = versionComponents. dropFirst ( 1 ) . first ?? fallbackMinor
101
120
let patchVersion = versionComponents. dropFirst ( 2 ) . first ?? fallbackPatch
0 commit comments