diff --git a/binlog.c b/binlog.c index 62382db..df30269 100644 --- a/binlog.c +++ b/binlog.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -1024,7 +1025,7 @@ void replay_log_event (void) { rptr = in_ptr; break; default: - logprintf ("Unknown logevent [0x%08x] 0x%08x [0x%08x]\n", *(rptr - 1), op, *(rptr + 1)); + logprintf ("Unknown logevent [0x%08x] 0x%08x [0x%08x] at %lld\n", *(rptr - 1), op, *(rptr + 1), binlog_pos); assert (0); } @@ -1075,8 +1076,8 @@ void replay_log (void) { } else { int x = wptr - rptr; memcpy (binlog_buffer, rptr, 4 * x); - wptr -= x; - rptr -= x; + wptr -= (rptr - binlog_buffer); + rptr = binlog_buffer; } int l = (binlog_buffer + BINLOG_BUFFER_SIZE - wptr) * 4; int k = read (fd, wptr, l); @@ -1103,7 +1104,12 @@ void write_binlog (void) { perror ("binlog open"); exit (2); } - lseek (binlog_fd, 0, SEEK_END); + + assert (lseek (binlog_fd, binlog_pos, SEEK_SET) == binlog_pos); + if (flock (binlog_fd, LOCK_EX | LOCK_NB) < 0) { + perror ("get lock"); + exit (2); + } } void add_log_event (const int *data, int len) { diff --git a/config.sample b/config.sample index 588090f..dffcc44 100644 --- a/config.sample +++ b/config.sample @@ -1,22 +1,66 @@ -# This is my real config -# Feel free to edit it +# This is an empty config file +# Feel free to put something here -default_profile = "tele2"; +default_profile = "binlog"; -mts = { +test_dc1 = { + config_directory = ".telegram/test_dc1"; + test = true; + msg_num = true; + binlog_enabled = true; +}; + +binlog = { + config_directory = ".telegram/binlog"; + test = false; + msg_num = true; + binlog_enabled = true; + log_level = 2; +}; + +binlog_mts = { + config_directory = ".telegram/binlog_mts"; + test = false; + msg_num = true; + binlog_enabled = true; + log_level = 2; +}; + +mega = { + config_directory = ".telegram/mega"; + test = false; + msg_num = true; + binlog_enabled = true; + log_level = 2; +}; + +new = { + config_directory = ".telegram/new"; test = false; - config_directory = ".telegram/mts"; msg_num = true; }; -tele2 = { +production = { + config_directory = ".telegram/production"; test = false; - config_directory = ".telegram/tele2"; msg_num = true; }; test = { - test = true; config_directory = ".telegram/test"; + test = true; msg_num = true; }; + +test1 = { + config_directory = ".telegram/test1"; + msg_num = true; + binlog_enabled = true; +}; + +test2 = { + config_directory = ".telegram/test2"; + msg_num = true; + binlog_enabled = true; +}; + diff --git a/main.c b/main.c index 3d9c4a1..10fc3be 100644 --- a/main.c +++ b/main.c @@ -77,6 +77,7 @@ char *config_directory; char *binlog_file_name; int binlog_enabled; extern int log_level; +int sync_from_start; void set_default_username (const char *s) { if (default_username) { @@ -315,7 +316,7 @@ extern int default_dc_num; int register_mode; void args_parse (int argc, char **argv) { int opt = 0; - while ((opt = getopt (argc, argv, "u:hk:vn:Nc:p:l:R")) != -1) { + while ((opt = getopt (argc, argv, "u:hk:vn:Nc:p:l:Rf")) != -1) { switch (opt) { case 'u': set_default_username (optarg); @@ -342,6 +343,9 @@ void args_parse (int argc, char **argv) { case 'R': register_mode = 1; break; + case 'f': + sync_from_start = 1; + break; case 'h': default: usage (); diff --git a/queries.c b/queries.c index bd4aaf8..64351d9 100644 --- a/queries.c +++ b/queries.c @@ -64,6 +64,7 @@ long long cur_downloading_bytes; long long cur_downloaded_bytes; extern int binlog_enabled; +extern int sync_from_start; void out_peer_id (peer_id_t id); #define QUERY_TIMEOUT 6.0 @@ -2218,6 +2219,14 @@ BN_CTX *ctx; void do_send_accept_encr_chat (struct secret_chat *E, unsigned char *random) { int i; + int ok = 0; + for (i = 0; i < 64; i++) { + if (E->key[i]) { + ok = 1; + break; + } + } + if (ok) { return; } // Already generated key for this chat for (i = 0; i < 64; i++) { *(((int *)random) + i) ^= mrand48 (); } @@ -2521,7 +2530,10 @@ void do_get_difference (void) { difference_got = 0; clear_packet (); do_insert_header (); - if (seq > 0) { + if (seq > 0 || sync_from_start) { + if (pts == 0) { pts = 1; } + if (qts == 0) { qts = 1; } + if (last_date == 0) { last_date = 1; } out_int (CODE_updates_get_difference); out_int (pts); out_int (last_date);