summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tgl/tools.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tgl/tools.c')
-rw-r--r--protocols/Telegram/tgl/tools.c406
1 files changed, 0 insertions, 406 deletions
diff --git a/protocols/Telegram/tgl/tools.c b/protocols/Telegram/tgl/tools.c
deleted file mode 100644
index 02de961ef1..0000000000
--- a/protocols/Telegram/tgl/tools.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- This file is part of tgl-library
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
- Copyright Vitaly Valtman 2013-2015
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#define _GNU_SOURCE
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <openssl/err.h>
-#include <openssl/rand.h>
-#include <zlib.h>
-#include <time.h>
-#if defined(WIN32) || defined(_WIN32)
-#include <sys/timeb.h>
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#else
-#include <sys/time.h>
-#endif // _WIN32
-
-//#include "interface.h"
-#include "tools.h"
-
-#ifdef __MACH__
-#include <mach/clock.h>
-#include <mach/mach.h>
-#endif
-
-#if defined(__MACH__) || defined(WIN32) || defined(_WIN32)
-#define CLOCK_REALTIME 0
-#define CLOCK_MONOTONIC 1
-#endif
-
-#ifdef VALGRIND_FIXES
-#include "valgrind/memcheck.h"
-#endif
-
-#define RES_PRE 8
-#define RES_AFTER 8
-#define MAX_BLOCKS 1000000
-static void *blocks[MAX_BLOCKS];
-static void *free_blocks[MAX_BLOCKS];
-static int used_blocks;
-static int free_blocks_cnt;
-
-static long long total_allocated_bytes;
-
-#if defined(WIN32) || defined(_WIN32)
-#define exp7 10000000i64 //1E+7 //C-file part
-#define exp9 1000000000i64 //1E+9
-#define w2ux 116444736000000000i64 //1.jan1601 to 1.jan1970
-#define __need_clock_t
-#include <time.h>
-
-int gettimeofday(struct timeval* t, void* timezone) {
- struct _timeb timebuffer;
- _ftime_s(&timebuffer);
- t->tv_sec = (long)timebuffer.time;
- t->tv_usec = 1000 * timebuffer.millitm;
- return 0;
-}
-
-
-struct tms {
- clock_t tms_utime;
- clock_t tms_stime;
-
- clock_t tms_cutime;
- clock_t tms_cstime;
-};
-
-clock_t times(struct tms *__buffer) {
- __buffer->tms_utime = clock();
- __buffer->tms_stime = 0;
- __buffer->tms_cstime = 0;
- __buffer->tms_cutime = 0;
- return __buffer->tms_utime;
-}
-
-typedef long long suseconds_t;
-
-int vasprintf(char ** __restrict ret, const char * __restrict format, va_list ap) {
- int len;
- /* Get Length */
- len = _vsnprintf_s(NULL, 0, 0, format, ap);
- if (len < 0) return -1;
-
- /* +1 for \0 terminator. */
- *ret = malloc(len + 1);
- if (!*ret) return -1;
-
- _vsnprintf_s(*ret, len + 1, len + 1, format, ap);
-
- /* Terminate explicitly */
- (*ret)[len] = '\0';
- return len;
-}
-#endif // WIN32
-
-void logprintf (const char *format, ...) __attribute__ ((format (printf, 1, 2), weak));
-void logprintf (const char *format, ...) {
- va_list ap;
- va_start (ap, format);
- vfprintf (stdout, format, ap);
- va_end (ap);
-}
-
-//extern int verbosity;
-
-//static long long total_allocated_bytes;
-
-int tgl_snprintf (char *buf, int len, const char *format, ...) {
- va_list ap;
- va_start (ap, format);
- int r = vsnprintf (buf, len, format, ap);
- va_end (ap);
- assert (r <= len && "tsnprintf buffer overflow");
- return r;
-}
-
-int tgl_asprintf (char **res, const char *format, ...) {
- va_list ap;
- va_start (ap, format);
- int r = vasprintf (res, format, ap);
- assert (r >= 0);
- va_end (ap);
- void *rs = talloc (strlen (*res) + 1);
- memcpy (rs, *res, strlen (*res) + 1);
- free (*res);
- *res = rs;
- return r;
-}
-
-void tgl_free_debug (void *ptr, int size __attribute__ ((unused))) {
- total_allocated_bytes -= size;
- (char*)ptr -= RES_PRE;
- if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) {
- logprintf ("size = %d, ptr = %d\n", size, (*(int *)ptr) ^ 0xbedabeda);
- }
- assert (*(int *)ptr == (int)((size) ^ 0xbedabeda));
- assert (*(int *)((char *)ptr + RES_PRE + size) == (int)((size) ^ 0x7bed7bed));
- assert (*(int *)((char *)ptr + 4) == size);
- int block_num = *(int *)((char*)ptr + 4 + RES_PRE + size);
- if (block_num >= used_blocks) {
- logprintf ("block_num = %d, used = %d\n", block_num, used_blocks);
- }
- assert (block_num < used_blocks);
- if (block_num < used_blocks - 1) {
- void *p = blocks[used_blocks - 1];
- int s = (*(int *)p) ^ 0xbedabeda;
- *(int *)((char *)p + 4 + RES_PRE + s) = block_num;
- blocks[block_num] = p;
- }
- blocks[--used_blocks] = 0;
- memset (ptr, 0, size + RES_PRE + RES_AFTER);
- *(int *)ptr = size + 12;
- free_blocks[free_blocks_cnt ++] = ptr;
-}
-
-void tgl_free_release (void *ptr, int size) {
- memset (ptr, 0, size);
- free (ptr);
-}
-
-
-
-void *tgl_realloc_debug (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) {
- void *p = talloc (size);
- memcpy (p, ptr, size >= old_size ? old_size : size);
- tfree (ptr, old_size);
- return p;
-}
-
-void *tgl_realloc_release (void *ptr, size_t old_size __attribute__ ((unused)), size_t size) {
- void *p = realloc (ptr, size);
- ensure_ptr (p);
- return p;
-}
-
-void *tgl_alloc_debug (size_t size) {
- total_allocated_bytes += size;
- void *p = malloc (size + RES_PRE + RES_AFTER);
- ensure_ptr (p);
- *(int *)p = size ^ 0xbedabeda;
- *(int *)((char *)p + 4) = size;
- *(int *)((char *)p + RES_PRE + size) = size ^ 0x7bed7bed;
- *(int *)((char *)p + RES_AFTER + 4 + size) = used_blocks;
- blocks[used_blocks ++] = p;
-
- //tcheck ();
- return (char *)p + 8;
-}
-
-void *tgl_alloc_release (size_t size) {
- void *p = malloc (size);
- ensure_ptr (p);
- return p;
-}
-
-void *tgl_alloc0 (size_t size) {
- void *p = talloc (size);
- memset (p, 0, size);
- return p;
-}
-
-char *tgl_strdup (const char *s) {
- int l = strlen (s);
- char *p = talloc (l + 1);
-#if defined(WIN32) || defined(_WIN32)
- ZeroMemory(p, l + 1);
-#endif
- memcpy (p, s, l + 1);
- return p;
-}
-
-char *tgl_strndup (const char *s, size_t n) {
- size_t l = 0;
- for (l = 0; l < n && s[l]; l++) { }
- char *p = talloc (l + 1);
- memcpy (p, s, l);
- p[l] = 0;
- return p;
-}
-
-void *tgl_memdup (const void *s, size_t n) {
- void *r = talloc (n);
- memcpy (r, s, n);
- return r;
-}
-
-
-int tgl_inflate (void *input, int ilen, void *output, int olen) {
- z_stream strm;
- memset (&strm, 0, sizeof (strm));
- assert (inflateInit2 (&strm, 16 + MAX_WBITS) == Z_OK);
- strm.avail_in = ilen;
- strm.next_in = input;
- strm.avail_out = olen ;
- strm.next_out = output;
- int err = inflate (&strm, Z_FINISH);
- int total_out = strm.total_out;
-
- if (err != Z_OK && err != Z_STREAM_END) {
- logprintf ( "inflate error = %d\n", err);
- logprintf ( "inflated %d bytes\n", (int) strm.total_out);
- total_out = 0;
- }
- inflateEnd (&strm);
- return total_out;
-}
-
-void tgl_check_debug (void) {
- int i;
- for (i = 0; i < used_blocks; i++) {
- void *ptr = blocks[i];
- int size = (*(int *)ptr) ^ 0xbedabeda;
- if (!(*(int *)((char *)ptr + 4) == size) ||
- !(*(int *)((char *)ptr + RES_PRE + size) == (size ^ 0x7bed7bed)) ||
- !(*(int *)((char *)ptr + RES_PRE + 4 + size) == i)) {
- logprintf ("Bad block at address %p (size %d, num %d)\n", ptr, size, i);
- assert (0 && "Bad block");
- }
- }
- for (i = 0; i < free_blocks_cnt; i++) {
- void *ptr = free_blocks[i];
- int l = *(int *)ptr;
- int j = 0;
- for (j = 0; j < l; j++) {
- if (*(char *)((char *)ptr + 4 + j)) {
- hexdump ((char *)ptr + 8, (char *)ptr + 8 + l + ((-l) & 3));
- logprintf ("Used freed memory size = %d. ptr = %p\n", l + 4 - RES_PRE - RES_AFTER, ptr);
- assert (0);
- }
- }
- }
- //logprintf ("ok. Used_blocks = %d. Free blocks = %d\n", used_blocks, free_blocks_cnt);
-}
-
-void tgl_exists_debug (void *ptr, int size) {
- (char *)ptr -= RES_PRE;
- if (size != (int)((*(int *)ptr) ^ 0xbedabeda)) {
- logprintf ("size = %d, ptr = %d\n", size, (*(int *)ptr) ^ 0xbedabeda);
- }
- assert (*(int *)ptr == (int)((size) ^ 0xbedabeda));
- assert (*(int *)((char *)ptr + RES_PRE + size) == (int)((size) ^ 0x7bed7bed));
- assert (*(int *)((char *)ptr + 4) == size);
- int block_num = *(int *)((char *)ptr + 4 + RES_PRE + size);
- if (block_num >= used_blocks) {
- logprintf ("block_num = %d, used = %d\n", block_num, used_blocks);
- }
- assert (block_num < used_blocks);
-}
-
-void tgl_exists_release (void *ptr, int size) {}
-void tgl_check_release (void) {}
-
-void tgl_my_clock_gettime (int clock_id, struct timespec *T) {
-#if defined(WIN32) || defined(_WIN32)
- static double ticks2nano;
- static __int64 tps = 0;
- __int64 tmp, curticks;
- _Bool real_time = (clock_id == CLOCK_REALTIME);
-
- QueryPerformanceFrequency((LARGE_INTEGER*)&tmp);
- if (tps != tmp) {
- tps = tmp;
- ticks2nano = (double)exp9 / tps;
- }
-
- if (clock_id == CLOCK_REALTIME)
- {
- __int64 wintime;
- GetSystemTimeAsFileTime((FILETIME*)&wintime);
- wintime -= w2ux;
- T->tv_sec = wintime / exp7;
- T->tv_nsec = wintime % exp7 * 100;
- }
- else
- {
- QueryPerformanceCounter((LARGE_INTEGER*)&curticks);
- T->tv_sec = (long)(curticks / tps);
- T->tv_nsec = (long)((double)(curticks % tps) * ticks2nano);
- }
-
- if (!(T->tv_nsec < exp9))
- {
- T->tv_sec++;
- T->tv_nsec -= exp9;
- }
-
-#elif defined( __MACH__)
- // We are ignoring MONOTONIC and hope time doesn't go back too often
- clock_serv_t cclock;
- mach_timespec_t mts;
- host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
- clock_get_time(cclock, &mts);
- mach_port_deallocate(mach_task_self(), cclock);
- T->tv_sec = mts.tv_sec;
- T->tv_nsec = mts.tv_nsec;
-#else
- assert (clock_gettime(clock_id, T) >= 0);
-#endif
-}
-
-double tglt_get_double_time (void) {
- struct timespec tv;
- tgl_my_clock_gettime (CLOCK_REALTIME, &tv);
- return tv.tv_sec + 1e-9 * tv.tv_nsec;
-}
-
-void tglt_secure_random (void *s, int l) {
- if (RAND_bytes (s, l) <= 0) {
- /*if (allow_weak_random) {
- RAND_pseudo_bytes (s, l);
- } else {*/
- assert (0 && "End of random. If you want, you can start with -w");
- //}
- } else {
- #ifdef VALGRIND_FIXES
- VALGRIND_MAKE_MEM_DEFINED (s, l);
- VALGRIND_CHECK_MEM_IS_DEFINED (s, l);
- #endif
- }
-}
-
-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;