static int request(struct sip_request *req, enum sip_transp tp, const struct sa *dst) { struct mbuf *mb = NULL; char *branch = NULL; int err = ENOMEM; struct sa laddr; req->provrecv = false; branch = mem_alloc(24, NULL); mb = mbuf_alloc(1024); if (!branch || !mb) goto out; (void)re_snprintf(branch, 24, "z9hG4bK%016llx", rand_u64()); err = sip_transp_laddr(req->sip, &laddr, tp, dst); if (err) goto out; err = mbuf_printf(mb, "%s %s SIP/2.0\r\n", req->met, req->uri); err |= mbuf_printf(mb, "Via: SIP/2.0/%s %J;branch=%s;rport\r\n", sip_transp_name(tp), &laddr, branch); err |= req->sendh ? req->sendh(tp, &laddr, dst, mb, req->arg) : 0; err |= mbuf_write_mem(mb, mbuf_buf(req->mb), mbuf_get_left(req->mb)); if (err) goto out; mb->pos = 0; if (!req->stateful) err = sip_send(req->sip, NULL, tp, dst, mb); else err = sip_ctrans_request(&req->ct, req->sip, tp, dst, req->met, branch, mb, response_handler, req); if (err) goto out; out: mem_deref(branch); mem_deref(mb); return err; }
int test_sipsess(void) { struct test test; struct sa laddr; char to_uri[256]; int err; uint16_t port; memset(&test, 0, sizeof(test)); #ifndef WIN32 /* slurp warnings from SIP (todo: temp) */ (void)freopen("/dev/null", "w", stderr); #endif err = sip_alloc(&test.sip, NULL, 32, 32, 32, "retest", exit_handler, NULL); if (err) goto out; (void)sa_set_str(&laddr, "127.0.0.1", 0); err = sip_transp_add(test.sip, SIP_TRANSP_UDP, &laddr); if (err) goto out; err = sip_transp_laddr(test.sip, &laddr, SIP_TRANSP_UDP, NULL); if (err) goto out; port = sa_port(&laddr); err = sipsess_listen(&test.sock, test.sip, 32, conn_handler, &test); if (err) goto out; /* Connect to "b" */ (void)re_snprintf(to_uri, sizeof(to_uri), "sip:[email protected]:%u", port); err = sipsess_connect(&test.a, test.sock, to_uri, NULL, "sip:[email protected]", "a", NULL, 0, "application/sdp", NULL, NULL, NULL, false, offer_handler, answer_handler, NULL, estab_handler_a, NULL, NULL, close_handler, &test, NULL); if (err) goto out; err = re_main_timeout(200); if (err) goto out; if (test.err) { err = test.err; goto out; } /* okay here -- verify */ TEST_ASSERT(test.estab_a); TEST_ASSERT(test.estab_b); out: test.a = mem_deref(test.a); test.b = mem_deref(test.b); sipsess_close_all(test.sock); test.sock = mem_deref(test.sock); sip_close(test.sip, false); test.sip = mem_deref(test.sip); #ifndef WIN32 /* Restore stderr */ freopen("/dev/tty", "w", stderr); #endif return err; }