@@ -39,6 +39,355 @@ index 2b5b5e05..60f1dde8 100644
3939 ],
4040 resources: [
4141 .copy("Foundation/Resources")
42+ diff --git a/swift-corelibs-foundation/Sources/CoreFoundation/include/ForSwiftFoundationOnly.h b/swift-corelibs-foundation/Sources/CoreFoundation/include/ForSwiftFoundationOnly.h
43+ index a2ba56cd..91a312dc 100644
44+ --- a/swift-corelibs-foundation/Sources/CoreFoundation/include/ForSwiftFoundationOnly.h
45+ +++ b/swift-corelibs-foundation/Sources/CoreFoundation/include/ForSwiftFoundationOnly.h
46+ @@ -69,6 +69,13 @@
47+ #include <sys/stat.h>
48+ #include <sys/syscall.h>
49+ #include <termios.h>
50+ + #include <linux/fcntl.h>
51+ + #ifdef __swift__
52+ + // The linux/stat header is private in the Android modulemap.
53+ + #pragma clang module import posix_filesystem.linux_stat
54+ + #else
55+ + #include <linux/stat.h>
56+ + #endif
57+ #elif TARGET_OS_WASI
58+ #include <fcntl.h>
59+ #include <sys/stat.h>
60+ diff --git a/swift-corelibs-foundation/Sources/Foundation/CGFloat.swift b/swift-corelibs-foundation/Sources/Foundation/CGFloat.swift
61+ index ffe3a6c6..c59977f8 100644
62+ --- a/swift-corelibs-foundation/Sources/Foundation/CGFloat.swift
63+ +++ b/swift-corelibs-foundation/Sources/Foundation/CGFloat.swift
64+ @@ -7,6 +7,10 @@
65+ // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
66+ //
67+
68+ + #if canImport(Android)
69+ + import Android
70+ + #endif
71+ +
72+ @frozen
73+ public struct CGFloat: Sendable {
74+ #if arch(i386) || arch(arm) || arch(wasm32)
75+ diff --git a/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift b/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift
76+ index b07c49ac..b540e284 100644
77+ --- a/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift
78+ +++ b/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift
79+ @@ -34,6 +34,11 @@ import WASILibc
80+ fileprivate let _read = WASILibc.read(_:_:_:)
81+ fileprivate let _write = WASILibc.write(_:_:_:)
82+ fileprivate let _close = WASILibc.close(_:)
83+ + #elseif canImport(Android)
84+ + import Android
85+ + fileprivate let _read = Android.read(_:_:_:)
86+ + fileprivate let _write = Android.write(_:_:_:)
87+ + fileprivate let _close = Android.close(_:)
88+ #endif
89+
90+ #if canImport(WinSDK)
91+ @@ -321,10 +326,15 @@ open class FileHandle : NSObject, @unchecked Sendable {
92+ if options.contains(.alwaysMapped) {
93+ // Filesizes are often 64bit even on 32bit systems
94+ let mapSize = min(length, Int(clamping: statbuf.st_size))
95+ + #if canImport(Android)
96+ + // Bionic mmap() now returns _Nonnull, so the force unwrap below isn't needed.
97+ let data = mmap(nil, mapSize, PROT_READ, MAP_PRIVATE, _fd, 0)
98+ + #else
99+ + let data = mmap(nil, mapSize, PROT_READ, MAP_PRIVATE, _fd, 0)!
100+ + #endif
101+ // Swift does not currently expose MAP_FAILURE
102+ if data != UnsafeMutableRawPointer(bitPattern: -1) {
103+ - return NSData.NSDataReadResult(bytes: data!, length: mapSize) { buffer, length in
104+ + return NSData.NSDataReadResult(bytes: data, length: mapSize) { buffer, length in
105+ munmap(buffer, length)
106+ }
107+ }
108+ diff --git a/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift b/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift
109+ index e89b3bf6..a82fe1c2 100644
110+ --- a/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift
111+ +++ b/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift
112+ @@ -7,6 +7,10 @@
113+ //
114+ #if !os(Windows)
115+
116+ + #if canImport(Android)
117+ + import Android
118+ + #endif
119+ +
120+ #if os(Android) && (arch(i386) || arch(arm)) // struct stat.st_mode is UInt32
121+ internal func &(left: UInt32, right: mode_t) -> mode_t {
122+ return mode_t(left) & right
123+ @@ -398,13 +402,13 @@ extension FileManager {
124+
125+ _current = fts_read(stream)
126+ while let current = _current {
127+ - let filename = FileManager.default.string(withFileSystemRepresentation: current.pointee.fts_path, length: Int(current.pointee.fts_pathlen))
128+ + let filename = FileManager.default.string(withFileSystemRepresentation: current.pointee.fts_path!, length: Int(current.pointee.fts_pathlen))
129+
130+ switch Int32(current.pointee.fts_info) {
131+ case FTS_D:
132+ let (showFile, skipDescendants) = match(filename: filename, to: _options, isDir: true)
133+ if skipDescendants {
134+ - fts_set(_stream, _current, FTS_SKIP)
135+ + fts_set(stream, current, FTS_SKIP)
136+ }
137+ if showFile {
138+ return URL(fileURLWithPath: filename, isDirectory: true)
139+ @@ -578,7 +582,7 @@ extension FileManager {
140+ let finalErrno = originalItemURL.withUnsafeFileSystemRepresentation { (originalFS) -> Int32? in
141+ return newItemURL.withUnsafeFileSystemRepresentation { (newItemFS) -> Int32? in
142+ // This is an atomic operation in many OSes, but is not guaranteed to be atomic by the standard.
143+ - if rename(newItemFS, originalFS) == 0 {
144+ + if rename(newItemFS!, originalFS!) == 0 {
145+ return nil
146+ } else {
147+ return errno
148+ diff --git a/swift-corelibs-foundation/Sources/Foundation/FileManager.swift b/swift-corelibs-foundation/Sources/Foundation/FileManager.swift
149+ index a5d75820..a19464d7 100644
150+ --- a/swift-corelibs-foundation/Sources/Foundation/FileManager.swift
151+ +++ b/swift-corelibs-foundation/Sources/Foundation/FileManager.swift
152+ @@ -21,6 +21,8 @@ import WinSDK
153+
154+ #if os(WASI)
155+ import WASILibc
156+ + #elseif canImport(Bionic)
157+ + import Bionic
158+ #endif
159+
160+ #if os(Windows)
161+ diff --git a/swift-corelibs-foundation/Sources/Foundation/Host.swift b/swift-corelibs-foundation/Sources/Foundation/Host.swift
162+ index 6c4f5291..fb130631 100644
163+ --- a/swift-corelibs-foundation/Sources/Foundation/Host.swift
164+ +++ b/swift-corelibs-foundation/Sources/Foundation/Host.swift
165+ @@ -12,8 +12,9 @@
166+ import WinSDK
167+ #endif
168+
169+ - #if os(Android)
170+ - // Android Glibc differs a little with respect to the Linux Glibc.
171+ + #if canImport(Android)
172+ + import Android
173+ + // Android Bionic differs a little with respect to the Linux Glibc.
174+
175+ // IFF_LOOPBACK is part of the enumeration net_device_flags, which needs to
176+ // convert to UInt32.
177+ @@ -24,8 +25,8 @@ import WinSDK
178+ }
179+
180+ // getnameinfo uses size_t for its 4th and 6th arguments.
181+ - private func getnameinfo(_ addr: UnsafePointer<sockaddr>?, _ addrlen: socklen_t, _ host: UnsafeMutablePointer<Int8>?, _ hostlen: socklen_t, _ serv: UnsafeMutablePointer<Int8>?, _ servlen: socklen_t, _ flags: Int32) -> Int32 {
182+ - return Glibc.getnameinfo(addr, addrlen, host, Int(hostlen), serv, Int(servlen), flags)
183+ + private func getnameinfo(_ addr: UnsafePointer<sockaddr>, _ addrlen: socklen_t, _ host: UnsafeMutablePointer<Int8>?, _ hostlen: socklen_t, _ serv: UnsafeMutablePointer<Int8>?, _ servlen: socklen_t, _ flags: Int32) -> Int32 {
184+ + return Android.getnameinfo(addr, addrlen, host, Int(hostlen), serv, Int(servlen), flags)
185+ }
186+
187+ // getifaddrs and freeifaddrs are not available in Android 6.0 or earlier, so call these functions dynamically.
188+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSData.swift b/swift-corelibs-foundation/Sources/Foundation/NSData.swift
189+ index ae54f971..65eb0d93 100644
190+ --- a/swift-corelibs-foundation/Sources/Foundation/NSData.swift
191+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSData.swift
192+ @@ -11,6 +11,9 @@
193+ #if !os(WASI)
194+ import Dispatch
195+ #endif
196+ + #if canImport(Android)
197+ + import Android
198+ + #endif
199+
200+ extension NSData {
201+ public typealias ReadingOptions = Data.ReadingOptions
202+ @@ -469,6 +472,8 @@ open class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
203+ let createMode = Int(Musl.S_IRUSR) | Int(Musl.S_IWUSR) | Int(Musl.S_IRGRP) | Int(Musl.S_IWGRP) | Int(Musl.S_IROTH) | Int(Musl.S_IWOTH)
204+ #elseif canImport(WASILibc)
205+ let createMode = Int(WASILibc.S_IRUSR) | Int(WASILibc.S_IWUSR) | Int(WASILibc.S_IRGRP) | Int(WASILibc.S_IWGRP) | Int(WASILibc.S_IROTH) | Int(WASILibc.S_IWOTH)
206+ + #elseif canImport(Android)
207+ + let createMode = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH)
208+ #endif
209+ guard let fh = FileHandle(path: path, flags: flags, createMode: createMode) else {
210+ throw _NSErrorWithErrno(errno, reading: false, path: path)
211+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSError.swift b/swift-corelibs-foundation/Sources/Foundation/NSError.swift
212+ index 6f21d3a0..dcd6f3f1 100644
213+ --- a/swift-corelibs-foundation/Sources/Foundation/NSError.swift
214+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSError.swift
215+ @@ -16,6 +16,8 @@ import Darwin
216+ import Glibc
217+ #elseif canImport(CRT)
218+ import CRT
219+ + #elseif canImport(Android)
220+ + import Android
221+ #endif
222+
223+ @_implementationOnly import CoreFoundation
224+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSLock.swift b/swift-corelibs-foundation/Sources/Foundation/NSLock.swift
225+ index fe1d08b7..9d0fadc9 100644
226+ --- a/swift-corelibs-foundation/Sources/Foundation/NSLock.swift
227+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSLock.swift
228+ @@ -11,6 +11,8 @@
229+
230+ #if canImport(Glibc)
231+ import Glibc
232+ + #elseif canImport(Bionic)
233+ + import Bionic
234+ #endif
235+
236+ #if os(Windows)
237+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift b/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift
238+ index 8043ef00..23b602f6 100644
239+ --- a/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift
240+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift
241+ @@ -10,6 +10,8 @@
242+ @_implementationOnly import CoreFoundation
243+ #if os(Windows)
244+ import WinSDK
245+ + #elseif canImport(Android)
246+ + import Android
247+ #elseif os(WASI)
248+ import WASILibc
249+ #endif
250+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSPlatform.swift b/swift-corelibs-foundation/Sources/Foundation/NSPlatform.swift
251+ index a1809026..5424f5bb 100644
252+ --- a/swift-corelibs-foundation/Sources/Foundation/NSPlatform.swift
253+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSPlatform.swift
254+ @@ -10,6 +10,9 @@
255+ #if os(macOS) || os(iOS)
256+ fileprivate let _NSPageSize = Int(vm_page_size)
257+ #elseif os(Linux) || os(Android) || os(OpenBSD)
258+ + #if canImport(Android)
259+ + import Android
260+ + #endif
261+ fileprivate let _NSPageSize = Int(getpagesize())
262+ #elseif os(Windows)
263+ import WinSDK
264+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift b/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift
265+ index 03176c17..1509c31d 100644
266+ --- a/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift
267+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift
268+ @@ -19,6 +19,8 @@ internal import Synchronization
269+ @_exported import Glibc
270+ #elseif canImport(Musl)
271+ @_exported import Musl
272+ + #elseif canImport(Bionic)
273+ + @_exported import Bionic
274+ #elseif os(WASI)
275+ @_exported import WASILibc
276+ #elseif os(Windows)
277+ diff --git a/swift-corelibs-foundation/Sources/Foundation/NSURL.swift b/swift-corelibs-foundation/Sources/Foundation/NSURL.swift
278+ index 6af73f16..9e6f20d0 100644
279+ --- a/swift-corelibs-foundation/Sources/Foundation/NSURL.swift
280+ +++ b/swift-corelibs-foundation/Sources/Foundation/NSURL.swift
281+ @@ -22,6 +22,8 @@ import Darwin
282+ import Glibc
283+ #elseif canImport(Musl)
284+ import Musl
285+ + #elseif canImport(Bionic)
286+ + import Bionic
287+ #endif
288+
289+ // NOTE: this represents PLATFORM_PATH_STYLE
290+ diff --git a/swift-corelibs-foundation/Sources/Foundation/Port.swift b/swift-corelibs-foundation/Sources/Foundation/Port.swift
291+ index c4ed8282..e71f591b 100644
292+ --- a/swift-corelibs-foundation/Sources/Foundation/Port.swift
293+ +++ b/swift-corelibs-foundation/Sources/Foundation/Port.swift
294+ @@ -107,7 +107,7 @@ fileprivate let FOUNDATION_SOCK_STREAM = SOCK_STREAM
295+ fileprivate let FOUNDATION_IPPROTO_TCP = IPPROTO_TCP
296+ #endif
297+
298+ - #if canImport(Glibc) && !os(Android) && !os(OpenBSD)
299+ + #if canImport(Glibc) && !os(OpenBSD)
300+ import Glibc
301+ fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM.rawValue)
302+ fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
303+ @@ -119,14 +119,19 @@ fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM)
304+ fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
305+ #endif
306+
307+ - #if canImport(Glibc) && os(Android) || os(OpenBSD)
308+ + #if canImport(Glibc) && os(OpenBSD)
309+ import Glibc
310+ fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM)
311+ fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
312+ fileprivate let INADDR_ANY: in_addr_t = 0
313+ - #if os(OpenBSD)
314+ fileprivate let INADDR_LOOPBACK = 0x7f000001
315+ #endif
316+ +
317+ + #if canImport(Android)
318+ + import Android
319+ + fileprivate let FOUNDATION_SOCK_STREAM = Int32(Android.SOCK_STREAM)
320+ + fileprivate let FOUNDATION_IPPROTO_TCP = Int32(Android.IPPROTO_TCP)
321+ + fileprivate let INADDR_ANY: in_addr_t = 0
322+ #endif
323+
324+
325+ diff --git a/swift-corelibs-foundation/Sources/Foundation/Process.swift b/swift-corelibs-foundation/Sources/Foundation/Process.swift
326+ index ee35c23a..5e8cfbaa 100644
327+ --- a/swift-corelibs-foundation/Sources/Foundation/Process.swift
328+ +++ b/swift-corelibs-foundation/Sources/Foundation/Process.swift
329+ @@ -18,6 +18,8 @@ import struct WinSDK.HANDLE
330+
331+ #if canImport(Darwin)
332+ import Darwin
333+ + #elseif canImport(Android)
334+ + import Android
335+ #endif
336+
337+ internal import Synchronization
338+ diff --git a/swift-corelibs-foundation/Sources/Foundation/Thread.swift b/swift-corelibs-foundation/Sources/Foundation/Thread.swift
339+ index 5e79579c..0985a482 100644
340+ --- a/swift-corelibs-foundation/Sources/Foundation/Thread.swift
341+ +++ b/swift-corelibs-foundation/Sources/Foundation/Thread.swift
342+ @@ -17,6 +17,8 @@ import WinSDK
343+ import Glibc
344+ #elseif canImport(Musl)
345+ import Musl
346+ + #elseif canImport(Bionic)
347+ + import Bionic
348+ #endif
349+
350+ // WORKAROUND_SR9811
351+ diff --git a/swift-corelibs-foundation/Sources/FoundationNetworking/HTTPCookie.swift b/swift-corelibs-foundation/Sources/FoundationNetworking/HTTPCookie.swift
352+ index e0d1cbbd..237c1daf 100644
353+ --- a/swift-corelibs-foundation/Sources/FoundationNetworking/HTTPCookie.swift
354+ +++ b/swift-corelibs-foundation/Sources/FoundationNetworking/HTTPCookie.swift
355+ @@ -15,6 +15,8 @@ import Foundation
356+
357+ #if os(Windows)
358+ import WinSDK
359+ + #elseif canImport(Android)
360+ + import Android
361+ #endif
362+
363+ public struct HTTPCookiePropertyKey : RawRepresentable, Equatable, Hashable, Sendable {
364+ diff --git a/swift-corelibs-foundation/Sources/plutil/main.swift b/swift-corelibs-foundation/Sources/plutil/main.swift
365+ index 29316d16..29584596 100644
366+ --- a/swift-corelibs-foundation/Sources/plutil/main.swift
367+ +++ b/swift-corelibs-foundation/Sources/plutil/main.swift
368+ @@ -15,6 +15,9 @@ import Glibc
369+ #elseif canImport(Musl)
370+ import Foundation
371+ import Musl
372+ + #elseif canImport(Bionic)
373+ + import Foundation
374+ + import Bionic
375+ #elseif canImport(CRT)
376+ import Foundation
377+ import CRT
378+ diff --git a/swift-corelibs-foundation/Sources/xdgTestHelper/main.swift b/swift-corelibs-foundation/Sources/xdgTestHelper/main.swift
379+ index d515a63f..fb037e24 100644
380+ --- a/swift-corelibs-foundation/Sources/xdgTestHelper/main.swift
381+ +++ b/swift-corelibs-foundation/Sources/xdgTestHelper/main.swift
382+ @@ -19,6 +19,8 @@ import FoundationNetworking
383+ #endif
384+ #if os(Windows)
385+ import WinSDK
386+ + #elseif canImport(Android)
387+ + import Android
388+ #endif
389+
390+ enum HelperCheckStatus : Int32 {
42391commit 4339393f2c1f3bceaf20bc2c25ee828a2e0394aa
43392Author: Alex Lorenz <
[email protected] >
44393Date: Thu Dec 12 07:34:34 2024 -0800
0 commit comments