]> git.meshlink.io Git - meshlink/blob - src/dropin.c
Avoid allocating packet buffers unnecessarily.
[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