base: compat posix_memalign()
authorMarko Kreen <markokr@gmail.com>
Tue, 2 Mar 2010 14:43:40 +0000 (16:43 +0200)
committerMarko Kreen <markokr@gmail.com>
Wed, 3 Mar 2010 07:50:22 +0000 (09:50 +0200)
m4/usual.m4
usual/base.c [new file with mode: 0644]
usual/base.h

index ce03f14e72a934d1a93a573174dc37258bd996e3..8f15364e122f5d3bfabea98ccefab174a8575157 100644 (file)
@@ -114,6 +114,7 @@ AC_CHECK_HEADERS([arpa/inet.h netinet/in.h netinet/tcp.h])
 AC_CHECK_HEADERS([sys/param.h sys/uio.h libgen.h pwd.h grp.h])
 AC_CHECK_HEADERS([sys/wait.h sys/mman.h syslog.h netdb.h dlfcn.h])
 AC_CHECK_HEADERS([err.h pthread.h endian.h sys/endian.h byteswap.h])
+AC_CHECK_HEADERS([malloc.h])
 dnl ucred.h may have prereqs
 AC_CHECK_HEADERS([ucred.h sys/ucred.h], [], [], [
 #ifdef HAVE_SYS_TYPES_H
@@ -133,6 +134,7 @@ AC_DEFUN([AC_USUAL_FUNCTION_CHECK], [
 AC_CHECK_FUNCS(basename strlcpy strlcat getpeereid sigaction)
 AC_CHECK_FUNCS(inet_ntop poll getline)
 AC_CHECK_FUNCS(err errx warn warnx getprogname setprogname)
+AC_CHECK_FUNCS(posix_memalign memalign valloc)
 ### Functions provided only on win32
 AC_CHECK_FUNCS(localtime_r recvmsg sendmsg)
 ### Functions used by libusual itself
diff --git a/usual/base.c b/usual/base.c
new file mode 100644 (file)
index 0000000..ed45156
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Basic C environment.
+ *
+ * Copyright (c) 2007-2009 Marko Kreen
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <usual/base.h>
+
+#ifdef HAVE_MALLOC_H
+#include <malloc.h>
+#endif
+
+#ifndef HAVE_POSIX_MEMALIGN
+int posix_memalign(void **ptr_p, size_t align, size_t len)
+{
+       void *p;
+       int ret, old_errno = errno;
+
+#ifdef HAVE_MEMALIGN
+       p = memalign(align, len);
+#else /* !HAVE_MEMALIGN */
+#ifdef HAVE_VALLOC
+       /* assuming less than pagesize alignment */
+       p = valloc(len);
+#else /* !VALLOC */
+       #warning "cannot emulate posix_memalign sanely"
+       p = malloc(len);
+#endif /* !VALLOC */
+#endif /* !MEMALIGN */
+
+       *ptr_p = p;
+       if (p)
+               return 0;
+
+       /* on error restore old errno */
+       ret = errno;
+       errno = old_errno;
+       return ret;
+}
+#endif
+
index 27bc542183119a38a001b87f22074a0b6aec259b..590786e747e97bc2db473714f595c047a05d6912 100644 (file)
@@ -126,6 +126,11 @@ static inline void *zmalloc(size_t len)
        return calloc(1, len);
 }
 
+#ifndef HAVE_POSIX_MEMALIGN
+#define posix_memalign(a,b,c) usual_memalign(a,b,c)
+int posix_memalign(void **ptr_p, size_t align, size_t len);
+#endif
+
 /* cpp expr -> string */
 #define _STR_(identifier) #identifier
 #define STR(x) _STR_(x)