From 613867fb099bc2c10cefa0aef260abdad5e7eb0e Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 15:56:12 +0400 Subject: [PATCH 1/8] Try to fix net --- net.c | 56 +++++++++++--------------------------------------------- 1 file changed, 11 insertions(+), 45 deletions(-) diff --git a/net.c b/net.c index 7563c04..2c0dfd8 100644 --- a/net.c +++ b/net.c @@ -73,11 +73,11 @@ static void ping_alarm (evutil_socket_t fd, short what, void *arg) { struct connection *c = arg; vlogprintf (E_DEBUG + 2,"ping alarm\n"); assert (c->state == conn_ready || c->state == conn_connecting); - if (tglt_get_double_time () - c->last_receive_time > 20 * PING_TIMEOUT) { + if (tglt_get_double_time () - c->last_receive_time > 6 * PING_TIMEOUT) { vlogprintf (E_WARNING, "fail connection: reason: ping timeout\n"); c->state = conn_failed; fail_connection (c); - } else if (tglt_get_double_time () - c->last_receive_time > 5 * PING_TIMEOUT && c->state == conn_ready) { + } else if (tglt_get_double_time () - c->last_receive_time > 3 * PING_TIMEOUT && c->state == conn_ready) { tgl_do_send_ping (c); start_ping_timer (c); } else { @@ -365,6 +365,12 @@ static void restart_connection (struct connection *c) { start_ping_timer (c); Connections[fd] = c; + c->write_ev = event_new (tgl_state.ev_base, c->fd, EV_WRITE, conn_try_write, c); + + struct timeval tv = {5, 0}; + c->read_ev = event_new (tgl_state.ev_base, c->fd, EV_READ | EV_PERSIST, conn_try_read, c); + event_add (c->read_ev, &tv); + char byte = 0xef; assert (tgln_write_out (c, &byte, 1) == 1); tgln_flush_out (c); @@ -374,7 +380,9 @@ static void fail_connection (struct connection *c) { if (c->state == conn_ready || c->state == conn_connecting) { stop_ping_timer (c); } - event_del (c->write_ev); + event_free (c->write_ev); + event_free (c->read_ev); + rotate_port (c); struct connection_buffer *b = c->out_head; while (b) { @@ -403,15 +411,6 @@ static void try_write (struct connection *c) { int x = 0; while (c->out_head) { int r = write (c->fd, c->out_head->rptr, c->out_head->wptr - c->out_head->rptr); - /*if (r > 0 && log_net_f) { - fprintf (log_net_f, "%.02lf %d OUT %s:%d", get_utime (CLOCK_REALTIME), r, c->ip, c->port); - int i; - for (i = 0; i < r; i++) { - fprintf (log_net_f, " %02x", *(unsigned char *)(c->out_head->rptr + i)); - } - fprintf (log_net_f, "\n"); - fflush (log_net_f); - }*/ if (r >= 0) { x += r; c->out_head->rptr += r; @@ -438,30 +437,6 @@ static void try_write (struct connection *c) { c->out_bytes -= x; } -/*static void hexdump_buf (struct connection_buffer *b) { - int pos = 0; - int rem = 8; - while (b) { - unsigned char *c = b->rptr; - while (c != b->wptr) { - if (rem == 8) { - if (pos) { printf ("\n"); } - printf ("%04d", pos); - } - printf (" %02x", (int)*c); - rem --; - pos ++; - if (!rem) { - rem = 8; - } - c ++; - } - b = b->next; - } - printf ("\n"); - -}*/ - static void try_rpc_read (struct connection *c) { assert (c->in_head); @@ -505,15 +480,6 @@ static void try_read (struct connection *c) { int x = 0; while (1) { int r = read (c->fd, c->in_tail->wptr, c->in_tail->end - c->in_tail->wptr); - /*if (r > 0 && log_net_f) { - fprintf (log_net_f, "%.02lf %d IN %s:%d", get_utime (CLOCK_REALTIME), r, c->ip, c->port); - int i; - for (i = 0; i < r; i++) { - fprintf (log_net_f, " %02x", *(unsigned char *)(c->in_tail->wptr + i)); - } - fprintf (log_net_f, "\n"); - fflush (log_net_f); - }*/ if (r > 0) { c->last_receive_time = tglt_get_double_time (); stop_ping_timer (c); From fac3ddf2d8e87f42ba923543cb146d7f21c1682a Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 16:40:35 +0400 Subject: [PATCH 2/8] Fixes for old libevent --- event-old.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/event-old.h b/event-old.h index a41b33c..eef4df3 100644 --- a/event-old.h +++ b/event-old.h @@ -4,13 +4,17 @@ typedef int evutil_socket_t; static inline struct event *event_new (struct event_base *base, int fd, int what, void(*callback)(int, short, void *), void *arg) { - struct event *ev = malloc (sizeof (*ec)); - event_set (ev, base, fd, what, callback, arg); + struct event *ev = malloc (sizeof (*ev)); + event_set (ev, fd, what, callback, arg); + event_base_set (base, ev); + return ev; } static inline struct event *evtimer_new (struct event_base *base, void(*callback)(int, short, void *), void *arg) { - struct event *ev = malloc (sizeof (*ec)); - evtimer_set (ev, base, callback, arg); + struct event *ev = malloc (sizeof (*ev)); + event_set (ev, -1, 0, callback, arg); + event_base_set (base, ev); + return ev; } static void event_free (struct event *ev) { From 34b81ab4001be34971dfcb07848f1efec8bc8a8d Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 16:49:51 +0400 Subject: [PATCH 3/8] Try to build with libevent-1.4 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1a3dcb5..f94e206 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ install: - sudo apt-get install libreadline6-dev - sudo apt-get install libssl-dev - sudo apt-get install liblua5.2-dev lua5.2 - - sudo apt-get install libevent-dev + - sudo apt-get install libevent-dev=1.4.13-stable-1 script: - ./configure From 3dd341a08fa219a865722924fc736ad2e5fe5cd4 Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 17:02:59 +0400 Subject: [PATCH 4/8] Added attribute unused --- .travis.yml | 2 +- event-old.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f94e206..1a3dcb5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ install: - sudo apt-get install libreadline6-dev - sudo apt-get install libssl-dev - sudo apt-get install liblua5.2-dev lua5.2 - - sudo apt-get install libevent-dev=1.4.13-stable-1 + - sudo apt-get install libevent-dev script: - ./configure diff --git a/event-old.h b/event-old.h index eef4df3..812c598 100644 --- a/event-old.h +++ b/event-old.h @@ -3,6 +3,7 @@ typedef int evutil_socket_t; +static inline struct event *event_new (struct event_base *base, int fd, int what, void(*callback)(int, short, void *), void *arg) __attribute__ ((unused)); static inline struct event *event_new (struct event_base *base, int fd, int what, void(*callback)(int, short, void *), void *arg) { struct event *ev = malloc (sizeof (*ev)); event_set (ev, fd, what, callback, arg); @@ -10,6 +11,7 @@ static inline struct event *event_new (struct event_base *base, int fd, int what return ev; } +static inline struct event *evtimer_new (struct event_base *base, void(*callback)(int, short, void *), void *arg) __attribute__ ((unused)); static inline struct event *evtimer_new (struct event_base *base, void(*callback)(int, short, void *), void *arg) { struct event *ev = malloc (sizeof (*ev)); event_set (ev, -1, 0, callback, arg); @@ -17,6 +19,7 @@ static inline struct event *evtimer_new (struct event_base *base, void(*callback return ev; } +static void event_free (struct event *ev) __attribute__ ((unused)); static void event_free (struct event *ev) { event_del (ev); free (ev); From 6d8deb9135fa8a3a5f47a21ce0eb162cdd50db25 Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 17:05:41 +0400 Subject: [PATCH 5/8] Added _GNU_SOURCE for strndup --- generate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/generate.c b/generate.c index ac7e118..be8a27c 100644 --- a/generate.c +++ b/generate.c @@ -20,6 +20,7 @@ Copyright 2012-2013 Vkontakte Ltd 2012-2013 Vitaliy Valtman */ +#define _GNU_SOURCE #include #include From 5369423e3c29a32981888fc9d23f58af3aeb1987 Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 17:33:33 +0400 Subject: [PATCH 6/8] Fixed event-1.4 --- net.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net.c b/net.c index 2c0dfd8..68559a1 100644 --- a/net.c +++ b/net.c @@ -477,6 +477,10 @@ static void try_read (struct connection *c) { if (!c->in_tail) { c->in_head = c->in_tail = new_connection_buffer (1 << 20); } + #ifdef EVENT_V1 + struct timeval tv = {5, 0}; + event_add (c->read_ev, &tv); + #endif int x = 0; while (1) { int r = read (c->fd, c->in_tail->wptr, c->in_tail->end - c->in_tail->wptr); From c9ed692d248ae9ea43aa104a225cd560e9f402d2 Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 17:35:00 +0400 Subject: [PATCH 7/8] increased version --- tgl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tgl.h b/tgl.h index 1ca4163..51a631d 100644 --- a/tgl.h +++ b/tgl.h @@ -28,8 +28,8 @@ #define TG_SERVER_TEST "173.240.5.253" // JUST RANDOM STRING -#define TGL_BUILD "1934" -#define TGL_VERSION "1.0.1" +#define TGL_BUILD "2012" +#define TGL_VERSION "1.0.2" #define TGL_ENCRYPTED_LAYER 16 From d28209e3d1d2b97541d5484e4a2f578d7a0afffe Mon Sep 17 00:00:00 2001 From: Vysheng Date: Mon, 8 Sep 2014 20:48:59 +0400 Subject: [PATCH 8/8] Fixed rare crush in case of multiple query answers --- queries.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/queries.c b/queries.c index 3ae749a..53a25ac 100644 --- a/queries.c +++ b/queries.c @@ -826,7 +826,9 @@ static int msg_send_on_answer (struct query *q UU) { assert (x == CODE_messages_sent_message || x == CODE_messages_sent_message_link); int id = fetch_int (); // id struct tgl_message *M = q->extra; - bl_do_set_msg_id (M, id); + if (M->id != id) { + bl_do_set_msg_id (M, id); + } int date = fetch_int (); int pts = fetch_int (); //tglu_fetch_seq (); @@ -837,8 +839,10 @@ static int msg_send_on_answer (struct query *q UU) { bl_do_set_pts (pts); bl_do_msg_seq_update (id); } else { - vlogprintf (E_NOTICE, "Hole in seq\n"); - tgl_do_get_difference (0, 0, 0); + if (seq > tgl_state.seq + 1) { + vlogprintf (E_NOTICE, "Hole in seq\n"); + tgl_do_get_difference (0, 0, 0); + } } if (x == CODE_messages_sent_message_link) { assert (skip_type_any (TYPE_TO_PARAM_1 (vector, TYPE_TO_PARAM (contacts_link))) >= 0); @@ -1066,7 +1070,10 @@ static int mark_read_on_receive (struct query *q UU) { bl_do_set_pts (pts); bl_do_set_seq (seq); } else { - tgl_do_get_difference (0, 0, 0); + if (seq > tgl_state.seq + 1) { + vlogprintf (E_NOTICE, "Hole in seq\n"); + tgl_do_get_difference (0, 0, 0); + } } int offset = fetch_int (); // offset @@ -1394,8 +1401,10 @@ static int send_file_on_answer (struct query *q UU) { bl_do_set_pts (pts); bl_do_msg_seq_update (M->id); } else { - vlogprintf (E_NOTICE, "Hole in seq\n"); - tgl_do_get_difference (0, 0, 0); + if (seq > tgl_state.seq + 1) { + vlogprintf (E_NOTICE, "Hole in seq\n"); + tgl_do_get_difference (0, 0, 0); + } } if (q->callback) { @@ -1814,8 +1823,10 @@ static int fwd_msg_on_answer (struct query *q UU) { bl_do_set_pts (pts); bl_do_msg_seq_update (M->id); } else { - vlogprintf (E_NOTICE, "Hole in seq\n"); - tgl_do_get_difference (0, 0, 0); + if (seq > tgl_state.seq + 1) { + vlogprintf (E_NOTICE, "Hole in seq\n"); + tgl_do_get_difference (0, 0, 0); + } } //print_message (M); if (q->callback) { @@ -1952,8 +1963,10 @@ static int rename_chat_on_answer (struct query *q UU) { bl_do_set_pts (pts); bl_do_msg_seq_update (M->id); } else { - vlogprintf (E_NOTICE, "Hole in seq\n"); - tgl_do_get_difference (0, 0, 0); + if (seq > tgl_state.seq + 1) { + vlogprintf (E_NOTICE, "Hole in seq\n"); + tgl_do_get_difference (0, 0, 0); + } } //print_message (M); if (q->callback) {