Skip to content

Commit 7e53507

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 ca3669e commit 7e53507

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

Sources/Foundation/Port.swift

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,22 @@ open class SocketPort: Port {}
9090

9191
#else
9292

93+
#if canImport(Darwin)
94+
import Darwin
95+
fileprivate let FOUNDATION_SOCK_STREAM = SOCK_STREAM
96+
fileprivate let FOUNDATION_IPPROTO_TCP = IPPROTO_TCP
97+
#endif
98+
9399
#if canImport(Glibc) && !os(Android) && !os(OpenBSD)
94100
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)
101+
fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM.rawValue)
102+
fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
98103
#endif
99104

100105
#if canImport(Glibc) && os(Android) || os(OpenBSD)
101106
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)
107+
fileprivate let FOUNDATION_SOCK_STREAM = Int32(SOCK_STREAM)
108+
fileprivate let FOUNDATION_IPPROTO_TCP = Int32(IPPROTO_TCP)
105109
fileprivate let INADDR_ANY: in_addr_t = 0
106110
#if os(OpenBSD)
107111
fileprivate let INADDR_LOOPBACK = 0x7f000001
@@ -123,7 +127,8 @@ import WinSDK
123127
fileprivate typealias sa_family_t = ADDRESS_FAMILY
124128
fileprivate typealias in_port_t = USHORT
125129
fileprivate typealias in_addr_t = UInt32
126-
fileprivate let IPPROTO_TCP = Int32(WinSDK.IPPROTO_TCP.rawValue)
130+
fileprivate let FOUNDATION_SOCK_STREAM = SOCK_STREAM
131+
fileprivate let FOUNDATION_IPPROTO_TCP = Int32(WinSDK.IPPROTO_TCP.rawValue)
127132
#endif
128133

129134
// MARK: Darwin representation of socket addresses
@@ -484,7 +489,7 @@ open class SocketPort : Port {
484489

485490
let data = withUnsafeBytes(of: address) { Data($0) }
486491

487-
self.init(protocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
492+
self.init(protocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
488493
}
489494

490495
private final func createNonuniquedCore(from socket: CFSocket, protocolFamily family: Int32, socketType type: Int32, protocol: Int32) {
@@ -500,7 +505,7 @@ open class SocketPort : Port {
500505
var context = CFSocketContext()
501506
context.info = Unmanaged.passUnretained(self).toOpaque()
502507
var s: CFSocket
503-
if type == SOCK_STREAM {
508+
if type == FOUNDATION_SOCK_STREAM {
504509
s = CFSocketCreate(nil, family, type, `protocol`, CFOptionFlags(kCFSocketAcceptCallBack), __NSFireSocketAccept, &context)
505510
} else {
506511
s = CFSocketCreate(nil, family, type, `protocol`, CFOptionFlags(kCFSocketDataCallBack), __NSFireSocketDatagram, &context)
@@ -519,7 +524,7 @@ open class SocketPort : Port {
519524
var context = CFSocketContext()
520525
context.info = Unmanaged.passUnretained(self).toOpaque()
521526
var s: CFSocket
522-
if type == SOCK_STREAM {
527+
if type == FOUNDATION_SOCK_STREAM {
523528
s = CFSocketCreateWithNative(nil, CFSocketNativeHandle(sock), CFOptionFlags(kCFSocketAcceptCallBack), __NSFireSocketAccept, &context)
524529
} else {
525530
s = CFSocketCreateWithNative(nil, CFSocketNativeHandle(sock), CFOptionFlags(kCFSocketDataCallBack), __NSFireSocketDatagram, &context)
@@ -543,7 +548,7 @@ open class SocketPort : Port {
543548
sinAddr.sin_addr = inAddr
544549

545550
let data = withUnsafeBytes(of: sinAddr) { Data($0) }
546-
self.init(remoteWithProtocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
551+
self.init(remoteWithProtocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
547552
return
548553
}
549554
}
@@ -556,7 +561,7 @@ open class SocketPort : Port {
556561
sinAddr.sin6_addr = in6Addr
557562

558563
let data = withUnsafeBytes(of: sinAddr) { Data($0) }
559-
self.init(remoteWithProtocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
564+
self.init(remoteWithProtocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
560565
return
561566
}
562567
}
@@ -573,7 +578,7 @@ open class SocketPort : Port {
573578
withUnsafeBytes(of: in_addr_t(INADDR_LOOPBACK).bigEndian) { buffer.copyMemory(from: $0) }
574579
}
575580
let data = withUnsafeBytes(of: sinAddr) { Data($0) }
576-
self.init(remoteWithProtocolFamily: PF_INET, socketType: SOCK_STREAM, protocol: IPPROTO_TCP, address: data)
581+
self.init(remoteWithProtocolFamily: PF_INET, socketType: FOUNDATION_SOCK_STREAM, protocol: FOUNDATION_IPPROTO_TCP, address: data)
577582
}
578583

579584
private static let remoteSocketCoresLock = NSLock()
@@ -1049,7 +1054,7 @@ open class SocketPort : Port {
10491054
if let connector = core.connectors[signature], CFSocketIsValid(connector) {
10501055
return connector
10511056
} else {
1052-
if signature.socketType == SOCK_STREAM {
1057+
if signature.socketType == FOUNDATION_SOCK_STREAM {
10531058
if let connector = CFSocketCreate(nil, socketKind.protocolFamily, socketKind.socketType, socketKind.protocol, CFOptionFlags(kCFSocketDataCallBack), __NSFireSocketData, &context), CFSocketIsValid(connector) {
10541059
var timeout = time - Date.timeIntervalSinceReferenceDate
10551060
if timeout < 0 || timeout >= SocketPort.maximumTimeout {

0 commit comments

Comments
 (0)