forked from cory/tildefriends
Try to fix some connection issues. Urge to rewrite rising.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3778 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
df94378b96
commit
1734c88627
73
src/ssb.c
73
src/ssb.c
@ -278,7 +278,11 @@ static void _tf_ssb_write(tf_ssb_connection_t* connection, void* data, size_t si
|
|||||||
uv_write_t* write = malloc(sizeof(uv_write_t) + size);
|
uv_write_t* write = malloc(sizeof(uv_write_t) + size);
|
||||||
*write = (uv_write_t) { .data = connection };
|
*write = (uv_write_t) { .data = connection };
|
||||||
memcpy(write + 1, data, size);
|
memcpy(write + 1, data, size);
|
||||||
uv_write(write, (uv_stream_t*)&connection->tcp, &(uv_buf_t) { .base = (char*)(write + 1), .len = size }, 1, _tf_ssb_connection_on_write);
|
int result = uv_write(write, (uv_stream_t*)&connection->tcp, &(uv_buf_t) { .base = (char*)(write + 1), .len = size }, 1, _tf_ssb_connection_on_write);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
_tf_ssb_connection_close(connection, "write failed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _tf_ssb_connection_send_identity(tf_ssb_connection_t* connection, uint8_t* hmac, uint8_t* pubkey)
|
static void _tf_ssb_connection_send_identity(tf_ssb_connection_t* connection, uint8_t* hmac, uint8_t* pubkey)
|
||||||
@ -1347,9 +1351,17 @@ static void _tf_ssb_connection_on_connect(uv_connect_t* connect, int status)
|
|||||||
if (status == 0)
|
if (status == 0)
|
||||||
{
|
{
|
||||||
connection->state = k_tf_ssb_state_connected;
|
connection->state = k_tf_ssb_state_connected;
|
||||||
uv_read_start(connect->handle, _tf_ssb_connection_on_tcp_alloc, _tf_ssb_connection_on_tcp_recv);
|
int result = uv_read_start(connect->handle, _tf_ssb_connection_on_tcp_alloc, _tf_ssb_connection_on_tcp_recv);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
printf("uv_read_start => %s\n", uv_strerror(status));
|
||||||
|
uv_close((uv_handle_t*)&connection->tcp, _tf_ssb_connection_on_close);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
_tf_ssb_connection_client_send_hello(connect->handle);
|
_tf_ssb_connection_client_send_hello(connect->handle);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("connect => %s\n", uv_strerror(status));
|
printf("connect => %s\n", uv_strerror(status));
|
||||||
@ -1808,6 +1820,24 @@ static JSValue _tf_ssb_connection_send_json(JSContext* context, JSValueConst thi
|
|||||||
|
|
||||||
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_connection_t* tf_ssb_connection_create(tf_ssb_t* ssb, const char* host, const struct sockaddr_in* addr, const uint8_t* public_key)
|
||||||
{
|
{
|
||||||
|
for (tf_ssb_connection_t* connection = ssb->connections; connection; connection = connection->next)
|
||||||
|
{
|
||||||
|
if (memcmp(connection->serverpub, public_key, k_id_bin_len) == 0)
|
||||||
|
{
|
||||||
|
char id[k_id_base64_len];
|
||||||
|
tf_ssb_id_bin_to_str(id, sizeof(id), public_key);
|
||||||
|
printf("Not connecting to %s:%d, because we are already connected to %s.\n", host, ntohs(addr->sin_port), id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if (memcmp(ssb->pub, public_key, k_id_bin_len) == 0)
|
||||||
|
{
|
||||||
|
char id[k_id_base64_len];
|
||||||
|
tf_ssb_id_bin_to_str(id, sizeof(id), public_key);
|
||||||
|
printf("Not connecting to %s:%d, because they appear to be ourselves %s.\n", host, ntohs(addr->sin_port), id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JSContext* context = ssb->context;
|
JSContext* context = ssb->context;
|
||||||
tf_ssb_connection_t* connection = malloc(sizeof(tf_ssb_connection_t));
|
tf_ssb_connection_t* connection = malloc(sizeof(tf_ssb_connection_t));
|
||||||
memset(connection, 0, sizeof(*connection));
|
memset(connection, 0, sizeof(*connection));
|
||||||
@ -1831,12 +1861,22 @@ tf_ssb_connection_t* tf_ssb_connection_create(tf_ssb_t* ssb, const char* host, c
|
|||||||
memcpy(connection->serverpub, public_key, sizeof(connection->serverpub));
|
memcpy(connection->serverpub, public_key, sizeof(connection->serverpub));
|
||||||
|
|
||||||
uv_tcp_init(ssb->loop, &connection->tcp);
|
uv_tcp_init(ssb->loop, &connection->tcp);
|
||||||
uv_tcp_connect(&connection->connect, &connection->tcp, (const struct sockaddr*)addr, _tf_ssb_connection_on_connect);
|
printf("uv_tcp_connect\n");
|
||||||
|
int result = uv_tcp_connect(&connection->connect, &connection->tcp, (const struct sockaddr*)addr, _tf_ssb_connection_on_connect);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
printf("uv_tcp_connect(%s): %s\n", host, uv_strerror(result));
|
||||||
|
JS_SetOpaque(connection->object, NULL);
|
||||||
|
JS_FreeValue(ssb->context, connection->object);
|
||||||
|
free(connection);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
connection->next = ssb->connections;
|
connection->next = ssb->connections;
|
||||||
ssb->connections = connection;
|
ssb->connections = connection;
|
||||||
ssb->connections_count++;
|
ssb->connections_count++;
|
||||||
_tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection);
|
_tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection);
|
||||||
|
}
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1856,31 +1896,17 @@ static void _tf_on_connect_getaddrinfo(uv_getaddrinfo_t* addrinfo, int result, s
|
|||||||
struct sockaddr_in addr = *(struct sockaddr_in*)info->ai_addr;
|
struct sockaddr_in addr = *(struct sockaddr_in*)info->ai_addr;
|
||||||
addr.sin_port = htons(connect->port);
|
addr.sin_port = htons(connect->port);
|
||||||
tf_ssb_connection_create(connect->ssb, connect->host, &addr, connect->key);
|
tf_ssb_connection_create(connect->ssb, connect->host, &addr, connect->key);
|
||||||
free(connect);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("getaddrinfo => %s\n", uv_strerror(result));
|
||||||
|
}
|
||||||
|
free(connect);
|
||||||
uv_freeaddrinfo(info);
|
uv_freeaddrinfo(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tf_ssb_connect(tf_ssb_t* ssb, const char* host, int port, const uint8_t* key)
|
void tf_ssb_connect(tf_ssb_t* ssb, const char* host, int port, const uint8_t* key)
|
||||||
{
|
{
|
||||||
for (tf_ssb_connection_t* connection = ssb->connections; connection; connection = connection->next)
|
|
||||||
{
|
|
||||||
if (memcmp(connection->serverpub, key, k_id_bin_len) == 0)
|
|
||||||
{
|
|
||||||
char id[k_id_base64_len];
|
|
||||||
tf_ssb_id_bin_to_str(id, sizeof(id), key);
|
|
||||||
printf("Not connecting to %s:%d, because we are already connected to %s.\n", host, port, id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (memcmp(key, ssb->pub, k_id_bin_len) == 0)
|
|
||||||
{
|
|
||||||
char id[k_id_base64_len];
|
|
||||||
tf_ssb_id_bin_to_str(id, sizeof(id), key);
|
|
||||||
printf("Not connecting to %s:%d, because they appear to be ourselves %s.\n", host, port, id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
connect_t* connect = malloc(sizeof(connect_t));
|
connect_t* connect = malloc(sizeof(connect_t));
|
||||||
*connect = (connect_t)
|
*connect = (connect_t)
|
||||||
{
|
{
|
||||||
@ -1894,6 +1920,7 @@ void tf_ssb_connect(tf_ssb_t* ssb, const char* host, int port, const uint8_t* ke
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
{
|
{
|
||||||
printf("uv_getaddrinfo: %s\n", uv_strerror(r));
|
printf("uv_getaddrinfo: %s\n", uv_strerror(r));
|
||||||
|
free(connect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1476,11 +1476,6 @@ void tf_task_destroy(tf_task_t* task)
|
|||||||
free(export);
|
free(export);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (task->_trace)
|
|
||||||
{
|
|
||||||
tf_trace_destroy(task->_trace);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (task->_ssb)
|
if (task->_ssb)
|
||||||
{
|
{
|
||||||
tf_ssb_destroy(task->_ssb);
|
tf_ssb_destroy(task->_ssb);
|
||||||
@ -1507,6 +1502,10 @@ void tf_task_destroy(tf_task_t* task)
|
|||||||
{
|
{
|
||||||
uv_print_all_handles(&task->_loop, stdout);
|
uv_print_all_handles(&task->_loop, stdout);
|
||||||
}
|
}
|
||||||
|
if (task->_trace)
|
||||||
|
{
|
||||||
|
tf_trace_destroy(task->_trace);
|
||||||
|
}
|
||||||
--_count;
|
--_count;
|
||||||
free((void*)task->_path);
|
free((void*)task->_path);
|
||||||
free(task);
|
free(task);
|
||||||
|
Loading…
Reference in New Issue
Block a user