int find_available_port(uint32_t base_port)
{
int ret = 0;
- /* TODO: additional check for sdb and gdb port using for redirection */
- ret = check_port_bind_listen(base_port + ECS_INDEX);
- if (ret > 0) {
- emul_vm_base_socket = ret;
- } else {
- LOG_INFO("socket close. port:%d\n", base_port + ECS_INDEX);
+ int i = 0;
+ for (i = SDB_INDEX; i <= ECS_INDEX; i++) {
+ ret = check_port_bind_listen(base_port + i);
+ if (ret >= 0 && i != ECS_INDEX) {
+ //TODO: Because of checking and closing socket,
+ // not guaranteed fully that sdb/gdb port is available,
+ // when the time call net_slirp_redir()
+ closesocket(ret);
+ } else if (ret < 0) {
+ LOG_INFO("port(%"PRIu32") is reserved.\n", base_port + i);
+ return -1;
+ }
}
+ // save ecs socket fd as global variable
+ emul_vm_base_socket = ret;
+ LOG_INFO("find available port: %"PRIu32"\n", base_port);
return ret;
}