1use crate::util::eprintln_err;
2use std::net::{TcpListener, TcpStream};
3use std::thread;
4use std::time::Duration;
5
6pub fn find_free_port(start: u16) -> u16 {
7 let first = if start == 0 { 1 } else { start };
8 let mut p = first;
9 loop {
10 match TcpListener::bind(("127.0.0.1", p)) {
11 Ok(listener) => {
12 drop(listener);
13 return p;
14 }
15 Err(_) => {
16 p = p.wrapping_add(1);
17 if p == 0 {
18 p = 1;
19 }
20 if p == first {
21 eprintln_err("No free TCP port found in range 1..=65535.");
22 std::process::exit(1);
23 }
24 }
25 }
26 }
27}
28
29pub fn wait_for_tcp(host: &str, port: u16, attempts: usize, sleep_ms: u64) {
30 for _ in 0..attempts {
31 if TcpStream::connect((host, port)).is_ok() {
32 return;
33 }
34 thread::sleep(Duration::from_millis(sleep_ms));
35 }
36}