AtlatestRepositorysigil-tls
1
/* Exercise public native entry points and per-attempt result ownership. */2
#include "../../native/tls.c"3
static Value field(SigilVM *vm, Value result, const char *name) {4
return sigil_dict_ref(vm, result, sigil_intern_keyword(vm, name, strlen(name)));5
}6
static const char *text_value(Value value) {7
return sigil_is_string(value) ? ((SigilString *)sigil_as_ptr(value))->data : "none";8
}9
int main(int argc, char **argv)10
{11
if (argc < 3) return 64;12
SigilVM *vm = sigil_vm_create();13
if (!vm) return 70;14
sigil__init_sigil_tls_module(vm);15
if (argc > 3) {16
ensure_tls_initialized();17
mbedtls_x509_crt_free(&global_cacert);18
mbedtls_x509_crt_init(&global_cacert);19
if (mbedtls_x509_crt_parse_file(&global_cacert, argv[3]) != 0) return 65;20
global_cacert_loaded = 1;21
}22
int repeat = getenv("PROBE_REPEAT") ? atoi(getenv("PROBE_REPEAT")) : 1;23
int exit_code = 0;24
for (int i = 0; i < repeat; i++) {25
const char *host = i == 0 && getenv("PROBE_FIRST_BAD_HOST") ? "127.0.0.1" : argv[1];26
Value args[] = {sigil_make_string(vm, host, strlen(host)),27
sigil_fixnum(atoi(argv[2])), sigil_fixnum(3000), sigil_fixnum(1500)};28
sigil__gc_push_temp_root(vm, args[0]);29
long start = sigil_tls_now_ms();30
Value result = native_tls_connect_details(vm, 4, args);31
sigil__gc_push_temp_root(vm, result);32
Value conn = field(vm, result, "connection");33
printf("attempt=%d status=%s error=%ld state=%s protocol=%s verify=%ld elapsed=%ld\n",34
i, text_value(field(vm, result, "status")), (long)sigil_as_fixnum(field(vm, result, "error-code")),35
text_value(field(vm, result, "handshake-state")), text_value(field(vm, result, "protocol")),36
(long)sigil_as_fixnum(field(vm, result, "verify-flags")), sigil_tls_now_ms() - start);37
if (is_tls_connection(conn)) {38
if (getenv("PROBE_ECHO")) {39
const char *payload = "sigil-tls-roundtrip-0123456789";40
Value write_args[] = {conn, sigil_make_string(vm, payload, strlen(payload))};41
sigil__gc_push_temp_root(vm, write_args[1]);42
Value n = native_tls_write(vm, 2, write_args);43
if (!sigil_is_fixnum(n) || sigil_as_fixnum(n) != (int)strlen(payload)) return 71;44
sigil__gc_pop_temp_root(vm);45
Value read_args[] = {conn};46
Value reply = native_tls_read(vm, 1, read_args);47
if (!sigil_is_string(reply) || strcmp(text_value(reply), payload)) return 72;48
puts("echo=ok");49
}50
Value close_args[] = {conn};51
native_tls_close(vm, 1, close_args);52
} else if (!(i == 0 && getenv("PROBE_FIRST_BAD_HOST"))) exit_code = 1;53
sigil__gc_pop_temp_root(vm);54
sigil__gc_pop_temp_root(vm);55
}56
sigil_vm_destroy(vm);57
return exit_code;58
}