Make privilege, port and fd handling reliable in tests

This commit is contained in:
evgeny committed 2026-10-10 13:09:45 +02:00
1 parent 5a9e61164b
commit 3f9edc88c4
6 files changed
+71 -7

No files matched your search

+17 -1
View File
@@ -335,11 +335,27 @@ struct stcp_server *stcp_server_create(struct UASYNC *ua, uint16_t port,
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "listen failed err=%d", socket_get_error());
socket_close_wrapper(srv->listen_sock); u_free(srv); return NULL;
}
uint16_t bound_port = stcp_server_get_port(srv);
if (!bound_port) { socket_close_wrapper(srv->listen_sock); u_free(srv); return NULL; }
srv->listen_id = uasync_add_socket_t(ua, srv->listen_sock, server_accept_cb, NULL, NULL, "stcp_listen", srv);
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "stcp_server: listening on port %u family=%s", port, use_family == AF_INET ? "v4" : "v6");
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "stcp_server: listening on port %u family=%s", bound_port, use_family == AF_INET ? "v4" : "v6");
return srv;
}
uint16_t stcp_server_get_port(const struct stcp_server *srv) {
if (!srv) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "stcp_server_get_port: invalid server"); return 0; }
struct sockaddr_storage address;
socklen_t size = sizeof(address);
if (getsockname(srv->listen_sock, (struct sockaddr *)&address, &size) != 0) {
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "stcp_server_get_port: getsockname failed err=%d", socket_get_error());
return 0;
}
if (address.ss_family == AF_INET) return ntohs(((struct sockaddr_in *)&address)->sin_port);
if (address.ss_family == AF_INET6) return ntohs(((struct sockaddr_in6 *)&address)->sin6_port);
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "stcp_server_get_port: unexpected family=%d", address.ss_family);
return 0;
}
void stcp_server_destroy(struct stcp_server *srv) {
if (!srv) return;
if (srv->listen_id) uasync_remove_socket_t(srv->ua, srv->listen_sock);
+2
View File
@@ -24,6 +24,8 @@ struct stcp_server *stcp_server_create(struct UASYNC *ua, uint16_t port,
stcp_connect_cb connect_cb, void *arg,
stcp_close_cb close_cb, void *close_arg,
int family);
// Фактический TCP-порт слушателя (port=0 при create выбирает ОС); 0 при ошибке.
uint16_t stcp_server_get_port(const struct stcp_server *srv);
void stcp_server_destroy(struct stcp_server *srv);
// Включить REALITY-камуфляж на этом TCP-сервере: перед STCP-хендшейком сервер