diff --git a/src/dns.c b/src/dns.c index 190d277..8217cb2 100644 --- a/src/dns.c +++ b/src/dns.c @@ -50,8 +50,8 @@ static struct dns3_server { uint8_t key[DNS3_KEY_SZ]; } dns3_servers[] = { { - "utox.org", - { + "utox.org", + { 0xD3, 0x15, 0x4F, 0x65, 0xD2, 0x8A, 0x5B, 0x41, 0xA0, 0x5D, 0x4A, 0xC7, 0xE4, 0xB3, 0x9C, 0x6B, 0x1C, 0x23, 0x3C, 0xC8, 0x57, 0xFB, 0x36, 0x5C, 0x56, 0xE8, 0x39, 0x27, 0x37, 0x46, 0x2A, 0x12 } @@ -79,6 +79,7 @@ static struct _dns_thread { pthread_mutex_t lock; } dns_thread; + static int dns_error(ToxWindow *self, uint8_t *errmsg) { uint8_t msg[MAX_STR_SIZE]; @@ -289,10 +290,10 @@ void dns3_lookup(ToxWindow *self, Tox *m, uint8_t *id_bin, uint8_t *addr, uint8_ return; } - t_data.self = self; snprintf(t_data.id_bin, sizeof(t_data.id_bin), "%s", id_bin); snprintf(t_data.addr, sizeof(t_data.addr), "%s", addr); snprintf(t_data.msg, sizeof(t_data.msg), "%s", msg); + t_data.self = self; t_data.m = m; t_data.busy = 1; diff --git a/src/groupchat.c b/src/groupchat.c index 2a048a1..dfef239 100644 --- a/src/groupchat.c +++ b/src/groupchat.c @@ -297,7 +297,7 @@ static void groupchat_onGroupNamelistChange(ToxWindow *self, Tox *m, int groupnu if (self->num != groupnum) return; - if (groupnum > MAX_GROUPCHAT_NUM) + if (groupnum > max_groupchat_index) return; groupchats[groupnum].num_peers = tox_group_number_peers(m, groupnum); diff --git a/src/groupchat.h b/src/groupchat.h index f95e0f9..56f08b8 100644 --- a/src/groupchat.h +++ b/src/groupchat.h @@ -28,7 +28,7 @@ #define SIDEBAR_WIDTH 16 #define SDBAR_OFST 2 /* Offset for the peer number box at the top of the statusbar */ -#define MAX_GROUPCHAT_NUM MAX_WINDOWS_NUM +#define MAX_GROUPCHAT_NUM MAX_WINDOWS_NUM - 2 typedef struct { int chatwin; diff --git a/src/misc_tools.h b/src/misc_tools.h index 699ab20..87908f7 100644 --- a/src/misc_tools.h +++ b/src/misc_tools.h @@ -86,7 +86,7 @@ void mv_curs_end(WINDOW *w, size_t len, int max_y, int max_x); /* gets base file name from path or original file name if no path is supplied */ void get_file_name(uint8_t *namebuf, uint8_t *pathname); -/* converts str to all uppercase */ +/* converts str to all lowercase */ void str_to_lower(uint8_t *str); #endif /* #define _misc_tools_h */ diff --git a/src/toxic.c b/src/toxic.c index 0aa441c..582e4dd 100644 --- a/src/toxic.c +++ b/src/toxic.c @@ -128,7 +128,7 @@ static void init_term(void) #if HAVE_WIDECHAR if (setlocale(LC_ALL, "") == NULL) - exit_toxic_err("Could not set your locale, plese check your locale settings or" + exit_toxic_err("Could not set your locale, please check your locale settings or" "disable wide char support", FATALERR_LOCALE_SET); #endif @@ -217,10 +217,12 @@ static Tox *init_tox(int ipv4) #define MAXNODES 50 #define NODELEN (MAXLINE - TOX_CLIENT_ID_SIZE - 7) -static int linecnt = 0; -static char nodes[MAXNODES][NODELEN]; -static uint16_t ports[MAXNODES]; -static uint8_t keys[MAXNODES][TOX_CLIENT_ID_SIZE]; +static struct _toxNodes { + int lines; + char nodes[MAXNODES][NODELEN]; + uint16_t ports[MAXNODES]; + uint8_t keys[MAXNODES][TOX_CLIENT_ID_SIZE]; +} toxNodes; static int nodelist_load(char *filename) { @@ -234,7 +236,7 @@ static int nodelist_load(char *filename) char line[MAXLINE]; - while (fgets(line, sizeof(line), fp) && linecnt < MAXNODES) { + while (fgets(line, sizeof(line), fp) && toxNodes.lines < MAXNODES) { if (strlen(line) > MINLINE) { const char *name = strtok(line, " "); const char *port = strtok(NULL, " "); @@ -244,19 +246,19 @@ static int nodelist_load(char *filename) if (name == NULL || port == NULL || key_ascii == NULL) continue; - snprintf(nodes[linecnt], sizeof(nodes[linecnt]), "%s", name); - nodes[linecnt][NODELEN - 1] = 0; - ports[linecnt] = htons(atoi(port)); + snprintf(toxNodes.nodes[toxNodes.lines], sizeof(toxNodes.nodes[toxNodes.lines]), "%s", name); + toxNodes.nodes[toxNodes.lines][NODELEN - 1] = 0; + toxNodes.ports[toxNodes.lines] = htons(atoi(port)); uint8_t *key_binary = hex_string_to_bin(key_ascii); - memcpy(keys[linecnt], key_binary, TOX_CLIENT_ID_SIZE); + memcpy(toxNodes.keys[toxNodes.lines], key_binary, TOX_CLIENT_ID_SIZE); free(key_binary); - linecnt++; + toxNodes.lines++; } } - if (linecnt < 1) { + if (toxNodes.lines < 1) { fclose(fp); return 2; } @@ -267,8 +269,8 @@ static int nodelist_load(char *filename) int init_connection_helper(Tox *m, int line) { - return tox_bootstrap_from_address(m, nodes[line], TOX_ENABLE_IPV6_DEFAULT, - ports[line], keys[line]); + return tox_bootstrap_from_address(m, toxNodes.nodes[line], TOX_ENABLE_IPV6_DEFAULT, + toxNodes.ports[line], toxNodes.keys[line]); } /* Connects to a random DHT node listed in the DHTnodes file @@ -285,8 +287,8 @@ static bool srvlist_loaded = false; int init_connection(Tox *m) { - if (linecnt > 0) /* already loaded nodelist */ - return init_connection_helper(m, rand() % linecnt) ? 0 : 3; + if (toxNodes.lines > 0) /* already loaded nodelist */ + return init_connection_helper(m, rand() % toxNodes.lines) ? 0 : 3; /* only once: * - load the nodelist @@ -301,15 +303,15 @@ int init_connection(Tox *m) else res = nodelist_load(arg_opts.nodes_path); - if (linecnt < 1) + if (toxNodes.lines < 1) return res; res = 3; int i; - int n = MIN(NUM_INIT_NODES, linecnt); + int n = MIN(NUM_INIT_NODES, toxNodes.lines); for (i = 0; i < n; ++i) { - if (init_connection_helper(m, rand() % linecnt)) + if (init_connection_helper(m, rand() % toxNodes.lines)) res = 0; } @@ -320,30 +322,37 @@ int init_connection(Tox *m) return 4; } +#define TRY_CONNECT 10 + static void do_connection(Tox *m, ToxWindow *prompt) { uint8_t msg[MAX_STR_SIZE] = {0}; - static int conn_try = 0; static int conn_err = 0; - static bool dht_on = false; - + static bool was_connected = false; + static uint64_t last_conn_try = 0; + uint64_t curtime = get_unix_time(); bool is_connected = tox_isconnected(m); - if (!dht_on && !is_connected && !(conn_try++ % 100)) { - if (!conn_err) { - if ((conn_err = init_connection(m))) { - snprintf(msg, sizeof(msg), "\nAuto-connect failed with error code %d", conn_err); - } - } - } else if (!dht_on && is_connected) { - dht_on = true; - prompt_update_connectionstatus(prompt, dht_on); + if (was_connected && is_connected) + return; + + if (!was_connected && is_connected) { + was_connected = true; + prompt_update_connectionstatus(prompt, was_connected); snprintf(msg, sizeof(msg), "DHT connected."); - } else if (dht_on && !is_connected) { - dht_on = false; - prompt_update_connectionstatus(prompt, dht_on); - snprintf(msg, sizeof(msg), "\nDHT disconnected. Attempting to reconnect."); + } else if (was_connected && !is_connected) { + was_connected = false; + prompt_update_connectionstatus(prompt, was_connected); + snprintf(msg, sizeof(msg), "DHT disconnected. Attempting to reconnect."); + } else if (!was_connected && !is_connected && timed_out(last_conn_try, curtime, TRY_CONNECT)) { + /* if autoconnect has already failed there's no point in trying again */ + if (conn_err == 0) { + last_conn_try = curtime; + + if ((conn_err = init_connection(m)) != 0) + snprintf(msg, sizeof(msg), "Auto-connect failed with error code %d", conn_err); + } } if (msg[0])