diff --git a/src/ssb.c b/src/ssb.c index a1dc3a4a..e520cf26 100644 --- a/src/ssb.c +++ b/src/ssb.c @@ -2688,6 +2688,36 @@ static void _tf_ssb_connection_handshake_timer_callback(uv_timer_t* timer) } } +static tf_ssb_connection_t* _tf_ssb_connection_create_internal(tf_ssb_t* ssb, const char* name, int index) +{ + ssb->connection_ref_count++; + tf_ssb_connection_t* connection = tf_malloc(sizeof(tf_ssb_connection_t)); + memset(connection, 0, sizeof(*connection)); + snprintf(connection->name, sizeof(connection->name), "%s%d", name, index); + connection->ssb = ssb; + connection->send_request_number = 1; + + connection->async.data = connection; + uv_async_init(ssb->loop, &connection->async, _tf_ssb_connection_process_message_async); + connection->scheduled_async.data = connection; + uv_async_init(ssb->loop, &connection->scheduled_async, _tf_ssb_connection_scheduled_async); + connection->handshake_timer.data = connection; + uv_timer_init(ssb->loop, &connection->handshake_timer); + uv_timer_start(&connection->handshake_timer, _tf_ssb_connection_handshake_timer_callback, k_handshake_timeout_ms, 0); + connection->linger_timer.data = connection; + uv_timer_init(ssb->loop, &connection->linger_timer); + + connection->object = JS_NewObjectClass(ssb->context, _connection_class_id); + JS_SetOpaque(connection->object, connection); + + connection->next = ssb->connections; + ssb->connections = connection; + ssb->connections_count++; + _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection); + + return connection; +} + static tf_ssb_connection_t* _tf_ssb_connection_create( tf_ssb_t* ssb, const char* host, const struct sockaddr_in* addr, const uint8_t* public_key, tf_ssb_connect_callback_t* callback, void* user_data) { @@ -2719,42 +2749,24 @@ static tf_ssb_connection_t* _tf_ssb_connection_create( } } - JSContext* context = ssb->context; - tf_ssb_connection_t* connection = tf_malloc(sizeof(tf_ssb_connection_t)); - ssb->connection_ref_count++; - memset(connection, 0, sizeof(*connection)); - snprintf(connection->name, sizeof(connection->name), "cli%d", s_connection_index++); - connection->ssb = ssb; - connection->tcp.data = connection; + tf_ssb_connection_t* connection = _tf_ssb_connection_create_internal(ssb, "cli", s_connection_index++); connection->connect.data = connection; - connection->send_request_number = 1; + snprintf(connection->host, sizeof(connection->host), "%s", host); connection->port = ntohs(addr->sin_port); - connection->async.data = connection; - uv_async_init(ssb->loop, &connection->async, _tf_ssb_connection_process_message_async); - connection->scheduled_async.data = connection; - uv_async_init(ssb->loop, &connection->scheduled_async, _tf_ssb_connection_scheduled_async); connection->connect_callback = callback; connection->connect_callback_user_data = user_data; - connection->handshake_timer.data = connection; - uv_timer_init(ssb->loop, &connection->handshake_timer); - uv_timer_start(&connection->handshake_timer, _tf_ssb_connection_handshake_timer_callback, k_handshake_timeout_ms, 0); - - connection->linger_timer.data = connection; - uv_timer_init(ssb->loop, &connection->linger_timer); - - connection->object = JS_NewObjectClass(ssb->context, _connection_class_id); - JS_SetOpaque(connection->object, connection); char public_key_str[k_id_base64_len] = { 0 }; if (tf_ssb_id_bin_to_str(public_key_str, sizeof(public_key_str), public_key)) { - JS_SetPropertyStr(context, connection->object, "id", JS_NewString(context, public_key_str)); - JS_SetPropertyStr(context, connection->object, "is_client", JS_TRUE); + JS_SetPropertyStr(ssb->context, connection->object, "id", JS_NewString(ssb->context, public_key_str)); + JS_SetPropertyStr(ssb->context, connection->object, "is_client", JS_TRUE); } memcpy(connection->serverpub, public_key, sizeof(connection->serverpub)); + connection->tcp.data = connection; uv_tcp_init(ssb->loop, &connection->tcp); int result = uv_tcp_connect(&connection->connect, &connection->tcp, (const struct sockaddr*)addr, _tf_ssb_connection_on_connect); if (result) @@ -2764,13 +2776,6 @@ static tf_ssb_connection_t* _tf_ssb_connection_create( connection->connect.data = NULL; _tf_ssb_connection_destroy(connection, reason); } - else - { - connection->next = ssb->connections; - ssb->connections = connection; - ssb->connections_count++; - _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection); - } return connection; } @@ -2802,39 +2807,16 @@ tf_ssb_connection_t* tf_ssb_connection_tunnel_create(tf_ssb_t* ssb, const char* } JSContext* context = ssb->context; - tf_ssb_connection_t* tunnel = tf_malloc(sizeof(tf_ssb_connection_t)); - ssb->connection_ref_count++; - memset(tunnel, 0, sizeof(*tunnel)); - snprintf(tunnel->name, sizeof(tunnel->name), "tun%d", s_tunnel_index++); - tunnel->ssb = ssb; + tf_ssb_connection_t* tunnel = _tf_ssb_connection_create_internal(ssb, "tun", s_tunnel_index++); tunnel->flags = connect_flags; tunnel->tunnel_connection = connection; tunnel->tunnel_request_number = -request_number; - tunnel->send_request_number = 1; - tunnel->async.data = tunnel; - uv_async_init(ssb->loop, &tunnel->async, _tf_ssb_connection_process_message_async); - tunnel->scheduled_async.data = tunnel; - uv_async_init(ssb->loop, &tunnel->scheduled_async, _tf_ssb_connection_scheduled_async); - tunnel->handshake_timer.data = tunnel; - uv_timer_init(ssb->loop, &tunnel->handshake_timer); - uv_timer_start(&tunnel->handshake_timer, _tf_ssb_connection_handshake_timer_callback, k_handshake_timeout_ms, 0); - - tunnel->linger_timer.data = tunnel; - uv_timer_init(ssb->loop, &tunnel->linger_timer); - - tunnel->object = JS_NewObjectClass(ssb->context, _connection_class_id); - JS_SetOpaque(tunnel->object, tunnel); JS_SetPropertyStr(context, tunnel->object, "id", JS_NewString(context, target_id)); JS_SetPropertyStr(context, tunnel->object, "is_client", JS_TRUE); tf_ssb_id_str_to_bin(tunnel->serverpub, target_id); - tunnel->next = ssb->connections; - ssb->connections = tunnel; - ssb->connections_count++; - _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, tunnel); - tf_ssb_connection_add_request(connection, request_number, "tunnel.connect", _tf_ssb_connection_tunnel_callback, NULL, tunnel, tunnel); if (request_number > 0) { @@ -2941,24 +2923,13 @@ static void _tf_ssb_on_connection(uv_stream_t* stream, int status) return; } - tf_ssb_connection_t* connection = tf_malloc(sizeof(tf_ssb_connection_t)); - ssb->connection_ref_count++; - memset(connection, 0, sizeof(*connection)); - snprintf(connection->name, sizeof(connection->name), "srv%d", s_connection_index++); - connection->ssb = ssb; + tf_ssb_connection_t* connection = _tf_ssb_connection_create_internal(ssb, "srv", s_connection_index++); + connection->tcp.data = connection; - connection->send_request_number = 1; - connection->async.data = connection; - uv_async_init(ssb->loop, &connection->async, _tf_ssb_connection_process_message_async); - connection->scheduled_async.data = connection; - uv_async_init(ssb->loop, &connection->scheduled_async, _tf_ssb_connection_scheduled_async); - - connection->object = JS_NewObjectClass(ssb->context, _connection_class_id); - JS_SetOpaque(connection->object, connection); - int result = uv_tcp_init(ssb->loop, &connection->tcp); if (result != 0) { + connection->tcp.data = NULL; char reason[1024]; snprintf(reason, sizeof(reason), "uv_tcp_init() => %s", uv_strerror(result)); _tf_ssb_connection_destroy(connection, reason); @@ -2974,13 +2945,6 @@ static void _tf_ssb_on_connection(uv_stream_t* stream, int status) return; } - connection->handshake_timer.data = connection; - uv_timer_init(ssb->loop, &connection->handshake_timer); - uv_timer_start(&connection->handshake_timer, _tf_ssb_connection_handshake_timer_callback, k_handshake_timeout_ms, 0); - - connection->linger_timer.data = connection; - uv_timer_init(ssb->loop, &connection->linger_timer); - struct sockaddr_storage addr = { 0 }; int size = sizeof(addr); if (uv_tcp_getpeername(&connection->tcp, (struct sockaddr*)&addr, &size) == 0) @@ -2989,13 +2953,8 @@ static void _tf_ssb_on_connection(uv_stream_t* stream, int status) connection->port = ntohs(((struct sockaddr_in*)&addr)->sin_port); } - connection->next = ssb->connections; - ssb->connections = connection; - ssb->connections_count++; - connection->state = k_tf_ssb_state_server_wait_hello; _tf_ssb_connection_read_start(connection); - _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection); } static void _tf_ssb_send_broadcast(tf_ssb_t* ssb, struct sockaddr_in* address, struct sockaddr_in* netmask)