Skip to content

Commit 5aafde3

Browse files
committed
Workaround broken glibc modulemap
We have been running into modularization issues on newer versions of various Linux distros, resulting in the compiler saying that the Glibc module doesn't have a SOCK_STREAM or SOCK_DGRAM. From some poking around, the definition is now coming from the CoreFoundation module as far as Swift is concerned. This is ultimately because our modulemap for Glibc is bad, but also means that I can't bring up Swift 6 on all of the Linux distros that 5.10 has support for. This workaround removes the explicit module name from `SOCK_STREAM` and renames it to `FOUNDATION_SOCK_STREAM` to avoid an ambiguous name, and completely removes `SOCK_DGRAM`. Both SOCK_STREAM and SOCK_DGRAM are fileprivates, so changing them will have no visible external effect. It is true that if another header somewhere defines `SOCK_STREAM`, we may pick it up instead of the definition from the glibc module, but that will also cause some nasty surprises to anyone using that header in C, so it is unlikely. Fixes: rdar://128079849
1 parent a4995d0 commit 5aafde3

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

Sources/Foundation/Port.swift

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,14 @@ open class SocketPort: Port {}
9292

9393
#if canImport(Glibc) && !os(Android) && !os(OpenBSD)
9494
import Glibc
95-
fileprivate let SOCK_STREAM = Int32(Glibc.SOCK_STREAM.rawValue)
96-
fileprivate let SOCK_DGRAM = Int32(Glibc.SOCK_DGRAM.rawValue)
97-
fileprivate let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP)
95+
fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM.rawValue)
96+
fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
9897
#endif
9998

10099
#if canImport(Glibc) && os(Android) || os(OpenBSD)
101100
import Glibc
102-
fileprivate let SOCK_STREAM = Int32(Glibc.SOCK_STREAM)
103-
fileprivate let SOCK_DGRAM = Int32(Glibc.SOCK_DGRAM)
104-
fileprivate let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP)
101+
fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM)
102+
fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
105103
fileprivate let INADDR_ANY: in_addr_t = 0
106104
#if os(OpenBSD)
107105
fileprivate let INADDR_LOOPBACK = 0x7f000001
@@ -123,7 +121,8 @@ import WinSDK
123121
fileprivate typealias sa_family_t = ADDRESS_FAMILY
124122
fileprivate typealias in_port_t = USHORT
125123
fileprivate typealias in_addr_t = UInt32
126-
fileprivate let IPPROTO_TCP = Int32(WinSDK.IPPROTO_TCP.rawValue)
124+
fileprivate let FOUNDATION_SOCK_STREAM = SOCK_STREAM
125+
fileprivate let FOUNDATION_IPPROTO_TCP = Int32(WinSDK.IPPROTO_TCP.rawValue)
127126
#endif
128127

129128
// MARK: Darwin representation of socket addresses
@@ -484,7 +483,7 @@ open class SocketPort : Port {
484483

485484
let data = withUnsafeBytes(of: address) { Data($0) }
486485

487-
self.init(protocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
486+
self.init(protocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
488487
}
489488

490489
private final func createNonuniquedCore(from socket: CFSocket, protocolFamily family: Int32, socketType type: Int32, protocol: Int32) {
@@ -500,7 +499,7 @@ open class SocketPort : Port {
500499
var context = CFSocketContext()
501500
context.info = Unmanaged.passUnretained(self).toOpaque()
502501
var s: CFSocket
503-
if type == SOCK_STREAM {
502+
if type == FOUNDATION_SOCK_STREAM {
504503
s = CFSocketCreate(nil, family, type, `protocol`, CFOptionFlags(kCFSocketAcceptCallBack), __NSFireSocketAccept, &context)
505504
} else {
506505
s = CFSocketCreate(nil, family, type, `protocol`, CFOptionFlags(kCFSocketDataCallBack), __NSFireSocketDatagram, &context)
@@ -519,7 +518,7 @@ open class SocketPort : Port {
519518
var context = CFSocketContext()
520519
context.info = Unmanaged.passUnretained(self).toOpaque()
521520
var s: CFSocket
522-
if type == SOCK_STREAM {
521+
if type == FOUNDATION_SOCK_STREAM {
523522
s = CFSocketCreateWithNative(nil, CFSocketNativeHandle(sock), CFOptionFlags(kCFSocketAcceptCallBack), __NSFireSocketAccept, &context)
524523
} else {
525524
s = CFSocketCreateWithNative(nil, CFSocketNativeHandle(sock), CFOptionFlags(kCFSocketDataCallBack), __NSFireSocketDatagram, &context)
@@ -543,7 +542,7 @@ open class SocketPort : Port {
543542
sinAddr.sin_addr = inAddr
544543

545544
let data = withUnsafeBytes(of: sinAddr) { Data($0) }
546-
self.init(remoteWithProtocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
545+
self.init(remoteWithProtocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
547546
return
548547
}
549548
}
@@ -556,7 +555,7 @@ open class SocketPort : Port {
556555
sinAddr.sin6_addr = in6Addr
557556

558557
let data = withUnsafeBytes(of: sinAddr) { Data($0) }
559-
self.init(remoteWithProtocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
558+
self.init(remoteWithProtocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
560559
return
561560
}
562561
}
@@ -573,7 +572,7 @@ open class SocketPort : Port {
573572
withUnsafeBytes(of: in_addr_t(INADDR_LOOPBACK).bigEndian) { buffer.copyMemory(from: $0) }
574573
}
575574
let data = withUnsafeBytes(of: sinAddr) { Data($0) }
576-
self.init(remoteWithProtocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
575+
self.init(remoteWithProtocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
577576
}
578577

579578
private static let remoteSocketCoresLock = NSLock()
@@ -1049,7 +1048,7 @@ open class SocketPort : Port {
10491048
if let connector = core.connectors[signature], CFSocketIsValid(connector) {
10501049
return connector
10511050
} else {
1052-
if signature.socketType == SOCK_STREAM {
1051+
if signature.socketType == FOUNDATION_SOCK_STREAM {
10531052
if let connector = CFSocketCreate(nil, socketKind.protocolFamily, socketKind.socketType, socketKind.protocol, CFOptionFlags(kCFSocketDataCallBack), __NSFireSocketData, &context), CFSocketIsValid(connector) {
10541053
var timeout = time - Date.timeIntervalSinceReferenceDate
10551054
if timeout < 0 || timeout >= SocketPort.maximumTimeout {

0 commit comments

Comments
 (0)