static int nr_turn_client_connect(nr_turn_client_ctx *ctx) { int r,_status; if (ctx->turn_server_addr.protocol != IPPROTO_TCP) ABORT(R_INTERNAL); r = nr_socket_connect(ctx->sock, &ctx->turn_server_addr); if (r == R_WOULDBLOCK) { NR_SOCKET fd; if (r=nr_socket_getfd(ctx->sock, &fd)) ABORT(r); NR_ASYNC_WAIT(fd, NR_ASYNC_WAIT_WRITE, nr_turn_client_connected_cb, ctx); NR_ASYNC_TIMER_SET(TURN_CONNECT_TIMEOUT, nr_turn_client_connect_timeout_cb, ctx, &ctx->connected_timer_handle); ABORT(R_WOULDBLOCK); } if (r) { ABORT(R_IO_ERROR); } ctx->state = NR_TURN_CLIENT_STATE_CONNECTED; _status = 0; abort: return(_status); }
/* nr_turn_client_ctx functions */ int nr_turn_client_ctx_create(const char *label, nr_socket *sock, const char *username, Data *password, nr_transport_addr *addr, nr_turn_client_ctx **ctxp) { nr_turn_client_ctx *ctx=0; int r,_status; if ((r=r_log_register("turn", &NR_LOG_TURN))) ABORT(r); if(!(ctx=RCALLOC(sizeof(nr_turn_client_ctx)))) ABORT(R_NO_MEMORY); STAILQ_INIT(&ctx->stun_ctxs); STAILQ_INIT(&ctx->permissions); if(!(ctx->label=r_strdup(label))) ABORT(R_NO_MEMORY); ctx->sock=sock; ctx->username = r_strdup(username); if (!ctx->username) ABORT(R_NO_MEMORY); if ((r=r_data_create(&ctx->password, password->data, password->len))) ABORT(r); if ((r=nr_transport_addr_copy(&ctx->turn_server_addr, addr))) ABORT(r); ctx->state = NR_TURN_CLIENT_STATE_INITTED; if (addr->protocol == IPPROTO_TCP) { if ((r=nr_socket_connect(ctx->sock, &ctx->turn_server_addr))) { if (r != R_WOULDBLOCK) ABORT(r); } } *ctxp=ctx; _status=0; abort: if(_status){ nr_turn_client_ctx_destroy(&ctx); } return(_status); }