This commit is contained in:
vvaltman 2014-08-21 05:56:53 +04:00
parent f3636ced4c
commit 9efad0f349
11 changed files with 181 additions and 97 deletions

View File

@ -30,6 +30,9 @@
/* Define to 1 if you have the `edit' library (-ledit). */ /* Define to 1 if you have the `edit' library (-ledit). */
#undef HAVE_LIBEDIT #undef HAVE_LIBEDIT
/* Define to 1 if you have the `event' library (-levent). */
#undef HAVE_LIBEVENT
/* Define to 1 if you have the `m' library (-lm). */ /* Define to 1 if you have the `m' library (-lm). */
#undef HAVE_LIBM #undef HAVE_LIBM

45
configure vendored
View File

@ -3424,6 +3424,51 @@ _ACEOF
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for event_base_new in -levent" >&5
$as_echo_n "checking for event_base_new in -levent... " >&6; }
if ${ac_cv_lib_event_event_base_new+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-levent $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char event_base_new ();
int
main ()
{
return event_base_new ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_event_event_base_new=yes
else
ac_cv_lib_event_event_base_new=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_event_event_base_new" >&5
$as_echo "$ac_cv_lib_event_event_base_new" >&6; }
if test "x$ac_cv_lib_event_event_base_new" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBEVENT 1
_ACEOF
LIBS="-levent $LIBS"
fi
EXTRA_LIBS="" EXTRA_LIBS=""
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_save_prompt in -lreadline" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_save_prompt in -lreadline" >&5

View File

@ -18,6 +18,7 @@ AC_SEARCH_LIBS([clock_gettime], [rt])
AC_SEARCH_LIBS([backtrace], [execinfo]) AC_SEARCH_LIBS([backtrace], [execinfo])
AC_CHECK_LIB([z], [inflate]) AC_CHECK_LIB([z], [inflate])
AC_CHECK_LIB([crypto], [AES_set_encrypt_key]) AC_CHECK_LIB([crypto], [AES_set_encrypt_key])
AC_CHECK_LIB([event], [event_base_new])
EXTRA_LIBS="" EXTRA_LIBS=""
AC_CHECK_LIB([readline], [rl_save_prompt], AC_CHECK_LIB([readline], [rl_save_prompt],

View File

@ -942,12 +942,12 @@ void usage (void) {
void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
void logprintf (const char *format __attribute__ ((unused)), ...) { void logprintf (const char *format __attribute__ ((unused)), ...) {
} }
/*
void hexdump (int *in_ptr, int *in_end) { void hexdump (int *in_ptr, int *in_end) {
int *ptr = in_ptr; int *ptr = in_ptr;
while (ptr < in_end) { printf (" %08x", *(ptr ++)); } while (ptr < in_end) { printf (" %08x", *(ptr ++)); }
printf ("\n"); printf ("\n");
} }*/
#ifdef HAVE_EXECINFO_H #ifdef HAVE_EXECINFO_H
void print_backtrace (void) { void print_backtrace (void) {

View File

@ -1514,13 +1514,13 @@ void print_end (void) {
prompt_was = 0; prompt_was = 0;
} }
void hexdump (int *in_ptr, int *in_end) { /*void hexdump (int *in_ptr, int *in_end) {
print_start (); print_start ();
int *ptr = in_ptr; int *ptr = in_ptr;
while (ptr < in_end) { printf (" %08x", *(ptr ++)); } while (ptr < in_end) { printf (" %08x", *(ptr ++)); }
printf ("\n"); printf ("\n");
print_end (); print_end ();
} }*/
void logprintf (const char *format, ...) { void logprintf (const char *format, ...) {
int x = 0; int x = 0;

View File

@ -50,7 +50,7 @@ void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2)))
} while (0);\ } while (0);\
void hexdump (int *in_ptr, int *in_end); //void hexdump (int *in_ptr, int *in_end);
struct tgl_message; struct tgl_message;
void print_message (struct tgl_message *M); void print_message (struct tgl_message *M);

View File

@ -61,7 +61,7 @@
#define PATH_MAX 4096 #define PATH_MAX 4096
#endif #endif
int want_dc_num; //int want_dc_num;
char *get_downloads_directory (void); char *get_downloads_directory (void);
//extern int offline_mode; //extern int offline_mode;
@ -80,7 +80,7 @@ static void out_peer_id (tgl_peer_id_t id);
#define memcmp8(a,b) memcmp ((a), (b), 8) #define memcmp8(a,b) memcmp ((a), (b), 8)
DEFINE_TREE (query, struct query *, memcmp8, 0) ; DEFINE_TREE (query, struct query *, memcmp8, 0) ;
struct tree_query *queries_tree; static struct tree_query *queries_tree;
struct query *tglq_query_get (long long id) { struct query *tglq_query_get (long long id) {
return tree_lookup_query (queries_tree, (void *)&id); return tree_lookup_query (queries_tree, (void *)&id);
@ -208,7 +208,7 @@ void tglq_query_error (long long id) {
static int packed_buffer[MAX_PACKED_SIZE / 4]; static int packed_buffer[MAX_PACKED_SIZE / 4];
void tglq_query_result (long long id UU) { void tglq_query_result (long long id UU) {
vlogprintf (E_DEBUG, "result for query #%lld\n", id); vlogprintf (E_DEBUG, "result for query #%lld. Size %ld bytes\n", id, 4 * (in_end - in_ptr));
/*if (verbosity >= 4) { /*if (verbosity >= 4) {
logprintf ( "result: "); logprintf ( "result: ");
hexdump_in (); hexdump_in ();
@ -221,6 +221,7 @@ void tglq_query_result (long long id UU) {
int l = prefetch_strlen (); int l = prefetch_strlen ();
char *s = fetch_str (l); char *s = fetch_str (l);
int total_out = tgl_inflate (s, l, packed_buffer, MAX_PACKED_SIZE); int total_out = tgl_inflate (s, l, packed_buffer, MAX_PACKED_SIZE);
vlogprintf (E_DEBUG, "inflated %d bytes\n", total_out);
end = in_ptr; end = in_ptr;
eend = in_end; eend = in_end;
//assert (total_out % 4 == 0); //assert (total_out % 4 == 0);
@ -246,6 +247,7 @@ void tglq_query_result (long long id UU) {
if (q->methods && q->methods->on_answer) { if (q->methods && q->methods->on_answer) {
if (q->methods->type) { if (q->methods->type) {
int *save = in_ptr; int *save = in_ptr;
vlogprintf (E_DEBUG, "in_ptr = %p, end_ptr = %p\n", in_ptr, in_end);
if (skip_type_any (q->methods->type) < 0) { if (skip_type_any (q->methods->type) < 0) {
vlogprintf (E_ERROR, "Skipped %ld int out of %ld (type %s)\n", in_ptr - save, in_end - save, q->methods->type->type->id); vlogprintf (E_ERROR, "Skipped %ld int out of %ld (type %s)\n", in_ptr - save, in_end - save, q->methods->type->type->id);
assert (0); assert (0);
@ -269,8 +271,8 @@ void tglq_query_result (long long id UU) {
} }
int max_chat_size; //int max_chat_size;
int max_bcast_size; //int max_bcast_size;
//int want_dc_num; //int want_dc_num;
//int new_dc_num; //int new_dc_num;
//extern struct dc *DC_list[]; //extern struct dc *DC_list[];
@ -337,11 +339,12 @@ static int help_get_config_on_answer (struct query *q UU) {
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
fetch_dc_option (); fetch_dc_option ();
} }
max_chat_size = fetch_int (); int max_chat_size = fetch_int ();
int max_bcast_size = 0;
if (op == CODE_config) { if (op == CODE_config) {
max_bcast_size = fetch_int (); max_bcast_size = fetch_int ();
} }
vlogprintf (E_DEBUG, "chat_size = %d\n", max_chat_size); vlogprintf (E_DEBUG, "chat_size = %d, bcast_size = %d\n", max_chat_size, max_bcast_size);
if (q->callback) { if (q->callback) {
((void (*)(void *, int))(q->callback))(q->callback_extra, 1); ((void (*)(void *, int))(q->callback))(q->callback_extra, 1);
@ -447,7 +450,7 @@ static struct query_methods phone_call_methods = {
void tgl_do_phone_call (const char *user, const char *hash,void (*callback)(void *callback_extra, int success), void *callback_extra) { void tgl_do_phone_call (const char *user, const char *hash,void (*callback)(void *callback_extra, int success), void *callback_extra) {
vlogprintf (E_DEBUG, "calling user\n"); vlogprintf (E_DEBUG, "calling user\n");
//suser = tstrdup (user); //suser = tstrdup (user);
want_dc_num = 0; //want_dc_num = 0;
clear_packet (); clear_packet ();
tgl_do_insert_header (); tgl_do_insert_header ();
out_int (CODE_auth_send_call); out_int (CODE_auth_send_call);

1
tgl.c
View File

@ -60,3 +60,4 @@ int tgl_signed_dc (struct dc *DC) {
assert (DC); assert (DC);
return DC->has_auth; return DC->has_auth;
} }

19
tgl.h
View File

@ -33,19 +33,14 @@ struct bingnum_ctx;
#define TGL_UPDATE_ACCESS_HASH 16384 #define TGL_UPDATE_ACCESS_HASH 16384
struct tgl_allocator { struct tgl_allocator {
void *(*talloc)(size_t size); void *(*alloc)(size_t size);
void *(*trealloc)(void *ptr, size_t old_size, size_t size); void *(*realloc)(void *ptr, size_t old_size, size_t size);
void *(*talloc0)(size_t size); void (*free)(void *ptr, int size);
char *(*tstrdup)(const char *s); void (*check)(void);
char *(*tstrndup)(const char *s, size_t n); void (*exists)(void *ptr, int size);
void (*tfree)(void *ptr, int size);
void (*tfree_str)(void *ptr);
void (*tfree_secure)(void *ptr, int size);
int (*tasprintf)(char **res, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
int (*tsnprintf)(char *buf, int len, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
void (*tcheck)(void);
void (*texists)(void *ptr, int size);
}; };
extern struct tgl_allocator tgl_allocator_release;
extern struct tgl_allocator tgl_allocator_debug;
struct tgl_update_callback { struct tgl_update_callback {
void (*new_msg)(struct tgl_message *M); void (*new_msg)(struct tgl_message *M);

105
tools.c
View File

@ -36,7 +36,6 @@
//#include "interface.h" //#include "interface.h"
#include "tools.h" #include "tools.h"
#ifdef DEBUG
#define RES_PRE 8 #define RES_PRE 8
#define RES_AFTER 8 #define RES_AFTER 8
#define MAX_BLOCKS 1000000 #define MAX_BLOCKS 1000000
@ -44,8 +43,8 @@ static void *blocks[MAX_BLOCKS];
static void *free_blocks[MAX_BLOCKS]; static void *free_blocks[MAX_BLOCKS];
static int used_blocks; static int used_blocks;
static int free_blocks_cnt; static int free_blocks_cnt;
#endif
static long long total_allocated_bytes;
void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2), weak)); void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2), weak));
void logprintf (const char *format, ...) { void logprintf (const char *format, ...) {
@ -55,11 +54,11 @@ void logprintf (const char *format, ...) {
va_end (ap); va_end (ap);
} }
extern int verbosity; //extern int verbosity;
long long total_allocated_bytes; //static long long total_allocated_bytes;
int tsnprintf (char *buf, int len, const char *format, ...) { int tgl_snprintf (char *buf, int len, const char *format, ...) {
va_list ap; va_list ap;
va_start (ap, format); va_start (ap, format);
int r = vsnprintf (buf, len, format, ap); int r = vsnprintf (buf, len, format, ap);
@ -68,7 +67,7 @@ int tsnprintf (char *buf, int len, const char *format, ...) {
return r; return r;
} }
int tasprintf (char **res, const char *format, ...) { int tgl_asprintf (char **res, const char *format, ...) {
va_list ap; va_list ap;
va_start (ap, format); va_start (ap, format);
int r = vasprintf (res, format, ap); int r = vasprintf (res, format, ap);
@ -81,9 +80,7 @@ int tasprintf (char **res, const char *format, ...) {
return r; return r;
} }
void print_backtrace (void); void tgl_free_debug (void *ptr, int size __attribute__ ((unused))) {
void tfree (void *ptr, int size __attribute__ ((unused))) {
#ifdef DEBUG
total_allocated_bytes -= size; total_allocated_bytes -= size;
ptr -= RES_PRE; ptr -= RES_PRE;
if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) { if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) {
@ -107,36 +104,28 @@ void tfree (void *ptr, int size __attribute__ ((unused))) {
memset (ptr, 0, size + RES_PRE + RES_AFTER); memset (ptr, 0, size + RES_PRE + RES_AFTER);
*(int *)ptr = size + 12; *(int *)ptr = size + 12;
free_blocks[free_blocks_cnt ++] = ptr; free_blocks[free_blocks_cnt ++] = ptr;
#else }
void tgl_free_release (void *ptr, int size) {
free (ptr); free (ptr);
#endif
} }
void tfree_str (void *ptr) {
if (!ptr) { return; }
tfree (ptr, strlen (ptr) + 1);
}
void tfree_secure (void *ptr, int size) {
memset (ptr, 0, size);
tfree (ptr, size);
}
void *trealloc (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) { void *tgl_realloc_debug (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) {
#ifdef DEBUG
void *p = talloc (size); void *p = talloc (size);
memcpy (p, ptr, size >= old_size ? old_size : size); memcpy (p, ptr, size >= old_size ? old_size : size);
tfree (ptr, old_size); tfree (ptr, old_size);
return p; return p;
#else }
void *tgl_realloc_release (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) {
void *p = realloc (ptr, size); void *p = realloc (ptr, size);
ensure_ptr (p); ensure_ptr (p);
return p; return p;
#endif
} }
void *talloc (size_t size) { void *tgl_alloc_debug (size_t size) {
#ifdef DEBUG
total_allocated_bytes += size; total_allocated_bytes += size;
void *p = malloc (size + RES_PRE + RES_AFTER); void *p = malloc (size + RES_PRE + RES_AFTER);
ensure_ptr (p); ensure_ptr (p);
@ -151,49 +140,34 @@ void *talloc (size_t size) {
} }
tcheck (); tcheck ();
return p + 8; return p + 8;
#else }
void *tgl_alloc_release (size_t size) {
void *p = malloc (size); void *p = malloc (size);
ensure_ptr (p); ensure_ptr (p);
return p; return p;
#endif
} }
void *talloc0 (size_t size) { void *tgl_alloc0 (size_t size) {
void *p = talloc (size); void *p = talloc (size);
memset (p, 0, size); memset (p, 0, size);
return p; return p;
} }
char *tstrdup (const char *s) { char *tgl_strdup (const char *s) {
#ifdef DEBUG
int l = strlen (s); int l = strlen (s);
char *p = talloc (l + 1); char *p = talloc (l + 1);
memcpy (p, s, l + 1); memcpy (p, s, l + 1);
return p; return p;
#else
char *p = strdup (s);
if (p == NULL) {
out_of_memory ();
}
return p;
#endif
} }
char *tstrndup (const char *s, size_t n) { char *tgl_strndup (const char *s, size_t n) {
#ifdef DEBUG
size_t l = 0; size_t l = 0;
for (l = 0; l < n && s[l]; l++) { } for (l = 0; l < n && s[l]; l++) { }
char *p = talloc (l + 1); char *p = talloc (l + 1);
memcpy (p, s, l); memcpy (p, s, l);
p[l] = 0; p[l] = 0;
return p; return p;
#else
char *p = strndup (s, n);
if (p == NULL) {
out_of_memory ();
}
return p;
#endif
} }
@ -205,23 +179,19 @@ int tgl_inflate (void *input, int ilen, void *output, int olen) {
strm.next_in = input; strm.next_in = input;
strm.avail_out = olen ; strm.avail_out = olen ;
strm.next_out = output; strm.next_out = output;
int err = inflate (&strm, Z_FINISH), total_out = 0; int err = inflate (&strm, Z_FINISH);
if (err == Z_OK || err == Z_STREAM_END) { int total_out = strm.total_out;
total_out = (int) strm.total_out;
if (err == Z_STREAM_END && verbosity >= 2) { if (err != Z_OK && err != Z_STREAM_END) {
logprintf ( "inflated %d bytes\n", (int) strm.total_out);
}
}
if (verbosity && err != Z_STREAM_END) {
logprintf ( "inflate error = %d\n", err); logprintf ( "inflate error = %d\n", err);
logprintf ( "inflated %d bytes\n", (int) strm.total_out); logprintf ( "inflated %d bytes\n", (int) strm.total_out);
total_out = 0;
} }
inflateEnd (&strm); inflateEnd (&strm);
return total_out; return total_out;
} }
#ifdef DEBUG void tgl_check_debug (void) {
void tcheck (void) {
int i; int i;
for (i = 0; i < used_blocks; i++) { for (i = 0; i < used_blocks; i++) {
void *ptr = blocks[i]; void *ptr = blocks[i];
@ -248,7 +218,7 @@ void tcheck (void) {
//logprintf ("ok. Used_blocks = %d. Free blocks = %d\n", used_blocks, free_blocks_cnt); //logprintf ("ok. Used_blocks = %d. Free blocks = %d\n", used_blocks, free_blocks_cnt);
} }
void texists (void *ptr, int size) { void tgl_exists_debug (void *ptr, int size) {
ptr -= RES_PRE; ptr -= RES_PRE;
if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) { if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) {
logprintf ("size = %d, ptr = %d\n", size, (*(int *)ptr) ^ 0xbedabeda); logprintf ("size = %d, ptr = %d\n", size, (*(int *)ptr) ^ 0xbedabeda);
@ -262,7 +232,9 @@ void texists (void *ptr, int size) {
} }
assert (block_num < used_blocks); assert (block_num < used_blocks);
} }
#endif
void tgl_exists_release (void *ptr, int size) {}
void tgl_check_release (void) {}
void tgl_my_clock_gettime (int clock_id, struct timespec *T) { void tgl_my_clock_gettime (int clock_id, struct timespec *T) {
#ifdef __MACH__ #ifdef __MACH__
@ -295,3 +267,20 @@ void tglt_secure_random (void *s, int l) {
} }
} }
struct tgl_allocator tgl_allocator_debug = {
.alloc = tgl_alloc_debug,
.realloc = tgl_realloc_debug,
.free = tgl_free_debug,
.check = tgl_check_debug,
.exists = tgl_exists_debug
};
struct tgl_allocator tgl_allocator_release = {
.alloc = tgl_alloc_release,
.realloc = tgl_realloc_release,
.free = tgl_free_release,
.check = tgl_check_release,
.exists = tgl_exists_release
};
struct tgl_allocator *tgl_allocator = &tgl_allocator_release;

75
tools.h
View File

@ -22,14 +22,25 @@
#include <time.h> #include <time.h>
#include <openssl/err.h> #include <openssl/err.h>
#include <assert.h> #include <assert.h>
#include "tgl.h"
#define talloc tgl_allocator->alloc
#define talloc0 tgl_alloc0
#define tfree tgl_allocator->free
#define tfree_str tgl_free_str
#define tfree_secure tgl_free_secure
#define trealloc tgl_allocator->realloc
#define tcheck tgl_allocator->check
#define texists tgl_allocator->exists
#define tstrdup tgl_strdup
#define tstrndup tgl_strndup
#define tasprintf tgl_asprintf
#define tsnprintf tgl_snprintf
struct tgl_allocator *tgl_allocator;
double tglt_get_double_time (void); double tglt_get_double_time (void);
void *talloc (size_t size);
void *trealloc (void *ptr, size_t old_size, size_t size);
void *talloc0 (size_t size);
char *tstrdup (const char *s);
char *tstrndup (const char *s, size_t n);
int tgl_inflate (void *input, int ilen, void *output, int olen); int tgl_inflate (void *input, int ilen, void *output, int olen);
//void ensure (int r); //void ensure (int r);
//void ensure_ptr (void *p); //void ensure_ptr (void *p);
@ -53,20 +64,56 @@ static inline void ensure_ptr (void *p) {
} }
} }
void tfree (void *ptr, int size); void *tgl_alloc_debug (size_t size);
void tfree_str (void *ptr); void *tgl_alloc_release (size_t size);
void tfree_secure (void *ptr, int size);
void *tgl_realloc_debug (void *ptr, size_t old_size, size_t size);
void *tgl_realloc_release (void *ptr, size_t old_size, size_t size);
void *tgl_alloc0 (size_t size);
char *tgl_strdup (const char *s);
char *tgl_strndup (const char *s, size_t n);
void tgl_free_debug (void *ptr, int size);
void tgl_free_release (void *ptr, int size);
//void tgl_free_str (void *ptr);
//void tgl_free_secure (void *ptr, int size);
void tgl_check_debug (void);
void tgl_exists_debug (void *ptr, int size);
void tgl_check_release (void);
void tgl_exists_release (void *ptr, int size);
int tsnprintf (char *buf, int len, const char *format, ...) __attribute__ ((format (printf, 3, 4))); int tgl_snprintf (char *buf, int len, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
int tasprintf (char **res, const char *format, ...) __attribute__ ((format (printf, 2, 3))); int tgl_asprintf (char **res, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
void tglt_secure_random (void *s, int l); void tglt_secure_random (void *s, int l);
void tgl_my_clock_gettime (int clock_id, struct timespec *T); void tgl_my_clock_gettime (int clock_id, struct timespec *T);
#ifdef DEBUG static inline void tgl_free_str (void *ptr) {
void tcheck (void); if (!ptr) { return; }
void texists (void *ptr, int size); tfree (ptr, strlen (ptr) + 1);
}
static inline void tgl_free_secure (void *ptr, int size) {
memset (ptr, 0, size);
tfree (ptr, size);
}
static inline void hexdump (void *ptr, void *end_ptr) {
int total = 0;
while (ptr < end_ptr) {
fprintf (stderr, "%08x", (int)*(char *)ptr);
ptr ++;
total ++;
if (total == 16) {
fprintf (stderr, "\n");
total = 0;
}
}
if (total) { fprintf (stderr, "\n"); }
}
#endif #endif
#endif