@@ -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