1 /*
2  * Copyright (C) 2009      Citrix Ltd.
3  * Author Stefano Stabellini <stefano.stabellini@eu.citrix.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published
7  * by the Free Software Foundation; version 2.1 only. with the special
8  * exception on linking described in file LICENSE.
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 Lesser General Public License for more details.
14  */
15 
16 #include "libxl_osdeps.h"
17 
18 #include <unistd.h>
19 #include <stdarg.h>
20 #include <stdio.h>
21 #include <sys/time.h>
22 #include <stdlib.h>
23 
24 #ifdef NEED_OWN_ASPRINTF
25 
vasprintf(char ** buffer,const char * fmt,va_list ap)26 int vasprintf(char **buffer, const char *fmt, va_list ap)
27 {
28     int size = 0;
29     int nchars;
30 
31     *buffer = 0;
32 
33     nchars = vsnprintf(*buffer, 0, fmt, ap);
34 
35     if (nchars >= size)
36     {
37         char *tmpbuff;
38         /* Reallocate buffer now that we know how much space is needed. */
39         size = nchars+1;
40         tmpbuff = (char*)realloc(*buffer, size);
41 
42 
43         if (tmpbuff == NULL) { /* we need to free it*/
44             free(*buffer);
45             return -1;
46         }
47 
48         *buffer=tmpbuff;
49         /* Try again. */
50         nchars = vsnprintf(*buffer, size, fmt, ap);
51     }
52 
53     if (nchars < 0) return nchars;
54     return size;
55 }
56 
asprintf(char ** buffer,char * fmt,...)57 int asprintf(char **buffer, char *fmt, ...)
58 {
59     int status;
60     va_list ap;
61 
62     va_start (ap, fmt);
63     status = vasprintf (buffer, fmt, ap);
64     va_end (ap);
65     return status;
66 }
67 
68 #endif
69 
70 /*
71  * Local variables:
72  * mode: C
73  * c-basic-offset: 4
74  * indent-tabs-mode: nil
75  * End:
76  */
77