summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Shadura <andrew@shadura.me>2014-01-28 15:21:50 +0100
committerAndrew Shadura <andrew@shadura.me>2014-01-28 15:21:50 +0100
commit51addbcf27d7b06dae80a0e39e5f5f83e94dd8ae (patch)
tree3d00bef2d26f97257ec6f4835505cd300054a1e3
parent1ed00f1a2893b43195f3fc747988da0bf6006797 (diff)
Update to libmowgli 2.0.0
-rw-r--r--.gitignore36
-rw-r--r--AUTHORS1
-rw-r--r--COPYING4
-rw-r--r--GIT-Access2
-rw-r--r--Makefile6
-rw-r--r--README14
-rw-r--r--aclocal.m414
-rwxr-xr-xautogen.sh86
-rw-r--r--buildsys.mk.in468
-rwxr-xr-xconfig.guess1519
-rwxr-xr-xconfig.rpath132
-rwxr-xr-xconfig.sub1626
-rwxr-xr-xconfigure5568
-rw-r--r--configure.ac172
-rw-r--r--debian/changelog6
-rw-r--r--debian/clean2
-rw-r--r--debian/control14
-rw-r--r--debian/libmowgli-2-0.install (renamed from debian/libmowgli2.install)0
-rw-r--r--debian/libmowgli-2-0.lintian-overrides (renamed from debian/libmowgli2.lintian-overrides)0
-rw-r--r--debian/libmowgli-2-0.symbols (renamed from debian/libmowgli2.symbols)162
-rw-r--r--debian/libmowgli-2-dev.docs (renamed from debian/libmowgli-dev.docs)0
-rw-r--r--debian/libmowgli-2-dev.examples (renamed from debian/libmowgli-dev.examples)0
-rw-r--r--debian/libmowgli-2-dev.install (renamed from debian/libmowgli-dev.install)0
-rwxr-xr-xdebian/rules8
-rw-r--r--doc/BOOST1
-rw-r--r--doc/design-concepts.txt116
-rw-r--r--extra.mk.in10
-rwxr-xr-xinstall-sh534
-rw-r--r--libmowgli-2.pc.in (renamed from libmowgli.pc.in)6
-rw-r--r--m4/acx_pthread.m4258
-rw-r--r--m4/ax_check_openssl.m4124
-rw-r--r--m4/buildsys.m4152
-rwxr-xr-xscripts/makerelease.sh4
-rw-r--r--src/examples/Makefile2
-rw-r--r--src/examples/async_resolver/Makefile7
-rw-r--r--src/examples/async_resolver/async_resolver.c151
-rw-r--r--src/examples/dicttest/Makefile7
-rw-r--r--src/examples/dicttest/dicttest.c79
-rw-r--r--src/examples/echoserver/Makefile7
-rw-r--r--src/examples/echoserver/echoserver.c139
-rw-r--r--src/examples/formattertest/Makefile2
-rw-r--r--src/examples/formattertest/formattertest.c1
-rw-r--r--src/examples/futuretest/Makefile7
-rw-r--r--src/examples/futuretest/futuretest.c89
-rw-r--r--src/examples/helpertest/Makefile7
-rw-r--r--src/examples/helpertest/helpertest.c109
-rw-r--r--src/examples/libevent-bench/Makefile7
-rw-r--r--src/examples/libevent-bench/bench.c230
-rw-r--r--src/examples/linetest/Makefile7
-rw-r--r--src/examples/linetest/linetest.c162
-rw-r--r--src/examples/listsort/Makefile2
-rw-r--r--src/examples/listsort/listsort.c4
-rw-r--r--src/examples/memslice-bench/Makefile7
-rw-r--r--src/examples/memslice-bench/memslice-bench.c117
-rw-r--r--src/examples/patriciatest/Makefile2
-rw-r--r--src/examples/patriciatest/patriciatest.c2
-rw-r--r--src/examples/patriciatest2/Makefile2
-rw-r--r--src/examples/patriciatest2/patriciatest2.c2
-rw-r--r--src/examples/randomtest/Makefile2
-rw-r--r--src/examples/timertest/Makefile7
-rw-r--r--src/examples/timertest/timertest.c (renamed from src/libmowgli/mowgli_init.c)60
-rw-r--r--src/examples/vio-udplistener/Makefile7
-rw-r--r--src/examples/vio-udplistener/vio-udplistener.c45
-rw-r--r--src/libmowgli/Makefile80
-rw-r--r--src/libmowgli/base/Makefile29
-rw-r--r--src/libmowgli/base/argstack.c (renamed from src/libmowgli/mowgli_argstack.c)4
-rw-r--r--src/libmowgli/base/argstack.h (renamed from src/libmowgli/mowgli_argstack.h)4
-rw-r--r--src/libmowgli/base/bitvector.c (renamed from src/libmowgli/mowgli_bitvector.c)4
-rw-r--r--src/libmowgli/base/bitvector.h (renamed from src/libmowgli/mowgli_bitvector.h)4
-rw-r--r--src/libmowgli/base/formatter.c (renamed from src/libmowgli/mowgli_formatter.c)2
-rw-r--r--src/libmowgli/base/formatter.h (renamed from src/libmowgli/mowgli_formatter.h)2
-rw-r--r--src/libmowgli/base/hash.c (renamed from src/libmowgli/mowgli_hash.c)14
-rw-r--r--src/libmowgli/base/hash.h (renamed from src/libmowgli/mowgli_hash.h)2
-rw-r--r--src/libmowgli/base/hook.c (renamed from src/libmowgli/mowgli_hook.c)6
-rw-r--r--src/libmowgli/base/hook.h (renamed from src/libmowgli/mowgli_hook.h)4
-rw-r--r--src/libmowgli/base/memslice.c146
-rw-r--r--src/libmowgli/base/memslice.h27
-rw-r--r--src/libmowgli/base/mowgli_signal.c (renamed from src/libmowgli/mowgli_signal.c)1
-rw-r--r--src/libmowgli/base/mowgli_signal.h (renamed from src/libmowgli/mowgli_signal.h)2
-rw-r--r--src/libmowgli/base/random.c (renamed from src/libmowgli/mowgli_random.c)10
-rw-r--r--src/libmowgli/base/random.h (renamed from src/libmowgli/mowgli_random.h)4
-rw-r--r--src/libmowgli/container/Makefile23
-rw-r--r--src/libmowgli/container/dictionary.c (renamed from src/libmowgli/mowgli_dictionary.c)53
-rw-r--r--src/libmowgli/container/dictionary.h (renamed from src/libmowgli/mowgli_dictionary.h)38
-rw-r--r--src/libmowgli/container/index.c (renamed from src/libmowgli/mowgli_index.c)16
-rw-r--r--src/libmowgli/container/index.h (renamed from src/libmowgli/mowgli_index.h)0
-rw-r--r--src/libmowgli/container/list.c (renamed from src/libmowgli/mowgli_list.c)34
-rw-r--r--src/libmowgli/container/list.h (renamed from src/libmowgli/mowgli_list.h)12
-rw-r--r--src/libmowgli/container/patricia.c (renamed from src/libmowgli/mowgli_patricia.c)51
-rw-r--r--src/libmowgli/container/patricia.h (renamed from src/libmowgli/mowgli_patricia.h)9
-rw-r--r--src/libmowgli/container/queue.c (renamed from src/libmowgli/mowgli_queue.c)26
-rw-r--r--src/libmowgli/container/queue.h (renamed from src/libmowgli/mowgli_queue.h)4
-rw-r--r--src/libmowgli/dns/Makefile20
-rw-r--r--src/libmowgli/dns/dns.c82
-rw-r--r--src/libmowgli/dns/dns.h96
-rw-r--r--src/libmowgli/dns/dns_evloop_res.c1017
-rw-r--r--src/libmowgli/dns/dns_evloop_res.h44
-rw-r--r--src/libmowgli/dns/dns_evloop_reslib.c1102
-rw-r--r--src/libmowgli/dns/dns_evloop_reslib.h112
-rw-r--r--src/libmowgli/dns/dns_evloop_reslist_win32.c97
-rw-r--r--src/libmowgli/eventloop/Makefile14
-rw-r--r--src/libmowgli/eventloop/epoll_pollops.c198
-rw-r--r--src/libmowgli/eventloop/eventloop.c170
-rw-r--r--src/libmowgli/eventloop/eventloop.h259
-rw-r--r--src/libmowgli/eventloop/helper.c230
-rw-r--r--src/libmowgli/eventloop/kqueue_pollops.c189
-rw-r--r--src/libmowgli/eventloop/null_pollops.c124
-rw-r--r--src/libmowgli/eventloop/poll_pollops.c229
-rw-r--r--src/libmowgli/eventloop/pollable.c88
-rw-r--r--src/libmowgli/eventloop/ports_pollops.c186
-rw-r--r--src/libmowgli/eventloop/qnx_pollops.c200
-rw-r--r--src/libmowgli/eventloop/select_pollops.c203
-rw-r--r--src/libmowgli/eventloop/timer.c172
-rw-r--r--src/libmowgli/eventloop/windows_pollops.c276
-rw-r--r--src/libmowgli/ext/Makefile25
-rw-r--r--src/libmowgli/ext/confparse.c436
-rw-r--r--src/libmowgli/ext/confparse.h45
-rw-r--r--src/libmowgli/ext/error_backtrace.c (renamed from src/libmowgli/mowgli_error_backtrace.c)10
-rw-r--r--src/libmowgli/ext/error_backtrace.h (renamed from src/libmowgli/mowgli_error_backtrace.h)2
-rw-r--r--src/libmowgli/ext/getopt_long.c461
-rw-r--r--src/libmowgli/ext/getopt_long.h69
-rw-r--r--src/libmowgli/ext/global_storage.c (renamed from src/libmowgli/mowgli_global_storage.c)25
-rw-r--r--src/libmowgli/ext/global_storage.h (renamed from src/libmowgli/mowgli_global_storage.h)4
-rw-r--r--src/libmowgli/ext/proctitle.c311
-rw-r--r--src/libmowgli/ext/proctitle.h23
-rw-r--r--src/libmowgli/ext/program_opts.c191
-rw-r--r--src/libmowgli/ext/program_opts.h (renamed from src/libmowgli/mowgli_allocation_policy.h)43
-rw-r--r--src/libmowgli/linebuf/Makefile15
-rw-r--r--src/libmowgli/linebuf/linebuf.c292
-rw-r--r--src/libmowgli/linebuf/linebuf.h79
-rw-r--r--src/libmowgli/module/Makefile15
-rw-r--r--src/libmowgli/module/loader_posix.c (renamed from src/libmowgli/mowgli_module_posix.c)2
-rw-r--r--src/libmowgli/module/loader_win32.c (renamed from src/libmowgli/mowgli_module_win32.c)2
-rw-r--r--src/libmowgli/module/module.h (renamed from src/libmowgli/mowgli_module.h)2
-rw-r--r--src/libmowgli/mowgli.h88
-rw-r--r--src/libmowgli/mowgli_alloc.c133
-rw-r--r--src/libmowgli/mowgli_alloc.h31
-rw-r--r--src/libmowgli/mowgli_allocation_policy.c70
-rw-r--r--src/libmowgli/mowgli_assert.h105
-rw-r--r--src/libmowgli/mowgli_config.h.in147
-rw-r--r--src/libmowgli/mowgli_exception.h37
-rw-r--r--src/libmowgli/mowgli_heap.c323
-rw-r--r--src/libmowgli/mowgli_heap.h50
-rw-r--r--src/libmowgli/mowgli_ioevent.c195
-rw-r--r--src/libmowgli/mowgli_ioevent.h55
-rw-r--r--src/libmowgli/mowgli_iterator.h38
-rw-r--r--src/libmowgli/mowgli_logger.c62
-rw-r--r--src/libmowgli/mowgli_mempool.c199
-rw-r--r--src/libmowgli/mowgli_mempool.h45
-rw-r--r--src/libmowgli/mowgli_spinlock.c105
-rw-r--r--src/libmowgli/mowgli_spinlock.h44
-rw-r--r--src/libmowgli/mowgli_stdinc.h96
-rw-r--r--src/libmowgli/mowgli_string.c121
-rw-r--r--src/libmowgli/mowgli_string.h48
-rw-r--r--src/libmowgli/object/Makefile21
-rw-r--r--src/libmowgli/object/class.c (renamed from src/libmowgli/mowgli_object_class.c)5
-rw-r--r--src/libmowgli/object/class.h (renamed from src/libmowgli/mowgli_object_class.h)3
-rw-r--r--src/libmowgli/object/message.c (renamed from src/libmowgli/mowgli_object_messaging.c)2
-rw-r--r--src/libmowgli/object/message.h (renamed from src/libmowgli/mowgli_object_messaging.h)2
-rw-r--r--src/libmowgli/object/metadata.c (renamed from src/libmowgli/mowgli_object_metadata.c)4
-rw-r--r--src/libmowgli/object/metadata.h (renamed from src/libmowgli/mowgli_object_metadata.h)2
-rw-r--r--src/libmowgli/object/object.c (renamed from src/libmowgli/mowgli_object.c)4
-rw-r--r--src/libmowgli/object/object.h (renamed from src/libmowgli/mowgli_object.h)2
-rw-r--r--src/libmowgli/platform/Makefile9
-rw-r--r--src/libmowgli/platform/autoconf.h.in105
-rw-r--r--src/libmowgli/platform/constructor.h (renamed from src/libmowgli/mowgli_logger.h)45
-rw-r--r--src/libmowgli/platform/machine.h334
-rw-r--r--src/libmowgli/platform/win32/Makefile15
-rw-r--r--src/libmowgli/platform/win32/fork.c166
-rw-r--r--src/libmowgli/platform/win32/gettimeofday.c (renamed from src/libmowgli/win32_support.c)4
-rw-r--r--src/libmowgli/platform/win32/inet.c80
-rw-r--r--src/libmowgli/platform/win32/pipe.c (renamed from src/libmowgli/mowgli_init.h)14
-rw-r--r--src/libmowgli/platform/win32/setenv.c (renamed from src/libmowgli/mowgli_allocator.h)16
-rw-r--r--src/libmowgli/platform/win32/socketpair.c109
-rw-r--r--src/libmowgli/platform/win32/win32_stdinc.h (renamed from src/libmowgli/win32_support.h)23
-rw-r--r--src/libmowgli/thread/Makefile18
-rw-r--r--src/libmowgli/thread/mutex.c134
-rw-r--r--src/libmowgli/thread/mutex.h79
-rw-r--r--src/libmowgli/thread/null_mutexops.c (renamed from src/libmowgli/mowgli_allocator.c)39
-rw-r--r--src/libmowgli/thread/posix_mutexops.c115
-rw-r--r--src/libmowgli/thread/thread.h78
-rw-r--r--src/libmowgli/thread/win32_mutexops.c74
-rw-r--r--src/libmowgli/vio/Makefile15
-rw-r--r--src/libmowgli/vio/vio.c140
-rw-r--r--src/libmowgli/vio/vio.h219
-rw-r--r--src/libmowgli/vio/vio_openssl.c447
-rw-r--r--src/libmowgli/vio/vio_sockets.c423
-rw-r--r--win32/libmowgli.def172
-rw-r--r--win32/libmowgli/VS2008/VS2008.vcproj567
-rw-r--r--win32/libmowgli/dicttest/dicttest.vcproj353
-rw-r--r--win32/libmowgli/formattertest/formattertest.vcproj349
-rw-r--r--win32/libmowgli/libmowgli.sln75
-rw-r--r--win32/libmowgli/listsort/listsort.vcproj349
-rw-r--r--win32/libmowgli/patriciatest/patriciatest.vcproj349
-rw-r--r--win32/libmowgli/randomtest/randomtest.vcproj349
-rw-r--r--win32/mowgli_config.h145
196 files changed, 13246 insertions, 14288 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b056935
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,36 @@
+aclocal.m4
+autom4te.cache
+buildsys.mk
+src/libmowgli/platform/autoconf.h
+config.log
+config.status
+extra.mk
+libmowgli-2.pc
+src/examples/dicttest/dicttest
+src/examples/formattertest/formattertest
+src/examples/listsort/listsort
+src/examples/randomtest/randomtest
+src/examples/patriciatest/patriciatest
+src/examples/patriciatest2/patriciatest2
+src/examples/echoserver/echoserver
+src/examples/timertest/timertest
+src/examples/helpertest/helpertest
+src/examples/libevent-bench/bench
+src/examples/linetest/linetest
+src/examples/memslice-bench/memslice-bench
+src/examples/vio-udplistener/vio-udplistener
+src/examples/futuretest/futuretest
+src/examples/async_resolver/async_resolver
+.deps
+*.dylib
+*.o
+*.a
+*.so
+*.so.*
+*.lib
+*.dll
+*.exe
+*~
+*.core
+core
+*.swp
diff --git a/AUTHORS b/AUTHORS
index 2406c47..e96e123 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,3 +3,4 @@ William Pitcock <nenolod -at- sacredspiral.co.uk>
Jonathan Schleifer <js-libmowgli -at- webkeks.org>
Pippijn van Steenhoven <pippijn -at- one09.net>
Jilles Tjoelker <jilles -at- stack.nl>
+Elizabeth Myers <elizabeth -at- sporksmoo.net>
diff --git a/COPYING b/COPYING
index 26e3d7b..d637355 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,5 @@
-Copyright (c) 2005-2007 Atheme Project (http://www.atheme.org)
+Copyright (c) 2005-2012 atheme.org and individual contributors as listed in
+specific source headers.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -14,3 +15,4 @@ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/GIT-Access b/GIT-Access
index b4ac63a..e57914e 100644
--- a/GIT-Access
+++ b/GIT-Access
@@ -1,5 +1,5 @@
The libmowgli GIT repository can be checked out using the following command:
- git clone git://git.atheme.org/libmowgli.git libmowgli
+ git clone git://git.atheme.org/libmowgli-2.git libmowgli-2
libmowgli's GIT repository depot can be browsed over the internet at
the following address:
diff --git a/Makefile b/Makefile
index 3e267c7..19f2a69 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,10 @@
SUBDIRS = src
-DISTCLEAN = extra.mk buildsys.mk config.log config.status libmowgli.pc
+DISTCLEAN = extra.mk buildsys.mk config.log config.status libmowgli-2.pc
include buildsys.mk
install-extra:
- i="libmowgli.pc"; \
+ i="libmowgli-2.pc"; \
${INSTALL_STATUS}; \
if ${MKDIR_P} ${DESTDIR}${libdir}/pkgconfig && ${INSTALL} -m 644 $$i ${DESTDIR}${libdir}/pkgconfig/$$i; then \
${INSTALL_OK}; \
@@ -13,7 +13,7 @@ install-extra:
fi
uninstall-extra:
- i="libmowgli.pc"; \
+ i="libmowgli-2.pc"; \
if [ -f ${DESTDIR}${libdir}/pkgconfig/$$i ]; then \
if rm -f ${DESTDIR}${libdir}/pkgconfig/$$i; then \
${DELETE_OK}; \
diff --git a/README b/README
index 9b38ca4..424f23d 100644
--- a/README
+++ b/README
@@ -23,7 +23,7 @@ It contains:
- mowgli_argstack: Safe serialization of valists.
- mowgli_assert: Various assertion routines that can be used.
- mowgli_bitvector: Bitmasks with an unlimited level of precision.
- - mowgli_dictionary: A keyword-backed definition hashtable class.
+ - mowgli_patricia: A keyword-backed definition hashtable class.
- mowgli_error_backtrace: Provide feedback to users on what caused the
error they are recieving.
- mowgli_exception: Assertions with user feedback.
@@ -33,11 +33,9 @@ It contains:
- mowgli_heap: An optimistic heap-based memory allocator
- mowgli_hook: A simple hooks API you can use for your application, which
allows for hooks to provide both application data and user data.
- - mowgli_ioevent: Portable I/O completion ports for many OSes.
- mowgli_list: A high performance linked lists implementation with O(1) scalability
for most common operations.
- mowgli_logger: An internal class for handling logging of exceptions.
- - mowgli_memorypool: A class which allows for memory pooling.
- mowgli_module: A wrapper around dlopen(3) and dlsym(3).
- mowgli_object: A simple class which provides reference counted pointers and
polymorphism of structs.
@@ -47,7 +45,10 @@ It contains:
- mowgli_queue: A simple class which implements double-ended queues.
- mowgli_random: A high performance psuedo-random number generator.
- mowgli_signal: A wrapper for sigaction(2).
- - mowgli_spinlock: Portable spinlocks.
+ - mowgli_eventloop: A portable event loop implementation.
+ - mowgli_vio: An abstraction layer for I/O.
+ - mowgli_linebuf: A line-buffering implementation for clients.
+ - mowgli_thread: Minimal thread abstraction.
More classes will be added with later releases. Please contact
nenolod -at- atheme.org if you have suggestions on what should be
@@ -73,5 +74,6 @@ sudo.)
Bug Reports
-----------
-Bugs can be reported on our tracker at http://bugs-meta.atheme.org against the
-Mowgli product.
+Bugs can be reported on our tracker at http://jira.atheme.org against the
+libmowgli product.
+
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
index e57a5b0..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,14 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_include([m4/buildsys.m4])
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..95bc896
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,86 @@
+#! /bin/sh
+
+TOP_DIR=$(dirname $0)
+LAST_DIR=$PWD
+
+if test ! -f $TOP_DIR/configure.ac ; then
+ echo "You must execute this script from the top level directory."
+ exit 1
+fi
+
+AUTOCONF=${AUTOCONF:-autoconf}
+ACLOCAL=${ACLOCAL:-aclocal}
+AUTOHEADER=${AUTOHEADER:-autoheader}
+
+dump_help_screen ()
+{
+ echo "Usage: gen-auto-scripts.sh [options]"
+ echo
+ echo "options:"
+ echo " -n skip CVS changelog creation"
+ echo " -h,--help show this help screen"
+ echo
+ exit 0
+}
+
+parse_options ()
+{
+ while test "$1" != "" ; do
+ case $1 in
+ -h|--help)
+ dump_help_screen
+ ;;
+ -n)
+ SKIP_CVS_CHANGELOG=yes
+ ;;
+ *)
+ echo Invalid argument - $1
+ dump_help_screen
+ ;;
+ esac
+ shift
+ done
+}
+
+run_or_die ()
+{
+ COMMAND=$1
+
+ # check for empty commands
+ if test -z "$COMMAND" ; then
+ echo "*warning* no command specified"
+ return 1
+ fi
+
+ shift;
+
+ OPTIONS="$@"
+
+ # print a message
+ printf "%s" "*info* running $COMMAND"
+ if test -n "$OPTIONS" ; then
+ echo " ($OPTIONS)"
+ else
+ echo
+ fi
+
+ # run or die
+ $COMMAND $OPTIONS ; RESULT=$?
+ if test $RESULT -ne 0 ; then
+ echo "*error* $COMMAND failed. (exit code = $RESULT)"
+ exit 1
+ fi
+
+ return 0
+}
+
+parse_options "$@"
+
+cd $TOP_DIR
+
+run_or_die $ACLOCAL -I m4
+run_or_die $AUTOHEADER
+run_or_die $AUTOCONF
+
+cd $LAST_DIR
+
diff --git a/buildsys.mk.in b/buildsys.mk.in
index 7e7842e..7977b07 100644
--- a/buildsys.mk.in
+++ b/buildsys.mk.in
@@ -1,7 +1,8 @@
#
-# Copyright (c) 2007 - 2009, Jonathan Schleifer <js@webkeks.org>
+# Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012
+# Jonathan Schleifer <js@webkeks.org>
#
-# https://webkeks.org/hg/buildsys/
+# https://webkeks.org/git/?p=buildsys.git
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
@@ -20,7 +21,8 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-PACKAGE = @PACKAGE@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
AS = @AS@
CC = @CC@
CXX = @CXX@
@@ -42,21 +44,19 @@ ERLCFLAGS = @ERLCFLAGS@
OBJCFLAGS = @OBJCFLAGS@
OBJCXXFLAGS = @OBJCXXFLAGS@
LDFLAGS = @LDFLAGS@
+LDFLAGS_RPATH = @LDFLAGS_RPATH@
LIBS = @LIBS@
PYTHON_FLAGS = @PYTHON_FLAGS@
PROG_IMPLIB_NEEDED = @PROG_IMPLIB_NEEDED@
PROG_IMPLIB_LDFLAGS = @PROG_IMPLIB_LDFLAGS@
PROG_SUFFIX = @EXEEXT@
-LIB_CPPFLAGS = @LIB_CPPFLAGS@
LIB_CFLAGS = @LIB_CFLAGS@
LIB_LDFLAGS = @LIB_LDFLAGS@
LIB_PREFIX = @LIB_PREFIX@
LIB_SUFFIX = @LIB_SUFFIX@
-PLUGIN_CPPFLAGS = @PLUGIN_CPPFLAGS@
PLUGIN_CFLAGS = @PLUGIN_CFLAGS@
PLUGIN_LDFLAGS = @PLUGIN_LDFLAGS@
PLUGIN_SUFFIX = @PLUGIN_SUFFIX@
-RPATH_LDFLAGS = @RPATH_LDFLAGS@
INSTALL_LIB = @INSTALL_LIB@
UNINSTALL_LIB = @UNINSTALL_LIB@
CLEAN_LIB = @CLEAN_LIB@
@@ -65,44 +65,56 @@ MKDIR_P = mkdir -p
INSTALL = @INSTALL@
SHELL = @SHELL@
MSGFMT = @MSGFMT@
+JAVAC = @JAVAC@
+JAVACFLAGS = @JAVACFLAGS@
+JAR = @JAR@
+WINDRES = @WINDRES@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
libdir = @libdir@
-plugindir ?= ${libdir}/${PACKAGE}
+plugindir ?= ${libdir}/${PACKAGE_NAME}
datarootdir = @datarootdir@
datadir = @datadir@
includedir = @includedir@
-includesubdir ?= ${PACKAGE}
+includesubdir ?= ${PACKAGE_NAME}
+localedir = @localedir@
+localename ?= ${PACKAGE_NAME}
mandir = @mandir@
mansubdir ?= man1
-OBJS1 = ${SRCS:.c=.o}
-OBJS2 = ${OBJS1:.cc=.o}
-OBJS3 = ${OBJS2:.cxx=.o}
-OBJS4 = ${OBJS3:.d=.o}
-OBJS5 = ${OBJS4:.erl=.beam}
-OBJS6 = ${OBJS5:.m=.o}
-OBJS7 = ${OBJS6:.mm=.o}
-OBJS8 = ${OBJS7:.py=.pyc}
-OBJS9 = ${OBJS8:.xpm=.o}
-OBJS10 = ${OBJS9:.S=.o}
-OBJS += ${OBJS10:.po=.gmo}
+OBJS1 = ${SRCS:.c=.o}
+OBJS2 = ${OBJS1:.cc=.o}
+OBJS3 = ${OBJS2:.cxx=.o}
+OBJS4 = ${OBJS3:.d=.o}
+OBJS5 = ${OBJS4:.erl=.beam}
+OBJS6 = ${OBJS5:.java=.class}
+OBJS7 = ${OBJS6:.m=.o}
+OBJS8 = ${OBJS7:.mm=.o}
+OBJS9 = ${OBJS8:.py=.pyc}
+OBJS10 = ${OBJS9:.rc=.o}
+OBJS11 = ${OBJS10:.S=.o}
+OBJS += ${OBJS11:.xpm=.o}
+
+LIB_OBJS = ${OBJS:.o=.lib.o}
+PLUGIN_OBJS = ${OBJS:.o=.plugin.o}
+
+MO_FILES = ${LOCALES:.po=.mo}
.SILENT:
.SUFFIXES:
-.SUFFIXES: .beam .c .cc .cxx .d .dep .erl .gmo .m .mm .o .po .py .pyc .xpm .S
-.PHONY: all subdirs pre-depend depend install install-extra uninstall uninstall-extra clean distclean
+.SUFFIXES: .beam .c .c.dep .cc .cc.dep .class .cxx .cxx.dep .d .erl .lib.o .java .mo .m .m.dep .mm .mm.dep .o .plugin.o .po .py .pyc .rc .S .S.dep .xpm
+.PHONY: all subdirs pre-depend depend install install-extra uninstall uninstall-extra clean distclean locales
all:
- for i in subdirs depend ${STATIC_LIB} ${STATIC_LIB_NOINST} ${LIB} ${LIB_NOINST} ${PLUGIN} ${PLUGIN_NOINST} ${PROG} ${PROG_NOINST}; do \
- ${MAKE} ${MFLAGS} $$i || exit 1; \
- done
+ ${MAKE} ${MFLAGS} subdirs
+ ${MAKE} ${MFLAGS} depend
+ ${MAKE} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST} ${SHARED_LIB} ${SHARED_LIB_NOINST} ${PLUGIN} ${PLUGIN_NOINST} ${PROG} ${PROG_NOINST} ${JARFILE} locales
subdirs:
for i in ${SUBDIRS}; do \
${DIR_ENTER}; \
- ${MAKE} ${MFLAGS} || exit 1; \
+ ${MAKE} ${MFLAGS} || exit $$?; \
${DIR_LEAVE}; \
done
@@ -112,33 +124,13 @@ depend: pre-depend ${SRCS}
test -f .deps || regen=1; \
for i in ${SRCS}; do \
case $$i in \
- *.c) \
- test $$i -nt .deps && regen=1; \
- deps="$$deps $${i%.c}.dep"; \
- ;; \
- *.cc) \
- test $$i -nt .deps && regen=1; \
- deps="$$deps $${i%.cc}.dep"; \
- ;; \
- *.cxx) \
+ *.c | *.cc | *.cxx | *.m | *.mm | *.S) \
test $$i -nt .deps && regen=1; \
- deps="$$deps $${i%.cxx}.dep"; \
- ;; \
- *.m) \
- test $$i -nt .deps && regen=1; \
- deps="$$deps $${i%.m}.dep"; \
- ;; \
- *.mm) \
- test $$i -nt .deps && regen=1; \
- deps="$$deps $${i%.mm}.dep"; \
- ;; \
- *.S) \
- test $$i -nt .deps && regen=1; \
- deps="$$deps $${i%.S}.dep"; \
+ deps="$$deps $$i.dep"; \
;; \
esac; \
done; \
- if test x"$$regen" = x"1" -a x"$$deps" != "x"; then \
+ if test x"$$regen" = x"1" -a x"$$deps" != x""; then \
${DEPEND_STATUS}; \
if ${MAKE} ${MFLAGS} $$deps && cat $$deps >.deps; then \
rm -f $$deps; \
@@ -150,53 +142,182 @@ depend: pre-depend ${SRCS}
fi; \
fi
-.c.dep .cc.dep .cxx.dep .m.dep .mm.dep .S.dep:
- ${CPP} ${CPPFLAGS} -M $< >$@ || (rm -f $@; exit 1)
-
-.d.dep:
-.xpm.dep:
+.c.c.dep .cc.cc.dep .cxx.cxx.dep .m.m.dep .mm.mm.dep .S.S.dep:
+ ${CPP} ${CPPFLAGS} -M $< | \
+ sed 's/^\([^\.]*\)\.o:/\1.o \1.lib.o \1.plugin.o:/' >$@ || \
+ { rm -f $@; false; }
pre-depend:
-${PROG} ${PROG_NOINST}: ${EXT_DEPS} ${OBJS}
+${PROG} ${PROG_NOINST}: ${EXT_DEPS} ${OBJS} ${OBJS_EXTRA}
${LINK_STATUS}
- if ${LD} -o $@ ${OBJS} ${LDFLAGS} ${LIBS}; then \
+ if ${LD} -o $@ ${OBJS} ${OBJS_EXTRA} ${LDFLAGS} ${LIBS}; then \
${LINK_OK}; \
else \
${LINK_FAILED}; \
fi
-${LIB} ${LIB_NOINST}: ${EXT_DEPS} ${OBJS}
- case $@ in \
- *.a) \
- ${MAKE} ${MFLAGS} STATIC_LIB=${LIB} LIB= $@ || exit 1 \
- ;; \
- *) \
- ${LINK_STATUS}; \
- if ${LD} -o $@ ${OBJS} ${LIB_LDFLAGS} ${LDFLAGS} ${LIBS}; then \
- ${LINK_OK}; \
- else \
- ${LINK_FAILED}; \
- fi \
- ;; \
- esac
+${JARFILE}: ${EXT_DEPS} ${JAR_MANIFEST} ${OBJS} ${OBJS_EXTRA}
+ ${LINK_STATUS}
+ if test x"${JAR_MANIFEST}" != x""; then \
+ if ${JAR} cfm ${JARFILE} ${JAR_MANIFEST} ${OBJS} ${OBJS_EXTRA}; then \
+ ${LINK_OK}; \
+ else \
+ ${LINK_FAILED}; \
+ fi \
+ else \
+ if ${JAR} cf ${JARFILE} ${OBJS} ${OBJS_EXTRA}; then \
+ ${LINK_OK}; \
+ else \
+ ${LINK_FAILED}; \
+ fi \
+ fi
+
+${SHARED_LIB} ${SHARED_LIB_NOINST}: ${EXT_DEPS} ${LIB_OBJS} ${LIB_OBJS_EXTRA}
+ ${LINK_STATUS}; \
+ objs=""; \
+ ars=""; \
+ for i in ${LIB_OBJS} ${LIB_OBJS_EXTRA}; do \
+ case $$i in \
+ *.a) \
+ ars="$$ars $$i" \
+ ;; \
+ *.o) \
+ objs="$$objs $$i" \
+ ;; \
+ esac \
+ done; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ mkdir -p $$dir; \
+ cd $$dir; \
+ ${AR} x ../$$i; \
+ for j in *.o; do \
+ objs="$$objs $$dir/$$j"; \
+ done; \
+ cd ..; \
+ done; \
+ if ${LD} -o $@ $$objs ${LIB_LDFLAGS} ${LDFLAGS} ${LIBS}; then \
+ ${LINK_OK}; \
+ else \
+ ${LINK_FAILED}; \
+ fi; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ done
-${PLUGIN} ${PLUGIN_NOINST}: ${EXT_DEPS} ${OBJS}
+${PLUGIN} ${PLUGIN_NOINST}: ${EXT_DEPS} ${PLUGIN_OBJS}
${LINK_STATUS}
- if ${LD} -o $@ ${OBJS} ${PLUGIN_LDFLAGS} ${LDFLAGS} ${LIBS}; then \
+ objs=""; \
+ ars=""; \
+ for i in ${PLUGIN_OBJS}; do \
+ case $$i in \
+ *.a) \
+ ars="$$ars $$i" \
+ ;; \
+ *.o) \
+ objs="$$objs $$i" \
+ ;; \
+ esac \
+ done; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ mkdir -p $$dir; \
+ cd $$dir; \
+ ${AR} x ../$$i; \
+ for j in *.o; do \
+ objs="$$objs $$dir/$$j"; \
+ done; \
+ cd ..; \
+ done; \
+ if ${LD} -o $@ $$objs ${PLUGIN_LDFLAGS} ${LDFLAGS} ${LIBS}; then \
${LINK_OK}; \
else \
${LINK_FAILED}; \
- fi
+ fi; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ done
-${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
+${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS} ${OBJS_EXTRA}
${LINK_STATUS}
- if ${AR} cr $@ ${OBJS} && ${RANLIB} $@; then \
+ rm -f $@
+ objs=""; \
+ ars=""; \
+ for i in ${OBJS} ${OBJS_EXTRA}; do \
+ case $$i in \
+ *.a) \
+ ars="$$ars $$i" \
+ ;; \
+ *.o) \
+ objs="$$objs $$i" \
+ ;; \
+ esac \
+ done; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ mkdir -p $$dir; \
+ cd $$dir; \
+ ${AR} x ../$$i; \
+ for j in *.o; do \
+ objs="$$objs $$dir/$$j"; \
+ done; \
+ cd ..; \
+ done; \
+ if ${AR} cr $@ $$objs && ${RANLIB} $@; then \
${LINK_OK}; \
else \
${LINK_FAILED}; \
rm -f $@; \
- fi
+ fi; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ done
+
+${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST}: ${EXT_DEPS} ${LIB_OBJS} ${LIB_OBJS_EXTRA}
+ ${LINK_STATUS}
+ rm -f $@
+ objs=""; \
+ ars=""; \
+ for i in ${LIB_OBJS} ${LIB_OBJS_EXTRA}; do \
+ case $$i in \
+ *.a) \
+ ars="$$ars $$i" \
+ ;; \
+ *.o) \
+ objs="$$objs $$i" \
+ ;; \
+ esac \
+ done; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ mkdir -p $$dir; \
+ cd $$dir; \
+ ${AR} x ../$$i; \
+ for j in *.o; do \
+ objs="$$objs $$dir/$$j"; \
+ done; \
+ cd ..; \
+ done; \
+ if ${AR} cr $@ $$objs && ${RANLIB} $@; then \
+ ${LINK_OK}; \
+ else \
+ ${LINK_FAILED}; \
+ rm -f $@; \
+ fi; \
+ for i in $$ars; do \
+ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \
+ rm -fr $$dir; \
+ done
+
+locales: ${MO_FILES}
.c.o:
${COMPILE_STATUS}
@@ -205,6 +326,20 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
else \
${COMPILE_FAILED}; \
fi
+.c.lib.o:
+ ${COMPILE_LIB_STATUS}
+ if ${CC} ${LIB_CFLAGS} ${CFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_LIB_OK}; \
+ else \
+ ${COMPILE_LIB_FAILED}; \
+ fi
+.c.plugin.o:
+ ${COMPILE_PLUGIN_STATUS}
+ if ${CC} ${PLUGIN_CFLAGS} ${CFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_PLUGIN_OK}; \
+ else \
+ ${COMPILE_PLUGIN_FAILED}; \
+ fi
.cc.o .cxx.o:
${COMPILE_STATUS}
@@ -213,6 +348,20 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
else \
${COMPILE_FAILED}; \
fi
+.cc.lib.o .cxx.lib.o:
+ ${COMPILE_LIB_STATUS}
+ if ${CXX} ${LIB_CFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_LIB_OK}; \
+ else \
+ ${COMPILE_LIB_FAILED}; \
+ fi
+.cc.plugin.o .cxx.plugin.o:
+ ${COMPILE_PLUGIN_STATUS}
+ if ${CXX} ${PLUGIN_CFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_PLUGIN_OK}; \
+ else \
+ ${COMPILE_PLUGIN_FAILED}; \
+ fi
.d.o:
${COMPILE_STATUS}
@@ -238,6 +387,14 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
${COMPILE_FAILED}; \
fi
+.java.class:
+ ${COMPILE_STATUS}
+ if ${JAVAC} ${JAVACFLAGS} $<; then \
+ ${COMPILE_OK}; \
+ else \
+ ${COMPILE_FAILED}; \
+ fi
+
.m.o:
${COMPILE_STATUS}
if ${OBJC} ${OBJCFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
@@ -245,6 +402,20 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
else \
${COMPILE_FAILED}; \
fi
+.m.lib.o:
+ ${COMPILE_LIB_STATUS}
+ if ${OBJC} ${LIB_CFLAGS} ${OBJCFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_LIB_OK}; \
+ else \
+ ${COMPILE_LIB_FAILED}; \
+ fi
+.m.plugin.o:
+ ${COMPILE_PLUGIN_STATUS}
+ if ${OBJC} ${PLUGIN_CFLAGS} ${OBJCFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_PLUGIN_OK}; \
+ else \
+ ${COMPILE_PLUGIN_FAILED}; \
+ fi
.mm.o:
${COMPILE_STATUS}
@@ -253,8 +424,22 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
else \
${COMPILE_FAILED}; \
fi
+.mm.lib.o:
+ ${COMPILE_LIB_STATUS}
+ if ${OBJCXX} ${LIB_CFLAGS} ${OBJCXXFLAGS} ${OBJCFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_LIB_OK}; \
+ else \
+ ${COMPILE_LIB_FAILED}; \
+ fi
+.mm.plugin.o:
+ ${COMPILE_PLUGIN_STATUS}
+ if ${OBJCXX} ${PLUGIN_CFLAGS} ${OBJCXXFLAGS} ${OBJCFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_PLUGIN_OK}; \
+ else \
+ ${COMPILE_PLUGIN_FAILED}; \
+ fi
-.po.gmo:
+.po.mo:
${COMPILE_STATUS}
if ${MSGFMT} -c -o $@ $<; then \
${COMPILE_OK}; \
@@ -270,9 +455,9 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
${COMPILE_FAILED}; \
fi
-.xpm.o:
+.rc.o .rc.lib.o .rc.plugin.o:
${COMPILE_STATUS}
- if ${CC} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \
+ if ${WINDRES} ${CPPFLAGS} -J rc -O coff -o $@ $<; then \
${COMPILE_OK}; \
else \
${COMPILE_FAILED}; \
@@ -285,24 +470,60 @@ ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS}
else \
${COMPILE_FAILED}; \
fi
+.S.lib.o:
+ ${COMPILE_LIB_STATUS}
+ if ${AS} ${LIB_CFLAGS} ${ASFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_LIB_OK}; \
+ else \
+ ${COMPILE_LIB_FAILED}; \
+ fi
+.S.plugin.o:
+ ${COMPILE_PLUGIN_STATUS}
+ if ${AS} ${PLUGIN_CFLAGS} ${ASFLAGS} ${CPPFLAGS} -c -o $@ $<; then \
+ ${COMPILE_PLUGIN_OK}; \
+ else \
+ ${COMPILE_PLUGIN_FAILED}; \
+ fi
+
+.xpm.o:
+ ${COMPILE_STATUS}
+ if ${CC} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \
+ ${COMPILE_OK}; \
+ else \
+ ${COMPILE_FAILED}; \
+ fi
+.xpm.lib.o:
+ ${COMPILE_LIB_STATUS}
+ if ${CC} ${LIB_CFLAGS} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \
+ ${COMPILE_LIB_OK}; \
+ else \
+ ${COMPILE_LIB_FAILED}; \
+ fi
+.xpm.plugin.o:
+ ${COMPILE_PLUGIN_STATUS}
+ if ${CC} ${PLUGIN_CFLAGS} ${CFLAGS} ${CPPFLAGS} -x c -c -o $@ $<; then \
+ ${COMPILE_PLUGIN_OK}; \
+ else \
+ ${COMPILE_PLUGIN_FAILED}; \
+ fi
-install: ${LIB} ${STATIC_LIB} ${PLUGIN} ${PROG} install-extra
+install: ${SHARED_LIB} ${STATIC_LIB} ${STATIC_PIC_LIB} ${PLUGIN} ${PROG} install-extra
for i in ${SUBDIRS}; do \
${DIR_ENTER}; \
- ${MAKE} ${MFLAGS} install || exit 1; \
+ ${MAKE} ${MFLAGS} install || exit $$?; \
${DIR_LEAVE}; \
done
- for i in ${LIB}; do \
+ for i in ${SHARED_LIB}; do \
${INSTALL_STATUS}; \
- if ${MKDIR_P} ${DESTDIR}${libdir} && ${INSTALL_LIB}; then \
+ if ${MKDIR_P} ${DESTDIR}${libdir} ${INSTALL_LIB}; then \
${INSTALL_OK}; \
else \
${INSTALL_FAILED}; \
fi \
done
- for i in ${STATIC_LIB}; do \
+ for i in ${STATIC_LIB} ${STATIC_PIC_LIB}; do \
${INSTALL_STATUS}; \
if ${MKDIR_P} ${DESTDIR}${libdir} && ${INSTALL} -m 644 $$i ${DESTDIR}${libdir}/$$i; then \
${INSTALL_OK}; \
@@ -322,7 +543,7 @@ install: ${LIB} ${STATIC_LIB} ${PLUGIN} ${PROG} install-extra
for i in ${DATA}; do \
${INSTALL_STATUS}; \
- if ${MKDIR_P} $$(dirname ${DESTDIR}${datadir}/${PACKAGE}/$$i) && ${INSTALL} -m 644 $$i ${DESTDIR}${datadir}/${PACKAGE}/$$i; then \
+ if ${MKDIR_P} $$(dirname ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i) && ${INSTALL} -m 644 $$i ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i; then \
${INSTALL_OK}; \
else \
${INSTALL_FAILED}; \
@@ -347,6 +568,15 @@ install: ${LIB} ${STATIC_LIB} ${PLUGIN} ${PROG} install-extra
fi \
done
+ for i in ${MO_FILES}; do \
+ ${INSTALL_STATUS}; \
+ if ${MKDIR_P} ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES && ${INSTALL} -m 644 $$i ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES/${localename}.mo; then \
+ ${INSTALL_OK}; \
+ else \
+ ${INSTALL_FAILED}; \
+ fi \
+ done
+
for i in ${MAN}; do \
${INSTALL_STATUS}; \
if ${MKDIR_P} ${DESTDIR}${mandir}/${mansubdir} && ${INSTALL} -m 644 $$i ${DESTDIR}${mandir}/${mansubdir}/$$i; then \
@@ -361,13 +591,13 @@ install-extra:
uninstall: uninstall-extra
for i in ${SUBDIRS}; do \
${DIR_ENTER}; \
- ${MAKE} ${MFLAGS} uninstall || exit 1; \
+ ${MAKE} ${MFLAGS} uninstall || exit $$?; \
${DIR_LEAVE}; \
done
- for i in ${LIB}; do \
+ for i in ${SHARED_LIB}; do \
if test -f ${DESTDIR}${libdir}/$$i; then \
- if ${UNINSTALL_LIB}; then \
+ if : ${UNINSTALL_LIB}; then \
${DELETE_OK}; \
else \
${DELETE_FAILED}; \
@@ -375,7 +605,7 @@ uninstall: uninstall-extra
fi; \
done
- for i in ${STATIC_LIB}; do \
+ for i in ${STATIC_LIB} ${STATIC_PIC_LIB}; do \
if test -f ${DESTDIR}${libdir}/$$i; then \
if rm -f ${DESTDIR}${libdir}/$$i; then \
${DELETE_OK}; \
@@ -397,14 +627,16 @@ uninstall: uninstall-extra
-rmdir ${DESTDIR}${plugindir} >/dev/null 2>&1
for i in ${DATA}; do \
- if test -f ${DESTDIR}${datadir}/${PACKAGE}/$$i; then \
- if rm -f ${DESTDIR}${datadir}/${PACKAGE}/$$i; then \
+ if test -f ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i; then \
+ if rm -f ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i; then \
${DELETE_OK}; \
else \
${DELETE_FAILED}; \
fi \
- fi \
+ fi; \
+ rmdir "$$(dirname ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i)" >/dev/null 2>&1 || true; \
done
+ -rmdir ${DESTDIR}${datadir}/${PACKAGE_NAME} >/dev/null 2>&1
for i in ${PROG}; do \
if test -f ${DESTDIR}${bindir}/$$i; then \
@@ -427,6 +659,16 @@ uninstall: uninstall-extra
done
-rmdir ${DESTDIR}${includedir}/${includesubdir} >/dev/null 2>&1
+ for i in ${MO_FILES}; do \
+ if test -f ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES/${localename}.mo; then \
+ if rm -f ${DESTDIR}${localedir}/$${i%.mo}/LC_MESSAGES/${localename}.mo; then \
+ ${DELETE_OK}; \
+ else \
+ ${DELETE_FAILED}; \
+ fi \
+ fi \
+ done
+
for i in ${MAN}; do \
if test -f ${DESTDIR}${mandir}/${mansubdir}/$$i; then \
if rm -f ${DESTDIR}${mandir}/${mansubdir}/$$i; then \
@@ -442,11 +684,11 @@ uninstall-extra:
clean:
for i in ${SUBDIRS}; do \
${DIR_ENTER}; \
- ${MAKE} ${MFLAGS} clean || exit 1; \
+ ${MAKE} ${MFLAGS} clean || exit $$?; \
${DIR_LEAVE}; \
done
- for i in ${DEPS} ${OBJS} ${PROG} ${PROG_NOINST} ${LIB} ${LIB_NOINST} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${PLUGIN} ${PLUGIN_NOINST} ${CLEAN} ${CLEAN_LIB}; do \
+ for i in ${DEPS} ${OBJS} ${OBJS_EXTRA} ${LIB_OBJS} ${LIB_OBJS_EXTRA} ${PLUGIN_OBJS} ${PROG} ${PROG_NOINST} ${SHARED_LIB} ${SHARED_LIB_NOINST} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST} ${PLUGIN} ${PLUGIN_NOINST} ${CLEAN_LIB} ${MO_FILES} ${CLEAN}; do \
if test -f $$i -o -d $$i; then \
if rm -fr $$i; then \
${DELETE_OK}; \
@@ -459,7 +701,7 @@ clean:
distclean: clean
for i in ${SUBDIRS}; do \
${DIR_ENTER}; \
- ${MAKE} ${MFLAGS} distclean || exit 1; \
+ ${MAKE} ${MFLAGS} distclean || exit $$?; \
${DIR_LEAVE}; \
done
@@ -473,21 +715,27 @@ distclean: clean
fi \
done
-DIR_ENTER = printf "\033[K\033[0;36mEntering directory \033[1;36m$$i\033[0;36m.\033[0m\n"; cd $$i || exit 1
-DIR_LEAVE = printf "\033[K\033[0;36mLeaving directory \033[1;36m$$i\033[0;36m.\033[0m\n"; cd .. || exit 1
-DEPEND_STATUS = printf "\033[K\033[0;33mGenerating dependencies...\033[0m\r"
-DEPEND_OK = printf "\033[K\033[0;32mSuccessfully generated dependencies.\033[0m\n"
-DEPEND_FAILED = printf "\033[K\033[0;31mFailed to generate dependencies!\033[0m\n"; exit 1
-COMPILE_STATUS = printf "\033[K\033[0;33mCompiling \033[1;33m$<\033[0;33m...\033[0m\r"
-COMPILE_OK = printf "\033[K\033[0;32mSuccessfully compiled \033[1;32m$<\033[0;32m.\033[0m\n"
-COMPILE_FAILED = printf "\033[K\033[0;31mFailed to compile \033[1;31m$<\033[0;31m!\033[0m\n"; exit 1
-LINK_STATUS = printf "\033[K\033[0;33mLinking \033[1;33m$@\033[0;33m...\033[0m\r"
-LINK_OK = printf "\033[K\033[0;32mSuccessfully linked \033[1;32m$@\033[0;32m.\033[0m\n"
-LINK_FAILED = printf "\033[K\033[0;31mFailed to link \033[1;31m$@\033[0;31m!\033[0m\n"; exit 1
-INSTALL_STATUS = printf "\033[K\033[0;33mInstalling \033[1;33m$$i\033[0;33m...\033[0m\r"
-INSTALL_OK = printf "\033[K\033[0;32mSuccessfully installed \033[1;32m$$i\033[0;32m.\033[0m\n"
-INSTALL_FAILED = printf "\033[K\033[0;31mFailed to install \033[1;31m$$i\033[0;31m!\033[0m\n"; exit 1
-DELETE_OK = printf "\033[K\033[0;34mDeleted \033[1;34m$$i\033[0;34m.\033[0m\n"
-DELETE_FAILED = printf "\033[K\033[0;31mFailed to delete \033[1;31m$$i\033[0;31m!\033[0m\n"; exit 1
+DIR_ENTER = printf "@TERM_EL@@TERM_SETAF6@Entering directory @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF6@.@TERM_SGR0@\n"; cd $$i || exit $$?
+DIR_LEAVE = printf "@TERM_EL@@TERM_SETAF6@Leaving directory @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF6@.@TERM_SGR0@\n"; cd .. || exit $$?
+DEPEND_STATUS = printf "@TERM_EL@@TERM_SETAF3@Generating dependencies...@TERM_SGR0@\r"
+DEPEND_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully generated dependencies.@TERM_SGR0@\n"
+DEPEND_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to generate dependencies!@TERM_SGR0@\n"; exit $$err
+COMPILE_STATUS = printf "@TERM_EL@@TERM_SETAF3@Compiling @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF3@...@TERM_SGR0@\r"
+COMPILE_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully compiled @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF2@.@TERM_SGR0@\n"
+COMPILE_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to compile @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err
+COMPILE_LIB_STATUS = printf "@TERM_EL@@TERM_SETAF3@Compiling @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF3@ (lib)...@TERM_SGR0@\r"
+COMPILE_LIB_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully compiled @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF2@ (lib).@TERM_SGR0@\n"
+COMPILE_LIB_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to compile @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF1@ (lib)!@TERM_SGR0@\n"; exit $$err
+COMPILE_PLUGIN_STATUS = printf "@TERM_EL@@TERM_SETAF3@Compiling @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF3@ (plugin)...@TERM_SGR0@\r"
+COMPILE_PLUGIN_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully compiled @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF2@ (plugin).@TERM_SGR0@\n"
+COMPILE_PLUGIN_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to compile @TERM_BOLD@$<@TERM_SGR0@@TERM_SETAF1@ (plugin)!@TERM_SGR0@\n"; exit $$err
+LINK_STATUS = printf "@TERM_EL@@TERM_SETAF3@Linking @TERM_BOLD@$@@TERM_SGR0@@TERM_SETAF3@...@TERM_SGR0@\r"
+LINK_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully linked @TERM_BOLD@$@@TERM_SGR0@@TERM_SETAF2@.@TERM_SGR0@\n"
+LINK_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to link @TERM_BOLD@$@@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err
+INSTALL_STATUS = printf "@TERM_EL@@TERM_SETAF3@Installing @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF3@...@TERM_SGR0@\r"
+INSTALL_OK = printf "@TERM_EL@@TERM_SETAF2@Successfully installed @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF2@.@TERM_SGR0@\n"
+INSTALL_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to install @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err
+DELETE_OK = printf "@TERM_EL@@TERM_SETAF4@Deleted @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF4@.@TERM_SGR0@\n"
+DELETE_FAILED = err=$$?; printf "@TERM_EL@@TERM_SETAF1@Failed to delete @TERM_BOLD@$$i@TERM_SGR0@@TERM_SETAF1@!@TERM_SGR0@\n"; exit $$err
include .deps
diff --git a/config.guess b/config.guess
deleted file mode 100755
index af7f02d..0000000
--- a/config.guess
+++ /dev/null
@@ -1,1519 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-# Inc.
-
-timestamp='2006-07-02'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>. Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int x;" > $dummy.c ;
- for c in cc gcc c89 c99 ; do
- if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-if [ "${UNAME_SYSTEM}" = "Linux" ] ; then
- eval $set_cc_for_build
- cat << EOF > $dummy.c
- #include <features.h>
- #ifdef __UCLIBC__
- # ifdef __UCLIBC_CONFIG_VERSION__
- LIBC=uclibc __UCLIBC_CONFIG_VERSION__
- # else
- LIBC=uclibc
- # endif
- #else
- LIBC=gnu
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'`
-fi
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
- case "${UNAME_MACHINE_ARCH}" in
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
- case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep __ELF__ >/dev/null
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "${UNAME_VERSION}" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
- echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
- exit ;;
- *:ekkoBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
- exit ;;
- *:SolidBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- *:MirBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- ;;
- *5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE="alpha" ;;
- "EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
- "EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
- "EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
- "EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit ;;
- Alpha\ *:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # Should we change UNAME_MACHINE based on the output of uname instead
- # of the specific Alpha model?
- echo alpha-pc-interix
- exit ;;
- 21064:Windows_NT:50:3)
- echo alpha-dec-winnt3.5
- exit ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix${UNAME_RELEASE}
- exit ;;
- arm:riscos:*:*|arm:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- i86pc:SunOS:5.*:*)
- echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
- Series*|S4*)
- UNAME_RELEASE=`uname -v`
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos${UNAME_RELEASE}
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
- case "`/bin/arch`" in
- sun3)
- echo m68k-sun-sunos${UNAME_RELEASE}
- ;;
- sun4)
- echo sparc-sun-sunos${UNAME_RELEASE}
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos${UNAME_RELEASE}
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten${UNAME_RELEASE}
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten${UNAME_RELEASE}
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix${UNAME_RELEASE}
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix${UNAME_RELEASE}
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix${UNAME_RELEASE}
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c &&
- dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
- SYSTEM_NAME=`$dummy $dummyarg` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos${UNAME_RELEASE}
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
- then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
- [ ${TARGET_BINARY_INTERFACE}x = x ]
- then
- echo m88k-dg-dgux${UNAME_RELEASE}
- else
- echo m88k-dg-dguxbcs${UNAME_RELEASE}
- fi
- else
- echo i586-dg-dgux${UNAME_RELEASE}
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[45])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
- then
- eval $set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
- grep __LP64__ >/dev/null
- then
- HP_ARCH="hppa2.0w"
- else
- HP_ARCH="hppa64"
- fi
- fi
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
- exit ;;
- 3050*:HI-UX:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo ${UNAME_MACHINE}-unknown-osf1mk
- else
- echo ${UNAME_MACHINE}-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:BSD/OS:*:*)
- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:FreeBSD:*:*)
- case ${UNAME_MACHINE} in
- pc98)
- echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- amd64)
- echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- *)
- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- esac
- exit ;;
- i*:CYGWIN*:*)
- echo ${UNAME_MACHINE}-pc-cygwin
- exit ;;
- i*:MINGW*:*)
- echo ${UNAME_MACHINE}-pc-mingw32
- exit ;;
- i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
- exit ;;
- i*:PW*:*)
- echo ${UNAME_MACHINE}-pc-pw32
- exit ;;
- x86:Interix*:[3456]*)
- echo i586-pc-interix${UNAME_RELEASE}
- exit ;;
- EM64T:Interix*:[3456]*)
- echo x86_64-unknown-interix${UNAME_RELEASE}
- exit ;;
- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
- echo i${UNAME_MACHINE}-pc-mks
- exit ;;
- i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
- # UNAME_MACHINE based on the output of uname instead of i386?
- echo i586-pc-interix
- exit ;;
- i*:UWIN*:*)
- echo ${UNAME_MACHINE}-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-unknown-cygwin
- exit ;;
- p*:CYGWIN*:*)
- echo powerpcle-unknown-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
- exit ;;
- i*86:Minix:*:*)
- echo ${UNAME_MACHINE}-pc-minix
- exit ;;
- arm*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- cris:Linux:*:*)
- echo cris-axis-linux-${LIBC}
- exit ;;
- crisv32:Linux:*:*)
- echo crisv32-axis-linux-${LIBC}
- exit ;;
- frv:Linux:*:*)
- echo frv-unknown-linux-${LIBC}
- exit ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- mips:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef mips
- #undef mipsel
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=mipsel
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=mips
- #else
- CPU=
- #endif
- #endif
-EOF
- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
- /^CPU/{
- s: ::g
- p
- }'`"
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
- ;;
- mips64:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef mips64
- #undef mips64el
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=mips64el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=mips64
- #else
- CPU=
- #endif
- #endif
-EOF
- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
- /^CPU/{
- s: ::g
- p
- }'`"
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
- ;;
- or32:Linux:*:*)
- echo or32-unknown-linux-${LIBC}
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-${LIBC}
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-${LIBC}
- exit ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
- if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
- PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
- *) echo hppa-unknown-linux-${LIBC} ;;
- esac
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-${LIBC}
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit ;;
- sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
- exit ;;
- vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-${LIBC}
- exit ;;
- x86_64:Linux:*:*)
- echo x86_64-unknown-linux-${LIBC}
- exit ;;
- i*86:Linux:*:*)
- # The BFD linker knows what the default object file format is, so
- # first see if it will tell us. cd to the root directory to prevent
- # problems with other programs or directories called `ld' in the path.
- # Set LC_ALL=C to ensure ld outputs messages in English.
- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
- | sed -ne '/supported targets:/!d
- s/[ ][ ]*/ /g
- s/.*supported targets: *//
- s/ .*//
- p'`
- case "$ld_supported_targets" in
- elf32-i386)
- TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}"
- ;;
- a.out-i386-linux)
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout"
- exit ;;
- coff-i386)
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff"
- exit ;;
- "")
- # Either a pre-BFD a.out linker (linux-gnuoldld) or
- # one that does not give us useful --help.
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld"
- exit ;;
- esac
- # This should get integrated into the C code below, but now we hack
- if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi
- # Determine whether the default compiler is a.out or elf
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <features.h>
- #ifdef __ELF__
- # ifdef __GLIBC__
- # if __GLIBC__ >= 2
- LIBC=gnu
- # else
- LIBC=gnulibc1
- # endif
- # else
- LIBC=gnulibc1
- # endif
- #else
- #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
- LIBC=gnu
- #else
- LIBC=gnuaout
- #endif
- #endif
- #ifdef __dietlibc__
- LIBC=dietlibc
- #endif
-EOF
- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
- /^LIBC/{
- s: ::g
- p
- }'`"
- test x"${LIBC}" != x && {
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
- exit
- }
- test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
- ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo ${UNAME_MACHINE}-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
- else
- echo ${UNAME_MACHINE}-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i386.
- echo i386-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv${UNAME_RELEASE}
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo ${UNAME_MACHINE}-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo ${UNAME_MACHINE}-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux${UNAME_RELEASE}
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
- else
- echo mips-unknown-sysv${UNAME_RELEASE}
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux${UNAME_RELEASE}
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Rhapsody:*:*)
- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- case $UNAME_PROCESSOR in
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NSE-?:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSR-?:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk${UNAME_RELEASE}
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- if test "$cputype" = "386"; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo ${UNAME_MACHINE}-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
- exit ;;
- *:DragonFly:*:*)
- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- case "${UNAME_MACHINE}" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
- exit ;;
- i*86:rdos:*:*)
- echo ${UNAME_MACHINE}-pc-rdos
- exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
- http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
-and
- http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.rpath b/config.rpath
index c492a93..17298f2 100755
--- a/config.rpath
+++ b/config.rpath
@@ -2,7 +2,7 @@
# Output a system dependent set of variables, describing how to set the
# run time search path of shared libraries in an executable.
#
-# Copyright 1996-2006 Free Software Foundation, Inc.
+# Copyright 1996-2010 Free Software Foundation, Inc.
# Taken from GNU libtool, 2001
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
#
@@ -47,7 +47,7 @@ for cc_temp in $CC""; do
done
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
-# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
wl=
if test "$GCC" = yes; then
@@ -64,7 +64,7 @@ else
;;
esac
;;
- mingw* | pw32* | os2*)
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
;;
hpux9* | hpux10* | hpux11*)
wl='-Wl,'
@@ -74,9 +74,15 @@ else
;;
newsos6)
;;
- linux*)
+ linux* | k*bsd*-gnu)
case $cc_basename in
- icc* | ecc*)
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
wl='-Wl,'
;;
pgcc | pgf77 | pgf90)
@@ -100,7 +106,7 @@ else
osf3* | osf4* | osf5*)
wl='-Wl,'
;;
- sco3.2v5*)
+ rdos*)
;;
solaris*)
wl='-Wl,'
@@ -108,11 +114,14 @@ else
sunos4*)
wl='-Qoption ld '
;;
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ sysv4 | sysv4.2uw2* | sysv4.3*)
wl='-Wl,'
;;
sysv4*MP*)
;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
unicos*)
wl='-Wl,'
;;
@@ -121,7 +130,7 @@ else
esac
fi
-# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
hardcode_libdir_flag_spec=
hardcode_libdir_separator=
@@ -129,7 +138,7 @@ hardcode_direct=no
hardcode_minus_L=no
case "$host_os" in
- cygwin* | mingw* | pw32*)
+ cygwin* | mingw* | pw32* | cegcc*)
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
@@ -155,7 +164,7 @@ if test "$with_gnu_ld" = yes; then
# option of GNU ld is called -rpath, not --rpath.
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
case "$host_os" in
- aix3* | aix4* | aix5*)
+ aix[3-9]*)
# On AIX/PPC, the GNU linker is very broken
if test "$host_cpu" != ia64; then
ld_shlibs=no
@@ -179,7 +188,7 @@ if test "$with_gnu_ld" = yes; then
ld_shlibs=no
fi
;;
- cygwin* | mingw* | pw32*)
+ cygwin* | mingw* | pw32* | cegcc*)
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
@@ -189,11 +198,11 @@ if test "$with_gnu_ld" = yes; then
ld_shlibs=no
fi
;;
- interix3*)
+ interix[3-9]*)
hardcode_direct=no
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
;;
- linux*)
+ gnu* | linux* | k*bsd*-gnu)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
:
else
@@ -251,7 +260,7 @@ else
hardcode_direct=unsupported
fi
;;
- aix4* | aix5*)
+ aix[4-9]*)
if test "$host_cpu" = ia64; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
@@ -261,7 +270,7 @@ else
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
for ld_flag in $LDFLAGS; do
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
aix_use_runtimelinking=yes
@@ -280,7 +289,7 @@ else
strings "$collect2name" | grep resolve_lib_name >/dev/null
then
# We have reworked collect2
- hardcode_direct=yes
+ :
else
# We have old collect2
hardcode_direct=unsupported
@@ -323,7 +332,7 @@ else
;;
bsdi[45]*)
;;
- cygwin* | mingw* | pw32*)
+ cygwin* | mingw* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
@@ -359,7 +368,7 @@ else
hardcode_direct=yes
hardcode_minus_L=yes
;;
- freebsd* | kfreebsd*-gnu | dragonfly*)
+ freebsd* | dragonfly*)
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
;;
@@ -412,18 +421,22 @@ else
hardcode_libdir_separator=:
;;
openbsd*)
- hardcode_direct=yes
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
else
- case "$host_os" in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
+ ld_shlibs=no
fi
;;
os2*)
@@ -471,7 +484,7 @@ else
ld_shlibs=yes
fi
;;
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
;;
sysv5* | sco3.2v5* | sco5v6*)
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
@@ -487,34 +500,52 @@ else
fi
# Check dynamic linker characteristics
-# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
libname_spec='lib$name'
case "$host_os" in
aix3*)
+ library_names_spec='$libname.a'
;;
- aix4* | aix5*)
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
;;
amigaos*)
+ library_names_spec='$libname.a'
;;
beos*)
+ library_names_spec='$libname$shrext'
;;
bsdi[45]*)
+ library_names_spec='$libname$shrext'
;;
- cygwin* | mingw* | pw32*)
+ cygwin* | mingw* | pw32* | cegcc*)
shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
;;
darwin* | rhapsody*)
shrext=.dylib
+ library_names_spec='$libname$shrext'
;;
dgux*)
+ library_names_spec='$libname$shrext'
;;
freebsd1*)
;;
- kfreebsd*-gnu)
- ;;
freebsd* | dragonfly*)
+ case "$host_os" in
+ freebsd[123]*)
+ library_names_spec='$libname$shrext$versuffix' ;;
+ *)
+ library_names_spec='$libname$shrext' ;;
+ esac
;;
gnu*)
+ library_names_spec='$libname$shrext'
;;
hpux9* | hpux10* | hpux11*)
case $host_cpu in
@@ -528,10 +559,13 @@ case "$host_os" in
shrext=.sl
;;
esac
+ library_names_spec='$libname$shrext'
;;
- interix3*)
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
;;
irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
case "$host_os" in
irix5* | nonstopux*)
libsuff= shlibsuff=
@@ -548,41 +582,59 @@ case "$host_os" in
;;
linux*oldld* | linux*aout* | linux*coff*)
;;
- linux*)
+ linux* | k*bsd*-gnu)
+ library_names_spec='$libname$shrext'
;;
knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
;;
netbsd*)
+ library_names_spec='$libname$shrext'
;;
newsos6)
+ library_names_spec='$libname$shrext'
;;
nto-qnx*)
+ library_names_spec='$libname$shrext'
;;
openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
;;
os2*)
libname_spec='$name'
shrext=.dll
+ library_names_spec='$libname.a'
;;
osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
;;
solaris*)
+ library_names_spec='$libname$shrext'
;;
sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
;;
sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
;;
sysv4*MP*)
+ library_names_spec='$libname$shrext'
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
;;
uts4*)
+ library_names_spec='$libname$shrext'
;;
esac
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
@@ -596,6 +648,12 @@ libext="$libext"
# Shared library suffix (normally "so").
shlibext="$shlibext"
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist.
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
diff --git a/config.sub b/config.sub
deleted file mode 100755
index ae0b3dd..0000000
--- a/config.sub
+++ /dev/null
@@ -1,1626 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-# Inc.
-
-timestamp='2006-07-02'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>. Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help"
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo $1
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray)
- os=
- basic_machine=$1
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco6)
- os=-sco5v6
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
- | am33_2.0 \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
- | bfin \
- | c4x | clipper \
- | d10v | d30v | dlx | dsp16xx | dvp \
- | fr30 | frv \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | i370 | i860 | i960 | ia64 \
- | ip2k | iq2000 \
- | m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | mcore \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64el \
- | mips64vr | mips64vrel \
- | mips64orion | mips64orionel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipstx39 | mipstx39el \
- | mn10200 | mn10300 \
- | mt \
- | msp430 \
- | nios | nios2 \
- | ns16k | ns32k \
- | or32 \
- | pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
- | pyramid \
- | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
- | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu | strongarm \
- | tahoe | thumb | tic4x | tic80 | tron \
- | v850 | v850e \
- | we32k \
- | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
- | z8k)
- basic_machine=$basic_machine-unknown
- ;;
- m6811 | m68hc11 | m6812 | m68hc12)
- # Motorola 68HC11/12.
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
- ;;
- ms1)
- basic_machine=mt-unknown
- ;;
-
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
- | avr-* | avr32-* \
- | bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
- | clipper-* | craynv-* | cydra-* \
- | d10v-* | d30v-* | dlx-* \
- | elxsi-* \
- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | i*86-* | i860-* | i960-* | ia64-* \
- | ip2k-* | iq2000-* \
- | m32c-* | m32r-* | m32rle-* \
- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* \
- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
- | mips16-* \
- | mips64-* | mips64el-* \
- | mips64vr-* | mips64vrel-* \
- | mips64orion-* | mips64orionel-* \
- | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* \
- | mips64vr5000-* | mips64vr5000el-* \
- | mips64vr5900-* | mips64vr5900el-* \
- | mipsisa32-* | mipsisa32el-* \
- | mipsisa32r2-* | mipsisa32r2el-* \
- | mipsisa64-* | mipsisa64el-* \
- | mipsisa64r2-* | mipsisa64r2el-* \
- | mipsisa64sb1-* | mipsisa64sb1el-* \
- | mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipstx39-* | mipstx39el-* \
- | mmix-* \
- | mt-* \
- | msp430-* \
- | nios-* | nios2-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
- | pyramid-* \
- | romp-* | rs6000-* \
- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
- | sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
- | tahoe-* | thumb-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
- | tron-* \
- | v850-* | v850e-* | vax-* \
- | we32k-* \
- | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
- | xstormy16-* | xtensa-* \
- | ymp-* \
- | z8k-*)
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- abacus)
- basic_machine=abacus-unknown
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amd64)
- basic_machine=x86_64-pc
- ;;
- amd64-*)
- basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- c90)
- basic_machine=c90-cray
- os=-unicos
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | j90)
- basic_machine=j90-cray
- os=-unicos
- ;;
- craynv)
- basic_machine=craynv-cray
- os=-unicosmp
- ;;
- cr16c)
- basic_machine=cr16c-unknown
- os=-elf
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- crisv32 | crisv32-* | etraxfs*)
- basic_machine=crisv32-axis
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- crx)
- basic_machine=crx-unknown
- os=-elf
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- decsystem10* | dec10*)
- basic_machine=pdp10-dec
- os=-tops10
- ;;
- decsystem20* | dec20*)
- basic_machine=pdp10-dec
- os=-tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- djgpp)
- basic_machine=i586-pc
- os=-msdosdjgpp
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- ;;
-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
- i*86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i*86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i*86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i*86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta)
- basic_machine=i386-unknown
- os=-vsta
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- mingw32)
- basic_machine=i386-pc
- os=-mingw32
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mipsEE* | ee | ps2)
- basic_machine=mips64r5900el-scei
- case $os in
- -linux*)
- ;;
- *)
- os=-elf
- ;;
- esac
- ;;
- iop)
- basic_machine=mipsel-scei
- os=-irx
- ;;
- dvp)
- basic_machine=dvp-scei
- os=-elf
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=-morphos
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- ms1-*)
- basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- openrisc | openrisc-*)
- basic_machine=or32-unknown
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=-os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pc98)
- basic_machine=i386-pc
- ;;
- pc98-*)
- basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium | p5 | k5 | k6 | nexgen | viac3)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon | athlon_*)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2 | pentiumiii | pentium3)
- basic_machine=i686-pc
- ;;
- pentium4)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium4-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
- ;;
- ppc) basic_machine=powerpc-unknown
- ;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
- basic_machine=powerpc64le-unknown
- ;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
- ;;
- rdos)
- basic_machine=i386-pc
- os=-rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- s390 | s390-*)
- basic_machine=s390-ibm
- ;;
- s390x | s390x-*)
- basic_machine=s390x-ibm
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
- ;;
- sb1)
- basic_machine=mipsisa64sb1-unknown
- ;;
- sb1el)
- basic_machine=mipsisa64sb1el-unknown
- ;;
- sei)
- basic_machine=mips-sei
- os=-seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sh64)
- basic_machine=sh64-unknown
- ;;
- sparclite-wrs | simso-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000)
- basic_machine=m68k-tandem
- ;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- os=-unicos
- ;;
- t90)
- basic_machine=t90-cray
- os=-unicos
- ;;
- tic54x | c54x*)
- basic_machine=tic54x-unknown
- os=-coff
- ;;
- tic55x | c55x*)
- basic_machine=tic55x-unknown
- os=-coff
- ;;
- tic6x | c6x*)
- basic_machine=tic6x-unknown
- os=-coff
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- toad1)
- basic_machine=pdp10-xkl
- os=-tops20
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- tpf)
- basic_machine=s390x-ibm
- os=-tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*)
- basic_machine=w65-wdc
- os=-none
- ;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- xbox)
- basic_machine=i686-pc
- os=-mingw32
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- z8k-*-coff)
- basic_machine=z8k-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
- ;;
- op50n)
- basic_machine=hppa1.1-oki
- ;;
- op60c)
- basic_machine=hppa1.1-oki
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- mmix)
- basic_machine=mmix-knuth
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp10)
- # there are many clones, so DEC is not a safe bet
- basic_machine=pdp10-unknown
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
- basic_machine=sh-unknown
- ;;
- sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
- ;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
- ;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -openbsd* | -solidbsd* \
- | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
- | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -chorusos* | -chorusrdb* \
- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -irx*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
- ;;
- -nto-qnx*)
- ;;
- -nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
- ;;
- -mac*)
- os=`echo $os | sed -e 's|mac|macos|'`
- ;;
- -linux-dietlibc)
- os=-linux-dietlibc
- ;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -opened*)
- os=-openedition
- ;;
- -os400*)
- os=-os400
- ;;
- -wince*)
- os=-wince
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -atheos*)
- os=-atheos
- ;;
- -syllable*)
- os=-syllable
- ;;
- -386bsd)
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -nova*)
- os=-rtmk-nova
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- -nsk*)
- os=-nsk
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -tpf*)
- os=-tpf
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*)
- os=-ose
- ;;
- -es1800*)
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
- ;;
- -aros*)
- os=-aros
- ;;
- -kaos*)
- os=-kaos
- ;;
- -zvmoe)
- os=-zvmoe
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- spu-*)
- os=-elf
- ;;
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-rebel)
- os=-linux
- ;;
- arm*-semi)
- os=-aout
- ;;
- c4x-* | tic4x-*)
- os=-coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=-tops20
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- # This also exists in the configure program, but was not the
- # default.
- # os=-sunos4
- ;;
- m68*-cisco)
- os=-aout
- ;;
- mips*-cisco)
- os=-elf
- ;;
- mips*-*)
- os=-elf
- ;;
- or32-*)
- os=-coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-be)
- os=-beos
- ;;
- *-haiku)
- os=-haiku
- ;;
- *-ibm)
- os=-aix
- ;;
- *-knuth)
- os=-mmixware
- ;;
- *-wec)
- os=-proelf
- ;;
- *-winbond)
- os=-proelf
- ;;
- *-oki)
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
- ;;
- *-rom68k)
- os=-coff
- ;;
- *-*bug)
- os=-coff
- ;;
- *-apple)
- os=-macos
- ;;
- *-atari*)
- os=-mint
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -aix*)
- vendor=ibm
- ;;
- -beos*)
- vendor=be
- ;;
- -hpux*)
- vendor=hp
- ;;
- -mpeix*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs* | -opened*)
- vendor=ibm
- ;;
- -os400*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -tpf*)
- vendor=ibm
- ;;
- -vxsim* | -vxworks* | -windiss*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*)
- vendor=hitachi
- ;;
- -mpw* | -macos*)
- vendor=apple
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- vendor=atari
- ;;
- -vos*)
- vendor=stratus
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/configure b/configure
deleted file mode 100755
index 1e93364..0000000
--- a/configure
+++ /dev/null
@@ -1,5568 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for libmowgli 1.0.0.
-#
-# Report bugs to <bugs+libmowgli@atheme.org>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '\${1+\"\$@\"}'='\"\$@\"'
- setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-"
- as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
- exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
- as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
- eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
- as_have_required=yes
-else
- as_have_required=no
-fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- as_found=:
- case $as_dir in #(
- /*)
- for as_base in sh bash ksh sh5; do
- # Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
- if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
- CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
- break 2
-fi
-fi
- done;;
- esac
- as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
- if test "x$CONFIG_SHELL" != x; then :
- # We cannot yet assume a decent shell, so we have to provide a
- # neutralization value for shells without unset; and this also
- # works around shells that cannot unset nonexistent variables.
- # Preserve -v and -x to the replacement shell.
- BASH_ENV=/dev/null
- ENV=/dev/null
- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
- export CONFIG_SHELL
- case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
- esac
- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
-fi
-
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
- else
- $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: bugs+libmowgli@atheme.org about your system, including
-$0: any error possibly output before this message. Then
-$0: install a modern shell, or manually run the script
-$0: under such a shell if you do have one."
- fi
- exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
- as_lineno_1=$LINENO as_lineno_1a=$LINENO
- as_lineno_2=$LINENO as_lineno_2a=$LINENO
- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
- sed -n '
- p
- /[$]LINENO/=
- ' <$as_myself |
- sed '
- s/[$]LINENO.*/&-/
- t lineno
- b
- :lineno
- N
- :loop
- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
- t loop
- s/-\n.*//
- ' >$as_me.lineno &&
- chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
- . "./$as_me.lineno"
- # Exit status is that of the last command.
- exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -p'
- fi
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='libmowgli'
-PACKAGE_TARNAME='libmowgli'
-PACKAGE_VERSION='1.0.0'
-PACKAGE_STRING='libmowgli 1.0.0'
-PACKAGE_BUGREPORT='bugs+libmowgli@atheme.org'
-PACKAGE_URL=''
-
-ac_unique_file="src/libmowgli/mowgli_alloc.c"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='LTLIBOBJS
-EXAMPLES_BUILD
-MOWGLI_MODULE
-LIBOBJS
-EGREP
-GREP
-CPP
-CLEAN_LIB
-UNINSTALL_LIB
-INSTALL_LIB
-PLUGIN_SUFFIX
-PLUGIN_LDFLAGS
-PLUGIN_CFLAGS
-PLUGIN_CPPFLAGS
-LDFLAGS_RPATH
-LIB_SUFFIX
-LIB_PREFIX
-LIB_LDFLAGS
-LIB_CFLAGS
-LIB_CPPFLAGS
-PACKAGE
-SET_MAKE
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-LN_S
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-target_os
-target_vendor
-target_cpu
-target
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_examples
-'
- ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval $ac_prev=\$ac_option
- ac_prev=
- continue
- fi
-
- case $ac_option in
- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
- *=) ac_optarg= ;;
- *) ac_optarg=yes ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case $ac_dashdash$ac_option in
- --)
- ac_dashdash=yes ;;
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir=$ac_optarg ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build_alias ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build_alias=$ac_optarg ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file=$ac_optarg ;;
-
- --config-cache | -C)
- cache_file=config.cache ;;
-
- -datadir | --datadir | --datadi | --datad)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=*)
- datadir=$ac_optarg ;;
-
- -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
- | --dataroo | --dataro | --datar)
- ac_prev=datarootdir ;;
- -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
- | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
- datarootdir=$ac_optarg ;;
-
- -disable-* | --disable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=no ;;
-
- -docdir | --docdir | --docdi | --doc | --do)
- ac_prev=docdir ;;
- -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
- docdir=$ac_optarg ;;
-
- -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
- ac_prev=dvidir ;;
- -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
- dvidir=$ac_optarg ;;
-
- -enable-* | --enable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=\$ac_optarg ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix=$ac_optarg ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he | -h)
- ac_init_help=long ;;
- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
- ac_init_help=recursive ;;
- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
- ac_init_help=short ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host_alias ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host_alias=$ac_optarg ;;
-
- -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
- ac_prev=htmldir ;;
- -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
- | --ht=*)
- htmldir=$ac_optarg ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir=$ac_optarg ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir=$ac_optarg ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir=$ac_optarg ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir=$ac_optarg ;;
-
- -localedir | --localedir | --localedi | --localed | --locale)
- ac_prev=localedir ;;
- -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
- localedir=$ac_optarg ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst | --locals)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
- localstatedir=$ac_optarg ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir=$ac_optarg ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir=$ac_optarg ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix=$ac_optarg ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix=$ac_optarg ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix=$ac_optarg ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name=$ac_optarg ;;
-
- -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
- ac_prev=pdfdir ;;
- -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
- pdfdir=$ac_optarg ;;
-
- -psdir | --psdir | --psdi | --psd | --ps)
- ac_prev=psdir ;;
- -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
- psdir=$ac_optarg ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir=$ac_optarg ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir=$ac_optarg ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site=$ac_optarg ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir=$ac_optarg ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir=$ac_optarg ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target_alias ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target_alias=$ac_optarg ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers | -V)
- ac_init_version=: ;;
-
- -with-* | --with-*)
- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=\$ac_optarg ;;
-
- -without-* | --without-*)
- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=no ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes=$ac_optarg ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
- -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
- ;;
-
- *=*)
- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
- # Reject names that are not valid shell variable names.
- case $ac_envvar in #(
- '' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
- esac
- eval $ac_envvar=\$ac_optarg
- export $ac_envvar ;;
-
- *)
- # FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
- case $enable_option_checking in
- no) ;;
- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
- esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
- datadir sysconfdir sharedstatedir localstatedir includedir \
- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir
-do
- eval ac_val=\$$ac_var
- # Remove trailing slashes.
- case $ac_val in
- */ )
- ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
- eval $ac_var=\$ac_val;;
- esac
- # Be sure to have absolute directory names.
- case $ac_val in
- [\\/$]* | ?:[\\/]* ) continue;;
- NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
- esac
- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used" >&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
- as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
- as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then the parent directory.
- ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_myself" : 'X\(//\)[^/]' \| \
- X"$as_myself" : 'X\(//\)$' \| \
- X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- srcdir=$ac_confdir
- if test ! -r "$srcdir/$ac_unique_file"; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
- pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
- srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
- eval ac_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_env_${ac_var}_value=\$${ac_var}
- eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat <<_ACEOF
-\`configure' configures libmowgli 1.0.0 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE. See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
- -h, --help display this help and exit
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking ...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
-
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
- --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
- --infodir=DIR info documentation [DATAROOTDIR/info]
- --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
- --mandir=DIR man documentation [DATAROOTDIR/man]
- --docdir=DIR documentation root [DATAROOTDIR/doc/libmowgli]
- --htmldir=DIR html documentation [DOCDIR]
- --dvidir=DIR dvi documentation [DOCDIR]
- --pdfdir=DIR pdf documentation [DOCDIR]
- --psdir=DIR ps documentation [DOCDIR]
-_ACEOF
-
- cat <<\_ACEOF
-
-System types:
- --build=BUILD configure for building on BUILD [guessed]
- --host=HOST cross-compile to build programs to run on HOST [BUILD]
- --target=TARGET configure for building compilers for TARGET [HOST]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
- case $ac_init_help in
- short | recursive ) echo "Configuration of libmowgli 1.0.0:";;
- esac
- cat <<\_ACEOF
-
-Optional Features:
- --disable-option-checking ignore unrecognized --enable/--with options
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-examples build and install example programs
-
-Some influential environment variables:
- CC C compiler command
- CFLAGS C compiler flags
- LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
- nonstandard directory <lib dir>
- LIBS libraries to pass to the linker, e.g. -l<library>
- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
- you have headers in a nonstandard directory <include dir>
- CPP C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <bugs+libmowgli@atheme.org>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
- # If there are subdirs, report their specific --help.
- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d "$ac_dir" ||
- { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
- continue
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
- cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
- if test -f "$ac_srcdir/configure.gnu"; then
- echo &&
- $SHELL "$ac_srcdir/configure.gnu" --help=recursive
- elif test -f "$ac_srcdir/configure"; then
- echo &&
- $SHELL "$ac_srcdir/configure" --help=recursive
- else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
- fi || ac_status=$?
- cd "$ac_pwd" || { ac_status=$?; break; }
- done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
- cat <<\_ACEOF
-libmowgli configure 1.0.0
-generated by GNU Autoconf 2.68
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
- exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- $as_test_x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ---------------------------------------- ##
-## Report this to bugs+libmowgli@atheme.org ##
-## ---------------------------------------- ##"
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by libmowgli $as_me 1.0.0, which was
-generated by GNU Autoconf 2.68. Invocation command line was
-
- $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
-
-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
- done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
- for ac_arg
- do
- case $ac_arg in
- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- continue ;;
- *\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case $ac_pass in
- 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
- 2)
- as_fn_append ac_configure_args1 " '$ac_arg'"
- if test $ac_must_keep_next = true; then
- ac_must_keep_next=false # Got value, back to normal.
- else
- case $ac_arg in
- *=* | --config-cache | -C | -disable-* | --disable-* \
- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
- | -with-* | --with-* | -without-* | --without-* | --x)
- case "$ac_configure_args0 " in
- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
- esac
- ;;
- -* ) ac_must_keep_next=true ;;
- esac
- fi
- as_fn_append ac_configure_args " '$ac_arg'"
- ;;
- esac
- done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log. We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
- # Save into config.log some information that might help in debugging.
- {
- echo
-
- $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
- echo
- # The following way of writing the cache mishandles newlines in values,
-(
- for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
- (set) 2>&1 |
- case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- sed -n \
- "s/'\''/'\''\\\\'\'''\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
- ;; #(
- *)
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-)
- echo
-
- $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
- echo
- for ac_var in $ac_subst_vars
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
-
- if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
- echo
- for ac_var in $ac_subst_files
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
- fi
-
- if test -s confdefs.h; then
- $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
- echo
- cat confdefs.h
- echo
- fi
- test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
- } >&5
- rm -f core *.core core.conftest.* &&
- rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
- exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
-elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
- fi
-done
-
-if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special files
- # actually), so we avoid doing that. DJGPP emulates it as a regular file.
- if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
- case $cache_file in
- [\\/]* | ?:[\\/]* ) . "$cache_file";;
- *) . "./$cache_file";;
- esac
- fi
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
- >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
- eval ac_old_set=\$ac_cv_env_${ac_var}_set
- eval ac_new_set=\$ac_env_${ac_var}_set
- eval ac_old_val=\$ac_cv_env_${ac_var}_value
- eval ac_new_val=\$ac_env_${ac_var}_value
- case $ac_old_set,$ac_new_set in
- set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,);;
- *)
- if test "x$ac_old_val" != "x$ac_new_val"; then
- # differences in whitespace do not lead to failure.
- ac_old_val_w=`echo x $ac_old_val`
- ac_new_val_w=`echo x $ac_new_val`
- if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- ac_cache_corrupted=:
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
- eval $ac_var=\$ac_old_val
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
- fi;;
- esac
- # Pass precious variables to config.status.
- if test "$ac_new_set" = set; then
- case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
- *) ac_arg=$ac_var=$ac_new_val ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) as_fn_append ac_configure_args " '$ac_arg'" ;;
- esac
- fi
-done
-if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_config_headers="$ac_config_headers src/libmowgli/mowgli_config.h"
-
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "x$host_alias" = x; then
- ac_cv_host=$ac_cv_build
-else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if ${ac_cv_target+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "x$target_alias" = x; then
- ac_cv_target=$ac_cv_host
-else
- ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
-case $ac_cv_target in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
-esac
-target=$ac_cv_target
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_target
-shift
-target_cpu=$1
-target_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-target_os=$*
-IFS=$ac_save_IFS
-case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-
-
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-test -n "$target_alias" &&
- test "$program_prefix$program_suffix$program_transform_name" = \
- NONENONEs,x,x, &&
- program_prefix=${target_alias}-
-
-# Checks for programs.
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CC" && break
-done
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- * ) ac_rmfiles="$ac_rmfiles $ac_file";;
- esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link_default") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile. We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
- ;;
- [ab].out )
- # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
- then :; else
- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- fi
- # We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
- # argument, so we may need to know it at that point already.
- # Even if this section looks crufty: it has the advantage of
- # actually working.
- break;;
- * )
- break;;
- esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
- ac_file=''
-fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- break;;
- * ) break;;
- esac
-done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
- { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if { ac_try='./conftest$ac_cv_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
- fi
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- for ac_file in conftest.o conftest.obj conftest.*; do
- test -f "$ac_file" || continue;
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
- ./ | .// | /[cC]/* | \
- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
- ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
- /usr/ucb/* ) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
- if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- :
- elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # program-specific install script used by HP pwplus--don't use.
- :
- else
- rm -rf conftest.one conftest.two conftest.dir
- echo one > conftest.one
- echo two > conftest.two
- mkdir conftest.dir
- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
- test -s conftest.one && test -s conftest.two &&
- test -s conftest.dir/conftest.one &&
- test -s conftest.dir/conftest.two
- then
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
- break 3
- fi
- fi
- fi
- done
- done
- ;;
-esac
-
- done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL=$ac_cv_path_install
- else
- # As a last resort, use the slow shell script. Don't cache a
- # value for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the value is a relative name.
- INSTALL=$ac_install_sh
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
- @echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
- *@@@%%%=?*=@@@%%%*)
- eval ac_cv_prog_make_${ac_make}_set=yes;;
- *)
- eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- SET_MAKE=
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
-$as_echo_n "checking for library containing strerror... " >&6; }
-if ${ac_cv_search_strerror+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char strerror ();
-int
-main ()
-{
-return strerror ();
- ;
- return 0;
-}
-_ACEOF
-for ac_lib in '' cposix; do
- if test -z "$ac_lib"; then
- ac_res="none required"
- else
- ac_res=-l$ac_lib
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- fi
- if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_search_strerror=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
- if ${ac_cv_search_strerror+:} false; then :
- break
-fi
-done
-if ${ac_cv_search_strerror+:} false; then :
-
-else
- ac_cv_search_strerror=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
-$as_echo "$ac_cv_search_strerror" >&6; }
-ac_res=$ac_cv_search_strerror
-if test "$ac_res" != no; then :
- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-
-test x"$GCC" = x"yes" && CFLAGS="$CFLAGS -pipe -Wall"
-
-# XXX workaround
-PACKAGE="libmowgli"
-
-
-# Checks for libraries.
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library system" >&5
-$as_echo_n "checking for shared library system... " >&6; }
- case "$host_os" in
- darwin*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5
-$as_echo "Darwin" >&6; }
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-dynamiclib -flat_namespace'
- LIB_PREFIX='lib'
- LIB_SUFFIX='.dylib'
- LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-bundle -flat_namespace -undefined suppress'
- PLUGIN_SUFFIX='.impl'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
- CLEAN_LIB=''
- ;;
- solaris*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Solaris" >&5
-$as_echo "Solaris" >&6; }
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-shared -fPIC -Wl,-soname=${LIB}.${LIB_MAJOR}.${LIB_MINOR}'
- LIB_PREFIX='lib'
- LIB_SUFFIX='.so'
- LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-shared -fPIC'
- PLUGIN_SUFFIX='.so'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR} && rm -f ${DESTDIR}${libdir}/$$i && ${LN_S} $$i.${LIB_MAJOR}.${LIB_MINOR} ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}'
- CLEAN_LIB=''
- ;;
- openbsd* | mirbsd*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: OpenBSD" >&5
-$as_echo "OpenBSD" >&6; }
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-shared -fPIC'
- LIB_PREFIX='lib'
- LIB_SUFFIX='.so.${LIB_MAJOR}.${LIB_MINOR}'
- LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-shared -fPIC'
- PLUGIN_SUFFIX='.so'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i'
- CLEAN_LIB=''
- ;;
- cygwin* | mingw*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Win32" >&5
-$as_echo "Win32" >&6; }
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS=''
- LIB_LDFLAGS='-shared -Wl,--out-implib,${LIB}.a'
- LIB_PREFIX='lib'
- LIB_SUFFIX='.dll'
- LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS=''
- PLUGIN_CFLAGS=''
- PLUGIN_LDFLAGS='-shared'
- PLUGIN_SUFFIX='.dll'
- INSTALL_LIB='${MKDIR_P} ${DESTDIR}${bindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${bindir}/$$i && ${INSTALL} -m 755 $$i.a ${DESTDIR}${libdir}/$$i.a'
- UNINSTALL_LIB='rm -f ${DESTDIR}${bindir}/$$i ${DESTDIR}${libdir}/$$i.a'
- CLEAN_LIB='${LIB}.a'
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: GNU" >&5
-$as_echo "GNU" >&6; }
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-shared -fPIC -Wl,-soname=${LIB}.${LIB_MAJOR}'
- LIB_PREFIX='lib'
- LIB_SUFFIX='.so'
- LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-shared -fPIC'
- PLUGIN_SUFFIX='.so'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0 && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0'
- CLEAN_LIB=''
- ;;
- esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-LIBS="$LIBS $DYNAMIC_LD_LIBS"
-
-# Checks for header files.
-ac_header_dirent=no
-for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
- as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
-$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
-if eval \${$as_ac_Header+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <$ac_hdr>
-
-int
-main ()
-{
-if ((DIR *) 0)
-return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$as_ac_Header=yes"
-else
- eval "$as_ac_Header=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$as_ac_Header
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
-_ACEOF
-
-ac_header_dirent=$ac_hdr; break
-fi
-
-done
-# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
-if test $ac_header_dirent = dirent.h; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
-$as_echo_n "checking for library containing opendir... " >&6; }
-if ${ac_cv_search_opendir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char opendir ();
-int
-main ()
-{
-return opendir ();
- ;
- return 0;
-}
-_ACEOF
-for ac_lib in '' dir; do
- if test -z "$ac_lib"; then
- ac_res="none required"
- else
- ac_res=-l$ac_lib
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- fi
- if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_search_opendir=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
- if ${ac_cv_search_opendir+:} false; then :
- break
-fi
-done
-if ${ac_cv_search_opendir+:} false; then :
-
-else
- ac_cv_search_opendir=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
-$as_echo "$ac_cv_search_opendir" >&6; }
-ac_res=$ac_cv_search_opendir
-if test "$ac_res" != no; then :
- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
-$as_echo_n "checking for library containing opendir... " >&6; }
-if ${ac_cv_search_opendir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char opendir ();
-int
-main ()
-{
-return opendir ();
- ;
- return 0;
-}
-_ACEOF
-for ac_lib in '' x; do
- if test -z "$ac_lib"; then
- ac_res="none required"
- else
- ac_res=-l$ac_lib
- LIBS="-l$ac_lib $ac_func_search_save_LIBS"
- fi
- if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_search_opendir=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext
- if ${ac_cv_search_opendir+:} false; then :
- break
-fi
-done
-if ${ac_cv_search_opendir+:} false; then :
-
-else
- ac_cv_search_opendir=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
-$as_echo "$ac_cv_search_opendir" >&6; }
-ac_res=$ac_cv_search_opendir
-if test "$ac_res" != no; then :
- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in limits.h stdlib.h string.h unistd.h locale.h stdarg.h sys/types.h sys/stat.h errno.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-# Checks for typedefs, structures, and compiler characteristics.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if ${ac_cv_c_const+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-/* FIXME: Include the comments suggested by Paul. */
-#ifndef __cplusplus
- /* Ultrix mips cc rejects this. */
- typedef int charset[2];
- const charset cs;
- /* SunOS 4.1.1 cc rejects this. */
- char const *const *pcpcc;
- char **ppc;
- /* NEC SVR4.0.2 mips cc rejects this. */
- struct point {int x, y;};
- static struct point const zero = {0,0};
- /* AIX XL C 1.02.0.0 rejects this.
- It does not let you subtract one const X* pointer from another in
- an arm of an if-expression whose if-part is not a constant
- expression */
- const char *g = "string";
- pcpcc = &g + (g ? g-g : 0);
- /* HPUX 7.0 cc rejects these. */
- ++pcpcc;
- ppc = (char**) pcpcc;
- pcpcc = (char const *const *) ppc;
- { /* SCO 3.2v4 cc rejects this. */
- char *t;
- char const *s = 0 ? (char *) 0 : (char const *) 0;
-
- *t++ = 0;
- if (s) return 0;
- }
- { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
- int x[] = {25, 17};
- const int *foo = &x[0];
- ++foo;
- }
- { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
- typedef const int *iptr;
- iptr p = 0;
- ++p;
- }
- { /* AIX XL C 1.02.0.0 rejects this saying
- "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
- struct s { int j; const int *ap[3]; };
- struct s *b; b->j = 5;
- }
- { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
- const int foo = 10;
- if (!foo) return 0;
- }
- return !cs[0] && !zero.x;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_c_const=yes
-else
- ac_cv_c_const=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
-if test $ac_cv_c_const = no; then
-
-$as_echo "#define const /**/" >>confdefs.h
-
-fi
-
-
-# Checks for library functions.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5
-$as_echo_n "checking whether closedir returns void... " >&6; }
-if ${ac_cv_func_closedir_void+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- ac_cv_func_closedir_void=yes
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-#include <$ac_header_dirent>
-#ifndef __cplusplus
-int closedir ();
-#endif
-
-int
-main ()
-{
-return closedir (opendir (".")) != 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
- ac_cv_func_closedir_void=no
-else
- ac_cv_func_closedir_void=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5
-$as_echo "$ac_cv_func_closedir_void" >&6; }
-if test $ac_cv_func_closedir_void = yes; then
-
-$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h
-
-fi
-
-for ac_func in memset setlocale strcasecmp strchr strdup strerror strtol strtod
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-for ac_func in printf sprintf snprintf vsnprintf mmap gettimeofday strndup strlcpy strlcat epoll_ctl port_create
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
-$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; }
-if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -f conftest.sym conftest.file
-echo >conftest.file
-if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then
- if test "$cross_compiling" = yes; then :
- ac_cv_func_lstat_dereferences_slashed_symlink=no
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-int
-main ()
-{
-struct stat sbuf;
- /* Linux will dereference the symlink and fail, as required by POSIX.
- That is better in the sense that it means we will not
- have to compile and use the lstat wrapper. */
- return lstat ("conftest.sym/", &sbuf) == 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
- ac_cv_func_lstat_dereferences_slashed_symlink=yes
-else
- ac_cv_func_lstat_dereferences_slashed_symlink=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-else
- # If the `ln -s' command failed, then we probably don't even
- # have an lstat function.
- ac_cv_func_lstat_dereferences_slashed_symlink=no
-fi
-rm -f conftest.sym conftest.file
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5
-$as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; }
-
-test $ac_cv_func_lstat_dereferences_slashed_symlink = yes &&
-
-cat >>confdefs.h <<_ACEOF
-#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
-_ACEOF
-
-
-if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then
- case " $LIBOBJS " in
- *" lstat.$ac_objext "* ) ;;
- *) LIBOBJS="$LIBOBJS lstat.$ac_objext"
- ;;
-esac
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5
-$as_echo_n "checking whether stat accepts an empty string... " >&6; }
-if ${ac_cv_func_stat_empty_string_bug+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- ac_cv_func_stat_empty_string_bug=yes
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-int
-main ()
-{
-struct stat sbuf;
- return stat ("", &sbuf) == 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
- ac_cv_func_stat_empty_string_bug=no
-else
- ac_cv_func_stat_empty_string_bug=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5
-$as_echo "$ac_cv_func_stat_empty_string_bug" >&6; }
-if test $ac_cv_func_stat_empty_string_bug = yes; then
- case " $LIBOBJS " in
- *" stat.$ac_objext "* ) ;;
- *) LIBOBJS="$LIBOBJS stat.$ac_objext"
- ;;
-esac
-
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STAT_EMPTY_STRING_BUG 1
-_ACEOF
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dl_dlopen=yes
-else
- ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- LIBS="$LIBS -ldl"
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking loader type" >&5
-$as_echo_n "checking loader type... " >&6; }
-case "$target" in
-*-*-mingw32)
- MOWGLI_MODULE='mowgli_module_win32.c'
- ;;
-*)
- MOWGLI_MODULE='mowgli_module_posix.c'
- ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOWGLI_MODULE" >&5
-$as_echo "$MOWGLI_MODULE" >&6; };
-
-
-# Check for optional features.
-EXAMPLES_BUILD=""
-# Check whether --enable-examples was given.
-if test "${enable_examples+set}" = set; then :
- enableval=$enable_examples; enable_examples=$enableval
-else
- enable_examples="no"
-
-fi
-
-
-if test "x$enable_examples" = "xyes"; then
- EXAMPLES_BUILD="examples"
-fi
-
-
-
-
- ${as_echo:="echo"} "${as_me:="configure"}: touching .deps files"
- for i in $(find . -name Makefile); do
- DEPSFILE="$(dirname $i)/.deps"
- test -f "$DEPSFILE" && rm "$DEPSFILE"
- touch -t 0001010000 "$DEPSFILE"
- done
-
-
-ac_config_files="$ac_config_files buildsys.mk extra.mk libmowgli.pc"
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems. If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
- for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
-
- (set) 2>&1 |
- case $as_nl`(ac_space=' '; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- # `set' does not quote correctly, so add quotes: double-quote
- # substitution turns \\\\ into \\, and sed turns \\ into \.
- sed -n \
- "s/'/'\\\\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
- ;; #(
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-) |
- sed '
- /^ac_cv_env_/b end
- t clear
- :clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
- t end
- s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
- :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
- if test -w "$cache_file"; then
- if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
- if test ! -f "$cache_file" || test -h "$cache_file"; then
- cat confcache >"$cache_file"
- else
- case $cache_file in #(
- */* | ?:*)
- mv -f confcache "$cache_file"$$ &&
- mv -f "$cache_file"$$ "$cache_file" ;; #(
- *)
- mv -f confcache "$cache_file" ;;
- esac
- fi
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
- fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
- # 1. Remove the extension, and $U if already installed.
- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
- # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
- # will be set to the directory where LIBOBJS objects are built.
- as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
- as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-
-: "${CONFIG_STATUS=./config.status}"
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -p'
- fi
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by libmowgli $as_me 1.0.0, which was
-generated by GNU Autoconf 2.68. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
- CONFIG_LINKS = $CONFIG_LINKS
- CONFIG_COMMANDS = $CONFIG_COMMANDS
- $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration. Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
- -h, --help print this help, then exit
- -V, --version print version number and configuration settings, then exit
- --config print configuration, then exit
- -q, --quiet, --silent
- do not print progress messages
- -d, --debug don't remove temporary files
- --recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Report bugs to <bugs+libmowgli@atheme.org>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-libmowgli config.status 1.0.0
-configured by $0, generated by GNU Autoconf 2.68,
- with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
- case $1 in
- --*=?*)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
- ac_shift=:
- ;;
- --*=)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=
- ac_shift=:
- ;;
- *)
- ac_option=$1
- ac_optarg=$2
- ac_shift=shift
- ;;
- esac
-
- case $ac_option in
- # Handling of the options.
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- ac_cs_recheck=: ;;
- --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
- --config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
- --debug | --debu | --deb | --de | --d | -d )
- debug=: ;;
- --file | --fil | --fi | --f )
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
- '') as_fn_error $? "missing file argument" ;;
- esac
- as_fn_append CONFIG_FILES " '$ac_optarg'"
- ac_need_defaults=false;;
- --header | --heade | --head | --hea )
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- as_fn_append CONFIG_HEADERS " '$ac_optarg'"
- ac_need_defaults=false;;
- --he | --h)
- # Conflict between --help and --header
- as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
- --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil | --si | --s)
- ac_cs_silent=: ;;
-
- # This is an error.
- -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
- *) as_fn_append ac_config_targets " $1"
- ac_need_defaults=false ;;
-
- esac
- shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
- exec 6>/dev/null
- ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
- shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
- CONFIG_SHELL='$SHELL'
- export CONFIG_SHELL
- exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
- echo
- sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
- $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
- case $ac_config_target in
- "src/libmowgli/mowgli_config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/libmowgli/mowgli_config.h" ;;
- "buildsys.mk") CONFIG_FILES="$CONFIG_FILES buildsys.mk" ;;
- "extra.mk") CONFIG_FILES="$CONFIG_FILES extra.mk" ;;
- "libmowgli.pc") CONFIG_FILES="$CONFIG_FILES libmowgli.pc" ;;
-
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
- esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used. Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-fi
-
-# Have a temporary directory for convenience. Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
- tmp= ac_tmp=
- trap 'exit_status=$?
- : "${ac_tmp:=$tmp}"
- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
-' 0
- trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
- tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -d "$tmp"
-} ||
-{
- tmp=./conf$$-$RANDOM
- (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-ac_tmp=$tmp
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
- eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
- ac_cs_awk_cr='\\r'
-else
- ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
-_ACEOF
-
-
-{
- echo "cat >conf$$subs.awk <<_ACEOF" &&
- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
- echo "_ACEOF"
-} >conf$$subs.sh ||
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
- . ./conf$$subs.sh ||
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
- if test $ac_delim_n = $ac_delim_num; then
- break
- elif $ac_last_try; then
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
- N
- s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
- for (key in S) S_is_set[key] = 1
- FS = ""
-
-}
-{
- line = $ 0
- nfields = split(line, field, "@")
- substed = 0
- len = length(field[1])
- for (i = 2; i < nfields; i++) {
- key = field[i]
- keylen = length(key)
- if (S_is_set[key]) {
- value = S[key]
- line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
- len += length(value) + length(field[++i])
- substed = 1
- } else
- len += 1 + keylen
- }
-
- print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
- sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
- cat
-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
- || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
-h
-s///
-s/^/:/
-s/[ ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[ ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[ ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
- ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
- if test -z "$ac_tt"; then
- break
- elif $ac_last_try; then
- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any. Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[ ]*#[ ]*define[ ][ ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- for (key in D) D_is_set[key] = 1
- FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
- line = \$ 0
- split(line, arg, " ")
- if (arg[1] == "#") {
- defundef = arg[2]
- mac1 = arg[3]
- } else {
- defundef = substr(arg[1], 2)
- mac1 = arg[2]
- }
- split(mac1, mac2, "(") #)
- macro = mac2[1]
- prefix = substr(line, 1, index(line, defundef) - 1)
- if (D_is_set[macro]) {
- # Preserve the white space surrounding the "#".
- print prefix "define", macro P[macro] D[macro]
- next
- } else {
- # Replace #undef with comments. This is necessary, for example,
- # in the case of _POSIX_SOURCE, which is predefined and required
- # on some systems where configure will not decide to define it.
- if (defundef == "undef") {
- print "/*", prefix defundef, macro, "*/"
- next
- }
- }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
- as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
-shift
-for ac_tag
-do
- case $ac_tag in
- :[FHLC]) ac_mode=$ac_tag; continue;;
- esac
- case $ac_mode$ac_tag in
- :[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
- :[FH]-) ac_tag=-:-;;
- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
- esac
- ac_save_IFS=$IFS
- IFS=:
- set x $ac_tag
- IFS=$ac_save_IFS
- shift
- ac_file=$1
- shift
-
- case $ac_mode in
- :L) ac_source=$1;;
- :[FH])
- ac_file_inputs=
- for ac_f
- do
- case $ac_f in
- -) ac_f="$ac_tmp/stdin";;
- *) # Look for the file first in the build tree, then in the source tree
- # (if the path is not absolute). The absolute path cannot be DOS-style,
- # because $ac_f cannot contain `:'.
- test -f "$ac_f" ||
- case $ac_f in
- [\\/$]*) false;;
- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
- esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
- esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
- as_fn_append ac_file_inputs " '$ac_f'"
- done
-
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
- `' by configure.'
- if test x"$ac_file" != x-; then
- configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
- fi
- # Neutralize special characters interpreted by sed in replacement strings.
- case $configure_input in #(
- *\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
- sed 's/[\\\\&|]/\\\\&/g'`;; #(
- *) ac_sed_conf_input=$configure_input;;
- esac
-
- case $ac_tag in
- *:-:* | *:-) cat >"$ac_tmp/stdin" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
- esac
- ;;
- esac
-
- ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- as_dir="$ac_dir"; as_fn_mkdir_p
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
- case $ac_mode in
- :F)
- #
- # CONFIG_FILE
- #
-
- case $INSTALL in
- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
- *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
- esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
- p
- q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- ac_datarootdir_hack='
- s&@datadir@&$datadir&g
- s&@docdir@&$docdir&g
- s&@infodir@&$infodir&g
- s&@localedir@&$localedir&g
- s&@mandir@&$mandir&g
- s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
- "$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined" >&2;}
-
- rm -f "$ac_tmp/stdin"
- case $ac_file in
- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
- esac \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
- :H)
- #
- # CONFIG_HEADER
- #
- if test x"$ac_file" != x-; then
- {
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
- } >"$ac_tmp/config.h" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
- else
- rm -f "$ac_file"
- mv "$ac_tmp/config.h" "$ac_file" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- fi
- else
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
- || as_fn_error $? "could not create -" "$LINENO" 5
- fi
- ;;
-
-
- esac
-
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded. So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status. When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
- ac_cs_success=:
- ac_config_status_args=
- test "$silent" = yes &&
- ac_config_status_args="$ac_config_status_args --quiet"
- exec 5>/dev/null
- $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
- $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
-
-cat << _EOF_
-
-Configuration:
- Examples: ${enable_examples}
-
-Now type "make" to build, and "make install" to install.
-Thank you for using libmowgli.
-
-_EOF_
diff --git a/configure.ac b/configure.ac
index 13bca68..be4b19a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,82 +2,150 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
-AC_INIT([libmowgli], [1.0.0], [bugs+libmowgli@atheme.org])
-AC_CONFIG_SRCDIR([src/libmowgli/mowgli_alloc.c])
-AC_CONFIG_HEADER([src/libmowgli/mowgli_config.h])
+AC_INIT([libmowgli-2], [2.0.0], [http://jira.atheme.org/])
+AC_CONFIG_SRCDIR([src])
+AC_CONFIG_HEADER([src/libmowgli/platform/autoconf.h])
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
-# Checks for programs.
AC_PROG_CC
-AC_PROG_LN_S
+AC_PROG_CPP
AC_PROG_INSTALL
-AC_PROG_MAKE_SET
-AC_ISC_POSIX
-
-test x"$GCC" = x"yes" && CFLAGS="$CFLAGS -pipe -Wall"
-
-# XXX workaround
-PACKAGE="libmowgli"
-AC_SUBST(PACKAGE)
-
-# Checks for libraries.
-BUILDSYS_SHARED_LIB
-LIBS="$LIBS $DYNAMIC_LD_LIBS"
-
-# Checks for header files.
-AC_HEADER_DIRENT
-AC_HEADER_STDC
-AC_CHECK_HEADERS([limits.h stdlib.h string.h unistd.h locale.h stdarg.h sys/types.h sys/stat.h errno.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-
-# Checks for library functions.
-AC_FUNC_CLOSEDIR_VOID
-AC_CHECK_FUNCS([memset setlocale strcasecmp strchr strdup strerror strtol strtod])
-AC_CHECK_FUNCS([printf sprintf snprintf vsnprintf mmap gettimeofday strndup strlcpy strlcat epoll_ctl port_create])
-AC_FUNC_STAT
+AC_PROG_LN_S
-AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"])
+AC_PROG_CC_C99
+AS_IF([test "x$ac_cv_prog_cc_c99" = "xno"], [
+ AC_MSG_ERROR([C compiler does not support C99], 1)
+])
+
+MORECFLAGS="-pipe -Wall -Wextra -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers"
+AS_IF([test "x$GCC" = "xyes"], [
+ CFLAGS="$CFLAGS $MORECFLAGS"
+])
+
+AC_CHECK_HEADERS([poll.h winsock2.h sys/epoll.h sys/select.h sys/pstat.h sys/prctl.h])
+AC_CHECK_FUNCS([fcntl kqueue mmap select dispatch_block port_create setproctitle pstat])
+
+AC_CACHE_CHECK([for PS_STRINGS], [pgac_cv_var_PS_STRINGS],
+[AC_TRY_LINK(
+[#include <machine/vmparam.h>
+#include <sys/exec.h>
+],
+[PS_STRINGS->ps_nargvstr = 1;
+PS_STRINGS->ps_argvstr = "foo";],
+[pgac_cv_var_PS_STRINGS=yes],
+[pgac_cv_var_PS_STRINGS=no])])
+if test "$pgac_cv_var_PS_STRINGS" = yes ; then
+ AC_DEFINE([HAVE_PS_STRINGS], [], [Define to 1 if the PS_STRINGS struct exists on your platform (likely no).])
+fi
-dnl Detect which loader to use
-AC_MSG_CHECKING(loader type)
+AC_PATH_PROG(AR, ar)
+AC_PATH_PROG(RANLIB, ranlib)
+
+LIBMOWGLI_MODULES="core base container dns eventloop ext linebuf module object thread vio"
+AC_SUBST(LIBMOWGLI_MODULES)
+
+LIBMOWGLI_MODULE_BUILD="$(echo && echo x)"
+LIBMOWGLI_MODULE_BUILD="${LIBMOWGLI_MODULE_BUILD%x}"
+
+LIBMOWGLI_SHARED_MODULES=""
+AC_ARG_ENABLE([shared], [AS_HELP_STRING([--disable-shared], [do not build shared library])])
+AS_IF([test x"$enable_shared" != x"no"], [
+ BUILDSYS_SHARED_LIB
+ BUILDSYS_PROG_IMPLIB
+ AC_SUBST([LIBMOWGLI_SHARED_LIB], [${LIB_PREFIX}mowgli-2${LIB_SUFFIX}])
+
+ for i in $LIBMOWGLI_MODULES
+ do
+ UPPER="[$(echo $i | tr '[:lower:]' '[:upper:]')]"
+ LIBMOWGLI_SHARED_MODULES="$LIBMOWGLI_SHARED_MODULES $i/mowgli.$i.lib.a"
+ LIBMOWGLI_MODULE_BUILD="$LIBMOWGLI_MODULE_BUILD$(echo LIBMOWGLI_SHARED_$UPPER = mowgli.$i.lib.a && echo x)"
+ LIBMOWGLI_MODULE_BUILD="${LIBMOWGLI_MODULE_BUILD%x}"
+ done
+])
+
+LIBMOWGLI_STATIC_MODULES=""
+AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static], [build static library])])
+AS_IF([test x"$enable_static" = x"yes" -o x"$enable_shared" = x"no"], [
+ AC_SUBST([LIBMOWGLI_STATIC_LIB], [libmowgli-2.a])
+
+ for i in $LIBMOWGLI_MODULES
+ do
+ UPPER="[$(echo $i | tr '[:lower:]' '[:upper:]')]"
+ LIBMOWGLI_STATIC_MODULES="$LIBMOWGLI_STATIC_MODULES $i/mowgli.$i.a"
+ LIBMOWGLI_MODULE_BUILD="$LIBMOWGLI_MODULE_BUILD$(echo LIBMOWGLI_STATIC_$UPPER = mowgli.$i.a && echo x)"
+ LIBMOWGLI_MODULE_BUILD="${LIBMOWGLI_MODULE_BUILD%x}"
+ done
+])
+
+AC_MSG_CHECKING(OS type)
case "$target" in
*-*-mingw32)
- MOWGLI_MODULE='mowgli_module_win32.c'
- ;;
+ AC_MSG_RESULT([win32])
+ LIBMOWGLI_OS="win32"
+
+ LIBS="$LIBS -lwsock32 -lws2_32"
+
+ AS_IF([test x"$LIBMOWGLI_SHARED_MODULES" != x""], [
+ LIBMOWGLI_SHARED_MODULES="$LIBMOWGLI_SHARED_MODULES platform/win32/mowgli.platform.win32.lib.a"
+ LIBMOWGLI_MODULE_BUILD="$LIBMOWGLI_MODULE_BUILD$(echo LIBMOWGLI_SHARED_PLATFORM_WIN32 = mowgli.platform.win32.lib.a && echo x)"
+ LIBMOWGLI_MODULE_BUILD="${LIBMOWGLI_MODULE_BUILD%x}"
+ ])
+
+ AS_IF([test x"$LIBMOWGLI_STATIC_MODULES" != x""], [
+ LIBMOWGLI_STATIC_MODULES="$LIBMOWGLI_STATIC_MODULES platform/win32/mowgli.platform.win32.a"
+ LIBMOWGLI_MODULE_BUILD="$LIBMOWGLI_MODULE_BUILD$(echo LIBMOWGLI_STATIC_PLATFORM_WIN32 = mowgli.platform.win32.a && echo x)"
+ LIBMOWGLI_MODULE_BUILD="${LIBMOWGLI_MODULE_BUILD%x}"
+ ])
+ ;;
*)
- MOWGLI_MODULE='mowgli_module_posix.c'
- ;;
+ AC_MSG_RESULT([posix])
+ LIBMOWGLI_OS="posix"
+
+ ACX_PTHREAD
+ CPPFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"])
+ ;;
esac
-AC_MSG_RESULT($MOWGLI_MODULE);
-AC_SUBST(MOWGLI_MODULE)
+AC_SUBST([LIBMOWGLI_OS])
+AC_SUBST([LIBMOWGLI_SHARED_MODULES])
+AC_SUBST([LIBMOWGLI_STATIC_MODULES])
+AC_SUBST([LIBMOWGLI_MODULE_BUILD])
+
+OPENSSL="no"
+AX_CHECK_OPENSSL([
+ OPENSSL="yes"
+ AC_DEFINE(HAVE_OPENSSL,[1], [Define to 1 if OpenSSL is available])
+])
+AS_IF([test x"$OPENSSL" = x"yes"], [
+ LIBS="$LIBS $OPENSSL_LIBS"
+ LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $OPENSSL_INCLUDES"
+])
-# Check for optional features.
EXAMPLES_BUILD=""
-AC_ARG_ENABLE(examples,
- [ --enable-examples build and install example programs],
- [enable_examples=$enableval],
- [enable_examples="no"]
-)
-
-if test "x$enable_examples" = "xyes"; then
- EXAMPLES_BUILD="examples"
-fi
+EXAMPLES="no"
+AC_ARG_ENABLE([examples], [AS_HELP_STRING([--enable-examples], [build examples])])
+AS_IF([test x"$enable_examples" = x"yes"], [
+ EXAMPLES_BUILD="examples"
+ EXAMPLES="yes"
+])
AC_SUBST(EXAMPLES_BUILD)
+BUILDSYS_INIT
BUILDSYS_TOUCH_DEPS
-AC_CONFIG_FILES([buildsys.mk extra.mk libmowgli.pc])
+AC_CONFIG_FILES([buildsys.mk extra.mk libmowgli-2.pc])
AC_OUTPUT
cat << _EOF_
Configuration:
- Examples: ${enable_examples}
+ OpenSSL support: ${OPENSSL}
+ Examples: ${EXAMPLES}
Now type "make" to build, and "make install" to install.
Thank you for using libmowgli.
diff --git a/debian/changelog b/debian/changelog
index 549d9a3..61c43d9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+libmowgli-2 (2.0.0-1) unstable; urgency=low
+
+ * New major upstream release.
+
+ -- Andrew Shadura <andrewsh@debian.org> Tue, 28 Jan 2014 15:10:59 +0100
+
libmowgli (1.0.0-4) unstable; urgency=low
* Update config.sub and config.guess on build (Closes: #727414).
diff --git a/debian/clean b/debian/clean
index 5a96336..015cda4 100644
--- a/debian/clean
+++ b/debian/clean
@@ -1,2 +1,2 @@
-.deps src/.deps src/*/.deps src/*/*/.deps buildsys.mk config.log config.status extra.mk libmowgli.pc
+.deps src/.deps src/*/.deps src/*/*/.deps buildsys.mk config.log config.status extra.mk *.pc
config.sub config.guess
diff --git a/debian/control b/debian/control
index 3205d3d..8257a5f 100644
--- a/debian/control
+++ b/debian/control
@@ -1,17 +1,17 @@
-Source: libmowgli
+Source: libmowgli-2
Priority: optional
Maintainer: Andrew Shadura <andrewsh@debian.org>
Build-Depends: debhelper (>= 9), dh-autoreconf, autotools-dev
-Standards-Version: 3.9.4
+Standards-Version: 3.9.5
Homepage: http://www.atheme.org/projects/mowgli
Vcs-Hg: http://anonscm.debian.org/hg/collab-maint/libmowgli
Vcs-Browser: http://anonscm.debian.org/hg/collab-maint/libmowgli/summary
Section: libs
-Package: libmowgli-dev
+Package: libmowgli-2-dev
Section: libdevel
Architecture: any
-Depends: libmowgli2 (= ${binary:Version}), ${misc:Depends}
+Depends: libmowgli-2-0 (= ${binary:Version}), ${misc:Depends}
Multi-Arch: same
Description: high performance development framework for C (development)
Mowgli is a development framework for C (like GLib), which provides high
@@ -24,7 +24,7 @@ Description: high performance development framework for C (development)
This package contains files needed for development with this library and code
examples.
-Package: libmowgli2
+Package: libmowgli-2-0
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Pre-Depends: ${misc:Pre-Depends}
@@ -40,11 +40,11 @@ Description: high performance development framework for C
This package contains the shared library needed to run programs that use the
mowgli library.
-Package: libmowgli2-dbg
+Package: libmowgli-2-0-dbg
Priority: extra
Section: debug
Architecture: any
-Depends: libmowgli2 (= ${binary:Version}), ${misc:Depends}
+Depends: libmowgli-2-0 (= ${binary:Version}), ${misc:Depends}
Multi-Arch: same
Description: high performance development framework for C (debug)
Mowgli is a development framework for C (like GLib), which provides high
diff --git a/debian/libmowgli2.install b/debian/libmowgli-2-0.install
index 3ddde58..3ddde58 100644
--- a/debian/libmowgli2.install
+++ b/debian/libmowgli-2-0.install
diff --git a/debian/libmowgli2.lintian-overrides b/debian/libmowgli-2-0.lintian-overrides
index b00ac16..b00ac16 100644
--- a/debian/libmowgli2.lintian-overrides
+++ b/debian/libmowgli-2-0.lintian-overrides
diff --git a/debian/libmowgli2.symbols b/debian/libmowgli-2-0.symbols
index ba20253..54aa022 100644
--- a/debian/libmowgli2.symbols
+++ b/debian/libmowgli-2-0.symbols
@@ -1,27 +1,37 @@
-libmowgli.so.2 libmowgli2 #MINVER#
+libmowgli-2.so.0 libmowgli-2-0 #MINVER#
+ _mowgli_epoll_pollops@Base 2.0.0
+ _mowgli_null_mutex_ops@Base 2.0.0
+ _mowgli_null_pollops@Base 2.0.0
+ _mowgli_poll_pollops@Base 2.0.0
+ _mowgli_posix_mutex_ops@Base 2.0.0
+ _mowgli_select_pollops@Base 2.0.0
mowgli_alloc@Base 0.7.0
mowgli_alloc_array@Base 0.7.0
+ mowgli_alloc_array_using_policy@Base 2.0.0
+ mowgli_alloc_using_policy@Base 2.0.0
+ mowgli_allocation_policy_bootstrap@Base 2.0.0
mowgli_allocation_policy_create@Base 0.7.0
- mowgli_allocation_policy_init@Base 0.7.0
mowgli_allocation_policy_lookup@Base 0.7.0
- mowgli_allocator_init@Base 0.7.0
+ mowgli_allocator_bootstrap@Base 2.0.0
mowgli_allocator_malloc@Base 0.7.0
mowgli_allocator_set_policy@Base 0.7.0
mowgli_allocator_set_policy_by_name@Base 0.7.0
+ mowgli_argstack_bootstrap@Base 2.0.0
mowgli_argstack_create@Base 0.7.0
mowgli_argstack_create_from_va_list@Base 0.7.0
- mowgli_argstack_init@Base 0.7.0
mowgli_argstack_pop_boolean@Base 0.7.0
mowgli_argstack_pop_numeric@Base 0.7.0
mowgli_argstack_pop_pointer@Base 0.7.0
mowgli_argstack_pop_string@Base 0.7.0
+ mowgli_bitvector_bootstrap@Base 2.0.0
mowgli_bitvector_combine@Base 0.7.0
mowgli_bitvector_compare@Base 0.7.0
mowgli_bitvector_create@Base 0.7.0
mowgli_bitvector_get@Base 0.7.0
- mowgli_bitvector_init@Base 0.7.0
mowgli_bitvector_set@Base 0.7.0
mowgli_bitvector_xor@Base 0.7.0
+ mowgli_config_file_free@Base 2.0.0
+ mowgli_config_file_load@Base 2.0.0
mowgli_dictionary_add@Base 0.7.0
mowgli_dictionary_create@Base 0.7.0
mowgli_dictionary_create_named@Base 0.7.0
@@ -42,31 +52,71 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_dictionary_size@Base 0.7.0
mowgli_dictionary_stats@Base 0.7.0
mowgli_dictionary_unlink_root@Base 0.7.0
+ mowgli_dns_create@Base 2.0.0
+ mowgli_dns_delete_query@Base 2.0.0
+ mowgli_dns_destroy@Base 2.0.0
+ mowgli_dns_dn_expand@Base 2.0.0
+ mowgli_dns_dn_skipname@Base 2.0.0
+ mowgli_dns_evloop_add_local_domain@Base 2.0.0
+ mowgli_dns_evloop_delete_queries@Base 2.0.0
+ mowgli_dns_evloop_destroy@Base 2.0.0
+ mowgli_dns_evloop_gethost_byaddr@Base 2.0.0
+ mowgli_dns_evloop_gethost_byname@Base 2.0.0
+ mowgli_dns_evloop_init@Base 2.0.0
+ mowgli_dns_evloop_resolver@Base 2.0.0
+ mowgli_dns_evloop_restart@Base 2.0.0
+ mowgli_dns_gethost_byaddr@Base 2.0.0
+ mowgli_dns_gethost_byname@Base 2.0.0
+ mowgli_dns_init@Base 2.0.0
+ mowgli_dns_ns_get16@Base 2.0.0
+ mowgli_dns_ns_get32@Base 2.0.0
+ mowgli_dns_ns_put16@Base 2.0.0
+ mowgli_dns_ns_put32@Base 2.0.0
+ mowgli_dns_res_mkquery@Base 2.0.0
+ mowgli_dns_restart@Base 2.0.0
mowgli_error_context_create@Base 0.7.0
mowgli_error_context_destroy@Base 0.7.0
mowgli_error_context_display@Base 0.7.0
mowgli_error_context_display_with_error@Base 0.7.0
mowgli_error_context_pop@Base 0.7.0
mowgli_error_context_push@Base 0.7.0
+ mowgli_eventloop_break@Base 2.0.0
+ mowgli_eventloop_create@Base 2.0.0
+ mowgli_eventloop_destroy@Base 2.0.0
+ mowgli_eventloop_get_data@Base 2.0.0
+ mowgli_eventloop_next_timer@Base 2.0.0
+ mowgli_eventloop_run@Base 2.0.0
+ mowgli_eventloop_run_once@Base 2.0.0
+ mowgli_eventloop_run_timers@Base 2.0.0
+ mowgli_eventloop_set_data@Base 2.0.0
+ mowgli_eventloop_timeout_once@Base 2.0.0
+ mowgli_eventloop_timers_only@Base 2.0.0
mowgli_fnv_hash@Base 0.7.0
mowgli_fnv_hash_string@Base 0.7.0
mowgli_formatter_format@Base 0.7.0
mowgli_formatter_format_from_argstack@Base 0.7.0
mowgli_formatter_print@Base 0.7.0
mowgli_free@Base 0.7.0
+ mowgli_getopt@Base 2.0.0
+ mowgli_getopt_long@Base 2.0.0
+ mowgli_global_storage_bootstrap@Base 2.0.0
mowgli_global_storage_free@Base 0.7.0
mowgli_global_storage_get@Base 0.7.0
- mowgli_global_storage_init@Base 0.7.0
mowgli_global_storage_put@Base 0.7.0
mowgli_heap_alloc@Base 0.7.0
mowgli_heap_create@Base 0.7.0
mowgli_heap_create_full@Base 0.7.0
mowgli_heap_destroy@Base 0.7.0
mowgli_heap_free@Base 0.7.0
+ mowgli_helper_create@Base 2.0.0
+ mowgli_helper_destroy@Base 2.0.0
+ mowgli_helper_set_read_cb@Base 2.0.0
+ mowgli_helper_setup@Base 2.0.0
+ mowgli_helper_spawn@Base 2.0.0
mowgli_hook_associate@Base 0.7.0
+ mowgli_hook_bootstrap@Base 2.0.0
mowgli_hook_call@Base 0.7.0
mowgli_hook_dissociate@Base 0.7.0
- mowgli_hook_init@Base 0.7.0
mowgli_hook_register@Base 0.7.0
mowgli_index_allocate@Base 1.0.0
mowgli_index_append@Base 1.0.0
@@ -86,11 +136,12 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_index_set@Base 1.0.0
mowgli_index_sort@Base 1.0.0
mowgli_init@Base 0.7.0
- mowgli_ioevent_associate@Base 0.7.0
- mowgli_ioevent_create@Base 0.7.0
- mowgli_ioevent_destroy@Base 0.7.0
- mowgli_ioevent_dissociate@Base 0.7.0
- mowgli_ioevent_get@Base 0.7.0
+ mowgli_linebuf_attach_to_eventloop@Base 2.0.0
+ mowgli_linebuf_create@Base 2.0.0
+ mowgli_linebuf_destroy@Base 2.0.0
+ mowgli_linebuf_setbuflen@Base 2.0.0
+ mowgli_linebuf_write@Base 2.0.0
+ mowgli_linebuf_writef@Base 2.0.0
mowgli_list_concat@Base 0.7.0
mowgli_list_create@Base 0.7.0
mowgli_list_free@Base 0.7.0
@@ -99,28 +150,29 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_log_cb_default@Base 0.7.0
mowgli_log_real@Base 0.7.0
mowgli_log_set_cb@Base 0.7.0
- mowgli_mempool_add@Base 0.7.0
- mowgli_mempool_allocate@Base 0.7.0
- mowgli_mempool_cleanup@Base 0.7.0
- mowgli_mempool_create@Base 0.7.0
- mowgli_mempool_destroy@Base 0.7.0
- mowgli_mempool_release@Base 0.7.0
- mowgli_mempool_strdup@Base 0.7.0
- mowgli_mempool_sustain@Base 0.7.0
- mowgli_mempool_with_custom_destructor@Base 0.7.0
+ mowgli_memslice_bootstrap@Base 2.0.0
+ mowgli_memslice_get_policy@Base 2.0.0
mowgli_module_close@Base 0.7.0
mowgli_module_open@Base 0.7.0
mowgli_module_symbol@Base 0.7.0
+ mowgli_mutex_create@Base 2.0.0
+ mowgli_mutex_destroy@Base 2.0.0
+ mowgli_mutex_init@Base 2.0.0
+ mowgli_mutex_lock@Base 2.0.0
+ mowgli_mutex_set_policy@Base 2.0.0
+ mowgli_mutex_trylock@Base 2.0.0
+ mowgli_mutex_uninit@Base 2.0.0
+ mowgli_mutex_unlock@Base 2.0.0
mowgli_node_add@Base 0.7.0
mowgli_node_add_after@Base 0.7.0
mowgli_node_add_before@Base 0.7.0
mowgli_node_add_head@Base 0.7.0
+ mowgli_node_bootstrap@Base 2.0.0
mowgli_node_create@Base 0.7.0
mowgli_node_delete@Base 0.7.0
mowgli_node_find@Base 0.7.0
mowgli_node_free@Base 0.7.0
mowgli_node_index@Base 0.7.0
- mowgli_node_init@Base 0.7.0
mowgli_node_insert@Base 0.7.0
mowgli_node_move@Base 0.7.0
mowgli_node_nth@Base 0.7.0
@@ -143,6 +195,11 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_object_metadata_retrieve@Base 0.7.0
mowgli_object_ref@Base 0.7.0
mowgli_object_unref@Base 0.7.0
+ mowgli_optarg@Base 2.0.0
+ mowgli_opterr@Base 2.0.0
+ mowgli_optind@Base 2.0.0
+ mowgli_optopt@Base 2.0.0
+ mowgli_optreset@Base 2.0.0
mowgli_patricia_add@Base 0.7.0
mowgli_patricia_create@Base 0.7.0
mowgli_patricia_create_named@Base 0.7.0
@@ -160,12 +217,27 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_patricia_foreach_start@Base 0.7.0
mowgli_patricia_retrieve@Base 0.7.0
mowgli_patricia_search@Base 0.7.0
+ mowgli_patricia_shutdown@Base 2.0.0
mowgli_patricia_size@Base 0.7.0
mowgli_patricia_stats@Base 0.7.0
+ mowgli_pollable_create@Base 2.0.0
+ mowgli_pollable_destroy@Base 2.0.0
+ mowgli_pollable_set_nonblocking@Base 2.0.0
+ mowgli_pollable_setselect@Base 2.0.0
+ mowgli_process_clone@Base 2.0.0
+ mowgli_process_kill@Base 2.0.0
+ mowgli_process_spawn@Base 2.0.0
+ mowgli_proctitle_get@Base 2.0.0
+ mowgli_proctitle_init@Base 2.0.0
+ mowgli_proctitle_set@Base 2.0.0
+ mowgli_program_opts_consumer_bool@Base 2.0.0
+ mowgli_program_opts_consumer_int@Base 2.0.0
+ mowgli_program_opts_consumer_str@Base 2.0.0
+ mowgli_program_opts_parse@Base 2.0.0
+ mowgli_queue_bootstrap@Base 2.0.0
mowgli_queue_destroy@Base 0.7.0
mowgli_queue_find@Base 0.7.0
mowgli_queue_head@Base 0.7.0
- mowgli_queue_init@Base 0.7.0
mowgli_queue_length@Base 0.7.0
mowgli_queue_pop_head@Base 0.7.0
mowgli_queue_pop_tail@Base 0.7.0
@@ -176,19 +248,19 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_queue_shift@Base 0.7.0
mowgli_queue_skip@Base 0.7.0
mowgli_queue_tail@Base 0.7.0
+ mowgli_random_bootstrap@Base 2.0.0
mowgli_random_create@Base 0.7.0
mowgli_random_create_with_seed@Base 0.7.0
- mowgli_random_init@Base 0.7.0
mowgli_random_int@Base 0.7.0
mowgli_random_int_ranged@Base 0.7.0
mowgli_random_reseed@Base 0.7.0
mowgli_signal_install_handler@Base 0.7.0
+ mowgli_simple_eventloop_error_handler@Base 2.0.0
+ mowgli_simple_eventloop_run_once@Base 2.0.0
+ mowgli_simple_eventloop_timeout_once@Base 2.0.0
mowgli_soft_assert_log@Base 1.0.0
- mowgli_spinlock_create@Base 0.7.0
- mowgli_spinlock_lock@Base 0.7.0
- mowgli_spinlock_timed_wait@Base 0.7.0
- mowgli_spinlock_unlock@Base 0.7.0
- mowgli_spinlock_wait@Base 0.7.0
+ mowgli_strdup@Base 2.0.0
+ mowgli_strdup_using_policy@Base 2.0.0
mowgli_string_append@Base 0.7.0
mowgli_string_append_char@Base 0.7.0
mowgli_string_create@Base 0.7.0
@@ -196,3 +268,35 @@ libmowgli.so.2 libmowgli2 #MINVER#
mowgli_string_reset@Base 0.7.0
mowgli_strlcat@Base 1.0.0
mowgli_strlcpy@Base 1.0.0
+ mowgli_timer_add@Base 2.0.0
+ mowgli_timer_add_once@Base 2.0.0
+ mowgli_timer_destroy@Base 2.0.0
+ mowgli_timer_find@Base 2.0.0
+ mowgli_vio_create@Base 2.0.0
+ mowgli_vio_default_accept@Base 2.0.0
+ mowgli_vio_default_bind@Base 2.0.0
+ mowgli_vio_default_close@Base 2.0.0
+ mowgli_vio_default_connect@Base 2.0.0
+ mowgli_vio_default_error@Base 2.0.0
+ mowgli_vio_default_listen@Base 2.0.0
+ mowgli_vio_default_ops@Base 2.0.0
+ mowgli_vio_default_read@Base 2.0.0
+ mowgli_vio_default_recvfrom@Base 2.0.0
+ mowgli_vio_default_seek@Base 2.0.0
+ mowgli_vio_default_sendto@Base 2.0.0
+ mowgli_vio_default_socket@Base 2.0.0
+ mowgli_vio_default_tell@Base 2.0.0
+ mowgli_vio_default_write@Base 2.0.0
+ mowgli_vio_destroy@Base 2.0.0
+ mowgli_vio_err_errcode@Base 2.0.0
+ mowgli_vio_err_sslerrcode@Base 2.0.0
+ mowgli_vio_eventloop_attach@Base 2.0.0
+ mowgli_vio_eventloop_detach@Base 2.0.0
+ mowgli_vio_init@Base 2.0.0
+ mowgli_vio_openssl_getsslcontext@Base 2.0.0
+ mowgli_vio_openssl_getsslhandle@Base 2.0.0
+ mowgli_vio_openssl_setssl@Base 2.0.0
+ mowgli_vio_sockaddr_create@Base 2.0.0
+ mowgli_vio_sockaddr_from_struct@Base 2.0.0
+ mowgli_vio_sockaddr_info@Base 2.0.0
+ mowgli_writef@Base 2.0.0
diff --git a/debian/libmowgli-dev.docs b/debian/libmowgli-2-dev.docs
index da6ffa7..da6ffa7 100644
--- a/debian/libmowgli-dev.docs
+++ b/debian/libmowgli-2-dev.docs
diff --git a/debian/libmowgli-dev.examples b/debian/libmowgli-2-dev.examples
index b28d08f..b28d08f 100644
--- a/debian/libmowgli-dev.examples
+++ b/debian/libmowgli-2-dev.examples
diff --git a/debian/libmowgli-dev.install b/debian/libmowgli-2-dev.install
index 7df81cd..7df81cd 100644
--- a/debian/libmowgli-dev.install
+++ b/debian/libmowgli-2-dev.install
diff --git a/debian/rules b/debian/rules
index a13f709..224fcea 100755
--- a/debian/rules
+++ b/debian/rules
@@ -22,8 +22,8 @@ endif
override_dh_auto_install:
dh_auto_install
- mkdir -p debian/libmowgli2/usr/include/$(DEB_HOST_MULTIARCH)/libmowgli
- mv -f debian/tmp/usr/include/libmowgli/mowgli_config.h debian/libmowgli2/usr/include/$(DEB_HOST_MULTIARCH)/libmowgli/mowgli_config.h
+ mkdir -p debian/libmowgli-2-0/usr/include/$(DEB_HOST_MULTIARCH)/libmowgli
+ # mv -f debian/tmp/usr/include/libmowgli-2/mowgli_config.h debian/libmowgli-2-0/usr/include/$(DEB_HOST_MULTIARCH)/libmowgli/mowgli_config.h
override_dh_installexamples:
sed -e 's,\(libdir = \$${prefix}/lib\)/.*$$,\1,' \
@@ -34,10 +34,10 @@ override_dh_installexamples:
dh_installexamples -X.dep
override_dh_compress:
- dh_compress -Xusr/share/doc/libmowgli-dev/examples
+ dh_compress -Xusr/share/doc/libmowgli-2-dev/examples
override_dh_strip:
- dh_strip --dbg-package=libmowgli2-dbg
+ dh_strip --dbg-package=libmowgli-2-0-dbg
override_dh_auto_clean:
[ ! -f buildsys.mk ] || dh_auto_clean
diff --git a/doc/BOOST b/doc/BOOST
index f8be13b..e9569fd 100644
--- a/doc/BOOST
+++ b/doc/BOOST
@@ -4,6 +4,7 @@ equivilant in Mowgli:
dynamic_bitset -> mowgli_bitvector
pool -> mowgli_memorypool
smart_ptr -> mowgli_object
+ asio -> mowgli_eventloop, mowgli_vio
Many boost libraries that are applicable to C have not yet been
implemented. You can visit http://www.boost.org/libs/libraries.htm
diff --git a/doc/design-concepts.txt b/doc/design-concepts.txt
new file mode 100644
index 0000000..5d596bd
--- /dev/null
+++ b/doc/design-concepts.txt
@@ -0,0 +1,116 @@
+Design concepts for Mowgli
+--------------------------
+
+1. Object orientation
+
+First and foremost, Mowgli is a base development framework that you can build
+higher level development frameworks ontop of. To facilitate this in a way that
+most people can understand, we use a somewhat LISP-like form of OO.
+
+What does this mean?
+
+In LISP, it is common for objects to be made up of smaller, more primitive
+objects that help to facilitate the implementation of the object. What this
+means is that, for example, we have mowgli_heap_t (which is a private object):
+
+ struct mowgli_heap_
+ {
+ unsigned int elem_size;
+ unsigned int mowgli_heap_elems;
+ unsigned int free_elems;
+
+ unsigned int alloc_size;
+
+ unsigned int flags;
+
+ mowgli_list_t blocks; /* list of non-empty blocks */
+
+ mowgli_allocation_policy_t *allocator;
+ mowgli_boolean_t use_mmap;
+
+ mowgli_mutex_t mutex;
+
+ mowgli_block_t *empty_block; /* a single entirely free block,
+ * or NULL */
+ };
+
+This is an object which keeps state. It also depends on other objects, such as
+allocation policies and lists. There is a need for a destructor, it has member
+objects which have destructors, etc.
+
+C allows you to make a pointer out of anything -- block-level variables, for
+example can be "dereferenced" using the & operator. This means that if the heap
+above did not require initialization, you could just write something like:
+
+ {
+ mowgli_heap_t heap;
+ void *ptr;
+
+ ptr = mowgli_heap_alloc(&heap);
+ mowgli_heap_free(&heap, ptr);
+ }
+
+However, we have a need to initialize this object, so we provide a constructor
+for it, mowgli_heap_create(). We also need to tear down the object
+specifically, so we provide mowgli_heap_destroy().
+
+While it is easy to provide a separate initializer function, we feel this would
+be a bad idea for objects which keep state, because odds are likely the
+destructor would not be called. There is also a stack memory limit -- which is
+very small on embedded systems, where Mowgli is intended to be used.
+
+There is also the possibility that the library may depend on the reference
+remaining past the time it was used, such as an internal dependency (caching,
+for example). So we want to enforce that a destructor is called when needed, or
+at least make sure we don't crash because the object is no longer on the stack.
+
+[Yes, I know you can put objects in BSS by making them 'static.' There is
+limited space for BSS on many systems, so putting 100MB worth of objects there
+is kind of insane and makes your program not look so great either.]
+
+2. Threads are evil.
+
+"The one-sentence answer is that humans are not smart enough to write
+ thread-safe code."
+ -- Rasmus Lerdorf, inventor of PHP
+
+While PHP itself is a disaster of a programming language (for reasons I am not
+going to go into here), Rasmus Lerdorf is entirely correct in the above quote.
+While Mowgli is itself thread-safe, we do not recommend using threads as they
+promote inferior design patterns. There are better, safer ways to achieve
+concurrency using helpers and work queues with message-passing.
+
+Mowgli's thread library implements a subset of a thread library. Specifically,
+it implements the fastest possible mutex implementation, and global critical
+sections ala a global lock. It does not implement anything else other than
+that, except for maybe abstraction of TLS data in the future. But that TLS
+support would just be to further advance Mowgli's thread-safety so that it is
+more performant.
+
+Threads are a gigantic hack. Depending on what you want, there is usually
+something better for any pattern which involves threads:
+
+Pattern: Threads which do work and then sleep for a long time.
+
+Answer: Use mowgli_timer_add() on an eventloop object. This allows you to
+queue deferred work as a first-class citizen of your app's eventloop.
+
+Pattern: Multiple worker threads for I/O.
+
+Answer: Using concurrency in an I/O bound app is entirely pointless, but you
+can pass FDs to a helper using IPC. Pass the FD and then pass instructions on
+what to do with it.
+
+Pattern: Work that needs to be done concurrently.
+
+Answer: Helpers with message-passing and specific regions of memory shared
+between helpers, ala mmap() or VirtualAlloc().
+
+Pattern: Work that needs to be done cooperatively.
+
+Answer: Producer-consumer models can be implemented as first-class citizens
+using the eventloop using pipes as a synchronization primitive. Alternatively,
+use a coroutine library, such as the work-in-progress mowgli.coroutine.
+
+Pretty much anything you can do with threads, you can do better with something,
+*anything* else.
diff --git a/extra.mk.in b/extra.mk.in
index 105e42d..f759edd 100644
--- a/extra.mk.in
+++ b/extra.mk.in
@@ -1,2 +1,10 @@
+LIBMOWGLI_SHARED_LIB = @LIBMOWGLI_SHARED_LIB@
+LIBMOWGLI_STATIC_LIB = @LIBMOWGLI_STATIC_LIB@
+LIBMOWGLI_MODULES = @LIBMOWGLI_MODULES@
+LIBMOWGLI_SHARED_MODULES = @LIBMOWGLI_SHARED_MODULES@
+LIBMOWGLI_STATIC_MODULES = @LIBMOWGLI_STATIC_MODULES@
+LIBMOWGLI_OS = @LIBMOWGLI_OS@
+
EXAMPLES_BUILD = @EXAMPLES_BUILD@
-MOWGLI_MODULE = @MOWGLI_MODULE@
+
+LIBMOWGLI_MODULE_BUILD = @LIBMOWGLI_MODULE_BUILD@
diff --git a/install-sh b/install-sh
index 4d4a951..a9244eb 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2005-05-14.22
+scriptversion=2011-01-19.21; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -39,38 +39,68 @@ scriptversion=2005-05-14.22
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
-# from scratch. It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# from scratch.
+
+nl='
+'
+IFS=" "" $nl"
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
-# put in absolute paths if you don't have them in your path; or use env. vars.
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
-chmodcmd="$chmodprog 0755"
-chowncmd=
chgrpcmd=
-stripcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
rmcmd="$rmprog -f"
-mvcmd="$mvprog"
+stripcmd=
+
src=
dst=
dir_arg=
-dstarg=
+dst_arg=
+
+copy_on_change=false
no_target_directory=
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
or: $0 [OPTION]... SRCFILES... DIRECTORY
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
or: $0 [OPTION]... -d DIRECTORIES...
@@ -80,81 +110,94 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
In the 4th, create DIRECTORIES.
Options:
--c (ignored)
--d create directories instead of installing files.
--g GROUP $chgrpprog installed files to GROUP.
--m MODE $chmodprog installed files to MODE.
--o USER $chownprog installed files to USER.
--s $stripprog installed files.
--t DIRECTORY install into DIRECTORY.
--T report an error if DSTFILE is a directory.
---help display this help and exit.
---version display version info and exit.
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
"
-while test -n "$1"; do
+while test $# -ne 0; do
case $1 in
- -c) shift
- continue;;
+ -c) ;;
+
+ -C) copy_on_change=true;;
- -d) dir_arg=true
- shift
- continue;;
+ -d) dir_arg=true;;
-g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
+ shift;;
--help) echo "$usage"; exit $?;;
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
-o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
+ shift;;
- -s) stripcmd=$stripprog
- shift
- continue;;
+ -s) stripcmd=$stripprog;;
- -t) dstarg=$2
- shift
- shift
- continue;;
+ -t) dst_arg=$2
+ # Protect names problematic for `test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
- -T) no_target_directory=true
- shift
- continue;;
+ -T) no_target_directory=true;;
--version) echo "$0 $scriptversion"; exit $?;;
- *) # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- test -n "$dir_arg$dstarg" && break
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dstarg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dstarg"
- shift # fnord
- fi
- shift # arg
- dstarg=$arg
- done
+ --) shift
break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
esac
+ shift
done
-if test -z "$1"; then
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for `test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
if test -z "$dir_arg"; then
echo "$0: no input file specified." >&2
exit 1
@@ -164,24 +207,51 @@ if test -z "$1"; then
exit 0
fi
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
for src
do
- # Protect names starting with `-'.
+ # Protect names problematic for `test' and other utilities.
case $src in
- -*) src=./$src ;;
+ -* | [=\(\)!]) src=./$src;;
esac
if test -n "$dir_arg"; then
dst=$src
- src=
-
- if test -d "$dst"; then
- mkdircmd=:
- chmodcmd=
- else
- mkdircmd=$mkdirprog
- fi
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
else
+
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
@@ -190,71 +260,194 @@ do
exit 1
fi
- if test -z "$dstarg"; then
+ if test -z "$dst_arg"; then
echo "$0: no destination specified." >&2
exit 1
fi
-
- dst=$dstarg
- # Protect names starting with `-'.
- case $dst in
- -*) dst=./$dst ;;
- esac
+ dst=$dst_arg
# If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored.
if test -d "$dst"; then
if test -n "$no_target_directory"; then
- echo "$0: $dstarg: Is a directory" >&2
+ echo "$0: $dst_arg: Is a directory" >&2
exit 1
fi
- dst=$dst/`basename "$src"`
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
fi
fi
- # This sed command emulates the dirname command.
- dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
- # Make sure that the destination directory exists.
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
- # Skip lots of stat calls in the usual case.
- if test ! -d "$dstdir"; then
- defaultIFS='
- '
- IFS="${IFS-$defaultIFS}"
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
- oIFS=$IFS
- # Some sh's can't handle IFS=/ for some reason.
- IFS='%'
- set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
- shift
- IFS=$oIFS
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
- pathcomp=
+ eval "$initialize_posix_glob"
- while test $# -ne 0 ; do
- pathcomp=$pathcomp$1
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
shift
- if test ! -d "$pathcomp"; then
- $mkdirprog "$pathcomp"
- # mkdir can fail with a `File exist' error in case several
- # install-sh are creating the directory concurrently. This
- # is OK.
- test -d "$pathcomp" || exit
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
fi
- pathcomp=$pathcomp/
- done
+ fi
fi
if test -n "$dir_arg"; then
- $doit $mkdircmd "$dst" \
- && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
- && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
- && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
- && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
-
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
else
- dstfile=`basename "$dst"`
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_
@@ -262,10 +455,9 @@ do
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
- trap '(exit $?); exit' 1 2 13 15
# Copy the file name to the temp name.
- $doit $cpprog "$src" "$dsttmp" &&
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
# and set any options; do chmod last to preserve setuid bits.
#
@@ -273,51 +465,63 @@ do
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $cpprog $src $dsttmp" command.
#
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
- && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
- && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
- && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
-
- # Now rename the file to the real destination.
- { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
- || {
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
-
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- if test -f "$dstdir/$dstfile"; then
- $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
- || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
- || {
- echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
- (exit 1); exit 1
- }
- else
- :
- fi
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
- }
- }
- fi || { (exit 1); exit 1; }
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
done
-# The final little trick to "correctly" pass the exit status to the exit trap.
-{
- (exit 0); exit 0
-}
-
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff --git a/libmowgli.pc.in b/libmowgli-2.pc.in
index d31f1cc..23356d7 100644
--- a/libmowgli.pc.in
+++ b/libmowgli-2.pc.in
@@ -4,12 +4,12 @@ datarootdir=@datarootdir@
data_dir=@datadir@/@PACKAGE_NAME@
version=@PACKAGE_VERSION@
-include_dir=@includedir@/libmowgli
+include_dir=@includedir@/@PACKAGE_NAME@
lib_dir=@libdir@
-Name: libmowgli
+Name: libmowgli-2
Description: A library which contains many utility functions and classes.
Version: @PACKAGE_VERSION@
-Libs: -L${lib_dir} -lmowgli
+Libs: -L${lib_dir} -lmowgli-2
Cflags: -I${include_dir}
diff --git a/m4/acx_pthread.m4 b/m4/acx_pthread.m4
new file mode 100644
index 0000000..34b9a2d
--- /dev/null
+++ b/m4/acx_pthread.m4
@@ -0,0 +1,258 @@
+# ===========================================================================
+# http://autoconf-archive.cryp.to/acx_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# This macro figures out how to build C programs using POSIX threads. It
+# sets the PTHREAD_LIBS output variable to the threads library and linker
+# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+# flags that are needed. (The user can also force certain compiler
+# flags/libs to be tested by setting these environment variables.)
+#
+# NOTE: You are assumed to not only compile your program with these flags,
+# but also link it with them as well. e.g. you should link with
+# $CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+# If you are only building threads programs, you may wish to use these
+# variables in your default LIBS and CFLAGS:
+#
+# LIBS="$PTHREAD_LIBS $LIBS"
+# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+#
+# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
+# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+# ACTION-IF-FOUND is a list of shell commands to run if a threads library
+# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+# is not found. If ACTION-IF-FOUND is not specified, the default action
+# will define HAVE_PTHREAD.
+#
+# Please let the authors know if this macro fails on any platform, or if
+# you have any other suggestions or comments. This macro was based on work
+# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+# Alejandro Forero Cuervo to the autoconf macro repository. We are also
+# grateful for the helpful feedback of numerous users.
+#
+# LAST MODIFICATION
+#
+# 2008-04-12
+#
+# COPYLEFT
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Macro Archive. When you make and
+# distribute a modified version of the Autoconf Macro, you may extend this
+# special exception to the GPL to apply to your modified version as well.
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+ AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+ AC_MSG_RESULT($acx_pthread_ok)
+ if test x"$acx_pthread_ok" = xno; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads too;
+# also defines -D_REENTRANT)
+# ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+ *solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+
+ acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+ ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+ case $flag in
+ none)
+ AC_MSG_CHECKING([whether pthreads work without any flags])
+ ;;
+
+ -*)
+ AC_MSG_CHECKING([whether pthreads work with $flag])
+ PTHREAD_CFLAGS="$flag"
+ PTHREAD_LIBS="$flag"
+ ;;
+
+ pthread-config)
+ AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+ if test x"$acx_pthread_config" = xno; then continue; fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ AC_MSG_CHECKING([for the pthreads library -l$flag])
+ PTHREAD_LIBS="-l$flag"
+ ;;
+ esac
+
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_t th; pthread_join(th, 0);
+ pthread_attr_init(0); pthread_cleanup_push(0, 0);
+ pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+ [acx_pthread_ok=yes])
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ AC_MSG_RESULT($acx_pthread_ok)
+ if test "x$acx_pthread_ok" = xyes; then
+ break;
+ fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ AC_MSG_CHECKING([for joinable pthread attribute])
+ attr_name=unknown
+ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
+ [attr_name=$attr; break])
+ done
+ AC_MSG_RESULT($attr_name)
+ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+ AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ fi
+
+ AC_MSG_CHECKING([if more special flags are required for pthreads])
+ flag=no
+ case "${host_cpu}-${host_os}" in
+ *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+ *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+ esac
+ AC_MSG_RESULT(${flag})
+ if test "x$flag" != xno; then
+ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+ fi
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+ ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+ :
+else
+ acx_pthread_ok=no
+ $2
+fi
+])
diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4
new file mode 100644
index 0000000..a87c5a6
--- /dev/null
+++ b/m4/ax_check_openssl.m4
@@ -0,0 +1,124 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_check_openssl.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CHECK_OPENSSL([action-if-found[, action-if-not-found]])
+#
+# DESCRIPTION
+#
+# Look for OpenSSL in a number of default spots, or in a user-selected
+# spot (via --with-openssl). Sets
+#
+# OPENSSL_INCLUDES to the include directives required
+# OPENSSL_LIBS to the -l directives required
+# OPENSSL_LDFLAGS to the -L or -R flags required
+#
+# and calls ACTION-IF-FOUND or ACTION-IF-NOT-FOUND appropriately
+#
+# This macro sets OPENSSL_INCLUDES such that source files should use the
+# openssl/ directory in include directives:
+#
+# #include <openssl/hmac.h>
+#
+# LICENSE
+#
+# Copyright (c) 2009,2010 Zmanda Inc. <http://www.zmanda.com/>
+# Copyright (c) 2009,2010 Dustin J. Mitchell <dustin@zmanda.com>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 8
+
+AU_ALIAS([CHECK_SSL], [AX_CHECK_OPENSSL])
+AC_DEFUN([AX_CHECK_OPENSSL], [
+ found=false
+ AC_ARG_WITH([openssl],
+ [AS_HELP_STRING([--with-openssl=DIR],
+ [root of the OpenSSL directory])],
+ [
+ case "$withval" in
+ "" | y | ye | yes | n | no)
+ AC_MSG_ERROR([Invalid --with-openssl value])
+ ;;
+ *) ssldirs="$withval"
+ ;;
+ esac
+ ], [
+ # if pkg-config is installed and openssl has installed a .pc file,
+ # then use that information and don't search ssldirs
+ AC_PATH_PROG([PKG_CONFIG], [pkg-config])
+ if test x"$PKG_CONFIG" != x""; then
+ OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null`
+ if test $? = 0; then
+ OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null`
+ OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null`
+ found=true
+ fi
+ fi
+
+ # no such luck; use some default ssldirs
+ if ! $found; then
+ ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr"
+ fi
+ ]
+ )
+
+
+ # note that we #include <openssl/foo.h>, so the OpenSSL headers have to be in
+ # an 'openssl' subdirectory
+
+ if ! $found; then
+ OPENSSL_INCLUDES=
+ for ssldir in $ssldirs; do
+ AC_MSG_CHECKING([for openssl/ssl.h in $ssldir])
+ if test -f "$ssldir/include/openssl/ssl.h"; then
+ OPENSSL_INCLUDES="-I$ssldir/include"
+ OPENSSL_LDFLAGS="-L$ssldir/lib"
+ OPENSSL_LIBS="-lssl -lcrypto"
+ found=true
+ AC_MSG_RESULT([yes])
+ break
+ else
+ AC_MSG_RESULT([no])
+ fi
+ done
+
+ # if the file wasn't found, well, go ahead and try the link anyway -- maybe
+ # it will just work!
+ fi
+
+ # try the preprocessor and linker with our new flags,
+ # being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS
+
+ AC_MSG_CHECKING([whether compiling and linking against OpenSSL works])
+ echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \
+ "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&AS_MESSAGE_LOG_FD
+
+ save_LIBS="$LIBS"
+ save_LDFLAGS="$LDFLAGS"
+ save_CPPFLAGS="$CPPFLAGS"
+ LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
+ LIBS="$OPENSSL_LIBS $LIBS"
+ CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([#include <openssl/ssl.h>], [SSL_new(NULL)])],
+ [
+ AC_MSG_RESULT([yes])
+ $1
+ ], [
+ AC_MSG_RESULT([no])
+ $2
+ ])
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+
+ AC_SUBST([OPENSSL_INCLUDES])
+ AC_SUBST([OPENSSL_LIBS])
+ AC_SUBST([OPENSSL_LDFLAGS])
+])
diff --git a/m4/buildsys.m4 b/m4/buildsys.m4
index bb5a955..43cebeb 100644
--- a/m4/buildsys.m4
+++ b/m4/buildsys.m4
@@ -1,7 +1,8 @@
dnl
-dnl Copyright (c) 2007 - 2009, Jonathan Schleifer <js@webkeks.org>
+dnl Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012
+dnl Jonathan Schleifer <js@webkeks.org>
dnl
-dnl https://webkeks.org/hg/buildsys/
+dnl https://webkeks.org/git/?p=buildsys.git
dnl
dnl Permission to use, copy, modify, and/or distribute this software for any
dnl purpose with or without fee is hereby granted, provided that the above
@@ -20,13 +21,51 @@ dnl ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
dnl POSSIBILITY OF SUCH DAMAGE.
dnl
-AC_DEFUN([BUILDSYS_LIB], [
- AC_ARG_ENABLE(shared,
- AS_HELP_STRING([--disable-shared], [don't build shared libraries]))
+AC_DEFUN([BUILDSYS_INIT], [
+ AC_PATH_PROG(TPUT, tput)
- AS_IF([test x"$enable_shared" = x"no"],
- [BUILDSYS_STATIC_LIB_ONLY],
- [BUILDSYS_SHARED_LIB])
+ AS_IF([test x"$TPUT" != x""], [
+ if x=$($TPUT el 2>/dev/null); then
+ AC_SUBST(TERM_EL, "$x")
+ else
+ AC_SUBST(TERM_EL, "$($TPUT ce 2>/dev/null)")
+ fi
+
+ if x=$($TPUT sgr0 2>/dev/null); then
+ AC_SUBST(TERM_SGR0, "$x")
+ else
+ AC_SUBST(TERM_SGR0, "$($TPUT me 2>/dev/null)")
+ fi
+
+ if x=$($TPUT bold 2>/dev/null); then
+ AC_SUBST(TERM_BOLD, "$x")
+ else
+ AC_SUBST(TERM_BOLD, "$($TPUT md 2>/dev/null)")
+ fi
+
+ if x=$($TPUT setaf 1 2>/dev/null); then
+ AC_SUBST(TERM_SETAF1, "$x")
+ AC_SUBST(TERM_SETAF2, "$($TPUT setaf 2 2>/dev/null)")
+ AC_SUBST(TERM_SETAF3, "$($TPUT setaf 3 2>/dev/null)")
+ AC_SUBST(TERM_SETAF4, "$($TPUT setaf 4 2>/dev/null)")
+ AC_SUBST(TERM_SETAF6, "$($TPUT setaf 6 2>/dev/null)")
+ else
+ AC_SUBST(TERM_SETAF1, "$($TPUT AF 1 2>/dev/null)")
+ AC_SUBST(TERM_SETAF2, "$($TPUT AF 2 2>/dev/null)")
+ AC_SUBST(TERM_SETAF3, "$($TPUT AF 3 2>/dev/null)")
+ AC_SUBST(TERM_SETAF4, "$($TPUT AF 4 2>/dev/null)")
+ AC_SUBST(TERM_SETAF6, "$($TPUT AF 6 2>/dev/null)")
+ fi
+ ], [
+ AC_SUBST(TERM_EL, '\033\133K')
+ AC_SUBST(TERM_SGR0, '\033\133m')
+ AC_SUBST(TERM_BOLD, '\033\1331m')
+ AC_SUBST(TERM_SETAF1, '\033\13331m')
+ AC_SUBST(TERM_SETAF2, '\033\13332m')
+ AC_SUBST(TERM_SETAF3, '\033\13333m')
+ AC_SUBST(TERM_SETAF4, '\033\13334m')
+ AC_SUBST(TERM_SETAF6, '\033\13336m')
+ ])
])
AC_DEFUN([BUILDSYS_PROG_IMPLIB], [
@@ -55,93 +94,81 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
case "$host_os" in
darwin*)
AC_MSG_RESULT(Darwin)
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-dynamiclib -flat_namespace'
+ LIB_CFLAGS='-fPIC -DPIC'
+ LIB_LDFLAGS='-dynamiclib -current_version ${LIB_MAJOR}.${LIB_MINOR} -compatibility_version ${LIB_MAJOR} -install_name ${libdir}/$$(i=${SHARED_LIB}; echo $${i%.dylib}).${LIB_MAJOR}.dylib'
LIB_PREFIX='lib'
LIB_SUFFIX='.dylib'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-bundle -flat_namespace -undefined suppress'
- PLUGIN_SUFFIX='.impl'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
+ PLUGIN_CFLAGS='-fPIC -DPIC'
+ PLUGIN_LDFLAGS='-bundle -undefined dynamic_lookup'
+ PLUGIN_SUFFIX='.bundle'
+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib && ${LN_S} -f $${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib ${DESTDIR}${libdir}/$$i'
+ UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.dylib ${DESTDIR}${libdir}/$${i%.dylib}.${LIB_MAJOR}.${LIB_MINOR}.dylib'
CLEAN_LIB=''
;;
solaris*)
AC_MSG_RESULT(Solaris)
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-shared -fPIC -Wl,-soname=${LIB}.${LIB_MAJOR}.${LIB_MINOR}'
+ LIB_CFLAGS='-fPIC -DPIC'
+ LIB_LDFLAGS='-shared -Wl,-soname=${SHARED_LIB}.${LIB_MAJOR}.${LIB_MINOR}'
LIB_PREFIX='lib'
LIB_SUFFIX='.so'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-shared -fPIC'
+ PLUGIN_CFLAGS='-fPIC -DPIC'
+ PLUGIN_LDFLAGS='-shared'
PLUGIN_SUFFIX='.so'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR} && rm -f ${DESTDIR}${libdir}/$$i && ${LN_S} $$i.${LIB_MAJOR}.${LIB_MINOR} ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}'
+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR} && rm -f ${DESTDIR}${libdir}/$$i && ${LN_S} $$i.${LIB_MAJOR}.${LIB_MINOR} ${DESTDIR}${libdir}/$$i'
+ UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}'
CLEAN_LIB=''
;;
openbsd* | mirbsd*)
AC_MSG_RESULT(OpenBSD)
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-shared -fPIC'
+ LIB_CFLAGS='-fPIC -DPIC'
+ LIB_LDFLAGS='-shared'
LIB_PREFIX='lib'
LIB_SUFFIX='.so.${LIB_MAJOR}.${LIB_MINOR}'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-shared -fPIC'
+ PLUGIN_CFLAGS='-fPIC -DPIC'
+ PLUGIN_LDFLAGS='-shared'
PLUGIN_SUFFIX='.so'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i'
+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i'
+ UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i'
CLEAN_LIB=''
;;
cygwin* | mingw*)
AC_MSG_RESULT(Win32)
- LIB_CPPFLAGS='-DPIC'
LIB_CFLAGS=''
- LIB_LDFLAGS='-shared -Wl,--out-implib,${LIB}.a'
+ LIB_LDFLAGS='-shared -Wl,--out-implib,${SHARED_LIB}.a'
LIB_PREFIX='lib'
LIB_SUFFIX='.dll'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS=''
PLUGIN_CFLAGS=''
PLUGIN_LDFLAGS='-shared'
PLUGIN_SUFFIX='.dll'
- INSTALL_LIB='${MKDIR_P} ${DESTDIR}${bindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${bindir}/$$i && ${INSTALL} -m 755 $$i.a ${DESTDIR}${libdir}/$$i.a'
- UNINSTALL_LIB='rm -f ${DESTDIR}${bindir}/$$i ${DESTDIR}${libdir}/$$i.a'
- CLEAN_LIB='${LIB}.a'
+ INSTALL_LIB='&& ${MKDIR_P} ${DESTDIR}${bindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${bindir}/$$i && ${INSTALL} -m 755 $$i.a ${DESTDIR}${libdir}/$$i.a'
+ UNINSTALL_LIB='&& rm -f ${DESTDIR}${bindir}/$$i ${DESTDIR}${libdir}/$$i.a'
+ CLEAN_LIB='${SHARED_LIB}.a'
;;
*)
AC_MSG_RESULT(GNU)
- LIB_CPPFLAGS='-DPIC'
- LIB_CFLAGS='-fPIC'
- LIB_LDFLAGS='-shared -fPIC -Wl,-soname=${LIB}.${LIB_MAJOR}'
+ LIB_CFLAGS='-fPIC -DPIC'
+ LIB_LDFLAGS='-shared -Wl,-soname=${SHARED_LIB}.${LIB_MAJOR}'
LIB_PREFIX='lib'
LIB_SUFFIX='.so'
LDFLAGS_RPATH='-Wl,-rpath,${libdir}'
- PLUGIN_CPPFLAGS='-DPIC'
- PLUGIN_CFLAGS='-fPIC'
- PLUGIN_LDFLAGS='-shared -fPIC'
+ PLUGIN_CFLAGS='-fPIC -DPIC'
+ PLUGIN_LDFLAGS='-shared'
PLUGIN_SUFFIX='.so'
- INSTALL_LIB='${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0 && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0'
+ INSTALL_LIB='&& ${INSTALL} -m 755 $$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0 && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} && ${LN_S} -f $$i.${LIB_MAJOR}.${LIB_MINOR}.0 ${DESTDIR}${libdir}/$$i'
+ UNINSTALL_LIB='&& rm -f ${DESTDIR}${libdir}/$$i ${DESTDIR}${libdir}/$$i.${LIB_MAJOR} ${DESTDIR}${libdir}/$$i.${LIB_MAJOR}.${LIB_MINOR}.0'
CLEAN_LIB=''
;;
esac
- AC_SUBST(LIB_CPPFLAGS)
AC_SUBST(LIB_CFLAGS)
AC_SUBST(LIB_LDFLAGS)
AC_SUBST(LIB_PREFIX)
AC_SUBST(LIB_SUFFIX)
AC_SUBST(LDFLAGS_RPATH)
- AC_SUBST(PLUGIN_CPPFLAGS)
AC_SUBST(PLUGIN_CFLAGS)
AC_SUBST(PLUGIN_LDFLAGS)
AC_SUBST(PLUGIN_SUFFIX)
@@ -150,33 +177,8 @@ AC_DEFUN([BUILDSYS_SHARED_LIB], [
AC_SUBST(CLEAN_LIB)
])
-AC_DEFUN([BUILDSYS_STATIC_LIB_ONLY], [
- AC_REQUIRE([AC_PROG_RANLIB])
- AC_PATH_TOOL(AR, ar)
-
- LIB_CPPFLAGS=''
- LIB_CFLAGS=''
- LIB_LDFLAGS=''
- LIB_PREFIX='lib'
- LIB_SUFFIX='.a'
- LDFLAGS_RPATH=''
- INSTALL_LIB='${INSTALL} -m 644 $$i ${DESTDIR}${libdir}/$$i'
- UNINSTALL_LIB='rm -f ${DESTDIR}${libdir}/$$i'
- CLEAN_LIB=''
-
- AC_SUBST(LIB_CPPFLAGS)
- AC_SUBST(LIB_CFLAGS)
- AC_SUBST(LIB_LDFLAGS)
- AC_SUBST(LIB_PREFIX)
- AC_SUBST(LIB_SUFFIX)
- AC_SUBST(LDFLAGS_RPATH)
- AC_SUBST(INSTALL_LIB)
- AC_SUBST(UNINSTALL_LIB)
- AC_SUBST(CLEAN_LIB)
-])
-
AC_DEFUN([BUILDSYS_TOUCH_DEPS], [
- ${as_echo:="echo"} "${as_me:="configure"}: touching .deps files"
+ ${as_echo:="echo"} ${as_me:="configure"}": touching .deps files"
for i in $(find . -name Makefile); do
DEPSFILE="$(dirname $i)/.deps"
test -f "$DEPSFILE" && rm "$DEPSFILE"
diff --git a/scripts/makerelease.sh b/scripts/makerelease.sh
index 8ecf531..58f6039 100755
--- a/scripts/makerelease.sh
+++ b/scripts/makerelease.sh
@@ -92,8 +92,8 @@ if [ "x$AUTOMATIC" != "xyes" ]; then
fi
if [ "x$PUBLISH" = "xyes" ]; then
- scp $RELEASENAME.tar.gz distfiles.atheme.org:/var/www/distfiles.atheme.org/
- scp $RELEASENAME.tar.bz2 distfiles.atheme.org:/var/www/distfiles.atheme.org/
+ scp $RELEASENAME.tgz distfiles-master.atheme.org:/srv/distfiles
+ scp $RELEASENAME.tbz2 distfiles-master.atheme.org:/srv/distfiles
echo
echo "The releases have been published, and will be available to the entire"
diff --git a/src/examples/Makefile b/src/examples/Makefile
index d56d9ad..8512305 100644
--- a/src/examples/Makefile
+++ b/src/examples/Makefile
@@ -1,3 +1,3 @@
-SUBDIRS = randomtest listsort formattertest dicttest patriciatest patriciatest2
+SUBDIRS = echoserver vio-udplistener async_resolver formattertest helpertest libevent-bench linetest listsort memslice-bench patriciatest patriciatest2 randomtest timertest futuretest
include ../../buildsys.mk
diff --git a/src/examples/async_resolver/Makefile b/src/examples/async_resolver/Makefile
new file mode 100644
index 0000000..2c664bc
--- /dev/null
+++ b/src/examples/async_resolver/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = async_resolver${PROG_SUFFIX}
+SRCS = async_resolver.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/async_resolver/async_resolver.c b/src/examples/async_resolver/async_resolver.c
new file mode 100644
index 0000000..1a05236
--- /dev/null
+++ b/src/examples/async_resolver/async_resolver.c
@@ -0,0 +1,151 @@
+/* This code is in the public domain. */
+
+#include <mowgli.h>
+
+typedef struct
+{
+ char *domain;
+ mowgli_dns_query_t query;
+} dns_query;
+
+static void resolve_cb(mowgli_dns_reply_t *reply, int reason, void *vptr)
+{
+ char buf[2048];
+ dns_query *dnsquery = vptr;
+ const void *sockptr;
+
+ if (reply == NULL)
+ {
+ printf("Got null reply for %s\n", dnsquery->domain);
+ switch (reason)
+ {
+ case MOWGLI_DNS_RES_NXDOMAIN:
+ printf("Nonexistent domain\n");
+ break;
+ case MOWGLI_DNS_RES_INVALID:
+ printf("Invalid domain\n");
+ break;
+ case MOWGLI_DNS_RES_TIMEOUT:
+ printf("Timed out\n");
+ break;
+ }
+ goto end;
+ }
+
+ printf("Finished %s\n", dnsquery->domain);
+ printf("Hostname: %s\n", reply->h_name);
+
+ if (reply->addr.addr.ss_family == AF_INET)
+ {
+ const struct sockaddr_in *saddr = (const struct sockaddr_in *)&reply->addr.addr;
+ sockptr = &saddr->sin_addr;
+ }
+ else if (reply->addr.addr.ss_family == AF_INET6)
+ {
+ const struct sockaddr_in6 *saddr = (const struct sockaddr_in6 *)&reply->addr.addr;
+ sockptr = &saddr->sin6_addr;
+ }
+ else
+ {
+ printf("Invalid Address family %d\n", reply->addr.addr.ss_family);
+ return;
+ }
+
+ inet_ntop(reply->addr.addr.ss_family, sockptr, buf, sizeof(buf));
+ printf("Resolved: %s\n", buf);
+
+end:
+ mowgli_free(dnsquery->domain);
+ mowgli_free(vptr);
+}
+
+static void read_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io);
+ mowgli_dns_t *dns = userdata;
+ char buf[2048];
+ char *ch;
+ int ret;
+
+ return_if_fail(pollable->fd == STDIN_FILENO);
+
+ if ((ret = read(pollable->fd, buf, sizeof(buf))) < 0)
+ {
+ perror("read");
+ mowgli_pollable_destroy(eventloop, io);
+ return;
+ }
+ else if (ret == 0)
+ return;
+
+ buf[--ret] = '\0';
+
+ ch = strtok(buf, " ");
+ while (ch != NULL)
+ {
+ dns_query *dnsquery = mowgli_alloc(sizeof(dns_query));
+ mowgli_dns_query_t *query = &dnsquery->query;
+
+ printf("Domain input: %s\n", ch);
+ printf("End domain input\n");
+
+ query->callback = resolve_cb;
+ query->ptr = dnsquery;
+ dnsquery->domain = mowgli_strdup(ch);
+
+ if (*ch == '+')
+ {
+ int type;
+ void *addrptr;
+ struct sockaddr_storage addr;
+
+ if(strchr(++ch, ':') != NULL)
+ {
+ struct sockaddr_in6 *saddr = (struct sockaddr_in6 *)&addr;
+ type = AF_INET6;
+ addrptr = &saddr->sin6_addr;
+ }
+ else
+ {
+ struct sockaddr_in *saddr = (struct sockaddr_in *)&addr;
+ type = AF_INET;
+ addrptr = &saddr->sin_addr;
+ }
+
+ addr.ss_family = type;
+
+ if ((ret = inet_pton(type, ch, addrptr)) != 1)
+ {
+ if (ret == -1)
+ perror("inet_pton");
+ else
+ printf("Invalid address %s\n", ch);
+
+ return;
+ }
+
+ mowgli_dns_gethost_byaddr(dns, &addr, query);
+ }
+ else
+ mowgli_dns_gethost_byname(dns, ch, query, MOWGLI_DNS_T_A);
+
+ dnsquery->domain = mowgli_strdup(ch);
+ ch = strtok(NULL, " ");
+ }
+}
+
+int main (void)
+{
+ mowgli_eventloop_t *evloop = mowgli_eventloop_create();
+ mowgli_dns_t *dns = mowgli_dns_create(evloop, MOWGLI_DNS_TYPE_ASYNC);
+ mowgli_eventloop_pollable_t *stdin_pollable = mowgli_pollable_create(evloop, STDIN_FILENO, dns);
+ mowgli_pollable_set_nonblocking(stdin_pollable, true);
+
+ mowgli_pollable_setselect(evloop, stdin_pollable, MOWGLI_EVENTLOOP_IO_READ, read_data);
+
+ mowgli_eventloop_run(evloop);
+
+ mowgli_eventloop_destroy(evloop);
+
+ return 0;
+}
diff --git a/src/examples/dicttest/Makefile b/src/examples/dicttest/Makefile
deleted file mode 100644
index f018538..0000000
--- a/src/examples/dicttest/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-PROG_NOINST = dicttest${PROG_SUFFIX}
-SRCS = dicttest.c
-
-include ../../../buildsys.mk
-
-CPPFLAGS += -I../../libmowgli
-LIBS += -L../../libmowgli -lmowgli
diff --git a/src/examples/dicttest/dicttest.c b/src/examples/dicttest/dicttest.c
deleted file mode 100644
index c5eaec5..0000000
--- a/src/examples/dicttest/dicttest.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * dicttest.c: Testing of the mowgli.dictionary engine.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <mowgli.h>
-
-#ifdef _WIN32
-#define strcasecmp _stricmp
-#define snprintf _snprintf
-#endif
-
-int main(int argc, const char *argv[])
-{
- mowgli_dictionary_t *test_dict;
- mowgli_random_t *r;
- char key[10];
- long ans[100], i;
- int pass = 0, fail = 0;
-
- mowgli_init();
-
- test_dict = mowgli_dictionary_create(strcasecmp);
- r = mowgli_random_create();
-
- for (i = 0; i < 100; i++)
- {
- ans[i] = mowgli_random_int(r);
- snprintf(key, 10, "%ldkey%ld", i, i);
- mowgli_dictionary_add(test_dict, key, (void *) ans[i]);
- }
-
- for (i = 0; i < 100; i++)
- {
- snprintf(key, 10, "%ldkey%ld", i, i);
-
- if ( (long) mowgli_dictionary_retrieve(test_dict, key) != ans[i])
- {
- printf("FAIL %ld %p[%p]\n", i, mowgli_dictionary_retrieve(test_dict, key), (void*) ans[i]);
- fail++;
- }
- else
- {
- printf("PASS %ld %p[%p]\n", i, mowgli_dictionary_retrieve(test_dict, key), (void*) ans[i]);
- pass++;
- }
- }
-
- printf("%d tests failed, %d tests passed.\n", fail, pass);
- return 0;
-}
diff --git a/src/examples/echoserver/Makefile b/src/examples/echoserver/Makefile
new file mode 100644
index 0000000..c0fa0f2
--- /dev/null
+++ b/src/examples/echoserver/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = echoserver${PROG_SUFFIX}
+SRCS = echoserver.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/echoserver/echoserver.c b/src/examples/echoserver/echoserver.c
new file mode 100644
index 0000000..dd1fc05
--- /dev/null
+++ b/src/examples/echoserver/echoserver.c
@@ -0,0 +1,139 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * echoserver.c: Testing of the I/O system
+ *
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <mowgli.h>
+
+mowgli_eventloop_t *base_eventloop;
+mowgli_eventloop_pollable_t *listener;
+
+typedef struct {
+ mowgli_eventloop_io_t *io;
+ char buf[1024];
+} client_t;
+
+#ifdef DEBUG
+static void timer_tick(void *unused)
+{
+ static int ticks = 0;
+
+ printf("tick: %d\n", ++ticks);
+}
+#endif
+
+static int setup_listener(void)
+{
+ struct sockaddr_in in = {};
+ int fd = socket(AF_INET, SOCK_STREAM, 0);
+
+ in.sin_family = AF_INET;
+ in.sin_port = htons(1337);
+
+ if (bind(fd, (struct sockaddr *) &in, sizeof(struct sockaddr_in)) < 0)
+ {
+ in.sin_port = htons(31337);
+ bind(fd, (struct sockaddr *) &in, sizeof(struct sockaddr_in));
+ }
+
+ listen(fd, 5);
+
+ return fd;
+}
+
+static void write_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io);
+ client_t *client = userdata;
+
+ if (*client->buf)
+ send(pollable->fd, client->buf, strlen(client->buf), 0);
+
+ memset(client->buf, '\0', sizeof(client->buf));
+
+ mowgli_pollable_setselect(base_eventloop, client->io, MOWGLI_EVENTLOOP_IO_WRITE, NULL);
+}
+
+static void read_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io);
+ int ret;
+
+ client_t *client = userdata;
+
+ if ((ret = recv(pollable->fd, client->buf, sizeof(client->buf), 0)) <= 0)
+ {
+ mowgli_free(client);
+ mowgli_pollable_destroy(eventloop, io);
+
+ return;
+ }
+
+ mowgli_pollable_setselect(base_eventloop, client->io, MOWGLI_EVENTLOOP_IO_WRITE, write_data);
+}
+
+static void client_error(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_free(userdata);
+ mowgli_pollable_destroy(eventloop, io);
+}
+
+static void accept_client(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io);
+ client_t *client;
+ mowgli_descriptor_t new_fd, listener_fd;
+
+ listener_fd = pollable->fd;
+
+ new_fd = accept(listener_fd, NULL, NULL);
+
+ client = mowgli_alloc(sizeof(client_t));
+
+ client->io = mowgli_pollable_create(eventloop, new_fd, client);
+ mowgli_pollable_set_nonblocking(client->io, true);
+
+ mowgli_pollable_setselect(base_eventloop, client->io, MOWGLI_EVENTLOOP_IO_READ, read_data);
+ mowgli_pollable_setselect(base_eventloop, client->io, MOWGLI_EVENTLOOP_IO_ERROR, client_error);
+}
+
+int main(int argc, char *argv[])
+{
+ int fd;
+
+ base_eventloop = mowgli_eventloop_create();
+
+#ifdef DEBUG
+ mowgli_timer_add(base_eventloop, "timer_tick", timer_tick, NULL, 1);
+#endif
+
+ fd = setup_listener();
+
+ listener = mowgli_pollable_create(base_eventloop, fd, NULL);
+ mowgli_pollable_set_nonblocking(listener, true);
+ mowgli_pollable_setselect(base_eventloop, listener, MOWGLI_EVENTLOOP_IO_READ, accept_client);
+
+ mowgli_eventloop_run(base_eventloop);
+
+ mowgli_eventloop_destroy(base_eventloop);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/examples/formattertest/Makefile b/src/examples/formattertest/Makefile
index 23c4517..63cf463 100644
--- a/src/examples/formattertest/Makefile
+++ b/src/examples/formattertest/Makefile
@@ -4,4 +4,4 @@ SRCS = formattertest.c
include ../../../buildsys.mk
CPPFLAGS += -I../../libmowgli
-LIBS += -L../../libmowgli -lmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/formattertest/formattertest.c b/src/examples/formattertest/formattertest.c
index 26a6e4b..9ec014c 100644
--- a/src/examples/formattertest/formattertest.c
+++ b/src/examples/formattertest/formattertest.c
@@ -36,7 +36,6 @@
int main(int argc, char *argv[])
{
char buf[65535];
- mowgli_init();
mowgli_formatter_format(buf, 65535, "%1! %2 %3 %4.", "sdpb", "Hello World", 1, 0xDEADBEEF, TRUE);
diff --git a/src/examples/futuretest/Makefile b/src/examples/futuretest/Makefile
new file mode 100644
index 0000000..3be7e23
--- /dev/null
+++ b/src/examples/futuretest/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = futuretest${PROG_SUFFIX}
+SRCS = futuretest.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/futuretest/futuretest.c b/src/examples/futuretest/futuretest.c
new file mode 100644
index 0000000..e426733
--- /dev/null
+++ b/src/examples/futuretest/futuretest.c
@@ -0,0 +1,89 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * futuretest: Combustable lemons
+ *
+ * Copyright (c) 2012 Patrick McFarland <pmcfarland@adterrasperaspera.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+
+#include <mowgli.h>
+
+int main(int argc, char *argv[]) {
+ char *text = "hello world";
+
+ printf("create future: ");
+ mowgli_future_t *future = mowgli_future_create();
+ if(future != NULL)
+ printf("correctly created future\n");
+ else
+ printf("error: abandon all hope\n");
+
+ printf("get state manually of waiting future: ");
+ if(mowgli_future_state(future) == MOWGLI_FUTURE_STATE_WAITING)
+ printf("correctly waiting\n");
+ else
+ printf("error: %i\n", mowgli_future_state(future));
+
+ printf("finish future: ");
+ if(mowgli_future_finish(future, text) == MOWGLI_FUTURE_STATE_FINISHED)
+ printf("correctly finished\n");
+ else
+ printf("error: %i\n", mowgli_future_state(future));
+
+ printf("get result of finished future: ");
+ if(mowgli_future_result(future) == text)
+ printf("correct: %s\n", text);
+ else
+ printf("error: %s\n", (char *)mowgli_future_result(future));
+
+ printf("get state of finished future: ");
+ if(mowgli_future_state(future) == MOWGLI_FUTURE_STATE_FINISHED)
+ printf("correctly finished\n");
+ else
+ printf("error: %i\n", mowgli_future_state(future));
+
+ printf("reinit then cancel: ");
+ if(mowgli_future_init(future) == 0) {
+ if(mowgli_future_cancel(future) == MOWGLI_FUTURE_STATE_CANCELED)
+ printf("correctly canceled\n");
+ else
+ printf("error: failed to cancel: %i\n", mowgli_future_state(future));
+
+ printf("try to finish on canceled future: ");
+ if(mowgli_future_finish(future, text) == MOWGLI_FUTURE_STATE_CANCELED)
+ printf("correctly caught cancel\n");
+ else
+ printf("error: failed to cancel: %s\n", text);
+ } else {
+ printf("error: failed to reinit\n");
+ }
+
+ printf("reinit then finish twice: ");
+ if(mowgli_future_init(future) == 0) {
+ mowgli_future_finish(future, text);
+
+ if(mowgli_future_finish(future, text) == MOWGLI_FUTURE_STATE_CONSISTENCY_FAILURE)
+ printf("correctly raised consistency failure\n");
+ else
+ printf("error: finished twice: %s\n", text);
+ } else {
+ printf("error: failed to reinit\n");
+ }
+}
diff --git a/src/examples/helpertest/Makefile b/src/examples/helpertest/Makefile
new file mode 100644
index 0000000..2a37715
--- /dev/null
+++ b/src/examples/helpertest/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = helpertest${PROG_SUFFIX}
+SRCS = helpertest.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/helpertest/helpertest.c b/src/examples/helpertest/helpertest.c
new file mode 100644
index 0000000..9106000
--- /dev/null
+++ b/src/examples/helpertest/helpertest.c
@@ -0,0 +1,109 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * echoserver.c: Testing of the I/O system
+ *
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <mowgli.h>
+
+int helper_count = 0;
+
+void timer_oneshot(mowgli_eventloop_helper_proc_t *helper)
+{
+ mowgli_writef(helper->out_fd, "oneshot timer hit\n");
+}
+
+void timer_tick(mowgli_eventloop_helper_proc_t *helper)
+{
+ static int ticks = 0;
+
+ mowgli_writef(helper->out_fd, "tick: %d\n", ++ticks);
+
+ if (ticks > 10)
+ mowgli_eventloop_break(helper->eventloop);
+}
+
+void helper_start(mowgli_eventloop_helper_proc_t *helper, void *userdata)
+{
+ mowgli_eventloop_t *eventloop = helper->eventloop;
+
+ mowgli_writef(helper->out_fd, "hi from pid %d\n", getpid());
+
+ mowgli_timer_add(eventloop, "timer_tick", (mowgli_event_dispatch_func_t *) timer_tick, helper, 1);
+ mowgli_timer_add_once(eventloop, "timer_oneshot", (mowgli_event_dispatch_func_t *) timer_oneshot, helper, 5);
+
+ mowgli_eventloop_run(eventloop);
+
+ mowgli_writef(helper->out_fd, "eventloop halted\n");
+
+ mowgli_eventloop_destroy(eventloop);
+}
+
+void helper_read(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata);
+
+void helper_spawn(mowgli_eventloop_t *eventloop)
+{
+ mowgli_eventloop_helper_proc_t *helper;
+
+ if (helper_count >= 100)
+ return;
+
+ helper = mowgli_helper_create(eventloop, helper_start, "Spawned helper", NULL);
+ mowgli_helper_set_read_cb(eventloop, helper, helper_read);
+
+ helper_count++;
+}
+
+void helper_read(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ size_t r;
+ char buf[16384];
+ mowgli_eventloop_helper_proc_t *helper = mowgli_eventloop_io_helper(io);
+
+ bzero(buf, sizeof buf);
+ r = read(helper->in_fd, buf, sizeof buf);
+
+ if (r > 0)
+ printf("helper %p [%d/%d]: %s", helper, helper->child->pid, helper->in_fd, buf);
+ else if (r <= 0)
+ {
+ helper_count--;
+ mowgli_helper_destroy(eventloop, helper);
+ }
+
+ if ((rand() % helper_count) == 0)
+ helper_spawn(eventloop);
+}
+
+int main(int argc, char *argv[])
+{
+ mowgli_eventloop_t *base_eventloop;
+
+ /* Bleh this is needed to ensure some systems can set the process title */
+ argv = mowgli_proctitle_init(argc, argv);
+
+ base_eventloop = mowgli_eventloop_create();
+
+ helper_spawn(base_eventloop);
+
+ mowgli_eventloop_run(base_eventloop);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/examples/libevent-bench/Makefile b/src/examples/libevent-bench/Makefile
new file mode 100644
index 0000000..c420102
--- /dev/null
+++ b/src/examples/libevent-bench/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = bench${PROG_SUFFIX}
+SRCS = bench.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/libevent-bench/bench.c b/src/examples/libevent-bench/bench.c
new file mode 100644
index 0000000..0e2cb08
--- /dev/null
+++ b/src/examples/libevent-bench/bench.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2012 William Pitcock <nenolod@dereferenced.org>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Copyright 2003 Niels Provos <provos@citi.umich.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * Mon 03/10/2003 - Modified by Davide Libenzi <davidel@xmailserver.org>
+ *
+ * Added chain event propagation to improve the sensitivity of
+ * the measure respect to the event loop efficency.
+ *
+ *
+ */
+
+#define timersub(tvp, uvp, vvp) \
+ do { \
+ (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
+ (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
+ if ((vvp)->tv_usec < 0) { \
+ (vvp)->tv_sec--; \
+ (vvp)->tv_usec += 1000000; \
+ } \
+ } while (0)
+
+#include <mowgli.h>
+
+
+static int count, writes, fired;
+static mowgli_eventloop_t *base_eventloop;
+static mowgli_descriptor_t *pipes;
+static int num_pipes, num_active, num_writes;
+static mowgli_eventloop_pollable_t **events;
+static int timers;
+
+void
+timer_cb(void *unused)
+{
+ /* nop */
+}
+
+void
+read_cb(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *arg)
+{
+ mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io);
+ int idx = (int) (long) arg, widx = idx + 1;
+ u_char ch;
+
+ count += read(pollable->fd, &ch, sizeof(ch));
+ if (writes) {
+ if (widx >= num_pipes)
+ widx -= num_pipes;
+ write(pipes[2 * widx + 1], "e", 1);
+ writes--;
+ fired++;
+ }
+}
+
+#if NATIVE
+void
+read_thunk(struct ev_io *w, int revents)
+{
+ read_cb (w->fd, revents, w->data);
+}
+
+void
+timer_cb (struct ev_timer *w, int revents)
+{
+ /* nop */
+}
+#endif
+
+struct timeval *
+run_once(void)
+{
+ int *cp, i, space;
+ static struct timeval ta, ts, te;
+
+ gettimeofday(&ta, NULL);
+ for (cp = pipes, i = 0; i < num_pipes; i++, cp += 2) {
+ if (events[i] != NULL)
+ mowgli_pollable_destroy(base_eventloop, events[i]);
+
+ events[i] = mowgli_pollable_create(base_eventloop, cp[0], (void *) (long) i);
+ mowgli_pollable_setselect(base_eventloop, events[i], MOWGLI_EVENTLOOP_IO_READ, read_cb);
+ }
+
+ fired = 0;
+ space = num_pipes / num_active;
+ space = space * 2;
+ for (i = 0; i < num_active; i++, fired++)
+ write(pipes[i * space + 1], "e", 1);
+
+ count = 0;
+ writes = num_writes;
+
+ int xcount = 0;
+ gettimeofday(&ts, NULL);
+ do {
+ mowgli_eventloop_run_once(base_eventloop);
+ xcount++;
+ } while (count != fired);
+
+ gettimeofday(&te, NULL);
+
+ timersub(&te, &ta, &ta);
+ timersub(&te, &ts, &ts);
+ fprintf(stdout, "%ld\t%ld\n",
+ ta.tv_sec * 1000000L + ta.tv_usec,
+ ts.tv_sec * 1000000L + ts.tv_usec
+ );
+
+ return (&te);
+}
+
+int
+main (int argc, char **argv)
+{
+ struct rlimit rl;
+ int i, c;
+ int *cp;
+ extern char *optarg;
+
+ num_pipes = 100;
+ num_active = 1;
+ num_writes = num_pipes;
+ while ((c = getopt(argc, argv, "n:a:w:te")) != -1) {
+ switch (c) {
+ case 'n':
+ num_pipes = atoi(optarg);
+ break;
+ case 'a':
+ num_active = atoi(optarg);
+ break;
+ case 'w':
+ num_writes = atoi(optarg);
+ break;
+ case 't':
+ timers = 1;
+ break;
+ default:
+ fprintf(stderr, "Illegal argument \"%c\"\n", c);
+ exit(1);
+ }
+ }
+
+#if 1
+ rl.rlim_cur = rl.rlim_max = num_pipes * 2 + 50;
+ if (setrlimit(RLIMIT_NOFILE, &rl) == -1) {
+ perror("setrlimit");
+ }
+#endif
+
+ events = calloc(num_pipes * 2, sizeof(mowgli_eventloop_pollable_t *));
+ pipes = calloc(num_pipes * 2, sizeof(mowgli_descriptor_t));
+ if (events == NULL || pipes == NULL) {
+ perror("malloc");
+ exit(1);
+ }
+
+ mowgli_thread_set_policy(MOWGLI_THREAD_POLICY_DISABLED);
+ base_eventloop = mowgli_eventloop_create();
+
+ for (cp = pipes, i = 0; i < num_pipes; i++, cp += 2) {
+#ifdef USE_PIPES
+ if (pipe(cp) == -1) {
+#else
+ if (socketpair(AF_UNIX, SOCK_STREAM, 0, cp) == -1) {
+#endif
+ perror("pipe");
+ exit(1);
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ run_once();
+ }
+
+ exit(0);
+}
diff --git a/src/examples/linetest/Makefile b/src/examples/linetest/Makefile
new file mode 100644
index 0000000..cb9b030
--- /dev/null
+++ b/src/examples/linetest/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = linetest${PROG_SUFFIX}
+SRCS = linetest.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/linetest/linetest.c b/src/examples/linetest/linetest.c
new file mode 100644
index 0000000..98b8064
--- /dev/null
+++ b/src/examples/linetest/linetest.c
@@ -0,0 +1,162 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * linetest.c: Testing of the linebuffer
+ *
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
+ * Copyright (c) 2012 Elizabeth J. Myers <elizabeth@sporksmoo.net>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <mowgli.h>
+
+mowgli_eventloop_t *base_eventloop;
+char buf[512];
+
+typedef struct {
+ mowgli_linebuf_t *linebuf;
+} client_t;
+
+void eat_line(mowgli_linebuf_t *linebuf, char *line, size_t len, void *userdata);
+
+void write_line(mowgli_linebuf_t *linebuf, char *buf, size_t len)
+{
+ printf("> %s\n", buf);
+ mowgli_linebuf_write(linebuf, buf, len);
+}
+
+client_t * create_client(const char *server, const char *port, const char *nick, const char *user, const char *realname)
+{
+ client_t *client;
+ struct addrinfo hints, *res;
+ bool use_ssl = false;
+ mowgli_vio_sockaddr_t addr;
+ int ret;
+
+ mowgli_linebuf_t *linebuf;
+
+ if (*port == '+')
+ {
+ port++;
+ use_ssl = true;
+ }
+
+ client = mowgli_alloc(sizeof(client_t));
+
+ linebuf = mowgli_linebuf_create(eat_line, client);
+ client->linebuf = linebuf;
+
+ /* Do name res */
+ memset(&hints, 0, sizeof hints);
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+
+ if ((ret = getaddrinfo(server, port, &hints, &res)) != 0)
+ {
+ linebuf->vio->error.op = MOWGLI_VIO_ERR_OP_OTHER;
+ linebuf->vio->error.type = MOWGLI_VIO_ERR_ERRCODE;
+ linebuf->vio->error.code = ret;
+ mowgli_strlcpy(linebuf->vio->error.string, gai_strerror(ret), sizeof(linebuf->vio->error.string));
+ mowgli_vio_error(linebuf->vio);
+ return NULL;
+ }
+
+ /* Wrap the VIO object */
+ if (use_ssl)
+ {
+ if (mowgli_vio_openssl_setssl(linebuf->vio, NULL) != 0)
+ return NULL;
+ }
+
+ /* We have to have a socket before starting the linebuf */
+ if (mowgli_vio_socket(linebuf->vio, res->ai_family, res->ai_socktype, res->ai_protocol) != 0)
+ return NULL;
+
+ /* Attach the linebuf */
+ mowgli_linebuf_attach_to_eventloop(linebuf, base_eventloop);
+
+ /* Do the connect */
+ if (mowgli_vio_connect(linebuf->vio, mowgli_vio_sockaddr_from_struct(&addr, res->ai_addr, res->ai_addrlen)) != 0)
+ return NULL;
+
+ /* Write IRC handshake */
+ snprintf(buf, 512, "USER %s * 8 :%s", user, realname);
+ write_line(client->linebuf, buf, strlen(buf));
+
+ snprintf(buf, 512, "NICK %s", nick);
+ write_line(client->linebuf, buf, strlen(buf));
+
+ return client;
+}
+
+void eat_line(mowgli_linebuf_t *linebuf, char *line, size_t len, void *userdata)
+{
+ char str[512];
+
+ /* Avoid malicious lines -- servers shouldn't send them */
+ if (linebuf->flags & MOWGLI_LINEBUF_LINE_HASNULLCHAR)
+ return;
+
+ strncpy(str, line, sizeof(str));
+ str[len + 1] = '\0';
+
+ printf("-> %s\n", str);
+
+ /* Since this is just a basic example, we don't have a real dispatcher :p */
+ if (strstr(str, "PING"))
+ {
+ char *pos = strpbrk(str, ":");
+ if (pos)
+ {
+ char buf[512];
+ snprintf(buf, 512, "PONG %s", pos);
+ mowgli_linebuf_write(linebuf, buf, strlen(buf));
+ }
+ }
+
+ return;
+}
+
+int main(int argc, const char *argv[])
+{
+ client_t *client;
+ const char *serv, *port;
+
+ if (argc < 3)
+ {
+ fprintf(stderr, "Not enough arguments\n");
+ fprintf(stderr, "Usage: %s [server] [(+)port]\n", argv[0]);
+ fprintf(stderr, "For SSL, put a + in front of port\n");
+ return EXIT_FAILURE;
+ }
+
+ base_eventloop = mowgli_eventloop_create();
+
+ serv = argv[1];
+ port = argv[2];
+
+ client = create_client(serv, port, "Mowglibot", "Mowglibot", "The libmowgli example bot that does nothing useful");
+ if (client == NULL)
+ return EXIT_FAILURE;
+
+ mowgli_eventloop_run(base_eventloop);
+
+ mowgli_free(client);
+ mowgli_eventloop_destroy(base_eventloop);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/examples/listsort/Makefile b/src/examples/listsort/Makefile
index 2517a77..b3e59b4 100644
--- a/src/examples/listsort/Makefile
+++ b/src/examples/listsort/Makefile
@@ -4,4 +4,4 @@ SRCS = listsort.c
include ../../../buildsys.mk
CPPFLAGS += -I../../libmowgli
-LIBS += -L../../libmowgli -lmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/listsort/listsort.c b/src/examples/listsort/listsort.c
index 43b9745..7aa44c2 100644
--- a/src/examples/listsort/listsort.c
+++ b/src/examples/listsort/listsort.c
@@ -109,9 +109,7 @@ void test_integers(void)
int main(int argc, char *argv[])
{
- mowgli_init();
-
test_strings();
test_integers();
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
diff --git a/src/examples/memslice-bench/Makefile b/src/examples/memslice-bench/Makefile
new file mode 100644
index 0000000..8648d93
--- /dev/null
+++ b/src/examples/memslice-bench/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = memslice-bench${PROG_SUFFIX}
+SRCS = memslice-bench.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/memslice-bench/memslice-bench.c b/src/examples/memslice-bench/memslice-bench.c
new file mode 100644
index 0000000..3fb05d5
--- /dev/null
+++ b/src/examples/memslice-bench/memslice-bench.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define timersub(tvp, uvp, vvp) \
+ do { \
+ (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
+ (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
+ if ((vvp)->tv_usec < 0) { \
+ (vvp)->tv_sec--; \
+ (vvp)->tv_usec += 1000000; \
+ } \
+ } while (0)
+
+#include <mowgli.h>
+
+mowgli_allocation_policy_t *memslice;
+mowgli_allocation_policy_t *sysmalloc;
+
+int
+main(int argc, char *argv[])
+{
+ size_t i;
+ size_t objects;
+ size_t *obj_sizes;
+ void **ptrs;
+ struct timeval ts, te;
+
+ mowgli_thread_set_policy(MOWGLI_THREAD_POLICY_DISABLED);
+
+ objects = 128000;
+ ptrs = mowgli_alloc_array(sizeof(void *), objects);
+ obj_sizes = mowgli_alloc_array(sizeof(size_t), objects);
+
+ memslice = mowgli_allocation_policy_lookup("memslice");
+ sysmalloc = mowgli_allocation_policy_lookup("malloc");
+
+ if (sysmalloc == NULL)
+ {
+ printf("Couldn't find a sysmalloc component which implements contract 'mowgli.core.allocation_policy' :(\n");
+ return EXIT_FAILURE;
+ }
+
+ if (memslice == NULL)
+ {
+ printf("Couldn't find a memslice component which implements contract 'mowgli.core.allocation_policy' :(\n");
+ return EXIT_FAILURE;
+ }
+
+ printf("Going to allocate %zu objects of random sizes < 256\n", objects);
+
+ printf("Assigning sizes...\n");
+ for (i = 0; i < objects; i++) {
+ obj_sizes[i] = rand() % 256;
+ }
+ printf("Done! Lets benchmark.\n");
+
+ /* allocate using sysmalloc */
+ gettimeofday(&ts, NULL);
+ for (i = 0; i < objects; i++) {
+ ptrs[i] = mowgli_alloc_using_policy(sysmalloc, obj_sizes[i]);
+ }
+ gettimeofday(&te, NULL);
+ timersub(&te, &ts, &ts);
+
+ printf("sysmalloc alloc time: %ld usec\n",
+ ts.tv_sec * 1000000L + ts.tv_usec);
+
+ gettimeofday(&ts, NULL);
+ for (i = 0; i < objects; i++) {
+ mowgli_free(ptrs[i]);
+ }
+ gettimeofday(&te, NULL);
+ timersub(&te, &ts, &ts);
+
+ printf("sysmalloc free time: %ld usec\n",
+ ts.tv_sec * 1000000L + ts.tv_usec);
+
+ /* allocate using memslice */
+ gettimeofday(&ts, NULL);
+ for (i = 0; i < objects; i++) {
+ ptrs[i] = mowgli_alloc_using_policy(memslice, obj_sizes[i]);
+ }
+ gettimeofday(&te, NULL);
+ timersub(&te, &ts, &ts);
+
+ printf("memslice alloc time: %ld usec\n",
+ ts.tv_sec * 1000000L + ts.tv_usec);
+
+ gettimeofday(&ts, NULL);
+ for (i = 0; i < objects; i++) {
+ mowgli_free(ptrs[i]);
+ }
+ gettimeofday(&te, NULL);
+ timersub(&te, &ts, &ts);
+
+ printf("memslice free time: %ld usec\n",
+ ts.tv_sec * 1000000L + ts.tv_usec);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/examples/patriciatest/Makefile b/src/examples/patriciatest/Makefile
index 6669293..5c454e2 100644
--- a/src/examples/patriciatest/Makefile
+++ b/src/examples/patriciatest/Makefile
@@ -4,4 +4,4 @@ SRCS = patriciatest.c
include ../../../buildsys.mk
CPPFLAGS += -I../../libmowgli
-LIBS += -L../../libmowgli -lmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/patriciatest/patriciatest.c b/src/examples/patriciatest/patriciatest.c
index bf5f641..98c5f65 100644
--- a/src/examples/patriciatest/patriciatest.c
+++ b/src/examples/patriciatest/patriciatest.c
@@ -149,8 +149,6 @@ void test_patricia(void)
int main(int argc, char *argv[])
{
- mowgli_init();
-
test_patricia();
return errors == 0 ? 0 : 1;
diff --git a/src/examples/patriciatest2/Makefile b/src/examples/patriciatest2/Makefile
index cb7ce12..de50339 100644
--- a/src/examples/patriciatest2/Makefile
+++ b/src/examples/patriciatest2/Makefile
@@ -4,4 +4,4 @@ SRCS = patriciatest2.c
include ../../../buildsys.mk
CPPFLAGS += -I../../libmowgli
-LIBS += -L../../libmowgli -lmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/patriciatest2/patriciatest2.c b/src/examples/patriciatest2/patriciatest2.c
index de70ac2..d73b1ee 100644
--- a/src/examples/patriciatest2/patriciatest2.c
+++ b/src/examples/patriciatest2/patriciatest2.c
@@ -145,8 +145,6 @@ void test_patricia(void)
int main(int argc, char *argv[])
{
- mowgli_init();
-
test_patricia();
return errors == 0 ? 0 : 1;
diff --git a/src/examples/randomtest/Makefile b/src/examples/randomtest/Makefile
index b64193e..9b49184 100644
--- a/src/examples/randomtest/Makefile
+++ b/src/examples/randomtest/Makefile
@@ -4,4 +4,4 @@ SRCS = randomtest.c
include ../../../buildsys.mk
CPPFLAGS += -I../../libmowgli
-LIBS += -L../../libmowgli -lmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/timertest/Makefile b/src/examples/timertest/Makefile
new file mode 100644
index 0000000..968f2d1
--- /dev/null
+++ b/src/examples/timertest/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = timertest${PROG_SUFFIX}
+SRCS = timertest.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/libmowgli/mowgli_init.c b/src/examples/timertest/timertest.c
index 5b15aa0..242b8a9 100644
--- a/src/libmowgli/mowgli_init.c
+++ b/src/examples/timertest/timertest.c
@@ -1,12 +1,12 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_init.c: Initialization of libmowgli.
+ * echoserver.c: Testing of the I/O system
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
*
* 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 is present in all copies.
+ * copyright notice and this permission notice appear in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -21,29 +21,37 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include "mowgli.h"
+#include <mowgli.h>
-void mowgli_init(void)
+mowgli_eventloop_t *eventloop;
+
+void timer_oneshot(void *unused)
+{
+ printf("oneshot timer hit\n");
+}
+
+void timer_tick(void *unused)
+{
+ static int ticks = 0;
+
+ printf("tick: %d\n", ++ticks);
+
+ if (ticks > 20)
+ mowgli_eventloop_break(eventloop);
+}
+
+int main(int argc, char *argv[])
{
- static int mowgli_initted_ = 0;
-
- if (mowgli_initted_)
- return;
-
- /* initial bootstrap */
- mowgli_node_init();
- mowgli_queue_init();
- mowgli_argstack_init();
- mowgli_bitvector_init();
- mowgli_global_storage_init();
- mowgli_hook_init();
- mowgli_random_init();
- mowgli_allocation_policy_init();
- mowgli_allocator_init();
-
- /* now that we're bootstrapped, we can use a more optimised allocator
- if one is available. */
- mowgli_allocator_set_policy(mowgli_allocator_malloc);
-
- mowgli_initted_++;
+ eventloop = mowgli_eventloop_create();
+
+ mowgli_timer_add(eventloop, "timer_tick", timer_tick, NULL, 1);
+ mowgli_timer_add_once(eventloop, "timer_oneshot", timer_oneshot, NULL, 5);
+
+ mowgli_eventloop_run(eventloop);
+
+ printf("eventloop halted\n");
+
+ mowgli_eventloop_destroy(eventloop);
+
+ return EXIT_SUCCESS;
}
diff --git a/src/examples/vio-udplistener/Makefile b/src/examples/vio-udplistener/Makefile
new file mode 100644
index 0000000..1be3936
--- /dev/null
+++ b/src/examples/vio-udplistener/Makefile
@@ -0,0 +1,7 @@
+PROG_NOINST = vio-udplistener${PROG_SUFFIX}
+SRCS = vio-udplistener.c
+
+include ../../../buildsys.mk
+
+CPPFLAGS += -I../../libmowgli
+LIBS += -L../../libmowgli -lmowgli-2
diff --git a/src/examples/vio-udplistener/vio-udplistener.c b/src/examples/vio-udplistener/vio-udplistener.c
new file mode 100644
index 0000000..9de4e69
--- /dev/null
+++ b/src/examples/vio-udplistener/vio-udplistener.c
@@ -0,0 +1,45 @@
+/* vio-udplistener.c - An example of the VIO API
+ * To use: nc -u localhost, and then type stuff and hit enter. :p
+ * This example is public domain.
+ */
+
+#include <mowgli.h>
+
+#define BUFSIZE 2048
+
+#define PROTO AF_INET6
+#define LISTEN "::ffff:127.0.0.1" /* 6to4 mapping */
+#define PORT 31337
+
+#define ECHOBACK "Echo: "
+
+int main (void)
+{
+ mowgli_vio_t *vio = mowgli_vio_create(NULL);
+ mowgli_vio_sockaddr_t addr;
+
+ mowgli_vio_sockaddr_create(&addr, PROTO, LISTEN, 31337);
+
+ if (mowgli_vio_socket(vio, PROTO, SOCK_DGRAM, 0))
+ return EXIT_FAILURE;
+
+ if (mowgli_vio_bind(vio, &addr))
+ return EXIT_FAILURE;
+
+ while (true)
+ {
+ char buf[BUFSIZE] = "";
+ mowgli_vio_sockdata_t sockinfo;
+
+ mowgli_vio_recvfrom(vio, buf, sizeof(buf), &addr);
+
+ mowgli_vio_sockaddr_info(&addr, &sockinfo);
+
+ printf("Recieved bytes from addr [%s]:%hu: %s", sockinfo.host, sockinfo.port, buf);
+
+ mowgli_vio_sendto(vio, ECHOBACK, sizeof(ECHOBACK), &addr);
+ mowgli_vio_sendto(vio, buf, strlen(buf), &addr);
+ }
+
+ return EXIT_SUCCESS; /* Not reached */
+}
diff --git a/src/libmowgli/Makefile b/src/libmowgli/Makefile
index d25902e..4cf3942 100644
--- a/src/libmowgli/Makefile
+++ b/src/libmowgli/Makefile
@@ -1,77 +1,19 @@
include ../../extra.mk
-LIB = ${LIB_PREFIX}mowgli${LIB_SUFFIX}
-LIB_MAJOR = 2
+LIB_MAJOR = 0
LIB_MINOR = 0
-DISTCLEAN = mowgli_config.h
-SRCS = mowgli_alloc.c \
- mowgli_allocation_policy.c \
- mowgli_allocator.c \
- mowgli_argstack.c \
- mowgli_bitvector.c \
- mowgli_dictionary.c \
- mowgli_error_backtrace.c \
- mowgli_formatter.c \
- mowgli_global_storage.c \
- mowgli_hash.c \
- mowgli_heap.c \
- mowgli_hook.c \
- mowgli_index.c \
- mowgli_init.c \
- mowgli_ioevent.c \
- mowgli_list.c \
- mowgli_logger.c \
- mowgli_mempool.c \
- $(MOWGLI_MODULE) \
- mowgli_object.c \
- mowgli_object_class.c \
- mowgli_object_messaging.c \
- mowgli_object_metadata.c \
- mowgli_patricia.c \
- mowgli_queue.c \
- mowgli_random.c \
- mowgli_signal.c \
- mowgli_spinlock.c \
- mowgli_string.c \
+SHARED_LIB = ${LIBMOWGLI_SHARED_LIB}
+STATIC_LIB = ${LIBMOWGLI_STATIC_LIB}
-INCLUDES = mowgli.h \
- mowgli_alloc.h \
- mowgli_allocation_policy.h \
- mowgli_allocator.h \
- mowgli_argstack.h \
- mowgli_assert.h \
- mowgli_bitvector.h \
- mowgli_config.h \
- mowgli_dictionary.h \
- mowgli_error_backtrace.h \
- mowgli_exception.h \
- mowgli_formatter.h \
- mowgli_global_storage.h \
- mowgli_hash.h \
- mowgli_heap.h \
- mowgli_hook.h \
- mowgli_index.h \
- mowgli_init.h \
- mowgli_ioevent.h \
- mowgli_iterator.h \
- mowgli_list.h \
- mowgli_logger.h \
- mowgli_mempool.h \
- mowgli_module.h \
- mowgli_object.h \
- mowgli_object_class.h \
- mowgli_object_messaging.h \
- mowgli_object_metadata.h \
- mowgli_patricia.h \
- mowgli_queue.h \
- mowgli_random.h \
- mowgli_signal.h \
- mowgli_spinlock.h \
- mowgli_stdinc.h \
- mowgli_string.h
+SUBDIRS = ${LIBMOWGLI_MODULES} platform
+
+INCLUDES = mowgli.h
+
+LIB_OBJS_EXTRA = ${LIB_OBJS} ${LIBMOWGLI_SHARED_MODULES}
+OBJS_EXTRA = ${LIBMOWGLI_STATIC_MODULES}
include ../../buildsys.mk
-CPPFLAGS += ${LIB_CPPFLAGS} -I. -I.. -DMOWGLI_CORE
-CFLAGS += ${LIB_CFLAGS}
+LIBS += ${PTHREAD_LIBS}
+CPPFLAGS += -I. -I../.. -DMOWGLI_CORE
diff --git a/src/libmowgli/base/Makefile b/src/libmowgli/base/Makefile
new file mode 100644
index 0000000..3d6b0e7
--- /dev/null
+++ b/src/libmowgli/base/Makefile
@@ -0,0 +1,29 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_BASE}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_BASE}
+
+SRCS = argstack.c \
+ bitvector.c \
+ formatter.c \
+ hash.c \
+ hook.c \
+ memslice.c \
+ random.c \
+ mowgli_signal.c
+
+INCLUDES = argstack.h \
+ bitvector.h \
+ formatter.h \
+ hash.h \
+ hook.h \
+ memslice.h \
+ random.h \
+ mowgli_signal.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/base
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/mowgli_argstack.c b/src/libmowgli/base/argstack.c
index 0ad5c91..ea67da2 100644
--- a/src/libmowgli/mowgli_argstack.c
+++ b/src/libmowgli/base/argstack.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_argstack.c: Argument stacks.
+ * argstack.c: Argument stacks.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -52,7 +52,7 @@ static void mowgli_argstack_destroy(void *vptr)
* Side Effects:
* - the mowgli_argstack_t object class is registered.
*/
-void mowgli_argstack_init(void)
+void mowgli_argstack_bootstrap(void)
{
mowgli_object_class_init(&klass, "mowgli_argstack_t", mowgli_argstack_destroy, FALSE);
}
diff --git a/src/libmowgli/mowgli_argstack.h b/src/libmowgli/base/argstack.h
index 8e7428c..adf68c2 100644
--- a/src/libmowgli/mowgli_argstack.h
+++ b/src/libmowgli/base/argstack.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_argstack.h: Argument stacks.
+ * argstack.h: Argument stacks.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -46,9 +46,9 @@ typedef struct {
mowgli_list_t stack;
} mowgli_argstack_t;
+extern void mowgli_argstack_bootstrap(void);
extern mowgli_argstack_t *mowgli_argstack_create(const char *descstr, ...);
extern mowgli_argstack_t *mowgli_argstack_create_from_va_list(const char *descstr, va_list va);
-extern void mowgli_argstack_init(void);
extern const char *mowgli_argstack_pop_string(mowgli_argstack_t *);
extern int mowgli_argstack_pop_numeric(mowgli_argstack_t *);
extern mowgli_boolean_t mowgli_argstack_pop_boolean(mowgli_argstack_t *);
diff --git a/src/libmowgli/mowgli_bitvector.c b/src/libmowgli/base/bitvector.c
index 8186c16..b70df55 100644
--- a/src/libmowgli/mowgli_bitvector.c
+++ b/src/libmowgli/base/bitvector.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_bitvector.c: Bitvectors.
+ * bitvector.c: Bitvectors.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -39,7 +39,7 @@ static mowgli_object_class_t klass;
* Side Effects:
* - the mowgli_bitvector_t object class is registered.
*/
-void mowgli_bitvector_init(void)
+void mowgli_bitvector_bootstrap(void)
{
mowgli_object_class_init(&klass, "mowgli_bitvector_t", mowgli_free, FALSE);
}
diff --git a/src/libmowgli/mowgli_bitvector.h b/src/libmowgli/base/bitvector.h
index 195d8d9..592ba59 100644
--- a/src/libmowgli/mowgli_bitvector.h
+++ b/src/libmowgli/base/bitvector.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_bitvector.h: Bitvectors.
+ * bitvector.h: Bitvectors.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -30,7 +30,7 @@ typedef struct {
unsigned int *vector;
} mowgli_bitvector_t;
-extern void mowgli_bitvector_init(void);
+extern void mowgli_bitvector_bootstrap(void);
extern mowgli_bitvector_t *mowgli_bitvector_create(int bits);
extern void mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val);
extern mowgli_boolean_t mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot);
diff --git a/src/libmowgli/mowgli_formatter.c b/src/libmowgli/base/formatter.c
index b6aa1cc..21d9e46 100644
--- a/src/libmowgli/mowgli_formatter.c
+++ b/src/libmowgli/base/formatter.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_formatter.c: Reusable formatting.
+ * formatter.c: Reusable formatting.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_formatter.h b/src/libmowgli/base/formatter.h
index 2631ad6..2cfa1ce 100644
--- a/src/libmowgli/mowgli_formatter.h
+++ b/src/libmowgli/base/formatter.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_formatter.h: Reusable formatting.
+ * formatter.h: Reusable formatting.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_hash.c b/src/libmowgli/base/hash.c
index 3f331e4..7d70d8c 100644
--- a/src/libmowgli/mowgli_hash.c
+++ b/src/libmowgli/base/hash.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_hash.c: FNV-1 hashing implementation.
+ * hash.c: FNV-1 hashing implementation.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -33,7 +33,11 @@ int mowgli_fnv_hash_string(const char *p)
unsigned int hval = HASHINIT;
if (htoast == 0)
- htoast = rand();
+ {
+ mowgli_random_t *r = mowgli_random_create();
+ htoast = mowgli_random_int(r);
+ mowgli_object_unref(r);
+ }
if (!p)
return (0);
@@ -52,7 +56,11 @@ int mowgli_fnv_hash(unsigned int *p)
unsigned int hval = HASHINIT;
if (htoast == 0)
- htoast = rand();
+ {
+ mowgli_random_t *r = mowgli_random_create();
+ htoast = mowgli_random_int(r);
+ mowgli_object_unref(r);
+ }
if (!p)
return (0);
diff --git a/src/libmowgli/mowgli_hash.h b/src/libmowgli/base/hash.h
index e8e04cd..1848174 100644
--- a/src/libmowgli/mowgli_hash.h
+++ b/src/libmowgli/base/hash.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_hash.h: FNV-1 hashing implementation.
+ * hash.h: FNV-1 hashing implementation.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_hook.c b/src/libmowgli/base/hook.c
index 8527a6b..0af9660 100644
--- a/src/libmowgli/mowgli_hook.c
+++ b/src/libmowgli/base/hook.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_hook.c: Hooks.
+ * hook.c: Hooks.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Giacomo Lozito <james -at- develia.org>
@@ -37,7 +37,7 @@ static void _hook_key_canon(char *str)
}
void
-mowgli_hook_init(void)
+mowgli_hook_bootstrap(void)
{
mowgli_hooks = mowgli_patricia_create(_hook_key_canon);
mowgli_hook_item_heap = mowgli_heap_create(sizeof(mowgli_hook_item_t), 64, BH_NOW);
@@ -58,7 +58,7 @@ mowgli_hook_register(const char *name)
return_if_fail((hook = mowgli_hook_find(name)) == NULL);
hook = mowgli_alloc(sizeof(mowgli_hook_t));
- hook->name = strdup(name);
+ hook->name = mowgli_strdup(name);
mowgli_patricia_add(mowgli_hooks, hook->name, hook);
}
diff --git a/src/libmowgli/mowgli_hook.h b/src/libmowgli/base/hook.h
index 2e79086..366e123 100644
--- a/src/libmowgli/mowgli_hook.h
+++ b/src/libmowgli/base/hook.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_hook.h: Hooks.
+ * hook.h: Hooks.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Giacomo Lozito <james -at- develia.org>
@@ -38,7 +38,7 @@ typedef struct {
mowgli_list_t items;
} mowgli_hook_t;
-extern void mowgli_hook_init(void);
+extern void mowgli_hook_bootstrap(void);
extern void mowgli_hook_register(const char *name);
extern int mowgli_hook_associate(const char *name, mowgli_hook_function_t func, void * user_data);
extern int mowgli_hook_dissociate(const char *name, mowgli_hook_function_t func);
diff --git a/src/libmowgli/base/memslice.c b/src/libmowgli/base/memslice.c
new file mode 100644
index 0000000..a271821
--- /dev/null
+++ b/src/libmowgli/base/memslice.c
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+static mowgli_list_t allocator_list;
+static mowgli_heap_t *allocator_heap;
+
+/*
+ * Our slice allocation engine.
+ */
+typedef struct {
+ size_t size;
+
+ mowgli_heap_t *heap;
+ mowgli_node_t node;
+} slice_alloc_t;
+
+/*
+ * Allocation tag.
+ */
+typedef struct {
+ slice_alloc_t *owner;
+} slice_tag_t;
+
+/*
+ * Given a size_t, determine the closest power-of-two, which is larger.
+ */
+static inline size_t
+nexthigher(size_t k)
+{
+ size_t i;
+
+ k--;
+ for (i = 1; i < sizeof(k) * 8; i <<= 1)
+ k |= k >> i;
+
+ return k + 1;
+}
+
+/*
+ * Set up an allocator.
+ */
+static inline slice_alloc_t *
+create_allocator(size_t k)
+{
+ slice_alloc_t *a;
+
+ a = mowgli_heap_alloc(allocator_heap);
+ mowgli_node_add(a, &a->node, &allocator_list);
+
+ a->size = k;
+ a->heap = mowgli_heap_create(k, 16, BH_LAZY);
+
+ return a;
+}
+
+/*
+ * Find an allocator which fits the requested allocation size.
+ */
+static inline slice_alloc_t *
+find_or_create_allocator(size_t i)
+{
+ size_t k;
+ mowgli_node_t *n;
+
+ k = nexthigher(i);
+ MOWGLI_ITER_FOREACH(n, allocator_list.head)
+ {
+ slice_alloc_t *a = n->data;
+
+ if (a->size == k)
+ return a;
+ }
+
+ return create_allocator(k);
+}
+
+/*
+ * Allocate a slice of memory.
+ */
+static void *
+memslice_alloc(size_t i)
+{
+ void *ptr;
+ slice_alloc_t *alloc;
+ size_t adj_size;
+
+ adj_size = i + sizeof(slice_tag_t);
+ alloc = find_or_create_allocator(adj_size);
+
+ ptr = mowgli_heap_alloc(alloc->heap);
+ ((slice_tag_t *) ptr)->owner = alloc;
+
+ return ptr + sizeof(slice_tag_t);
+}
+
+/*
+ * Free a slice of memory.
+ */
+static void
+memslice_free(void *ptr)
+{
+ slice_tag_t *tag;
+
+ return_if_fail(ptr != NULL);
+
+ tag = ptr - sizeof(slice_tag_t);
+ mowgli_heap_free(tag->owner->heap, tag);
+}
+
+/*
+ * Initialize memslice.
+ */
+static mowgli_allocation_policy_t *memslice = NULL;
+
+void
+mowgli_memslice_bootstrap(void)
+{
+ allocator_heap = mowgli_heap_create(sizeof(slice_alloc_t), 16, BH_NOW);
+
+ memslice = mowgli_allocation_policy_create("memslice", memslice_alloc, memslice_free);
+}
+
+mowgli_allocation_policy_t *
+mowgli_memslice_get_policy(void)
+{
+ return memslice;
+}
diff --git a/src/libmowgli/base/memslice.h b/src/libmowgli/base/memslice.h
new file mode 100644
index 0000000..9d6e842
--- /dev/null
+++ b/src/libmowgli/base/memslice.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_MEMSLICE_H__
+#define __MOWGLI_MEMSLICE_H__
+
+void mowgli_memslice_bootstrap(void);
+mowgli_allocation_policy_t *mowgli_memslice_get_policy(void);
+
+#endif
diff --git a/src/libmowgli/mowgli_signal.c b/src/libmowgli/base/mowgli_signal.c
index 3fdd708..208ce37 100644
--- a/src/libmowgli/mowgli_signal.c
+++ b/src/libmowgli/base/mowgli_signal.c
@@ -23,6 +23,7 @@
#ifndef _WIN32
+#include <signal.h>
#include "mowgli.h"
static mowgli_signal_handler_t
diff --git a/src/libmowgli/mowgli_signal.h b/src/libmowgli/base/mowgli_signal.h
index cc3db11..b194d8d 100644
--- a/src/libmowgli/mowgli_signal.h
+++ b/src/libmowgli/base/mowgli_signal.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_signal.c: Safe signal handling.
+ * mowgli_signal.h: Safe signal handling.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_random.c b/src/libmowgli/base/random.c
index cd6d03e..b316033 100644
--- a/src/libmowgli/mowgli_random.c
+++ b/src/libmowgli/base/random.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_random.c: Portable mersinne-twister based psuedo-random number generator.
+ * random.c: Portable mersinne-twister based psuedo-random number generator.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Algorithm copyright (c) 1999-2007 Takuji Nishimura and Makoto Matsumoto
@@ -42,7 +42,7 @@ struct mowgli_random_
static mowgli_object_class_t klass;
/* initialization */
-void mowgli_random_init(void)
+void mowgli_random_bootstrap(void)
{
mowgli_object_class_init(&klass, "mowgli_random_t", NULL, FALSE);
}
@@ -109,8 +109,8 @@ unsigned int mowgli_random_int(mowgli_random_t *self)
/* tempering */
y ^= (y >> 11);
- y ^= (y >> 7) & 0x9d2c5680U;
- y ^= (y >> 15) & 0xefc60000U;
+ y ^= (y << 7) & 0x9d2c5680U;
+ y ^= (y << 15) & 0xefc60000U;
y ^= (y >> 18);
return y;
@@ -118,7 +118,7 @@ unsigned int mowgli_random_int(mowgli_random_t *self)
int mowgli_random_int_ranged(mowgli_random_t *self, int begin, int end)
{
- int dist = end - begin;
+ unsigned int dist = end - begin;
unsigned int max, ret;
if (dist <= 0x80000000U)
diff --git a/src/libmowgli/mowgli_random.h b/src/libmowgli/base/random.h
index 6fb0e61..ea53dd7 100644
--- a/src/libmowgli/mowgli_random.h
+++ b/src/libmowgli/base/random.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_random.h: Portable mersinne-twister based psuedo-random number generator.
+ * random.h: Portable mersinne-twister based psuedo-random number generator.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -29,7 +29,7 @@ struct mowgli_random_;
typedef struct mowgli_random_ mowgli_random_t;
/* object class initialization. */
-extern void mowgli_random_init(void);
+extern void mowgli_random_bootstrap(void);
/* construction and destruction. */
extern mowgli_random_t *mowgli_random_create(void);
diff --git a/src/libmowgli/container/Makefile b/src/libmowgli/container/Makefile
new file mode 100644
index 0000000..1c97ee9
--- /dev/null
+++ b/src/libmowgli/container/Makefile
@@ -0,0 +1,23 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_CONTAINER}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_CONTAINER}
+
+SRCS = dictionary.c \
+ list.c \
+ queue.c \
+ index.c \
+ patricia.c
+
+INCLUDES = dictionary.h \
+ list.h \
+ queue.h \
+ index.h \
+ patricia.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/container
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/mowgli_dictionary.c b/src/libmowgli/container/dictionary.c
index abcb2f9..22445d7 100644
--- a/src/libmowgli/mowgli_dictionary.c
+++ b/src/libmowgli/container/dictionary.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_dictionary.c: Dictionary-based information storage.
+ * dictionary.c: Dictionary-based information storage.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Jilles Tjoelker <jilles -at- stack.nl>
@@ -32,20 +32,9 @@ struct mowgli_dictionary_
mowgli_dictionary_elem_t *root, *head, *tail;
unsigned int count;
char *id;
- mowgli_boolean_t dirty;
+ bool dirty;
};
-static void warn_deprecated (void)
-{
- static char warned = 0;
- if (warned)
- return;
-
- printf("mowgli_dictionary is deprecated and pending removal in Mowgli 1.0 "
- "series.\nPlease use mowgli_patricia instead.\n");
- warned = 1;
-}
-
/*
* mowgli_dictionary_create(mowgli_dictionary_comparator_func_t compare_cb)
*
@@ -70,7 +59,6 @@ mowgli_dictionary_t *mowgli_dictionary_create(mowgli_dictionary_comparator_func_
if (!elem_heap)
elem_heap = mowgli_heap_create(sizeof(mowgli_dictionary_elem_t), 1024, BH_NOW);
- warn_deprecated();
return dtree;
}
@@ -102,7 +90,6 @@ mowgli_dictionary_t *mowgli_dictionary_create_named(const char *name,
if (!elem_heap)
elem_heap = mowgli_heap_create(sizeof(mowgli_dictionary_elem_t), 1024, BH_NOW);
- warn_deprecated();
return dtree;
}
@@ -156,7 +143,7 @@ mowgli_dictionary_get_comparator_func(mowgli_dictionary_t *dict)
/*
* mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict,
- * const char *key)
+ * const void *key)
*
* Gets a linear index number for key.
*
@@ -171,7 +158,7 @@ mowgli_dictionary_get_comparator_func(mowgli_dictionary_t *dict)
* - rebuilds the linear index if the tree is marked as dirty.
*/
int
-mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const char *key)
+mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const void *key)
{
mowgli_dictionary_elem_t *elem;
@@ -192,14 +179,14 @@ mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const char *key)
for (delem = dict->head, i = 0; delem != NULL; delem = delem->next, i++)
delem->position = i;
- dict->dirty = FALSE;
+ dict->dirty = false;
}
return elem->position;
}
/*
- * mowgli_dictionary_retune(mowgli_dictionary_t *dict, const char *key)
+ * mowgli_dictionary_retune(mowgli_dictionary_t *dict, const void *key)
*
* Retunes the tree, self-optimizing for the element which belongs to key.
*
@@ -247,10 +234,10 @@ mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const char *key)
* - a new root node is nominated.
*/
void
-mowgli_dictionary_retune(mowgli_dictionary_t *dict, const char *key)
+mowgli_dictionary_retune(mowgli_dictionary_t *dict, const void *key)
{
mowgli_dictionary_elem_t n, *tn, *left, *right, *node;
- int ret;
+ ptrdiff_t ret;
return_if_fail(dict != NULL);
@@ -352,7 +339,7 @@ mowgli_dictionary_link(mowgli_dictionary_t *dict,
return_if_fail(dict != NULL);
return_if_fail(delem != NULL);
- dict->dirty = TRUE;
+ dict->dirty = true;
dict->count++;
@@ -430,7 +417,7 @@ mowgli_dictionary_unlink_root(mowgli_dictionary_t *dict)
{
mowgli_dictionary_elem_t *delem, *nextnode, *parentofnext;
- dict->dirty = TRUE;
+ dict->dirty = true;
delem = dict->root;
if (delem == NULL)
@@ -515,7 +502,6 @@ void mowgli_dictionary_destroy(mowgli_dictionary_t *dtree,
if (destroy_cb != NULL)
(*destroy_cb)(n, privdata);
- mowgli_free(n->key);
mowgli_heap_free(elem_heap, n);
}
@@ -701,7 +687,7 @@ void mowgli_dictionary_foreach_next(mowgli_dictionary_t *dtree,
}
/*
- * mowgli_dictionary_find(mowgli_dictionary_t *dtree, const char *key)
+ * mowgli_dictionary_find(mowgli_dictionary_t *dtree, const void *key)
*
* Looks up a DTree node by name.
*
@@ -716,7 +702,7 @@ void mowgli_dictionary_foreach_next(mowgli_dictionary_t *dtree,
* Side Effects:
* - none
*/
-mowgli_dictionary_elem_t *mowgli_dictionary_find(mowgli_dictionary_t *dict, const char *key)
+mowgli_dictionary_elem_t *mowgli_dictionary_find(mowgli_dictionary_t *dict, const void *key)
{
return_val_if_fail(dict != NULL, NULL);
return_val_if_fail(key != NULL, NULL);
@@ -731,7 +717,7 @@ mowgli_dictionary_elem_t *mowgli_dictionary_find(mowgli_dictionary_t *dict, cons
}
/*
- * mowgli_dictionary_add(mowgli_dictionary_t *dtree, const char *key, void *data)
+ * mowgli_dictionary_add(mowgli_dictionary_t *dtree, const void *key, void *data)
*
* Creates a new DTree node and binds data to it.
*
@@ -747,7 +733,7 @@ mowgli_dictionary_elem_t *mowgli_dictionary_find(mowgli_dictionary_t *dict, cons
* Side Effects:
* - data is inserted into the DTree.
*/
-mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dict, const char *key, void *data)
+mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dict, const void *key, void *data)
{
mowgli_dictionary_elem_t *delem;
@@ -757,7 +743,7 @@ mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dict, const
return_val_if_fail(mowgli_dictionary_find(dict, key) == NULL, NULL);
delem = mowgli_heap_alloc(elem_heap);
- delem->key = strdup(key);
+ delem->key = key;
delem->data = data;
if (delem->key == NULL)
@@ -773,7 +759,7 @@ mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dict, const
}
/*
- * mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const char *key)
+ * mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const void *key)
*
* Deletes data from a dictionary tree.
*
@@ -791,7 +777,7 @@ mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dict, const
* Notes:
* - the returned data needs to be mowgli_freed/released manually!
*/
-void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const char *key)
+void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const void *key)
{
mowgli_dictionary_elem_t *delem = mowgli_dictionary_find(dtree, key);
void *data;
@@ -801,7 +787,6 @@ void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const char *key)
data = delem->data;
- mowgli_free(delem->key);
mowgli_dictionary_unlink_root(dtree);
mowgli_heap_free(elem_heap, delem);
@@ -809,7 +794,7 @@ void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const char *key)
}
/*
- * mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const char *key)
+ * mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const void *key)
*
* Retrieves data from a dictionary.
*
@@ -824,7 +809,7 @@ void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const char *key)
* Side Effects:
* - none
*/
-void *mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const char *key)
+void *mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const void *key)
{
mowgli_dictionary_elem_t *delem = mowgli_dictionary_find(dtree, key);
diff --git a/src/libmowgli/mowgli_dictionary.h b/src/libmowgli/container/dictionary.h
index 884cde4..3c2f4e5 100644
--- a/src/libmowgli/mowgli_dictionary.h
+++ b/src/libmowgli/container/dictionary.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_dictionary.h: Dictionary-based storage.
+ * dictionary.h: Dictionary-based storage.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Jilles Tjoelker <jilles -at- stack.nl>
@@ -31,13 +31,13 @@ typedef struct mowgli_dictionary_ mowgli_dictionary_t;
typedef struct mowgli_dictionary_elem_ mowgli_dictionary_elem_t;
-typedef int (*mowgli_dictionary_comparator_func_t)(const char *a, const char *b);
+typedef ptrdiff_t (*mowgli_dictionary_comparator_func_t)(const void *a, const void *b);
struct mowgli_dictionary_elem_
{
mowgli_dictionary_elem_t *left, *right, *prev, *next;
void *data;
- char *key;
+ const void *key;
int position;
};
@@ -63,32 +63,32 @@ typedef struct mowgli_dictionary_iteration_state_ mowgli_dictionary_iteration_st
* compare_cb is the comparison function, typically strcmp, strcasecmp or
* irccasecmp.
*/
-extern mowgli_dictionary_t *mowgli_dictionary_create(mowgli_dictionary_comparator_func_t compare_cb) MOWGLI_DEPRECATED;
+extern mowgli_dictionary_t *mowgli_dictionary_create(mowgli_dictionary_comparator_func_t compare_cb);
/*
* mowgli_dictionary_create_named() creates a new dictionary tree which has a name.
* name is the name, compare_cb is the comparator.
*/
-extern mowgli_dictionary_t *mowgli_dictionary_create_named(const char *name, mowgli_dictionary_comparator_func_t compare_cb) MOWGLI_DEPRECATED;
+extern mowgli_dictionary_t *mowgli_dictionary_create_named(const char *name, mowgli_dictionary_comparator_func_t compare_cb);
/*
* mowgli_dictionary_set_comparator_func() resets the comparator used for lookups and
* insertions in the DTree structure.
*/
extern void mowgli_dictionary_set_comparator_func(mowgli_dictionary_t *dict,
- mowgli_dictionary_comparator_func_t compare_cb) MOWGLI_DEPRECATED;
+ mowgli_dictionary_comparator_func_t compare_cb);
/*
* mowgli_dictionary_get_comparator_func() returns the comparator used for lookups and
* insertions in the DTree structure.
*/
-extern mowgli_dictionary_comparator_func_t mowgli_dictionary_get_comparator_func(mowgli_dictionary_t *dict) MOWGLI_DEPRECATED;
+extern mowgli_dictionary_comparator_func_t mowgli_dictionary_get_comparator_func(mowgli_dictionary_t *dict);
/*
* mowgli_dictionary_get_linear_index() returns the linear index of an object in the
* DTree structure.
*/
-extern int mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const char *key) MOWGLI_DEPRECATED;
+extern int mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const void *key);
/*
* mowgli_dictionary_destroy() destroys all entries in a dtree, and also optionally calls
@@ -96,7 +96,7 @@ extern int mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const c
*/
extern void mowgli_dictionary_destroy(mowgli_dictionary_t *dtree,
void (*destroy_cb)(mowgli_dictionary_elem_t *delem, void *privdata),
- void *privdata) MOWGLI_DEPRECATED;
+ void *privdata);
/*
* mowgli_dictionary_foreach() iterates all entries in a dtree, and also optionally calls
@@ -106,7 +106,7 @@ extern void mowgli_dictionary_destroy(mowgli_dictionary_t *dtree,
*/
extern void mowgli_dictionary_foreach(mowgli_dictionary_t *dtree,
int (*foreach_cb)(mowgli_dictionary_elem_t *delem, void *privdata),
- void *privdata) MOWGLI_DEPRECATED;
+ void *privdata);
/*
* mowgli_dictionary_search() iterates all entries in a dtree, and also optionally calls
@@ -117,7 +117,7 @@ extern void mowgli_dictionary_foreach(mowgli_dictionary_t *dtree,
*/
extern void *mowgli_dictionary_search(mowgli_dictionary_t *dtree,
void *(*foreach_cb)(mowgli_dictionary_elem_t *delem, void *privdata),
- void *privdata) MOWGLI_DEPRECATED;
+ void *privdata);
/*
* mowgli_dictionary_foreach_start() begins an iteration over all items
@@ -126,41 +126,41 @@ extern void *mowgli_dictionary_search(mowgli_dictionary_t *dtree,
* of the iteration (but not any other element).
*/
extern void mowgli_dictionary_foreach_start(mowgli_dictionary_t *dtree,
- mowgli_dictionary_iteration_state_t *state) MOWGLI_DEPRECATED;
+ mowgli_dictionary_iteration_state_t *state);
/*
* mowgli_dictionary_foreach_cur() returns the current element of the iteration,
* or NULL if there are no more elements.
*/
extern void *mowgli_dictionary_foreach_cur(mowgli_dictionary_t *dtree,
- mowgli_dictionary_iteration_state_t *state) MOWGLI_DEPRECATED;
+ mowgli_dictionary_iteration_state_t *state);
/*
* mowgli_dictionary_foreach_next() moves to the next element.
*/
extern void mowgli_dictionary_foreach_next(mowgli_dictionary_t *dtree,
- mowgli_dictionary_iteration_state_t *state) MOWGLI_DEPRECATED;
+ mowgli_dictionary_iteration_state_t *state);
/*
* mowgli_dictionary_add() adds a key->value entry to the dictionary tree.
*/
-extern mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dtree, const char *key, void *data) MOWGLI_DEPRECATED;
+extern mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dtree, const void *key, void *data);
/*
* mowgli_dictionary_find() returns a mowgli_dictionary_elem_t container from a dtree for key 'key'.
*/
-extern mowgli_dictionary_elem_t *mowgli_dictionary_find(mowgli_dictionary_t *dtree, const char *key) MOWGLI_DEPRECATED;
+extern mowgli_dictionary_elem_t *mowgli_dictionary_find(mowgli_dictionary_t *dtree, const void *key);
/*
* mowgli_dictionary_find() returns data from a dtree for key 'key'.
*/
-extern void *mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const char *key) MOWGLI_DEPRECATED;
+extern void *mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const void *key);
/*
* mowgli_dictionary_delete() deletes a key->value entry from the dictionary tree.
*/
-extern void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const char *key) MOWGLI_DEPRECATED;
+extern void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const void *key);
-void mowgli_dictionary_stats(mowgli_dictionary_t *dict, void (*cb)(const char *line, void *privdata), void *privdata) MOWGLI_DEPRECATED;
+void mowgli_dictionary_stats(mowgli_dictionary_t *dict, void (*cb)(const char *line, void *privdata), void *privdata);
#endif
diff --git a/src/libmowgli/mowgli_index.c b/src/libmowgli/container/index.c
index b96b45e..81776f5 100644
--- a/src/libmowgli/mowgli_index.c
+++ b/src/libmowgli/container/index.c
@@ -20,7 +20,7 @@
#include <stdlib.h>
#include <string.h>
-#include <mowgli.h>
+#include "mowgli.h"
struct mowgli_index_
{
@@ -63,16 +63,28 @@ int mowgli_index_count (mowgli_index_t * index)
void mowgli_index_allocate (mowgli_index_t * index, int size)
{
+ size_t oldsize;
+ void *new_ptr;
+
if (size <= index->size)
return;
if (! index->size)
index->size = 64;
+ oldsize = index->size;
while (size > index->size)
index->size <<= 1;
- index->data = realloc (index->data, sizeof (void *) * index->size);
+ new_ptr = mowgli_alloc_array(sizeof (void *), index->size);
+
+ if (index->data != NULL)
+ {
+ memcpy(new_ptr, index->data, oldsize);
+ mowgli_free(index->data);
+ }
+
+ index->data = new_ptr;
}
void mowgli_index_set (mowgli_index_t * index, int at, void * value)
diff --git a/src/libmowgli/mowgli_index.h b/src/libmowgli/container/index.h
index 85e9e72..85e9e72 100644
--- a/src/libmowgli/mowgli_index.h
+++ b/src/libmowgli/container/index.h
diff --git a/src/libmowgli/mowgli_list.c b/src/libmowgli/container/list.c
index 0e33103..6283910 100644
--- a/src/libmowgli/mowgli_list.c
+++ b/src/libmowgli/container/list.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_list.c: Linked lists.
+ * list.c: Linked lists.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -26,7 +26,7 @@
static mowgli_heap_t *mowgli_node_heap;
static mowgli_heap_t *mowgli_list_heap;
-void mowgli_node_init(void)
+void mowgli_node_bootstrap(void)
{
mowgli_node_heap = mowgli_heap_create(sizeof(mowgli_node_t), 1024, BH_NOW);
mowgli_list_heap = mowgli_heap_create(sizeof(mowgli_list_t), 64, BH_NOW);
@@ -141,7 +141,10 @@ void mowgli_node_add_before(void *data, mowgli_node_t *n, mowgli_list_t *l, mowg
n->prev = before->prev;
n->next = before;
before->prev = n;
- n->prev->next = n;
+
+ if (n->prev != NULL)
+ n->prev->next = n;
+
l->count++;
}
}
@@ -166,16 +169,13 @@ void mowgli_node_add_after(void *data, mowgli_node_t *n, mowgli_list_t *l, mowgl
}
/* retrieves a node at `position` position. */
-mowgli_node_t *mowgli_node_nth(mowgli_list_t *l, int pos)
+mowgli_node_t *mowgli_node_nth(mowgli_list_t *l, size_t pos)
{
- int iter;
+ size_t iter;
mowgli_node_t *n;
return_val_if_fail(l != NULL, NULL);
- if (pos < 0)
- return NULL;
-
/* locate the proper position. */
if (pos < MOWGLI_LIST_LENGTH(l) / 2)
for (iter = 0, n = l->head; iter != pos && n != NULL; iter++, n = n->next);
@@ -187,7 +187,7 @@ mowgli_node_t *mowgli_node_nth(mowgli_list_t *l, int pos)
}
/* returns the data from node at `position` position, or NULL. */
-void *mowgli_node_nth_data(mowgli_list_t *l, int pos)
+void *mowgli_node_nth_data(mowgli_list_t *l, size_t pos)
{
mowgli_node_t *n;
@@ -202,7 +202,7 @@ void *mowgli_node_nth_data(mowgli_list_t *l, int pos)
}
/* inserts a node at `position` position. */
-void mowgli_node_insert(void *data, mowgli_node_t *n, mowgli_list_t *l, int pos)
+void mowgli_node_insert(void *data, mowgli_node_t *n, mowgli_list_t *l, size_t pos)
{
mowgli_node_t *tn;
@@ -216,9 +216,9 @@ void mowgli_node_insert(void *data, mowgli_node_t *n, mowgli_list_t *l, int pos)
}
/* retrieves the index position of a node in a list. */
-int mowgli_node_index(mowgli_node_t *n, mowgli_list_t *l)
+ssize_t mowgli_node_index(mowgli_node_t *n, mowgli_list_t *l)
{
- int iter;
+ ssize_t iter;
mowgli_node_t *tn;
return_val_if_fail(n != NULL, -1);
@@ -227,7 +227,7 @@ int mowgli_node_index(mowgli_node_t *n, mowgli_list_t *l)
/* locate the proper position. */
for (iter = 0, tn = l->head; tn != n && tn != NULL; iter++, tn = tn->next);
- return iter < MOWGLI_LIST_LENGTH(l) ? iter : -1;
+ return iter < (ssize_t) MOWGLI_LIST_LENGTH(l) ? iter : -1;
}
/* deletes a link between a node and a list. */
@@ -319,8 +319,12 @@ void mowgli_list_concat(mowgli_list_t *l, mowgli_list_t *l2)
return_if_fail(l != NULL);
return_if_fail(l2 != NULL);
- l->tail->next = l2->head;
- l->tail->next->prev = l->tail;
+ if (l->tail != NULL)
+ l->tail->next = l2->head;
+
+ if (l->tail->next != NULL)
+ l->tail->next->prev = l->tail;
+
l->tail = l2->tail;
l->count += l2->count;
diff --git a/src/libmowgli/mowgli_list.h b/src/libmowgli/container/list.h
index 2699686..19905b4 100644
--- a/src/libmowgli/mowgli_list.h
+++ b/src/libmowgli/container/list.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_list.c: Linked lists.
+ * list.h: Linked lists.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -50,20 +50,20 @@ struct mowgli_list_
size_t count; /* how many entries in the list */
};
-extern void mowgli_node_init(void);
+extern void mowgli_node_bootstrap(void);
extern mowgli_node_t *mowgli_node_create(void);
extern void mowgli_node_free(mowgli_node_t *n);
extern void mowgli_node_add(void *data, mowgli_node_t *n, mowgli_list_t *l);
extern void mowgli_node_add_head(void *data, mowgli_node_t *n, mowgli_list_t *l);
extern void mowgli_node_add_before(void *data, mowgli_node_t *n, mowgli_list_t *l, mowgli_node_t *before);
extern void mowgli_node_add_after(void *data, mowgli_node_t *n, mowgli_list_t *l, mowgli_node_t *before);
-extern void mowgli_node_insert(void *data, mowgli_node_t *n, mowgli_list_t *l, int position);
-extern int mowgli_node_index(mowgli_node_t *n, mowgli_list_t *l);
+extern void mowgli_node_insert(void *data, mowgli_node_t *n, mowgli_list_t *l, size_t position);
+extern ssize_t mowgli_node_index(mowgli_node_t *n, mowgli_list_t *l);
extern void mowgli_node_delete(mowgli_node_t *n, mowgli_list_t *l);
extern mowgli_node_t *mowgli_node_find(void *data, mowgli_list_t *l);
extern void mowgli_node_move(mowgli_node_t *m, mowgli_list_t *oldlist, mowgli_list_t *newlist);
-extern mowgli_node_t *mowgli_node_nth(mowgli_list_t *l, int pos);
-extern void *mowgli_node_nth_data(mowgli_list_t *l, int pos);
+extern mowgli_node_t *mowgli_node_nth(mowgli_list_t *l, size_t pos);
+extern void *mowgli_node_nth_data(mowgli_list_t *l, size_t pos);
typedef int (*mowgli_list_comparator_t)(mowgli_node_t *n, mowgli_node_t *n2, void *opaque);
diff --git a/src/libmowgli/mowgli_patricia.c b/src/libmowgli/container/patricia.c
index cf9af5c..b530d33 100644
--- a/src/libmowgli/mowgli_patricia.c
+++ b/src/libmowgli/container/patricia.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_patricia.c: Dictionary-based information storage.
+ * patricia.c: Dictionary-based information storage.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007-2010 Jilles Tjoelker <jilles -at- stack.nl>
@@ -193,7 +193,7 @@ mowgli_patricia_t *mowgli_patricia_create_named(const char *name,
mowgli_patricia_t *dtree = (mowgli_patricia_t *) mowgli_alloc(sizeof(mowgli_patricia_t));
dtree->canonize_cb = canonize_cb;
- dtree->id = strdup(name);
+ dtree->id = mowgli_strdup(name);
if (!leaf_heap)
leaf_heap = mowgli_heap_create(sizeof(struct patricia_leaf), 1024, BH_NOW);
@@ -206,6 +206,31 @@ mowgli_patricia_t *mowgli_patricia_create_named(const char *name,
}
/*
+ * mowgli_patricia_shutdown(void)
+ *
+ * Clean up after patricia to ensure all memory is released as soon as
+ * possible (destroys both heaps).
+ *
+ * Inputs:
+ * - nothing
+ *
+ * Outputs:
+ * - nothing
+ *
+ * Side Effects:
+ * - patricia's internal heaps are destroyed and deallocated
+ */
+void mowgli_patricia_shutdown(void)
+{
+ if(leaf_heap)
+ mowgli_heap_destroy(leaf_heap);
+ if(node_heap)
+ mowgli_heap_destroy(node_heap);
+
+ return;
+}
+
+/*
* mowgli_patricia_destroy(mowgli_patricia_t *dtree,
* void (*destroy_cb)(const char *key, void *data, void *privdata),
* void *privdata);
@@ -571,9 +596,9 @@ struct patricia_leaf *mowgli_patricia_elem_find(mowgli_patricia_t *dict, const c
ckey = key;
else
{
- if (keylen >= sizeof ckey_store)
+ if (keylen >= (int) sizeof(ckey_store))
{
- ckey_buf = strdup(key);
+ ckey_buf = mowgli_strdup(key);
dict->canonize_cb(ckey_buf);
ckey = ckey_buf;
}
@@ -599,7 +624,7 @@ struct patricia_leaf *mowgli_patricia_elem_find(mowgli_patricia_t *dict, const c
delem = NULL;
if (ckey_buf != NULL)
- free(ckey_buf);
+ mowgli_free(ckey_buf);
return &delem->leaf;
}
@@ -634,7 +659,7 @@ struct patricia_leaf *mowgli_patricia_elem_add(mowgli_patricia_t *dict, const ch
return_val_if_fail(data != NULL, FALSE);
keylen = strlen(key);
- ckey = strdup(key);
+ ckey = mowgli_strdup(key);
if (ckey == NULL)
{
mowgli_log("major WTF: ckey is NULL, not adding node.");
@@ -659,7 +684,7 @@ struct patricia_leaf *mowgli_patricia_elem_add(mowgli_patricia_t *dict, const ch
if (delem != NULL && !strcmp(delem->leaf.key, ckey))
{
mowgli_log("Key is already in dict, ignoring duplicate");
- free(ckey);
+ mowgli_free(ckey);
return NULL;
}
@@ -675,6 +700,7 @@ struct patricia_leaf *mowgli_patricia_elem_add(mowgli_patricia_t *dict, const ch
soft_assert(dict->count == 0);
place1 = &dict->root;
*place1 = mowgli_heap_alloc(leaf_heap);
+ return_val_if_fail(*place1 != NULL, NULL);
(*place1)->nibnum = -1;
(*place1)->leaf.data = data;
(*place1)->leaf.key = ckey;
@@ -697,6 +723,7 @@ struct patricia_leaf *mowgli_patricia_elem_add(mowgli_patricia_t *dict, const ch
{
/* Insert new node below prev */
newnode = mowgli_heap_alloc(node_heap);
+ return_val_if_fail(newnode != NULL, NULL);
newnode->nibnum = i;
newnode->node.parent = prev;
newnode->node.parent_val = val;
@@ -744,6 +771,7 @@ struct patricia_leaf *mowgli_patricia_elem_add(mowgli_patricia_t *dict, const ch
place1 = &newnode->node.down[val];
soft_assert(*place1 == NULL);
*place1 = mowgli_heap_alloc(leaf_heap);
+ return_val_if_fail(*place1 != NULL, NULL);
(*place1)->nibnum = -1;
(*place1)->leaf.data = data;
(*place1)->leaf.key = ckey;
@@ -796,6 +824,9 @@ void mowgli_patricia_elem_delete(mowgli_patricia_t *dict, struct patricia_leaf *
union patricia_elem *delem, *prev, *next;
int val, i, used;
+ return_if_fail(dict != NULL);
+ return_if_fail(leaf != NULL);
+
delem = (union patricia_elem *)leaf;
val = delem->leaf.parent_val;
@@ -878,16 +909,22 @@ void *mowgli_patricia_retrieve(mowgli_patricia_t *dtree, const char *key)
const char *mowgli_patricia_elem_get_key(struct patricia_leaf *leaf)
{
+ return_val_if_fail(leaf != NULL, NULL);
+
return leaf->key;
}
void mowgli_patricia_elem_set_data(struct patricia_leaf *leaf, void *data)
{
+ return_if_fail(leaf != NULL);
+
leaf->data = data;
}
void *mowgli_patricia_elem_get_data(struct patricia_leaf *leaf)
{
+ return_val_if_fail(leaf != NULL, NULL);
+
return leaf->data;
}
diff --git a/src/libmowgli/mowgli_patricia.h b/src/libmowgli/container/patricia.h
index 6c2c669..417ba62 100644
--- a/src/libmowgli/mowgli_patricia.h
+++ b/src/libmowgli/container/patricia.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_patricia.h: Dictionary-based storage.
+ * patricia.h: Dictionary-based storage.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007-2008 Jilles Tjoelker <jilles -at- stack.nl>
@@ -69,6 +69,13 @@ typedef struct mowgli_patricia_iteration_state_ mowgli_patricia_iteration_state_
extern mowgli_patricia_t *mowgli_patricia_create(void (*canonize_cb)(char *key));
/*
+ * mowgli_patricia_shutdown() deallocates all heaps used in patricia trees. This is
+ * useful on embedded devices with little memory, and/or when you know you won't need
+ * any more patricia trees.
+ */
+extern void mowgli_patricia_shutdown(void);
+
+/*
* mowgli_patricia_destroy() destroys all entries in a dtree, and also optionally calls
* a defined callback function to destroy any data attached to it.
*/
diff --git a/src/libmowgli/mowgli_queue.c b/src/libmowgli/container/queue.c
index f27ff50..39150d3 100644
--- a/src/libmowgli/mowgli_queue.c
+++ b/src/libmowgli/container/queue.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_queue.c: Double-ended queues, also known as deque.
+ * queue.c: Double-ended queues, also known as deque.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -26,7 +26,7 @@
static mowgli_heap_t *mowgli_queue_heap = NULL;
void
-mowgli_queue_init(void)
+mowgli_queue_bootstrap(void)
{
mowgli_queue_heap = mowgli_heap_create(sizeof(mowgli_queue_t), 256, BH_NOW);
@@ -39,6 +39,8 @@ mowgli_queue_shift(mowgli_queue_t *head, void *data)
{
mowgli_queue_t *out = mowgli_heap_alloc(mowgli_queue_heap);
+ return_val_if_fail(head != NULL, NULL);
+
out->next = head;
out->data = data;
@@ -60,6 +62,8 @@ mowgli_queue_push(mowgli_queue_t *head, void *data)
{
mowgli_queue_t *out = mowgli_heap_alloc(mowgli_queue_heap);
+ return_val_if_fail(head != NULL, NULL);
+
out->prev = head;
out->data = data;
@@ -74,6 +78,8 @@ mowgli_queue_remove(mowgli_queue_t *head)
{
mowgli_queue_t *out;
+ return_val_if_fail(head != NULL, NULL);
+
if (head->prev != NULL)
head->prev->next = head->next;
@@ -92,6 +98,8 @@ mowgli_queue_find(mowgli_queue_t *head, void *data)
{
mowgli_queue_t *n;
+ return_val_if_fail(head != NULL, NULL);
+
for (n = head; n != NULL; n = n->next)
if (n->data == data)
return n;
@@ -104,6 +112,8 @@ mowgli_queue_remove_data(mowgli_queue_t *head, void *data)
{
mowgli_queue_t *n = mowgli_queue_find(head, data);
+ return_val_if_fail(head != NULL, NULL);
+
if (n != NULL)
return mowgli_queue_remove(n);
@@ -115,6 +125,8 @@ mowgli_queue_destroy(mowgli_queue_t *head)
{
mowgli_queue_t *n, *n2;
+ return_if_fail(head != NULL);
+
for (n = head, n2 = n ? n->next : NULL; n != NULL; n = n2, n2 = n ? n->next : NULL)
mowgli_queue_remove(n);
}
@@ -125,6 +137,8 @@ mowgli_queue_skip(mowgli_queue_t *head, int nodes)
mowgli_queue_t *n;
int iter;
+ return_val_if_fail(head != NULL, NULL);
+
for (iter = 0, n = head; n != NULL && iter < nodes; n = n->next, iter++);
return n;
@@ -136,6 +150,8 @@ mowgli_queue_rewind(mowgli_queue_t *head, int nodes)
mowgli_queue_t *n;
int iter;
+ return_val_if_fail(head != NULL, NULL);
+
for (iter = 0, n = head; n != NULL && iter < nodes; n = n->prev, iter++);
return n;
@@ -146,6 +162,8 @@ mowgli_queue_head(mowgli_queue_t *n)
{
mowgli_queue_t *tn;
+ return_val_if_fail(n != NULL, NULL);
+
for (tn = n; tn != NULL && tn->prev != NULL; tn = tn->prev);
return tn;
@@ -156,6 +174,8 @@ mowgli_queue_tail(mowgli_queue_t *n)
{
mowgli_queue_t *tn;
+ return_val_if_fail(n != NULL, NULL);
+
for (tn = n; tn != NULL && tn->next != NULL; tn = tn->next);
return tn;
@@ -203,6 +223,8 @@ mowgli_queue_length(mowgli_queue_t *head)
int iter;
mowgli_queue_t *n;
+ return_val_if_fail(head != NULL, -1);
+
for (n = head, iter = 0; n != NULL; n = n->next, iter++);
return iter;
diff --git a/src/libmowgli/mowgli_queue.h b/src/libmowgli/container/queue.h
index 2d3b16b..7f8d995 100644
--- a/src/libmowgli/mowgli_queue.h
+++ b/src/libmowgli/container/queue.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_queue.h: Double-ended queues, also known as deque.
+ * queue.h: Double-ended queues, also known as deque.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -26,7 +26,7 @@
typedef mowgli_iterator_t mowgli_queue_t;
-extern void mowgli_queue_init(void);
+extern void mowgli_queue_bootstrap(void);
extern mowgli_queue_t *mowgli_queue_push(mowgli_queue_t *head, void *data);
extern mowgli_queue_t *mowgli_queue_shift(mowgli_queue_t *head, void *data);
extern mowgli_queue_t *mowgli_queue_remove(mowgli_queue_t *head);
diff --git a/src/libmowgli/dns/Makefile b/src/libmowgli/dns/Makefile
new file mode 100644
index 0000000..06fb36c
--- /dev/null
+++ b/src/libmowgli/dns/Makefile
@@ -0,0 +1,20 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_DNS}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_DNS}
+
+SRCS = dns.c \
+ dns_evloop_res.c \
+ dns_evloop_reslib.c \
+ dns_evloop_reslist_win32.c
+
+INCLUDES = dns.h \
+ dns_evloop_res.h \
+ dns_evloop_reslib.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/dns
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/dns/dns.c b/src/libmowgli/dns/dns.c
new file mode 100644
index 0000000..eff5080
--- /dev/null
+++ b/src/libmowgli/dns/dns.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "dns.h"
+
+mowgli_dns_t * mowgli_dns_create(mowgli_eventloop_t *eventloop, int implementation)
+{
+ mowgli_dns_t *dns = mowgli_alloc(sizeof(mowgli_dns_t));
+ const mowgli_dns_ops_t *ops;
+
+ switch (implementation)
+ {
+ case MOWGLI_DNS_TYPE_CUSTOM:
+ return dns;
+ case MOWGLI_DNS_TYPE_ASYNC:
+ default:
+ ops = &mowgli_dns_evloop_resolver;
+ break;
+ }
+
+ if (mowgli_dns_init(dns, eventloop, ops) != 0)
+ {
+ mowgli_free(dns);
+ return NULL;
+ }
+
+ return dns;
+}
+
+int mowgli_dns_init(mowgli_dns_t *dns, mowgli_eventloop_t *eventloop, const mowgli_dns_ops_t *ops)
+{
+ return_val_if_fail(dns != NULL, -1);
+
+ dns->dns_ops = ops;
+
+ return dns->dns_ops->mowgli_dns_init_func_t(dns, eventloop);
+}
+
+void mowgli_dns_destroy(mowgli_dns_t *dns)
+{
+ dns->dns_ops->mowgli_dns_fini_func_t(dns);
+
+ mowgli_free(dns);
+}
+
+int mowgli_dns_restart(mowgli_dns_t *dns)
+{
+ return dns->dns_ops->mowgli_dns_restart_func_t(dns);
+}
+
+void mowgli_dns_delete_query(mowgli_dns_t *dns, const mowgli_dns_query_t *query)
+{
+ dns->dns_ops->mowgli_dns_delete_query_func_t(dns, query);
+}
+
+void mowgli_dns_gethost_byname(mowgli_dns_t *dns, const char *name, mowgli_dns_query_t *query, int type)
+{
+ dns->dns_ops->mowgli_dns_gethost_byname_func_t(dns, name, query, type);
+}
+
+void mowgli_dns_gethost_byaddr(mowgli_dns_t *dns, const struct sockaddr_storage *addr, mowgli_dns_query_t *query)
+{
+ dns->dns_ops->mowgli_dns_gethost_byaddr_func_t(dns, addr, query);
+}
+
diff --git a/src/libmowgli/dns/dns.h b/src/libmowgli/dns/dns.h
new file mode 100644
index 0000000..9cbb6ee
--- /dev/null
+++ b/src/libmowgli/dns/dns.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_DNS_DNS_H__
+#define __MOWGLI_DNS_DNS_H__
+
+#include "mowgli.h"
+
+/* Longest hostname we're willing to work with */
+#define MOWGLI_DNS_RES_HOSTLEN 512
+
+/* Resolver types */
+#define MOWGLI_DNS_TYPE_CUSTOM 0
+#define MOWGLI_DNS_TYPE_ASYNC 1
+#define MOWGLI_DNS_TYPE_HELPER 2
+
+/* Lookup types */
+#define MOWGLI_DNS_T_A 1
+#define MOWGLI_DNS_T_AAAA 28
+#define MOWGLI_DNS_T_PTR 12
+#define MOWGLI_DNS_T_CNAME 5
+#define MOWGLI_DNS_T_MX 15
+#define MOWGLI_DNS_T_TXT 16
+#define MOWGLI_DNS_T_SSHFP 44
+#define MOWGLI_DNS_T_NULL 10
+
+/* Return codes */
+#define MOWGLI_DNS_RES_SUCCESS 0
+#define MOWGLI_DNS_RES_NXDOMAIN 1
+#define MOWGLI_DNS_RES_INVALID 2
+#define MOWGLI_DNS_RES_TIMEOUT 3
+
+typedef struct _mowgli_dns_t mowgli_dns_t;
+typedef struct _mowgli_dns_query_t mowgli_dns_query_t;
+typedef struct _mowgli_dns_reply_t mowgli_dns_reply_t;
+
+typedef struct
+{
+ int (*mowgli_dns_init_func_t)(mowgli_dns_t *, mowgli_eventloop_t *);
+ void (*mowgli_dns_fini_func_t)(mowgli_dns_t *);
+ int (*mowgli_dns_restart_func_t)(mowgli_dns_t *);
+ void (*mowgli_dns_delete_query_func_t)(mowgli_dns_t *, const mowgli_dns_query_t *);
+ void (*mowgli_dns_gethost_byname_func_t)(mowgli_dns_t *, const char *, mowgli_dns_query_t *, int);
+ void (*mowgli_dns_gethost_byaddr_func_t)(mowgli_dns_t *, const struct sockaddr_storage *, mowgli_dns_query_t *);
+} mowgli_dns_ops_t;
+
+struct _mowgli_dns_reply_t
+{
+ char *h_name;
+ mowgli_vio_sockaddr_t addr;
+};
+
+struct _mowgli_dns_t
+{
+ int dns_type;
+ const mowgli_dns_ops_t *dns_ops;
+ void *dns_state;
+};
+
+struct _mowgli_dns_query_t
+{
+ void *ptr; /* pointer used by callback to identify request */
+ void (*callback) (mowgli_dns_reply_t * reply, int result, void *vptr); /* callback to call */
+};
+
+extern mowgli_dns_t * mowgli_dns_create(mowgli_eventloop_t *eventloop, int implementation);
+extern int mowgli_dns_init(mowgli_dns_t *dns, mowgli_eventloop_t *eventloop, const mowgli_dns_ops_t *ops);
+extern void mowgli_dns_destroy(mowgli_dns_t *dns);
+extern int mowgli_dns_restart(mowgli_dns_t *dns);
+extern void mowgli_dns_delete_query(mowgli_dns_t *dns, const mowgli_dns_query_t *query);
+extern void mowgli_dns_gethost_byname(mowgli_dns_t *dns, const char *name, mowgli_dns_query_t *query, int type);
+extern void mowgli_dns_gethost_byaddr(mowgli_dns_t *dns, const struct sockaddr_storage *addr, mowgli_dns_query_t *query);
+
+/* Pull in headers that depend on these types */
+#include "dns_evloop_res.h"
+#include "dns_evloop_reslib.h"
+
+#endif
+
diff --git a/src/libmowgli/dns/dns_evloop_res.c b/src/libmowgli/dns/dns_evloop_res.c
new file mode 100644
index 0000000..a97daf5
--- /dev/null
+++ b/src/libmowgli/dns/dns_evloop_res.c
@@ -0,0 +1,1017 @@
+/*
+ * A rewrite of Darren Reeds original res.c As there is nothing
+ * left of Darrens original code, this is now licensed by the hybrid group.
+ * (Well, some of the function names are the same, and bits of the structs..)
+ * You can use it where it is useful, free even. Buy us a beer and stuff.
+ *
+ * The authors takes no responsibility for any damage or loss
+ * of property which results from the use of this software.
+ *
+ * $Id: res.c 3301 2007-03-28 15:04:06Z jilles $
+ * from Hybrid Id: res.c 459 2006-02-12 22:21:37Z db $
+ *
+ * July 1999 - Rewrote a bunch of stuff here. Change hostent builder code,
+ * added callbacks and reference counting of returned hostents.
+ * --Bleep (Thomas Helvey <tomh@inxpress.net>)
+ *
+ * This was all needlessly complicated for irc. Simplified. No more hostent
+ * All we really care about is the IP -> hostname mappings. Thats all.
+ *
+ * Apr 28, 2003 --cryogen and Dianora
+ *
+ * DNS server flooding lessened, AAAA-or-A lookup removed, ip6.int support
+ * removed, various robustness fixes
+ *
+ * 2006 --jilles and nenolod
+ *
+ * Clean up various crap, remove global state. Reindent because two space indent
+ * is hideous. Also remove ancient assumptions that don't make sense anymore (e.g.,
+ * libmowgli targets C99, which specifies an 8-bit char). Pack all this stuff into
+ * its own namespace. Also gutted a lot of needless/one-use/few-line functions.
+ * Jesus, what were they thinking...
+ *
+ * 2012 --Elizacat
+ */
+
+#include "mowgli.h"
+#include "dns.h"
+
+#define MOWGLI_DNS_MAXPACKET 1024 /* rfc sez 512 but we expand names so ... */
+#define MOWGLI_DNS_RES_MAXALIASES 35 /* maximum aliases allowed */
+#define MOWGLI_DNS_RES_MAXADDRS 35 /* maximum addresses allowed */
+#define MOWGLI_DNS_AR_TTL 600 /* TTL in seconds for dns cache entries */
+
+/* RFC 1104/1105 wasn't very helpful about what these fields should be named, so for now, we'll
+ just name them this way. we probably should look at what named calls them or something. */
+#define MOWGLI_DNS_TYPE_SIZE (size_t)2
+#define MOWGLI_DNS_CLASS_SIZE (size_t)2
+#define MOWGLI_DNS_TTL_SIZE (size_t)4
+#define MOWGLI_DNS_RDLENGTH_SIZE (size_t)2
+#define MOWGLI_DNS_ANSWER_FIXED_SIZE (MOWGLI_DNS_TYPE_SIZE + MOWGLI_DNS_CLASS_SIZE + MOWGLI_DNS_TTL_SIZE + MOWGLI_DNS_RDLENGTH_SIZE)
+
+#define MOWGLI_DNS_MAXLINE 128
+
+typedef struct
+{
+ mowgli_node_t node;
+ int id;
+ time_t ttl;
+ char type;
+ char queryname[MOWGLI_DNS_RES_HOSTLEN + 1]; /* name currently being queried */
+ char retries; /* retry counter */
+ char sends; /* number of sends (>1 means resent) */
+ time_t sentat;
+ time_t timeout;
+ unsigned int lastns; /* index of last server sent to */
+ struct sockaddr_storage addr;
+ char *name;
+ mowgli_dns_query_t *query; /* query callback for this request */
+} mowgli_dns_reslist_t;
+
+static mowgli_heap_t *reslist_heap = NULL;
+
+#ifndef _WIN32
+static int parse_resvconf(mowgli_dns_t *dns);
+#else
+static void parse_windows_resolvers(mowgli_dns_t *dns);
+#endif
+
+static void timeout_resolver(void *arg);
+static void add_nameserver(mowgli_dns_t *dns, const char *arg);
+static int res_ourserver(mowgli_dns_t *dns, const struct sockaddr_storage *inp);
+static void rem_request(mowgli_dns_t *dns, mowgli_dns_reslist_t *request);
+static mowgli_dns_reslist_t *make_request(mowgli_dns_t *dns, mowgli_dns_query_t * query);
+static void do_query_name(mowgli_dns_t *dns, mowgli_dns_query_t * query, const char *name, mowgli_dns_reslist_t *request, int);
+static void do_query_number(mowgli_dns_t *dns, mowgli_dns_query_t * query, const struct sockaddr_storage *, mowgli_dns_reslist_t *request);
+static void query_name(mowgli_dns_t *dns, mowgli_dns_reslist_t *request);
+static int send_res_msg(mowgli_dns_t *dns, const char *buf, int len, int count);
+static void resend_query(mowgli_dns_t *dns, mowgli_dns_reslist_t *request);
+static int check_question(mowgli_dns_t *dns, mowgli_dns_reslist_t *request, mowgli_dns_resheader_t * header, char *buf, char *eob);
+static int proc_answer(mowgli_dns_t *dns, mowgli_dns_reslist_t *request, mowgli_dns_resheader_t * header, char *, char *);
+static mowgli_dns_reslist_t *find_id(mowgli_dns_t *dns, int id);
+static mowgli_dns_reply_t *make_dnsreply(mowgli_dns_reslist_t *request);
+static void res_readreply(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata);
+
+/*
+ * mowgli_dns_evloop_init - do everything we need to read the resolv.conf file
+ * and initialize the resolver file descriptor if needed
+ */
+int mowgli_dns_evloop_init(mowgli_dns_t *dns, mowgli_eventloop_t *eventloop)
+{
+ int i;
+ mowgli_dns_evloop_t *state;
+
+ if (dns->dns_state == NULL)
+ dns->dns_state = mowgli_alloc(sizeof(mowgli_dns_evloop_t));
+
+ dns->dns_type = MOWGLI_DNS_TYPE_ASYNC;
+
+ if (!reslist_heap)
+ reslist_heap = mowgli_heap_create(sizeof(mowgli_dns_reslist_t), 512, BH_LAZY);
+
+ state = dns->dns_state;
+
+ state->rand = mowgli_random_create();
+
+ state->nscount = 0;
+
+#ifndef _WIN32
+ parse_resvconf(dns);
+#else
+ parse_windows_resolvers(dns);
+#endif
+
+ if (state->nscount == 0)
+ {
+ mowgli_log("couldn't get resolv.conf entries, falling back to localhost resolver");
+ add_nameserver(dns, "127.0.0.1");
+ }
+
+ for (i = 0; i < state->nscount; i++)
+ state->timeout_count[i] = 0;
+
+ if (state->vio == NULL)
+ {
+ state->vio = mowgli_vio_create(dns);
+ if (mowgli_vio_socket(state->vio, state->nsaddr_list[0].addr.ss_family, SOCK_DGRAM, 0) != 0)
+ {
+ mowgli_log("start_resolver(): unable to open UDP resolver socket: %s",
+ state->vio->error.string);
+ return -1;
+ }
+
+ state->eventloop = eventloop;
+ mowgli_vio_eventloop_attach(state->vio, state->eventloop);
+ mowgli_pollable_setselect(state->eventloop, state->vio->io, MOWGLI_EVENTLOOP_IO_READ, res_readreply);
+ state->timeout_resolver_timer = mowgli_timer_add(state->eventloop, "timeout_resolver", timeout_resolver, dns, 1);
+ }
+
+ return 0;
+}
+
+/*
+ * mowgli_dns_evloop_restart - reread resolv.conf, reopen socket
+ */
+int mowgli_dns_evloop_restart(mowgli_dns_t *dns)
+{
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ mowgli_dns_evloop_destroy(dns);
+ return mowgli_dns_evloop_init(dns, state->eventloop);
+}
+
+/* mowgli_dns_evloop_destroy - finish us off */
+void mowgli_dns_evloop_destroy(mowgli_dns_t *dns)
+{
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ mowgli_vio_close(state->vio);
+ mowgli_vio_destroy(state->vio);
+
+ mowgli_timer_destroy(state->eventloop, state->timeout_resolver_timer);
+
+ mowgli_free(state);
+ dns->dns_state = NULL;
+}
+
+#ifndef _WIN32
+
+/* parse_resvconf() inputs - NONE output - -1 if failure 0 if success side effects - fills in
+ * state->nsaddr_list */
+static int parse_resvconf(mowgli_dns_t *dns)
+{
+ char *p;
+ char *opt;
+ char *arg;
+ char input[MOWGLI_DNS_MAXLINE];
+ FILE *file;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ /* XXX "/etc/resolv.conf" should be from a define in setup.h perhaps for cygwin support etc.
+ * this hardcodes it to unix for now -db */
+ if ((file = fopen("/etc/resolv.conf", "r")) == NULL)
+ return -1;
+
+ while (fgets(input, sizeof(input), file) != NULL)
+ {
+ /* blow away any newline */
+ if ((p = strpbrk(input, "\r\n")) != NULL)
+ *p = '\0';
+
+ p = input;
+ /* skip until something thats not a space is seen */
+ while (isspace(*p))
+ p++;
+ /* if at this point, have a '\0' then continue */
+ if (*p == '\0')
+ continue;
+
+ /* Ignore comment lines immediately */
+ if (*p == '#' || *p == ';')
+ continue;
+
+ /* skip until a space is found */
+ opt = p;
+ while (!isspace(*p) && *p != '\0')
+ p++;
+ if (*p == '\0')
+ continue; /* no arguments?.. ignore this line */
+ /* blow away the space character */
+ *p++ = '\0';
+
+ /* skip these spaces that are before the argument */
+ while (isspace(*p))
+ p++;
+ /* Now arg should be right where p is pointing */
+ arg = p;
+ if ((p = strpbrk(arg, " \t")) != NULL)
+ *p = '\0'; /* take the first word */
+
+ if (strcmp(opt, "domain") == 0)
+ mowgli_strlcpy(state->domain, arg, sizeof(state->domain));
+ else if (strcmp(opt, "nameserver") == 0)
+ add_nameserver(dns, arg);
+ }
+
+ fclose(file);
+ return 0;
+}
+
+#else
+
+extern int mowgli_dns_get_windows_nameservers(char *ret_buf, size_t ret_size);
+
+static void
+parse_windows_resolvers(mowgli_dns_t *dns)
+{
+ char ns_buf[4096];
+ char *server;
+
+ mowgli_dns_get_windows_nameservers(ns_buf, sizeof ns_buf);
+
+ for(server = strtok(ns_buf, ","); server != NULL; server = strtok(NULL, ","))
+ add_nameserver(dns, server);
+}
+
+#endif
+
+
+/* add_nameserver() input - either an IPV4 address in dotted quad or an IPV6 address in : format
+ * output - NONE side effects - entry in state->nsaddr_list is filled in as needed */
+static void add_nameserver(mowgli_dns_t *dns, const char *arg)
+{
+ struct addrinfo hints, *res;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+#ifdef DEBUG
+ mowgli_log("add_nameserver(): %s", arg);
+#endif
+
+ /* Done max number of nameservers? */
+ if (state->nscount >= MOWGLI_DNS_MAXNS)
+ {
+ mowgli_log("Too many nameservers, ignoring %s", arg);
+ return;
+ }
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
+
+ if (getaddrinfo(arg, "domain", &hints, &res))
+ return;
+
+ if (res == NULL)
+ return;
+
+ memcpy(&state->nsaddr_list[state->nscount].addr, res->ai_addr, res->ai_addrlen);
+ state->nsaddr_list[state->nscount].addrlen = res->ai_addrlen;
+ state->nscount++;
+ freeaddrinfo(res);
+}
+
+/*
+ * int
+ * res_ourserver(dns, inp)
+ * looks up "inp" in state->nsaddr_list[]
+ * returns:
+ * 0 : not found
+ * >0 : found
+ * author:
+ * paul vixie, 29may94
+ * revised for ircd, cryogen(stu) may03
+ * rewritten by Elizacat 25mar12
+ */
+static int res_ourserver(mowgli_dns_t *dns, const struct sockaddr_storage * inp)
+{
+ int ns;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ for (ns = 0; ns < state->nscount; ns++)
+ {
+ const struct sockaddr_storage *srv = &state->nsaddr_list[ns].addr;
+
+ /* could probably just memcmp(srv, inp, srv.ss_len) here but we'll air on the side of
+ caution - stu */
+ switch (srv->ss_family)
+ {
+ case AF_INET6:
+ {
+ const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)srv;
+ const struct sockaddr_in6 *v6in = (const struct sockaddr_in6 *)inp;
+
+ if (srv->ss_family == inp->ss_family && v6->sin6_port == v6in->sin6_port)
+ {
+ if ((memcmp(&v6->sin6_addr.s6_addr, &v6in->sin6_addr.s6_addr,
+ sizeof(struct in6_addr)) == 0) ||
+ (memcmp(&v6->sin6_addr.s6_addr, &in6addr_any,
+ sizeof(struct in6_addr)) == 0))
+ {
+ state->timeout_count[ns] = 0;
+ return 1;
+ }
+ }
+ break;
+ }
+ case AF_INET:
+ {
+ const struct sockaddr_in *v4 = (const struct sockaddr_in *)srv;
+ const struct sockaddr_in *v4in = (const struct sockaddr_in *)inp;
+
+ if (srv->ss_family == inp->ss_family && v4->sin_port == v4in->sin_port)
+ {
+ if ((v4->sin_addr.s_addr == INADDR_ANY)
+ || (v4->sin_addr.s_addr == v4in->sin_addr.s_addr))
+ {
+ state->timeout_count[ns] = 0;
+ return 1;
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * timeout_query_list - Remove queries from the list which have been
+ * there too long without being resolved.
+ */
+static time_t timeout_query_list(mowgli_dns_t *dns, time_t now)
+{
+ mowgli_node_t *ptr;
+ mowgli_node_t *next_ptr;
+ mowgli_dns_reslist_t *request;
+ time_t next_time = 0;
+ time_t timeout = 0;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ MOWGLI_ITER_FOREACH_SAFE(ptr, next_ptr, state->request_list.head)
+ {
+ request = ptr->data;
+ timeout = request->sentat + request->timeout;
+
+ if (now >= timeout)
+ {
+ if (--request->retries <= 0)
+ {
+ (*request->query->callback) (NULL, MOWGLI_DNS_RES_TIMEOUT, request->query->ptr);
+ rem_request(dns, request);
+ continue;
+ }
+ else
+ {
+ state->timeout_count[request->lastns]++;
+ request->sentat = now;
+ request->timeout += request->timeout;
+ resend_query(dns, request);
+ }
+ }
+
+ if ((next_time == 0) || timeout < next_time)
+ next_time = timeout;
+ }
+
+ return (next_time > now) ? next_time : (now + MOWGLI_DNS_AR_TTL);
+}
+
+/*
+ * timeout_resolver - check request list
+ */
+static void timeout_resolver(void *arg)
+{
+ mowgli_dns_t *dns = arg;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+ time_t next;
+
+ next = timeout_query_list(dns, mowgli_eventloop_get_time(state->eventloop));
+
+ /* Reschedule */
+ mowgli_timer_destroy(state->eventloop, state->timeout_resolver_timer);
+ mowgli_timer_add(state->eventloop, "timeout_resolver", timeout_resolver, dns, next);
+}
+
+
+/*
+ * mowgli_dns_evloop_add_local_domain - Add the domain to hostname, if it is missing
+ * (as suggested by eps@TOASTER.SFSU.EDU)
+ */
+void mowgli_dns_evloop_add_local_domain(mowgli_dns_t *dns, char *hname, size_t size)
+{
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ /* try to fix up unqualified names */
+ if (strchr(hname, '.') == NULL)
+ {
+ if (state->domain[0])
+ {
+ size_t len = strlen(hname);
+
+ if ((strlen(state->domain) + len + 2) < size)
+ {
+ hname[len++] = '.';
+ strcpy(hname + len, state->domain);
+ }
+ }
+ }
+}
+
+/*
+ * rem_request - remove a request from the list.
+ * This must also free any memory that has been allocated for
+ * temporary storage of DNS results.
+ */
+static void rem_request(mowgli_dns_t *dns, mowgli_dns_reslist_t *request)
+{
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ return_if_fail(request != NULL);
+
+ mowgli_node_delete(&request->node, &state->request_list);
+ mowgli_free(request->name);
+ mowgli_heap_free(reslist_heap, request);
+}
+
+/*
+ * make_request - Create a DNS request record for the server.
+ */
+static mowgli_dns_reslist_t *make_request(mowgli_dns_t *dns, mowgli_dns_query_t * query)
+{
+ mowgli_dns_reslist_t *request = mowgli_heap_alloc(reslist_heap);
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ request->sentat = mowgli_eventloop_get_time(state->eventloop);
+ request->retries = 3;
+ request->timeout = 4; /* start at 4 and exponential inc. */
+ request->query = query;
+
+ mowgli_node_add(request, &request->node, &state->request_list);
+
+ return request;
+}
+
+/*
+ * mowgli_dns_evloop_delete_queries - cleanup outstanding queries
+ * for which there no longer exist clients or conf lines.
+ */
+void mowgli_dns_evloop_delete_queries(mowgli_dns_t *dns, const mowgli_dns_query_t * query)
+{
+ mowgli_node_t *ptr;
+ mowgli_node_t *next_ptr;
+ mowgli_dns_reslist_t *request;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ MOWGLI_ITER_FOREACH_SAFE(ptr, next_ptr, state->request_list.head)
+ {
+ if ((request = ptr->data) != NULL)
+ {
+ if (query == request->query)
+ rem_request(dns, request);
+ }
+ }
+}
+
+/*
+ * retryfreq - determine how many queries to wait before resending
+ * if there have been that many consecutive timeouts
+ */
+static inline int retryfreq(int timeouts)
+{
+ int i;
+ int counter = 1;
+ const int max_retries = 5;
+
+ for (i = 0; i < (timeouts < max_retries ? timeouts : max_retries); i++)
+ counter *= 3;
+
+ return counter;
+}
+
+/*
+ * send_res_msg - sends msg to a nameserver.
+ * This should reflect /etc/resolv.conf.
+ * Returns number of nameserver successfully sent to
+ * or -1 if no successful sends.
+ */
+static int send_res_msg(mowgli_dns_t *dns, const char *rmsg, int len, int rcount)
+{
+ int i;
+ int ns;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ state->retrycnt++;
+ /* First try a nameserver that seems to work. Every once in a while, try a possibly broken one
+ * to check if it is working again. */
+ for (i = 0; i < state->nscount; i++)
+ {
+ ns = (i + rcount - 1) % state->nscount;
+
+ if (state->timeout_count[ns] && state->retrycnt % retryfreq(state->timeout_count[ns]))
+ continue;
+
+ if (mowgli_vio_sendto(state->vio, rmsg, len, &state->nsaddr_list[ns]) == len)
+ return ns;
+ }
+
+ /* No known working nameservers, try some broken one. */
+ for (i = 0; i < state->nscount; i++)
+ {
+ ns = (i + rcount - 1) % state->nscount;
+ if (!state->timeout_count[ns])
+ continue;
+
+ if (mowgli_vio_sendto(state->vio, rmsg, len, &state->nsaddr_list[ns]) == len)
+ return ns;
+ }
+
+ return -1;
+}
+
+/*
+ * find_id - find a dns request id (id is determined by dn_mkquery)
+ */
+static mowgli_dns_reslist_t *find_id(mowgli_dns_t *dns, int id)
+{
+ mowgli_node_t *ptr;
+ mowgli_dns_reslist_t *request;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ MOWGLI_ITER_FOREACH(ptr, state->request_list.head)
+ {
+ request = ptr->data;
+
+ if (request->id == id)
+ return request;
+ }
+
+ return NULL;
+}
+
+/*
+ * mowgli_dns_evloop_gethost_byname - get host address from name
+ *
+ */
+void mowgli_dns_evloop_gethost_byname(mowgli_dns_t *dns, const char *name, mowgli_dns_query_t * query, int type)
+{
+ return_if_fail(name != NULL);
+
+ do_query_name(dns, query, name, NULL, type);
+}
+
+/*
+ * mowgli_dns_evloop_gethost_byaddr - get host name from address
+ */
+void mowgli_dns_evloop_gethost_byaddr(mowgli_dns_t *dns, const struct sockaddr_storage * addr, mowgli_dns_query_t * query)
+{
+ return_if_fail(addr != NULL);
+
+ do_query_number(dns, query, addr, NULL);
+}
+
+/*
+ * do_query_name - nameserver lookup name
+ */
+static void do_query_name(mowgli_dns_t *dns, mowgli_dns_query_t * query, const char *name, mowgli_dns_reslist_t *request, int type)
+{
+ char host_name[MOWGLI_DNS_RES_HOSTLEN + 1];
+
+ mowgli_strlcpy(host_name, name, MOWGLI_DNS_RES_HOSTLEN + 1);
+ mowgli_dns_evloop_add_local_domain(dns, host_name, MOWGLI_DNS_RES_HOSTLEN);
+
+ if (request == NULL)
+ {
+ request = make_request(dns, query);
+ request->name = mowgli_strdup(host_name);
+ }
+
+ mowgli_strlcpy(request->queryname, host_name, sizeof(request->queryname));
+ request->type = type;
+ query_name(dns, request);
+}
+
+/*
+ * do_query_number - Use this to do reverse IP# lookups.
+ */
+static void do_query_number(mowgli_dns_t *dns, mowgli_dns_query_t * query, const struct sockaddr_storage * addr,
+ mowgli_dns_reslist_t *request)
+{
+ const unsigned char *cp;
+ const size_t size = addr->ss_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
+
+ if (request == NULL)
+ {
+ request = make_request(dns, query);
+ memcpy(&request->addr, addr, size);
+ request->name = (char *)mowgli_alloc(MOWGLI_DNS_RES_HOSTLEN + 1);
+ }
+
+ if (addr->ss_family == AF_INET)
+ {
+ const struct sockaddr_in *v4 = (const struct sockaddr_in *)addr;
+ cp = (const unsigned char *)&v4->sin_addr.s_addr;
+
+ sprintf(request->queryname, "%u.%u.%u.%u.in-addr.arpa", (unsigned int)(cp[3]),
+ (unsigned int)(cp[2]), (unsigned int)(cp[1]), (unsigned int)(cp[0]));
+ }
+ else if (addr->ss_family == AF_INET6)
+ {
+ int i;
+ char *rqptr = request->queryname;
+ const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr;
+ cp = (const unsigned char *)&v6->sin6_addr.s6_addr;
+
+ for(i = 15; i >= 0; i--, rqptr += 4)
+ {
+ sprintf(rqptr, "%1x.%1x.",
+ (unsigned int)(cp[i] & 0xf),
+ (unsigned int)(cp[i] >> 4));
+ }
+
+ strcpy(rqptr, ".ip6.arpa");
+ }
+ else
+ {
+ mowgli_log("do_query_number() called with invalid sockaddr_storage %d", addr->ss_family);
+ return;
+ }
+
+
+ request->type = MOWGLI_DNS_T_PTR;
+ query_name(dns, request);
+}
+
+/*
+ * query_name - generate a query based on class, type and name.
+ */
+static void query_name(mowgli_dns_t *dns, mowgli_dns_reslist_t *request)
+{
+ char buf[MOWGLI_DNS_MAXPACKET];
+ int request_len = 0;
+ int ns;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ memset(buf, 0, sizeof(buf));
+
+ if ((request_len =
+ mowgli_dns_res_mkquery(request->queryname, MOWGLI_DNS_C_IN, request->type, (unsigned char *)buf,
+ sizeof(buf))) > 0)
+ {
+ mowgli_dns_resheader_t *header = (mowgli_dns_resheader_t *) buf;
+ /*
+ * generate an unique id
+ * NOTE: we don't have to worry about converting this to and from
+ * network byte order, the nameserver does not interpret this value
+ * and returns it unchanged
+ */
+ do
+ {
+ header->id = (header->id + mowgli_random_int(state->rand)) & 0xffff;
+ }
+ while (find_id(dns, header->id));
+
+ request->id = header->id;
+ ++request->sends;
+
+ ns = send_res_msg(dns, buf, request_len, request->sends);
+ if (ns != -1)
+ request->lastns = ns;
+ }
+}
+
+static void resend_query(mowgli_dns_t *dns, mowgli_dns_reslist_t *request)
+{
+ switch (request->type)
+ {
+ case MOWGLI_DNS_T_PTR:
+ do_query_number(dns, NULL, &request->addr, request);
+ break;
+ case MOWGLI_DNS_T_A:
+ case MOWGLI_DNS_T_AAAA:
+ do_query_name(dns, NULL, request->name, request, request->type);
+ break;
+ default:
+ break;
+ }
+}
+
+/*
+ * check_question - check if the reply really belongs to the
+ * name we queried (to guard against late replies from previous
+ * queries with the same id).
+ */
+static int check_question(mowgli_dns_t *dns, mowgli_dns_reslist_t *request, mowgli_dns_resheader_t * header, char *buf, char *eob)
+{
+ char hostbuf[MOWGLI_DNS_RES_HOSTLEN + 1]; /* working buffer */
+ unsigned char *current; /* current position in buf */
+ int n; /* temp count */
+
+ current = (unsigned char *)buf + sizeof(mowgli_dns_resheader_t);
+
+ if (header->qdcount != 1)
+ return 0;
+
+ n = mowgli_dns_dn_expand((unsigned char *)buf, (unsigned char *)eob, current, hostbuf, sizeof(hostbuf));
+
+ if (n <= 0)
+ return 0;
+
+ if (strcasecmp(hostbuf, request->queryname))
+ return 0;
+
+ return 1;
+}
+
+/*
+ * proc_answer - process name server reply
+ */
+static int proc_answer(mowgli_dns_t *dns, mowgli_dns_reslist_t *request, mowgli_dns_resheader_t * header, char *buf, char *eob)
+{
+ char hostbuf[MOWGLI_DNS_RES_HOSTLEN + 100]; /* working buffer */
+ unsigned char *current; /* current position in buf */
+ int query_class; /* answer class */
+ int type; /* answer type */
+ int n; /* temp count */
+ int rd_length;
+
+ current = (unsigned char *)buf + sizeof(mowgli_dns_resheader_t);
+
+ for (; header->qdcount > 0; --header->qdcount)
+ {
+ if ((n = mowgli_dns_dn_skipname(current, (unsigned char *)eob)) < 0)
+ return 0;
+
+ current += (size_t) n + MOWGLI_DNS_QFIXEDSIZE;
+ }
+
+ /* process each answer sent to us. */
+ while (header->ancount > 0 && (char *)current < eob)
+ {
+ header->ancount--;
+
+ n = mowgli_dns_dn_expand((unsigned char *)buf, (unsigned char *)eob, current, hostbuf,
+ sizeof(hostbuf));
+
+ /* Broken message (< 0) or no more answers left (== 0) */
+ if (n <= 0)
+ return 0;
+
+ hostbuf[MOWGLI_DNS_RES_HOSTLEN] = '\0';
+
+ /* With Address arithmetic you have to be very anal -- this code was not working on alpha due
+ * to that (spotted by rodder/jailbird/dianora) */
+ current += (size_t) n;
+
+ if (!(((char *)current + MOWGLI_DNS_ANSWER_FIXED_SIZE) < eob))
+ break;
+
+ type = mowgli_dns_ns_get16(current);
+ current += MOWGLI_DNS_TYPE_SIZE;
+
+ query_class = mowgli_dns_ns_get16(current);
+ current += MOWGLI_DNS_CLASS_SIZE;
+
+ /* We may use this later at some point so... eliminate bogus GCC warning */
+ (void)query_class;
+
+ request->ttl = mowgli_dns_ns_get32(current);
+ current += MOWGLI_DNS_TTL_SIZE;
+
+ rd_length = mowgli_dns_ns_get16(current);
+ current += MOWGLI_DNS_RDLENGTH_SIZE;
+
+ /* Wait to set request->type until we verify this structure */
+ switch (type)
+ {
+ case MOWGLI_DNS_T_A:
+ {
+ struct sockaddr_in *v4;
+
+ if (request->type != MOWGLI_DNS_T_A)
+ return 0;
+
+ /* check for invalid rd_length or too many addresses */
+ if (rd_length != sizeof(struct in_addr))
+ return 0;
+
+ v4 = (struct sockaddr_in *)&request->addr;
+ v4->sin_family = AF_INET;
+ memcpy(&v4->sin_addr, current, sizeof(struct in_addr));
+
+ return 1;
+ }
+ case MOWGLI_DNS_T_AAAA:
+ {
+ struct sockaddr_in6 *v6;
+
+ if (request->type != MOWGLI_DNS_T_AAAA)
+ return 0;
+
+ if (rd_length != sizeof(struct in6_addr))
+ return 0;
+
+ v6 = (struct sockaddr_in6 *)&request->addr;
+ v6->sin6_family = AF_INET6;
+ memcpy(&v6->sin6_addr, current, sizeof(struct in6_addr));
+
+ return 1;
+ }
+ case MOWGLI_DNS_T_PTR:
+ if (request->type != MOWGLI_DNS_T_PTR)
+ return 0;
+
+ n = mowgli_dns_dn_expand((unsigned char *)buf, (unsigned char *)eob, current,
+ hostbuf, sizeof(hostbuf));
+
+ /* Broken message or no more answers left */
+ if (n <= 0)
+ return 0;
+
+ mowgli_strlcpy(request->name, hostbuf, MOWGLI_DNS_RES_HOSTLEN + 1);
+
+ return 1;
+ case MOWGLI_DNS_T_CNAME:
+ /* real answer will follow */
+ current += rd_length;
+ break;
+ default:
+ /* XXX I'd rather just throw away the entire bogus thing but its possible its just a
+ * broken nameserver with still valid answers. But lets do some rudimentary logging for
+ * now... */
+ mowgli_log("proc_answer(): bogus type %d", type);
+ break;
+ }
+ }
+
+ return 1;
+}
+
+/*
+ * res_read_single_reply - read a dns reply from the nameserver and process it.
+ * Return value: 1 if a packet was read, 0 otherwise
+ */
+static int res_read_single_reply(mowgli_dns_t *dns)
+{
+ char buf[sizeof(mowgli_dns_resheader_t) + MOWGLI_DNS_MAXPACKET]
+ /* Sparc and alpha need 16bit-alignment for accessing header->id (which is uint16_t).
+ Because of the header = (mowgli_dns_resheader_t*) buf; later on, this is neeeded. --FaUl */
+#if defined(__sparc__) || defined(__alpha__)
+ __attribute__ ((aligned(16)))
+#endif
+ ;
+ mowgli_dns_resheader_t *header;
+ mowgli_dns_reslist_t *request = NULL;
+ mowgli_dns_reply_t *reply = NULL;
+ int rc;
+ int answer_count;
+ mowgli_vio_sockaddr_t lsin;
+ mowgli_dns_evloop_t *state = dns->dns_state;
+
+ rc = mowgli_vio_recvfrom(state->vio, buf, sizeof(buf), &lsin);
+
+ /* No packet */
+ if (rc == 0 || rc == -1)
+ return 0;
+
+ /* Too small */
+ if (rc <= (int)(sizeof(mowgli_dns_resheader_t)))
+ return 1;
+
+ /*
+ * convert DNS reply reader from Network byte order to CPU byte order.
+ */
+ header = (mowgli_dns_resheader_t *) buf;
+ header->ancount = ntohs(header->ancount);
+ header->qdcount = ntohs(header->qdcount);
+ header->nscount = ntohs(header->nscount);
+ header->arcount = ntohs(header->arcount);
+
+ /* response for an id which we have already received an answer for
+ * just ignore this response. */
+ if ((request = find_id(dns, header->id)) == 0)
+ return 1;
+
+ /* check against possibly fake replies */
+ if (!res_ourserver(dns, &lsin.addr))
+ return 1;
+
+ if (!check_question(dns, request, header, buf, buf + rc))
+ return 1;
+
+ if ((header->rcode != MOWGLI_DNS_NO_ERRORS) || (header->ancount == 0))
+ {
+ if (header->rcode == MOWGLI_DNS_NXDOMAIN)
+ {
+ (*request->query->callback) (NULL, MOWGLI_DNS_RES_NXDOMAIN, request->query->ptr);
+ rem_request(dns, request);
+ }
+ else
+ {
+ /*
+ * If a bad error was returned, we stop here and dont send
+ * send any more (no retries granted).
+ */
+ (*request->query->callback) (NULL, MOWGLI_DNS_RES_INVALID, request->query->ptr);
+ rem_request(dns, request);
+ }
+ return 1;
+ }
+
+ /* If this fails there was an error decoding the received packet,
+ * give up. -- jilles
+ */
+ answer_count = proc_answer(dns, request, header, buf, buf + rc);
+
+ if (answer_count)
+ {
+ if (request->type == MOWGLI_DNS_T_PTR)
+ {
+ if (request->name == NULL)
+ {
+ /* got a PTR response with no name, something bogus is happening
+ * don't bother trying again, the client address doesn't resolve
+ */
+ (*request->query->callback) (reply, MOWGLI_DNS_RES_INVALID, request->query->ptr);
+ rem_request(dns, request);
+ return 1;
+ }
+
+ /* Lookup the 'authoritative' name that we were given for the
+ * ip#. */
+ if (request->addr.ss_family == AF_INET6)
+ mowgli_dns_evloop_gethost_byname(dns, request->name, request->query, MOWGLI_DNS_T_AAAA);
+ else
+ mowgli_dns_evloop_gethost_byname(dns, request->name, request->query, MOWGLI_DNS_T_A);
+ rem_request(dns, request);
+ }
+ else
+ {
+ /* got a name and address response, client resolved */
+ reply = make_dnsreply(request);
+ (*request->query->callback) (reply, MOWGLI_DNS_RES_SUCCESS, request->query->ptr);
+ mowgli_free(reply);
+ rem_request(dns, request);
+ }
+ }
+ else
+ {
+ /* couldn't decode, give up -- jilles */
+ (*request->query->callback) (NULL, MOWGLI_DNS_RES_INVALID, request->query->ptr);
+ rem_request(dns, request);
+ }
+
+ return 1;
+}
+
+static mowgli_dns_reply_t *make_dnsreply(mowgli_dns_reslist_t *request)
+{
+ mowgli_dns_reply_t *cp;
+ return_val_if_fail(request != 0, NULL);
+
+ cp = (mowgli_dns_reply_t *) mowgli_alloc(sizeof(mowgli_dns_reply_t));
+
+ cp->h_name = request->name;
+ memcpy(&cp->addr, &request->addr, sizeof(cp->addr));
+ return cp;
+}
+
+static void res_readreply(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_dns_t *dns = userdata;
+ while (res_read_single_reply(dns));
+}
+
+/* DNS ops for this resolver */
+const mowgli_dns_ops_t mowgli_dns_evloop_resolver = {
+ .mowgli_dns_init_func_t = mowgli_dns_evloop_init,
+ .mowgli_dns_fini_func_t = mowgli_dns_evloop_destroy,
+ .mowgli_dns_restart_func_t = mowgli_dns_evloop_restart,
+ .mowgli_dns_delete_query_func_t = mowgli_dns_evloop_delete_queries,
+ .mowgli_dns_gethost_byname_func_t = mowgli_dns_evloop_gethost_byname,
+ .mowgli_dns_gethost_byaddr_func_t = mowgli_dns_evloop_gethost_byaddr,
+};
+
diff --git a/src/libmowgli/dns/dns_evloop_res.h b/src/libmowgli/dns/dns_evloop_res.h
new file mode 100644
index 0000000..3973533
--- /dev/null
+++ b/src/libmowgli/dns/dns_evloop_res.h
@@ -0,0 +1,44 @@
+/*
+ * res.h for referencing functions in res.c, reslib.c
+ *
+ * Originally from Charybdis (before that, hybrid), but very little of the
+ * original remains, so...
+ */
+
+#ifndef __MOWGLI_DNS_RES_H__
+#define __MOWGLI_DNS_RES_H__
+
+/* Maximum number of nameservers we track */
+#define MOWGLI_DNS_MAXNS 10
+
+typedef struct
+{
+ mowgli_vio_sockaddr_t nsaddr_list[MOWGLI_DNS_MAXNS];
+ int nscount;
+
+ int retrycnt;
+
+ int timeout_count[MOWGLI_DNS_MAXNS];
+
+ mowgli_vio_t *vio;
+ mowgli_eventloop_t *eventloop;
+ mowgli_eventloop_timer_t *timeout_resolver_timer;
+
+ mowgli_list_t request_list;
+
+ mowgli_random_t *rand;
+
+ char domain[MOWGLI_DNS_RES_HOSTLEN];
+} mowgli_dns_evloop_t;
+
+extern int mowgli_dns_evloop_init(mowgli_dns_t *dns, mowgli_eventloop_t *eventloop);
+extern int mowgli_dns_evloop_restart(mowgli_dns_t *dns);
+extern void mowgli_dns_evloop_destroy(mowgli_dns_t *dns);
+extern void mowgli_dns_evloop_delete_queries(mowgli_dns_t *dns, const mowgli_dns_query_t *);
+extern void mowgli_dns_evloop_gethost_byname(mowgli_dns_t *dns, const char *, mowgli_dns_query_t *, int);
+extern void mowgli_dns_evloop_gethost_byaddr(mowgli_dns_t *dns, const struct sockaddr_storage *, mowgli_dns_query_t *);
+extern void mowgli_dns_evloop_add_local_domain(mowgli_dns_t *dns, char *, size_t);
+
+extern const mowgli_dns_ops_t mowgli_dns_evloop_resolver;
+
+#endif
diff --git a/src/libmowgli/dns/dns_evloop_reslib.c b/src/libmowgli/dns/dns_evloop_reslib.c
new file mode 100644
index 0000000..edefbe7
--- /dev/null
+++ b/src/libmowgli/dns/dns_evloop_reslib.c
@@ -0,0 +1,1102 @@
+/*
+ * Copyright (c) 1985, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ *
+ * Permission to use, copy, modify, and 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, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION 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.
+ */
+
+/*
+ * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM 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.
+ */
+
+/* Original copyright ISC as above. Code modified specifically for ircd use from the following
+ * orginal files in bind ... res_comp.c ns_name.c ns_netint.c res_init.c - Dianora */
+
+#include "dns.h"
+
+#ifdef _WIN32
+#define EMSGSIZE WSAEMSGSIZE
+#endif
+
+#define MOWGLI_DNS_NS_TYPE_ELT 0x40 /* EDNS0 extended label type */
+#define MOWGLI_DNS_LABELTYPE_BITSTRING 0x41
+
+/* from Hybrid Id: reslib.c 177 2005-10-22 09:05:05Z michael $ */
+
+static const char digitvalue[256] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 16 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 32 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 48 */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 64 */
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 80 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 96 */
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 112 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 128 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 256 */
+};
+
+static const char digits[] = "0123456789";
+
+static int labellen(const unsigned char *lp);
+static bool mowgli_dns_is_special(int ch);
+static bool mowgli_dns_is_printable(int ch);
+static int mowgli_dns_decode_bitstring(const char **cpp, char *dn, const char *eom);
+static int mowgli_dns_ns_name_compress(const char *src, unsigned char *dst, size_t dstsiz, unsigned char **dnptrs, unsigned char **lastdnptr);
+static int mowgli_dns_dn_find(const unsigned char *, const unsigned char *, const unsigned char *const *, const unsigned char *const *);
+static int mowgli_dns_encode_bitsring(const char **, const char *, unsigned char **, unsigned char **, const char *);
+static int mowgli_dns_ns_name_uncompress(const unsigned char *, const unsigned char *, const unsigned char *, char *, size_t);
+static int mowgli_dns_ns_name_unpack(const unsigned char *, const unsigned char *, const unsigned char *, unsigned char *, size_t);
+static int mowgli_dns_ns_name_ntop(const char *, char *, size_t);
+static int mowgli_dns_ns_name_skip(const unsigned char **, const unsigned char *);
+static int mowgli_dns_mklower(int ch);
+
+/*
+ * Expand compressed domain name 'comp_dn' to full domain name.
+ * 'rmsg' is a pointer to the begining of the message,
+ * 'eomorig' points to the first location after the message,
+ * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
+ * Return size of compressed name or -1 if there was an error.
+ */
+int
+mowgli_dns_dn_expand(const unsigned char *rmsg, const unsigned char *eom,
+ const unsigned char *src, char *dst, int dstsiz)
+{
+ int n = mowgli_dns_ns_name_uncompress(rmsg, eom, src, dst, (size_t) dstsiz);
+
+ if (n > 0 && dst[0] == '.')
+ dst[0] = '\0';
+ return n;
+}
+
+/*
+ * mowgli_dns_ns_name_uncompress(rmsg, eom, src, dst, dstsiz)
+ * Expand compressed domain name to presentation format.
+ * return:
+ * Number of bytes read out of `src', or -1 (with errno set).
+ * note:
+ * Root domain returns as "." not "".
+ */
+static int
+mowgli_dns_ns_name_uncompress(const unsigned char *rmsg, const unsigned char *eom,
+ const unsigned char *src, char *dst, size_t dstsiz)
+{
+ unsigned char tmp[MOWGLI_DNS_NS_MAXCDNAME];
+ int n;
+
+ if ((n = mowgli_dns_ns_name_unpack(rmsg, eom, src, tmp, sizeof tmp)) == -1)
+ return -1;
+ if (mowgli_dns_ns_name_ntop((char *)tmp, dst, dstsiz) == -1)
+ return -1;
+ return n;
+}
+
+/*
+ * mowgli_dns_ns_name_unpack(rmsg, eom, src, dst, dstsiz)
+ * Unpack a domain name from a message, source may be compressed.
+ * return:
+ * -1 if it fails, or consumed octets if it succeeds.
+ */
+static int
+mowgli_dns_ns_name_unpack(const unsigned char *rmsg, const unsigned char *eom, const unsigned char *src, unsigned char *dst, size_t dstsiz)
+{
+ const unsigned char *srcp, *dstlim;
+ unsigned char *dstp;
+ int n, len, checked, l;
+
+ len = -1;
+ checked = 0;
+ dstp = dst;
+ srcp = src;
+ dstlim = dst + dstsiz;
+ if (srcp < rmsg || srcp >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ /* Fetch next label in domain name. */
+ while ((n = *srcp++) != 0)
+ {
+ /* Check for indirection. */
+ switch (n & MOWGLI_DNS_NS_CMPRSFLAGS)
+ {
+ case 0:
+ case MOWGLI_DNS_NS_TYPE_ELT:
+ /* Limit checks. */
+ if ((l = labellen(srcp - 1)) < 0)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if (dstp + l + 1 >= dstlim || srcp + l >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ checked += l + 1;
+ *dstp++ = n;
+ memcpy(dstp, srcp, l);
+ dstp += l;
+ srcp += l;
+ break;
+
+ case MOWGLI_DNS_NS_CMPRSFLAGS:
+ if (srcp >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if (len < 0)
+ len = srcp - src + 1;
+ srcp = rmsg + (((n & 0x3f) << 8) | (*srcp & 0xff));
+ if (srcp < rmsg || srcp >= eom)
+ { /* Out of range. */
+ errno = EMSGSIZE;
+ return -1;
+ }
+ checked += 2;
+ /*
+ * Check for loops in the compressed name;
+ * if we've looked at the whole message,
+ * there must be a loop.
+ */
+ if (checked >= eom - rmsg)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ break;
+
+ default:
+ errno = EMSGSIZE;
+ return -1; /* flag error */
+ }
+ }
+ *dstp = '\0';
+ if (len < 0)
+ len = srcp - src;
+ return len;
+}
+
+/*
+ * mowgli_dns_ns_name_ntop(src, dst, dstsiz)
+ * Convert an encoded domain name to mowgli_dns_is_printable ascii as per RFC1035.
+ * return:
+ * Number of bytes written to buffer, or -1 (with errno set)
+ * notes:
+ * The root is returned as "."
+ * All other domains are returned in non absolute form
+ */
+static int mowgli_dns_ns_name_ntop(const char *src, char *dst, size_t dstsiz)
+{
+ const char *cp;
+ char *dn, *eom;
+ unsigned char c;
+ unsigned int n;
+ int l;
+
+ cp = src;
+ dn = dst;
+ eom = dst + dstsiz;
+
+ while ((n = *cp++) != 0)
+ {
+ if ((n & MOWGLI_DNS_NS_CMPRSFLAGS) == MOWGLI_DNS_NS_CMPRSFLAGS)
+ {
+ /* Some kind of compression pointer. */
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if (dn != dst)
+ {
+ if (dn >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *dn++ = '.';
+ }
+ if ((l = labellen((const unsigned char *)(cp - 1))) < 0)
+ {
+ errno = EMSGSIZE; /* XXX */
+ return -1;
+ }
+ if (dn + l >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if ((n & MOWGLI_DNS_NS_CMPRSFLAGS) == MOWGLI_DNS_NS_TYPE_ELT)
+ {
+ int m;
+
+ if (n != MOWGLI_DNS_LABELTYPE_BITSTRING)
+ {
+ /* XXX: labellen should reject this case */
+ errno = EINVAL;
+ return -1;
+ }
+ if ((m = mowgli_dns_decode_bitstring(&cp, dn, eom)) < 0)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ dn += m;
+ continue;
+ }
+ for ((void)NULL; l > 0; l--)
+ {
+ c = *cp++;
+ if (mowgli_dns_is_special(c))
+ {
+ if (dn + 1 >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *dn++ = '\\';
+ *dn++ = (char)c;
+ }
+ else if (!mowgli_dns_is_printable(c))
+ {
+ if (dn + 3 >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *dn++ = '\\';
+ *dn++ = digits[c / 100];
+ *dn++ = digits[(c % 100) / 10];
+ *dn++ = digits[c % 10];
+ }
+ else
+ {
+ if (dn >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *dn++ = (char)c;
+ }
+ }
+ }
+ if (dn == dst)
+ {
+ if (dn >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *dn++ = '.';
+ }
+ if (dn >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *dn++ = '\0';
+ return dn - dst;
+}
+
+/*
+ * Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
+ * Return the size of the compressed name or -1.
+ * 'length' is the size of the array pointed to by 'comp_dn'.
+ */
+static int
+mowgli_dns_dn_comp(const char *src, unsigned char *dst, int dstsiz,
+ unsigned char **dnptrs, unsigned char **lastdnptr)
+{
+ return mowgli_dns_ns_name_compress(src, dst, (size_t) dstsiz, dnptrs, lastdnptr);
+}
+
+/*
+ * Skip over a compressed domain name. Return the size or -1.
+ */
+int mowgli_dns_dn_skipname(const unsigned char *ptr, const unsigned char *eom)
+{
+ const unsigned char *saveptr = ptr;
+
+ if (mowgli_dns_ns_name_skip(&ptr, eom) == -1)
+ return -1;
+ return ptr - saveptr;
+}
+
+/*
+ * ns_name_skip(ptrptr, eom)
+ * Advance *ptrptr to skip over the compressed name it points at.
+ * return:
+ * 0 on success, -1 (with errno set) on failure.
+ */
+static int mowgli_dns_ns_name_skip(const unsigned char **ptrptr, const unsigned char *eom)
+{
+ const unsigned char *cp;
+ unsigned int n;
+ int l;
+
+ cp = *ptrptr;
+
+ while (cp < eom && (n = *cp++) != 0)
+ {
+ /* Check for indirection. */
+ switch (n & MOWGLI_DNS_NS_CMPRSFLAGS)
+ {
+ case 0: /* normal case, n == len */
+ cp += n;
+ continue;
+ case MOWGLI_DNS_NS_TYPE_ELT: /* EDNS0 extended label */
+ if ((l = labellen(cp - 1)) < 0)
+ {
+ errno = EMSGSIZE; /* XXX */
+ return -1;
+ }
+
+ cp += l;
+ continue;
+ case MOWGLI_DNS_NS_CMPRSFLAGS: /* indirection */
+ cp++;
+ break;
+ default: /* illegal type */
+ errno = EMSGSIZE;
+ return -1;
+ }
+
+ break;
+ }
+
+ if (cp > eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+
+ *ptrptr = cp;
+ return 0;
+}
+
+unsigned int mowgli_dns_ns_get16(const unsigned char *src)
+{
+ unsigned int dst;
+
+ MOWGLI_DNS_NS_GET16(dst, src);
+ return dst;
+}
+
+unsigned long mowgli_dns_ns_get32(const unsigned char *src)
+{
+ unsigned long dst;
+
+ MOWGLI_DNS_NS_GET32(dst, src);
+ return dst;
+}
+
+void mowgli_dns_ns_put16(unsigned int src, unsigned char *dst)
+{
+ MOWGLI_DNS_NS_PUT16(src, dst);
+}
+
+void mowgli_dns_ns_put32(unsigned long src, unsigned char *dst)
+{
+ MOWGLI_DNS_NS_PUT32(src, dst);
+}
+
+/* From ns_name.c */
+
+/*
+ * mowgli_dns_is_special(ch)
+ * Thinking in noninternationalized USASCII (per the DNS spec),
+ * is this characted mowgli_dns_is_special ("in need of quoting") ?
+ * return:
+ * boolean.
+ */
+static bool mowgli_dns_is_special(int ch)
+{
+ switch (ch)
+ {
+ case 0x22: /* '"' */
+ case 0x2E: /* '.' */
+ case 0x3B: /* ';' */
+ case 0x5C: /* '\\' */
+ case 0x28: /* '(' */
+ case 0x29: /* ')' */
+ /* Special modifiers in zone files. */
+ case 0x40: /* '@' */
+ case 0x24: /* '$' */
+ return true;
+ default:
+ return false;
+ }
+}
+
+static int labellen(const unsigned char *lp)
+{
+ int bitlen;
+ unsigned char l = *lp;
+
+ if ((l & MOWGLI_DNS_NS_CMPRSFLAGS) == MOWGLI_DNS_NS_CMPRSFLAGS)
+ /* should be avoided by the caller */
+ return -1;
+
+ if ((l & MOWGLI_DNS_NS_CMPRSFLAGS) == MOWGLI_DNS_NS_TYPE_ELT)
+ {
+ if (l == MOWGLI_DNS_LABELTYPE_BITSTRING)
+ {
+ if ((bitlen = *(lp + 1)) == 0)
+ bitlen = 256;
+
+ return (bitlen + 7) / 8 + 1;
+ }
+
+ return -1; /* unknwon ELT */
+ }
+
+ return l;
+}
+
+
+/*
+ * mowgli_dns_is_printable(ch)
+ * Thinking in noninternationalized USASCII (per the DNS spec),
+ * is this character visible and not a space when printed ?
+ * return:
+ * boolean.
+ */
+static bool mowgli_dns_is_printable(int ch)
+{
+ return (ch > 0x20 && ch < 0x7f) ? true : false;
+}
+
+static int mowgli_dns_decode_bitstring(const char **cpp, char *dn, const char *eom)
+{
+ const char *cp = *cpp;
+ char *beg = dn, tc;
+ int b, blen, plen;
+
+ if ((blen = (*cp & 0xff)) == 0)
+ blen = 256;
+ plen = (blen + 3) / 4;
+ plen += sizeof("\\[x/]") + (blen > 99 ? 3 : (blen > 9) ? 2 : 1);
+ if (dn + plen >= eom)
+ return -1;
+
+ cp++;
+ dn += sprintf(dn, "\\[x");
+ for (b = blen; b > 7; b -= 8, cp++)
+ dn += sprintf(dn, "%02x", *cp & 0xff);
+ if (b > 4)
+ {
+ tc = *cp++;
+ dn += sprintf(dn, "%02x", tc & (0xff << (8 - b)));
+ }
+ else if (b > 0)
+ {
+ tc = *cp++;
+ dn += sprintf(dn, "%1x", ((tc >> 4) & 0x0f) & (0x0f << (4 - b)));
+ }
+ dn += sprintf(dn, "/%d]", blen);
+
+ *cpp = cp;
+ return (dn - beg);
+}
+
+/*
+ * mowgli_dns_ns_name_pton(src, dst, dstsiz)
+ * Convert a ascii string into an encoded domain name as per RFC1035.
+ * return:
+ * -1 if it fails
+ * 1 if string was fully qualified
+ * 0 is string was not fully qualified
+ * notes:
+ * Enforces label and domain length limits.
+ */
+static int mowgli_dns_ns_name_pton(const char *src, unsigned char *dst, size_t dstsiz)
+{
+ unsigned char *label, *bp, *eom;
+ char *cp;
+ int c, n, escaped, e = 0;
+
+ escaped = 0;
+ bp = dst;
+ eom = dst + dstsiz;
+ label = bp++;
+
+
+ while ((c = *src++) != 0)
+ {
+ if (escaped)
+ {
+ if (c == '[')
+ { /* start a bit string label */
+ if ((cp = strchr(src, ']')) == NULL)
+ {
+ errno = EINVAL; /* ??? */
+ return -1;
+ }
+ if ((e = mowgli_dns_encode_bitsring(&src, cp + 2, &label, &bp, (const char *)eom)) != 0)
+ {
+ errno = e;
+ return -1;
+ }
+ escaped = 0;
+ label = bp++;
+ if ((c = *src++) == 0)
+ goto done;
+ else if (c != '.')
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ continue;
+ }
+ else if ((cp = strchr(digits, c)) != NULL)
+ {
+ n = (cp - digits) * 100;
+ if ((c = *src++) == 0 || (cp = strchr(digits, c)) == NULL)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ n += (cp - digits) * 10;
+ if ((c = *src++) == 0 || (cp = strchr(digits, c)) == NULL)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ n += (cp - digits);
+ if (n > 255)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ c = n;
+ }
+ escaped = 0;
+ }
+ else if (c == '\\')
+ {
+ escaped = 1;
+ continue;
+ }
+ else if (c == '.')
+ {
+ c = (bp - label - 1);
+ if ((c & MOWGLI_DNS_NS_CMPRSFLAGS) != 0)
+ { /* Label too big. */
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if (label >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *label = c;
+ /* Fully qualified ? */
+ if (*src == '\0')
+ {
+ if (c != 0)
+ {
+ if (bp >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *bp++ = '\0';
+ }
+ if ((bp - dst) > MOWGLI_DNS_NS_MAXCDNAME)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ return (1);
+ }
+ if (c == 0 || *src == '.')
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ label = bp++;
+ continue;
+ }
+ if (bp >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *bp++ = (unsigned char)c;
+ }
+ c = (bp - label - 1);
+ if ((c & MOWGLI_DNS_NS_CMPRSFLAGS) != 0)
+ { /* Label too big. */
+ errno = EMSGSIZE;
+ return -1;
+ }
+ done:
+ if (label >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *label = c;
+ if (c != 0)
+ {
+ if (bp >= eom)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ *bp++ = 0;
+ }
+
+ if ((bp - dst) > MOWGLI_DNS_NS_MAXCDNAME)
+ { /* src too big */
+ errno = EMSGSIZE;
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * mowgli_dns_ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr)
+ * Pack domain name 'domain' into 'comp_dn'.
+ * return:
+ * Size of the compressed name, or -1.
+ * notes:
+ * 'dnptrs' is an array of pointers to previous compressed names.
+ * dnptrs[0] is a pointer to the beginning of the message. The array
+ * ends with NULL.
+ * 'lastdnptr' is a pointer to the end of the array pointed to
+ * by 'dnptrs'.
+ * Side effects:
+ * The list of pointers in dnptrs is updated for labels inserted into
+ * the message as we compress the name. If 'dnptr' is NULL, we don't
+ * try to compress names. If 'lastdnptr' is NULL, we don't update the
+ * list.
+ */
+static int
+mowgli_dns_ns_name_pack(const unsigned char *src, unsigned char *dst, int dstsiz,
+ unsigned char **dnptrs, unsigned char **lastdnptr)
+{
+ unsigned char *dstp;
+ unsigned char **cpp, **lpp;
+ const unsigned char *eob, *rmsg;
+ const unsigned char *srcp;
+ int n, l, first = 1;
+
+ srcp = src;
+ dstp = dst;
+ eob = dstp + dstsiz;
+ lpp = cpp = NULL;
+ if (dnptrs != NULL)
+ {
+ if ((rmsg = *dnptrs++) != NULL)
+ {
+ for (cpp = dnptrs; *cpp != NULL; cpp++)
+ (void)NULL;
+ lpp = cpp; /* end of list to search */
+ }
+ }
+ else
+ rmsg = NULL;
+
+ /* make sure the domain we are about to add is legal */
+ l = 0;
+ do
+ {
+ int l0;
+
+ n = *srcp;
+ if ((n & MOWGLI_DNS_NS_CMPRSFLAGS) == MOWGLI_DNS_NS_CMPRSFLAGS)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if ((l0 = labellen(srcp)) < 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ l += l0 + 1;
+ if (l > MOWGLI_DNS_NS_MAXCDNAME)
+ {
+ errno = EMSGSIZE;
+ return -1;
+ }
+ srcp += l0 + 1;
+ }
+ while (n != 0);
+
+ /* from here on we need to reset compression pointer array on error */
+ srcp = src;
+ do
+ {
+ /* Look to see if we can use pointers. */
+ n = *srcp;
+ if (n != 0 && rmsg != NULL)
+ {
+ l = mowgli_dns_dn_find(srcp, rmsg, (const unsigned char *const *)dnptrs,
+ (const unsigned char *const *)lpp);
+ if (l >= 0)
+ {
+ if (dstp + 1 >= eob)
+ {
+ goto cleanup;
+ }
+ *dstp++ = (l >> 8) | MOWGLI_DNS_NS_CMPRSFLAGS;
+ *dstp++ = l % 256;
+ return (dstp - dst);
+ }
+ /* Not found, save it. */
+ if (lastdnptr != NULL && cpp < lastdnptr - 1 && (dstp - rmsg) < 0x4000 && first)
+ {
+ *cpp++ = dstp;
+ *cpp = NULL;
+ first = 0;
+ }
+ }
+ /* copy label to buffer */
+ if ((n & MOWGLI_DNS_NS_CMPRSFLAGS) == MOWGLI_DNS_NS_CMPRSFLAGS)
+ {
+ /* Should not happen. */
+ goto cleanup;
+ }
+ n = labellen(srcp);
+ if (dstp + 1 + n >= eob)
+ {
+ goto cleanup;
+ }
+ memcpy(dstp, srcp, n + 1);
+ srcp += n + 1;
+ dstp += n + 1;
+ }
+ while (n != 0);
+
+ if (dstp > eob)
+ {
+ cleanup:
+ if (rmsg != NULL)
+ *lpp = NULL;
+ errno = EMSGSIZE;
+ return -1;
+ }
+ return (dstp - dst);
+}
+
+static int
+mowgli_dns_ns_name_compress(const char *src, unsigned char *dst, size_t dstsiz,
+ unsigned char **dnptrs, unsigned char **lastdnptr)
+{
+ unsigned char tmp[MOWGLI_DNS_NS_MAXCDNAME];
+
+ if (mowgli_dns_ns_name_pton(src, tmp, sizeof tmp) == -1)
+ return -1;
+ return (mowgli_dns_ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr));
+}
+
+static int
+mowgli_dns_encode_bitsring(const char **bp, const char *end, unsigned char **labelp,
+ unsigned char **dst, const char *eom)
+{
+ int afterslash = 0;
+ const char *cp = *bp;
+ char *tp, c;
+ const char *beg_blen;
+ char *end_blen = NULL;
+ int value = 0, count = 0, tbcount = 0, blen = 0;
+
+ beg_blen = end_blen = NULL;
+
+ /* a bitstring must contain at least 2 characters */
+ if (end - cp < 2)
+ return EINVAL;
+
+ /* XXX: currently, only hex strings are supported */
+ if (*cp++ != 'x')
+ return EINVAL;
+ if (!isxdigit((*cp) & 0xff)) /* reject '\[x/BLEN]' */
+ return EINVAL;
+
+ for (tp = (char *)(dst + 1); cp < end && tp < eom; cp++)
+ {
+ switch ((c = *cp))
+ {
+ case ']': /* end of the bitstring */
+ if (afterslash)
+ {
+ if (beg_blen == NULL)
+ return EINVAL;
+ blen = (int)strtol(beg_blen, &end_blen, 10);
+ if (*end_blen != ']')
+ return EINVAL;
+ }
+ if (count)
+ *tp++ = ((value << 4) & 0xff);
+ cp++; /* skip ']' */
+ goto done;
+ case '/':
+ afterslash = 1;
+ break;
+ default:
+ if (afterslash)
+ {
+ if (!isdigit(c & 0xff))
+ return EINVAL;
+ if (beg_blen == NULL)
+ {
+
+ if (c == '0')
+ {
+ /* blen never begings with 0 */
+ return EINVAL;
+ }
+ beg_blen = cp;
+ }
+ }
+ else
+ {
+ if (!isxdigit(c & 0xff))
+ return EINVAL;
+ value <<= 4;
+ value += digitvalue[(int)c];
+ count += 4;
+ tbcount += 4;
+ if (tbcount > 256)
+ return EINVAL;
+ if (count == 8)
+ {
+ *tp++ = value;
+ count = 0;
+ }
+ }
+ break;
+ }
+ }
+ done:
+ if (cp >= end || tp >= eom)
+ return (EMSGSIZE);
+
+ /*
+ * bit length validation:
+ * If a <length> is present, the number of digits in the <bit-data>
+ * MUST be just sufficient to contain the number of bits specified
+ * by the <length>. If there are insignificant bits in a final
+ * hexadecimal or octal digit, they MUST be zero.
+ * RFC 2673, Section 3.2.
+ */
+ if (blen > 0)
+ {
+ int traillen;
+
+ if (((blen + 3) & ~3) != tbcount)
+ return EINVAL;
+ traillen = tbcount - blen; /* between 0 and 3 */
+ if (((value << (8 - traillen)) & 0xff) != 0)
+ return EINVAL;
+ }
+ else
+ blen = tbcount;
+ if (blen == 256)
+ blen = 0;
+
+ /* encode the type and the significant bit fields */
+ **labelp = MOWGLI_DNS_LABELTYPE_BITSTRING;
+ **dst = blen;
+
+ *bp = cp;
+ *dst = (unsigned char *)tp;
+
+ return 0;
+}
+
+/*
+ * dn_find(domain, rmsg, dnptrs, lastdnptr)
+ * Search for the counted-label name in an array of compressed names.
+ * return:
+ * offset from rmsg if found, or -1.
+ * notes:
+ * dnptrs is the pointer to the first name on the list,
+ * not the pointer to the start of the message.
+ */
+static int
+mowgli_dns_dn_find(const unsigned char *domain, const unsigned char *rmsg,
+ const unsigned char *const *dnptrs, const unsigned char *const *lastdnptr)
+{
+ const unsigned char *dn, *cp, *sp;
+ const unsigned char *const *cpp;
+ unsigned int n;
+
+ for (cpp = dnptrs; cpp < lastdnptr; cpp++)
+ {
+ sp = *cpp;
+ /*
+ * terminate search on:
+ * root label
+ * compression pointer
+ * unusable offset
+ */
+ while (*sp != 0 && (*sp & MOWGLI_DNS_NS_CMPRSFLAGS) == 0 && (sp - rmsg) < 0x4000)
+ {
+ dn = domain;
+ cp = sp;
+ while ((n = *cp++) != 0)
+ {
+ /*
+ * check for indirection
+ */
+ switch (n & MOWGLI_DNS_NS_CMPRSFLAGS)
+ {
+ case 0: /* normal case, n == len */
+ n = labellen(cp - 1); /* XXX */
+
+ if (n != *dn++)
+ goto next;
+
+ for ( ; n > 0; n--)
+ if (mowgli_dns_mklower(*dn++) != mowgli_dns_mklower(*cp++))
+ goto next;
+
+ /* Is next root for both ? */
+ if (*dn == '\0' && *cp == '\0')
+ return sp - rmsg;
+ if (*dn)
+ continue;
+ goto next;
+ case MOWGLI_DNS_NS_CMPRSFLAGS: /* indirection */
+ cp = rmsg + (((n & 0x3f) << 8) | *cp);
+ break;
+
+ default: /* illegal type */
+ errno = EMSGSIZE;
+ return -1;
+ }
+ }
+ next:;
+ sp += *sp + 1;
+ }
+ }
+ errno = ENOENT;
+ return -1;
+}
+
+/*
+ * Thinking in noninternationalized USASCII (per the DNS spec),
+ * convert this character to lower case if it's upper case.
+ */
+static int mowgli_dns_mklower(int ch)
+{
+ if (ch >= 0x41 && ch <= 0x5A)
+ return ch + 0x20;
+
+ return ch;
+}
+
+/* From resolv/mkquery.c */
+
+/*
+ * Form all types of queries.
+ * Returns the size of the result or -1.
+ */
+int mowgli_dns_res_mkquery(const char *dname, /* domain name */
+ int query_class, int type, /* class and type of query */
+ unsigned char *buf, /* buffer to put query */
+ int buflen) /* size of buffer */
+{
+ mowgli_dns_resheader_t *hp;
+ unsigned char *cp;
+ int n;
+ unsigned char *dnptrs[20], **dpp, **lastdnptr;
+
+ /*
+ * Initialize header fields.
+ */
+ if ((buf == NULL) || (buflen < MOWGLI_DNS_HFIXEDSIZE))
+ return -1;
+ memset(buf, 0, MOWGLI_DNS_HFIXEDSIZE);
+ hp = (mowgli_dns_resheader_t *) buf;
+
+ hp->id = 0;
+ hp->opcode = MOWGLI_DNS_QUERY;
+ hp->rd = 1; /* recurse */
+ hp->rcode = MOWGLI_DNS_NO_ERRORS;
+ cp = buf + MOWGLI_DNS_HFIXEDSIZE;
+ buflen -= MOWGLI_DNS_HFIXEDSIZE;
+ dpp = dnptrs;
+ *dpp++ = buf;
+ *dpp++ = NULL;
+ lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0];
+
+ if ((buflen -= MOWGLI_DNS_QFIXEDSIZE) < 0)
+ return -1;
+ if ((n = mowgli_dns_dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
+ return -1;
+
+ cp += n;
+ buflen -= n;
+ MOWGLI_DNS_NS_PUT16(type, cp);
+ MOWGLI_DNS_NS_PUT16(query_class, cp);
+ hp->qdcount = htons(1);
+
+ return cp - buf;
+}
diff --git a/src/libmowgli/dns/dns_evloop_reslib.h b/src/libmowgli/dns/dns_evloop_reslib.h
new file mode 100644
index 0000000..b6fcf03
--- /dev/null
+++ b/src/libmowgli/dns/dns_evloop_reslib.h
@@ -0,0 +1,112 @@
+/*
+ * dns/reslib.h
+ *
+ * $Id: reslib.h 446 2006-02-12 02:46:54Z db $
+ */
+
+#ifndef __MOWGLI_DNS_RESLIB_H__
+#define __MOWGLI_DNS_RESLIB_H__
+
+/* Here we define some values lifted from nameser.h */
+#define MOWGLI_DNS_NS_NOTIFY_OP 4
+#define MOWGLI_DNS_NS_INT16SIZE 2
+#define MOWGLI_DNS_NS_IN6ADDRSIZE 16
+#define MOWGLI_DNS_NS_INADDRSIZE 4
+#define MOWGLI_DNS_NS_INT32SIZE 4
+#define MOWGLI_DNS_NS_CMPRSFLAGS 0xc0
+#define MOWGLI_DNS_NS_MAXCDNAME 255
+#define MOWGLI_DNS_QUERY 0
+#define MOWGLI_DNS_IQUERY 1
+#define MOWGLI_DNS_NO_ERRORS 0
+#define MOWGLI_DNS_SERVFAIL 2
+#define MOWGLI_DNS_NXDOMAIN 3
+#define MOWGLI_DNS_C_IN 1
+#define MOWGLI_DNS_QFIXEDSIZE 4
+#define MOWGLI_DNS_RRFIXEDSIZE 10
+#define MOWGLI_DNS_HFIXEDSIZE 12
+
+typedef struct
+{
+ unsigned id:16; /* query identification number */
+#ifdef WORDS_BIGENDIAN
+ /* fields in third byte */
+ unsigned qr:1; /* response flag */
+ unsigned opcode:4; /* purpose of message */
+ unsigned aa:1; /* authoritive answer */
+ unsigned tc:1; /* truncated message */
+ unsigned rd:1; /* recursion desired */
+ /* fields in fourth byte */
+ unsigned ra:1; /* recursion available */
+ unsigned unused:1; /* unused bits (MBZ as of 4.9.3a3) */
+ unsigned ad:1; /* authentic data from named */
+ unsigned cd:1; /* checking disabled by resolver */
+ unsigned rcode:4; /* response code */
+#else
+ /* fields in third byte */
+ unsigned rd:1; /* recursion desired */
+ unsigned tc:1; /* truncated message */
+ unsigned aa:1; /* authoritive answer */
+ unsigned opcode:4; /* purpose of message */
+ unsigned qr:1; /* response flag */
+ /* fields in fourth byte */
+ unsigned rcode:4; /* response code */
+ unsigned cd:1; /* checking disabled by resolver */
+ unsigned ad:1; /* authentic data from named */
+ unsigned unused:1; /* unused bits (MBZ as of 4.9.3a3) */
+ unsigned ra:1; /* recursion available */
+#endif
+ /* remaining bytes */
+ unsigned qdcount:16; /* number of question entries */
+ unsigned ancount:16; /* number of answer entries */
+ unsigned nscount:16; /* number of authority entries */
+ unsigned arcount:16; /* number of resource entries */
+} mowgli_dns_resheader_t;
+
+/*
+ * Inline versions of get/put short/long. Pointer is advanced.
+ */
+#define MOWGLI_DNS_NS_GET16(s, cp) { \
+ const unsigned char *t_cp = (const unsigned char *)(cp); \
+ (s) = ((uint16_t)t_cp[0] << 8) \
+ | ((uint16_t)t_cp[1]) \
+ ; \
+ (cp) += MOWGLI_DNS_NS_INT16SIZE; \
+}
+
+#define MOWGLI_DNS_NS_GET32(l, cp) { \
+ const unsigned char *t_cp = (const unsigned char *)(cp); \
+ (l) = ((uint32_t)t_cp[0] << 24) \
+ | ((uint32_t)t_cp[1] << 16) \
+ | ((uint32_t)t_cp[2] << 8) \
+ | ((uint32_t)t_cp[3]) \
+ ; \
+ (cp) += MOWGLI_DNS_NS_INT32SIZE; \
+}
+
+#define MOWGLI_DNS_NS_PUT16(s, cp) { \
+ uint16_t t_s = (uint16_t)(s); \
+ unsigned char *t_cp = (unsigned char *)(cp); \
+ *t_cp++ = t_s >> 8; \
+ *t_cp = t_s; \
+ (cp) += MOWGLI_DNS_NS_INT16SIZE; \
+}
+
+#define MOWGLI_DNS_NS_PUT32(l, cp) { \
+ uint32_t t_l = (uint32_t)(l); \
+ unsigned char *t_cp = (unsigned char *)(cp); \
+ *t_cp++ = t_l >> 24; \
+ *t_cp++ = t_l >> 16; \
+ *t_cp++ = t_l >> 8; \
+ *t_cp = t_l; \
+ (cp) += MOWGLI_DNS_NS_INT32SIZE; \
+}
+
+extern int mowgli_dns_dn_expand(const unsigned char *msg, const unsigned char *eom, const unsigned char *src, char *dst, int dstsiz);
+extern int mowgli_dns_dn_skipname(const unsigned char *ptr, const unsigned char *eom);
+extern unsigned int mowgli_dns_ns_get16(const unsigned char *src);
+extern unsigned long mowgli_dns_ns_get32(const unsigned char *src);
+extern void mowgli_dns_ns_put16(unsigned int src, unsigned char *dst);
+extern void mowgli_dns_ns_put32(unsigned long src, unsigned char *dst);
+extern int mowgli_dns_res_mkquery(const char *dname, int query_class, int type, unsigned char *buf, int buflen);
+
+#endif
diff --git a/src/libmowgli/dns/dns_evloop_reslist_win32.c b/src/libmowgli/dns/dns_evloop_reslist_win32.c
new file mode 100644
index 0000000..eb45ce8
--- /dev/null
+++ b/src/libmowgli/dns/dns_evloop_reslist_win32.c
@@ -0,0 +1,97 @@
+/*
+ * reslist.c - get nameservers from windows *
+ *
+ * Copyright 1998 by the Massachusetts Institute of Technology.
+ * Copyright (C) 2007-2008 by Daniel Stenberg
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * M.I.T. makes no representations about the suitability of
+ * this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ */
+
+#ifdef _WIN32
+#include "mowgli.h"
+#include <windows.h>
+#include <iphlpapi.h>
+
+int
+mowgli_dns_get_windows_nameservers(char *ret_buf, size_t ret_size)
+{
+ FIXED_INFO *fixedinfo, tfixedinfo;
+ DWORD size = sizeof(*fixedinfo);
+ typedef DWORD(WINAPI * get_net_param_func) (FIXED_INFO *, DWORD *);
+ get_net_param_func get_network_params;
+ HMODULE handle;
+ IP_ADDR_STRING *ip_addr;
+ int i, count = 0;
+ size_t ip_size = sizeof("255.255.255.255");
+ size_t left = ret_size;
+ char *ret = ret_buf;
+ HRESULT res;
+
+ if (!(handle = LoadLibrary("iphlpapi.dll")))
+ return 0;
+
+ if (!(get_network_params = (get_net_param_func)GetProcAddress(handle, "GetNetworkParams")))
+ goto quit;
+
+ res = (*get_network_params)(&tfixedinfo, &size);
+ if((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
+ goto quit;
+
+ fixedinfo = mowgli_alloc(size);
+ if(!fixedinfo || (*get_network_params)(fixedinfo, &size) != ERROR_SUCCESS)
+ goto quit;
+
+#ifdef DEBUG
+ mowgli_log("Host Name: %s\n", fixedinfo->HostName);
+ mowgli_log("Domain Name: %s\n", fixedinfo->DomainName);
+ mowgli_log("DNS Servers:\n\t%s (primary)\n", fixedinfo->DnsServerList.IpAddress.String);
+#endif
+
+ if(strlen(fixedinfo->DnsServerList.IpAddress.String) > 0 &&
+ inet_addr(fixedinfo->DnsServerList.IpAddress.String) != INADDR_NONE && left > ip_size)
+ {
+ ret += sprintf(ret, "%s,", fixedinfo->DnsServerList.IpAddress.String);
+ left -= ret - ret_buf;
+ count++;
+ }
+
+ for(i = 0, ip_addr = fixedinfo->DnsServerList.Next; ip_addr && left > ip_size; ip_addr = ip_addr->Next, i++)
+ {
+ if(inet_addr(ip_addr->IpAddress.String) != INADDR_NONE)
+ {
+ ret += sprintf(ret, "%s,", ip_addr->IpAddress.String);
+ left -= ret - ret_buf;
+ count++;
+ }
+#ifdef DEBUG
+ mowgli_log("\t%s (secondary %d)\n", ip_addr->IpAddress.String, i + 1);
+#endif
+ }
+
+ mowgli_free(fixedinfo);
+
+quit:
+ if(handle)
+ FreeLibrary(handle);
+
+ if(left <= ip_size)
+ mowgli_log("Too many nameservers. Truncating to %d addressess", count);
+
+ if(ret > ret_buf)
+ ret[-1] = '\0';
+
+ return count;
+}
+
+#endif
+
diff --git a/src/libmowgli/eventloop/Makefile b/src/libmowgli/eventloop/Makefile
new file mode 100644
index 0000000..23122a1
--- /dev/null
+++ b/src/libmowgli/eventloop/Makefile
@@ -0,0 +1,14 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_EVENTLOOP}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_EVENTLOOP}
+
+SRCS = eventloop.c helper.c pollable.c timer.c null_pollops.c poll_pollops.c epoll_pollops.c kqueue_pollops.c qnx_pollops.c ports_pollops.c select_pollops.c windows_pollops.c
+
+INCLUDES = eventloop.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/eventloop
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
diff --git a/src/libmowgli/eventloop/epoll_pollops.c b/src/libmowgli/eventloop/epoll_pollops.c
new file mode 100644
index 0000000..596b992
--- /dev/null
+++ b/src/libmowgli/eventloop/epoll_pollops.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_SYS_EPOLL_H
+
+#include <sys/epoll.h>
+
+typedef struct {
+ int epoll_fd;
+ int pfd_size;
+ struct epoll_event *pfd;
+} mowgli_epoll_eventloop_private_t;
+
+static void mowgli_epoll_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_epoll_eventloop_private_t *priv;
+
+ priv = mowgli_alloc(sizeof(mowgli_epoll_eventloop_private_t));
+ eventloop->poller = priv;
+
+ priv->pfd_size = getdtablesize();
+ priv->epoll_fd = epoll_create(priv->pfd_size);
+ priv->pfd = mowgli_alloc(sizeof(struct epoll_event) * priv->pfd_size);
+
+ return;
+}
+
+static void mowgli_epoll_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ mowgli_epoll_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ close(priv->epoll_fd);
+
+ mowgli_free(priv->pfd);
+ mowgli_free(priv);
+ return;
+}
+
+static void mowgli_epoll_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_epoll_eventloop_private_t *priv;
+ struct epoll_event ep_event;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ pollable->slot = 0;
+
+ ep_event.events = pollable->slot;
+ ep_event.data.ptr = pollable;
+
+ if (epoll_ctl(priv->epoll_fd, EPOLL_CTL_DEL, pollable->fd, &ep_event) != 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_epoll_eventloop_destroy(): epoll_ctl failed: %d (%s)", errno, strerror(errno));
+ }
+}
+
+static void mowgli_epoll_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_epoll_eventloop_private_t *priv;
+ struct epoll_event ep_event;
+ int op = -1;
+ unsigned int old_flags;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ old_flags = pollable->slot;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ pollable->slot |= EPOLLIN;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ pollable->slot |= EPOLLOUT;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ if (pollable->read_function == NULL)
+ pollable->slot &= ~EPOLLIN;
+
+ if (pollable->write_function == NULL)
+ pollable->slot &= ~EPOLLOUT;
+
+ if (old_flags == 0 && pollable->slot == 0)
+ return;
+ else if (pollable->slot <= 0)
+ op = EPOLL_CTL_DEL;
+ else if (old_flags == 0 && pollable->slot != 0)
+ op = EPOLL_CTL_ADD;
+ else if (pollable->slot != old_flags)
+ op = EPOLL_CTL_MOD;
+
+ if (op == -1)
+ return;
+
+ ep_event.events = pollable->slot;
+ ep_event.data.ptr = pollable;
+
+ if (epoll_ctl(priv->epoll_fd, op, pollable->fd, &ep_event) != 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_epoll_eventloop_setselect(): epoll_ctl failed: %d (%s)", errno, strerror(errno));
+ }
+
+ return;
+}
+
+static void mowgli_epoll_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
+{
+ mowgli_epoll_eventloop_private_t *priv;
+ int i, num, o_errno;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ num = epoll_wait(priv->epoll_fd, priv->pfd, priv->pfd_size, delay);
+
+ o_errno = errno;
+ mowgli_eventloop_synchronize(eventloop);
+
+ if (num < 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_epoll_eventloop_select(): epoll_wait failed: %d (%s)", o_errno, strerror(o_errno));
+ return;
+ }
+
+ for (i = 0; i < num; i++)
+ {
+ mowgli_eventloop_pollable_t *pollable = priv->pfd[i].data.ptr;
+
+ if (priv->pfd[i].events & (EPOLLIN | EPOLLHUP | EPOLLERR) && pollable->read_function != NULL)
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+
+ if (priv->pfd[i].events & (EPOLLOUT | EPOLLHUP | EPOLLERR) && pollable->write_function != NULL)
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+ }
+}
+
+mowgli_eventloop_ops_t _mowgli_epoll_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_epoll_eventloop_pollsetup,
+ .pollshutdown = mowgli_epoll_eventloop_pollshutdown,
+ .setselect = mowgli_epoll_eventloop_setselect,
+ .select = mowgli_epoll_eventloop_select,
+ .destroy = mowgli_epoll_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/eventloop/eventloop.c b/src/libmowgli/eventloop/eventloop.c
new file mode 100644
index 0000000..d2045cd
--- /dev/null
+++ b/src/libmowgli/eventloop/eventloop.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+static mowgli_heap_t *eventloop_heap = NULL;
+
+extern mowgli_eventloop_ops_t _mowgli_null_pollops;
+
+#ifdef HAVE_PORT_CREATE
+extern mowgli_eventloop_ops_t _mowgli_ports_pollops;
+#endif
+#ifdef HAVE_DISPATCH_BLOCK
+extern mowgli_eventloop_ops_t _mowgli_qnx_pollops;
+#endif
+#ifdef HAVE_SELECT
+extern mowgli_eventloop_ops_t _mowgli_select_pollops;
+#endif
+#ifdef HAVE_POLL_H
+extern mowgli_eventloop_ops_t _mowgli_poll_pollops;
+#endif
+#ifdef HAVE_SYS_EPOLL_H
+extern mowgli_eventloop_ops_t _mowgli_epoll_pollops;
+#endif
+#ifdef HAVE_KQUEUE
+extern mowgli_eventloop_ops_t _mowgli_kqueue_pollops;
+#endif
+#if 0
+extern mowgli_eventloop_ops_t _mowgli_winsock_pollops;
+#endif
+
+mowgli_eventloop_t *mowgli_eventloop_create(void)
+{
+ mowgli_eventloop_t *eventloop;
+
+ if (eventloop_heap == NULL)
+ eventloop_heap = mowgli_heap_create(sizeof(mowgli_eventloop_t), 16, BH_NOW);
+
+ eventloop = mowgli_heap_alloc(eventloop_heap);
+
+ eventloop->eventloop_ops = &_mowgli_null_pollops;
+
+#ifdef HAVE_SELECT
+ eventloop->eventloop_ops = &_mowgli_select_pollops;
+#endif
+#ifdef HAVE_POLL_H
+ eventloop->eventloop_ops = &_mowgli_poll_pollops;
+#endif
+#ifdef HAVE_SYS_EPOLL_H
+ eventloop->eventloop_ops = &_mowgli_epoll_pollops;
+#endif
+#ifdef HAVE_KQUEUE
+ eventloop->eventloop_ops = &_mowgli_kqueue_pollops;
+#endif
+#ifdef HAVE_DISPATCH_BLOCK
+ eventloop->eventloop_ops = &_mowgli_qnx_pollops;
+#endif
+#ifdef HAVE_PORT_CREATE
+ eventloop->eventloop_ops = &_mowgli_ports_pollops;
+#endif
+#if 0
+ eventloop->eventloop_ops = &_mowgli_winsock_pollops;
+#endif
+
+ if (mowgli_mutex_init(&eventloop->mutex) != 0)
+ {
+ mowgli_log("couldn't create mutex for eventloop %p, aborting...", eventloop);
+ abort();
+ }
+
+ eventloop->eventloop_ops->pollsetup(eventloop);
+
+ mowgli_eventloop_synchronize(eventloop);
+
+ return eventloop;
+}
+
+void mowgli_eventloop_destroy(mowgli_eventloop_t *eventloop)
+{
+ eventloop->eventloop_ops->pollshutdown(eventloop);
+
+ mowgli_mutex_uninit(&eventloop->mutex);
+ mowgli_heap_free(eventloop_heap, eventloop);
+}
+
+void mowgli_eventloop_run(mowgli_eventloop_t *eventloop)
+{
+ return_if_fail(eventloop != NULL);
+
+ mowgli_mutex_lock(&eventloop->mutex);
+
+ eventloop->death_requested = false;
+
+ while (!eventloop->death_requested)
+ eventloop->eventloop_ops->run_once(eventloop);
+
+ mowgli_mutex_unlock(&eventloop->mutex);
+}
+
+void mowgli_eventloop_run_once(mowgli_eventloop_t *eventloop)
+{
+ return_if_fail(eventloop != NULL);
+
+ mowgli_mutex_lock(&eventloop->mutex);
+
+ eventloop->eventloop_ops->run_once(eventloop);
+
+ mowgli_mutex_unlock(&eventloop->mutex);
+}
+
+void mowgli_eventloop_timeout_once(mowgli_eventloop_t *eventloop, int timeout)
+{
+ return_if_fail(eventloop != NULL);
+
+ mowgli_mutex_lock(&eventloop->mutex);
+
+ if (timeout >= 0)
+ eventloop->eventloop_ops->timeout_once(eventloop, timeout);
+ else
+ eventloop->eventloop_ops->run_once(eventloop);
+
+ mowgli_mutex_unlock(&eventloop->mutex);
+}
+
+void mowgli_eventloop_break(mowgli_eventloop_t *eventloop)
+{
+ return_if_fail(eventloop != NULL);
+
+ eventloop->death_requested = true;
+}
+
+/* convenience function to request null pollops */
+void mowgli_eventloop_timers_only(mowgli_eventloop_t *eventloop)
+{
+ return_if_fail(eventloop != NULL);
+
+ eventloop->eventloop_ops = &_mowgli_null_pollops;
+}
+
+/* userdata setting/getting functions (for bindings) */
+void *mowgli_eventloop_get_data(mowgli_eventloop_t *eventloop)
+{
+ return_val_if_fail(eventloop != NULL, NULL);
+
+ return eventloop->data;
+}
+
+void mowgli_eventloop_set_data(mowgli_eventloop_t *eventloop, void *data)
+{
+ return_if_fail(eventloop != NULL);
+
+ eventloop->data = data;
+}
diff --git a/src/libmowgli/eventloop/eventloop.h b/src/libmowgli/eventloop/eventloop.h
new file mode 100644
index 0000000..4c07b27
--- /dev/null
+++ b/src/libmowgli/eventloop/eventloop.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2011, 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_EVENTLOOP_EVENTLOOP_H__
+#define __MOWGLI_EVENTLOOP_EVENTLOOP_H__
+
+#ifndef _WIN32
+
+typedef int mowgli_descriptor_t;
+
+#else
+
+typedef SOCKET mowgli_descriptor_t;
+
+#endif
+
+typedef enum {
+ MOWGLI_EVENTLOOP_TYPE_POLLABLE,
+ MOWGLI_EVENTLOOP_TYPE_HELPER,
+ MOWGLI_EVENTLOOP_TYPE_ERROR = -1
+} mowgli_eventloop_io_type_t;
+
+typedef struct {
+ mowgli_eventloop_io_type_t type;
+} mowgli_eventloop_io_obj_t;
+
+typedef struct _mowgli_eventloop mowgli_eventloop_t;
+
+typedef struct _mowgli_pollable mowgli_eventloop_pollable_t;
+typedef struct _mowgli_helper mowgli_eventloop_helper_proc_t;
+
+typedef struct _mowgli_linebuf mowgli_linebuf_t;
+
+typedef enum {
+ MOWGLI_EVENTLOOP_IO_READ,
+ MOWGLI_EVENTLOOP_IO_WRITE,
+ MOWGLI_EVENTLOOP_IO_ERROR = -1
+} mowgli_eventloop_io_dir_t;
+
+typedef void mowgli_eventloop_io_t;
+
+/* checked casts */
+static inline mowgli_eventloop_pollable_t *mowgli_eventloop_io_pollable(mowgli_eventloop_io_t *io)
+{
+ mowgli_eventloop_io_obj_t *obj = (mowgli_eventloop_io_obj_t *) io;
+
+ return_val_if_fail(io != NULL, NULL);
+ return_val_if_fail(obj->type == MOWGLI_EVENTLOOP_TYPE_POLLABLE, NULL);
+
+ return (mowgli_eventloop_pollable_t *) io;
+}
+
+static inline mowgli_eventloop_helper_proc_t *mowgli_eventloop_io_helper(mowgli_eventloop_io_t *io)
+{
+ mowgli_eventloop_io_obj_t *obj = (mowgli_eventloop_io_obj_t *) io;
+
+ return_val_if_fail(io != NULL, NULL);
+ return_val_if_fail(obj->type == MOWGLI_EVENTLOOP_TYPE_HELPER, NULL);
+
+ return (mowgli_eventloop_helper_proc_t *) io;
+}
+
+static inline mowgli_eventloop_io_type_t mowgli_eventloop_io_type(mowgli_eventloop_io_t *io)
+{
+ mowgli_eventloop_io_obj_t *obj = (mowgli_eventloop_io_obj_t *) io;
+
+ return_val_if_fail(io != NULL, MOWGLI_EVENTLOOP_TYPE_ERROR);
+
+ return obj->type;
+}
+
+typedef void mowgli_eventloop_io_cb_t(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata);
+
+struct _mowgli_pollable {
+ mowgli_eventloop_io_obj_t type;
+
+ mowgli_descriptor_t fd;
+ unsigned int slot;
+ unsigned int events;
+
+ mowgli_eventloop_io_cb_t *read_function;
+ mowgli_eventloop_io_cb_t *write_function;
+ mowgli_eventloop_io_cb_t *error_function;
+
+ void *userdata;
+
+ mowgli_node_t node;
+
+ mowgli_eventloop_t *eventloop;
+};
+
+typedef struct {
+ void (*timeout_once)(mowgli_eventloop_t *eventloop, int timeout);
+ void (*run_once)(mowgli_eventloop_t *eventloop);
+ void (*pollsetup)(mowgli_eventloop_t *eventloop);
+ void (*pollshutdown)(mowgli_eventloop_t *eventloop);
+ void (*setselect)(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function);
+ void (*select)(mowgli_eventloop_t *eventloop, int time);
+ void (*destroy)(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable);
+} mowgli_eventloop_ops_t;
+
+struct _mowgli_eventloop {
+ time_t currtime;
+ time_t deadline;
+
+ const char *last_ran;
+
+ mowgli_list_t timer_list;
+ mowgli_mutex_t mutex;
+
+ mowgli_eventloop_ops_t *eventloop_ops;
+ void *poller;
+
+ bool death_requested;
+
+ void *data;
+};
+
+typedef void mowgli_event_dispatch_func_t(void *userdata);
+
+typedef struct {
+ mowgli_node_t node;
+
+ mowgli_event_dispatch_func_t *func;
+ void *arg;
+ const char *name;
+ time_t frequency;
+ time_t when;
+ bool active;
+} mowgli_eventloop_timer_t;
+
+static inline void mowgli_eventloop_set_time(mowgli_eventloop_t *eventloop, time_t newtime)
+{
+ return_if_fail(eventloop != NULL);
+
+ eventloop->currtime = newtime;
+}
+
+static inline time_t mowgli_eventloop_get_time(mowgli_eventloop_t *eventloop)
+{
+ return_val_if_fail(eventloop != NULL, 0);
+
+ return eventloop->currtime;
+}
+
+static inline void mowgli_eventloop_synchronize(mowgli_eventloop_t *eventloop)
+{
+ mowgli_eventloop_set_time(eventloop, time(NULL));
+}
+
+static inline bool mowgli_eventloop_ignore_errno(int error)
+{
+ switch (error)
+ {
+#ifdef EINPROGRESS
+ case EINPROGRESS:
+#endif
+#if defined(EWOULDBLOCK)
+ case EWOULDBLOCK:
+#endif
+#if defined(EAGAIN) && (EWOULDBLOCK != EAGAIN)
+ case EAGAIN:
+#endif
+#ifdef EINTR
+ case EINTR:
+#endif
+#ifdef ERESTART
+ case ERESTART:
+#endif
+#ifdef ENOBUFS
+ case ENOBUFS:
+#endif
+#ifdef ENOENT
+ case ENOENT:
+#endif
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
+typedef void mowgli_eventloop_helper_start_fn_t(mowgli_eventloop_helper_proc_t *helper, void *userdata);
+
+struct _mowgli_helper {
+ mowgli_eventloop_io_obj_t type;
+
+ mowgli_process_t *child;
+ mowgli_eventloop_t *eventloop;
+
+ mowgli_descriptor_t fd;
+ mowgli_eventloop_pollable_t *pfd;
+
+ mowgli_eventloop_io_cb_t *read_function;
+
+ void *userdata;
+};
+
+/* helper.c */
+extern mowgli_eventloop_helper_proc_t *mowgli_helper_create(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_start_fn_t *start_fn, const char *helpername, void *userdata);
+
+/* creation of helpers inside other executable images */
+extern mowgli_eventloop_helper_proc_t *mowgli_helper_spawn(mowgli_eventloop_t *eventloop, const char *path, char *const argv[]);
+extern mowgli_eventloop_helper_proc_t *mowgli_helper_setup(mowgli_eventloop_t *eventloop);
+
+/* synchronization of helpers happens on reading from mowgli_eventloop_helper_proc_t::in_pfd. */
+extern void mowgli_helper_set_read_cb(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_proc_t *helper, mowgli_eventloop_io_cb_t *read_fn);
+extern void mowgli_helper_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_proc_t *helper);
+
+/* null_pollops.c */
+extern void mowgli_simple_eventloop_run_once(mowgli_eventloop_t *eventloop);
+extern void mowgli_simple_eventloop_timeout_once(mowgli_eventloop_t *eventloop, int timeout);
+extern void mowgli_simple_eventloop_error_handler(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata);
+
+/* eventloop.c */
+extern mowgli_eventloop_t *mowgli_eventloop_create(void);
+extern void mowgli_eventloop_destroy(mowgli_eventloop_t *eventloop);
+extern void mowgli_eventloop_run(mowgli_eventloop_t *eventloop);
+extern void mowgli_eventloop_run_once(mowgli_eventloop_t *eventloop);
+extern void mowgli_eventloop_timeout_once(mowgli_eventloop_t *eventloop, int timeout);
+extern void mowgli_eventloop_break(mowgli_eventloop_t *eventloop);
+extern void mowgli_eventloop_timers_only(mowgli_eventloop_t *eventloop);
+extern void mowgli_eventloop_set_data(mowgli_eventloop_t *eventloop, void *data);
+extern void *mowgli_eventloop_get_data(mowgli_eventloop_t *eventloop);
+
+/* timer.c */
+extern mowgli_eventloop_timer_t *mowgli_timer_add(mowgli_eventloop_t *eventloop, const char *name, mowgli_event_dispatch_func_t *func, void *arg, time_t when);
+extern mowgli_eventloop_timer_t *mowgli_timer_add_once(mowgli_eventloop_t *eventloop, const char *name, mowgli_event_dispatch_func_t *func, void *arg, time_t when);
+extern void mowgli_timer_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_timer_t *timer);
+extern void mowgli_eventloop_run_timers(mowgli_eventloop_t *eventloop);
+extern time_t mowgli_eventloop_next_timer(mowgli_eventloop_t *eventloop);
+extern mowgli_eventloop_timer_t *mowgli_timer_find(mowgli_eventloop_t *eventloop, mowgli_event_dispatch_func_t *func, void *arg);
+
+/* pollable.c */
+extern mowgli_eventloop_pollable_t *mowgli_pollable_create(mowgli_eventloop_t *eventloop, mowgli_descriptor_t fd, void *userdata);
+extern void mowgli_pollable_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable);
+extern void mowgli_pollable_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function);
+extern void mowgli_pollable_set_nonblocking(mowgli_eventloop_pollable_t *pollable, bool nonblocking);
+
+#endif
+
diff --git a/src/libmowgli/eventloop/helper.c b/src/libmowgli/eventloop/helper.c
new file mode 100644
index 0000000..b89e447
--- /dev/null
+++ b/src/libmowgli/eventloop/helper.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+typedef struct {
+ mowgli_eventloop_helper_start_fn_t *start_fn;
+ void *userdata;
+ mowgli_descriptor_t fd;
+} mowgli_helper_create_req_t;
+
+static void
+mowgli_helper_trampoline(mowgli_helper_create_req_t *req)
+{
+ mowgli_eventloop_helper_proc_t *helper;
+#ifndef _WIN32
+ int i, x;
+#endif
+
+ return_if_fail(req != NULL);
+ return_if_fail(req->start_fn != NULL);
+
+ helper = mowgli_alloc(sizeof(mowgli_eventloop_helper_proc_t));
+ helper->type.type = MOWGLI_EVENTLOOP_TYPE_HELPER;
+ helper->fd = req->fd;
+
+#ifndef _WIN32
+ for (i = 0; i < 1024; i++)
+ {
+ if (i != req->fd)
+ close(i);
+ }
+
+ x = open("/dev/null", O_RDWR);
+
+ for (i = 0; i < 2; i++)
+ {
+ if (req->fd != i)
+ dup2(x, i);
+ }
+
+ if (x > 2)
+ close(x);
+#endif
+
+ helper->eventloop = mowgli_eventloop_create();
+ helper->pfd = mowgli_pollable_create(helper->eventloop, helper->fd, helper);
+ helper->userdata = req->userdata;
+
+ mowgli_pollable_set_nonblocking(helper->pfd, true);
+
+ req->start_fn(helper, helper->userdata);
+}
+
+mowgli_eventloop_helper_proc_t *
+mowgli_helper_create(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_start_fn_t *start_fn, const char *helpername, void *userdata)
+{
+ mowgli_eventloop_helper_proc_t *helper;
+ mowgli_helper_create_req_t child;
+ int io_fd[2];
+
+ return_val_if_fail(eventloop != NULL, NULL);
+ return_val_if_fail(start_fn != NULL, NULL);
+
+ child.start_fn = start_fn;
+ child.userdata = userdata;
+
+ helper = mowgli_alloc(sizeof(mowgli_eventloop_helper_proc_t));
+ helper->type.type = MOWGLI_EVENTLOOP_TYPE_HELPER;
+ helper->eventloop = eventloop;
+
+ socketpair(AF_UNIX, SOCK_STREAM, 0, io_fd);
+
+ /* set up helper/child fd mapping */
+ helper->fd = io_fd[0];
+ child.fd = io_fd[1];
+
+ /* make pollables and make them non-blocking */
+ helper->pfd = mowgli_pollable_create(eventloop, helper->fd, helper);
+ mowgli_pollable_set_nonblocking(helper->pfd, true);
+
+ /* spawn helper process using mowgli_process_clone() */
+ helper->child = mowgli_process_clone((mowgli_process_start_fn_t) mowgli_helper_trampoline, helpername, &child);
+
+ if (helper->child == NULL)
+ {
+ mowgli_pollable_destroy(eventloop, helper->pfd);
+
+ close(io_fd[0]);
+ close(io_fd[1]);
+
+ mowgli_free(helper);
+ return NULL;
+ }
+
+ close(child.fd);
+
+ return helper;
+}
+
+mowgli_eventloop_helper_proc_t *
+mowgli_helper_spawn(mowgli_eventloop_t *eventloop, const char *path, char *const argv[])
+{
+ mowgli_eventloop_helper_proc_t *helper;
+ int io_fd[2];
+ char buf[64];
+
+ return_val_if_fail(eventloop != NULL, NULL);
+ return_val_if_fail(path != NULL, NULL);
+
+ helper = mowgli_alloc(sizeof(mowgli_eventloop_helper_proc_t));
+ helper->type.type = MOWGLI_EVENTLOOP_TYPE_HELPER;
+ helper->eventloop = eventloop;
+
+ socketpair(AF_UNIX, SOCK_STREAM, 0, io_fd);
+
+ /* set up helper/child fd mapping */
+ helper->fd = io_fd[0];
+
+ /* make pollables and make them non-blocking */
+ helper->pfd = mowgli_pollable_create(eventloop, helper->fd, helper);
+
+ snprintf(buf, sizeof buf, "%d", io_fd[1]);
+ setenv("IO_FD", buf, 1);
+
+ /* Spawn helper process using mowgli_process_spawn(), helper will get
+ * IO_FD mapping from getenv(). Ugly hack, but it works...
+ * --nenolod
+ */
+ helper->child = mowgli_process_spawn(path, argv);
+
+ if (helper->child == NULL)
+ {
+ mowgli_pollable_destroy(eventloop, helper->pfd);
+
+ close(io_fd[0]);
+ close(io_fd[1]);
+
+ mowgli_free(helper);
+ return NULL;
+ }
+
+ close(io_fd[1]);
+
+ return helper;
+}
+
+/* Set up a helper connection to parent using getenv() */
+mowgli_eventloop_helper_proc_t *
+mowgli_helper_setup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_eventloop_helper_proc_t *helper;
+ const char *env_io_fd;
+
+ env_io_fd = getenv("IO_FD");
+
+ /* this shouldn't be a hard-fail because some idiot may run the helper from
+ * the cmdline. allow the helper to error out gracefully if not spawned as
+ * a helper.
+ */
+ if (env_io_fd == NULL)
+ return NULL;
+
+ helper = mowgli_alloc(sizeof(mowgli_eventloop_helper_proc_t));
+ helper->type.type = MOWGLI_EVENTLOOP_TYPE_HELPER;
+ helper->eventloop = eventloop;
+ helper->fd = atoi(env_io_fd);
+ helper->pfd = mowgli_pollable_create(helper->eventloop, helper->fd, helper);
+
+ mowgli_pollable_set_nonblocking(helper->pfd, true);
+
+ return helper;
+}
+
+static void
+mowgli_helper_io_trampoline(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_eventloop_helper_proc_t *helper = userdata;
+
+ switch (dir) {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ if (helper->read_function != NULL)
+ return helper->read_function(eventloop, helper, MOWGLI_EVENTLOOP_IO_READ, helper->userdata);
+ default:
+ break;
+ }
+}
+
+void
+mowgli_helper_set_read_cb(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_proc_t *helper, mowgli_eventloop_io_cb_t *read_fn)
+{
+ return_if_fail(eventloop != NULL);
+ return_if_fail(helper != NULL);
+
+ if (read_fn == NULL)
+ mowgli_pollable_setselect(eventloop, helper->pfd, MOWGLI_EVENTLOOP_IO_READ, NULL);
+
+ helper->read_function = read_fn;
+ mowgli_pollable_setselect(eventloop, helper->pfd, MOWGLI_EVENTLOOP_IO_READ, mowgli_helper_io_trampoline);
+}
+
+void
+mowgli_helper_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_helper_proc_t *helper)
+{
+ return_if_fail(eventloop != NULL);
+ return_if_fail(helper != NULL);
+
+ mowgli_process_kill(helper->child);
+ mowgli_pollable_destroy(eventloop, helper->pfd);
+ close(helper->fd);
+
+ mowgli_free(helper);
+}
diff --git a/src/libmowgli/eventloop/kqueue_pollops.c b/src/libmowgli/eventloop/kqueue_pollops.c
new file mode 100644
index 0000000..7bfa2bb
--- /dev/null
+++ b/src/libmowgli/eventloop/kqueue_pollops.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>.
+ * Copyright (c) 2011 Jilles Tjoelker <jilles@stack.nl>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_KQUEUE
+
+#include <sys/event.h>
+
+typedef struct {
+ int kqueue_fd;
+ int nevents;
+ struct kevent *events;
+} mowgli_kqueue_eventloop_private_t;
+
+static void mowgli_kqueue_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_kqueue_eventloop_private_t *priv;
+
+ priv = mowgli_alloc(sizeof(mowgli_kqueue_eventloop_private_t));
+ eventloop->poller = priv;
+
+ priv->nevents = getdtablesize();
+ priv->kqueue_fd = kqueue();
+ priv->events = mowgli_alloc(sizeof(struct kevent) * priv->nevents);
+
+ return;
+}
+
+static void mowgli_kqueue_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ mowgli_kqueue_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ close(priv->kqueue_fd);
+
+ mowgli_free(priv->events);
+ mowgli_free(priv);
+ return;
+}
+
+static void mowgli_kqueue_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_kqueue_eventloop_private_t *priv;
+ struct kevent event;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+ EV_SET(&event, pollable->fd, EVFILT_READ | EVFILT_WRITE, EV_DELETE, 0, 0, pollable);
+ if (kevent(priv->kqueue_fd, &event, 1, NULL, 0,
+ &(const struct timespec){ .tv_sec = 0, .tv_nsec = 0}
+ ) != 0)
+ {
+ mowgli_log("mowgli_kqueue_eventloop_setselect(): kevent failed: %d (%s)", errno, strerror(errno));
+ }
+}
+
+static void mowgli_kqueue_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_kqueue_eventloop_private_t *priv;
+ mowgli_eventloop_io_cb_t **fptr;
+ struct kevent event;
+ int filter;
+ bool change;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ change = false;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ fptr = &pollable->read_function;
+ filter = EVFILT_READ;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ fptr = &pollable->write_function;
+ filter = EVFILT_WRITE;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ return;
+ }
+
+ change = (*fptr != NULL) != (event_function != NULL);
+
+ *fptr = event_function;
+
+ if (!change)
+ return;
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ EV_SET(&event, pollable->fd, filter,
+ event_function ? EV_ADD : EV_DELETE, 0, 0, pollable);
+ if (kevent(priv->kqueue_fd, &event, 1, NULL, 0,
+ &(const struct timespec){ .tv_sec = 0, .tv_nsec = 0}
+ ) != 0)
+ {
+ mowgli_log("mowgli_kqueue_eventloop_setselect(): kevent failed: %d (%s)", errno, strerror(errno));
+ }
+}
+
+static void mowgli_kqueue_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
+{
+ mowgli_kqueue_eventloop_private_t *priv;
+ int i, num, o_errno;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ num = kevent(priv->kqueue_fd, NULL, 0, priv->events, priv->nevents,
+ delay >= 0 ? &(const struct timespec){ .tv_sec = delay / 1000,
+ .tv_nsec = delay % 1000 * 1000000 } : NULL);
+
+ o_errno = errno;
+ mowgli_eventloop_synchronize(eventloop);
+
+ if (num < 0)
+ {
+ if (mowgli_eventloop_ignore_errno(o_errno))
+ return;
+
+ mowgli_log("mowgli_kqueue_eventloop_select(): kevent failed: %d (%s)", o_errno, strerror(o_errno));
+ return;
+ }
+
+ for (i = 0; i < num; i++)
+ {
+ mowgli_eventloop_pollable_t *pollable = priv->events[i].udata;
+
+ if (priv->events[i].filter == EVFILT_READ &&
+ pollable->read_function != NULL)
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+
+ if (priv->events[i].filter == EVFILT_WRITE &&
+ pollable->write_function != NULL)
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+
+ /* XXX Perhaps we need to recheck read_function and
+ * write_function now.
+ */
+ }
+}
+
+mowgli_eventloop_ops_t _mowgli_kqueue_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_kqueue_eventloop_pollsetup,
+ .pollshutdown = mowgli_kqueue_eventloop_pollshutdown,
+ .setselect = mowgli_kqueue_eventloop_setselect,
+ .select = mowgli_kqueue_eventloop_select,
+ .destroy = mowgli_kqueue_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/eventloop/null_pollops.c b/src/libmowgli/eventloop/null_pollops.c
new file mode 100644
index 0000000..8fcabe4
--- /dev/null
+++ b/src/libmowgli/eventloop/null_pollops.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+void mowgli_simple_eventloop_timeout_once(mowgli_eventloop_t *eventloop, int timeout)
+{
+ time_t delay, currtime;
+ int t;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(eventloop->eventloop_ops != NULL);
+
+ mowgli_eventloop_synchronize(eventloop);
+
+ currtime = mowgli_eventloop_get_time(eventloop);
+ delay = mowgli_eventloop_next_timer(eventloop);
+
+ if (delay <= currtime)
+ {
+ mowgli_eventloop_run_timers(eventloop);
+ mowgli_eventloop_synchronize(eventloop);
+
+ currtime = mowgli_eventloop_get_time(eventloop);
+ delay = mowgli_eventloop_next_timer(eventloop);
+ }
+
+ if (timeout)
+ t = timeout;
+ else
+ {
+ if (delay <= currtime)
+ t = -1;
+ else
+ t = (delay - currtime) * 1000;
+ }
+
+#ifdef DEBUG
+ mowgli_log("delay: %ld, currtime: %ld, select period: %d", delay, currtime, t);
+#endif
+
+ eventloop->eventloop_ops->select(eventloop, t);
+
+}
+
+void mowgli_simple_eventloop_run_once(mowgli_eventloop_t *eventloop)
+{
+ eventloop->eventloop_ops->timeout_once(eventloop, 0);
+}
+
+void mowgli_simple_eventloop_error_handler(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_eventloop_pollable_t *pollable = mowgli_eventloop_io_pollable(io);
+
+ if (pollable != NULL)
+ mowgli_pollable_destroy(eventloop, pollable);
+}
+
+static void mowgli_null_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ return;
+}
+
+static void mowgli_null_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ return;
+}
+
+static void mowgli_null_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ return;
+}
+
+static void mowgli_null_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_log("null eventloop does not really do polling, events for pollable<%p> will be ignored", pollable);
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+ return;
+}
+
+static void mowgli_null_eventloop_select(mowgli_eventloop_t *eventloop, int time)
+{
+ usleep(time);
+}
+
+mowgli_eventloop_ops_t _mowgli_null_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_null_eventloop_pollsetup,
+ .pollshutdown = mowgli_null_eventloop_pollshutdown,
+ .setselect = mowgli_null_eventloop_setselect,
+ .select = mowgli_null_eventloop_select,
+ .destroy = mowgli_null_eventloop_destroy,
+};
diff --git a/src/libmowgli/eventloop/poll_pollops.c b/src/libmowgli/eventloop/poll_pollops.c
new file mode 100644
index 0000000..0bea454
--- /dev/null
+++ b/src/libmowgli/eventloop/poll_pollops.c
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_POLL_H
+
+#include <poll.h>
+
+#ifndef POLLRDNORM
+#define POLLRDNORM POLLIN
+#endif
+#ifndef POLLWRNORM
+#define POLLWRNORM POLLOUT
+#endif
+
+typedef struct {
+ struct pollfd pollfds[FD_SETSIZE];
+ nfds_t nfds;
+ mowgli_list_t pollable_list;
+} mowgli_poll_eventloop_private_t;
+
+static nfds_t update_poll_fds(mowgli_eventloop_t *eventloop)
+{
+ mowgli_node_t *n, *tn;
+ mowgli_poll_eventloop_private_t *priv;
+ nfds_t slot = 0;
+
+ return_val_if_fail(eventloop != NULL, 0);
+
+ priv = eventloop->poller;
+
+ memset(priv->pollfds, '\0', sizeof(priv->pollfds));
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ mowgli_eventloop_pollable_t *pollable = n->data;
+
+#ifdef DEBUG
+ mowgli_log("considering fd %d pollable %p count %d", pollable->fd, pollable, priv->pollable_list.count);
+#endif
+
+ if (pollable->read_function || pollable->write_function)
+ {
+ priv->pollfds[slot].fd = pollable->fd;
+
+ if (pollable->read_function)
+ priv->pollfds[slot].events |= POLLRDNORM;
+
+ if (pollable->write_function)
+ priv->pollfds[slot].events |= POLLWRNORM;
+
+ priv->pollfds[slot].revents = 0;
+ pollable->slot = slot;
+ slot++;
+ }
+ else
+ pollable->slot = -1;
+ }
+
+ return slot;
+}
+
+static void mowgli_poll_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_poll_eventloop_private_t *priv;
+
+ priv = mowgli_alloc(sizeof(mowgli_poll_eventloop_private_t));
+ eventloop->poller = priv;
+
+ return;
+}
+
+static void mowgli_poll_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ mowgli_node_t *n, *tn;
+ mowgli_poll_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ mowgli_node_delete(n, &priv->pollable_list);
+ }
+
+ mowgli_free(priv);
+ return;
+}
+
+static void mowgli_poll_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_poll_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+ mowgli_node_delete(&pollable->node, &priv->pollable_list);
+}
+
+static void mowgli_poll_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_poll_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ if (pollable->read_function || pollable->write_function)
+ mowgli_node_delete(&pollable->node, &priv->pollable_list);
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ if (pollable->read_function || pollable->write_function)
+ mowgli_node_add(pollable, &pollable->node, &priv->pollable_list);
+
+ return;
+}
+
+static void mowgli_poll_eventloop_select(mowgli_eventloop_t *eventloop, int time)
+{
+ mowgli_node_t *n, *tn;
+ nfds_t nfds;
+ mowgli_eventloop_pollable_t *pollable;
+ mowgli_poll_eventloop_private_t *priv;
+ int slot;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ nfds = update_poll_fds(eventloop);
+
+ if (poll(priv->pollfds, nfds, time) > 0)
+ {
+ mowgli_eventloop_synchronize(eventloop);
+
+ /* iterate twice so we don't touch freed memory if a pollable is destroyed */
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ pollable = n->data;
+ slot = pollable->slot;
+
+ if (slot == -1 || priv->pollfds[slot].revents == 0)
+ continue;
+
+ if (priv->pollfds[slot].revents & (POLLRDNORM | POLLIN | POLLHUP | POLLERR) && pollable->read_function)
+ {
+#ifdef DEBUG
+ mowgli_log("run %p(%p, %p, MOWGLI_EVENTLOOP_IO_READ, %p)\n", pollable->read_function, eventloop, pollable, pollable->userdata);
+#endif
+
+ priv->pollfds[slot].events &= ~(POLLRDNORM | POLLIN);
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+ }
+ }
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ pollable = n->data;
+ slot = pollable->slot;
+
+ if (slot == -1 || priv->pollfds[slot].revents == 0)
+ continue;
+
+ if (priv->pollfds[slot].revents & (POLLWRNORM | POLLOUT | POLLHUP | POLLERR) && pollable->write_function)
+ {
+#ifdef DEBUG
+ mowgli_log("run %p(%p, %p, MOWGLI_EVENTLOOP_IO_WRITE, %p)\n", pollable->write_function, eventloop, pollable, pollable->userdata);
+#endif
+
+ priv->pollfds[slot].events &= ~(POLLWRNORM | POLLOUT);
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+ }
+ }
+ }
+}
+
+mowgli_eventloop_ops_t _mowgli_poll_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_poll_eventloop_pollsetup,
+ .pollshutdown = mowgli_poll_eventloop_pollshutdown,
+ .setselect = mowgli_poll_eventloop_setselect,
+ .select = mowgli_poll_eventloop_select,
+ .destroy = mowgli_poll_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/eventloop/pollable.c b/src/libmowgli/eventloop/pollable.c
new file mode 100644
index 0000000..e2c2e2a
--- /dev/null
+++ b/src/libmowgli/eventloop/pollable.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+static mowgli_heap_t *pollable_heap = NULL;
+
+mowgli_eventloop_pollable_t *mowgli_pollable_create(mowgli_eventloop_t *eventloop, mowgli_descriptor_t fd, void *userdata)
+{
+ mowgli_eventloop_pollable_t *pollable;
+
+ return_val_if_fail(eventloop != NULL, NULL);
+
+ if (pollable_heap == NULL)
+ pollable_heap = mowgli_heap_create(sizeof(mowgli_eventloop_pollable_t), 16, BH_NOW);
+
+ pollable = mowgli_heap_alloc(pollable_heap);
+
+ pollable->eventloop = eventloop;
+ pollable->type.type = MOWGLI_EVENTLOOP_TYPE_POLLABLE;
+ pollable->fd = fd;
+ pollable->userdata = userdata;
+
+ return pollable;
+}
+
+void mowgli_pollable_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ /* unregister any interest in the pollable. */
+ eventloop->eventloop_ops->destroy(eventloop, pollable);
+
+ mowgli_heap_free(pollable_heap, pollable);
+}
+
+void mowgli_pollable_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+ return_if_fail(eventloop->eventloop_ops != NULL);
+
+ eventloop->eventloop_ops->setselect(eventloop, pollable, dir, event_function);
+}
+
+void mowgli_pollable_set_nonblocking(mowgli_eventloop_pollable_t *pollable, bool nonblocking)
+{
+#if defined(HAVE_FCNTL)
+ unsigned long flags;
+
+ return_if_fail(pollable != NULL);
+
+ flags = fcntl(pollable->fd, F_GETFL);
+
+ if (nonblocking)
+ flags |= O_NONBLOCK;
+ else
+ flags &= ~O_NONBLOCK;
+
+ fcntl(pollable->fd, F_SETFL, flags);
+#elif defined(HAVE_WINSOCK2_H)
+ u_long mode;
+
+ return_if_fail(pollable != NULL);
+
+ mode = nonblocking;
+
+ ioctlsocket(pollable->fd, FIONBIO, &mode);
+#endif
+}
diff --git a/src/libmowgli/eventloop/ports_pollops.c b/src/libmowgli/eventloop/ports_pollops.c
new file mode 100644
index 0000000..bc838da
--- /dev/null
+++ b/src/libmowgli/eventloop/ports_pollops.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_PORT_CREATE
+
+#include <port.h>
+
+typedef struct {
+ int port_fd;
+ int pfd_size;
+ port_event_t *pfd;
+} mowgli_ports_eventloop_private_t;
+
+static void mowgli_ports_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_ports_eventloop_private_t *priv;
+
+ priv = mowgli_alloc(sizeof(mowgli_ports_eventloop_private_t));
+ eventloop->poller = priv;
+
+ priv->pfd_size = getdtablesize();
+ priv->port_fd = port_create();
+ priv->pfd = mowgli_alloc(sizeof(port_event_t) * priv->pfd_size);
+
+ return;
+}
+
+static void mowgli_ports_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ mowgli_ports_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ close(priv->port_fd);
+
+ mowgli_free(priv->pfd);
+ mowgli_free(priv);
+ return;
+}
+
+static void mowgli_ports_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_ports_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ pollable->slot = 0;
+
+ if (port_dissociate(priv->port_fd, PORT_SOURCE_FD, (uintptr_t) pollable->fd) < 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_ports_eventloop_destroy(): port_dissociate failed: %d (%s)", errno, strerror(errno));
+ }
+}
+
+static void mowgli_ports_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_ports_eventloop_private_t *priv;
+ unsigned int old_flags;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ old_flags = pollable->slot;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ pollable->slot |= POLLIN;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ pollable->slot |= POLLOUT;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ if (pollable->read_function == NULL)
+ pollable->slot &= ~POLLIN;
+
+ if (pollable->write_function == NULL)
+ pollable->slot &= ~POLLOUT;
+
+ if (old_flags == 0 && pollable->slot == 0)
+ return;
+ else if (pollable->slot == 0)
+ {
+ port_dissociate(priv->port_fd, PORT_SOURCE_FD, (uintptr_t) pollable->fd);
+ return;
+ }
+
+ if (port_associate(priv->port_fd, PORT_SOURCE_FD, (uintptr_t) pollable->fd, pollable->slot, pollable) < 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_ports_eventloop_setselect(): port_associate failed: %d (%s)", errno, strerror(errno));
+ }
+
+ return;
+}
+
+static void mowgli_ports_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
+{
+ mowgli_ports_eventloop_private_t *priv;
+ int i, num, o_errno, nget = 1;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ num = port_getn(priv->port_fd, priv->pfd, priv->pfd_size, &nget,
+ delay >= 0 ? &(struct timespec){ .tv_sec = delay / 1000, .tv_nsec = delay % 1000 * 1000000 } : NULL);
+
+ o_errno = errno;
+ mowgli_eventloop_synchronize(eventloop);
+
+ if (num < 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_ports_eventloop_select(): port_getn failed: %d (%s)", o_errno, strerror(o_errno));
+ return;
+ }
+
+ for (i = 0; i < nget; i++)
+ {
+ mowgli_eventloop_pollable_t *pollable = priv->pfd[i].portev_user;
+
+ if (priv->pfd[i].portev_events & (POLLIN | POLLHUP | POLLERR) && pollable->read_function != NULL)
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+
+ if (priv->pfd[i].portev_events & (POLLOUT | POLLHUP | POLLERR) && pollable->write_function != NULL)
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+ }
+}
+
+mowgli_eventloop_ops_t _mowgli_ports_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_ports_eventloop_pollsetup,
+ .pollshutdown = mowgli_ports_eventloop_pollshutdown,
+ .setselect = mowgli_ports_eventloop_setselect,
+ .select = mowgli_ports_eventloop_select,
+ .destroy = mowgli_ports_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/eventloop/qnx_pollops.c b/src/libmowgli/eventloop/qnx_pollops.c
new file mode 100644
index 0000000..7417ef4
--- /dev/null
+++ b/src/libmowgli/eventloop/qnx_pollops.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_DISPATCH_BLOCK
+
+#include <sys/iofunc.h>
+#include <sys/dispatch.h>
+
+typedef struct {
+ dispatch_t *dpp;
+ dispatch_context_t *ctp;
+} mowgli_qnx_eventloop_private_t;
+
+static void mowgli_qnx_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_qnx_eventloop_private_t *priv;
+
+ priv = mowgli_alloc(sizeof(mowgli_qnx_eventloop_private_t));
+ eventloop->poller = priv;
+
+ priv->dpp = dispatch_create();
+
+ return;
+}
+
+static void mowgli_qnx_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ mowgli_qnx_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ if (priv->ctp != NULL)
+ dispatch_context_free(priv->ctp);
+
+ dispatch_destroy(priv->dpp);
+ mowgli_free(priv);
+
+ return;
+}
+
+static void mowgli_qnx_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_qnx_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+ if (select_detach(priv->dpp, pollable->fd) != 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_qnx_eventloop_destroy(): select_detach failed: %d (%s)", errno, strerror(errno));
+ }
+}
+
+static void mowgli_qnx_eventloop_event_cb(select_context_t *ctp, mowgli_descriptor_t fd, unsigned int flags, void *userdata)
+{
+ mowgli_eventloop_t *eventloop;
+ mowgli_eventloop_pollable_t *pollable;
+
+ return_if_fail(ctp != NULL);
+ return_if_fail(userdata != NULL);
+
+ pollable = userdata;
+ eventloop = pollable->eventloop;
+
+ return_if_fail(eventloop != NULL);
+
+ if (flags & (SELECT_FLAG_READ | SELECT_FLAG_EXCEPT))
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+
+ if (flags & (SELECT_FLAG_WRITE | SELECT_FLAG_EXCEPT))
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+}
+
+static void mowgli_qnx_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_qnx_eventloop_private_t *priv;
+ select_attr_t attr = {};
+ unsigned int old_flags;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ old_flags = pollable->slot;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ pollable->slot |= SELECT_FLAG_READ;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ pollable->slot |= SELECT_FLAG_WRITE;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ if (pollable->read_function == NULL)
+ pollable->slot &= ~SELECT_FLAG_READ;
+
+ if (pollable->write_function == NULL)
+ pollable->slot &= ~SELECT_FLAG_WRITE;
+
+ if (old_flags == 0 && pollable->slot == 0)
+ return;
+
+ if (old_flags)
+ select_detach(priv->dpp, pollable->fd);
+
+ if (pollable->slot)
+ {
+ if (select_attach(priv->dpp, &attr, pollable->fd, pollable->slot, mowgli_qnx_eventloop_event_cb, pollable) != 0)
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_qnx_eventloop_setselect(): select_attach failed: %d (%s)", errno, strerror(errno));
+ }
+ }
+
+ return;
+}
+
+static void mowgli_qnx_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
+{
+ dispatch_context_t *new_ctp;
+ mowgli_qnx_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ /* set timeout if needed */
+ dispatch_timeout(priv->dpp, delay >= 0 ? &(struct timespec){ .tv_sec = delay / 1000, .tv_nsec = delay % 1000 * 1000000 } : NULL);
+
+ if (priv->ctp != NULL)
+ priv->ctp = dispatch_context_alloc(priv->dpp);
+
+ /* if dispatch_block returns non-NULL, priv->ctp may have been realloc()'d, NULL is error condition */
+ if ((new_ctp = dispatch_block(priv->ctp)) != NULL)
+ priv->ctp = new_ctp;
+ else
+ {
+ if (mowgli_eventloop_ignore_errno(errno))
+ return;
+
+ mowgli_log("mowgli_qnx_eventloop_select(): dispatch_block failed: %d (%s)", errno, strerror(errno));
+ }
+
+ mowgli_eventloop_synchronize(eventloop);
+}
+
+mowgli_eventloop_ops_t _mowgli_qnx_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_qnx_eventloop_pollsetup,
+ .pollshutdown = mowgli_qnx_eventloop_pollshutdown,
+ .setselect = mowgli_qnx_eventloop_setselect,
+ .select = mowgli_qnx_eventloop_select,
+ .destroy = mowgli_qnx_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/eventloop/select_pollops.c b/src/libmowgli/eventloop/select_pollops.c
new file mode 100644
index 0000000..467b4f5
--- /dev/null
+++ b/src/libmowgli/eventloop/select_pollops.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_SELECT
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+typedef struct {
+ mowgli_list_t pollable_list;
+} mowgli_select_eventloop_private_t;
+
+static void mowgli_select_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ mowgli_select_eventloop_private_t *priv;
+
+ priv = mowgli_alloc(sizeof(mowgli_select_eventloop_private_t));
+ eventloop->poller = priv;
+
+ return;
+}
+
+static void mowgli_select_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ mowgli_node_t *n, *tn;
+ mowgli_select_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ mowgli_node_delete(n, &priv->pollable_list);
+ }
+
+ mowgli_free(priv);
+ return;
+}
+
+static void mowgli_select_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_select_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+ mowgli_node_delete(&pollable->node, &priv->pollable_list);
+}
+
+static void mowgli_select_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_select_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ if (pollable->read_function || pollable->write_function)
+ mowgli_node_delete(&pollable->node, &priv->pollable_list);
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ if (pollable->read_function || pollable->write_function)
+ mowgli_node_add(pollable, &pollable->node, &priv->pollable_list);
+
+ return;
+}
+
+static void mowgli_select_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
+{
+ mowgli_node_t *n, *tn;
+ mowgli_eventloop_pollable_t *pollable;
+ mowgli_select_eventloop_private_t *priv;
+ mowgli_descriptor_t highest_fd = 0;
+ fd_set rfds, wfds, efds;
+ struct timeval tv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ FD_ZERO(&rfds);
+ FD_ZERO(&wfds);
+ FD_ZERO(&efds);
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ mowgli_eventloop_pollable_t *pollable = n->data;
+
+#ifdef DEBUG
+ mowgli_log("considering fd %d pollable %p count %d", pollable->fd, pollable, priv->pollable_list.count);
+#endif
+
+ if (pollable->read_function || pollable->write_function)
+ {
+ if (pollable->fd > highest_fd)
+ highest_fd = pollable->fd;
+
+ if (pollable->read_function)
+ {
+ FD_SET(pollable->fd, &rfds);
+ FD_SET(pollable->fd, &efds);
+ }
+
+ if (pollable->write_function)
+ {
+ FD_SET(pollable->fd, &wfds);
+ FD_SET(pollable->fd, &efds);
+ }
+ }
+ }
+
+ tv.tv_sec = 1;
+
+ if (select(highest_fd + 1, &rfds, &wfds, &efds, &tv) > 0)
+ {
+ mowgli_eventloop_synchronize(eventloop);
+
+ /* iterate twice so we don't touch freed memory if a pollable is destroyed */
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ pollable = n->data;
+
+ if ((FD_ISSET(pollable->fd, &rfds) || FD_ISSET(pollable->fd, &efds)) && pollable->read_function)
+ {
+#ifdef DEBUG
+ mowgli_log("run %p(%p, %p, MOWGLI_EVENTLOOP_IO_READ, %p)\n", pollable->read_function, eventloop, pollable, pollable->userdata);
+#endif
+
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+ }
+ }
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, priv->pollable_list.head)
+ {
+ pollable = n->data;
+
+ if ((FD_ISSET(pollable->fd, &wfds) || FD_ISSET(pollable->fd, &efds)) && pollable->write_function)
+ {
+#ifdef DEBUG
+ mowgli_log("run %p(%p, %p, MOWGLI_EVENTLOOP_IO_WRITE, %p)\n", pollable->write_function, eventloop, pollable, pollable->userdata);
+#endif
+
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+ }
+ }
+ }
+}
+
+mowgli_eventloop_ops_t _mowgli_select_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_select_eventloop_pollsetup,
+ .pollshutdown = mowgli_select_eventloop_pollshutdown,
+ .setselect = mowgli_select_eventloop_setselect,
+ .select = mowgli_select_eventloop_select,
+ .destroy = mowgli_select_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/eventloop/timer.c b/src/libmowgli/eventloop/timer.c
new file mode 100644
index 0000000..d8c5061
--- /dev/null
+++ b/src/libmowgli/eventloop/timer.c
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
+ * Copyright (c) 2005-2007 Atheme Project (http://www.atheme.org)
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+static mowgli_heap_t *timer_heap = NULL;
+
+static mowgli_eventloop_timer_t *mowgli_timer_add_real(mowgli_eventloop_t *eventloop,
+ const char *name, mowgli_event_dispatch_func_t *func, void *arg, time_t when, time_t frequency)
+{
+ mowgli_eventloop_timer_t *timer;
+
+ return_val_if_fail(eventloop != NULL, NULL);
+ return_val_if_fail(func != NULL, NULL);
+
+ if (timer_heap == NULL)
+ timer_heap = mowgli_heap_create(sizeof(mowgli_eventloop_timer_t), 16, BH_NOW);
+
+ timer = mowgli_heap_alloc(timer_heap);
+
+ timer->func = func;
+ timer->name = name;
+ timer->arg = arg;
+ timer->when = mowgli_eventloop_get_time(eventloop) + when;
+ timer->frequency = frequency;
+ timer->active = true;
+
+ if (eventloop->deadline <= mowgli_eventloop_get_time(eventloop) || timer->when <= eventloop->deadline)
+ eventloop->deadline = timer->when;
+
+ mowgli_node_add(timer, &timer->node, &eventloop->timer_list);
+
+#ifdef DEBUG
+ mowgli_log("[timer(%p) add when:%d active:%d] [eventloop deadline:%d]", timer, timer->when, timer->active, eventloop->deadline);
+#endif
+
+ return timer;
+}
+
+/* add an event to the table to be continually ran */
+mowgli_eventloop_timer_t *mowgli_timer_add(mowgli_eventloop_t *eventloop, const char *name, mowgli_event_dispatch_func_t *func, void *arg, time_t when)
+{
+ return mowgli_timer_add_real(eventloop, name, func, arg, when, when);
+}
+
+/* adds an event to the table to be ran only once */
+mowgli_eventloop_timer_t *mowgli_timer_add_once(mowgli_eventloop_t *eventloop, const char *name, mowgli_event_dispatch_func_t *func, void *arg, time_t when)
+{
+ return mowgli_timer_add_real(eventloop, name, func, arg, when, 0);
+}
+
+/* delete an event from the table */
+void mowgli_timer_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_timer_t *timer)
+{
+ return_if_fail(eventloop != NULL);
+ return_if_fail(timer != NULL);
+
+ if (eventloop->last_ran == timer->name)
+ eventloop->last_ran = "<removed>";
+
+ mowgli_node_delete(&timer->node, &eventloop->timer_list);
+ mowgli_heap_free(timer_heap, timer);
+}
+
+/* checks all pending events */
+void mowgli_eventloop_run_timers(mowgli_eventloop_t *eventloop)
+{
+ mowgli_node_t *n, *tn;
+ time_t currtime;
+
+ return_if_fail(eventloop != NULL);
+
+ currtime = mowgli_eventloop_get_time(eventloop);
+
+ MOWGLI_ITER_FOREACH_SAFE(n, tn, eventloop->timer_list.head)
+ {
+ mowgli_eventloop_timer_t *timer = n->data;
+
+ if (timer->active && timer->when <= currtime)
+ {
+ /* now we call it */
+ eventloop->last_ran = timer->name;
+ timer->func(timer->arg);
+
+ /* invalidate eventloop sleep-until time */
+ eventloop->deadline = -1;
+
+ /* event is scheduled more than once */
+ if (timer->frequency)
+ timer->when = currtime + timer->frequency;
+ else
+ {
+ /* XXX: yuck. find a better way to handle this. */
+ eventloop->last_ran = "<onceonly>";
+
+ mowgli_timer_destroy(eventloop, timer);
+ }
+ }
+ }
+}
+
+/* returns the time the next mowgli_timer_run() should happen */
+time_t mowgli_eventloop_next_timer(mowgli_eventloop_t *eventloop)
+{
+ mowgli_node_t *n;
+
+ return_val_if_fail(eventloop != NULL, 0);
+
+ if (eventloop->deadline == -1)
+ {
+ MOWGLI_ITER_FOREACH(n, eventloop->timer_list.head)
+ {
+ mowgli_eventloop_timer_t *timer = n->data;
+
+ if (timer->active && (timer->when < eventloop->deadline || eventloop->deadline == -1))
+ eventloop->deadline = timer->when;
+
+#ifdef DEBUG
+ mowgli_log("timer %p active:%d when:%ld deadline:%ld", timer, timer->active, timer->when, eventloop->deadline);
+#endif
+ }
+ }
+
+#ifdef DEBUG
+ mowgli_log("eventloop deadline:%ld", eventloop->deadline);
+#endif
+
+ return eventloop->deadline;
+}
+
+/* finds an event in the table */
+mowgli_eventloop_timer_t *mowgli_timer_find(mowgli_eventloop_t *eventloop, mowgli_event_dispatch_func_t *func, void *arg)
+{
+ mowgli_node_t *n;
+
+ return_val_if_fail(eventloop != NULL, NULL);
+ return_val_if_fail(func != NULL, NULL);
+
+ MOWGLI_ITER_FOREACH(n, eventloop->timer_list.head)
+ {
+ mowgli_eventloop_timer_t *timer = n->data;
+
+ if (timer->func == func && timer->arg == arg)
+ return timer;
+ }
+
+ return NULL;
+}
+
+/* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
+ * vim:ts=8
+ * vim:sw=8
+ * vim:noexpandtab
+ */
diff --git a/src/libmowgli/eventloop/windows_pollops.c b/src/libmowgli/eventloop/windows_pollops.c
new file mode 100644
index 0000000..f1c9c0f
--- /dev/null
+++ b/src/libmowgli/eventloop/windows_pollops.c
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef _WIN32
+
+#define DEFAULT_SOCKETMAX (2048)
+
+typedef struct {
+ WSAEVENT *pfd;
+ unsigned short pfd_size;
+ unsigned short last_slot;
+ mowgli_eventloop_pollable_t **pollables;
+} mowgli_winsock_eventloop_private_t;
+
+static WSADATA wsock_env;
+
+void mowgli_winsock_bootstrap(void)
+{
+ int r;
+
+ r = WSAStartup((short) 0x202, &wsock_env);
+ if (r != 0)
+ {
+ printf("mowgli bootstrap failure (win32): %d\n", r);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!wsock_env.iMaxSockets)
+ wsock_env.iMaxSockets = DEFAULT_SOCKETMAX;
+ else
+ wsock_env.iMaxSockets -= (wsock_env.iMaxSockets % MAXIMUM_WAIT_OBJECTS);
+}
+
+static void mowgli_winsock_eventloop_pollsetup(mowgli_eventloop_t *eventloop)
+{
+ unsigned short i;
+ mowgli_winsock_eventloop_private_t *priv;
+
+ return_if_fail(wsock_env.iMaxSockets > 0);
+
+ priv = mowgli_alloc(sizeof(mowgli_winsock_eventloop_private_t));
+ eventloop->poller = priv;
+
+ priv->pfd_size = wsock_env.iMaxSockets;
+ priv->pfd = mowgli_alloc(sizeof(WSAEVENT) * priv->pfd_size);
+ priv->pollables = mowgli_alloc(sizeof(mowgli_eventloop_pollable_t *) * priv->pfd_size);
+
+ /* sanitize NT port handle values to a known-good default */
+ for (i = 0; i < priv->pfd_size; i++)
+ {
+ priv->pfd[i] = INVALID_HANDLE_VALUE;
+ priv->pollables[i] = NULL;
+ }
+
+ return;
+}
+
+static unsigned short mowgli_winsock_eventloop_find_slot(mowgli_winsock_eventloop_private_t *priv)
+{
+ unsigned short i = 1;
+
+ return_val_if_fail(priv != NULL, 0);
+
+ if (priv->last_slot)
+ i = priv->last_slot;
+
+ for (; i < priv->pfd_size; i++)
+ {
+ if (priv->pfd[i] == INVALID_HANDLE_VALUE)
+ {
+ priv->last_slot = i;
+ return i;
+ }
+ }
+
+ /* miss, try from beginning. */
+ for (i = 1; i < priv->pfd_size; i++)
+ {
+ if (priv->pfd[i] == INVALID_HANDLE_VALUE)
+ {
+ priv->last_slot = i;
+ return i;
+ }
+ }
+
+ /* if this happens, we're boned... */
+ mowgli_log("out of handles for eventloop %p, aborting\n", priv);
+ abort();
+
+ return 0;
+}
+
+static void mowgli_winsock_eventloop_pollshutdown(mowgli_eventloop_t *eventloop)
+{
+ unsigned short i;
+ mowgli_winsock_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ for (i = 0; i < priv->pfd_size; i++)
+ {
+ WSACloseEvent(priv->pfd[i]);
+ priv->pfd[i] = INVALID_HANDLE_VALUE;
+ }
+
+ mowgli_free(priv->pfd);
+ mowgli_free(priv);
+
+ return;
+}
+
+static void mowgli_winsock_eventloop_destroy(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable)
+{
+ mowgli_winsock_eventloop_private_t *priv;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+
+ if (pollable->slot)
+ {
+ WSAEventSelect(pollable->fd, priv->pfd[pollable->slot], 0);
+ WSACloseEvent(priv->pfd[pollable->slot]);
+
+ priv->pfd[pollable->slot] = INVALID_HANDLE_VALUE;
+ priv->pollables[pollable->slot] = NULL;
+ }
+
+ pollable->slot = 0;
+ pollable->events = 0;
+}
+
+static void mowgli_winsock_eventloop_setselect(mowgli_eventloop_t *eventloop, mowgli_eventloop_pollable_t *pollable, mowgli_eventloop_io_dir_t dir, mowgli_eventloop_io_cb_t *event_function)
+{
+ mowgli_winsock_eventloop_private_t *priv;
+ unsigned int old_flags;
+
+ return_if_fail(eventloop != NULL);
+ return_if_fail(pollable != NULL);
+
+ priv = eventloop->poller;
+ old_flags = pollable->events;
+
+#ifdef DEBUG
+ mowgli_log("setselect %p fd %d func %p", pollable, pollable->fd, event_function);
+#endif
+
+ switch (dir)
+ {
+ case MOWGLI_EVENTLOOP_IO_READ:
+ pollable->read_function = event_function;
+ pollable->events |= (FD_READ | FD_CLOSE | FD_ACCEPT | FD_OOB);
+ break;
+ case MOWGLI_EVENTLOOP_IO_WRITE:
+ pollable->write_function = event_function;
+ pollable->events |= (FD_WRITE | FD_CONNECT | FD_CLOSE);
+ break;
+ default:
+ mowgli_log("unhandled pollable direction %d", dir);
+ break;
+ }
+
+#ifdef DEBUG
+ mowgli_log("%p -> read %p : write %p", pollable, pollable->read_function, pollable->write_function);
+#endif
+
+ if (pollable->read_function == NULL)
+ pollable->events &= ~(FD_READ | FD_CLOSE | FD_ACCEPT | FD_OOB);
+
+ if (pollable->write_function == NULL)
+ pollable->events &= ~(FD_WRITE | FD_CONNECT | FD_CLOSE);
+
+ if (old_flags == 0 && pollable->events == 0)
+ return;
+ else if (pollable->events <= 0)
+ {
+ mowgli_winsock_eventloop_destroy(eventloop, pollable);
+ return;
+ }
+
+ /* set up the HANDLE if we have not already */
+ if (!pollable->slot)
+ {
+ pollable->slot = mowgli_winsock_eventloop_find_slot(priv);
+
+ priv->pfd[pollable->slot] = WSACreateEvent();
+ priv->pollables[pollable->slot] = pollable;
+ }
+
+ if (WSAEventSelect(pollable->fd, priv->pfd[pollable->slot], pollable->events) != 0)
+ {
+ if (mowgli_eventloop_ignore_errno(WSAGetLastError()))
+ return;
+
+ mowgli_log("mowgli_winsock_eventloop_setselect(): WSAEventSelect failed: %d", WSAGetLastError());
+ }
+
+ return;
+}
+
+static void mowgli_winsock_eventloop_select(mowgli_eventloop_t *eventloop, int delay)
+{
+ mowgli_winsock_eventloop_private_t *priv;
+ int i, j;
+ DWORD result;
+
+ return_if_fail(eventloop != NULL);
+
+ priv = eventloop->poller;
+
+ return_if_fail(priv->pfd_size % MAXIMUM_WAIT_OBJECTS == 0);
+
+ for (i = 0; i < priv->pfd_size; i += MAXIMUM_WAIT_OBJECTS)
+ {
+ result = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, priv->pfd + i, FALSE, delay);
+
+ if (result == WAIT_FAILED)
+ {
+ if (mowgli_eventloop_ignore_errno(WSAGetLastError()))
+ return;
+
+ mowgli_log("mowgli_winsock_eventloop_select(): WaitForMultipleObjects failed: %d", WSAGetLastError());
+ return;
+ }
+
+ for (j = (result - WAIT_OBJECT_0); j < MAXIMUM_WAIT_OBJECTS; j++)
+ {
+ mowgli_eventloop_pollable_t *pollable = priv->pollables[i + j];
+ WSANETWORKEVENTS events;
+
+ WSAEnumNetworkEvents(pollable->fd, priv->pfd[pollable->slot], &events);
+
+ if (events.lNetworkEvents & (FD_READ | FD_CLOSE | FD_ACCEPT | FD_OOB) && pollable->read_function != NULL)
+ pollable->read_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_READ, pollable->userdata);
+
+ if (events.lNetworkEvents & (FD_WRITE | FD_CONNECT | FD_CLOSE) && pollable->write_function != NULL)
+ pollable->write_function(eventloop, pollable, MOWGLI_EVENTLOOP_IO_WRITE, pollable->userdata);
+ }
+ }
+
+ mowgli_eventloop_synchronize(eventloop);
+}
+
+mowgli_eventloop_ops_t _mowgli_winsock_pollops = {
+ .timeout_once = mowgli_simple_eventloop_timeout_once,
+ .run_once = mowgli_simple_eventloop_run_once,
+ .pollsetup = mowgli_winsock_eventloop_pollsetup,
+ .pollshutdown = mowgli_winsock_eventloop_pollshutdown,
+ .setselect = mowgli_winsock_eventloop_setselect,
+ .select = mowgli_winsock_eventloop_select,
+ .destroy = mowgli_winsock_eventloop_destroy,
+};
+
+#endif
diff --git a/src/libmowgli/ext/Makefile b/src/libmowgli/ext/Makefile
new file mode 100644
index 0000000..d7466b6
--- /dev/null
+++ b/src/libmowgli/ext/Makefile
@@ -0,0 +1,25 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_EXT}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_EXT}
+
+SRCS = confparse.c \
+ error_backtrace.c \
+ getopt_long.c \
+ global_storage.c \
+ program_opts.c \
+ proctitle.c
+
+INCLUDES = confparse.h \
+ error_backtrace.h \
+ getopt_long.h \
+ global_storage.h \
+ program_opts.h \
+ proctitle.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/ext
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/ext/confparse.c b/src/libmowgli/ext/confparse.c
new file mode 100644
index 0000000..898ba8c
--- /dev/null
+++ b/src/libmowgli/ext/confparse.c
@@ -0,0 +1,436 @@
+/*
+ * Copyright (c) 2005-2011 Atheme Project (http://www.atheme.org)
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Description of config files parsed by this:
+ *
+ * configfile = *WS *configentry
+ * configentry = value [1*WS value] [1*WS "{" *(configentry 1*WS) "}" ] *WS ";"
+ * value = 1*achar / DQUOTE *qchar DQUOTE
+ * achar = <any CHAR except WS or DQUOTE>
+ * qchar = <any CHAR except DQUOTE or \> / "\\" / "\" DQUOTE
+ * comment = "/" "*" <anything except * /> "*" "/" /
+ * "#" *CHAR %0x0A /
+ * "//" *CHAR %0x0A
+ * WS = %x09 / %x0A / %x0D / SPACE / "=" / comment
+ *
+ * A value of "include" for toplevel configentries causes a file to be
+ * included. The included file is logically appended to the current file,
+ * no matter where the include directive is. Include files must have balanced
+ * braces.
+ */
+/*
+ * Original idea from the csircd config parser written by Fred Jacobs
+ * and Chris Behrens.
+ */
+
+#include "mowgli.h"
+#include <sys/stat.h>
+#include <limits.h>
+
+#define MAX_INCLUDE_NESTING 16
+
+static mowgli_config_file_t *mowgli_config_file_parse(const char *filename, char *confdata);
+static void mowgli_config_file_entry_free(mowgli_config_file_entry_t *ceptr);
+static mowgli_config_file_t *mowgli_config_file_load_internal(mowgli_config_file_t *parent, const char *filename);
+
+#define CF_ERRORED(cf) ((cf)->curline <= 0)
+
+static void mowgli_config_file_error(mowgli_config_file_t *cf, const char *format, ...)
+{
+ va_list ap;
+ char buffer[1024];
+ char *ptr;
+
+ va_start(ap, format);
+ vsnprintf(buffer, sizeof buffer, format, ap);
+ va_end(ap);
+
+ if ((ptr = strchr(buffer, '\n')) != NULL)
+ *ptr = '\0';
+
+ if (cf != NULL)
+ {
+ if (cf->curline < 0)
+ cf->curline = -cf->curline;
+
+ mowgli_log("%s:%d: %s", cf->filename, cf->curline, buffer);
+
+ /* mark config parse as failed */
+ cf->curline = -cf->curline;
+ }
+ else
+ mowgli_log("mowgli_config_file_parse(): %s", buffer);
+}
+
+static void skip_ws(char **pos, mowgli_config_file_t *cf)
+{
+ int startline;
+
+ for (;;)
+ {
+ switch (**pos)
+ {
+ case ' ':
+ case '\t':
+ case '\r':
+ case '=': /* XXX */
+ break;
+ case '\n':
+ cf->curline++;
+ break;
+ case '/':
+ if ((*pos)[1] == '*')
+ {
+ startline = cf->curline;
+ (*pos)++;
+ (*pos)++;
+ while (**pos != '\0' && (**pos != '*' || (*pos)[1] != '/'))
+ {
+ if (**pos == '\n')
+ cf->curline++;
+ (*pos)++;
+ }
+ if (**pos == '\0')
+ mowgli_config_file_error(cf, "File ends inside comment starting at line %d", startline);
+ else
+ (*pos)++; /* skip '*' */
+ }
+ else if ((*pos)[1] == '/')
+ {
+ while (**pos != '\0' && **pos != '\n' && **pos != '\r')
+ (*pos)++;
+ continue;
+ }
+ else
+ return;
+ break;
+ case '#':
+ while (**pos != '\0' && **pos != '\n' && **pos != '\r')
+ (*pos)++;
+ continue;
+ default:
+ return;
+ }
+ if (**pos == '\0')
+ return;
+ (*pos)++;
+ }
+}
+
+static char *get_value(char **pos, mowgli_config_file_t *cf, char *skipped)
+{
+ char *p = *pos;
+ char *q;
+ char *start;
+
+ *skipped = '\0';
+ if (*p == '"')
+ {
+ p++;
+ start = p;
+ q = p;
+ while (*p != '\0' && *p != '\r' && *p != '\n' && *p != '"')
+ {
+ if (*p == '\\' && (p[1] == '"' || p[1] == '\\'))
+ p++;
+ *q++ = *p++;
+ }
+ if (*p == '\0')
+ {
+ mowgli_config_file_error(cf, "File ends inside quoted string");
+ return NULL;
+ }
+ if (*p == '\r' || *p == '\n')
+ {
+ mowgli_config_file_error(cf, "Newline inside quoted string");
+ return NULL;
+ }
+ if (*p != '"')
+ {
+ mowgli_config_file_error(cf, "Weird character terminating quoted string (BUG)");
+ return NULL;
+ }
+ p++;
+ *q = '\0';
+ *pos = p;
+ skip_ws(pos, cf);
+ return start;
+ }
+ else
+ {
+ start = p;
+ while (*p != '\0' && *p != '\t' && *p != '\r' && *p != '\n' &&
+ *p != ' ' && *p != '/' && *p != '#' &&
+ *p != ';' && *p != '{' && *p != '}')
+ p++;
+ if (p == start)
+ return NULL;
+ *pos = p;
+ skip_ws(pos, cf);
+ if (p == *pos)
+ *skipped = *p;
+ *p = '\0';
+ if (p == *pos)
+ (*pos)++;
+ return start;
+ }
+}
+
+static mowgli_config_file_t *mowgli_config_file_parse(const char *filename, char *confdata)
+{
+ mowgli_config_file_t *cf, *subcf, *lastcf;
+ mowgli_config_file_entry_t **pprevce, *ce, *upce;
+ char *p, *val;
+ char c;
+
+ cf = mowgli_alloc(sizeof *cf);
+ cf->filename = mowgli_strdup(filename);
+ cf->curline = 1;
+ cf->mem = confdata;
+ lastcf = cf;
+ pprevce = &cf->entries;
+ upce = NULL;
+ p = confdata;
+ while (*p != '\0')
+ {
+ skip_ws(&p, cf);
+ if (*p == '\0' || CF_ERRORED(cf))
+ break;
+ if (*p == '}')
+ {
+ if (upce == NULL)
+ {
+ mowgli_config_file_error(cf, "Extraneous closing brace");
+ break;
+ }
+ ce = upce;
+ ce->sectlinenum = cf->curline;
+ pprevce = &ce->next;
+ upce = ce->prevlevel;
+ p++;
+ skip_ws(&p, cf);
+ if (CF_ERRORED(cf))
+ break;
+ if (*p != ';')
+ {
+ mowgli_config_file_error(cf, "Missing semicolon after closing brace for section ending at line %d", ce->sectlinenum);
+ break;
+ }
+ ce = NULL;
+ p++;
+ continue;
+ }
+ val = get_value(&p, cf, &c);
+ if (CF_ERRORED(cf))
+ break;
+ if (val == NULL)
+ {
+ mowgli_config_file_error(cf, "Unexpected character trying to read variable name");
+ break;
+ }
+ ce = mowgli_alloc(sizeof *ce);
+ ce->fileptr = cf;
+ ce->varlinenum = cf->curline;
+ ce->varname = val;
+ ce->prevlevel = upce;
+ *pprevce = ce;
+ pprevce = &ce->next;
+ if (c == '\0' && (*p == '{' || *p == ';'))
+ c = *p++;
+ if (c == '{')
+ {
+ pprevce = &ce->entries;
+ upce = ce;
+ ce = NULL;
+ }
+ else if (c == ';')
+ {
+ ce = NULL;
+ }
+ else if (c != '\0')
+ {
+ mowgli_config_file_error(cf, "Unexpected characters after unquoted string %s", ce->varname);
+ break;
+ }
+ else
+ {
+ val = get_value(&p, cf, &c);
+ if (CF_ERRORED(cf))
+ break;
+ if (val == NULL)
+ {
+ mowgli_config_file_error(cf, "Unexpected character trying to read value for %s", ce->varname);
+ break;
+ }
+ ce->vardata = val;
+ if (c == '\0' && (*p == '{' || *p == ';'))
+ c = *p++;
+ if (c == '{')
+ {
+ pprevce = &ce->entries;
+ upce = ce;
+ ce = NULL;
+ }
+ else if (c == ';')
+ {
+ if (upce == NULL && !strcasecmp(ce->varname, "include"))
+ {
+ subcf = mowgli_config_file_load_internal(cf, ce->vardata);
+ if (subcf == NULL)
+ {
+ mowgli_config_file_error(cf, "Error in file included from here");
+ break;
+ }
+ lastcf->next = subcf;
+ while (lastcf->next != NULL)
+ lastcf = lastcf->next;
+ }
+ ce = NULL;
+ }
+ else
+ {
+ mowgli_config_file_error(cf, "Unexpected characters after value %s %s", ce->varname, ce->vardata);
+ break;
+ }
+ }
+ }
+ if (!CF_ERRORED(cf) && upce != NULL)
+ {
+ mowgli_config_file_error(cf, "One or more sections not closed");
+ ce = upce;
+ while (ce->prevlevel != NULL)
+ ce = ce->prevlevel;
+ if (ce->vardata != NULL)
+ mowgli_config_file_error(cf, "First unclosed section is %s %s at line %d",
+ ce->varname, ce->vardata, ce->varlinenum);
+ else
+ mowgli_config_file_error(cf, "First unclosed section is %s at line %d",
+ ce->varname, ce->varlinenum);
+ }
+ if (CF_ERRORED(cf))
+ {
+ mowgli_config_file_free(cf);
+ cf = NULL;
+ }
+ return cf;
+}
+
+static void mowgli_config_file_entry_free(mowgli_config_file_entry_t *ceptr)
+{
+ mowgli_config_file_entry_t *nptr;
+
+ for (; ceptr; ceptr = nptr)
+ {
+ nptr = ceptr->next;
+ if (ceptr->entries)
+ mowgli_config_file_entry_free(ceptr->entries);
+ /* ce_varname and ce_vardata are inside cf_mem */
+ mowgli_free(ceptr);
+ }
+}
+
+void mowgli_config_file_free(mowgli_config_file_t *cfptr)
+{
+ mowgli_config_file_t *nptr;
+
+ for (; cfptr; cfptr = nptr)
+ {
+ nptr = cfptr->next;
+ if (cfptr->entries)
+ mowgli_config_file_entry_free(cfptr->entries);
+ mowgli_free(cfptr->filename);
+ mowgli_free(cfptr->mem);
+ mowgli_free(cfptr);
+ }
+}
+
+static mowgli_config_file_t *mowgli_config_file_load_internal(mowgli_config_file_t *parent, const char *filename)
+{
+ struct stat sb;
+ FILE *fp;
+ size_t ret;
+ char *buf = NULL;
+ mowgli_config_file_t *cfptr;
+ static int nestcnt;
+
+ if (nestcnt > MAX_INCLUDE_NESTING)
+ {
+ mowgli_config_file_error(parent, "Includes nested too deep \"%s\"\n", filename);
+ return NULL;
+ }
+
+ fp = fopen(filename, "rb");
+ if (!fp)
+ {
+ mowgli_config_file_error(parent, "Couldn't open \"%s\": %s\n", filename, strerror(errno));
+ return NULL;
+ }
+ if (stat(filename, &sb) == -1)
+ {
+ mowgli_config_file_error(parent, "Couldn't fstat \"%s\": %s\n", filename, strerror(errno));
+ fclose(fp);
+ return NULL;
+ }
+ if (!S_ISREG(sb.st_mode))
+ {
+ mowgli_config_file_error(parent, "Not a regular file: \"%s\"\n", filename);
+ fclose(fp);
+ return NULL;
+ }
+ if (sb.st_size > SSIZE_MAX - 1)
+ {
+ mowgli_config_file_error(parent, "File too large: \"%s\"\n", filename);
+ fclose(fp);
+ return NULL;
+ }
+ buf = (char *) mowgli_alloc(sb.st_size + 1);
+ if (sb.st_size)
+ {
+ errno = 0;
+ ret = fread(buf, 1, sb.st_size, fp);
+ if (ret != (size_t)sb.st_size)
+ {
+ mowgli_config_file_error(parent, "Error reading \"%s\": %s\n", filename, strerror(errno ? errno : EFAULT));
+ mowgli_free(buf);
+ fclose(fp);
+ return NULL;
+ }
+ }
+ else
+ ret = 0;
+ buf[ret] = '\0';
+ fclose(fp);
+ nestcnt++;
+ cfptr = mowgli_config_file_parse(filename, buf);
+ nestcnt--;
+ /* buf is owned by cfptr or freed now */
+ return cfptr;
+}
+
+mowgli_config_file_t *mowgli_config_file_load(const char *filename)
+{
+ return mowgli_config_file_load_internal(NULL, filename);
+}
+
+/* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
+ * vim:ts=8
+ * vim:sw=8
+ * vim:noexpandtab
+ */
diff --git a/src/libmowgli/ext/confparse.h b/src/libmowgli/ext/confparse.h
new file mode 100644
index 0000000..d498b87
--- /dev/null
+++ b/src/libmowgli/ext/confparse.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2005-2008 William Pitcock, et al.
+ * Rights to this code are as documented in doc/LICENSE.
+ *
+ * Config file parser.
+ *
+ */
+
+#ifndef CONFPARSE_H
+#define CONFPARSE_H
+
+typedef struct _mowgli_configfile mowgli_config_file_t;
+typedef struct _mowgli_configentry mowgli_config_file_entry_t;
+
+struct _mowgli_configfile
+{
+ char *filename;
+ mowgli_config_file_entry_t *entries;
+ mowgli_config_file_t *next;
+ int curline;
+ char *mem;
+};
+
+struct _mowgli_configentry
+{
+ mowgli_config_file_t *fileptr;
+
+ int varlinenum;
+ char *varname;
+ char *vardata;
+ int sectlinenum; /* line containing closing brace */
+
+ mowgli_config_file_entry_t *entries;
+ mowgli_config_file_entry_t *prevlevel;
+ mowgli_config_file_entry_t *next;
+};
+
+/* confp.c */
+extern void mowgli_config_file_free(mowgli_config_file_t *cfptr);
+extern mowgli_config_file_t *mowgli_config_file_load(const char *filename);
+
+#endif
+
+/* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs ts=8 sw=8 noexpandtab
+ */
diff --git a/src/libmowgli/mowgli_error_backtrace.c b/src/libmowgli/ext/error_backtrace.c
index 02b7b4e..6c28c22 100644
--- a/src/libmowgli/mowgli_error_backtrace.c
+++ b/src/libmowgli/ext/error_backtrace.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_error_backtrace.c: Print errors and explain how they were reached.
+ * error_backtrace.c: Print errors and explain how they were reached.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -39,7 +39,7 @@ mowgli_error_context_display(mowgli_error_context_t *e, const char *delim)
{
bt_msg = (char *) n->data;
- printf("%s%s", bt_msg, n->next != NULL ? delim : "\n");
+ fprintf(stderr, "%s%s", bt_msg, n->next != NULL ? delim : "\n");
}
}
@@ -71,9 +71,9 @@ void
mowgli_error_context_display_with_error(mowgli_error_context_t *e, const char *delim, const char *error)
{
mowgli_error_context_display(e, delim);
- printf("Error: %s\n", error);
+ fprintf(stderr, "Error: %s\n", error);
- exit(EXIT_FAILURE);
+ _exit(EXIT_FAILURE);
}
void
@@ -89,7 +89,7 @@ mowgli_error_context_push(mowgli_error_context_t *e, const char *msg, ...)
vsnprintf(buf, 65535, msg, va);
va_end(va);
- mowgli_node_add(strdup(buf), mowgli_node_create(), &e->bt);
+ mowgli_node_add(mowgli_strdup(buf), mowgli_node_create(), &e->bt);
}
void
diff --git a/src/libmowgli/mowgli_error_backtrace.h b/src/libmowgli/ext/error_backtrace.h
index 57970b0..d7da7cf 100644
--- a/src/libmowgli/mowgli_error_backtrace.h
+++ b/src/libmowgli/ext/error_backtrace.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_error_backtrace.h: Print errors and explain how they were reached.
+ * error_backtrace.h: Print errors and explain how they were reached.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/ext/getopt_long.c b/src/libmowgli/ext/getopt_long.c
new file mode 100644
index 0000000..adf64e5
--- /dev/null
+++ b/src/libmowgli/ext/getopt_long.c
@@ -0,0 +1,461 @@
+/* $NetBSD: getopt_long.c,v 1.25 2009/03/20 14:05:54 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <mowgli.h>
+
+#include "getopt_long.h"
+
+int mowgli_opterr = 1; /* if error message should be printed */
+int mowgli_optind = 1; /* index into parent argv vector */
+int mowgli_optopt = '?'; /* character checked for validity */
+int mowgli_optreset = 0; /* reset getopt */
+char *mowgli_optarg = NULL; /* argument associated with option */
+
+/* XXX: suppress const warnings */
+#define __UNCONST(a) ((void *)(unsigned long)(const void *)(a))
+
+#define IGNORE_FIRST (*options == '-' || *options == '+')
+#define PRINT_ERROR ((mowgli_opterr) && ((*options != ':') \
+ || (IGNORE_FIRST && options[1] != ':')))
+#define IS_POSIXLY_CORRECT (getenv("POSIXLY_CORRECT") != NULL)
+#define PERMUTE (!IS_POSIXLY_CORRECT && !IGNORE_FIRST)
+/* XXX: GNU ignores PC if *options == '-' */
+#define IN_ORDER (!IS_POSIXLY_CORRECT && *options == '-')
+
+/* return values */
+#define BADCH (int)'?'
+#define BADARG ((IGNORE_FIRST && options[1] == ':') \
+ || (*options == ':') ? (int)':' : (int)'?')
+#define INORDER (int)1
+
+#define EMSG ""
+
+static inline void
+warnx(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+static int getopt_internal(int, char **, const char *);
+static int gcd(int, int);
+static void permute_args(int, int, int, char **);
+
+static const char *place = EMSG; /* option letter processing */
+
+/* XXX: set mowgli_optreset to 1 rather than these two */
+static int nonopt_start = -1; /* first non option argument (for permute) */
+static int nonopt_end = -1; /* first option after non options (for permute) */
+
+/* Error messages */
+static const char recargchar[] = "option requires an argument -- %c";
+static const char recargstring[] = "option requires an argument -- %s";
+static const char ambig[] = "ambiguous option -- %.*s";
+static const char noarg[] = "option doesn't take an argument -- %.*s";
+static const char illoptchar[] = "unknown option -- %c";
+static const char illoptstring[] = "unknown option -- %s";
+
+
+/*
+ * Compute the greatest common divisor of a and b.
+ */
+static int
+gcd(int a, int b)
+{
+ int c;
+
+ c = a % b;
+ while (c != 0) {
+ a = b;
+ b = c;
+ c = a % b;
+ }
+
+ return b;
+}
+
+/*
+ * Exchange the block from nonopt_start to nonopt_end with the block
+ * from nonopt_end to opt_end (keeping the same order of arguments
+ * in each block).
+ */
+static void
+permute_args(int panonopt_start, int panonopt_end, int opt_end, char **nargv)
+{
+ int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
+ char *swap;
+
+ return_if_fail(nargv != NULL);
+
+ /*
+ * compute lengths of blocks and number and size of cycles
+ */
+ nnonopts = panonopt_end - panonopt_start;
+ nopts = opt_end - panonopt_end;
+ ncycle = gcd(nnonopts, nopts);
+ cyclelen = (opt_end - panonopt_start) / ncycle;
+
+ for (i = 0; i < ncycle; i++) {
+ cstart = panonopt_end+i;
+ pos = cstart;
+ for (j = 0; j < cyclelen; j++) {
+ if (pos >= panonopt_end)
+ pos -= nnonopts;
+ else
+ pos += nopts;
+ swap = nargv[pos];
+ nargv[pos] = nargv[cstart];
+ nargv[cstart] = swap;
+ }
+ }
+}
+
+/*
+ * getopt_internal --
+ * Parse argc/argv argument vector. Called by user level routines.
+ * Returns -2 if -- is found (can be long option or end of options marker).
+ */
+static int
+getopt_internal(int nargc, char **nargv, const char *options)
+{
+ char *oli; /* option letter list index */
+ int optchar;
+
+ return_val_if_fail(nargv != NULL, -1);
+ return_val_if_fail(options != NULL, -1);
+
+ mowgli_optarg = NULL;
+
+ /*
+ * XXX Some programs (like rsyncd) expect to be able to
+ * XXX re-initialize mowgli_optind to 0 and have getopt_long(3)
+ * XXX properly function again. Work around this braindamage.
+ */
+ if (mowgli_optind == 0)
+ mowgli_optind = 1;
+
+ if (mowgli_optreset)
+ nonopt_start = nonopt_end = -1;
+start:
+ if (mowgli_optreset || !*place) { /* update scanning pointer */
+ mowgli_optreset = 0;
+ if (mowgli_optind >= nargc) { /* end of argument vector */
+ place = EMSG;
+ if (nonopt_end != -1) {
+ /* do permutation, if we have to */
+ permute_args(nonopt_start, nonopt_end,
+ mowgli_optind, nargv);
+ mowgli_optind -= nonopt_end - nonopt_start;
+ }
+ else if (nonopt_start != -1) {
+ /*
+ * If we skipped non-options, set mowgli_optind
+ * to the first of them.
+ */
+ mowgli_optind = nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return -1;
+ }
+ if ((*(place = nargv[mowgli_optind]) != '-')
+ || (place[1] == '\0')) { /* found non-option */
+ place = EMSG;
+ if (IN_ORDER) {
+ /*
+ * GNU extension:
+ * return non-option as argument to option 1
+ */
+ mowgli_optarg = nargv[mowgli_optind++];
+ return INORDER;
+ }
+ if (!PERMUTE) {
+ /*
+ * if no permutation wanted, stop parsing
+ * at first non-option
+ */
+ return -1;
+ }
+ /* do permutation */
+ if (nonopt_start == -1)
+ nonopt_start = mowgli_optind;
+ else if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ mowgli_optind, nargv);
+ nonopt_start = mowgli_optind -
+ (nonopt_end - nonopt_start);
+ nonopt_end = -1;
+ }
+ mowgli_optind++;
+ /* process next argument */
+ goto start;
+ }
+ if (nonopt_start != -1 && nonopt_end == -1)
+ nonopt_end = mowgli_optind;
+ if (place[1] && *++place == '-') { /* found "--" */
+ place++;
+ return -2;
+ }
+ }
+ if ((optchar = (int)*place++) == (int)':' ||
+ (oli = strchr(options + (IGNORE_FIRST ? 1 : 0), optchar)) == NULL) {
+ /* option letter unknown or ':' */
+ if (!*place)
+ ++mowgli_optind;
+ if (PRINT_ERROR)
+ warnx(illoptchar, optchar);
+ mowgli_optopt = optchar;
+ return BADCH;
+ }
+ if (optchar == 'W' && oli[1] == ';') { /* -W long-option */
+ /* XXX: what if no long options provided (called by getopt)? */
+ if (*place)
+ return -2;
+
+ if (++mowgli_optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ mowgli_optopt = optchar;
+ return BADARG;
+ } else /* white space */
+ place = nargv[mowgli_optind];
+ /*
+ * Handle -W arg the same as --arg (which causes getopt to
+ * stop parsing).
+ */
+ return -2;
+ }
+ if (*++oli != ':') { /* doesn't take argument */
+ if (!*place)
+ ++mowgli_optind;
+ } else { /* takes (optional) argument */
+ mowgli_optarg = NULL;
+ if (*place) /* no white space */
+ mowgli_optarg = __UNCONST(place);
+ /* XXX: disable test for :: if PC? (GNU doesn't) */
+ else if (oli[1] != ':') { /* arg not optional */
+ if (++mowgli_optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ mowgli_optopt = optchar;
+ return BADARG;
+ } else
+ mowgli_optarg = nargv[mowgli_optind];
+ }
+ place = EMSG;
+ ++mowgli_optind;
+ }
+ /* dump back option letter */
+ return optchar;
+}
+
+/*
+ * getopt --
+ * Parse argc/argv argument vector.
+ *
+ * [eventually this will replace the real getopt]
+ */
+int
+mowgli_getopt(nargc, nargv, options)
+ int nargc;
+ char * const *nargv;
+ const char *options;
+{
+ int retval;
+
+ return_val_if_fail(nargv != NULL, -1);
+ return_val_if_fail(options != NULL, -1);
+
+ retval = getopt_internal(nargc, __UNCONST(nargv), options);
+ if (retval == -2) {
+ ++mowgli_optind;
+ /*
+ * We found an option (--), so if we skipped non-options,
+ * we have to permute.
+ */
+ if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end, mowgli_optind,
+ __UNCONST(nargv));
+ mowgli_optind -= nonopt_end - nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ retval = -1;
+ }
+ return retval;
+}
+
+/*
+ * getopt_long --
+ * Parse argc/argv argument vector.
+ */
+int
+mowgli_getopt_long(int nargc, char * const *nargv, const char *options,
+ const mowgli_getopt_option_t *long_options, int *idx)
+{
+ int retval;
+
+#define IDENTICAL_INTERPRETATION(_x, _y) \
+ (long_options[(_x)].has_arg == long_options[(_y)].has_arg && \
+ long_options[(_x)].flag == long_options[(_y)].flag && \
+ long_options[(_x)].val == long_options[(_y)].val)
+
+ return_val_if_fail(nargv != NULL, -1);
+ return_val_if_fail(options != NULL, -1);
+ return_val_if_fail(long_options != NULL, -1);
+ /* idx may be NULL */
+
+ retval = getopt_internal(nargc, __UNCONST(nargv), options);
+ if (retval == -2) {
+ char *current_argv, *has_equal;
+ size_t current_argv_len;
+ int i, ambiguous, match;
+
+ current_argv = __UNCONST(place);
+ match = -1;
+ ambiguous = 0;
+
+ mowgli_optind++;
+ place = EMSG;
+
+ if (*current_argv == '\0') { /* found "--" */
+ /*
+ * We found an option (--), so if we skipped
+ * non-options, we have to permute.
+ */
+ if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ mowgli_optind, __UNCONST(nargv));
+ mowgli_optind -= nonopt_end - nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return -1;
+ }
+ if ((has_equal = strchr(current_argv, '=')) != NULL) {
+ /* argument found (--option=arg) */
+ current_argv_len = has_equal - current_argv;
+ has_equal++;
+ } else
+ current_argv_len = strlen(current_argv);
+
+ for (i = 0; long_options[i].name; i++) {
+ /* find matching long option */
+ if (strncmp(current_argv, long_options[i].name,
+ current_argv_len))
+ continue;
+
+ if (strlen(long_options[i].name) ==
+ (unsigned)current_argv_len) {
+ /* exact match */
+ match = i;
+ ambiguous = 0;
+ break;
+ }
+ if (match == -1) /* partial match */
+ match = i;
+ else if (!IDENTICAL_INTERPRETATION(i, match))
+ ambiguous = 1;
+ }
+ if (ambiguous) {
+ /* ambiguous abbreviation */
+ if (PRINT_ERROR)
+ warnx(ambig, (int)current_argv_len,
+ current_argv);
+ mowgli_optopt = 0;
+ return BADCH;
+ }
+ if (match != -1) { /* option found */
+ if (long_options[match].has_arg == no_argument
+ && has_equal) {
+ if (PRINT_ERROR)
+ warnx(noarg, (int)current_argv_len,
+ current_argv);
+ /*
+ * XXX: GNU sets mowgli_optopt to val regardless of
+ * flag
+ */
+ if (long_options[match].flag == NULL)
+ mowgli_optopt = long_options[match].val;
+ else
+ mowgli_optopt = 0;
+ return BADARG;
+ }
+ if (long_options[match].has_arg == required_argument ||
+ long_options[match].has_arg == optional_argument) {
+ if (has_equal)
+ mowgli_optarg = has_equal;
+ else if (long_options[match].has_arg ==
+ required_argument) {
+ /*
+ * optional argument doesn't use
+ * next nargv
+ */
+ mowgli_optarg = nargv[mowgli_optind++];
+ }
+ }
+ if ((long_options[match].has_arg == required_argument)
+ && (mowgli_optarg == NULL)) {
+ /*
+ * Missing argument; leading ':'
+ * indicates no error should be generated
+ */
+ if (PRINT_ERROR)
+ warnx(recargstring, current_argv);
+ /*
+ * XXX: GNU sets mowgli_optopt to val regardless
+ * of flag
+ */
+ if (long_options[match].flag == NULL)
+ mowgli_optopt = long_options[match].val;
+ else
+ mowgli_optopt = 0;
+ --mowgli_optind;
+ return BADARG;
+ }
+ } else { /* unknown option */
+ if (PRINT_ERROR)
+ warnx(illoptstring, current_argv);
+ mowgli_optopt = 0;
+ return BADCH;
+ }
+ if (long_options[match].flag) {
+ *long_options[match].flag = long_options[match].val;
+ retval = 0;
+ } else
+ retval = long_options[match].val;
+ if (idx)
+ *idx = match;
+ }
+ return retval;
+#undef IDENTICAL_INTERPRETATION
+}
diff --git a/src/libmowgli/ext/getopt_long.h b/src/libmowgli/ext/getopt_long.h
new file mode 100644
index 0000000..94c90a9
--- /dev/null
+++ b/src/libmowgli/ext/getopt_long.h
@@ -0,0 +1,69 @@
+/* $NetBSD: getopt.h,v 1.11 2008/04/28 20:22:54 martin Exp $ */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _GETOPT_H_
+#define _GETOPT_H_
+
+/*
+ * Gnu like getopt_long() and BSD4.4 getsubopt()/optreset extensions
+ */
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+typedef struct {
+ /* name of long option */
+ const char *name;
+ /*
+ * one of no_argument, required_argument, and optional_argument:
+ * whether option takes an argument
+ */
+ int has_arg;
+ /* if not NULL, set *flag to val when option found */
+ int *flag;
+ /* if flag not NULL, value to set *flag to; else return value */
+ int val;
+ /* internal value */
+ int iflag;
+} mowgli_getopt_option_t;
+
+extern int mowgli_getopt(int nargc, char * const *nargv, const char *options);
+
+extern int mowgli_getopt_long(int, char * const *, const char *,
+ const mowgli_getopt_option_t *, int *);
+
+extern int mowgli_opterr;
+extern int mowgli_optind;
+extern int mowgli_optopt;
+extern int mowgli_optreset;
+extern char *mowgli_optarg;
+
+#endif /* !_GETOPT_H_ */
diff --git a/src/libmowgli/mowgli_global_storage.c b/src/libmowgli/ext/global_storage.c
index c74c6cb..4fec74d 100644
--- a/src/libmowgli/mowgli_global_storage.c
+++ b/src/libmowgli/ext/global_storage.c
@@ -1,8 +1,8 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_global_storage.c: Simple key->value global storage tool.
+ * global_storage.c: Simple key->value global storage tool.
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2007, 2011 William Pitcock <nenolod@dereferenced.org>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -24,7 +24,7 @@
#include "mowgli.h"
static mowgli_patricia_t *mowgli_global_storage_dict = NULL;
-static mowgli_spinlock_t *mowgli_global_storage_lock = NULL;
+static mowgli_mutex_t mowgli_global_storage_lock;
static void _storage_key_canon(char *key)
{
@@ -32,10 +32,11 @@ static void _storage_key_canon(char *key)
}
void
-mowgli_global_storage_init(void)
+mowgli_global_storage_bootstrap(void)
{
mowgli_global_storage_dict = mowgli_patricia_create(_storage_key_canon);
- mowgli_global_storage_lock = mowgli_spinlock_create();
+
+ mowgli_mutex_init(&mowgli_global_storage_lock);
}
void *
@@ -43,10 +44,9 @@ mowgli_global_storage_get(char *name)
{
void *ret;
- /* name serves as lock token */
- mowgli_spinlock_lock(mowgli_global_storage_lock, name, NULL);
+ mowgli_mutex_lock(&mowgli_global_storage_lock);
ret = mowgli_patricia_retrieve(mowgli_global_storage_dict, name);
- mowgli_spinlock_unlock(mowgli_global_storage_lock, name, NULL);
+ mowgli_mutex_unlock(&mowgli_global_storage_lock);
return ret;
}
@@ -54,15 +54,16 @@ mowgli_global_storage_get(char *name)
void
mowgli_global_storage_put(char *name, void *value)
{
- mowgli_spinlock_lock(mowgli_global_storage_lock, NULL, name);
+ mowgli_mutex_lock(&mowgli_global_storage_lock);
mowgli_patricia_add(mowgli_global_storage_dict, name, value);
- mowgli_spinlock_unlock(mowgli_global_storage_lock, NULL, name);
+ mowgli_mutex_unlock(&mowgli_global_storage_lock);
}
void
mowgli_global_storage_free(char *name)
{
- mowgli_spinlock_lock(mowgli_global_storage_lock, name, name);
+ mowgli_mutex_lock(&mowgli_global_storage_lock);
mowgli_patricia_delete(mowgli_global_storage_dict, name);
- mowgli_spinlock_unlock(mowgli_global_storage_lock, name, name);
+ mowgli_mutex_unlock(&mowgli_global_storage_lock);
}
+
diff --git a/src/libmowgli/mowgli_global_storage.h b/src/libmowgli/ext/global_storage.h
index aa60c03..a26e699 100644
--- a/src/libmowgli/mowgli_global_storage.h
+++ b/src/libmowgli/ext/global_storage.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_global_storage.h: Simple key->value global storage tool.
+ * global_storage.h: Simple key->value global storage tool.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -24,7 +24,7 @@
#ifndef MOWGLI_GLOBAL_STORAGE_H
#define MOWGLI_GLOBAL_STORAGE_H
-extern void mowgli_global_storage_init(void);
+extern void mowgli_global_storage_bootstrap(void);
extern void *mowgli_global_storage_get(char *name);
extern void mowgli_global_storage_put(char *name, void *value);
extern void mowgli_global_storage_free(char *name);
diff --git a/src/libmowgli/ext/proctitle.c b/src/libmowgli/ext/proctitle.c
new file mode 100644
index 0000000..91885d5
--- /dev/null
+++ b/src/libmowgli/ext/proctitle.c
@@ -0,0 +1,311 @@
+/*
+ * Code has been calqued from PostgreSQL 9.1 by Elizabeth J. Myers.
+ * Below is their copyright header.
+ *
+ * Do note I've made extensive changes to this code, including adding
+ * Linux (and Irix?) prctl support.
+ */
+
+/*--------------------------------------------------------------------
+ * ps_status.c
+ *
+ * Routines to support changing the ps display of PostgreSQL backends
+ * to contain some useful information. Mechanism differs wildly across
+ * platforms.
+ *
+ * src/backend/utils/misc/ps_status.c
+ *
+ * Copyright (c) 2000-2011, PostgreSQL Global Development Group
+ * various details abducted from various places
+ *--------------------------------------------------------------------
+ */
+
+#include "mowgli.h"
+
+#ifdef HAVE_SYS_PSTAT_H
+#include <sys/pstat.h> /* for HP-UX */
+#endif
+#ifdef HAVE_PS_STRINGS
+#include <machine/vmparam.h> /* for old BSD */
+#include <sys/exec.h>
+#endif
+#if defined(__darwin__)
+#include <crt_externs.h>
+#endif
+#ifdef HAVE_SYS_PRCTL_H
+#include <sys/prctl.h>
+#endif
+
+extern char **environ;
+
+/*
+ * Alternative ways of updating ps display:
+ *
+ * MOWGLI_SETPROC_USE_SETPROCTITLE
+ * use the function setproctitle(const char *, ...)
+ * (newer BSD systems)
+ * MOWGLI_SETPROC_USE_PSTAT
+ * use the pstat(PSTAT_SETCMD, )
+ * (HPUX)
+ * MOWGLI_SETPROC_USE_PS_STRINGS
+ * assign PS_STRINGS->ps_argvstr = "string"
+ * (some BSD systems)
+ * MOWGLI_SETPROC_USE_PRCTL
+ * use prctl(PR_SET_NAME, ...)
+ * (Newer Linux and possibly Irix? -- Note some utilities don't use this name)
+ * MOWGLI_SETPROC_USE_CHANGE_ARGV
+ * assign argv[0] = "string"
+ * (some other BSD systems)
+ * MOWGLI_SETPROC_USE_CLOBBER_ARGV
+ * write over the argv and environment area
+ * (Old Linux and most SysV-like systems)
+ * MOWGLI_SETPROC_USE_WIN32
+ * push the string out as the name of a Windows event
+ * MOWGLI_SETPROC_USE_NONE
+ * don't update ps display
+ * (This is the default, as it is safest.)
+ */
+#if defined(HAVE_SETPROCTITLE)
+#define MOWGLI_SETPROC_USE_SETPROCTITLE
+#elif defined(PR_SET_NAME) && defined(HAVE_SYS_PRCTL_H)
+#define MOWGLI_SETPROC_USE_PRCTL
+#elif defined(HAVE_PSTAT) && defined(PSTAT_SETCMD)
+#define MOWGLI_SETPROC_USE_PSTAT
+#elif defined(HAVE_PS_STRINGS)
+#define MOWGLI_SETPROC_USE_PS_STRINGS
+#elif (defined(BSD) || defined(__bsdi__) || defined(__hurd__)) && !defined(__darwin__)
+#define MOWGLI_SETPROC_USE_CHANGE_ARGV
+#elif defined(__linux__) || defined(_AIX) || defined(__sgi) || (defined(sun) && !defined(BSD)) || defined(ultrix) || defined(__ksr__) || defined(__osf__) || defined(__svr4__) || defined(__svr5__) || defined(__darwin__)
+#define MOWGLI_SETPROC_USE_CLOBBER_ARGV
+#elif defined(WIN32)
+#define MOWGLI_SETPROC_USE_WIN32
+#else
+#define MOWGLI_SETPROC_USE_NONE
+#endif
+
+
+/* Different systems want the buffer padded differently */
+#if defined(_AIX) || defined(__linux__) || defined(__svr4__) || defined(__darwin__)
+#define PS_PADDING '\0'
+#else
+#define PS_PADDING ' '
+#endif
+
+
+#ifndef MOWGLI_SETPROC_USE_CLOBBER_ARGV
+/* all but one option need a buffer to write their ps line in */
+#define PS_BUFFER_SIZE 256
+static char ps_buffer[PS_BUFFER_SIZE];
+static const size_t ps_buffer_size = PS_BUFFER_SIZE;
+#else /* MOWGLI_SETPROC_USE_CLOBBER_ARGV */
+static char *ps_buffer; /* will point to argv area */
+static size_t ps_buffer_size; /* space determined at run time */
+#endif /* MOWGLI_SETPROC_USE_CLOBBER_ARGV */
+
+static size_t ps_buffer_fixed_size;
+static size_t ps_buffer_cur_len; /* nominal strlen(ps_buffer) */
+
+/* save the original argv[] location here */
+static int save_argc;
+static char **save_argv;
+
+/*
+ * Call this early in startup to save the original argc/argv values.
+ * If needed, we make a copy of the original argv[] array to preserve it
+ * from being clobbered by subsequent ps_display actions.
+ *
+ * (The original argv[] will not be overwritten by this routine, but may be
+ * overwritten during mowgli_proctitle_set. Also, the physical location of the
+ * environment strings may be moved, so this should be called before any code
+ * that might try to hang onto a getenv() result.)
+ */
+char **
+mowgli_proctitle_init(int argc, char **argv)
+{
+ save_argc = argc;
+ save_argv = argv;
+
+#if defined(MOWGLI_SETPROC_USE_CLOBBER_ARGV)
+
+ /*
+ * If we're going to overwrite the argv area, count the available space.
+ * Also move the environment to make additional room.
+ */
+ char *end_of_area = NULL;
+ char **new_environ;
+ int i;
+
+ /*
+ * check for contiguous argv strings
+ */
+ for (i = 0; i < argc; i++)
+ {
+ if (i == 0 || end_of_area + 1 == argv[i])
+ end_of_area = argv[i] + strlen(argv[i]);
+ }
+
+ if (end_of_area == NULL) /* probably can't happen? */
+ {
+ ps_buffer = NULL;
+ ps_buffer_size = 0;
+ return argv;
+ }
+
+ /*
+ * check for contiguous environ strings following argv
+ */
+ for (i = 0; environ[i] != NULL; i++)
+ {
+ if (end_of_area + 1 == environ[i])
+ end_of_area = environ[i] + strlen(environ[i]);
+ }
+
+ ps_buffer = argv[0];
+ ps_buffer_size = end_of_area - argv[0];
+
+ /*
+ * move the environment out of the way
+ */
+ new_environ = (char **) mowgli_alloc((i + 1) * sizeof(char *));
+ for (i = 0; environ[i] != NULL; i++)
+ new_environ[i] = mowgli_strdup(environ[i]);
+ new_environ[i] = NULL;
+ environ = new_environ;
+
+#endif /* MOWGLI_SETPROC_USE_CLOBBER_ARGV */
+
+#if defined(MOWGLI_SETPROC_USE_CHANGE_ARGV) || defined(MOWGLI_SETPROC_USE_CLOBBER_ARGV)
+
+ /*
+ * If we're going to change the original argv[] then make a copy for
+ * argument parsing purposes.
+ *
+ * (NB: do NOT think to remove the copying of argv[].
+ * On some platforms, getopt() keeps pointers into the argv array, and will
+ * get horribly confused when it is re-called to analyze a subprocess'
+ * argument string if the argv storage has been clobbered meanwhile. Other
+ * platforms have other dependencies on argv[].
+ */
+
+ char **new_argv;
+ int i;
+
+ new_argv = (char **) mowgli_alloc((argc + 1) * sizeof(char *));
+ for (i = 0; i < argc; i++)
+ new_argv[i] = mowgli_strdup(argv[i]);
+ new_argv[argc] = NULL;
+
+#if defined(__darwin__)
+ /*
+ * Darwin (and perhaps other NeXT-derived platforms?) has a static
+ * copy of the argv pointer, which we may fix like so:
+ */
+ *_NSGetArgv() = new_argv;
+#endif
+
+ argv = new_argv;
+
+#endif /* MOWGLI_SETPROC_USE_CHANGE_ARGV or MOWGLI_SETPROC_USE_CLOBBER_ARGV */
+
+ return argv;
+}
+
+void
+mowgli_proctitle_set(const char *fmt, ...)
+{
+#ifndef MOWGLI_SETPROC_USE_NONE
+ va_list va;
+
+#if defined(MOWGLI_SETPROC_USE_CHANGE_ARGV) || defined(MOWGLI_SETPROC_USE_CLOBBER_ARGV)
+ if (!save_argv)
+ return;
+#endif
+
+ va_start(va, fmt);
+ vsnprintf(ps_buffer, ps_buffer_size, fmt, va);
+ va_end(va);
+
+ return_if_fail(*ps_buffer == '\0');
+
+ ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer);
+
+#ifdef MOWGLI_SETPROC_USE_CHANGE_ARGV
+ save_argv[0] = ps_buffer;
+ save_argv[1] = NULL;
+#endif
+
+#ifdef MOWGLI_SETPROC_USE_CLOBBER_ARGV
+ for (int i = 1; i < save_argc; i++)
+ save_argv[i] = ps_buffer + ps_buffer_size;
+
+ /* Pad unused bytes */
+ printf("%d %d\n", ps_buffer_size, ps_buffer_cur_len);
+ memset(ps_buffer + ps_buffer_cur_len, PS_PADDING, ps_buffer_size - ps_buffer_cur_len + 1);
+#endif
+
+#ifdef MOWGLI_SETPROC_USE_SETPROCTITLE
+ setproctitle("%s", ps_buffer);
+#endif
+
+#ifdef MOWGLI_SETPROC_USE_PRCTL
+ /* Limit us to 16 chars to be safe */
+ char procbuf[16];
+ mowgli_strlcpy(procbuf, ps_buffer, sizeof(procbuf));
+ prctl(PR_SET_NAME, procbuf, 0, 0, 0);
+ printf("%s\n", procbuf);
+#endif
+
+#ifdef MOWGLI_SETPROC_USE_PSTAT
+ union pstun pst;
+
+ pst.pst_command = ps_buffer;
+ pstat(PSTAT_SETCMD, pst, ps_buffer_cur_len, 0, 0);
+#endif /* MOWGLI_SETPROC_USE_PSTAT */
+
+#ifdef MOWGLI_SETPROC_USE_PS_STRINGS
+ PS_STRINGS->ps_nargvstr = 1;
+ PS_STRINGS->ps_argvstr = ps_buffer;
+#endif /* MOWGLI_SETPROC_USE_PS_STRINGS */
+
+#ifdef MOWGLI_SETPROC_USE_WIN32
+ /*
+ * Win32 does not support showing any changed arguments. To make it at
+ * all possible to track which backend is doing what, we create a
+ * named object that can be viewed with for example Process Explorer.
+ */
+ static HANDLE ident_handle = INVALID_HANDLE_VALUE;
+ char name[PS_BUFFER_SIZE + 32];
+
+ if (ident_handle != INVALID_HANDLE_VALUE)
+ CloseHandle(ident_handle);
+
+ sprintf(name, "mowgli_ident(%d): %s", getpid(), ps_buffer);
+
+ ident_handle = CreateEvent(NULL, TRUE, FALSE, name);
+#endif /* MOWGLI_SETPROC_USE_WIN32 */
+#endif /* not MOWGLI_SETPROC_USE_NONE */
+}
+
+
+/*
+ * Returns what's currently in the ps display, in case someone needs
+ * it. Note that only the activity part is returned. On some platforms
+ * the string will not be null-terminated, so return the effective
+ * length into *displen.
+ */
+const char *
+mowgli_proctitle_get(int *displen)
+{
+#ifdef MOWGLI_SETPROC_USE_CLOBBER_ARGV
+ /* If ps_buffer is a pointer, it might still be null */
+ if (!ps_buffer)
+ {
+ *displen = 0;
+ return "";
+ }
+#endif
+
+ *displen = (int) (ps_buffer_cur_len - ps_buffer_fixed_size);
+
+ return ps_buffer + ps_buffer_fixed_size;
+}
diff --git a/src/libmowgli/ext/proctitle.h b/src/libmowgli/ext/proctitle.h
new file mode 100644
index 0000000..479ee84
--- /dev/null
+++ b/src/libmowgli/ext/proctitle.h
@@ -0,0 +1,23 @@
+/*-------------------------------------------------------------------------
+ *
+ * ps_status.h
+ *
+ * Declarations for backend/utils/misc/ps_status.c
+ *
+ * src/include/utils/ps_status.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef __PS_STATUS_H__
+#define __PS_STATUS_H__
+
+extern bool mowgli_proctitle_update;
+
+extern char **mowgli_proctitle_init(int argc, char **argv);
+
+extern void mowgli_proctitle_set(const char *fmt, ...);
+
+extern const char *mowgli_proctitle_get(int *displen);
+
+#endif /* __PS_STATUS_H__ */
diff --git a/src/libmowgli/ext/program_opts.c b/src/libmowgli/ext/program_opts.c
new file mode 100644
index 0000000..75acd53
--- /dev/null
+++ b/src/libmowgli/ext/program_opts.c
@@ -0,0 +1,191 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * program_opts.h: Replacement for GNU getopt().
+ *
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#include "ext/getopt_long.h"
+
+void
+mowgli_program_opts_consumer_str(const char *arg, void *userdata)
+{
+ return_if_fail(arg != NULL);
+ return_if_fail(userdata != NULL);
+
+ *(char **) userdata = mowgli_strdup(arg);
+}
+
+void
+mowgli_program_opts_consumer_int(const char *arg, void *userdata)
+{
+ return_if_fail(arg != NULL);
+ return_if_fail(userdata != NULL);
+
+ *(int *) userdata = atoi(arg);
+}
+
+void
+mowgli_program_opts_consumer_bool(const char *arg, void *userdata)
+{
+ return_if_fail(arg != NULL);
+ return_if_fail(userdata != NULL);
+
+ *(bool *) userdata = true;
+}
+
+static inline mowgli_program_opts_t *
+mowgli_program_opts_lookup_name(mowgli_program_opts_t *opts, size_t opts_size, const char *name)
+{
+ size_t i;
+
+ if (strlen(name) > 1)
+ {
+ for (i = 0; i < opts_size; i++)
+ {
+ if (!strcasecmp(name, opts[i].longopt))
+ return &opts[i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < opts_size; i++)
+ {
+ if (*name == opts[i].smallopt)
+ return &opts[i];
+ }
+ }
+
+ return NULL;
+}
+
+static inline mowgli_getopt_option_t *
+mowgli_program_opts_convert(const mowgli_program_opts_t *opts, size_t opts_size)
+{
+ mowgli_getopt_option_t *g_opts;
+ size_t i;
+
+ return_val_if_fail(opts != NULL, NULL);
+
+ g_opts = mowgli_alloc_array(sizeof(mowgli_getopt_option_t), opts_size);
+
+ for (i = 0; i < opts_size; i++)
+ {
+ if (opts[i].longopt == NULL)
+ continue;
+
+ g_opts[i].name = opts[i].longopt;
+ g_opts[i].iflag = i;
+ if (opts[i].has_param)
+ g_opts[i].has_arg = 1;
+ }
+
+ return g_opts;
+}
+
+static inline const char *
+mowgli_program_opts_compute_optstr(const mowgli_program_opts_t *opts, size_t opts_size)
+{
+ static char buf[256];
+ char *p = buf;
+ size_t i;
+
+ return_val_if_fail(opts != NULL, NULL);
+
+ memset(buf, '\0', sizeof buf);
+
+ for (i = 0; i < opts_size; i++)
+ {
+ if (!opts[i].smallopt)
+ continue;
+
+ *p++ = opts[i].smallopt;
+ if (opts[i].has_param)
+ *p++ = ':';
+ }
+
+ *p = '\0';
+
+ return buf;
+}
+
+static inline void
+mowgli_program_opts_dispatch(const mowgli_program_opts_t *opt, const char *optarg)
+{
+ return_if_fail(opt != NULL);
+
+ if (opt->has_param && optarg == NULL)
+ {
+ fprintf(stderr, "no optarg for option %s", opt->longopt);
+ return;
+ }
+
+ opt->consumer(optarg, opt->userdata);
+}
+
+void
+mowgli_program_opts_parse(const mowgli_program_opts_t *opts, size_t opts_size, int *argc, char ***argv)
+{
+ mowgli_getopt_option_t *g_opts;
+ const char *shortops;
+ int c;
+ size_t i;
+ int opt_index;
+
+ return_if_fail(opts != NULL);
+ return_if_fail(opts_size > 0);
+ return_if_fail(argc != NULL);
+ return_if_fail(argv != NULL);
+
+ g_opts = mowgli_program_opts_convert(opts, opts_size);
+ shortops = mowgli_program_opts_compute_optstr(opts, opts_size);
+
+ for (;;)
+ {
+ const mowgli_program_opts_t *opt = NULL;
+
+ c = mowgli_getopt_long(*argc, *argv, shortops, g_opts, &opt_index);
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ /* long-option was provided, resolve it. */
+ opt = &opts[g_opts[opt_index].iflag];
+ break;
+ default:
+ for (i = 0; i < opts_size; i++)
+ {
+ if (opts[i].smallopt == c)
+ {
+ opt = &opts[i];
+ break;
+ }
+ }
+ break;
+ }
+
+ mowgli_program_opts_dispatch(opt, mowgli_optarg);
+ }
+
+ mowgli_free(g_opts);
+}
diff --git a/src/libmowgli/mowgli_allocation_policy.h b/src/libmowgli/ext/program_opts.h
index 037b8f9..f418b96 100644
--- a/src/libmowgli/mowgli_allocation_policy.h
+++ b/src/libmowgli/ext/program_opts.h
@@ -1,8 +1,8 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_allocation_policy.h: Allocation policy management.
+ * program_opts.h: Replacement for GNU getopt().
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,25 +21,30 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __MOWGLI_ALLOCATION_POLICY_H__
-#define __MOWGLI_ALLOCATION_POLICY_H__
+#ifndef __MOWGLI_PROGRAM_OPTS_H__
+#define __MOWGLI_PROGRAM_OPTS_H__
-typedef void *(*mowgli_allocation_func_t)(int size);
-typedef void (*mowgli_deallocation_func_t)(void *ptr);
+typedef void (*mowgli_program_opts_consumer_t)(const char *arg, void *userdata);
typedef struct {
- mowgli_object_t parent;
- mowgli_allocation_func_t allocate;
- mowgli_deallocation_func_t deallocate;
-} mowgli_allocation_policy_t;
-
-void mowgli_allocation_policy_init(void);
-mowgli_allocation_policy_t *mowgli_allocation_policy_create(const char *name,
- mowgli_allocation_func_t allocator, mowgli_deallocation_func_t deallocator);
-mowgli_allocation_policy_t *mowgli_allocation_policy_lookup(const char *name);
-
-/* for mowgli_alloc, et. al */
-void mowgli_allocator_set_policy(mowgli_allocation_policy_t *policy);
-void mowgli_allocator_set_policy_by_name(const char *name);
+ const char *longopt;
+ const char smallopt;
+ bool has_param;
+ mowgli_program_opts_consumer_t consumer;
+ void *userdata;
+
+ /* optional data */
+ const char *description;
+ const char *paramname;
+} mowgli_program_opts_t;
+
+/* use when has_param is true */
+extern void mowgli_program_opts_consumer_str(const char *arg, void *userdata);
+extern void mowgli_program_opts_consumer_int(const char *arg, void *userdata);
+
+/* use when has_param is false */
+extern void mowgli_program_opts_consumer_bool(const char *arg, void *userdata);
+
+extern void mowgli_program_opts_parse(const mowgli_program_opts_t *opts, size_t opts_size, int *argc, char ***argv);
#endif
diff --git a/src/libmowgli/linebuf/Makefile b/src/libmowgli/linebuf/Makefile
new file mode 100644
index 0000000..00dc853
--- /dev/null
+++ b/src/libmowgli/linebuf/Makefile
@@ -0,0 +1,15 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_LINEBUF}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_LINEBUF}
+
+SRCS = linebuf.c
+
+INCLUDES = linebuf.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/linebuf
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/linebuf/linebuf.c b/src/libmowgli/linebuf/linebuf.c
new file mode 100644
index 0000000..8b13040
--- /dev/null
+++ b/src/libmowgli/linebuf/linebuf.c
@@ -0,0 +1,292 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * linebuf.c: Line buffering for the event loop system
+ *
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+static mowgli_heap_t *linebuf_heap = NULL;
+
+static void mowgli_linebuf_read_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata);
+static void mowgli_linebuf_write_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata);
+static void mowgli_linebuf_process(mowgli_linebuf_t *linebuf);
+
+static int mowgli_linebuf_error(mowgli_vio_t *vio);
+
+mowgli_linebuf_t *
+mowgli_linebuf_create(mowgli_linebuf_readline_cb_t *cb, void *userdata)
+{
+ mowgli_linebuf_t *linebuf;
+
+ if (linebuf_heap == NULL)
+ linebuf_heap = mowgli_heap_create(sizeof(mowgli_linebuf_t), 16, BH_NOW);
+
+ linebuf = mowgli_heap_alloc(linebuf_heap);
+
+ linebuf->delim = "\r\n"; /* Sane default */
+ linebuf->readline_cb = cb;
+
+ linebuf->flags = 0;
+
+ linebuf->readbuf.buffer = NULL;
+ linebuf->writebuf.buffer = NULL;
+ mowgli_linebuf_setbuflen(&(linebuf->readbuf), 65536);
+ mowgli_linebuf_setbuflen(&(linebuf->writebuf), 65536);
+
+ linebuf->return_normal_strings = true; /* This is generally what you want, but beware of malicious \0's in input data! */
+
+ linebuf->userdata = userdata;
+
+ linebuf->vio = mowgli_vio_create(linebuf);
+
+ return linebuf;
+}
+
+/* Attach the linebuf instance to the eventloop -- socket must be created first with VIO instance! */
+void mowgli_linebuf_attach_to_eventloop(mowgli_linebuf_t *linebuf, mowgli_eventloop_t *eventloop)
+{
+ return_if_fail(eventloop != NULL);
+ return_if_fail(linebuf != NULL);
+ return_if_fail(linebuf->vio != NULL);
+ return_if_fail((linebuf->vio->flags & MOWGLI_VIO_FLAGS_ISCLOSED) == 0);
+
+ mowgli_vio_eventloop_attach(linebuf->vio, eventloop);
+ mowgli_pollable_setselect(eventloop, linebuf->vio->io, MOWGLI_EVENTLOOP_IO_READ, mowgli_linebuf_read_data);
+ mowgli_pollable_setselect(eventloop, linebuf->vio->io, MOWGLI_EVENTLOOP_IO_WRITE, mowgli_linebuf_write_data);
+
+ linebuf->eventloop = eventloop;
+}
+
+void mowgli_linebuf_destroy(mowgli_linebuf_t *linebuf)
+{
+ mowgli_vio_destroy(linebuf->vio);
+
+ mowgli_free(linebuf->readbuf.buffer);
+ mowgli_free(linebuf->writebuf.buffer);
+ mowgli_heap_free(linebuf_heap, linebuf);
+}
+
+void mowgli_linebuf_setbuflen(mowgli_linebuf_buf_t *buffer, size_t buflen)
+{
+ return_if_fail(buffer != NULL);
+
+ if (buffer->buffer == NULL)
+ buffer->buffer = mowgli_alloc(buflen);
+ else
+ {
+ char tmpbuf[buffer->maxbuflen];
+
+ if (buffer->buflen > 0)
+ memcpy(tmpbuf, buffer->buffer, buffer->maxbuflen); /* Copy into tmp buffer */
+
+ /* Free old buffer and reallocate */
+ mowgli_free(buffer->buffer);
+ buffer->buffer = mowgli_alloc(buflen);
+
+ if (buffer->buflen > 0)
+ /* Copy into new buffer using old buffer size */
+ memcpy(buffer->buffer, tmpbuf, buffer->maxbuflen);
+ }
+
+ buffer->maxbuflen = buflen;
+}
+
+static void mowgli_linebuf_read_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_linebuf_t *linebuf = (mowgli_linebuf_t *)userdata;
+ mowgli_linebuf_buf_t *buffer = &(linebuf->readbuf);
+ void *bufpos;
+ size_t offset;
+ int ret;
+
+ if (buffer->maxbuflen - buffer->buflen == 0)
+ {
+ linebuf->flags |= MOWGLI_LINEBUF_ERR_READBUF_FULL;
+ mowgli_linebuf_error(linebuf->vio);
+ return;
+ }
+
+ bufpos = buffer->buffer + buffer->buflen;
+ offset = buffer->maxbuflen - buffer->buflen + 1;
+
+ if ((ret = mowgli_vio_read(linebuf->vio, bufpos, offset)) <= 0)
+ {
+ if (linebuf->vio->error.code != MOWGLI_VIO_ERR_NONE)
+ /* Let's never come back here */
+ mowgli_pollable_setselect(eventloop, io, MOWGLI_EVENTLOOP_IO_READ, NULL);
+ return;
+ }
+
+ /* Le sigh -- stupid edge-triggered interfaces */
+ if (mowgli_vio_hasflag(linebuf->vio, MOWGLI_VIO_FLAGS_NEEDREAD))
+ mowgli_pollable_setselect(eventloop, io, MOWGLI_EVENTLOOP_IO_READ, mowgli_linebuf_read_data);
+
+ /* Do we want a write for SSL? */
+ if (mowgli_vio_hasflag(linebuf->vio, MOWGLI_VIO_FLAGS_NEEDWRITE))
+ mowgli_pollable_setselect(eventloop, io, MOWGLI_EVENTLOOP_IO_WRITE, mowgli_linebuf_write_data);
+
+ buffer->buflen += ret;
+ mowgli_linebuf_process(linebuf);
+}
+
+static void mowgli_linebuf_write_data(mowgli_eventloop_t *eventloop, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *userdata)
+{
+ mowgli_linebuf_t *linebuf = (mowgli_linebuf_t *)userdata;
+ mowgli_linebuf_buf_t *buffer = &(linebuf->writebuf);
+ int ret;
+
+ if ((ret = mowgli_vio_write(linebuf->vio, buffer->buffer, buffer->buflen)) <= 0)
+ {
+ if (linebuf->vio->error.code != MOWGLI_VIO_ERR_NONE)
+ /* If we have a genuine error, we shouldn't come back to this func
+ * Otherwise we'll try again. */
+ mowgli_pollable_setselect(eventloop, io, MOWGLI_EVENTLOOP_IO_WRITE, NULL);
+ return;
+ }
+
+ buffer->buflen -= ret;
+
+ /* Anything else to write? */
+ if (buffer->buflen == 0)
+ mowgli_pollable_setselect(eventloop, io, MOWGLI_EVENTLOOP_IO_WRITE, NULL);
+}
+
+void mowgli_linebuf_writef(mowgli_linebuf_t *linebuf, const char *format, ...)
+{
+ char buf[linebuf->writebuf.maxbuflen];
+ size_t len;
+ va_list va;
+
+ va_start(va, format);
+ len = vsnprintf(buf, linebuf->writebuf.maxbuflen - 1, format, va);
+ va_end(va);
+
+ mowgli_linebuf_write(linebuf, buf, len);
+}
+
+void mowgli_linebuf_write(mowgli_linebuf_t *linebuf, const char *data, int len)
+{
+ char *ptr = linebuf->writebuf.buffer + linebuf->writebuf.buflen;
+ int delim_len = strlen(linebuf->delim);
+
+ return_if_fail(len > 0);
+ return_if_fail(data != NULL);
+
+ if (linebuf->writebuf.buflen + len + delim_len > linebuf->writebuf.maxbuflen)
+ {
+ linebuf->flags |= MOWGLI_LINEBUF_ERR_WRITEBUF_FULL;
+ mowgli_linebuf_error(linebuf->vio);
+ return;
+ }
+
+ memcpy((void *)ptr, data, len);
+ memcpy((void *)(ptr + len), linebuf->delim, delim_len);
+
+ linebuf->writebuf.buflen += len + delim_len;
+
+ /* Schedule our write */
+ mowgli_pollable_setselect(linebuf->eventloop, linebuf->vio->io, MOWGLI_EVENTLOOP_IO_WRITE, mowgli_linebuf_write_data);
+}
+
+static void mowgli_linebuf_process(mowgli_linebuf_t *linebuf)
+{
+ mowgli_linebuf_buf_t *buffer = &(linebuf->readbuf);
+ size_t delim_len = strlen(linebuf->delim);
+
+ char *line_start;
+ char *cptr;
+ size_t len = 0;
+ int linecount = 0;
+
+ line_start = cptr = buffer->buffer;
+
+ /* Initalise */
+ linebuf->flags &= ~MOWGLI_LINEBUF_LINE_HASNULLCHAR;
+
+ while (len < buffer->buflen)
+ {
+ if (memcmp((void *)cptr, linebuf->delim, delim_len) != 0)
+ {
+ if (*cptr == '\0')
+ /* Warn about unexpected null chars in the string */
+ linebuf->flags |= MOWGLI_LINEBUF_LINE_HASNULLCHAR;
+ cptr++;
+ len++;
+ continue;
+ }
+
+ linecount++;
+
+ /* We now have a line */
+ if (linebuf->return_normal_strings)
+ *cptr = '\0';
+
+ linebuf->readline_cb(linebuf, line_start, cptr - line_start, linebuf->userdata);
+
+ /* Next line starts here; begin scanning and set the start of it */
+ len += delim_len;
+ cptr += delim_len;
+ line_start = cptr;
+
+ /* Reset this for next line */
+ linebuf->flags &= ~MOWGLI_LINEBUF_LINE_HASNULLCHAR;
+ }
+
+ if (linecount == 0 && (buffer->buflen == buffer->maxbuflen))
+ {
+ /* No more chars will fit in the buffer and we don't have a line
+ * We're really screwed, let's trigger an error. */
+ linebuf->flags |= MOWGLI_LINEBUF_ERR_READBUF_FULL;
+ mowgli_linebuf_error(linebuf->vio);
+ return;
+ }
+
+ if (line_start != cptr)
+ {
+ buffer->buflen = cptr - line_start;
+ memmove(buffer->buffer, line_start, cptr - line_start);
+ }
+ else
+ buffer->buflen = 0;
+}
+
+static int mowgli_linebuf_error(mowgli_vio_t *vio)
+{
+ mowgli_linebuf_t *linebuf = vio->userdata;
+ mowgli_vio_error_t *error = &(linebuf->vio->error);
+
+ if (linebuf->flags & MOWGLI_LINEBUF_ERR_READBUF_FULL)
+ {
+ error->op = MOWGLI_VIO_ERR_OP_READ;
+ error->type = MOWGLI_VIO_ERR_CUSTOM;
+ mowgli_strlcpy(error->string, "Read buffer full", sizeof(error->string));
+ }
+ else if (linebuf->flags & MOWGLI_LINEBUF_ERR_WRITEBUF_FULL)
+ {
+ error->op = MOWGLI_VIO_ERR_OP_WRITE;
+ error->type = MOWGLI_VIO_ERR_CUSTOM;
+ mowgli_strlcpy(error->string, "Write buffer full", sizeof(error->string));
+ }
+
+ /* Pass this up to higher callback */
+ return mowgli_vio_error(vio);
+}
+
diff --git a/src/libmowgli/linebuf/linebuf.h b/src/libmowgli/linebuf/linebuf.h
new file mode 100644
index 0000000..17c45ea
--- /dev/null
+++ b/src/libmowgli/linebuf/linebuf.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_LINEBUF_LINEBUF_H__
+#define __MOWGLI_LINEBUF_LINEBUF_H__
+
+#include "eventloop/eventloop.h"
+#include "vio/vio.h"
+
+typedef struct _mowgli_linebuf_buf mowgli_linebuf_buf_t;
+
+typedef void mowgli_linebuf_readline_cb_t(mowgli_linebuf_t *, char *, size_t, void *);
+
+extern mowgli_linebuf_t * mowgli_linebuf_create(mowgli_linebuf_readline_cb_t *cb, void *userdata);
+extern void mowgli_linebuf_attach_to_eventloop(mowgli_linebuf_t *linebuf, mowgli_eventloop_t *eventloop);
+extern void mowgli_linebuf_destroy(mowgli_linebuf_t *linebuf);
+
+extern void mowgli_linebuf_setbuflen(mowgli_linebuf_buf_t *buffer, size_t buflen);
+extern void mowgli_linebuf_write(mowgli_linebuf_t *linebuf, const char *data, int len);
+extern void mowgli_linebuf_writef(mowgli_linebuf_t *linebuf, const char *format, ...);
+
+struct _mowgli_linebuf_buf {
+ char *buffer;
+ size_t buflen;
+ size_t maxbuflen;
+};
+
+/* Errors */
+#define MOWGLI_LINEBUF_ERR_NONE 0x0000
+#define MOWGLI_LINEBUF_ERR_READBUF_FULL 0x0001
+#define MOWGLI_LINEBUF_ERR_WRITEBUF_FULL 0x0002
+
+/* Informative */
+#define MOWGLI_LINEBUF_LINE_HASNULLCHAR 0x0004
+
+struct _mowgli_linebuf {
+ mowgli_linebuf_readline_cb_t *readline_cb;
+
+ mowgli_vio_t *vio;
+
+ const char *delim;
+
+ int flags;
+
+ mowgli_linebuf_buf_t readbuf;
+ mowgli_linebuf_buf_t writebuf;
+
+ mowgli_eventloop_t *eventloop;
+
+ bool return_normal_strings;
+
+ void *userdata;
+};
+
+static inline mowgli_vio_t * mowgli_linebuf_get_vio(mowgli_linebuf_t *linebuf)
+{
+ return_val_if_fail(linebuf != NULL, NULL);
+ return linebuf->vio;
+}
+
+#endif
+
diff --git a/src/libmowgli/module/Makefile b/src/libmowgli/module/Makefile
new file mode 100644
index 0000000..702ed7c
--- /dev/null
+++ b/src/libmowgli/module/Makefile
@@ -0,0 +1,15 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_MODULE}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_MODULE}
+
+SRCS = loader_${LIBMOWGLI_OS}.c
+
+INCLUDES = module.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/module
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/mowgli_module_posix.c b/src/libmowgli/module/loader_posix.c
index dd4a25c..f15c38a 100644
--- a/src/libmowgli/mowgli_module_posix.c
+++ b/src/libmowgli/module/loader_posix.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_module.c: Loadable modules for POSIX systems.
+ * loader_posix.c: Loadable modules for POSIX systems.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_module_win32.c b/src/libmowgli/module/loader_win32.c
index e4b7428..f42a742 100644
--- a/src/libmowgli/mowgli_module_win32.c
+++ b/src/libmowgli/module/loader_win32.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_module_win32.c: Loadable modules under Microsoft Windows.
+ * loader_win32.c: Loadable modules under Microsoft Windows.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_module.h b/src/libmowgli/module/module.h
index 1ef89b4..54fc344 100644
--- a/src/libmowgli/mowgli_module.h
+++ b/src/libmowgli/module/module.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_module.h: Loadable modules.
+ * module.h: Loadable modules.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli.h b/src/libmowgli/mowgli.h
index fe494b2..6a64f0d 100644
--- a/src/libmowgli/mowgli.h
+++ b/src/libmowgli/mowgli.h
@@ -33,47 +33,63 @@
#endif
#ifdef MOWGLI_CORE
-# include "win32_support.h"
-# include "mowgli_config.h"
+# include "platform/autoconf.h"
#endif
-#include "mowgli_stdinc.h"
+#include "core/stdinc.h"
MOWGLI_DECLS_START
-#include "mowgli_logger.h"
-#include "mowgli_assert.h"
-#include "mowgli_exception.h"
-#include "mowgli_iterator.h"
-
-#include "mowgli_alloc.h"
-#include "mowgli_spinlock.h"
-#include "mowgli_list.h"
-#include "mowgli_object_class.h"
-#include "mowgli_object.h"
-#include "mowgli_allocation_policy.h"
-#include "mowgli_dictionary.h"
-#include "mowgli_patricia.h"
-#include "mowgli_mempool.h"
-#include "mowgli_module.h"
-#include "mowgli_queue.h"
-#include "mowgli_hash.h"
-#include "mowgli_heap.h"
-#include "mowgli_init.h"
-#include "mowgli_bitvector.h"
-#include "mowgli_hook.h"
-#include "mowgli_signal.h"
-#include "mowgli_error_backtrace.h"
-#include "mowgli_random.h"
-#include "mowgli_ioevent.h"
-#include "mowgli_argstack.h"
-#include "mowgli_object_messaging.h"
-#include "mowgli_object_metadata.h"
-#include "mowgli_global_storage.h"
-#include "mowgli_string.h"
-#include "mowgli_allocator.h"
-#include "mowgli_formatter.h"
-#include "mowgli_index.h"
+#include "platform/constructor.h"
+#include "platform/machine.h"
+
+#include "core/logger.h"
+#include "core/assert.h"
+#include "core/exception.h"
+#include "core/iterator.h"
+
+#include "container/list.h"
+#include "object/class.h"
+#include "object/object.h"
+
+#include "core/allocation_policy.h"
+#include "core/alloc.h"
+
+#include "container/dictionary.h"
+
+#include "thread/thread.h"
+#include "thread/mutex.h"
+
+#include "base/memslice.h"
+#include "container/patricia.h"
+#include "module/module.h"
+#include "container/queue.h"
+#include "base/hash.h"
+#include "core/heap.h"
+#include "core/bootstrap.h"
+#include "base/bitvector.h"
+#include "base/hook.h"
+#include "base/mowgli_signal.h"
+#include "ext/proctitle.h"
+#include "ext/error_backtrace.h"
+#include "base/random.h"
+#include "base/argstack.h"
+#include "object/message.h"
+#include "object/metadata.h"
+#include "ext/global_storage.h"
+#include "core/process.h"
+#include "eventloop/eventloop.h"
+#include "vio/vio.h"
+#include "core/mowgli_string.h"
+#include "core/allocator.h"
+#include "base/formatter.h"
+#include "container/index.h"
+
+#include "ext/confparse.h"
+#include "ext/program_opts.h"
+
+#include "linebuf/linebuf.h"
+#include "dns/dns.h"
MOWGLI_DECLS_END
diff --git a/src/libmowgli/mowgli_alloc.c b/src/libmowgli/mowgli_alloc.c
deleted file mode 100644
index c7d3c4f..0000000
--- a/src/libmowgli/mowgli_alloc.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_alloc.c: Safe, portable implementations of malloc, calloc, and free.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-/*
- * bootstrapped allocators so that we can initialise without blowing up
- */
-
-static void *
-_mowgli_bootstrap_alloc(int size)
-{
- return calloc(size, 1);
-}
-
-static void
-_mowgli_bootstrap_free(void *ptr)
-{
- if (ptr)
- free(ptr);
-}
-
-static mowgli_allocation_policy_t _mowgli_allocator_bootstrap = {
- { 0 },
- _mowgli_bootstrap_alloc,
- _mowgli_bootstrap_free
-};
-
-static mowgli_allocation_policy_t *_mowgli_allocator = &_mowgli_allocator_bootstrap;
-
-/*
- * \brief Allocates an array of data that contains "count" objects,
- * of "size" size.
- *
- * Usually, this wraps calloc().
- *
- * \param size size of objects to allocate.
- * \param count amount of objects to allocate.
- *
- * \return A pointer to a memory buffer.
- */
-void *
-mowgli_alloc_array(size_t size, size_t count)
-{
- return_val_if_fail(_mowgli_allocator != NULL, NULL);
-
- return _mowgli_allocator->allocate(size * count);
-}
-
-/*
- * \brief Allocates an object of "size" size.
- *
- * This is the equivilant of calling mowgli_alloc_array(size, 1).
- *
- * \param size size of object to allocate.
- *
- * \return A pointer to a memory buffer.
- */
-void *
-mowgli_alloc(size_t size)
-{
- return mowgli_alloc_array(size, 1);
-}
-
-/*
- * \brief Frees an object back to the system memory pool.
- *
- * Wraps free protecting against common mistakes (reports an error instead).
- *
- * \param ptr pointer to object to free.
- */
-void
-mowgli_free(void *ptr)
-{
- return_if_fail(_mowgli_allocator != NULL);
- return_if_fail(ptr != NULL);
-
- _mowgli_allocator->deallocate(ptr);
-}
-
-/*
- * \brief Sets the mowgli.allocation_policy used by the allocation primitives.
- *
- * \param policy The mowgli_allocation_policy_t object to use.
- */
-void
-mowgli_allocator_set_policy(mowgli_allocation_policy_t *policy)
-{
- return_if_fail(policy != NULL);
-
- _mowgli_allocator = policy;
-}
-
-/*
- * \brief Sets the mowgli.allocation_policy used by the allocation primitives,
- * when given a name.
- *
- * \param name The name of the policy to use.
- */
-void
-mowgli_allocator_set_policy_by_name(const char *name)
-{
- mowgli_allocation_policy_t *policy;
-
- return_if_fail(name != NULL);
-
- policy = mowgli_allocation_policy_lookup(name);
-
- if (policy == NULL)
- return;
-
- mowgli_allocator_set_policy(policy);
-}
diff --git a/src/libmowgli/mowgli_alloc.h b/src/libmowgli/mowgli_alloc.h
deleted file mode 100644
index 16bd674..0000000
--- a/src/libmowgli/mowgli_alloc.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_alloc.h: Safe, portable implementations of malloc, calloc, and free.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_ALLOC_H__
-#define __MOWGLI_ALLOC_H__
-
-extern void * mowgli_alloc_array(size_t size, size_t count);
-extern void * mowgli_alloc(size_t size);
-extern void mowgli_free(void *ptr);
-
-#endif
diff --git a/src/libmowgli/mowgli_allocation_policy.c b/src/libmowgli/mowgli_allocation_policy.c
deleted file mode 100644
index 8f390d1..0000000
--- a/src/libmowgli/mowgli_allocation_policy.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_allocation_policy.h: Allocation policy management.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-static mowgli_object_class_t klass;
-static mowgli_patricia_t *mowgli_allocation_policy_dict = NULL;
-
-static void _allocation_policy_key_canon(char *str)
-{
-
-}
-
-void
-mowgli_allocation_policy_init(void)
-{
- mowgli_allocation_policy_dict = mowgli_patricia_create(_allocation_policy_key_canon);
-
- mowgli_object_class_init(&klass, "mowgli.allocation_policy", NULL, FALSE);
-}
-
-mowgli_allocation_policy_t *
-mowgli_allocation_policy_create(const char *name, mowgli_allocation_func_t allocator,
- mowgli_deallocation_func_t deallocator)
-{
- mowgli_allocation_policy_t *policy;
-
- if (mowgli_allocation_policy_dict == NULL)
- mowgli_allocation_policy_dict = mowgli_patricia_create(_allocation_policy_key_canon);
-
- if ((policy = mowgli_patricia_retrieve(mowgli_allocation_policy_dict, name)))
- return policy;
-
- policy = mowgli_alloc(sizeof(mowgli_allocation_policy_t));
- mowgli_object_init_from_class(mowgli_object(policy), name, &klass);
-
- policy->allocate = allocator;
- policy->deallocate = deallocator;
-
- return policy;
-}
-
-mowgli_allocation_policy_t *
-mowgli_allocation_policy_lookup(const char *name)
-{
- if (mowgli_allocation_policy_dict == NULL)
- mowgli_allocation_policy_dict = mowgli_patricia_create(_allocation_policy_key_canon);
-
- return mowgli_patricia_retrieve(mowgli_allocation_policy_dict, name);
-}
diff --git a/src/libmowgli/mowgli_assert.h b/src/libmowgli/mowgli_assert.h
deleted file mode 100644
index 8ee2c4f..0000000
--- a/src/libmowgli/mowgli_assert.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_assert.h: Assertions.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_ASSERT_H__
-#define __MOWGLI_ASSERT_H__
-
-extern void mowgli_soft_assert_log(const char *asrt, const char *file, int line, const char *function);
-
-#ifdef __GNUC__
-
-/*
- * Performs a soft assertion. If the assertion fails, we log it.
- */
-#define soft_assert(x) \
- if (!(x)) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
- }
-
-/*
- * Same as soft_assert, but returns if an assertion fails.
- */
-#define return_if_fail(x) \
- if (!(x)) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
- return; \
- }
-
-/*
- * Same as soft_assert, but returns a given value if an assertion fails.
- */
-#define return_val_if_fail(x, y) \
- if (!(x)) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
- return (y); \
- }
-
-/*
- * Same as soft_assert, but returns NULL if the value is NULL.
- */
-#define return_if_null(x) \
- if (x == NULL) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
- return (NULL); \
- }
-
-#else
-
-/*
- * Performs a soft assertion. If the assertion fails, we log it.
- */
-#define soft_assert(x) \
- if (!(x)) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __FUNCTION__); \
- }
-
-/*
- * Same as soft_assert, but returns if an assertion fails.
- */
-#define return_if_fail(x) \
- if (!(x)) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __FUNCTION__); \
- return; \
- }
-
-/*
- * Same as soft_assert, but returns a given value if an assertion fails.
- */
-#define return_val_if_fail(x, y) \
- if (!(x)) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __FUNCTION__); \
- return (y); \
- }
-
-/*
- * Same as soft_assert, but returns NULL if the value is NULL.
- */
-#define return_if_null(x) \
- if (x == NULL) { \
- mowgli_soft_assert_log(#x, __FILE__, __LINE__, __FUNCTION__); \
- return (NULL); \
- }
-
-#endif
-
-#endif
diff --git a/src/libmowgli/mowgli_config.h.in b/src/libmowgli/mowgli_config.h.in
deleted file mode 100644
index c43e92c..0000000
--- a/src/libmowgli/mowgli_config.h.in
+++ /dev/null
@@ -1,147 +0,0 @@
-/* src/libmowgli/mowgli_config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define to 1 if the `closedir' function returns void instead of `int'. */
-#undef CLOSEDIR_VOID
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
- */
-#undef HAVE_DIRENT_H
-
-/* Define to 1 if you have the `epoll_ctl' function. */
-#undef HAVE_EPOLL_CTL
-
-/* Define to 1 if you have the <errno.h> header file. */
-#undef HAVE_ERRNO_H
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#undef HAVE_GETTIMEOFDAY
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
-
-/* Define to 1 if you have the <locale.h> header file. */
-#undef HAVE_LOCALE_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `memset' function. */
-#undef HAVE_MEMSET
-
-/* Define to 1 if you have the `mmap' function. */
-#undef HAVE_MMAP
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-#undef HAVE_NDIR_H
-
-/* Define to 1 if you have the `port_create' function. */
-#undef HAVE_PORT_CREATE
-
-/* Define to 1 if you have the `printf' function. */
-#undef HAVE_PRINTF
-
-/* Define to 1 if you have the `setlocale' function. */
-#undef HAVE_SETLOCALE
-
-/* Define to 1 if you have the `snprintf' function. */
-#undef HAVE_SNPRINTF
-
-/* Define to 1 if you have the `sprintf' function. */
-#undef HAVE_SPRINTF
-
-/* Define to 1 if `stat' has the bug that it succeeds when given the
- zero-length file name argument. */
-#undef HAVE_STAT_EMPTY_STRING_BUG
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#undef HAVE_STDARG_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#undef HAVE_STRCASECMP
-
-/* Define to 1 if you have the `strchr' function. */
-#undef HAVE_STRCHR
-
-/* Define to 1 if you have the `strdup' function. */
-#undef HAVE_STRDUP
-
-/* Define to 1 if you have the `strerror' function. */
-#undef HAVE_STRERROR
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strlcat' function. */
-#undef HAVE_STRLCAT
-
-/* Define to 1 if you have the `strlcpy' function. */
-#undef HAVE_STRLCPY
-
-/* Define to 1 if you have the `strndup' function. */
-#undef HAVE_STRNDUP
-
-/* Define to 1 if you have the `strtod' function. */
-#undef HAVE_STRTOD
-
-/* Define to 1 if you have the `strtol' function. */
-#undef HAVE_STRTOL
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
- */
-#undef HAVE_SYS_DIR_H
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
- */
-#undef HAVE_SYS_NDIR_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#undef HAVE_VSNPRINTF
-
-/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
- slash. */
-#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
diff --git a/src/libmowgli/mowgli_exception.h b/src/libmowgli/mowgli_exception.h
deleted file mode 100644
index c919bcb..0000000
--- a/src/libmowgli/mowgli_exception.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_exception.h: Exceptions.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_EXCEPTION_H__
-#define __MOWGLI_EXCEPTION_H__
-
-#define mowgli_throw_exception(x) do { mowgli_log("exception %s thrown", #x); return; } while(0)
-
-#define mowgli_throw_exception_val(x, y) do { mowgli_log("exception %s thrown", #x); return (y); } while(0)
-
-#define mowgli_throw_exception_fatal(x) \
- do { \
- mowgli_log("exception %s thrown", #x); \
- exit(EXIT_FAILURE); \
- } while (0)
-
-#endif
diff --git a/src/libmowgli/mowgli_heap.c b/src/libmowgli/mowgli_heap.c
deleted file mode 100644
index 532517a..0000000
--- a/src/libmowgli/mowgli_heap.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_heap.c: Heap allocation.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- * Copyright (c) 2005-2006 Theo Julienne <terminal -at- atheme.org>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Legal note: code devised from claro.base.block module r288 (Pre MPL)
- */
-
-#include "mowgli.h"
-
-#ifdef HAVE_MMAP
-# include <sys/mman.h>
-# if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
-# define MAP_ANON MAP_ANONYMOUS
-# endif
-#endif
-
-/* A block of memory allocated to the allocator */
-struct mowgli_block_
-{
- mowgli_node_t node;
-
- /* link back to our heap */
- mowgli_heap_t *heap;
-
- /* pointer to the first item */
- void *data;
-
- /* singly linked list of free items */
- void *first_free;
-
- int num_allocated;
-};
-
-/* A pile of blocks */
-struct mowgli_heap_
-{
- mowgli_node_t node;
-
- unsigned int elem_size;
- unsigned int mowgli_heap_elems;
- unsigned int free_elems;
-
- unsigned int alloc_size;
-
- unsigned int flags;
-
- mowgli_list_t blocks; /* list of non-empty blocks */
-
- mowgli_allocation_policy_t *allocator;
- mowgli_boolean_t use_mmap;
-
- mowgli_block_t *empty_block; /* a single entirely free block, or NULL */
-};
-
-typedef struct mowgli_heap_elem_header_ mowgli_heap_elem_header_t;
-
-struct mowgli_heap_elem_header_
-{
- union
- {
- mowgli_block_t *block; /* for allocated elems: block ptr */
- mowgli_heap_elem_header_t *next; /* for free elems: next free */
- } un;
-};
-
-/* expands a mowgli_heap_t by 1 block */
-static void
-mowgli_heap_expand(mowgli_heap_t *bh)
-{
- mowgli_block_t *block = NULL;
- void *blp = NULL;
- mowgli_heap_elem_header_t *node, *prev;
- char *offset;
- unsigned int a;
-
- size_t blp_size = sizeof(mowgli_block_t) + (bh->alloc_size * bh->mowgli_heap_elems);
-
- return_if_fail(bh->empty_block == NULL);
-
-#if defined(HAVE_MMAP) && defined(MAP_ANON)
- if (bh->use_mmap)
- blp = mmap(NULL, sizeof(mowgli_block_t) + (bh->alloc_size * bh->mowgli_heap_elems),
- PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
- else
-#endif
- {
- if (bh->allocator)
- blp = bh->allocator->allocate(blp_size);
- else
- blp = mowgli_alloc(blp_size);
- }
-
- block = (mowgli_block_t *)blp;
-
- offset = (char*)blp + sizeof(mowgli_block_t);
- block->data = offset;
- block->heap = bh;
-
- prev = NULL;
-
- for (a = 0; a < bh->mowgli_heap_elems; a++)
- {
- node = (mowgli_heap_elem_header_t *)offset;
- node->un.next = prev;
- offset += bh->alloc_size;
- prev = node;
- }
-
- block->first_free = prev;
-
- bh->empty_block = block;
- bh->free_elems += bh->mowgli_heap_elems;
-}
-
-/* shrinks a mowgli_heap_t by 1 block. */
-static void
-mowgli_heap_shrink(mowgli_heap_t *heap, mowgli_block_t *b)
-{
- return_if_fail(b != NULL);
-
- if (b == heap->empty_block)
- heap->empty_block = NULL;
- else
- mowgli_node_delete(&b->node, &heap->blocks);
-
-#ifdef HAVE_MMAP
- if (heap->use_mmap)
- munmap(b, sizeof(mowgli_block_t) + (heap->alloc_size * heap->mowgli_heap_elems));
- else
-#endif
- if (heap->allocator)
- heap->allocator->deallocate(b);
- else
- mowgli_free(b);
-
- heap->free_elems -= heap->mowgli_heap_elems;
-}
-
-/* creates a new mowgli_heap_t */
-mowgli_heap_t *
-mowgli_heap_create_full(size_t elem_size, size_t mowgli_heap_elems, unsigned int flags,
- mowgli_allocation_policy_t *allocator)
-{
- mowgli_heap_t *bh = mowgli_alloc(sizeof(mowgli_heap_t));
- int numpages, pagesize;
-
- bh->elem_size = elem_size;
- bh->mowgli_heap_elems = mowgli_heap_elems;
- /* at least 2, this avoids some silly special cases */
- if (bh->mowgli_heap_elems < 2)
- bh->mowgli_heap_elems = 2;
- bh->free_elems = 0;
-
- bh->alloc_size = bh->elem_size + sizeof(mowgli_heap_elem_header_t);
-
- /* don't waste part of a page */
- if (allocator == NULL)
- {
-#ifdef HAVE_MMAP
- pagesize = getpagesize();
-#else
- pagesize = 4096;
-#endif
- numpages = (sizeof(mowgli_block_t) + (bh->alloc_size * bh->mowgli_heap_elems) + pagesize - 1) / pagesize;
- bh->mowgli_heap_elems = (numpages * pagesize - sizeof(mowgli_block_t)) / bh->alloc_size;
- }
-
- bh->flags = flags;
-
- bh->allocator = allocator ? allocator : mowgli_allocator_malloc;
-
-#ifdef HAVE_MMAP
- bh->use_mmap = allocator != NULL ? FALSE : TRUE;
-#endif
-
- if (flags & BH_NOW)
- mowgli_heap_expand(bh);
-
- return bh;
-}
-
-mowgli_heap_t *
-mowgli_heap_create(size_t elem_size, size_t mowgli_heap_elems, unsigned int flags)
-{
- return mowgli_heap_create_full(elem_size, mowgli_heap_elems, flags, NULL);
-}
-
-/* completely frees a mowgli_heap_t and all blocks */
-void
-mowgli_heap_destroy(mowgli_heap_t *heap)
-{
- mowgli_node_t *n, *tn;
-
- MOWGLI_LIST_FOREACH_SAFE(n, tn, heap->blocks.head)
- {
- mowgli_heap_shrink(heap, n->data);
- }
- if (heap->empty_block)
- mowgli_heap_shrink(heap, heap->empty_block);
-
- /* everything related to heap has gone, time for itself */
- mowgli_free(heap);
-}
-
-/* allocates a new item from a mowgli_heap_t */
-void *
-mowgli_heap_alloc(mowgli_heap_t *heap)
-{
- mowgli_node_t *n;
- mowgli_block_t *b;
- mowgli_heap_elem_header_t *h;
-
- /* no free space? */
- if (heap->free_elems == 0)
- {
- mowgli_heap_expand(heap);
-
- return_val_if_fail(heap->free_elems != 0, NULL);
- }
-
- /* try a partially used block before using a fully free block */
- n = heap->blocks.head;
- b = n != NULL ? n->data : NULL;
- if (b == NULL || b->first_free == NULL)
- b = heap->empty_block;
- /* due to above check */
- return_val_if_fail(b != NULL, NULL);
-
- /* pull the first free node from the list */
- h = b->first_free;
- return_val_if_fail(h != NULL, NULL);
-
- /* mark it as used */
- b->first_free = h->un.next;
- h->un.block = b;
-
- /* keep count */
- heap->free_elems--;
- b->num_allocated++;
-
- /* move it between the lists if needed */
- /* note that a block has at least two items in it, so these cases
- * cannot both occur in the same allocation */
- if (b->num_allocated == 1)
- {
- heap->empty_block = NULL;
- mowgli_node_add_head(b, &b->node, &heap->blocks);
- }
- else if (b->first_free == NULL)
- {
- /* move full blocks to the end of the list */
- mowgli_node_delete(&b->node, &heap->blocks);
- mowgli_node_add(b, &b->node, &heap->blocks);
- }
-
-#ifdef HEAP_DEBUG
- /* debug */
- mowgli_log("mowgli_heap_alloc(heap = @%p) -> %p", heap, fn->data);
-#endif
- /* return pointer to it */
- return (char *)h + sizeof(mowgli_heap_elem_header_t);
-}
-
-/* frees an item back to the mowgli_heap_t */
-void
-mowgli_heap_free(mowgli_heap_t *heap, void *data)
-{
- mowgli_block_t *b;
- mowgli_heap_elem_header_t *h;
-
- h = (mowgli_heap_elem_header_t *)((char *)data - sizeof(mowgli_heap_elem_header_t));
- b = h->un.block;
-
- return_if_fail(b->heap == heap);
- return_if_fail(b->num_allocated > 0);
-
- /* memset the element before returning it to the heap. */
- memset(data, 0, b->heap->elem_size);
-
- /* mark it as free */
- h->un.next = b->first_free;
- b->first_free = h;
-
- /* keep count */
- heap->free_elems++;
- b->num_allocated--;
-#ifdef HEAP_DEBUG
- /* debug */
- mowgli_log("mowgli_heap_free(heap = @%p, data = %p)", heap, data);
-#endif
- /* move it between the lists if needed */
- if (b->num_allocated == 0)
- {
- if (heap->empty_block != NULL)
- mowgli_heap_shrink(heap, heap->empty_block);
- mowgli_node_delete(&b->node, &heap->blocks);
- heap->empty_block = b;
- }
- else if (b->num_allocated == heap->mowgli_heap_elems - 1)
- {
- mowgli_node_delete(&b->node, &heap->blocks);
- mowgli_node_add_head(b, &b->node, &heap->blocks);
- }
-}
diff --git a/src/libmowgli/mowgli_heap.h b/src/libmowgli/mowgli_heap.h
deleted file mode 100644
index 8a38f55..0000000
--- a/src/libmowgli/mowgli_heap.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_heap.h: Heap allocation.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- * Copyright (c) 2005-2006 Theo Julienne <terminal -at- atheme.org>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Legal note: code devised from claro.base.block module r288 (Pre MPL)
- */
-
-#ifndef __MOWGLI_HEAP_H__
-#define __MOWGLI_HEAP_H__
-
-typedef struct mowgli_heap_ mowgli_heap_t;
-typedef struct mowgli_block_ mowgli_block_t;
-
-/* Flag for mowgli_heap_create */
-#define BH_DONTCARE 0
-
-#define BH_NOW 1
-#define BH_LAZY 0
-
-/* Functions for heaps */
-extern mowgli_heap_t *mowgli_heap_create(size_t elem_size, size_t mowgli_heap_elems, unsigned int flags);
-extern mowgli_heap_t *mowgli_heap_create_full(size_t elem_size, size_t mowgli_heap_elems, unsigned int flags,
- mowgli_allocation_policy_t *allocator);
-extern void mowgli_heap_destroy(mowgli_heap_t *heap);
-
-/* Functions for blocks */
-extern void *mowgli_heap_alloc(mowgli_heap_t *heap);
-extern void mowgli_heap_free(mowgli_heap_t *heap, void *data);
-
-#endif
-
diff --git a/src/libmowgli/mowgli_ioevent.c b/src/libmowgli/mowgli_ioevent.c
deleted file mode 100644
index ed08cb9..0000000
--- a/src/libmowgli/mowgli_ioevent.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_ioevent.c: Portable I/O event layer.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-#ifdef HAVE_EPOLL_CTL
-# include <sys/epoll.h>
-#endif
-
-#ifdef HAVE_PORT_CREATE
-# include <port.h>
-#endif
-
-mowgli_ioevent_handle_t *mowgli_ioevent_create(void)
-{
- mowgli_ioevent_handle_t *self = mowgli_alloc(sizeof(mowgli_ioevent_handle_t));
-
-#ifdef HAVE_EPOLL_CTL
- self->impldata = epoll_create(FD_SETSIZE);
-#endif
-
-#ifdef HAVE_PORT_CREATE
- self->impldata = port_create();
-#endif
-
- return self;
-}
-
-void mowgli_ioevent_destroy(mowgli_ioevent_handle_t *self)
-{
- return_if_fail(self != NULL);
-
-#if defined(HAVE_EPOLL_CTL) || defined(HAVE_PORT_CREATE)
- close(self->impldata);
-#endif
-
- mowgli_free(self);
-}
-
-int mowgli_ioevent_get(mowgli_ioevent_handle_t *self, mowgli_ioevent_t *buf, size_t bufsize, unsigned int delay)
-{
-#if defined HAVE_EPOLL_CTL || defined HAVE_PORT_CREATE
- int ret, iter;
-#else
- int ret = -1;
-#endif
-
-#ifdef HAVE_EPOLL_CTL
- struct epoll_event events[bufsize];
-
- ret = epoll_wait(self->impldata, events, bufsize, delay);
-
- if (ret == -1)
- return ret;
-
- for (iter = 0; iter < ret; iter++)
- {
- buf[iter].ev_status = 0;
- buf[iter].ev_object = events[iter].data.fd;
- buf[iter].ev_opaque = events[iter].data.ptr;
- buf[iter].ev_source = MOWGLI_SOURCE_FD;
-
- if (events[iter].events & EPOLLIN)
- buf[iter].ev_status |= MOWGLI_POLLRDNORM;
-
- if (events[iter].events & EPOLLOUT)
- buf[iter].ev_status |= MOWGLI_POLLWRNORM;
-
- if (events[iter].events & EPOLLHUP)
- buf[iter].ev_status = MOWGLI_POLLHUP;
-
- if (events[iter].events & EPOLLERR)
- buf[iter].ev_status = MOWGLI_POLLERR;
- }
-#endif
-
-#ifdef HAVE_PORT_CREATE
- port_event_t events[bufsize];
- unsigned int nget = 1;
- struct timespec poll_time;
-
- poll_time.tv_sec = delay / 1000;
- poll_time.tv_nsec = (delay % 1000) * 1000000;
-
- ret = port_getn(self->impldata, events, bufsize, &nget, &poll_time);
-
- if (ret == -1)
- return ret;
-
- for (iter = 0; iter < nget; iter++)
- {
- buf[iter].ev_status = 0;
- buf[iter].ev_object = events[iter].portev_object;
- buf[iter].ev_opaque = events[iter].portev_user;
- buf[iter].ev_source = MOWGLI_SOURCE_FD;
-
- if (events[iter].portev_events & POLLRDNORM)
- buf[iter].ev_status |= MOWGLI_POLLRDNORM;
-
- if (events[iter].portev_events & POLLWRNORM)
- buf[iter].ev_status |= MOWGLI_POLLWRNORM;
-
- if (events[iter].portev_events & POLLHUP)
- buf[iter].ev_status = MOWGLI_POLLHUP;
-
- if (events[iter].portev_events & POLLERR)
- buf[iter].ev_status = MOWGLI_POLLERR;
- }
-
- ret = nget;
-#endif
-
- return ret;
-}
-
-void mowgli_ioevent_associate(mowgli_ioevent_handle_t *self, mowgli_ioevent_source_t source, int object, unsigned int flags, void *opaque)
-{
-#if defined HAVE_EPOLL_CTL || defined HAVE_PORT_CREATE
- int events = 0;
-#endif
-
- if (source != MOWGLI_SOURCE_FD)
- return;
-
-#ifdef HAVE_EPOLL_CTL
- {
- struct epoll_event ep_event = {};
- events = EPOLLONESHOT;
-
- if (flags & MOWGLI_POLLRDNORM)
- events |= EPOLLIN;
-
- if (flags & MOWGLI_POLLWRNORM)
- events |= EPOLLOUT;
-
- ep_event.events = events;
- ep_event.data.ptr = opaque;
-
- epoll_ctl(self->impldata, EPOLL_CTL_ADD, object, &ep_event);
- }
-#endif
-
-#ifdef HAVE_PORT_CREATE
-#ifdef POLLRDNORM
- if (flags & MOWGLI_POLLRDNORM)
- events |= POLLRDNORM;
-#endif
-
-#ifdef EPOLLWRNORM
- if (flags & MOWGLI_POLLWRNORM)
- events |= EPOLLWRNORM;
-#endif
-
- port_associate(self->impldata, PORT_SOURCE_FD, object, events, opaque);
-#endif
-}
-
-void mowgli_ioevent_dissociate(mowgli_ioevent_handle_t *self, mowgli_ioevent_source_t source, int object)
-{
- if (source != MOWGLI_SOURCE_FD)
- return;
-
-#ifdef HAVE_EPOLL_CTL
- {
- struct epoll_event ep_event = {};
-
- epoll_ctl(self->impldata, EPOLL_CTL_DEL, object, &ep_event);
- }
-#endif
-
-#ifdef HAVE_PORT_CREATE
- port_dissociate(self->impldata, PORT_SOURCE_FD, object);
-#endif
-}
-
diff --git a/src/libmowgli/mowgli_ioevent.h b/src/libmowgli/mowgli_ioevent.h
deleted file mode 100644
index 17007b6..0000000
--- a/src/libmowgli/mowgli_ioevent.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_ioevent.h: Portable I/O event layer.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_IOEVENT_H__
-#define __MOWGLI_IOEVENT_H__
-
-typedef struct {
- int impldata; /* implementation-specific data: this is almost always an FD */
-} mowgli_ioevent_handle_t;
-
-typedef enum {
- MOWGLI_SOURCE_FD = 1
-} mowgli_ioevent_source_t;
-
-typedef struct {
- mowgli_ioevent_source_t ev_source;
- unsigned int ev_status;
- int ev_object;
- void *ev_opaque;
-} mowgli_ioevent_t;
-
-#define MOWGLI_POLLRDNORM 0x01
-#define MOWGLI_POLLWRNORM 0x02
-#define MOWGLI_POLLHUP 0x04
-#define MOWGLI_POLLERR 0x08
-
-extern mowgli_ioevent_handle_t *mowgli_ioevent_create(void) MOWGLI_DEPRECATED;
-extern void mowgli_ioevent_destroy(mowgli_ioevent_handle_t *self) MOWGLI_DEPRECATED;
-
-extern int mowgli_ioevent_get(mowgli_ioevent_handle_t *self, mowgli_ioevent_t *buf, size_t bufsize, unsigned int delay) MOWGLI_DEPRECATED;
-
-extern void mowgli_ioevent_associate(mowgli_ioevent_handle_t *self, mowgli_ioevent_source_t source, int object, unsigned int flags, void *opaque) MOWGLI_DEPRECATED;
-extern void mowgli_ioevent_dissociate(mowgli_ioevent_handle_t *self, mowgli_ioevent_source_t source, int object) MOWGLI_DEPRECATED;
-
-#endif
diff --git a/src/libmowgli/mowgli_iterator.h b/src/libmowgli/mowgli_iterator.h
deleted file mode 100644
index f99412b..0000000
--- a/src/libmowgli/mowgli_iterator.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_iterator.h: Iterators.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_ITERATOR_H__
-#define __MOWGLI_ITERATOR_H__
-
-typedef struct _mowgli_iterator {
- struct _mowgli_iterator *prev, *next;
- void *data;
-} mowgli_iterator_t;
-
-/* The following are macros which can be used with iterators. */
-#define MOWGLI_ITER_FOREACH(n, head) for (n = (head); n; n = n->next)
-#define MOWGLI_ITER_FOREACH_NEXT(n, head) for (n = (head); n->next; n = n->next)
-#define MOWGLI_ITER_FOREACH_PREV(n, tail) for (n = (tail); n; n = n->prev)
-#define MOWGLI_ITER_FOREACH_SAFE(n, tn, head) for (n = (head), tn = n ? n->next : NULL; n != NULL; n = tn, tn = n ? n->next : NULL)
-
-#endif
diff --git a/src/libmowgli/mowgli_logger.c b/src/libmowgli/mowgli_logger.c
deleted file mode 100644
index e3c13ea..0000000
--- a/src/libmowgli/mowgli_logger.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_logger.c: Event and debugging message logging.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-void mowgli_log_cb_default(const char *buf)
-{
- fprintf(stderr, "%s\n", buf);
-}
-
-static mowgli_log_cb_t mowgli_log_cb = mowgli_log_cb_default;
-
-void mowgli_log_real(const char *file, int line, const char *func, const char *fmt, ...)
-{
- char buf[65535];
- char snbuf[65535];
- va_list va;
-
- va_start(va, fmt);
- vsnprintf(snbuf, 65535, fmt, va);
- va_end(va);
-
- snprintf(buf, 65535, "(%s:%d) [%s]: %s", file, line, func, snbuf);
-
- mowgli_log_cb(buf);
-}
-
-void mowgli_log_set_cb(mowgli_log_cb_t callback)
-{
- return_if_fail(callback != NULL);
-
- mowgli_log_cb = callback;
-}
-
-void mowgli_soft_assert_log(const char *asrt, const char *file, int line, const char *function)
-{
- char buf[65535];
-
- snprintf(buf, sizeof buf, "(%s:%d) [%s]: critical: Assertion '%s' failed.", file, line, function, asrt);
-
- mowgli_log_cb(buf);
-}
diff --git a/src/libmowgli/mowgli_mempool.c b/src/libmowgli/mowgli_mempool.c
deleted file mode 100644
index c41436c..0000000
--- a/src/libmowgli/mowgli_mempool.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_mempool.c: Memory pooling.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-/* visibility of this object is not available to the outside */
-struct mowgli_mempool_t_ {
- mowgli_list_t stack;
- mowgli_destructor_t destructor;
-#ifdef NOTYET
- mowgli_mutex_t *mutex;
-#endif
-};
-
-typedef struct {
- void *addr;
- int refcount;
- mowgli_node_t node;
-} mowgli_mempool_elem_t;
-
-mowgli_mempool_t *mowgli_mempool_with_custom_destructor(mowgli_destructor_t destructor)
-{
- mowgli_mempool_t *pool;
-
- pool = mowgli_alloc(sizeof(mowgli_mempool_t));
- pool->destructor = destructor;
-#ifdef NOTYET
- pool->mutex = mowgli_mutex_create();
-#endif
- return pool;
-}
-
-mowgli_mempool_t *mowgli_mempool_create(void)
-{
- return mowgli_mempool_with_custom_destructor(mowgli_free);
-}
-
-void *mowgli_mempool_add(mowgli_mempool_t * pool, void * ptr)
-{
- mowgli_mempool_elem_t *e = mowgli_alloc(sizeof(mowgli_mempool_elem_t));
-
- e->addr = ptr;
- e->refcount = 1;
-
-#ifdef NOTYET
- mowgli_mutex_lock(pool->mutex);
-#endif
- mowgli_node_add(e, &e->node, &pool->stack);
-#ifdef NOTYET
- mowgli_mutex_unlock(pool->mutex);
-#endif
- return ptr;
-}
-
-void *
-mowgli_mempool_allocate(mowgli_mempool_t * pool, size_t sz)
-{
- void * addr;
-
-#ifdef NOTYET
- mowgli_mutex_lock(pool->mutex);
-#endif
- addr = mowgli_alloc(sz);
- mowgli_node_add(addr, mowgli_node_create(), &pool->stack);
-#ifdef NOTYET
- mowgli_mutex_unlock(pool->mutex);
-#endif
- return addr;
-}
-
-void
-mowgli_mempool_sustain(mowgli_mempool_t * pool, void * addr)
-{
- mowgli_node_t *n, *tn;
- mowgli_mempool_elem_t *e;
-
-#ifdef NOTYET
- mowgli_mutex_lock(pool->mutex);
-#endif
-
- MOWGLI_LIST_FOREACH_SAFE(n, tn, pool->stack.head)
- {
- e = (mowgli_mempool_elem_t *) n->data;
-
- if (e->addr == addr)
- ++e->refcount;
- }
-
-#ifdef NOTYET
- mowgli_mutex_unlock(pool->mutex);
-#endif
-}
-
-void
-mowgli_mempool_release(mowgli_mempool_t * pool, void * addr)
-{
- mowgli_node_t *n, *tn;
- mowgli_mempool_elem_t *e;
-
-#ifdef NOTYET
- mowgli_mutex_lock(pool->mutex);
-#endif
-
- MOWGLI_LIST_FOREACH_SAFE(n, tn, pool->stack.head)
- {
- e = (mowgli_mempool_elem_t *) n->data;
-
- if (e->addr == addr && --e->refcount == 0)
- {
- mowgli_node_delete(n, &pool->stack);
- pool->destructor(addr);
- mowgli_free(e);
- }
- }
-
-#ifdef NOTYET
- mowgli_mutex_unlock(pool->mutex);
-#endif
-}
-
-static void
-mowgli_mempool_cleanup_nolock(mowgli_mempool_t * pool)
-{
- mowgli_node_t *n, *tn;
-
- MOWGLI_LIST_FOREACH_SAFE(n, tn, pool->stack.head)
- {
- mowgli_mempool_elem_t *e = (mowgli_mempool_elem_t *) n->data;
-
- /* don't care about refcounting here. we're killing the entire pool. */
- mowgli_log("mowgli_mempool_t<%p> element at %p was not released until cleanup (refcount: %d)", pool, e->addr, e->refcount);
- pool->destructor(e->addr);
- mowgli_free(e);
-
- mowgli_node_delete(n, &pool->stack);
- }
-}
-
-void
-mowgli_mempool_cleanup(mowgli_mempool_t * pool)
-{
-#ifdef NOTYET
- mowgli_mutex_lock(pool->mutex);
-#endif
- mowgli_mempool_cleanup_nolock(pool);
-#ifdef NOTYET
- mowgli_mutex_unlock(pool->mutex);
-#endif
-}
-
-void
-mowgli_mempool_destroy(mowgli_mempool_t * pool)
-{
-#ifdef NOTYET
- mowgli_mutex_lock(pool->mutex);
-#endif
-
- mowgli_mempool_cleanup_nolock(pool);
-
-#ifdef NOTYET
- mowgli_mutex_unlock(pool->mutex);
-
- mowgli_mutex_free(pool->mutex);
-#endif
-
- mowgli_free(pool);
-}
-
-char *
-mowgli_mempool_strdup(mowgli_mempool_t * pool, char * src)
-{
- char *out;
- size_t sz = strlen(src) + 1;
-
- out = mowgli_mempool_allocate(pool, sz);
- mowgli_strlcpy(out, src, sz);
-
- return out;
-}
diff --git a/src/libmowgli/mowgli_mempool.h b/src/libmowgli/mowgli_mempool.h
deleted file mode 100644
index 14d5911..0000000
--- a/src/libmowgli/mowgli_mempool.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_mempool.h: Memory pooling.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_MEMPOOL_H__
-#define __MOWGLI_MEMPOOL_H__
-
-typedef struct mowgli_mempool_t_ mowgli_mempool_t;
-
-mowgli_mempool_t * mowgli_mempool_create(void);
-mowgli_mempool_t * mowgli_mempool_with_custom_destructor(mowgli_destructor_t destructor);
-
-void * mowgli_mempool_add(mowgli_mempool_t * pool, void * ptr);
-void * mowgli_mempool_allocate(mowgli_mempool_t * pool, size_t sz);
-void mowgli_mempool_release(mowgli_mempool_t * pool, void * addr);
-
-void mowgli_mempool_cleanup(mowgli_mempool_t * pool);
-
-void mowgli_mempool_destroy(mowgli_mempool_t * pool);
-
-char * mowgli_mempool_strdup(mowgli_mempool_t * pool, char * src);
-
-#define mowgli_mempool_alloc_object(pool, obj) \
- mowgli_mempool_allocate(pool, sizeof(obj))
-
-#endif
diff --git a/src/libmowgli/mowgli_spinlock.c b/src/libmowgli/mowgli_spinlock.c
deleted file mode 100644
index 47c1166..0000000
--- a/src/libmowgli/mowgli_spinlock.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_spinlock.c: Spinlocks.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-mowgli_spinlock_t *mowgli_spinlock_create(void)
-{
- mowgli_spinlock_t *out = mowgli_alloc(sizeof(mowgli_spinlock_t));
-
- return out;
-}
-
-void mowgli_spinlock_lock(mowgli_spinlock_t *self, void *r, void *w)
-{
- return_if_fail(self != NULL);
-
- if (r)
- mowgli_spinlock_wait(self, MOWGLI_SPINLOCK_READ);
-
- if (w)
- mowgli_spinlock_wait(self, MOWGLI_SPINLOCK_WRITE);
-
- if (r && (self->read_owner == NULL || self->read_owner == r))
- self->read_owner = r;
-
- if (w && (self->write_owner == NULL || self->write_owner == w))
- self->write_owner = w;
-}
-
-void mowgli_spinlock_unlock(mowgli_spinlock_t *self, void *r, void *w)
-{
- return_if_fail(self != NULL);
-
- if (r && self->read_owner == r)
- self->read_owner = NULL;
-
- if (w && self->write_owner == w)
- self->write_owner = NULL;
-}
-
-void mowgli_spinlock_wait(mowgli_spinlock_t *self, mowgli_spinlock_lock_param_t param)
-{
- return_if_fail(self != NULL)
-
- if (param == MOWGLI_SPINLOCK_READ)
- while (self->read_owner != NULL)
- usleep(1000); /* XXX: we'll want a more threadsafe function eventually. */
-
- if (param == MOWGLI_SPINLOCK_WRITE)
- while (self->write_owner != NULL)
- usleep(1000);
-
- if (param == MOWGLI_SPINLOCK_READWRITE)
- while (self->write_owner != NULL || self->read_owner != NULL)
- usleep(1000);
-}
-
-void mowgli_spinlock_timed_wait(mowgli_spinlock_t *self, mowgli_spinlock_lock_param_t param, struct timeval *tv)
-{
- struct timeval iter = {0};
-
- return_if_fail(self != NULL)
- return_if_fail(tv != NULL)
-
- if (param == MOWGLI_SPINLOCK_READ)
- while (self->read_owner != NULL && iter.tv_sec < tv->tv_sec && iter.tv_usec < tv->tv_usec)
- {
- gettimeofday(&iter, NULL);
- usleep(1000); /* XXX: we'll want a more threadsafe function eventually. */
- }
-
- if (param == MOWGLI_SPINLOCK_WRITE)
- while (self->write_owner != NULL && iter.tv_sec < tv->tv_sec && iter.tv_usec < tv->tv_usec)
- {
- gettimeofday(&iter, NULL);
- usleep(1000);
- }
-
- if (param == MOWGLI_SPINLOCK_READWRITE)
- while ((self->write_owner != NULL || self->read_owner != NULL) && iter.tv_sec < tv->tv_sec && iter.tv_usec < tv->tv_usec)
- {
- gettimeofday(&iter, NULL);
- usleep(1000);
- }
-}
diff --git a/src/libmowgli/mowgli_spinlock.h b/src/libmowgli/mowgli_spinlock.h
deleted file mode 100644
index 6742e13..0000000
--- a/src/libmowgli/mowgli_spinlock.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_spinlock.h: Spinlocks.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_SPINLOCK_H__
-#define __MOWGLI_SPINLOCK_H__
-
-typedef struct {
- void *read_owner; /* opaque data representing a spinlock's owner */
- void *write_owner; /* opaque data representing a spinlock's owner */
-} mowgli_spinlock_t;
-
-typedef enum {
- MOWGLI_SPINLOCK_READ,
- MOWGLI_SPINLOCK_WRITE,
- MOWGLI_SPINLOCK_READWRITE
-} mowgli_spinlock_lock_param_t;
-
-extern mowgli_spinlock_t *mowgli_spinlock_create(void);
-extern void mowgli_spinlock_lock(mowgli_spinlock_t *self, void *r, void *w);
-extern void mowgli_spinlock_unlock(mowgli_spinlock_t *self, void *r, void *w);
-extern void mowgli_spinlock_wait(mowgli_spinlock_t *self, mowgli_spinlock_lock_param_t param);
-extern void mowgli_spinlock_timed_wait(mowgli_spinlock_t *self, mowgli_spinlock_lock_param_t param, struct timeval *tv);
-
-#endif
diff --git a/src/libmowgli/mowgli_stdinc.h b/src/libmowgli/mowgli_stdinc.h
deleted file mode 100644
index ae64a22..0000000
--- a/src/libmowgli/mowgli_stdinc.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_stdinc.h: Pulls in the base system includes for libmowgli.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_STDINC_H__
-#define __MOWGLI_STDINC_H__
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#include <time.h>
-#include <errno.h>
-#include <setjmp.h>
-#include <sys/stat.h>
-#include <ctype.h>
-
-/* socket stuff */
-#ifndef _WIN32
-# include <netdb.h>
-# include <netinet/in.h>
-# include <unistd.h>
-# include <grp.h>
-# include <sys/time.h>
-# include <sys/wait.h>
-# include <sys/resource.h>
-# include <sys/socket.h>
-# include <fcntl.h>
-# include <arpa/inet.h>
-# include <libgen.h>
-# include <dirent.h>
-#else
-# include <windows.h>
-# include <winsock.h>
-# include <sys/timeb.h>
-# include <direct.h>
-# include <io.h>
-# include <fcntl.h>
-#endif
-
-#include <sys/types.h>
-
-#ifdef _MSC_VER
-# pragma warning (disable: 4996)
-#endif
-
-#ifdef FALSE
-# undef FALSE
-#endif
-
-#ifdef TRUE
-# undef TRUE
-#endif
-
-typedef enum { FALSE, TRUE } mowgli_boolean_t;
-
-/* Macros for min/max. */
-#ifndef MIN
-# define MIN(a,b) (((a)<(b))?(a):(b))
-#endif
-
-#ifndef MAX
-# define MAX(a,b) (((a)>(b))?(a):(b))
-#endif
-
-#if defined(__GNUC__) || defined(_INTEL_COMPILER)
-#define MOWGLI_DEPRECATED \
- __attribute__((deprecated))
-#elif defined(_MSC_VER)
-#define MOWGLI_DEPRECATED \
- __declspec(deprecated)
-#else
-#define MOWGLI_DEPRECATED
-#endif
-
-#endif
diff --git a/src/libmowgli/mowgli_string.c b/src/libmowgli/mowgli_string.c
deleted file mode 100644
index 9c9d5c2..0000000
--- a/src/libmowgli/mowgli_string.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_string.c: Immutable string buffers with cheap manipulation.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- * Copyright (c) 2007 Pippijn van Steenhoven <pippijn -at- one09.net>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mowgli.h"
-
-mowgli_string_t *mowgli_string_create(void)
-{
- mowgli_string_t *self = mowgli_alloc(sizeof(mowgli_string_t));
-
- self->size = 64;
- self->pos = 0;
- self->str = mowgli_alloc(self->size);
-
- self->append = &mowgli_string_append;
- self->append_char = &mowgli_string_append_char;
- self->reset = &mowgli_string_reset;
- self->destroy = &mowgli_string_destroy;
-
- return self;
-}
-
-void mowgli_string_reset(mowgli_string_t *self)
-{
- return_if_fail(self != NULL);
-
- self->str[0] = self->pos = 0;
-}
-
-void mowgli_string_destroy(mowgli_string_t *self)
-{
- return_if_fail(self != NULL);
-
- mowgli_free(self->str);
- mowgli_free(self);
-}
-
-void mowgli_string_append(mowgli_string_t *self, const char *src, size_t n)
-{
- if (self->size - self->pos <= n)
- {
- char *new;
-
- self->size = MAX(self->size * 2, self->pos + n + 8);
- new = realloc(self->str, self->size);
- self->str = new;
- }
-
- memcpy(self->str + self->pos, src, n);
- self->pos += n;
- self->str[self->pos] = 0;
-}
-
-void mowgli_string_append_char(mowgli_string_t *self, const char c)
-{
- if (self->size - self->pos <= 1)
- {
- char *new;
-
- self->size = MAX(self->size * 2, self->pos + 9);
- new = realloc(self->str, self->size);
- self->str = new;
- }
-
- self->str[self->pos++] = c;
- self->str[self->pos] = 0;
-}
-
-/* These functions are taken from Linux. */
-size_t mowgli_strlcat(char *dest, const char *src, size_t count)
-{
- size_t dsize = strlen(dest);
- size_t len = strlen(src);
- size_t res = dsize + len;
-
- dest += dsize;
- count -= dsize;
-
- if (len >= count)
- len = count - 1;
-
- memcpy(dest, src, len);
-
- dest[len] = 0;
-
- return res;
-}
-
-size_t mowgli_strlcpy(char *dest, const char *src, size_t size)
-{
- size_t ret = strlen(src);
-
- if (size)
- {
- size_t len = (ret >= size) ? size - 1 : ret;
- memcpy(dest, src, len);
- dest[len] = '\0';
- }
-
- return ret;
-}
diff --git a/src/libmowgli/mowgli_string.h b/src/libmowgli/mowgli_string.h
deleted file mode 100644
index b815451..0000000
--- a/src/libmowgli/mowgli_string.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_string.h: Immutable string buffers with cheap manipulation.
- *
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
- * Copyright (c) 2007 Pippijn van Steenhoven <pippijn -at- one09.net>
- *
- * 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 is present in all copies.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MOWGLI_STRING_H__
-#define __MOWGLI_STRING_H__
-
-typedef struct mowgli_string_ {
- char *str;
- size_t pos;
- size_t size;
-
- void (*reset)(struct mowgli_string_ *self);
- void (*append)(struct mowgli_string_ *self, const char *src, size_t n);
- void (*append_char)(struct mowgli_string_ *self, const char c);
- void (*destroy)(struct mowgli_string_ *self);
-} mowgli_string_t;
-
-extern mowgli_string_t *mowgli_string_create(void);
-extern void mowgli_string_reset(mowgli_string_t *self);
-extern void mowgli_string_destroy(mowgli_string_t *self);
-extern void mowgli_string_append(mowgli_string_t *self, const char *src, size_t n);
-extern void mowgli_string_append_char(mowgli_string_t *self, const char c);
-
-extern size_t mowgli_strlcat(char *dest, const char *src, size_t count);
-extern size_t mowgli_strlcpy(char *dest, const char *src, size_t count);
-
-#endif
diff --git a/src/libmowgli/object/Makefile b/src/libmowgli/object/Makefile
new file mode 100644
index 0000000..1ac3ff3
--- /dev/null
+++ b/src/libmowgli/object/Makefile
@@ -0,0 +1,21 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_OBJECT}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_OBJECT}
+
+SRCS = object.c \
+ class.c \
+ message.c \
+ metadata.c
+
+INCLUDES = object.h \
+ class.h \
+ message.h \
+ metadata.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/object
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/mowgli_object_class.c b/src/libmowgli/object/class.c
index 8dc2b83..9bddf79 100644
--- a/src/libmowgli/mowgli_object_class.c
+++ b/src/libmowgli/object/class.c
@@ -1,7 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object_class.c: Object class and type management,
- * cast checking.
+ * class.c: Object class and type management, cast checking.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -48,7 +47,7 @@ void mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mo
mowgli_throw_exception_fatal(mowgli.object_class.duplicate_object_class_exception);
/* initialize object_class::name */
- klass->name = strdup(name);
+ klass->name = mowgli_strdup(name);
/* initialize object_class::derivitives */
klass->derivitives.head = NULL;
diff --git a/src/libmowgli/mowgli_object_class.h b/src/libmowgli/object/class.h
index 03cfd4b..9612aa4 100644
--- a/src/libmowgli/mowgli_object_class.h
+++ b/src/libmowgli/object/class.h
@@ -1,7 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object_class.h: Object class and type management,
- * cast checking.
+ * class.h: Object class and type management, cast checking.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_object_messaging.c b/src/libmowgli/object/message.c
index b61a16d..e4328c8 100644
--- a/src/libmowgli/mowgli_object_messaging.c
+++ b/src/libmowgli/object/message.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object_messaging.c: Object event notification and message passing.
+ * messaging.c: Object event notification and message passing.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_object_messaging.h b/src/libmowgli/object/message.h
index 8fc1f95..4a49d00 100644
--- a/src/libmowgli/mowgli_object_messaging.h
+++ b/src/libmowgli/object/message.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object_messaging.h: Object event notification and message passing.
+ * message.h: Object event notification and message passing.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_object_metadata.c b/src/libmowgli/object/metadata.c
index 9cfece5..742e0dc 100644
--- a/src/libmowgli/mowgli_object_metadata.c
+++ b/src/libmowgli/object/metadata.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object_metadata.c: Object metadata.
+ * metadata.c: Object metadata.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -49,7 +49,7 @@ void mowgli_object_metadata_associate(mowgli_object_t *self, const char *key, vo
}
e = mowgli_alloc(sizeof(mowgli_object_metadata_entry_t));
- e->name = strdup(key);
+ e->name = mowgli_strdup(key);
e->data = value;
mowgli_node_add(e, mowgli_node_create(), &self->metadata);
diff --git a/src/libmowgli/mowgli_object_metadata.h b/src/libmowgli/object/metadata.h
index 5f93b8e..0cdda69 100644
--- a/src/libmowgli/mowgli_object_metadata.h
+++ b/src/libmowgli/object/metadata.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object_metadata.h: Object metadata.
+ * metadata.h: Object metadata.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/mowgli_object.c b/src/libmowgli/object/object.c
index 731f1c5..7b24ea7 100644
--- a/src/libmowgli/mowgli_object.c
+++ b/src/libmowgli/object/object.c
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object.c: Object management.
+ * object.c: Object management.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
@@ -45,7 +45,7 @@ void mowgli_object_init(mowgli_object_t *obj, const char *name, mowgli_object_cl
return_if_fail(obj != NULL);
if (name != NULL)
- obj->name = strdup(name);
+ obj->name = mowgli_strdup(name);
if (klass != NULL)
obj->klass = klass;
diff --git a/src/libmowgli/mowgli_object.h b/src/libmowgli/object/object.h
index 5bcee2a..0f13ce1 100644
--- a/src/libmowgli/mowgli_object.h
+++ b/src/libmowgli/object/object.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_object.h: Object management.
+ * object.h: Object management.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
*
diff --git a/src/libmowgli/platform/Makefile b/src/libmowgli/platform/Makefile
new file mode 100644
index 0000000..6b6d7b9
--- /dev/null
+++ b/src/libmowgli/platform/Makefile
@@ -0,0 +1,9 @@
+SUBDIRS = win32
+
+INCLUDES = constructor.h machine.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/platform
+
+include ../../../extra.mk
diff --git a/src/libmowgli/platform/autoconf.h.in b/src/libmowgli/platform/autoconf.h.in
new file mode 100644
index 0000000..fb77f69
--- /dev/null
+++ b/src/libmowgli/platform/autoconf.h.in
@@ -0,0 +1,105 @@
+/* src/libmowgli/platform/autoconf.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the `dispatch_block' function. */
+#undef HAVE_DISPATCH_BLOCK
+
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `kqueue' function. */
+#undef HAVE_KQUEUE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mmap' function. */
+#undef HAVE_MMAP
+
+/* Define to 1 if OpenSSL is available */
+#undef HAVE_OPENSSL
+
+/* Define to 1 if you have the <poll.h> header file. */
+#undef HAVE_POLL_H
+
+/* Define to 1 if you have the `port_create' function. */
+#undef HAVE_PORT_CREATE
+
+/* Define to 1 if you have the `pstat' function. */
+#undef HAVE_PSTAT
+
+/* Define to 1 if the PS_STRINGS struct exists on your platform (likely no).
+ */
+#undef HAVE_PS_STRINGS
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Define to 1 if you have the `select' function. */
+#undef HAVE_SELECT
+
+/* Define to 1 if you have the `setproctitle' function. */
+#undef HAVE_SETPROCTITLE
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+#undef HAVE_SYS_EPOLL_H
+
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#undef HAVE_SYS_PRCTL_H
+
+/* Define to 1 if you have the <sys/pstat.h> header file. */
+#undef HAVE_SYS_PSTAT_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
diff --git a/src/libmowgli/mowgli_logger.h b/src/libmowgli/platform/constructor.h
index 730383a..8446f44 100644
--- a/src/libmowgli/mowgli_logger.h
+++ b/src/libmowgli/platform/constructor.h
@@ -1,8 +1,8 @@
/*
- * libmowgli: A collection of useful routines for programming.
- * mowgli_logger.h: Event and debugging message logging.
+ * constructor.h
+ * Code for setting up automatic initializer functions portably.
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,25 +21,34 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __MOWGLI_LOGGER_H__
-#define __MOWGLI_LOGGER_H__
+#ifndef __MOWGLI_PLATFORM_CONSTRUCTOR_H__
+#define __MOWGLI_PLATFORM_CONSTRUCTOR_H__
-typedef void (*mowgli_log_cb_t)(const char *);
+#ifdef _MSC_VER
+
+/*
+ * Automatic constructors are not yet officially supported in MSVC, however,
+ * there is a similar feature where functions in the ".CRT$XCU" section are
+ * evaluated prior to DllMain(), main() and friends.
+ *
+ * See http://blogs.msdn.com/b/vcblog/archive/2006/10/20/crt-initialization.aspx
+ * for more information.
+ */
+#define MOWGLI_BOOTSTRAP_FUNC(func) \
+ static void __cdecl func(void); \
+ __declspec(allocate(".CRT$XCU")) void (__cdecl *func##_)(void) = func; \
+ static void __cdecl func(void)
+
+#elif defined(__GNUC__) || defined(__SUNPRO_C)
+
+#define MOWGLI_BOOTSTRAP_FUNC(func) \
+ static void func(void) __attribute__((constructor)); \
+ static void func(void)
-#ifdef __GNUC__
-# define mowgli_log(...) mowgli_log_real(__FILE__, __LINE__, __PRETTY_FUNCTION__, __VA_ARGS__)
-#elif defined _MSC_VER
-# if _MSC_VER <= 1200
- static __inline void mowgli_log(char *fmt, ...) { /* TODO/UNSUPPORTED */ }
-# else
-# define mowgli_log(...) mowgli_log_real(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
-# endif
#else
-# define mowgli_log(...) mowgli_log_real(__FILE__, __LINE__, __func__, __VA_ARGS__)
-#endif
-extern void mowgli_log_real(const char *file, int line, const char *func, const char *buf, ...);
+#error MOWGLI_BOOTSTRAP_FUNC not implemented for your platform :(
-extern void mowgli_log_set_cb(mowgli_log_cb_t callback);
+#endif
#endif
diff --git a/src/libmowgli/platform/machine.h b/src/libmowgli/platform/machine.h
new file mode 100644
index 0000000..b2a2e50
--- /dev/null
+++ b/src/libmowgli/platform/machine.h
@@ -0,0 +1,334 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * machine.h: Defines to discover what machine we're on easily
+ *
+ * Copyright (c) 2012 Patrick McFarland <pmcfarland@adterrasperaspera.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+/* Machine environment specific macros, mostly sourced from this URL:
+ * http://sourceforge.net/apps/mediawiki/predef/
+ *
+ * Please note: Just because a compiler, CPU, or OS is listed in this file,
+ * that doesn't mean that it is supported by libmowgli. libmowgli requires
+ * a 32-bit or higher CPU and an OS that supports a supported mutex and
+ * thread scheme (if you intend on having functional multithreaded
+ * operation).
+ */
+
+#ifndef __MOWGLI_MACHINE_H__
+#define __MOWGLI_MACHINE_H__
+
+#if defined __clang__
+#define MOWGLI_COMPILER_CLANG
+#define MOWGLI_COMPILER clang
+#elif defined __INTEL_COMPILER || defined __ICC || defined __ICL
+#define MOWGLI_COMPILER_ICC
+#define MOWGLI_COMPILER icc
+#elif defined __CC_ARM
+#define MOWGLI_COMPILER_ARM
+#define MOWGLI_COMPILER arm
+#elif defined __xlc__ || defined __xlC__
+#define MOWGLI_COMPILER_IBM
+#define MOWGLI_COMPILER ibm
+#elif defined __SUNPRO_C || defined __SUNPRO_CC
+#define MOWGLI_COMPILER_SUN
+#define MOWGLI_COMPILER sun
+#elif defined __GNUC__
+#define MOWGLI_COMPILER_GCC
+#define MOWGLI_COMPILER gcc
+#elif defined _MSC_VER
+#define MOWGLI_COMPILER_MSVC
+#define MOWGLI_COMPILER msvc
+#else
+#define MOWGLI_COMPILER_UNKNOWN
+#define MOWGLI_COMPILER unknown
+#endif
+
+#if defined __GNUC__
+#define MOWGLI_COMPILER_GCC_COMPAT
+#endif
+
+#if defined __amd64__ || defined __amd64 || defined __x86_64__ || defined __x86_64 || defined _M_X64 || defined _M_AMD64
+#define MOWGLI_CPU_X86_64
+#define MOWGLI_CPU x86_64
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#elif defined __i386__ || defined __i386 || defined __IA32__ || defined _M_IX86 || defined __X86__ || defined _X86__ || defined __I86__
+#define MOWGLI_CPU_X86
+#define MOWGLI_CPU x86
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#elif defined __arm__ || defined __TARGET_ARCH_ARM || defined _ARM
+#if defined __thumb__ || defined __TARGET_ARCH_THUMB
+#define MOWGLI_CPU_ARM_THUMB
+#endif
+#define MOWGLI_CPU_ARM
+#define MOWGLI_CPU arm
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+// ARM can be either endian
+#elif defined __hppa__ || defined __HPPA__ || defined __hppa
+#if defined _PA_RISC2_0 || defined __HPPA20__ || defined __RISC2_0__
+#define MOWGLI_CPU_HPPA20
+#define MOWGLI_CPU hppa20
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+#else
+#define MOWGLI_CPU_HPPA10
+#define MOWGLI_CPU hppa10
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+#endif
+#define MOWGLI_CPU_ENDIAN_BIG
+#define MOWGLI_CPU_ENDIAN big
+#elif defined __ia64__ || defined __IA64__ || defined _M_IA64 || defined __ia64 || defined __itanium__
+#define MOWGLI_CPU_ITANIUM
+#define MOWGLI_CPU itanium
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+// Itanium can be either endian
+#elif defined __mips__ || defined mips || defined __mips || defined __MIPS__
+#if defined __mips64 || defined __mips64__
+#define MOWGLI_CPU_MIPS64
+#define MOWGLI_CPU mips64
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+#else
+#define MOWGLI_CPU_MIPS
+#define MOWGLI_CPU mips
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+#endif
+// MIPS can be either endian
+#elif defined __powerpc || defined __powerpc__ || defined __POWERPC__ || defined __ppc__ || defined _M_PPC
+#if defined __ppc64__ || defined __PPC64__
+#define MOWGLI_CPU_POWERPC64
+#define MOWGLI_CPU powerpc64
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+#else
+#define MOWGLI_CPU powerpc
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+#endif
+#define MOWGLI_CPU_POWERPC
+// PowerPC can be either endian
+#elif defined __sparc__ || defined __sparc
+#if defined __sparcv9 || defined __sparc64 || defined __sparc64__
+#define MOWGLI_CPU_SPARC64
+#define MOWGLI_CPU sparc64
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+#else
+#define MOWGLI_CPU_SPARC
+#define MOWGLI_CPU sparc
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+#endif
+#define MOWGLI_CPU_ENDIAN_BIG
+#define MOWGLI_CPU_ENDIAN big
+#elif defined __alpha || defined __alpha__ || defined _M_ALPHA
+#define MOWGLI_CPU_ALPHA
+#define MOWGLI_CPU alpha
+#define MOWGLI_CPU_BITS_64
+#define MOWGLI_CPU_BITS 64
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#elif defined __avr32__ || defined __AVR32__
+#define MOWGLI_CPU_AVR32
+#define MOWGLI_CPU avr
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#elif defined __sh__ || defined __SH__
+#define MOWGLI_CPU_SuperH
+#define MOWGLI_CPU superh
+#define MOWGLI_CPU_BITS_32
+#define MOWGLI_CPU_BITS 32
+// SyoerH can be either endian
+#endif
+
+#ifndef MOWGLI_CPU
+#define MOWGLI_CPU_UNKNOWN
+#define MOWGLI_CPU unknown
+#endif
+
+#ifndef MOWGLI_CPU_BITS
+#if defined _LP64 || defined __LP64
+#define MOWGLI_CPU_BITS 64
+#define MOWGLI_CPU_BITS_64
+#elif
+#define MOWGLI_CPU_BITS 32
+#define MOWGLI_CPU_BITS_32
+#endif
+#endif
+
+#if defined __linux || defined __linux__
+#define MOWGLI_OS_LINUX
+#define MOWGLI_OS linux
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#elif defined __APPLE__
+#define MOWGLI_OS_OSX
+#define MOWGLI_OS osx
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#define MOWGLI_OS_BSD_TYPE
+
+#ifdef MOWGLI_CPU_POWERPC
+#define MOWGLI_CPU_ENDIAN_BIG
+#define MOWGLI_CPU_ENDIAN big
+#endif
+#elif defined __WINDOWS__ || defined _WIN32 || defined __WIN32__ || defined __TOS_WIN__
+#if defined _WIN64
+#define MOWGLI_OS_WIN64
+#define MOWGLI_OS win64
+#else
+#define MOWGLI_OS_WIN32
+#define MOWGLI_OS win32
+#endif
+#define MOWGLI_OS_WIN
+#define MOWGLI_OS_THREADS_WIN
+#define MOWGLI_OS_THREADS win
+#define MOWGLI_OS_MUTEX_WIN
+#define MOWGLI_OS_MUTEX win
+
+#if defined __CYGWIN__
+#define MOWGLI_OS_WIN_CYGWIN
+#elif defined __MINGW32__
+#define MOWGLI_OS_WIN_MINGW
+#endif
+
+#if defined MOWGLI_CPU_POWERPC || defined MOWGLI_CPU_MIPS || defined MOWGLI_CPU_ITANIUM
+#define MOWGLI_ENDIAN_CPU_LITTLE
+#endif
+#elif defined __NetBSD__ || defined __OpenBSD__ || defined __FreeBSD__ || defined __bsdi__ || defined __DragonFly__ || defined BSD || defined _SYSTYPE_BSD
+#define MOWGLI_OS_BSD
+#define MOWGLI_OS bsd
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#define MOWGLI_OS_BSD_TYPE
+#elif defined __GNU__
+#define MOWGLI_OS_HURD
+#define MOWGLI_OS hurd
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#elif defined sco || defined __sco
+#define MOWGLI_OS_SCO
+#define MOWGLI_OS sco
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#define MOWGLI_OS_UNIX_TYPE
+#elif defined sun || defined __sun
+#define MOWGLI_OS_SOLARIS
+#define MOWGLI_OS solaris
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#define MOWGLI_OS_UNIX_TYPE
+#if defined MOWGLI_CPU_POWERPC
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#endif
+#elif defined _hpux || defined hpux || defined __hpux
+#define MOWGLI_OS_HPUX
+#define MOWGLI_OS hpux
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#define MOWGLI_OS_UNIX_TYPE
+#if defined MOWGLI_CPU_ITANIUM
+#define MOWGLI_CPU_ENDIAN_BIG
+#define MOWGLI_CPU_ENDIAN big
+#endif
+#elif defined __QNX__ || defined __QNXNTO__
+#define MOWGLI_OS_QNX
+#define MOWGLI_OS qnx
+#define MOWGLI_OS_THREADS_QNX
+#define MOWGLI_OS_THREADS qnx
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#elif defined __vms || defined __VMS
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#if defined MOWGLI_CPU_ITANIUM
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#endif
+#endif
+
+#ifndef MOWGLI_OS
+#if defined __unix__ || __unix || unix
+#define MOWGLI_OS_UNIX
+#define MOWGLI_OS unix
+#define MOWGLI_OS_THREADS_POSIX
+#define MOWGLI_OS_THREADS posix
+#define MOWGLI_OS_MUTEX_POSIX
+#define MOWGLI_OS_MUTEX posix
+#define MOWGLI_OS_UNIX_TYPE
+#endif
+#define MOWGLI_OS_UNKNOWN
+#define MOWGLI_OS unknown
+#warning OS unsupported/unknown
+#endif
+
+#ifndef MOWGLI_OS_THREADS
+#define MOWGLI_OS_THREADS_NULL
+#define MOWGLI_OS_THREADS null
+#endif
+
+#ifndef MOWGLI_OS_MUTEX
+#define MOWGLI_OS_MUTEX_NULL
+#define MOWGLI_OS_MUTEX null
+#endif
+
+#ifndef MOWGLI_CPU_ENDIAN
+#if defined __BIG_ENDIAN__ || defined __ARMEB__ || defined __THUMBEB__ || defined _MIPSEB || defined __MIPSEB || defined __MIPSEB__ || __BYTE_ORDER == __BIG_ENDIAN
+#define MOWGLI_CPU_ENDIAN_BIG
+#define MOWGLI_CPU_ENDIAN big
+#elif defined __LITTLE_ENDIAN__ || defined __ARMEL__ || defined __THUMBEL__ || defined _MIPSEL || defined __MIPSEL || defined __MIPSEL__ || __BYTE_ORDER == __LITTLE_ENDIAN
+#define MOWGLI_CPU_ENDIAN_LITTLE
+#define MOWGLI_CPU_ENDIAN little
+#else
+#warning CPU endianness unknown, some functions of libmowgli will not work
+#endif
+#endif
+
+#endif
diff --git a/src/libmowgli/platform/win32/Makefile b/src/libmowgli/platform/win32/Makefile
new file mode 100644
index 0000000..653bf2d
--- /dev/null
+++ b/src/libmowgli/platform/win32/Makefile
@@ -0,0 +1,15 @@
+include ../../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_PLATFORM_WIN32}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_PLATFORM_WIN32}
+
+SRCS = fork.c gettimeofday.c inet.c pipe.c socketpair.c setenv.c
+
+INCLUDES = win32_stdinc.h
+
+include ../../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/platform/win32
+
+CPPFLAGS += -I. -I.. -I../.. -I../../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/platform/win32/fork.c b/src/libmowgli/platform/win32/fork.c
new file mode 100644
index 0000000..c644122
--- /dev/null
+++ b/src/libmowgli/platform/win32/fork.c
@@ -0,0 +1,166 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * fork.c: Fastest possible NT fork() implementation
+ *
+ * Copyright (c) 2012 TortoiseLabs, LLC.
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * References:
+ * - undocumented.ntinternals.net
+ * - http://www.cs.miami.edu/~burt/journal/NT/processinit.html
+ */
+
+#include "mowgli.h"
+
+#ifdef NOTYET
+
+#ifdef _WIN32
+
+#ifndef _WIN32_WINNT
+
+int fork(void)
+{
+#warning fork is not possible on your platform in any sane way, sorry :(
+ return -ENOSYS;
+}
+
+#else
+
+extern NTSTATUS NTAPI CsrCallClientServer(void *message, void *userdata, uint32_t opcode, uint32_t size);
+
+/*
+ * Definition of a message sent to an NT port on the CSRSS server.
+ *
+ * Not sure what dummy1/dummy2 do, but they're junk as far as I can see.
+ */
+struct csrss_message {
+ uint32_t dummy1;
+ uint32_t opcode;
+ uint32_t status;
+ uint32_t dummy2;
+};
+
+static inline void
+inherit_handles(void)
+{
+ uint32_t n = 0x1000;
+ uint32_t *p = mowgli_alloc_array(sizeof(uint32_t), n);
+ uint32_t pid, i;
+ SYSTEM_HANDLE_INFORMATION *info;
+
+ while (ZwQuerySystemInformation(SystemHandleInformation, p, n * sizeof(*p), 0) == STATUS_INFO_LENGTH_MISMATCH)
+ {
+ n *= 2;
+
+ mowgli_free(p);
+ p = mowgli_alloc_array(sizeof(uint32_t), n);
+ }
+
+ info = (SYSTEM_HANDLE_INFORMATION *) (p + 1);
+ pid = GetCurrentProcessId();
+
+ for (i = 0; i < *p; i++)
+ {
+ if (info[i].ProcessId == pid)
+ SetHandleInformation((HANDLE) h[i].Handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
+ }
+
+ mowgli_free(p);
+}
+
+static inline void
+request_csrss_session(HANDLE proc_handle, HANDLE thread_handle, uint32_t pid, uint32_t tid)
+{
+ struct {
+ PORT_MESSAGE port_message;
+ struct csrss_message csrss_message;
+ PROCESS_INFORMATION process_information;
+ CLIENT_ID debugger;
+ uint32_t flags;
+ uint32_t vdminfo[2];
+ } csrmsg = {{0}, {0}, {proc_handle, thread_handle, pid, tid}, {0}, 0, {0}};
+
+ CsrCallClientServer(&csrmsg, NULL, 0x10000, sizeof csrmsg);
+}
+
+int child(void)
+{
+ typedef BOOL (*CsrpConnectToServer)(PWSTR);
+
+ CsrpConnectToServer (0x77F8F65D) (L"\\Windows");
+ __asm__("mov eax, 0; mov esp, ebp; pop ebp; ret");
+}
+
+int fork(void)
+{
+ HANDLE proc_handle, thread_handle;
+ OBJECT_ATTRIBUTES oa = { sizeof(oa) };
+ CONTEXT context = { CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS | CONTEXT_FLOATING_POINT };
+ MEMORY_BASIC_INFORMATION mbi;
+ THREAD_BASIC_INFORMATION tbi;
+ PNT_TIB tib;
+ USER_STACK stack;
+ CLIENT_ID cid;
+
+ /* ensure the child has the same handles and ports */
+ inherit_handles();
+
+ /* create the actual LWP using ZwCreateProcess() */
+ ZwCreateProcess(&proc_handle, PROCESS_ALL_ACCESS, &oa, NtCurrentProcess(), TRUE, 0, 0, 0);
+
+ /* now set up a thread for that process using a context, cloning the current thread ... */
+ ZwGetContextThread(NtCurrentThread(), &context);
+ context.Eip = (unsigned long) child;
+
+ /* set up a stack for the thread now that the child sentinel is set up ... */
+ ZwQueryVirtualMemory(NtCurrentProcess(), (void *) context.Esp, MemoryBasicInformation,
+ &mbi, sizeof mbi, 0);
+
+ stack = (USER_STACK){0, 0, ((char *) mbi.BaseAddress) + mbi.RegionSize,
+ mbi.BaseAddress, mbi.AllocationBase};
+
+ /* now spawn the thread! */
+ ZwCreateThread(&thread_handle, THREAD_ALL_ACCESS, &oa, proc_handle, &cid, &context, &stack, TRUE);
+
+ /* thread is spawned, but frozen for inspection -- fix up memory protection before unfreezing */
+ ZwQueryInformationThread(NtCurrentThread(), ThreadBasicInformation, &tbi, sizeof tbi, 0);
+ tib = tbi.TebBaseAddress;
+
+ ZwQueryInformationThread(thread_handle, ThreadBasicInformation, &tbi, sizeof tbi, 0);
+ ZwWriteVirtualMemory(process_handle, tbi.TebBaseAddress, &tib->ExceptionList, sizeof(tib->ExceptionList), 0);
+
+ /* ready to go, now request a CSRSS session */
+ request_csrss_session(process_handle, thread_handle, (uint32_t) cid.UniqueProcess, (uint32_t) cid.UniqueThread);
+
+ /* CSRSS session set up or we segfaulted by now, so unfreeze the child... */
+ ZwResumeThread(thread_handle, 0);
+
+ /* release handle refcount now that process is freestanding */
+ ZwClose(thread_handle);
+ ZwClose(process_handle);
+
+ return (int) cid.UniqueProcess;
+}
+
+#endif
+
+#endif
+
+#endif
diff --git a/src/libmowgli/win32_support.c b/src/libmowgli/platform/win32/gettimeofday.c
index da6344f..1e96797 100644
--- a/src/libmowgli/win32_support.c
+++ b/src/libmowgli/platform/win32/gettimeofday.c
@@ -29,10 +29,11 @@
# define EPOCH_TIME_IN_MICROSECS 11644473600000000ULL
#endif
+#ifdef _WIN32
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
- ULARGE_INTEGER tmpres = { 0 };
+ ULARGE_INTEGER tmpres;
static mowgli_boolean_t tz_init_done = FALSE;
if (tv != NULL)
@@ -62,3 +63,4 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)
return 0;
}
+#endif
diff --git a/src/libmowgli/platform/win32/inet.c b/src/libmowgli/platform/win32/inet.c
new file mode 100644
index 0000000..051ae7f
--- /dev/null
+++ b/src/libmowgli/platform/win32/inet.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>.
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifdef _WIN32
+
+int inet_pton(int af, const char *src, void *dst)
+{
+ struct sockaddr_storage ss;
+ int size = sizeof(struct sockaddr_storage);
+ char src_copy[INET6_ADDRSTRLEN + 1];
+
+ mowgli_strlcpy(src_copy, src, sizeof src_copy);
+
+ if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *) &ss, &size) != SOCKET_ERROR)
+ {
+ switch (af)
+ {
+ case AF_INET:
+ *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
+ return 1;
+
+ case AF_INET6:
+ *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
+ return 1;
+
+ default:
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+const char *inet_ntop(int af, const void *addr, char *host, size_t hostlen)
+{
+ struct sockaddr_storage ss;
+ int size = sizeof(struct sockaddr_storage);
+
+ ss.ss_family = af;
+
+ switch (af)
+ {
+ case AF_INET:
+ memcpy(&(((struct sockaddr_in *) &ss)->sin_addr), (struct in_addr *) addr, sizeof (struct in_addr));
+ break;
+
+ case AF_INET6:
+ memcpy(&(((struct sockaddr_in6 *) &ss)->sin6_addr), (struct in6_addr *) addr, sizeof (struct in6_addr));
+ break;
+
+ default:
+ return NULL;
+ }
+
+ if (WSAAddressToString((struct sockaddr *) &ss, size, 0, host, (LPDWORD) &hostlen) != SOCKET_ERROR)
+ return host;
+
+ return NULL;
+}
+
+#endif
diff --git a/src/libmowgli/mowgli_init.h b/src/libmowgli/platform/win32/pipe.c
index 3ebc7e3..5da3dd2 100644
--- a/src/libmowgli/mowgli_init.h
+++ b/src/libmowgli/platform/win32/pipe.c
@@ -1,8 +1,8 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_init.c: Initialization of libmowgli.
+ * pipe.c: UNIX pipe emulation
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2012 TortoiseLabs, LLC.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,9 +21,11 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __MOWGLI_INIT_H__
-#define __MOWGLI_INIT_H__
-
-extern void mowgli_init(void);
+#include "mowgli.h"
+#ifdef _WIN32
+int pipe(int pipefd[2])
+{
+ return socketpair(AF_INET, SOCK_STREAM, 0, pipefd);
+}
#endif
diff --git a/src/libmowgli/mowgli_allocator.h b/src/libmowgli/platform/win32/setenv.c
index 1e2b703..f80a574 100644
--- a/src/libmowgli/mowgli_allocator.h
+++ b/src/libmowgli/platform/win32/setenv.c
@@ -1,8 +1,8 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_allocator.h: Builtin allocation policies (mmap/malloc).
+ * setenv.c: setenv() wrapper around SetEnvironmentVariable().
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2012 TortoiseLabs, LLC.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,11 +21,11 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __MOWGLI_ALLOCATOR_H__
-#define __MOWGLI_ALLOCATOR_H__
-
-void mowgli_allocator_init(void) MOWGLI_DEPRECATED;
-extern mowgli_allocation_policy_t *mowgli_allocator_malloc MOWGLI_DEPRECATED;
+#include "mowgli.h"
+#ifdef _WIN32
+int setenv(const char *name, const char *value, int overwrite)
+{
+ return !SetEnvironmentVariable(name, value);
+}
#endif
-
diff --git a/src/libmowgli/platform/win32/socketpair.c b/src/libmowgli/platform/win32/socketpair.c
new file mode 100644
index 0000000..6ede51e
--- /dev/null
+++ b/src/libmowgli/platform/win32/socketpair.c
@@ -0,0 +1,109 @@
+/* socketpair.c
+ * Copyright 2007, 2010 by Nathan C. Myers <ncm@cantrip.org>
+ * This code is Free Software. It may be copied freely, in original or
+ * modified form, subject only to the restrictions that (1) the author is
+ * relieved from all responsibilities for any use for any purpose, and (2)
+ * this copyright notice must be retained, unchanged, in its entirety. If
+ * for any reason the author might be held responsible for any consequences
+ * of copying or use, license is withheld.
+ */
+
+/* Changes:
+ * 2010-03-31:
+ * set addr to 127.0.0.1 because win32 getsockname does not always set it.
+ * 2010-02-25:
+ * set SO_REUSEADDR option to avoid leaking some windows resource.
+ * Windows System Error 10049, "Event ID 4226 TCP/IP has reached
+ * the security limit imposed on the number of concurrent TCP connect
+ * attempts." Bleah.
+ * 2007-04-25:
+ * preserve value of WSAGetLastError() on all error returns.
+ * 2007-04-22: (Thanks to Matthew Gregan <kinetik@flim.org>)
+ * s/EINVAL/WSAEINVAL/ fix trivial compile failure
+ * s/socket/WSASocket/ enable creation of sockets suitable as stdin/stdout
+ * of a child process.
+ * add argument make_overlapped
+ */
+
+#include "mowgli.h"
+
+#ifdef _WIN32
+
+/* dumb_socketpair:
+ * If make_overlapped is nonzero, both sockets created will be usable for
+ * "overlapped" operations via WSASend etc. If make_overlapped is zero,
+ * socks[0] (only) will be usable with regular ReadFile etc., and thus
+ * suitable for use as stdin or stdout of a child process. Note that the
+ * sockets must be closed with closesocket() regardless.
+ */
+
+int socketpair(int domain, int type, int protocol, int socks[2])
+{
+ union {
+ struct sockaddr_in inaddr;
+ struct sockaddr addr;
+ } a;
+ SOCKET listener;
+ int e;
+ socklen_t addrlen = sizeof(a.inaddr);
+ int make_overlapped = 0;
+ DWORD flags = (make_overlapped ? WSA_FLAG_OVERLAPPED : 0);
+ int reuse = 1;
+
+ if (socks == NULL) {
+ WSASetLastError(WSAEINVAL);
+ return SOCKET_ERROR;
+ }
+
+ listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (listener == INVALID_SOCKET)
+ return SOCKET_ERROR;
+
+ memset(&a, 0, sizeof(a));
+ a.inaddr.sin_family = AF_INET;
+ a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ a.inaddr.sin_port = 0;
+
+ socks[0] = socks[1] = INVALID_SOCKET;
+ do {
+ if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
+ (char*) &reuse, (socklen_t) sizeof(reuse)) == -1)
+ break;
+ if (bind(listener, &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR)
+ break;
+
+ memset(&a, 0, sizeof(a));
+ if (getsockname(listener, &a.addr, &addrlen) == SOCKET_ERROR)
+ break;
+ // win32 getsockname may only set the port number, p=0.0005.
+ // ( http://msdn.microsoft.com/library/ms738543.aspx ):
+ a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ a.inaddr.sin_family = AF_INET;
+
+ if (listen(listener, 1) == SOCKET_ERROR)
+ break;
+
+ socks[0] = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, flags);
+ if (socks[0] == (int) INVALID_SOCKET)
+ break;
+ if (connect(socks[0], &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR)
+ break;
+
+ socks[1] = accept(listener, NULL, NULL);
+ if (socks[1] == (int) INVALID_SOCKET)
+ break;
+
+ closesocket(listener);
+ return 0;
+
+ } while (0);
+
+ e = WSAGetLastError();
+ closesocket(listener);
+ closesocket(socks[0]);
+ closesocket(socks[1]);
+ WSASetLastError(e);
+ return SOCKET_ERROR;
+}
+
+#endif
diff --git a/src/libmowgli/win32_support.h b/src/libmowgli/platform/win32/win32_stdinc.h
index c87c643..1360a4a 100644
--- a/src/libmowgli/win32_support.h
+++ b/src/libmowgli/platform/win32/win32_stdinc.h
@@ -1,6 +1,6 @@
/*
* libmowgli: A collection of useful routines for programming.
- * win32_support.h: Support functions and values for Win32 platform.
+ * win32_stdinc.h: Support functions and values for Win32 platform.
*
* Copyright (c) 2009 SystemInPlace, Inc.
*
@@ -26,14 +26,16 @@
#ifdef _WIN32
-#include <winsock.h> // just for struct timeval declaration
+#include <winsock2.h>
+#include <ws2tcpip.h>
#include <time.h>
#define strcasecmp _stricmp
#define strdup _strdup
#define usleep(_usecs) Sleep((_usecs)/1000L)
-#define snprintf _snprintf
-#define vsnprintf _vsnprintf
+#ifdef _MSC_VER
+# define snprintf _snprintf
+#endif
struct timezone {
int tz_minuteswest;
@@ -41,6 +43,19 @@ struct timezone {
};
extern int gettimeofday(struct timeval *tv, struct timezone *tz);
+extern int setenv(const char *name, const char *value, int overwrite);
+extern int pipe(int pipefd[2]);
+extern int socketpair(int domain, int type, int protocol, int pipefd[2]);
+extern int fork(void);
+extern int inet_pton(int af, const char *src, void *dst);
+extern const char *inet_ntop(int af, const void *addr, char *host, size_t hostlen);
+
+/* MSYS autoconf is fucko. */
+#ifndef HAVE_WINSOCK2_H
+#define HAVE_WINSOCK2_H
+#endif
+
+#define HAVE_SELECT
#endif
diff --git a/src/libmowgli/thread/Makefile b/src/libmowgli/thread/Makefile
new file mode 100644
index 0000000..c0e51e4
--- /dev/null
+++ b/src/libmowgli/thread/Makefile
@@ -0,0 +1,18 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_THREAD}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_THREAD}
+
+SRCS = mutex.c \
+ null_mutexops.c \
+ posix_mutexops.c \
+ win32_mutexops.c
+
+INCLUDES = thread.h mutex.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/thread
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/thread/mutex.c b/src/libmowgli/thread/mutex.c
new file mode 100644
index 0000000..1d5d480
--- /dev/null
+++ b/src/libmowgli/thread/mutex.c
@@ -0,0 +1,134 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * mutex.c: Cross-platform mutexes.
+ *
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#if defined(_WIN32)
+extern const mowgli_mutex_ops_t _mowgli_win32_mutex_ops;
+#elif defined(_sun) || defined(_sco)
+extern const mowgli_mutex_ops_t _mowgli_sun_mutex_ops;
+#else
+extern const mowgli_mutex_ops_t _mowgli_posix_mutex_ops;
+#endif
+
+extern const mowgli_mutex_ops_t _mowgli_null_mutex_ops;
+
+static const mowgli_mutex_ops_t *_mowgli_mutex_ops = NULL;
+
+static inline const mowgli_mutex_ops_t *get_mutex_platform(void)
+{
+ /* allow for threading policy to set custom mutex ops */
+ if (_mowgli_mutex_ops != NULL)
+ return _mowgli_mutex_ops;
+
+#if defined(_WIN32)
+ return &_mowgli_win32_mutex_ops;
+#endif
+
+#if defined(_sun) || defined(_sco)
+ return &_mowgli_sun_mutex_ops;
+#endif
+
+#if !defined(MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES)
+ return &_mowgli_posix_mutex_ops;
+#endif
+
+ return &_mowgli_null_mutex_ops;
+}
+
+mowgli_mutex_t *mowgli_mutex_create(void)
+{
+ mowgli_mutex_t *mutex = mowgli_alloc(sizeof(mowgli_mutex_t));
+
+ return_val_if_fail(mutex != NULL, NULL);
+
+ if (mowgli_mutex_init(mutex))
+ return mutex;
+ else
+ {
+ mowgli_free(mutex);
+ return NULL;
+ }
+}
+
+int mowgli_mutex_init(mowgli_mutex_t *mutex)
+{
+ return_val_if_fail(mutex != NULL, -1);
+
+ mutex->ops = get_mutex_platform();
+
+ return mutex->ops->mutex_create(mutex);
+}
+
+int mowgli_mutex_lock(mowgli_mutex_t *mutex)
+{
+ return_val_if_fail(mutex != NULL, -1);
+ return_val_if_fail(mutex->ops != NULL, -1);
+
+ return mutex->ops->mutex_lock(mutex);
+}
+
+int mowgli_mutex_trylock(mowgli_mutex_t *mutex)
+{
+ return_val_if_fail(mutex != NULL, -1);
+ return_val_if_fail(mutex->ops != NULL, -1);
+
+ return mutex->ops->mutex_trylock(mutex);
+}
+
+int mowgli_mutex_unlock(mowgli_mutex_t *mutex)
+{
+ return_val_if_fail(mutex != NULL, -1);
+ return_val_if_fail(mutex->ops != NULL, -1);
+
+ return mutex->ops->mutex_unlock(mutex);
+}
+
+int mowgli_mutex_uninit(mowgli_mutex_t *mutex)
+{
+ return_val_if_fail(mutex != NULL, -1);
+ return_val_if_fail(mutex->ops != NULL, -1);
+
+ return mutex->ops->mutex_destroy(mutex);
+}
+
+void mowgli_mutex_destroy(mowgli_mutex_t *mutex)
+{
+ return_if_fail(mutex != NULL);
+
+ mowgli_mutex_uninit(mutex);
+ mowgli_free(mutex);
+}
+
+void mowgli_mutex_set_policy(mowgli_thread_policy_t policy)
+{
+ switch (policy)
+ {
+ case MOWGLI_THREAD_POLICY_DISABLED:
+ _mowgli_mutex_ops = &_mowgli_null_mutex_ops;
+ break;
+ case MOWGLI_THREAD_POLICY_DEFAULT:
+ default:
+ _mowgli_mutex_ops = NULL;
+ }
+}
diff --git a/src/libmowgli/thread/mutex.h b/src/libmowgli/thread/mutex.h
new file mode 100644
index 0000000..f08013d
--- /dev/null
+++ b/src/libmowgli/thread/mutex.h
@@ -0,0 +1,79 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * mutex.h: Cross-platform mutexes.
+ *
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_MUTEX_H__
+#define __MOWGLI_MUTEX_H__
+
+#ifdef MOWGLI_OS_UNIX_TYPE
+# include <thread.h>
+# include <synch.h>
+# define MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
+# define MOWGLI_NATIVE_MUTEX_DECL(name) mutex_t (name)
+#elif defined MOWGLI_OS_WIN
+# define MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
+# define MOWGLI_NATIVE_MUTEX_DECL(name) HANDLE (name)
+#else
+# include <pthread.h>
+#endif
+
+typedef struct mowgli_mutex_ mowgli_mutex_t;
+
+typedef struct {
+ int (*mutex_create)(mowgli_mutex_t *mutex);
+ int (*mutex_lock)(mowgli_mutex_t *mutex);
+ int (*mutex_trylock)(mowgli_mutex_t *mutex);
+ int (*mutex_unlock)(mowgli_mutex_t *mutex);
+ int (*mutex_destroy)(mowgli_mutex_t *mutex);
+} mowgli_mutex_ops_t;
+
+struct mowgli_mutex_ {
+#ifdef MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES
+ MOWGLI_NATIVE_MUTEX_DECL(mutex);
+#else
+ pthread_mutex_t mutex;
+#endif
+ const mowgli_mutex_ops_t *ops;
+};
+
+#ifdef MOWGLI_NATIVE_MUTEX_DECL
+# undef MOWGLI_NATIVE_MUTEX_DECL
+#endif
+
+mowgli_mutex_t *mowgli_mutex_create(void);
+int mowgli_mutex_init(mowgli_mutex_t* mutex);
+int mowgli_mutex_lock(mowgli_mutex_t *mutex);
+int mowgli_mutex_trylock(mowgli_mutex_t *mutex);
+int mowgli_mutex_unlock(mowgli_mutex_t *mutex);
+int mowgli_mutex_uninit(mowgli_mutex_t *mutex);
+void mowgli_mutex_destroy(mowgli_mutex_t *mutex);
+
+void mowgli_mutex_set_policy(mowgli_thread_policy_t policy);
+
+/* simple dispatch function to set the ops up for the various subsystems. */
+static inline void mowgli_thread_set_policy(mowgli_thread_policy_t policy)
+{
+ mowgli_mutex_set_policy(policy);
+}
+
+#endif
+
diff --git a/src/libmowgli/mowgli_allocator.c b/src/libmowgli/thread/null_mutexops.c
index 8c4bd69..2750add 100644
--- a/src/libmowgli/mowgli_allocator.c
+++ b/src/libmowgli/thread/null_mutexops.c
@@ -1,8 +1,8 @@
/*
* libmowgli: A collection of useful routines for programming.
- * mowgli_allocator.h: Builtin allocation policies (mmap/malloc).
+ * null_mutexops.c: null mutex operations
*
- * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ * Copyright (c) 2011 William Pitcock <nenolod@dereferenced.org>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -23,24 +23,35 @@
#include "mowgli.h"
-mowgli_allocation_policy_t *mowgli_allocator_malloc = NULL;
+static int mowgli_null_mutex_create(mowgli_mutex_t *mutex)
+{
+ return 0;
+}
+
+static int mowgli_null_mutex_lock(mowgli_mutex_t *mutex)
+{
+ return 0;
+}
-static void *
-mowgli_allocator_func_malloc(int size)
+static int mowgli_null_mutex_trylock(mowgli_mutex_t *mutex)
{
- return calloc(size, 1);
+ return 0;
}
-static void
-mowgli_allocator_func_free(void *ptr)
+static int mowgli_null_mutex_unlock(mowgli_mutex_t *mutex)
{
- if (ptr)
- free(ptr);
+ return 0;
}
-void
-mowgli_allocator_init(void)
+static int mowgli_null_mutex_destroy(mowgli_mutex_t *mutex)
{
- mowgli_allocator_malloc = mowgli_allocation_policy_create("malloc", mowgli_allocator_func_malloc,
- mowgli_allocator_func_free);
+ return 0;
}
+
+const mowgli_mutex_ops_t _mowgli_null_mutex_ops = {
+ .mutex_create = mowgli_null_mutex_create,
+ .mutex_lock = mowgli_null_mutex_lock,
+ .mutex_trylock = mowgli_null_mutex_trylock,
+ .mutex_unlock = mowgli_null_mutex_unlock,
+ .mutex_destroy = mowgli_null_mutex_destroy
+};
diff --git a/src/libmowgli/thread/posix_mutexops.c b/src/libmowgli/thread/posix_mutexops.c
new file mode 100644
index 0000000..5fb64e9
--- /dev/null
+++ b/src/libmowgli/thread/posix_mutexops.c
@@ -0,0 +1,115 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * posix_mutexops.c: POSIX Mutexes.
+ *
+ * Copyright (c) 2011 Wilcox Technologies, LLC <awilcox -at- wilcox-tech.com>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+#ifndef _WIN32
+
+/*************
+ * This implements native Sun/UnixWare threads. Some other SVR4-based
+ * environments attempted to make work-alikes, but those aren't guaranteed
+ * to be supported. This should work on SunOS 5.2 and UnixWare 7, and
+ * anything later.
+ *************/
+#if defined(__sun) || defined(__sco)
+
+static int mowgli_sun_mutex_create(mowgli_mutex_t *mutex)
+{
+ return mutex_init(&mutex->mutex, USYNC_THREAD, NULL);
+}
+
+static int mowgli_sun_mutex_lock(mowgli_mutex_t *mutex)
+{
+ return mutex_lock(&mutex->mutex);
+}
+
+static int mowgli_sun_mutex_trylock(mowgli_mutex_t *mutex)
+{
+ return mutex_trylock(&mutex->mutex);
+}
+
+static int mowgli_sun_mutex_unlock(mowgli_mutex_t *mutex)
+{
+ return mutex_unlock(&mutex->mutex);
+}
+
+static int mowgli_sun_mutex_destroy(mowgli_mutex_t *mutex)
+{
+ return mutex_destroy(&mutex->mutex);
+}
+
+const mowgli_mutex_ops_t _mowgli_sun_mutex_ops = {
+ .mutex_create = mowgli_sun_mutex_create,
+ .mutex_lock = mowgli_sun_mutex_lock,
+ .mutex_trylock = mowgli_sun_mutex_trylock,
+ .mutex_unlock = mowgli_sun_mutex_unlock,
+ .mutex_destroy = mowgli_sun_mutex_destroy,
+};
+
+/*************
+ * This "default" implementation uses pthreads. Care has been taken to
+ * ensure it runs on POSIX 1003.4a (draft 4, aka DECthreads, aka what OSF/1,
+ * Tru64, Ultrix, CMU Mach, and HP-UX use) as well as POSIX 1003.1c-1995.
+ * As long as you don't try playing with the pthread_attr module or the
+ * scheduler routines (which are non-standard and broken anyway, IMO) then
+ * it should be relatively easy to maintian d4 compatibility without
+ * sacrificing any functionality.
+ *************/
+#elif !defined(MOWGLI_FEATURE_HAVE_NATIVE_MUTEXES)
+
+static int mowgli_posix_mutex_create(mowgli_mutex_t *mutex)
+{
+ return pthread_mutex_init(&mutex->mutex, NULL);
+}
+
+static int mowgli_posix_mutex_lock(mowgli_mutex_t *mutex)
+{
+ return pthread_mutex_lock(&mutex->mutex);
+}
+
+static int mowgli_posix_mutex_trylock(mowgli_mutex_t *mutex)
+{
+ return pthread_mutex_trylock(&mutex->mutex);
+}
+
+static int mowgli_posix_mutex_unlock(mowgli_mutex_t *mutex)
+{
+ return pthread_mutex_unlock(&mutex->mutex);
+}
+
+static int mowgli_posix_mutex_destroy(mowgli_mutex_t *mutex)
+{
+ return pthread_mutex_destroy(&mutex->mutex);
+}
+
+const mowgli_mutex_ops_t _mowgli_posix_mutex_ops = {
+ .mutex_create = mowgli_posix_mutex_create,
+ .mutex_lock = mowgli_posix_mutex_lock,
+ .mutex_trylock = mowgli_posix_mutex_trylock,
+ .mutex_unlock = mowgli_posix_mutex_unlock,
+ .mutex_destroy = mowgli_posix_mutex_destroy,
+};
+
+#endif
+
+#endif
diff --git a/src/libmowgli/thread/thread.h b/src/libmowgli/thread/thread.h
new file mode 100644
index 0000000..f063217
--- /dev/null
+++ b/src/libmowgli/thread/thread.h
@@ -0,0 +1,78 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * thread.h: Cross-platform threading helper routines.
+ *
+ * Copyright (c) 2011 Wilcox Technologies, LLC <awilcox -at- wilcox-tech.com>
+ * Copyright (c) 2011, 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_THREAD_H__
+#define __MOWGLI_THREAD_H__
+
+#ifdef MOWGLI_OS_UNIX_TYPE
+# include <thread.h>
+# define MOWGLI_FEATURE_HAVE_NATIVE_THREADS
+# define MOWGLI_NATIVE_THREAD_DECL(name) thread_t (name)
+#elif defined MOWGLI_OS_WIN
+# define MOWGLI_FEATURE_HAVE_NATIVE_THREADS
+# define MOWGLI_NATIVE_THREAD_DECL(name) HANDLE (name)
+#else
+# include <pthread.h>
+#endif
+
+typedef struct {
+#ifdef MOWGLI_FEATURE_HAVE_NATIVE_THREADS
+ MOWGLI_NATIVE_THREAD_DECL(thread);
+#else
+ pthread_t thread;
+#endif
+} mowgli_thread_t;
+
+#ifdef MOWGLI_NATIVE_THREAD_DECL
+# undef MOWGLI_NATIVE_THREAD_DECL
+#endif
+
+typedef void *(*mowgli_thread_start_fn_t)(mowgli_thread_t *thread, void *userdata);
+
+/*
+ * Note: we should keep our thread interface light and minimal for best possible
+ * portability. Creating, ending, killing and cleanup functions are presently implemented,
+ * and cover approximately 99.999% of uses of thread APIs. --nenolod
+ */
+typedef struct {
+ int (*thread_create)(mowgli_thread_t *thread, mowgli_thread_start_fn_t start_fn, void *userdata);
+ void (*thread_exit)(mowgli_thread_t *thread);
+ void *(*thread_join)(mowgli_thread_t *thread);
+ void (*thread_kill)(mowgli_thread_t *thread);
+ void (*thread_destroy)(mowgli_thread_t *thread);
+} mowgli_thread_ops_t;
+
+int mowgli_thread_create(mowgli_thread_t *thread, mowgli_thread_start_fn_t start_fn, void *userdata);
+void mowgli_thread_exit(mowgli_thread_t *thread);
+void *mowgli_thread_join(mowgli_thread_t *thread);
+void mowgli_thread_kill(mowgli_thread_t *thread);
+void mowgli_thread_destroy(mowgli_thread_t *thread);
+
+typedef enum {
+ MOWGLI_THREAD_POLICY_DEFAULT,
+ MOWGLI_THREAD_POLICY_DISABLED,
+} mowgli_thread_policy_t;
+
+#endif
+
diff --git a/src/libmowgli/thread/win32_mutexops.c b/src/libmowgli/thread/win32_mutexops.c
new file mode 100644
index 0000000..486992f
--- /dev/null
+++ b/src/libmowgli/thread/win32_mutexops.c
@@ -0,0 +1,74 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * win32_mutexops.c: Windows mutex operations
+ *
+ * Copyright (c) 2011 Wilcox Technologies, LLC <awilcox -at- wilcox-tech.com>
+ *
+ * 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 is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+
+/*************
+ * This Windows implementation is guaranteed to work on Windows 95,
+ * Windows NT 4, and anything later.
+ *************/
+#if defined(_WIN32)
+
+static int mowgli_win32_mutex_create(mowgli_mutex_t *mutex)
+{
+ mutex->mutex = CreateMutex(NULL, FALSE, NULL);
+ if(mutex->mutex == NULL)
+ return GetLastError();
+
+ return 0;
+}
+
+static int mowgli_win32_mutex_lock(mowgli_mutex_t *mutex)
+{
+ return WaitForSingleObject(mutex->mutex, INFINITE);
+}
+
+static int mowgli_win32_mutex_trylock(mowgli_mutex_t *mutex)
+{
+ return WaitForSingleObject(mutex->mutex, 0);
+}
+
+static int mowgli_win32_mutex_unlock(mowgli_mutex_t *mutex)
+{
+ if(ReleaseMutex(mutex->mutex) != 0)
+ return 0;
+
+ return GetLastError();
+}
+
+static int mowgli_win32_mutex_destroy(mowgli_mutex_t *mutex)
+{
+ CloseHandle(mutex->mutex);
+ return 0;
+}
+
+const mowgli_mutex_ops_t _mowgli_win32_mutex_ops = {
+ .mutex_create = mowgli_win32_mutex_create,
+ .mutex_lock = mowgli_win32_mutex_lock,
+ .mutex_trylock = mowgli_win32_mutex_trylock,
+ .mutex_unlock = mowgli_win32_mutex_unlock,
+ .mutex_destroy = mowgli_win32_mutex_destroy
+};
+
+#endif
diff --git a/src/libmowgli/vio/Makefile b/src/libmowgli/vio/Makefile
new file mode 100644
index 0000000..adbea96
--- /dev/null
+++ b/src/libmowgli/vio/Makefile
@@ -0,0 +1,15 @@
+include ../../../extra.mk
+
+STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_VIO}
+STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_VIO}
+
+SRCS = vio.c vio_sockets.c vio_openssl.c
+
+INCLUDES = vio.h
+
+include ../../../buildsys.mk
+
+includesubdir = $(PACKAGE_NAME)/vio
+
+CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE
+
diff --git a/src/libmowgli/vio/vio.c b/src/libmowgli/vio/vio.c
new file mode 100644
index 0000000..ef4fb90
--- /dev/null
+++ b/src/libmowgli/vio/vio.c
@@ -0,0 +1,140 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * vio.c: Virtual I/O subsystem
+ *
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+/* How the VIO API works:
+ *
+ * - Return 0 in your error callback if you have nothing to report (non-fatal error or no error)
+ * - Return -1 in your callback if you have a fatal error
+ * - Return the length of bytes written or read, similar to the semantics of
+ * the read(3) or write(3) calls, if you are a read/write callback.
+ *
+ * These are just default implementations, you can change them to suit your needs.
+ */
+
+static mowgli_heap_t *vio_heap = NULL;
+
+/* Change these to suit your needs for new VIO objects */
+mowgli_vio_ops_t mowgli_vio_default_ops = {
+ .socket = mowgli_vio_default_socket,
+ .bind = mowgli_vio_default_bind,
+ .listen = mowgli_vio_default_listen,
+ .accept = mowgli_vio_default_accept,
+ .connect = mowgli_vio_default_connect,
+ .read = mowgli_vio_default_read,
+ .write = mowgli_vio_default_write,
+ .sendto = mowgli_vio_default_sendto,
+ .recvfrom = mowgli_vio_default_recvfrom,
+ .error = mowgli_vio_default_error,
+ .close = mowgli_vio_default_close,
+ .seek = mowgli_vio_default_seek,
+ .tell = mowgli_vio_default_tell,
+};
+
+mowgli_vio_t * mowgli_vio_create(void *userdata)
+{
+ mowgli_vio_t *vio;
+
+ if (!vio_heap)
+ vio_heap = mowgli_heap_create(sizeof(mowgli_vio_t), 64, BH_NOW);
+
+ vio = mowgli_heap_alloc(vio_heap);
+
+ mowgli_vio_init(vio, userdata);
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISONHEAP, true);
+
+ return vio;
+}
+
+void mowgli_vio_init(mowgli_vio_t *vio, void *userdata)
+{
+ vio->fd = -1;
+
+ vio->flags = 0;
+
+ /* Default ops */
+ vio->ops = mowgli_vio_default_ops;
+
+ vio->userdata = userdata;
+}
+
+void mowgli_vio_eventloop_attach(mowgli_vio_t *vio, mowgli_eventloop_t *eventloop)
+{
+ vio->io = mowgli_pollable_create(eventloop, vio->fd, vio->userdata);
+ if (vio->io != NULL)
+ {
+ vio->eventloop = eventloop;
+ /* You're probably going to want this */
+ mowgli_pollable_set_nonblocking(vio->io, true);
+ }
+ else
+ mowgli_log("Unable to create pollable with VIO object [%p], expect problems.", vio);
+}
+
+void mowgli_vio_eventloop_detach(mowgli_vio_t *vio)
+{
+ return_if_fail(vio->io != NULL);
+ return_if_fail(vio->eventloop != NULL);
+
+ mowgli_pollable_destroy(vio->eventloop, vio->io);
+}
+
+void mowgli_vio_destroy(mowgli_vio_t *vio)
+{
+ mowgli_vio_eventloop_detach(vio);
+
+ if (mowgli_vio_hasflag(vio, MOWGLI_VIO_FLAGS_ISONHEAP))
+ mowgli_heap_free(vio_heap, vio);
+}
+
+int mowgli_vio_err_errcode(mowgli_vio_t *vio, char *(*int_to_error)(int), int errcode)
+{
+ vio->error.type = MOWGLI_VIO_ERR_ERRCODE;
+ vio->error.code = errcode;
+ mowgli_strlcpy(vio->error.string, int_to_error(errcode), sizeof(vio->error.string));
+ return mowgli_vio_error(vio);
+}
+
+#ifdef HAVE_OPENSSL
+
+int mowgli_vio_err_sslerrcode(mowgli_vio_t *vio, int errcode)
+{
+ vio->error.type = MOWGLI_VIO_ERR_ERRCODE;
+ vio->error.code = errcode;
+ ERR_error_string_n(errcode, vio->error.string, sizeof(vio->error.string));
+ return mowgli_vio_error(vio);
+}
+
+#else
+
+int mowgli_vio_err_sslerrcode(mowgli_vio_t *vio, int errcode)
+{
+ vio->error.type = MOWGLI_VIO_ERR_ERRCODE;
+ vio->error.code = errcode;
+ mowgli_strlcpy(vio->error.string, "Unknown SSL error", sizeof(vio->error.string));
+ return mowgli_vio_error(vio);
+}
+
+#endif
diff --git a/src/libmowgli/vio/vio.h b/src/libmowgli/vio/vio.h
new file mode 100644
index 0000000..37b5c37
--- /dev/null
+++ b/src/libmowgli/vio/vio.h
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MOWGLI_VIO_VIO_H__
+#define __MOWGLI_VIO_VIO_H__
+
+/* Types and structs */
+typedef struct _mowgli_vio mowgli_vio_t;
+
+typedef enum {
+ MOWGLI_VIO_ERR_NONE,
+ MOWGLI_VIO_ERR_REMOTE_HANGUP,
+ MOWGLI_VIO_ERR_ERRCODE,
+ MOWGLI_VIO_ERR_API,
+ MOWGLI_VIO_ERR_CUSTOM,
+} mowgli_vio_error_type_t;
+
+typedef enum {
+ MOWGLI_VIO_ERR_OP_NONE,
+ MOWGLI_VIO_ERR_OP_SOCKET,
+ MOWGLI_VIO_ERR_OP_LISTEN,
+ MOWGLI_VIO_ERR_OP_ACCEPT,
+ MOWGLI_VIO_ERR_OP_CONNECT,
+ MOWGLI_VIO_ERR_OP_READ,
+ MOWGLI_VIO_ERR_OP_WRITE,
+ MOWGLI_VIO_ERR_OP_BIND,
+ MOWGLI_VIO_ERR_OP_SEEK,
+ MOWGLI_VIO_ERR_OP_TELL,
+ MOWGLI_VIO_ERR_OP_OTHER,
+} mowgli_vio_error_op_t;
+
+typedef struct _mowgli_vio_error {
+ mowgli_vio_error_op_t op;
+ mowgli_vio_error_type_t type;
+ int code;
+ char string[128];
+} mowgli_vio_error_t;
+
+typedef struct _mowgli_vio_sockaddr {
+ struct sockaddr_storage addr;
+ socklen_t addrlen;
+} mowgli_vio_sockaddr_t;
+
+typedef struct _mowgli_vio_sockdata {
+ char host[39]; /* max length of IPv6 address */
+ uint16_t port;
+} mowgli_vio_sockdata_t;
+
+typedef int mowgli_vio_func_t(mowgli_vio_t *);
+typedef int mowgli_vio_bind_connect_func_t(mowgli_vio_t *, mowgli_vio_sockaddr_t *);
+typedef int mowgli_vio_read_func_t(mowgli_vio_t *, void *, size_t);
+typedef int mowgli_vio_write_func_t(mowgli_vio_t *, const void *, size_t);
+typedef int mowgli_vio_sendto_func_t(mowgli_vio_t *, const void *, size_t, mowgli_vio_sockaddr_t *);
+typedef int mowgli_vio_recvfrom_func_t(mowgli_vio_t *, void *, size_t, mowgli_vio_sockaddr_t *);
+typedef int mowgli_vio_connect_func_t(mowgli_vio_t *);
+typedef int mowgli_vio_accept_func_t(mowgli_vio_t *, mowgli_vio_t *);
+typedef int mowgli_vio_listen_func_t(mowgli_vio_t *, int);
+typedef int mowgli_vio_socket_func_t(mowgli_vio_t *, int, int, int);
+typedef int mowgli_vio_seek_func_t(mowgli_vio_t *, long, int);
+
+typedef struct {
+ mowgli_vio_socket_func_t *socket;
+ mowgli_vio_bind_connect_func_t *bind;
+ mowgli_vio_bind_connect_func_t *connect;
+ mowgli_vio_listen_func_t *listen;
+ mowgli_vio_accept_func_t *accept;
+ mowgli_vio_read_func_t *read;
+ mowgli_vio_write_func_t *write;
+ mowgli_vio_sendto_func_t *sendto;
+ mowgli_vio_recvfrom_func_t *recvfrom;
+ mowgli_vio_func_t *error;
+ mowgli_vio_func_t *close;
+ mowgli_vio_seek_func_t *seek;
+ mowgli_vio_func_t *tell;
+} mowgli_vio_ops_t;
+
+struct _mowgli_vio {
+ mowgli_vio_ops_t ops;
+
+ mowgli_eventloop_io_t *io;
+ mowgli_descriptor_t fd;
+
+ mowgli_eventloop_t *eventloop;
+
+ mowgli_vio_sockaddr_t addr;
+
+ mowgli_vio_error_t error;
+
+ int flags;
+
+ void *userdata;
+ void *privdata;
+};
+
+typedef struct _mowgli_vio_ssl_settings {
+ char cert_path[FILENAME_MAX];
+ char privatekey_path[FILENAME_MAX];
+ int ssl_version;
+ int (*password_func)(char *, int, int, void *);
+ int (*verify_func)(int, void *);
+} mowgli_vio_ssl_settings_t;
+
+
+/* Flags */
+#define MOWGLI_VIO_FLAGS_ISCONNECTING 0x00001
+#define MOWGLI_VIO_FLAGS_ISSSLCONNECTING 0x00002
+#define MOWGLI_VIO_FLAGS_ISCLOSED 0x00004
+
+#define MOWGLI_VIO_FLAGS_ISCLIENT 0x00008
+#define MOWGLI_VIO_FLAGS_ISSERVER 0x00010
+
+#define MOWGLI_VIO_FLAGS_ISONHEAP 0x00020
+
+#define MOWGLI_VIO_FLAGS_NEEDREAD 0x00040
+#define MOWGLI_VIO_FLAGS_NEEDWRITE 0x00080
+
+/* SSL flags */
+#define MOWGLI_VIO_SSLFLAGS_SSLV2 0x00001
+#define MOWGLI_VIO_SSLFLAGS_SSLV3 0x00002
+#define MOWGLI_VIO_SSLFLAGS_TLSV10 0x00004
+#define MOWGLI_VIO_SSLFLAGS_TLSV11 0x00008
+#define MOWGLI_VIO_SSLFLAGS_TLSV12 0x00010
+
+
+/* Flag setting/getting */
+static inline bool mowgli_vio_hasflag(mowgli_vio_t *vio, int flag)
+{
+ return (vio->flags & flag) != 0 ? true : false;
+}
+
+static inline void mowgli_vio_setflag(mowgli_vio_t *vio, int flag, bool setting)
+{
+ if (setting)
+ vio->flags |= flag;
+ else
+ vio->flags &= ~flag;
+}
+
+
+/* Macros */
+#define MOWGLI_VIO_SET_CLOSED(v) \
+ mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_ISCONNECTING, false); \
+ mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_ISCLOSED, true); \
+ mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_ISSSLCONNECTING, false); \
+ mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_NEEDREAD, false); \
+ mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_NEEDWRITE, false);
+
+
+/* Decls */
+extern mowgli_vio_t * mowgli_vio_create(void *userdata);
+extern void mowgli_vio_init(mowgli_vio_t *vio, void *userdata);
+extern void mowgli_vio_destroy(mowgli_vio_t *vio);
+
+extern void mowgli_vio_eventloop_attach(mowgli_vio_t *vio, mowgli_eventloop_t *eventloop);
+extern void mowgli_vio_eventloop_detach(mowgli_vio_t *vio);
+
+extern mowgli_vio_sockaddr_t * mowgli_vio_sockaddr_create(mowgli_vio_sockaddr_t *naddr, int proto, const char *addr, int port);
+extern mowgli_vio_sockaddr_t * mowgli_vio_sockaddr_from_struct(mowgli_vio_sockaddr_t *naddr, const void *addr, socklen_t size);
+extern int mowgli_vio_sockaddr_info(const mowgli_vio_sockaddr_t *addr, mowgli_vio_sockdata_t *data);
+
+extern int mowgli_vio_default_socket(mowgli_vio_t *vio, int family, int type, int proto);
+extern int mowgli_vio_default_bind(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr);
+extern int mowgli_vio_default_listen(mowgli_vio_t *vio, int backlog);
+extern int mowgli_vio_default_accept(mowgli_vio_t *vio, mowgli_vio_t *newvio);
+extern int mowgli_vio_default_connect(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr);
+extern int mowgli_vio_default_read(mowgli_vio_t *vio, void *buffer, size_t len);
+extern int mowgli_vio_default_write(mowgli_vio_t *vio, const void *buffer, size_t len);
+extern int mowgli_vio_default_sendto(mowgli_vio_t *vio, const void *buffer, size_t len, mowgli_vio_sockaddr_t *addr);
+extern int mowgli_vio_default_recvfrom(mowgli_vio_t *vio, void *buffer, size_t len, mowgli_vio_sockaddr_t *addr);
+extern int mowgli_vio_default_error(mowgli_vio_t *vio);
+extern int mowgli_vio_default_close(mowgli_vio_t *vio);
+extern int mowgli_vio_default_seek(mowgli_vio_t *vio, long offset, int whence);
+extern int mowgli_vio_default_tell(mowgli_vio_t *vio);
+
+extern int mowgli_vio_err_errcode(mowgli_vio_t *vio, char *(*int_to_error)(int), int errcode);
+extern int mowgli_vio_err_sslerrcode(mowgli_vio_t *vio, int errcode);
+
+extern int mowgli_vio_openssl_setssl(mowgli_vio_t *vio, mowgli_vio_ssl_settings_t *settings);
+/* These are void ptr's so they can be null ops if SSL isn't available */
+extern void * mowgli_vio_openssl_getsslhandle(mowgli_vio_t *vio);
+extern void * mowgli_vio_openssl_getsslcontext(mowgli_vio_t *vio);
+
+extern mowgli_vio_ops_t mowgli_vio_default_ops;
+
+
+/* Sundry operations on vio functables */
+#define mowgli_vio_set_op(vio, op, func) vio->ops.op = func;
+
+#define mowgli_vio_socket(vio, ...) vio->ops.socket(vio, __VA_ARGS__)
+#define mowgli_vio_listen(vio, ...) vio->ops.listen(vio, __VA_ARGS__)
+#define mowgli_vio_bind(vio, ...) vio->ops.bind(vio, __VA_ARGS__)
+#define mowgli_vio_accept(vio, ...) vio->ops.accept(vio, __VA_ARGS__)
+#define mowgli_vio_connect(vio, ...) vio->ops.connect(vio, __VA_ARGS__)
+#define mowgli_vio_read(vio, ...) vio->ops.read(vio, __VA_ARGS__)
+#define mowgli_vio_write(vio, ...) vio->ops.write(vio, __VA_ARGS__)
+#define mowgli_vio_sendto(vio, ...) vio->ops.sendto(vio, __VA_ARGS__)
+#define mowgli_vio_recvfrom(vio, ...) vio->ops.recvfrom(vio, __VA_ARGS__)
+#define mowgli_vio_error(vio) vio->ops.error(vio);
+#define mowgli_vio_close(vio) vio->ops.close(vio);
+#define mowgli_vio_seek(vio, ...) vio->ops.seek(vio, __VA_ARGS__)
+#define mowgli_vio_tell(vio) vio->ops.tell(vio)
+
+#endif
+
diff --git a/src/libmowgli/vio/vio_openssl.c b/src/libmowgli/vio/vio_openssl.c
new file mode 100644
index 0000000..75c83e4
--- /dev/null
+++ b/src/libmowgli/vio/vio_openssl.c
@@ -0,0 +1,447 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * vio_openssl.c: OpenSSL routines built on VIO
+ *
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+/* Note these routines are just defaults for clients -- if you have more
+ * specific needs, you should write your own implementation (that is the
+ * whole point of vio)
+ */
+
+#ifdef HAVE_OPENSSL
+
+typedef struct {
+ SSL *ssl_handle;
+ SSL_CTX *ssl_context;
+ mowgli_vio_ssl_settings_t settings;
+} mowgli_ssl_connection_t;
+
+static int mowgli_vio_openssl_connect(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr);
+static int mowgli_vio_openssl_listen(mowgli_vio_t *vio, int backlog);
+static int mowgli_vio_openssl_accept(mowgli_vio_t *vio, mowgli_vio_t *newvio);
+static int mowgli_vio_openssl_client_handshake(mowgli_vio_t *vio, mowgli_ssl_connection_t *connection);
+static int mowgli_vio_openssl_read(mowgli_vio_t *vio, void *buffer, size_t len);
+static int mowgli_vio_openssl_write(mowgli_vio_t *vio, const void *buffer, size_t len);
+static int mowgli_openssl_read_or_write(bool read, mowgli_vio_t *vio, void *readbuf, const void *writebuf, size_t len);
+static int mowgli_vio_openssl_close(mowgli_vio_t *vio);
+
+static mowgli_heap_t *ssl_heap = NULL;
+
+static bool openssl_init = false;
+
+int mowgli_vio_openssl_setssl(mowgli_vio_t *vio, mowgli_vio_ssl_settings_t *settings)
+{
+ mowgli_ssl_connection_t *connection;
+
+ if (!ssl_heap)
+ ssl_heap = mowgli_heap_create(sizeof(mowgli_ssl_connection_t), 64, BH_NOW);
+
+ connection = mowgli_heap_alloc(ssl_heap);
+ vio->privdata = connection;
+
+ if (settings)
+ memcpy(&connection->settings, settings, sizeof(mowgli_vio_ssl_settings_t));
+ else
+ /* Greatest compat without being terribly insecure */
+ connection->settings.ssl_version = MOWGLI_VIO_SSLFLAGS_SSLV3;
+
+ /* Change ops */
+ mowgli_vio_set_op(vio, connect, mowgli_vio_openssl_connect);
+ mowgli_vio_set_op(vio, read, mowgli_vio_openssl_read);
+ mowgli_vio_set_op(vio, write, mowgli_vio_openssl_write);
+ mowgli_vio_set_op(vio, close, mowgli_vio_openssl_close);
+ mowgli_vio_set_op(vio, accept, mowgli_vio_openssl_accept);
+ mowgli_vio_set_op(vio, listen, mowgli_vio_openssl_listen);
+
+ /* SSL setup */
+ if (!openssl_init)
+ {
+ openssl_init = true;
+ SSL_library_init();
+ SSL_load_error_strings();
+ ERR_load_BIO_strings();
+ OpenSSL_add_all_algorithms();
+ }
+
+ return 0;
+}
+
+/* Returns void so they can be stubs */
+void * mowgli_vio_openssl_getsslhandle(mowgli_vio_t *vio)
+{
+ mowgli_ssl_connection_t *connection = vio->privdata;
+ return connection->ssl_handle;
+}
+
+void * mowgli_vio_openssl_getsslcontext(mowgli_vio_t *vio)
+{
+ mowgli_ssl_connection_t *connection = vio->privdata;
+ return connection->ssl_context;
+}
+
+static int mowgli_vio_openssl_connect(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_CONNECT;
+ mowgli_ssl_connection_t *connection = vio->privdata;
+
+ if (connect(vio->fd, (struct sockaddr *)&addr->addr, addr->addrlen) < 0)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ else
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, true);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSSLCONNECTING, true);
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+ }
+ }
+
+ memcpy(&vio->addr.addr, &addr->addr, addr->addrlen);
+ vio->addr.addrlen = addr->addrlen;
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLIENT, true);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSERVER, false);
+
+ /* Non-blocking socket, begin handshake */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+ return mowgli_vio_openssl_client_handshake(vio, connection);
+}
+
+static int mowgli_vio_openssl_listen(mowgli_vio_t *vio, int backlog)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_LISTEN;
+ mowgli_ssl_connection_t *connection = vio->privdata;
+ const SSL_METHOD *method;
+
+ switch (connection->settings.ssl_version)
+ {
+ case MOWGLI_VIO_SSLFLAGS_SSLV2:
+ method = SSLv23_server_method();
+ break;
+ case MOWGLI_VIO_SSLFLAGS_SSLV3:
+ method = SSLv3_server_method();
+ break;
+ case MOWGLI_VIO_SSLFLAGS_TLSV10:
+ case MOWGLI_VIO_SSLFLAGS_TLSV11:
+ case MOWGLI_VIO_SSLFLAGS_TLSV12:
+ method = TLSv1_server_method();
+ break;
+ default:
+ /* Compat method */
+ method = SSLv23_server_method();
+ }
+
+ connection->ssl_context = SSL_CTX_new((SSL_METHOD *)method);
+ if (connection->ssl_context == NULL)
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ connection->ssl_handle = SSL_new(connection->ssl_context);
+ if (connection->ssl_handle == NULL)
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ SSL_set_accept_state(connection->ssl_handle);
+ SSL_CTX_set_options(connection->ssl_context, SSL_OP_SINGLE_DH_USE);
+
+ if (connection->settings.password_func)
+ {
+ SSL_CTX_set_default_passwd_cb(connection->ssl_context, connection->settings.password_func);
+ SSL_CTX_set_default_passwd_cb_userdata(connection->ssl_context, vio->userdata);
+ }
+
+ if (SSL_CTX_use_certificate_file(connection->ssl_context, connection->settings.cert_path, SSL_FILETYPE_PEM) != 1)
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ if (SSL_CTX_use_PrivateKey_file(connection->ssl_context, connection->settings.privatekey_path, SSL_FILETYPE_PEM) != 1)
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ if (listen(vio->fd, backlog) != 0)
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+
+ if (!SSL_set_fd(connection->ssl_handle, vio->fd))
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSERVER, true);
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+
+ return 0;
+}
+
+static int mowgli_vio_openssl_accept(mowgli_vio_t *vio, mowgli_vio_t *newvio)
+{
+ int fd;
+ int ret;
+ mowgli_ssl_connection_t *connection = vio->privdata;
+ mowgli_ssl_connection_t *newconnection;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_ACCEPT;
+
+ if (!newvio)
+ {
+ const char errstr[] = "accept not called with valid new VIO object";
+ vio->error.type = MOWGLI_VIO_ERR_API;
+ mowgli_strlcpy(vio->error.string, errstr, sizeof(errstr));
+ return mowgli_vio_error(vio);
+ }
+
+ if ((fd = accept(vio->fd, (struct sockaddr *)&newvio->addr.addr, &(newvio->addr.addrlen))) < 0)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ else
+ return 0;
+ }
+
+ newvio->fd = fd;
+
+ mowgli_vio_openssl_setssl(newvio, &connection->settings);
+ newconnection = newvio->privdata;
+ newconnection->ssl_context = connection->ssl_context;
+ newconnection->ssl_handle = SSL_new(newconnection->ssl_context);
+
+ if (!SSL_set_fd(newconnection->ssl_handle, fd))
+ return mowgli_vio_err_sslerrcode(newvio, ERR_get_error());
+
+ if ((ret = SSL_accept(newconnection->ssl_handle)) != 1)
+ {
+ unsigned long err;
+
+ switch (SSL_get_error(newconnection->ssl_handle, ret))
+ {
+ case SSL_ERROR_WANT_READ:
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, true);
+ return 0;
+ case SSL_ERROR_WANT_WRITE:
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, true);
+ return 0;
+ case SSL_ERROR_ZERO_RETURN:
+ return 0;
+ case SSL_ERROR_SYSCALL:
+ return mowgli_vio_err_errcode(newvio, strerror, errno);
+ default:
+ err = ERR_get_error();
+ break;
+ }
+
+ if(err > 0)
+ {
+ errno = EIO;
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ }
+
+ return -1;
+ }
+
+ mowgli_vio_setflag(newvio, MOWGLI_VIO_FLAGS_ISCLIENT, true);
+ mowgli_vio_setflag(newvio, MOWGLI_VIO_FLAGS_ISSERVER, false);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+}
+
+static int mowgli_vio_openssl_client_handshake(mowgli_vio_t *vio, mowgli_ssl_connection_t *connection)
+{
+ int ret;
+ const SSL_METHOD *method;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_CONNECT;
+
+ switch (connection->settings.ssl_version)
+ {
+ case MOWGLI_VIO_SSLFLAGS_SSLV2:
+ method = SSLv23_client_method();
+ break;
+ case MOWGLI_VIO_SSLFLAGS_SSLV3:
+ method = SSLv3_client_method();
+ break;
+ case MOWGLI_VIO_SSLFLAGS_TLSV10:
+ case MOWGLI_VIO_SSLFLAGS_TLSV11:
+ case MOWGLI_VIO_SSLFLAGS_TLSV12:
+ method = TLSv1_client_method();
+ break;
+ default:
+ /* Compat method */
+ method = SSLv23_client_method();
+ }
+
+ /* Cast is to eliminate an excessively bogus warning on old OpenSSL --Elizacat */
+ connection->ssl_context = SSL_CTX_new((SSL_METHOD *)method);
+ if (connection->ssl_context == NULL)
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ connection->ssl_handle = SSL_new(connection->ssl_context);
+ if (connection->ssl_handle == NULL)
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ SSL_set_connect_state(connection->ssl_handle);
+
+ if (!SSL_set_fd(connection->ssl_handle, vio->fd))
+ return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
+
+ /* XXX not what we want for blocking sockets if they're in use! */
+ SSL_CTX_set_mode(connection->ssl_context, SSL_MODE_ENABLE_PARTIAL_WRITE);
+
+ if ((ret = SSL_connect(connection->ssl_handle)) != 1)
+ {
+ int err = SSL_get_error(connection->ssl_handle, ret);
+ if (err == SSL_ERROR_WANT_READ)
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, true);
+ else if (err == SSL_ERROR_WANT_WRITE)
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, true);
+ else if (err == SSL_ERROR_WANT_CONNECT)
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, true);
+ return 0;
+ }
+ else
+ return mowgli_vio_err_sslerrcode(vio, err);
+ }
+
+ /* Connected */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSSLCONNECTING, false);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+}
+
+#define MOWGLI_VIO_SSL_DOREAD true
+#define MOWGLI_VIO_SSL_DOWRITE false
+
+static int mowgli_vio_openssl_read(mowgli_vio_t *vio, void *buffer, size_t len)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_READ;
+ return mowgli_openssl_read_or_write(MOWGLI_VIO_SSL_DOREAD, vio, buffer, NULL, len);
+}
+
+static int mowgli_vio_openssl_write(mowgli_vio_t *vio, const void *buffer, size_t len)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_WRITE;
+ return mowgli_openssl_read_or_write(MOWGLI_VIO_SSL_DOWRITE, vio, NULL, buffer, len);
+}
+
+static int mowgli_openssl_read_or_write(bool read, mowgli_vio_t *vio, void *readbuf, const void *writebuf, size_t len)
+{
+ mowgli_ssl_connection_t *connection = vio->privdata;
+ int ret;
+ unsigned long err;
+
+ /* We are connected */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+
+ if (mowgli_vio_hasflag(vio, MOWGLI_VIO_FLAGS_ISSSLCONNECTING))
+ return mowgli_vio_openssl_client_handshake(vio, connection);
+
+ return_val_if_fail(connection->ssl_handle != NULL, -1);
+
+ if(read)
+ ret = (int)SSL_read(connection->ssl_handle, readbuf, len);
+ else
+ ret = (int)SSL_write(connection->ssl_handle, writebuf, len);
+
+ if (ret < 0)
+ {
+ switch (SSL_get_error(connection->ssl_handle, ret))
+ {
+ case SSL_ERROR_WANT_READ:
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, true);
+ return 0;
+ case SSL_ERROR_WANT_WRITE:
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, true);
+ return 0;
+ case SSL_ERROR_ZERO_RETURN:
+ return 0;
+ case SSL_ERROR_SYSCALL:
+ if((err = ERR_get_error()) == 0)
+ {
+ vio->error.type = MOWGLI_VIO_ERR_REMOTE_HANGUP;
+ mowgli_strlcpy(vio->error.string, "Remote host closed the socket", sizeof(vio->error.string));
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLOSED, true);
+
+ return mowgli_vio_error(vio);
+ }
+
+ break;
+
+ default:
+ err = ERR_get_error();
+ break;
+ }
+
+ if(err > 0)
+ {
+ errno = EIO;
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ }
+
+ /* idk lol */
+ return -1;
+ }
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, false);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, false);
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return ret;
+}
+
+static int mowgli_vio_openssl_close(mowgli_vio_t *vio)
+{
+ mowgli_ssl_connection_t *connection = vio->privdata;
+
+ return_val_if_fail(connection->ssl_handle != NULL, -1);
+
+ SSL_shutdown(connection->ssl_handle);
+ SSL_free(connection->ssl_handle);
+ SSL_CTX_free(connection->ssl_context);
+
+ mowgli_heap_free(ssl_heap, connection);
+
+ MOWGLI_VIO_SET_CLOSED(vio);
+
+ close(vio->fd);
+ return 0;
+}
+
+#else
+
+int mowgli_vio_openssl_setssl(mowgli_vio_t *vio, mowgli_vio_ssl_settings_t *settings)
+{
+ mowgli_log("OpenSSL requested on a VIO object, but mowgli was built without OpenSSL support...");
+ return -1;
+}
+
+void * mowgli_vio_openssl_getsslhandle(mowgli_vio_t *vio)
+{
+ mowgli_log("Cannot get VIO SSL handle as libmowgli was built without OpenSSL support");
+ return NULL;
+}
+
+void * mowgli_vio_openssl_getsslcontext(mowgli_vio_t *vio)
+{
+ mowgli_log("Cannot get VIO SSL context as libmowgli was built without OpenSSL support");
+ return NULL;
+}
+
+#endif
+
diff --git a/src/libmowgli/vio/vio_sockets.c b/src/libmowgli/vio/vio_sockets.c
new file mode 100644
index 0000000..e36080b
--- /dev/null
+++ b/src/libmowgli/vio/vio_sockets.c
@@ -0,0 +1,423 @@
+/*
+ * libmowgli: A collection of useful routines for programming.
+ * vio-sockets.c: Plain socket I/O routines for VIO.
+ *
+ * Copyright (c) 2012 Elizabeth J. Myers. All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mowgli.h"
+
+int mowgli_vio_default_socket(mowgli_vio_t *vio, int family, int type, int proto)
+{
+ int fd;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_SOCKET;
+
+ /* We can't call socket with AF_UNSPEC on most platforms >_> */
+ if (family == AF_UNSPEC)
+ family = AF_INET6; /* This is fine, IPv4 will still work via a 6to4 mapping */
+
+ if ((fd = socket(family, type, proto)) == -1)
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+
+ vio->fd = fd;
+
+ if (family == SOCK_STREAM)
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLOSED, false);
+ }
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+}
+
+int mowgli_vio_default_bind(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_BIND;
+
+ if (bind(vio->fd, (struct sockaddr *)&addr->addr, addr->addrlen) != 0)
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+
+ memcpy(&vio->addr.addr, &addr->addr, sizeof(struct sockaddr_storage));
+ vio->addr.addrlen = addr->addrlen;
+
+ return 0;
+}
+
+int mowgli_vio_default_listen(mowgli_vio_t *vio, int backlog)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_LISTEN;
+
+ if (listen(vio->fd, backlog) < 0)
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSERVER, true);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLIENT, false);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLOSED, false);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+}
+
+int mowgli_vio_default_accept(mowgli_vio_t *vio, mowgli_vio_t *newvio)
+{
+ int fd;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_ACCEPT;
+
+ if (!newvio)
+ {
+ const char errstr[] = "accept not called with valid new VIO object";
+ vio->error.type = MOWGLI_VIO_ERR_API;
+ mowgli_strlcpy(vio->error.string, errstr, sizeof(errstr));
+ return mowgli_vio_error(vio);
+ }
+
+ if ((fd = accept(vio->fd, (struct sockaddr *)&newvio->addr.addr, &(newvio->addr.addrlen))) < 0)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ else
+ return 0;
+ }
+
+ newvio->fd = fd;
+
+ /* The new VIO object is most certainly not a server */
+ mowgli_vio_setflag(newvio, MOWGLI_VIO_FLAGS_ISCLIENT, true);
+ mowgli_vio_setflag(newvio, MOWGLI_VIO_FLAGS_ISSERVER, false);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+}
+
+int mowgli_vio_default_connect(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_CONNECT;
+
+ if (connect(vio->fd, (struct sockaddr *)&addr->addr, addr->addrlen) < 0)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ else
+ return 0;
+ }
+
+ /* XXX -- overwrites if we already used bind -- not terribly concerning as this is
+ * more interesting --Elizabeth */
+ memcpy(&vio->addr.addr, &addr->addr, sizeof(struct sockaddr_storage));
+ vio->addr.addrlen = addr->addrlen;
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLIENT, true);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSERVER, false);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, true);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLOSED, false);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return 0;
+}
+
+int mowgli_vio_default_read(mowgli_vio_t *vio, void *buffer, size_t len)
+{
+ int ret;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_READ;
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+
+ if ((ret = (int)recv(vio->fd, buffer, len, 0)) < 0)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, false);
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ }
+ else if (errno != 0)
+ {
+ /* Further reads unnecessary */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, false);
+ return 0;
+ }
+
+ if (ret == 0)
+ {
+ vio->error.type = MOWGLI_VIO_ERR_REMOTE_HANGUP;
+ mowgli_strlcpy(vio->error.string, "Remote host closed the socket", sizeof(vio->error.string));
+
+ MOWGLI_VIO_SET_CLOSED(vio);
+
+ return mowgli_vio_error(vio);
+ }
+ }
+
+ /* Do this for edge-triggered interfaces */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, true);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return ret;
+}
+
+int mowgli_vio_default_write(mowgli_vio_t *vio, const void *buffer, size_t len)
+{
+ int ret;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_WRITE;
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+
+ if ((ret = (int)send(vio->fd, buffer, len, 0)) == -1)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, false);
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ }
+ else
+ {
+ /* Further writes unnecessary */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, false);
+ return 0;
+ }
+ }
+
+ /* Set this for edge-triggered interfaces */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, true);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return ret;
+}
+
+int mowgli_vio_default_sendto(mowgli_vio_t *vio, const void *buffer, size_t len, mowgli_vio_sockaddr_t *addr)
+{
+ int ret;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_WRITE;
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+
+ if ((ret = (int)sendto(vio->fd, buffer, len, 0, (struct sockaddr *)&addr->addr, addr->addrlen)) == -1)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, false);
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ }
+ else
+ {
+ /* Further writes unnecessary */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, false);
+ return 0;
+ }
+ }
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDWRITE, true);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return ret;
+}
+
+int mowgli_vio_default_recvfrom(mowgli_vio_t *vio, void *buffer, size_t len, mowgli_vio_sockaddr_t *addr)
+{
+ int ret;
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_READ;
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+
+ if ((ret = (int)recvfrom(vio->fd, buffer, len, 0, (struct sockaddr *)&addr->addr, &addr->addrlen)) < 0)
+ {
+ if (!mowgli_eventloop_ignore_errno(errno))
+ {
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, false);
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+ }
+ else if (errno != 0)
+ {
+ /* Further reads unnecessary */
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, false);
+ return 0;
+ }
+
+ if (ret == 0)
+ {
+ vio->error.type = MOWGLI_VIO_ERR_REMOTE_HANGUP;
+ mowgli_strlcpy(vio->error.string, "Remote host closed the socket", sizeof(vio->error.string));
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, false);
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLOSED, true);
+
+ return mowgli_vio_error(vio);
+ }
+ }
+
+ mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_NEEDREAD, true);
+
+ vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
+ return ret;
+}
+
+int mowgli_vio_default_error(mowgli_vio_t *vio)
+{
+ const char *errtype;
+
+ switch (vio->error.op)
+ {
+ case MOWGLI_VIO_ERR_OP_READ:
+ errtype = "Read";
+ break;
+ case MOWGLI_VIO_ERR_OP_WRITE:
+ errtype = "Write";
+ break;
+ case MOWGLI_VIO_ERR_OP_LISTEN:
+ errtype = "Listen";
+ break;
+ case MOWGLI_VIO_ERR_OP_ACCEPT:
+ errtype = "Accept";
+ break;
+ case MOWGLI_VIO_ERR_OP_CONNECT:
+ errtype = "Connect";
+ break;
+ case MOWGLI_VIO_ERR_OP_SOCKET:
+ errtype = "Socket";
+ break;
+ case MOWGLI_VIO_ERR_OP_BIND:
+ errtype = "Bind";
+ break;
+ case MOWGLI_VIO_ERR_OP_OTHER:
+ errtype = "Application";
+ break;
+ default:
+ errtype = "Generic/Unknown";
+ }
+
+ mowgli_log("%s error: %s\n", errtype, vio->error.string);
+
+ return -1;
+}
+
+int mowgli_vio_default_close(mowgli_vio_t *vio)
+{
+ MOWGLI_VIO_SET_CLOSED(vio);
+#ifndef _WIN32
+ close(vio->fd);
+#else
+ closesocket(vio->fd);
+#endif
+ return 0;
+}
+
+int mowgli_vio_default_seek(mowgli_vio_t *vio, long offset, int whence)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_SEEK;
+ errno = ENOSYS;
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+}
+
+int mowgli_vio_default_tell(mowgli_vio_t *vio)
+{
+ vio->error.op = MOWGLI_VIO_ERR_OP_TELL;
+ errno = ENOSYS;
+ return mowgli_vio_err_errcode(vio, strerror, errno);
+}
+
+/* Generate a mowgli_sockaddr_t struct */
+mowgli_vio_sockaddr_t * mowgli_vio_sockaddr_create(mowgli_vio_sockaddr_t *naddr, int proto, const char *addr, int port)
+{
+ struct sockaddr_storage saddr;
+
+ if (naddr == NULL)
+ naddr = mowgli_alloc(sizeof(mowgli_vio_sockaddr_t));
+
+ if (proto == AF_INET)
+ {
+ struct sockaddr_in *addr_in = (struct sockaddr_in *)&saddr;
+
+ addr_in->sin_family = proto;
+ addr_in->sin_port = htons(port);
+ if (addr != NULL)
+ {
+ if (inet_pton(proto, addr, &addr_in->sin_addr) != 1)
+ mowgli_log("Error with inet_pton!");
+ }
+
+ memcpy(&naddr->addr, &saddr, sizeof(struct sockaddr_in));
+ naddr->addrlen = sizeof(struct sockaddr_in);
+ }
+ else if (proto == AF_INET6)
+ {
+ struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)&saddr;
+
+ addr_in6->sin6_family = proto;
+ addr_in6->sin6_port = htons(port);
+ if (addr != NULL)
+ {
+ if (inet_pton(proto, addr, &addr_in6->sin6_addr) != 1)
+ mowgli_log("Error with inet_pton!");
+ }
+
+ memcpy(&naddr->addr, &saddr, sizeof(struct sockaddr_in6));
+ naddr->addrlen = sizeof(struct sockaddr_in6);
+ }
+ else
+ naddr = NULL;
+
+ return naddr;
+}
+
+mowgli_vio_sockaddr_t * mowgli_vio_sockaddr_from_struct(mowgli_vio_sockaddr_t *naddr, const void *addr, socklen_t size)
+{
+ const struct sockaddr_storage *saddr = addr;
+
+ return_val_if_fail(addr != NULL, NULL);
+ return_val_if_fail(saddr->ss_family == AF_INET || saddr->ss_family == AF_INET6, NULL);
+
+ if (naddr == NULL)
+ naddr = mowgli_alloc(sizeof(mowgli_vio_sockaddr_t));
+ memcpy(&naddr->addr, saddr, size);
+ naddr->addrlen = size;
+
+ return naddr;
+}
+
+int mowgli_vio_sockaddr_info(const mowgli_vio_sockaddr_t *addr, mowgli_vio_sockdata_t *data)
+{
+ const void *sockptr;
+ const struct sockaddr *saddr = (const struct sockaddr *)&addr->addr;
+
+ if (saddr->sa_family == AF_INET)
+ {
+ const struct sockaddr_in *saddr = (const struct sockaddr_in *)&addr->addr;
+ data->port = ntohs(saddr->sin_port);
+ sockptr = &saddr->sin_addr;
+ }
+ else if (saddr->sa_family == AF_INET6)
+ {
+ const struct sockaddr_in6 *saddr = (const struct sockaddr_in6 *)&addr->addr;
+ data->port = ntohs(saddr->sin6_port);
+ sockptr = &saddr->sin6_addr;
+ }
+ else
+ return -1;
+
+ if (inet_ntop(saddr->sa_family, sockptr, data->host, sizeof(data->host)) == NULL)
+ return -1;
+
+ return 0;
+}
diff --git a/win32/libmowgli.def b/win32/libmowgli.def
deleted file mode 100644
index 0aad821..0000000
--- a/win32/libmowgli.def
+++ /dev/null
@@ -1,172 +0,0 @@
-LIBRARY libmowgli.dll
-EXPORTS
-mowgli_alloc
-mowgli_alloc_array
-mowgli_allocation_policy_create
-mowgli_allocation_policy_init
-mowgli_allocation_policy_lookup
-mowgli_allocator_init
-mowgli_allocator_malloc DATA
-mowgli_allocator_set_policy
-mowgli_allocator_set_policy_by_name
-mowgli_argstack_create
-mowgli_argstack_create_from_va_list
-mowgli_argstack_init
-mowgli_argstack_pop_boolean
-mowgli_argstack_pop_numeric
-mowgli_argstack_pop_pointer
-mowgli_argstack_pop_string
-mowgli_bitvector_combine
-mowgli_bitvector_compare
-mowgli_bitvector_create
-mowgli_bitvector_get
-mowgli_bitvector_init
-mowgli_bitvector_set
-mowgli_bitvector_xor
-mowgli_dictionary_add
-mowgli_dictionary_create
-mowgli_dictionary_create_named
-mowgli_dictionary_delete
-mowgli_dictionary_destroy
-mowgli_dictionary_find
-mowgli_dictionary_foreach
-mowgli_dictionary_foreach_cur
-mowgli_dictionary_foreach_next
-mowgli_dictionary_foreach_start
-mowgli_dictionary_get_comparator_func
-mowgli_dictionary_get_linear_index
-mowgli_dictionary_link
-mowgli_dictionary_retrieve
-mowgli_dictionary_retune
-mowgli_dictionary_search
-mowgli_dictionary_set_comparator_func
-mowgli_dictionary_size
-mowgli_dictionary_stats
-mowgli_dictionary_unlink_root
-mowgli_error_context_create
-mowgli_error_context_destroy
-mowgli_error_context_display
-mowgli_error_context_display_with_error
-mowgli_error_context_pop
-mowgli_error_context_push
-mowgli_fnv_hash
-mowgli_fnv_hash_string
-mowgli_formatter_format
-mowgli_formatter_format_from_argstack
-mowgli_formatter_print
-mowgli_free
-mowgli_global_storage_free
-mowgli_global_storage_get
-mowgli_global_storage_init
-mowgli_global_storage_put
-mowgli_heap_alloc
-mowgli_heap_create
-mowgli_heap_create_full
-mowgli_heap_destroy
-mowgli_heap_free
-mowgli_hook_associate
-mowgli_hook_call
-mowgli_hook_dissociate
-mowgli_hook_init
-mowgli_hook_register
-mowgli_init
-mowgli_ioevent_associate
-mowgli_ioevent_create
-mowgli_ioevent_destroy
-mowgli_ioevent_dissociate
-mowgli_ioevent_get
-mowgli_list_concat
-mowgli_list_create
-mowgli_list_free
-mowgli_list_reverse
-mowgli_list_sort
-mowgli_log_cb_default
-mowgli_log_real
-mowgli_log_set_cb
-mowgli_mempool_add
-mowgli_mempool_allocate
-mowgli_mempool_cleanup
-mowgli_mempool_create
-mowgli_mempool_destroy
-mowgli_mempool_release
-mowgli_mempool_strdup
-mowgli_mempool_sustain
-mowgli_mempool_with_custom_destructor
-mowgli_module_close
-mowgli_module_open
-mowgli_module_symbol
-mowgli_node_add
-mowgli_node_add_after
-mowgli_node_add_before
-mowgli_node_add_head
-mowgli_node_create
-mowgli_node_delete
-mowgli_node_find
-mowgli_node_free
-mowgli_node_index
-mowgli_node_init
-mowgli_node_insert
-mowgli_node_move
-mowgli_node_nth
-mowgli_node_nth_data
-mowgli_object_class_check_cast
-mowgli_object_class_destroy
-mowgli_object_class_find_by_name
-mowgli_object_class_init
-mowgli_object_class_message_handler_attach
-mowgli_object_class_message_handler_detach
-mowgli_object_class_reinterpret_impl
-mowgli_object_class_set_derivitive
-mowgli_object_init
-mowgli_object_init_from_class
-mowgli_object_message_broadcast
-mowgli_object_message_handler_attach
-mowgli_object_message_handler_detach
-mowgli_object_metadata_associate
-mowgli_object_metadata_dissociate
-mowgli_object_metadata_retrieve
-mowgli_object_ref
-mowgli_object_unref
-mowgli_patricia_add
-mowgli_patricia_create
-mowgli_patricia_create_named
-mowgli_patricia_delete
-mowgli_patricia_destroy
-mowgli_patricia_foreach
-mowgli_patricia_foreach_cur
-mowgli_patricia_foreach_next
-mowgli_patricia_foreach_start
-mowgli_patricia_retrieve
-mowgli_patricia_search
-mowgli_patricia_size
-mowgli_patricia_stats
-mowgli_queue_destroy
-mowgli_queue_find
-mowgli_queue_head
-mowgli_queue_init
-mowgli_queue_length
-mowgli_queue_pop_head
-mowgli_queue_pop_tail
-mowgli_queue_push
-mowgli_queue_remove
-mowgli_queue_remove_data
-mowgli_queue_rewind
-mowgli_queue_shift
-mowgli_queue_skip
-mowgli_queue_tail
-mowgli_random_create
-mowgli_random_create_with_seed
-mowgli_random_init
-mowgli_random_int
-mowgli_random_int_ranged
-mowgli_random_reseed
-mowgli_spinlock_create
-mowgli_spinlock_lock
-mowgli_spinlock_timed_wait
-mowgli_spinlock_unlock
-mowgli_spinlock_wait
-mowgli_string_append
-mowgli_string_append_char
-mowgli_string_create
-mowgli_string_destroy
-mowgli_string_reset
diff --git a/win32/libmowgli/VS2008/VS2008.vcproj b/win32/libmowgli/VS2008/VS2008.vcproj
deleted file mode 100644
index 4c7e6f2..0000000
--- a/win32/libmowgli/VS2008/VS2008.vcproj
+++ /dev/null
@@ -1,567 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="libmowgli"
- ProjectGUID="{69282042-6A25-4FAA-A895-D9ADC1C8578A}"
- RootNamespace="VS2008"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_MSC"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_MSC"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_alloc.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_allocation_policy.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_allocator.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_argstack.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_bitvector.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_dictionary.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_error_backtrace.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_formatter.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_global_storage.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_hash.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_heap.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_hook.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_init.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_ioevent.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_list.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_logger.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_mempool.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_module.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object_class.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object_messaging.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object_metadata.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_patricia.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_queue.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_random.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_signal.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_spinlock.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_string.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\win32_dlfcn.c"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\win32_support.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_alloc.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_allocation_policy.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_allocator.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_argstack.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_assert.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_bitvector.h"
- >
- </File>
- <File
- RelativePath="..\..\mowgli_config.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_dictionary.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_error_backtrace.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_exception.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_formatter.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_global_storage.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_hash.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_heap.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_hook.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_init.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_ioevent.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_iterator.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_list.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_logger.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_mempool.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_module.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object_class.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object_messaging.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_object_metadata.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_patricia.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_queue.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_random.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_signal.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_spinlock.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_stdinc.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\mowgli_string.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\win32_dlfcn.h"
- >
- </File>
- <File
- RelativePath="..\..\..\src\libmowgli\win32_support.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/win32/libmowgli/dicttest/dicttest.vcproj b/win32/libmowgli/dicttest/dicttest.vcproj
deleted file mode 100644
index 3125276..0000000
--- a/win32/libmowgli/dicttest/dicttest.vcproj
+++ /dev/null
@@ -1,353 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="dicttest"
- ProjectGUID="{6FF42EB1-2309-4BC1-8555-6E908D8C3456}"
- RootNamespace="dicttest"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\src\examples\dicttest\dicttest.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- <File
- RelativePath=".\ReadMe.txt"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/win32/libmowgli/formattertest/formattertest.vcproj b/win32/libmowgli/formattertest/formattertest.vcproj
deleted file mode 100644
index 83a27ce..0000000
--- a/win32/libmowgli/formattertest/formattertest.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="formattertest"
- ProjectGUID="{6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}"
- RootNamespace="formattertest"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\src\examples\formattertest\formattertest.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/win32/libmowgli/libmowgli.sln b/win32/libmowgli/libmowgli.sln
deleted file mode 100644
index a1e2ddb..0000000
--- a/win32/libmowgli/libmowgli.sln
+++ /dev/null
@@ -1,75 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmowgli", "VS2008\VS2008.vcxproj", "{69282042-6A25-4FAA-A895-D9ADC1C8578A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dicttest", "dicttest\dicttest.vcxproj", "{6FF42EB1-2309-4BC1-8555-6E908D8C3456}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "patriciatest", "patriciatest\patriciatest.vcxproj", "{30AF49E3-599D-4FD1-8634-E678DA6F5D10}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "listsort", "listsort\listsort.vcxproj", "{4868661C-ED5B-4C08-BE53-661BE8DB4E78}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "randomtest", "randomtest\randomtest.vcxproj", "{AA35FFE8-2C92-49DF-8466-051F032145E0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "formattertest", "formattertest\formattertest.vcxproj", "{6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Debug|x64 = Debug|x64
- Release|Win32 = Release|Win32
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Debug|Win32.ActiveCfg = Debug|Win32
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Debug|Win32.Build.0 = Debug|Win32
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Debug|x64.ActiveCfg = Debug|x64
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Debug|x64.Build.0 = Debug|x64
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Release|Win32.ActiveCfg = Release|Win32
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Release|Win32.Build.0 = Release|Win32
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Release|x64.ActiveCfg = Release|x64
- {69282042-6A25-4FAA-A895-D9ADC1C8578A}.Release|x64.Build.0 = Release|x64
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Debug|Win32.ActiveCfg = Debug|Win32
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Debug|Win32.Build.0 = Debug|Win32
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Debug|x64.ActiveCfg = Debug|x64
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Debug|x64.Build.0 = Debug|x64
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Release|Win32.ActiveCfg = Release|Win32
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Release|Win32.Build.0 = Release|Win32
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Release|x64.ActiveCfg = Release|x64
- {6FF42EB1-2309-4BC1-8555-6E908D8C3456}.Release|x64.Build.0 = Release|x64
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Debug|Win32.ActiveCfg = Debug|Win32
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Debug|Win32.Build.0 = Debug|Win32
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Debug|x64.ActiveCfg = Debug|x64
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Debug|x64.Build.0 = Debug|x64
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Release|Win32.ActiveCfg = Release|Win32
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Release|Win32.Build.0 = Release|Win32
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Release|x64.ActiveCfg = Release|x64
- {30AF49E3-599D-4FD1-8634-E678DA6F5D10}.Release|x64.Build.0 = Release|x64
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Debug|Win32.ActiveCfg = Debug|Win32
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Debug|Win32.Build.0 = Debug|Win32
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Debug|x64.ActiveCfg = Debug|x64
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Debug|x64.Build.0 = Debug|x64
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Release|Win32.ActiveCfg = Release|Win32
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Release|Win32.Build.0 = Release|Win32
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Release|x64.ActiveCfg = Release|x64
- {4868661C-ED5B-4C08-BE53-661BE8DB4E78}.Release|x64.Build.0 = Release|x64
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Debug|Win32.ActiveCfg = Debug|Win32
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Debug|Win32.Build.0 = Debug|Win32
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Debug|x64.ActiveCfg = Debug|x64
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Debug|x64.Build.0 = Debug|x64
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Release|Win32.ActiveCfg = Release|Win32
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Release|Win32.Build.0 = Release|Win32
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Release|x64.ActiveCfg = Release|x64
- {AA35FFE8-2C92-49DF-8466-051F032145E0}.Release|x64.Build.0 = Release|x64
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Debug|Win32.ActiveCfg = Debug|Win32
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Debug|Win32.Build.0 = Debug|Win32
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Debug|x64.ActiveCfg = Debug|x64
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Debug|x64.Build.0 = Debug|x64
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Release|Win32.ActiveCfg = Release|Win32
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Release|Win32.Build.0 = Release|Win32
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Release|x64.ActiveCfg = Release|x64
- {6C94E593-E1A7-4BA7-9465-4EF2CDC1FE3D}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/win32/libmowgli/listsort/listsort.vcproj b/win32/libmowgli/listsort/listsort.vcproj
deleted file mode 100644
index ebf19f8..0000000
--- a/win32/libmowgli/listsort/listsort.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="listsort"
- ProjectGUID="{4868661C-ED5B-4C08-BE53-661BE8DB4E78}"
- RootNamespace="listsort"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\src\examples\listsort\listsort.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/win32/libmowgli/patriciatest/patriciatest.vcproj b/win32/libmowgli/patriciatest/patriciatest.vcproj
deleted file mode 100644
index 8fcdeea..0000000
--- a/win32/libmowgli/patriciatest/patriciatest.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="patriciatest"
- ProjectGUID="{30AF49E3-599D-4FD1-8634-E678DA6F5D10}"
- RootNamespace="patriciatest"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\src\examples\patriciatest\patriciatest.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/win32/libmowgli/randomtest/randomtest.vcproj b/win32/libmowgli/randomtest/randomtest.vcproj
deleted file mode 100644
index b5567ea..0000000
--- a/win32/libmowgli/randomtest/randomtest.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="randomtest"
- ProjectGUID="{AA35FFE8-2C92-49DF-8466-051F032145E0}"
- RootNamespace="randomtest"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- <Platform
- Name="x64"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- CompileAs="1"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|x64"
- OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TargetEnvironment="3"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="&quot;..\..\..\src\libmowgli&quot;"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="17"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\src\examples\randomtest\randomtest.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/win32/mowgli_config.h b/win32/mowgli_config.h
deleted file mode 100644
index 35b6a73..0000000
--- a/win32/mowgli_config.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/* src/libmowgli/mowgli_config.h. Generated from mowgli_config.h.in by configure. */
-/* src/libmowgli/mowgli_config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define to 1 if the `closedir' function returns void instead of `int'. */
-/* #undef CLOSEDIR_VOID */
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
- */
-#define HAVE_DIRENT_H 1
-
-/* Define to 1 if you have the `epoll_ctl' function. */
-/*#define HAVE_EPOLL_CTL 1*/
-
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#define HAVE_GETTIMEOFDAY 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `memset' function. */
-#define HAVE_MEMSET 1
-
-/* Define to 1 if you have the `mmap' function. */
-/*#define HAVE_MMAP 1*/
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-/* #undef HAVE_NDIR_H */
-
-/* Define to 1 if you have the `port_create' function. */
-/* #undef HAVE_PORT_CREATE */
-
-/* Define to 1 if you have the `printf' function. */
-#define HAVE_PRINTF 1
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if you have the `snprintf' function. */
-#define HAVE_SNPRINTF 1
-
-/* Define to 1 if you have the `sprintf' function. */
-#define HAVE_SPRINTF 1
-
-/* Define to 1 if `stat' has the bug that it succeeds when given the
- zero-length file name argument. */
-/* #undef HAVE_STAT_EMPTY_STRING_BUG */
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the `strchr' function. */
-#define HAVE_STRCHR 1
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strlcat' function. */
-/* #undef HAVE_STRLCAT */
-
-/* Define to 1 if you have the `strlcpy' function. */
-/* #undef HAVE_STRLCPY */
-
-/* Define to 1 if you have the `strndup' function. */
-#define HAVE_STRNDUP 1
-
-/* Define to 1 if you have the `strtod' function. */
-#define HAVE_STRTOD 1
-
-/* Define to 1 if you have the `strtol' function. */
-#define HAVE_STRTOL 1
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
- */
-/* #undef HAVE_SYS_DIR_H */
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
- */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#define HAVE_VSNPRINTF 1
-
-/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
- slash. */
-#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bugs+libmowgli@atheme.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "libmowgli"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "libmowgli 0.7.0"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "libmowgli"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "0.7.0"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */