static int gather_relay(struct agent *ag, struct ice_lcand *base, int turn_proto) { struct candidate *cand = &ag->candv[ag->candc++]; const char *proto_name = ""; int err; if (ag->candc >= ARRAY_SIZE(ag->candv)) return ENOMEM; cand->ag = ag; cand->base = base; cand->type = TYPE_TURN; cand->turn_proto = turn_proto; switch (turn_proto) { case IPPROTO_UDP: proto_name = stun_proto_udp; break; case IPPROTO_TCP: proto_name = stun_proto_tcp; break; } re_printf("resolving TURN-server '%s' for %s..\n", ag->cli->param.turn_server, proto_name); err = stun_server_discover(&cand->stun_dns, cand->ag->cli->dnsc, stun_usage_relay, proto_name, sa_af(&base->attr.addr), ag->cli->param.turn_server, 0, stun_dns_handler, cand); if (err) { re_fprintf(stderr, "stun_server_discover failed (%m)\n", err); return err; } return 0; }
static int session_alloc(struct mnat_sess **sessp, struct dnsc *dnsc, const char *srv, uint16_t port, const char *user, const char *pass, struct sdp_session *ss, bool offerer, mnat_estab_h *estabh, void *arg) { struct mnat_sess *sess; int err; (void)ss; (void)offerer; if (!sessp || !dnsc || !srv || !user || !pass || !ss || !estabh) return EINVAL; sess = mem_zalloc(sizeof(*sess), session_destructor); if (!sess) return ENOMEM; err = str_dup(&sess->user, user); err |= str_dup(&sess->pass, pass); if (err) goto out; sess->estabh = estabh; sess->arg = arg; err = stun_server_discover(&sess->dnsq, dnsc, stun_usage_relay, stun_proto_udp, AF_INET, srv, port, dns_handler, sess); out: if (err) mem_deref(sess); else *sessp = sess; return err; }