Skip to content

Commit 7253510

Browse files
committed
Replaced lsof with direct TCP socket connect
1 parent 81d204a commit 7253510

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

MistServerManager.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,22 @@ class MistServerManager {
110110
}
111111

112112
func isPortListening(_ port: Int) -> Bool {
113-
let output = runShellCommandWithOutput(
114-
"/usr/sbin/lsof", arguments: ["-i", ":\(port)", "-sTCP:LISTEN"])
115-
return output.contains("LISTEN")
113+
// Direct TCP connect — works regardless of process owner (root vs user)
114+
var addr = sockaddr_in()
115+
addr.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
116+
addr.sin_family = sa_family_t(AF_INET)
117+
addr.sin_port = UInt16(port).bigEndian
118+
addr.sin_addr.s_addr = inet_addr("127.0.0.1")
119+
let sock = socket(AF_INET, SOCK_STREAM, 0)
120+
guard sock >= 0 else { return false }
121+
defer { Darwin.close(sock) }
122+
var tv = timeval(tv_sec: 1, tv_usec: 0)
123+
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv, socklen_t(MemoryLayout<timeval>.size))
124+
return withUnsafePointer(to: &addr) { ptr in
125+
ptr.withMemoryRebound(to: sockaddr.self, capacity: 1) { sockPtr in
126+
Darwin.connect(sock, sockPtr, socklen_t(MemoryLayout<sockaddr_in>.size))
127+
}
128+
} == 0
116129
}
117130

118131
// MARK: - LaunchAgent Plist

0 commit comments

Comments
 (0)