int tport_ws_init_secondary(tport_t *self, int socket, int accepted, char const **return_reason) { int one = 1; tport_ws_primary_t *wspri = (tport_ws_primary_t *)self->tp_pri; tport_ws_t *wstp = (tport_ws_t *)self; self->tp_has_connection = 1; /* override the default 30 minute timeout on tport connections */ self->tp_params->tpp_idle = UINT_MAX; if (setsockopt(socket, SOL_TCP, TCP_NODELAY, (void *)&one, sizeof one) == -1) return *return_reason = "TCP_NODELAY", -1; #if defined(SO_KEEPALIVE) setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (void *)&one, sizeof one); #endif one = 30; #if defined(TCP_KEEPIDLE) setsockopt(socket, SOL_TCP, TCP_KEEPIDLE, (void *)&one, sizeof one); #endif #if defined(TCP_KEEPINTVL) setsockopt(socket, SOL_TCP, TCP_KEEPINTVL, (void *)&one, sizeof one); #endif if (!accepted) tport_ws_setsndbuf(socket, 64 * 1024); if ( wspri->ws_secure ) wstp->ws_secure = 1; memset(&wstp->ws, 0, sizeof(wstp->ws)); if (ws_init(&wstp->ws, socket, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0) < 0) { ws_destroy(&wstp->ws); wstp->ws_initialized = -1; return *return_reason = "WS_INIT", -1; } wstp->ws_initialized = 1; self->tp_pre_framed = 1; return 0; }
int tport_ws_init_primary(tport_primary_t *pri, tp_name_t tpn[1], su_addrinfo_t *ai, tagi_t const *tags, char const **return_culprit) { int socket; socket = su_socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (socket == INVALID_SOCKET) return *return_culprit = "socket", -1; tport_ws_setsndbuf(socket, 64 * 1024); return tport_stream_init_primary(pri, socket, tpn, ai, tags, return_culprit); }