1 /*
2  * Basic C environment.
3  *
4  * Copyright (c) 2007-2009 Marko Kreen
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <usual/base.h>
20 #include <usual/bits.h>
21 
22 #if defined(HAVE_MALLOC_H) && defined(__darwin__)
23 #include <malloc.h>
24 #endif
25 
26 /* define posix_memalign() only when possible to emulate */
27 #if !defined(HAVE_POSIX_MEMALIGN) \
28     && (defined(HAVE_MEMALIGN) || defined(HAVE_VALLOC))
29 
posix_memalign(void ** ptr_p,size_t align,size_t len)30 int posix_memalign(void **ptr_p, size_t align, size_t len)
31 {
32 	void *p;
33 	int ret, old_errno = errno;
34 
35 #ifdef HAVE_MEMALIGN
36 	p = memalign(align, len);
37 #else /* !HAVE_MEMALIGN */
38 #ifdef HAVE_VALLOC
39 	/* assuming less than pagesize alignment */
40 	p = valloc(len);
41 #endif /* !VALLOC */
42 #endif /* !MEMALIGN */
43 
44 	*ptr_p = p;
45 	if (p)
46 		return 0;
47 
48 	/* on error restore old errno */
49 	ret = errno;
50 	errno = old_errno;
51 	return ret;
52 }
53 #endif
54 
55 #ifndef HAVE_REALLOCARRAY
56 
reallocarray(void * p,size_t count,size_t size)57 void *reallocarray(void *p, size_t count, size_t size)
58 {
59 	size_t total;
60 	if (!safe_mul_size(&total, count, size)) {
61 		errno = ENOMEM;
62 		return NULL;
63 	}
64 	return realloc(p, total);
65 }
66 
67 #endif
68