From eb22fc8d42301aa1ef5cfbbea3ba7bb2b2630855 Mon Sep 17 00:00:00 2001 From: Cole Feuer <13751213+tagavari@users.noreply.github.com> Date: Wed, 20 Jul 2022 14:00:06 -0400 Subject: [PATCH] Don't raise SIGPIPE on connected TCP clients --- AirMessage/Connection/Direct/DataProxyTCP.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/AirMessage/Connection/Direct/DataProxyTCP.swift b/AirMessage/Connection/Direct/DataProxyTCP.swift index ce22a2d..2dabfdb 100644 --- a/AirMessage/Connection/Direct/DataProxyTCP.swift +++ b/AirMessage/Connection/Direct/DataProxyTCP.swift @@ -50,8 +50,8 @@ class DataProxyTCP: DataProxy { } //Configure the socket - var opt: Int32 = -1 - let setOptResult = setsockopt(socketHandle.fileDescriptor, SOL_SOCKET, SO_REUSEADDR, &opt, socklen_t(MemoryLayout.size)) + var opt: Int32 = 1 + let setOptResult = setsockopt(socketHandle.fileDescriptor, SOL_SOCKET, SO_REUSEADDR, &opt, socklen_t(MemoryLayout.size(ofValue: opt))) guard setOptResult == 0 else { LogManager.log("Failed to set socket opt: \(errno)", level: .error) @@ -102,6 +102,18 @@ class DataProxyTCP: DataProxy { return } + //Configure the socket to not raise SIGPIPE + var opt: Int32 = 1 + let setOptResult = setsockopt(clientFD, SOL_SOCKET, SO_NOSIGPIPE, &opt, socklen_t(MemoryLayout.size(ofValue: opt))) + guard setOptResult == 0 else { + LogManager.log("Failed to set client socket opt: \(errno)", level: .error) + + if let self = self, self.serverRunning { + self.delegate?.dataProxy(self, didStopWithState: .errorTCPInternal, isRecoverable: false) + } + return + } + //Get the client address let clientAddress: String switch Int32(addr.sa_family) {