mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-09-25 18:33:56 +00:00
Rename the project to shadowsocks-c while retaining ss-* commands, the embedding ABI, and legacy library/package lookup compatibility.
Replace libev with bundled libuv for IOCP/kqueue event backends, expand asynchronous runtime DNS coverage, and add actionlint/Ruff with strict clang-tidy failure handling. Validate native platforms, static builds, packaging, interoperability, sanitizers, and canonical/legacy consumers.
All 22 hosted checks pass at reviewed head a8493250eb.
57 lines
1.9 KiB
C
57 lines
1.9 KiB
C
/* Exercise real c-ares cancellation with outstanding A and AAAA requests. */
|
|
#include "test_helpers.h"
|
|
#include "ss_event.h"
|
|
#include "resolv.h"
|
|
|
|
int verbose = 0;
|
|
struct result { unsigned called, freed; };
|
|
static void resolved(struct sockaddr *address, void *data)
|
|
{
|
|
struct result *result = data;
|
|
assert(address == NULL);
|
|
assert(result->freed == 0);
|
|
result->called++;
|
|
}
|
|
static void released(void *data)
|
|
{
|
|
struct result *result = data;
|
|
assert(result->called == 1);
|
|
result->freed++;
|
|
}
|
|
int main(void)
|
|
{
|
|
test_network_init();
|
|
/* A bound but unread UDP socket prevents DNS responses or ICMP rejection;
|
|
* the test needs no external DNS server or connectivity. */
|
|
ss_socket_t sink = socket(AF_INET, SOCK_DGRAM, 0);
|
|
struct sockaddr_in address = {0};
|
|
address.sin_family = AF_INET;
|
|
address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
assert(bind(sink, (struct sockaddr *)&address, sizeof(address)) == 0);
|
|
socklen_t size = sizeof(address);
|
|
assert(getsockname(sink, (struct sockaddr *)&address, &size) == 0);
|
|
char nameserver[64];
|
|
snprintf(nameserver, sizeof(nameserver), "127.0.0.1:%u", ntohs(address.sin_port));
|
|
struct ss_loop *loop = ss_loop_new(0);
|
|
assert(loop != NULL);
|
|
for (unsigned round = 0; round < 3; round++) {
|
|
struct result results[64] = {{0}};
|
|
assert(resolv_init(loop, nameserver, 0) == 0);
|
|
for (unsigned i = 0; i < 64; i++) {
|
|
char hostname[64];
|
|
snprintf(hostname, sizeof(hostname), "pending-%u.invalid", i);
|
|
resolv_start(hostname, htons(443), resolved, released, &results[i]);
|
|
}
|
|
ss_run(loop, SS_RUN_NOWAIT);
|
|
resolv_shutdown(loop);
|
|
for (unsigned i = 0; i < 64; i++) {
|
|
assert(results[i].called == 1);
|
|
assert(results[i].freed == 1);
|
|
}
|
|
assert(ss_run(loop, SS_RUN_NOWAIT) == 0);
|
|
}
|
|
ss_loop_destroy(loop);
|
|
ss_socket_close(sink);
|
|
return 0;
|
|
}
|