]> git.meshlink.io Git - meshlink/blob - src/dropin.c
Correctly handle incoming retransmissions of SYN packets.
[meshlink] / src / dropin.c
1 /*
2     dropin.c -- a set of drop-in replacements for libc functions
3     Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License along
16     with this program; if not, write to the Free Software Foundation, Inc.,
17     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "system.h"
21
22 #include "xalloc.h"
23
24 #ifndef HAVE_ASPRINTF
25 int asprintf(char **buf, const char *fmt, ...) {
26         int result;
27         va_list ap;
28         va_start(ap, fmt);
29         result = vasprintf(buf, fmt, ap);
30         va_end(ap);
31         return result;
32 }
33
34 int vasprintf(char **buf, const char *fmt, va_list ap) {
35         int status;
36         va_list aq;
37         int len;
38
39         len = 4096;
40         *buf = xmalloc(len);
41
42         va_copy(aq, ap);
43         status = vsnprintf(*buf, len, fmt, aq);
44         va_end(aq);
45
46         if(status >= 0) {
47                 *buf = xrealloc(*buf, status + 1);
48         }
49
50         if(status > len - 1) {
51                 len = status;
52                 va_copy(aq, ap);
53                 status = vsnprintf(*buf, len, fmt, aq);
54                 va_end(aq);
55         }
56
57         return status;
58 }
59 #endif
60
61 #ifndef HAVE_GETTIMEOFDAY
62 int gettimeofday(struct timeval *tv, void *tz) {
63 #ifdef HAVE_MINGW
64         FILETIME ft;
65         GetSystemTimeAsFileTime(&ft);
66         uint64_t lt = (uint64_t)ft.dwLowDateTime | ((uint64_t)ft.dwHighDateTime << 32);
67         lt -= 116444736000000000ULL;
68         tv->tv_sec = lt / 10000000;
69         tv->tv_usec = (lt / 10) % 1000000;
70 #else
71 #warning No high resolution time source!
72         tv->tv_sec = time(NULL);
73         tv->tv_usec = 0;
74 #endif
75         return 0;
76 }
77 #endif
78
79 #ifndef HAVE_USLEEP
80 int usleep(long long usec) {
81         struct timeval tv = {usec / 1000000, (usec / 1000) % 1000};
82         select(0, NULL, NULL, NULL, &tv);
83         return 0;
84 }
85 #endif