From 3799e893926d7fd0601eed1e2f86cc4b80b5c471 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 20 Nov 2023 09:03:00 -0800 Subject: [PATCH] PackagePlugin: silence a deprecation warning on Windows Prefer to use the microsoft recommended function for errno string description conversion. This silences a warning and relies on "safer" alternatives (at least ones which will not use a global shared buffer). --- Sources/PackagePlugin/Plugin.swift | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Sources/PackagePlugin/Plugin.swift b/Sources/PackagePlugin/Plugin.swift index 2fde01defaf..e9f68d5629f 100644 --- a/Sources/PackagePlugin/Plugin.swift +++ b/Sources/PackagePlugin/Plugin.swift @@ -26,6 +26,16 @@ internal func close(_ fd: CInt) -> CInt { internal func fileno(_ fh: UnsafeMutablePointer?) -> CInt { return _fileno(fh) } + +internal func strerror(_ errno: CInt) -> String? { + // MSDN indicates that the returned string can have a maximum of 94 + // characters, so allocate 95 characters. + return withUnsafeTemporaryAllocation(of: wchar_t.self, capacity: 95) { + let result = _wcserror_s($0.baseAddress, $0.count, errno) + guard result == 0, let baseAddress = $0.baseAddress else { return nil } + return String(decodingCString: baseAddress, as: UTF16.self) + } +} #endif // @@ -267,8 +277,12 @@ extension Plugin { // Private function to construct an error message from an `errno` code. fileprivate static func describe(errno: Int32) -> String { +#if os(Windows) + return strerror(errno) ?? String(errno) +#else if let cStr = strerror(errno) { return String(cString: cStr) } return String(describing: errno) +#endif } }