pax_global_header00006660000000000000000000000064117435167160014525gustar00rootroot0000000000000052 comment=d6d4c017837440332fbb348e1ce2cd08bfe20b33 libmowgli-2-libmowgli-2.0.0/000077500000000000000000000000001174351671600156335ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/.gitignore000066400000000000000000000013521174351671600176240ustar00rootroot00000000000000aclocal.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 libmowgli-2-libmowgli-2.0.0/AUTHORS000066400000000000000000000004451174351671600167060ustar00rootroot00000000000000Patrick McFarland William Pitcock Jonathan Schleifer Pippijn van Steenhoven Jilles Tjoelker Elizabeth Myers libmowgli-2-libmowgli-2.0.0/COPYING000066400000000000000000000020611174351671600166650ustar00rootroot00000000000000Copyright (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 copyright notice and this permission notice is present in all copies. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. libmowgli-2-libmowgli-2.0.0/GIT-Access000066400000000000000000000003771174351671600174070ustar00rootroot00000000000000The libmowgli GIT repository can be checked out using the following command: 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: http://git.atheme.org/ libmowgli-2-libmowgli-2.0.0/Makefile000066400000000000000000000010401174351671600172660ustar00rootroot00000000000000SUBDIRS = src DISTCLEAN = extra.mk buildsys.mk config.log config.status libmowgli-2.pc include buildsys.mk install-extra: i="libmowgli-2.pc"; \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${libdir}/pkgconfig && ${INSTALL} -m 644 $$i ${DESTDIR}${libdir}/pkgconfig/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi uninstall-extra: i="libmowgli-2.pc"; \ if [ -f ${DESTDIR}${libdir}/pkgconfig/$$i ]; then \ if rm -f ${DESTDIR}${libdir}/pkgconfig/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi libmowgli-2-libmowgli-2.0.0/README000066400000000000000000000056051174351671600165210ustar00rootroot00000000000000libmowgli - A useful collection of routines for programming -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- libmowgli is a free but copyrighted library, check COPYING for details. Contents -------- 1. What is libmowgli? 2. Installation 3. Bug Reports What is libmowgli? ------------------ libmowgli is a class library containing performance and usability oriented extensions to C. It contains: - mowgli_alloc: A safe wrapper around malloc/free. - 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_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. - mowgli_formatter: A simple token formatter which is sometimes useful. - mowgli_global_storage: A simple global storage library. - mowgli_hash: A portable implementation of the FNV-1 hash. - 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_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_module: A wrapper around dlopen(3) and dlsym(3). - mowgli_object: A simple class which provides reference counted pointers and polymorphism of structs. - mowgli_object_class: Classing and subclassing for objects. - mowgli_object_metadata: Metadata for objects. - mowgli_object_messaging: Messaging and signalling for objects. - 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_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 implemented. More information is available at http://www.atheme.org/projects/mowgli.shtml. Installation ------------ Installation is fairly typical: $ ./configure $ make $ sudo make install (If sudo isn't on your system, su to root. On GNU systems you can even do "su -c 'make install'", which is basically the same thing as using sudo.) Bug Reports ----------- Bugs can be reported on our tracker at http://jira.atheme.org against the libmowgli product. libmowgli-2-libmowgli-2.0.0/autogen.sh000077500000000000000000000027571174351671600176470ustar00rootroot00000000000000#! /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 libmowgli-2-libmowgli-2.0.0/buildsys.mk.in000066400000000000000000000460221174351671600204330ustar00rootroot00000000000000# # Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 # Jonathan Schleifer # # 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 # copyright notice and this permission notice is present in all copies. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. # PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ AS = @AS@ CC = @CC@ CXX = @CXX@ CPP = @CPP@ DC = @DC@ ERLC = @ERLC@ OBJC = @OBJC@ OBJCXX = @OBJCXX@ AR = @AR@ LD = ${CC} RANLIB = @RANLIB@ PYTHON = @PYTHON@ ASFLAGS = @ASFLAGS@ CFLAGS = @CFLAGS@ CXXFLAGS = @CXXFLAGS@ CPPFLAGS = @CPPFLAGS@ DFLAGS = @DFLAGS@ 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_CFLAGS = @LIB_CFLAGS@ LIB_LDFLAGS = @LIB_LDFLAGS@ LIB_PREFIX = @LIB_PREFIX@ LIB_SUFFIX = @LIB_SUFFIX@ PLUGIN_CFLAGS = @PLUGIN_CFLAGS@ PLUGIN_LDFLAGS = @PLUGIN_LDFLAGS@ PLUGIN_SUFFIX = @PLUGIN_SUFFIX@ INSTALL_LIB = @INSTALL_LIB@ UNINSTALL_LIB = @UNINSTALL_LIB@ CLEAN_LIB = @CLEAN_LIB@ LN_S = @LN_S@ 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_NAME} datarootdir = @datarootdir@ datadir = @datadir@ includedir = @includedir@ 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:.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 .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: ${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 $$?; \ ${DIR_LEAVE}; \ done depend: pre-depend ${SRCS} regen=0; \ deps=""; \ test -f .deps || regen=1; \ for i in ${SRCS}; do \ case $$i in \ *.c | *.cc | *.cxx | *.m | *.mm | *.S) \ test $$i -nt .deps && regen=1; \ deps="$$deps $$i.dep"; \ ;; \ esac; \ done; \ if test x"$$regen" = x"1" -a x"$$deps" != x""; then \ ${DEPEND_STATUS}; \ if ${MAKE} ${MFLAGS} $$deps && cat $$deps >.deps; then \ rm -f $$deps; \ ${DEPEND_OK}; \ else \ :> .deps; \ touch -t 0001010000 .deps; \ ${DEPEND_FAILED}; \ fi; \ fi .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} ${OBJS_EXTRA} ${LINK_STATUS} if ${LD} -o $@ ${OBJS} ${OBJS_EXTRA} ${LDFLAGS} ${LIBS}; then \ ${LINK_OK}; \ else \ ${LINK_FAILED}; \ fi ${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} ${PLUGIN_OBJS} ${LINK_STATUS} 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; \ for i in $$ars; do \ dir=".$$(echo $$i | sed 's/\//_/g').objs"; \ rm -fr $$dir; \ done ${STATIC_LIB} ${STATIC_LIB_NOINST}: ${EXT_DEPS} ${OBJS} ${OBJS_EXTRA} ${LINK_STATUS} 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; \ 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} if ${CC} ${CFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ 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} if ${CXX} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ 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} if test x"$(basename ${DC})" = x"dmd"; then \ if ${DC} ${DFLAGS} -c -of$@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi \ else \ if ${DC} ${DFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi \ fi .erl.beam: ${COMPILE_STATUS} if ${ERLC} ${ERLCFLAGS} -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${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 \ ${COMPILE_OK}; \ 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} if ${OBJCXX} ${OBJCXXFLAGS} ${OBJCFLAGS} ${CXXFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ 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.mo: ${COMPILE_STATUS} if ${MSGFMT} -c -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .py.pyc: ${COMPILE_STATUS} if ${PYTHON} ${PYTHON_FLAGS} -c "import py_compile; py_compile.compile('$<')"; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .rc.o .rc.lib.o .rc.plugin.o: ${COMPILE_STATUS} if ${WINDRES} ${CPPFLAGS} -J rc -O coff -o $@ $<; then \ ${COMPILE_OK}; \ else \ ${COMPILE_FAILED}; \ fi .S.o: ${COMPILE_STATUS} if ${AS} ${ASFLAGS} ${CPPFLAGS} -c -o $@ $<; then \ ${COMPILE_OK}; \ 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: ${SHARED_LIB} ${STATIC_LIB} ${STATIC_PIC_LIB} ${PLUGIN} ${PROG} install-extra for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} install || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${SHARED_LIB}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${libdir} ${INSTALL_LIB}; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done 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}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${PLUGIN}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${plugindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${plugindir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${DATA}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} $$(dirname ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i) && ${INSTALL} -m 644 $$i ${DESTDIR}${datadir}/${PACKAGE_NAME}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${PROG}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${bindir} && ${INSTALL} -m 755 $$i ${DESTDIR}${bindir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done for i in ${INCLUDES}; do \ ${INSTALL_STATUS}; \ if ${MKDIR_P} ${DESTDIR}${includedir}/${includesubdir} && ${INSTALL} -m 644 $$i ${DESTDIR}${includedir}/${includesubdir}/$$i; then \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ 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 \ ${INSTALL_OK}; \ else \ ${INSTALL_FAILED}; \ fi \ done install-extra: uninstall: uninstall-extra for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} uninstall || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${SHARED_LIB}; do \ if test -f ${DESTDIR}${libdir}/$$i; then \ if : ${UNINSTALL_LIB}; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi; \ done 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}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done for i in ${PLUGIN}; do \ if test -f ${DESTDIR}${plugindir}/$$i; then \ if rm -f ${DESTDIR}${plugindir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done -rmdir ${DESTDIR}${plugindir} >/dev/null 2>&1 for i in ${DATA}; do \ 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; \ 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 \ if rm -f ${DESTDIR}${bindir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done for i in ${INCLUDES}; do \ if test -f ${DESTDIR}${includedir}/${includesubdir}/$$i; then \ if rm -f ${DESTDIR}${includedir}/${includesubdir}/$$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ 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 \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done uninstall-extra: clean: for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} clean || exit $$?; \ ${DIR_LEAVE}; \ done 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}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done distclean: clean for i in ${SUBDIRS}; do \ ${DIR_ENTER}; \ ${MAKE} ${MFLAGS} distclean || exit $$?; \ ${DIR_LEAVE}; \ done for i in ${DISTCLEAN} .deps *~; do \ if test -f $$i -o -d $$i; then \ if rm -fr $$i; then \ ${DELETE_OK}; \ else \ ${DELETE_FAILED}; \ fi \ fi \ done 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 libmowgli-2-libmowgli-2.0.0/config.guess000077500000000000000000001274321174351671600201640ustar00rootroot00000000000000#! /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, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # 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, see . # # 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. Please send patches (context # diff format) to and include a 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. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD 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 ." 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, 2006, 2007, 2008, 2009, 2010, 2011, 2012 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 # 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 tuples: *-*-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 ;; sh5el) machine=sh5le-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 -q __ELF__ 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'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; 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 ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; 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:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-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 /* 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 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:*:[4567]) 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 #include 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 -q __LP64__ 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 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:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-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 ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu 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 -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu 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-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu 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.[02]*:*) 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' /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 i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-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; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' 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; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; 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.[02]*:*) 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 echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # 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 ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku 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 ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-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 i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; 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 ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} 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 ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx 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 < # include #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 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 # 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 < 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: libmowgli-2-libmowgli-2.0.0/config.rpath000077500000000000000000000440121174351671600201440ustar00rootroot00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2010 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # 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. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in 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++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; 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' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; 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. aix_use_runtimelinking=no else aix_use_runtimelinking=no # 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].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; 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 # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) 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 ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; 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`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # 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' ;; 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* | 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*) ;; 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 ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; 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=/' <. # # 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 . Submit a context # diff and a properly formatted GNU 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. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # 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 ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 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-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) 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 | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -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 \ | aarch64 | aarch64_be \ | 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 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | 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 \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-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-* \ | aarch64-* | aarch64_be-* \ | 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-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | 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-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | 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-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # 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 ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; 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 ;; cr16 | cr16-*) basic_machine=cr16-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 ;; dicos) basic_machine=i686-pc os=-dicos ;; 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*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 ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; 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-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; 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 ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) 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 ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; 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 ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-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[24]aeb | 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. -auroraux) os=-auroraux ;; -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* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -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* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -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* | -drops* | -es*) # 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 ;; -dicos*) os=-dicos ;; -nacl*) ;; -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 score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; 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 ;; -cnk*|-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: libmowgli-2-libmowgli-2.0.0/configure000077500000000000000000005303251174351671600175520ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for libmowgli-2 2.0.0. # # Report bugs to . # # # 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: http://jira.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 &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-2' PACKAGE_TARNAME='libmowgli-2' PACKAGE_VERSION='2.0.0' PACKAGE_STRING='libmowgli-2 2.0.0' PACKAGE_BUGREPORT='http://jira.atheme.org/' PACKAGE_URL='' ac_unique_file="src" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TERM_SETAF6 TERM_SETAF4 TERM_SETAF3 TERM_SETAF2 TERM_SETAF1 TERM_BOLD TERM_SGR0 TERM_EL TPUT EXAMPLES_BUILD OPENSSL_LDFLAGS OPENSSL_LIBS OPENSSL_INCLUDES PKG_CONFIG LIBMOWGLI_MODULE_BUILD LIBMOWGLI_STATIC_MODULES LIBMOWGLI_SHARED_MODULES LIBMOWGLI_OS PTHREAD_CFLAGS PTHREAD_LIBS acx_pthread_config LIBMOWGLI_STATIC_LIB LIBMOWGLI_SHARED_LIB PROG_IMPLIB_LDFLAGS PROG_IMPLIB_NEEDED CLEAN_LIB UNINSTALL_LIB INSTALL_LIB PLUGIN_SUFFIX PLUGIN_LDFLAGS PLUGIN_CFLAGS LDFLAGS_RPATH LIB_SUFFIX LIB_PREFIX LIB_LDFLAGS LIB_CFLAGS LIBMOWGLI_MODULES RANLIB AR EGREP GREP LN_S INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM CPP 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_shared enable_static with_openssl 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-2 2.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-2] --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-2 2.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] --disable-shared do not build shared library --enable-static build static library --enable-examples build examples Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-openssl=DIR root of the OpenSSL directory Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory 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 . _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-2 configure 2.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_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_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 http://jira.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_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_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_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_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 declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #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-2 $as_me 2.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/platform/autoconf.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}- 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 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 #include #include #include /* 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 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 to if __STDC__ is defined, since # 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 #else # include #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 _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 to if __STDC__ is defined, since # 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 #else # include #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 _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 # 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 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" 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_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : fi if test "x$ac_cv_prog_cc_c99" = "xno"; then : as_fn_error 1 "C compiler does not support C99" "$LINENO" 5 fi MORECFLAGS="-pipe -Wall -Wextra -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers" if test "x$GCC" = "xyes"; then : CFLAGS="$CFLAGS $MORECFLAGS" fi { $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 #include #include #include 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 _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 _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 #include #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 poll.h winsock2.h sys/epoll.h sys/select.h sys/pstat.h sys/prctl.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 for ac_func in fcntl kqueue mmap select dispatch_block port_create setproctitle pstat 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 for PS_STRINGS" >&5 $as_echo_n "checking for PS_STRINGS... " >&6; } if ${pgac_cv_var_PS_STRINGS+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { PS_STRINGS->ps_nargvstr = 1; PS_STRINGS->ps_argvstr = "foo"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : pgac_cv_var_PS_STRINGS=yes else pgac_cv_var_PS_STRINGS=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_var_PS_STRINGS" >&5 $as_echo "$pgac_cv_var_PS_STRINGS" >&6; } if test "$pgac_cv_var_PS_STRINGS" = yes ; then $as_echo "#define HAVE_PS_STRINGS /**/" >>confdefs.h fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; 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_path_AR+:} false; then : $as_echo_n "(cached) " >&6 else case $AR in [\\/]* | ?:[\\/]*) ac_cv_path_AR="$AR" # Let the user override the test with a path. ;; *) 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_path_AR="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi AR=$ac_cv_path_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; 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_path_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else case $RANLIB in [\\/]* | ?:[\\/]*) ac_cv_path_RANLIB="$RANLIB" # Let the user override the test with a path. ;; *) 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_path_RANLIB="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi RANLIB=$ac_cv_path_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi LIBMOWGLI_MODULES="core base container dns eventloop ext linebuf module object thread vio" LIBMOWGLI_MODULE_BUILD="$(echo && echo x)" LIBMOWGLI_MODULE_BUILD="${LIBMOWGLI_MODULE_BUILD%x}" LIBMOWGLI_SHARED_MODULES="" # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; fi if test x"$enable_shared" != x"no"; then : { $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_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_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*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: Solaris" >&5 $as_echo "Solaris" >&6; } 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_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}' CLEAN_LIB='' ;; openbsd* | mirbsd*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: OpenBSD" >&5 $as_echo "OpenBSD" >&6; } LIB_CFLAGS='-fPIC -DPIC' LIB_LDFLAGS='-shared' LIB_PREFIX='lib' LIB_SUFFIX='.so.${LIB_MAJOR}.${LIB_MINOR}' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' 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' CLEAN_LIB='' ;; cygwin* | mingw*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: Win32" >&5 $as_echo "Win32" >&6; } LIB_CFLAGS='' LIB_LDFLAGS='-shared -Wl,--out-implib,${SHARED_LIB}.a' LIB_PREFIX='lib' LIB_SUFFIX='.dll' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' 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='${SHARED_LIB}.a' ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: GNU" >&5 $as_echo "GNU" >&6; } 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_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' CLEAN_LIB='' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need an implib" >&5 $as_echo_n "checking whether we need an implib... " >&6; } case "$host_os" in cygwin* | mingw*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } PROG_IMPLIB_NEEDED='yes' PROG_IMPLIB_LDFLAGS='-Wl,-export-all-symbols,--out-implib,lib${PROG}.a' ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PROG_IMPLIB_NEEDED='no' PROG_IMPLIB_LDFLAGS='' ;; esac 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 fi LIBMOWGLI_STATIC_MODULES="" # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; fi if test x"$enable_static" = x"yes" -o x"$enable_shared" = x"no"; then : 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking OS type" >&5 $as_echo_n "checking OS type... " >&6; } case "$target" in *-*-mingw32) { $as_echo "$as_me:${as_lineno-$LINENO}: result: win32" >&5 $as_echo "win32" >&6; } LIBMOWGLI_OS="win32" LIBS="$LIBS -lwsock32 -lws2_32" if test x"$LIBMOWGLI_SHARED_MODULES" != x""; then : 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}" fi if test x"$LIBMOWGLI_STATIC_MODULES" != x""; then : 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}" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: posix" >&5 $as_echo "posix" >&6; } LIBMOWGLI_OS="posix" 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } 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 pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } 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) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" PTHREAD_LIBS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; 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_acx_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$acx_pthread_config"; then ac_cv_prog_acx_pthread_config="$acx_pthread_config" # 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_acx_pthread_config="yes" $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 test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" fi fi acx_pthread_config=$ac_cv_prog_acx_pthread_config if test -n "$acx_pthread_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 $as_echo "$acx_pthread_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } 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. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { 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); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int attr=$attr; return attr; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h : else acx_pthread_ok=no fi CPPFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" { $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 ;; esac OPENSSL="no" found=false # Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; case "$withval" in "" | y | ye | yes | n | no) as_fn_error $? "Invalid --with-openssl value" "$LINENO" 5 ;; *) ssldirs="$withval" ;; esac else # if pkg-config is installed and openssl has installed a .pc file, # then use that information and don't search ssldirs # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; 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_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) 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_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 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 fi # note that we #include , so the OpenSSL headers have to be in # an 'openssl' subdirectory if ! $found; then OPENSSL_INCLUDES= for ssldir in $ssldirs; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl/ssl.h in $ssldir" >&5 $as_echo_n "checking for openssl/ssl.h in $ssldir... " >&6; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } break else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiling and linking against OpenSSL works" >&5 $as_echo_n "checking whether compiling and linking against OpenSSL works... " >&6; } echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \ "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&5 save_LIBS="$LIBS" save_LDFLAGS="$LDFLAGS" save_CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS" LIBS="$OPENSSL_LIBS $LIBS" CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { SSL_new(NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } OPENSSL="yes" $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" if test x"$OPENSSL" = x"yes"; then : LIBS="$LIBS $OPENSSL_LIBS" LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS" CPPFLAGS="$CPPFLAGS $OPENSSL_INCLUDES" fi EXAMPLES_BUILD="" EXAMPLES="no" # Check whether --enable-examples was given. if test "${enable_examples+set}" = set; then : enableval=$enable_examples; fi if test x"$enable_examples" = x"yes"; then : EXAMPLES_BUILD="examples" EXAMPLES="yes" fi # Extract the first word of "tput", so it can be a program name with args. set dummy tput; 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_path_TPUT+:} false; then : $as_echo_n "(cached) " >&6 else case $TPUT in [\\/]* | ?:[\\/]*) ac_cv_path_TPUT="$TPUT" # Let the user override the test with a path. ;; *) 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_path_TPUT="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi TPUT=$ac_cv_path_TPUT if test -n "$TPUT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TPUT" >&5 $as_echo "$TPUT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$TPUT" != x""; then : if x=$($TPUT el 2>/dev/null); then TERM_EL="$x" else TERM_EL="$($TPUT ce 2>/dev/null)" fi if x=$($TPUT sgr0 2>/dev/null); then TERM_SGR0="$x" else TERM_SGR0="$($TPUT me 2>/dev/null)" fi if x=$($TPUT bold 2>/dev/null); then TERM_BOLD="$x" else TERM_BOLD="$($TPUT md 2>/dev/null)" fi if x=$($TPUT setaf 1 2>/dev/null); then TERM_SETAF1="$x" TERM_SETAF2="$($TPUT setaf 2 2>/dev/null)" TERM_SETAF3="$($TPUT setaf 3 2>/dev/null)" TERM_SETAF4="$($TPUT setaf 4 2>/dev/null)" TERM_SETAF6="$($TPUT setaf 6 2>/dev/null)" else TERM_SETAF1="$($TPUT AF 1 2>/dev/null)" TERM_SETAF2="$($TPUT AF 2 2>/dev/null)" TERM_SETAF3="$($TPUT AF 3 2>/dev/null)" TERM_SETAF4="$($TPUT AF 4 2>/dev/null)" TERM_SETAF6="$($TPUT AF 6 2>/dev/null)" fi else TERM_EL='\033\133K' TERM_SGR0='\033\133m' TERM_BOLD='\033\1331m' TERM_SETAF1='\033\13331m' TERM_SETAF2='\033\13332m' TERM_SETAF3='\033\13333m' TERM_SETAF4='\033\13334m' TERM_SETAF6='\033\13336m' 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-2.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-2 $as_me 2.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 ." _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-2 config.status 2.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/platform/autoconf.h") CONFIG_HEADERS="$CONFIG_HEADERS src/libmowgli/platform/autoconf.h" ;; "buildsys.mk") CONFIG_FILES="$CONFIG_FILES buildsys.mk" ;; "extra.mk") CONFIG_FILES="$CONFIG_FILES extra.mk" ;; "libmowgli-2.pc") CONFIG_FILES="$CONFIG_FILES libmowgli-2.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` 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 ' >$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 ' >$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: OpenSSL support: ${OPENSSL} Examples: ${EXAMPLES} Now type "make" to build, and "make install" to install. Thank you for using libmowgli. _EOF_ libmowgli-2-libmowgli-2.0.0/configure.ac000066400000000000000000000112051174351671600201200ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) 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 AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S 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 #include ], [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 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) 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}" ]) ;; *) 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_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" ]) EXAMPLES_BUILD="" 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-2.pc]) AC_OUTPUT cat << _EOF_ Configuration: OpenSSL support: ${OPENSSL} Examples: ${EXAMPLES} Now type "make" to build, and "make install" to install. Thank you for using libmowgli. _EOF_ libmowgli-2-libmowgli-2.0.0/doc/000077500000000000000000000000001174351671600164005ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/doc/BOOST000066400000000000000000000006431174351671600172140ustar00rootroot00000000000000This is a list of alphabetical libraries provided by Boost and their 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 for a full list of libs. libmowgli-2-libmowgli-2.0.0/doc/design-concepts.txt000066400000000000000000000107641174351671600222360ustar00rootroot00000000000000Design 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. libmowgli-2-libmowgli-2.0.0/extra.mk.in000066400000000000000000000005441174351671600177170ustar00rootroot00000000000000LIBMOWGLI_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@ LIBMOWGLI_MODULE_BUILD = @LIBMOWGLI_MODULE_BUILD@ libmowgli-2-libmowgli-2.0.0/install-sh000077500000000000000000000332561174351671600176500ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile 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 # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # 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-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # 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 } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --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 CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -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;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done 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 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. 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 problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src 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 '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi 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: $dst_arg: Is a directory" >&2 exit 1 fi 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 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 if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # 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. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $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 fi fi if test -n "$dir_arg"; then { 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 # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # 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 $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 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libmowgli-2-libmowgli-2.0.0/libmowgli-2.pc.in000066400000000000000000000005521174351671600207120ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ datarootdir=@datarootdir@ data_dir=@datadir@/@PACKAGE_NAME@ version=@PACKAGE_VERSION@ include_dir=@includedir@/@PACKAGE_NAME@ lib_dir=@libdir@ Name: libmowgli-2 Description: A library which contains many utility functions and classes. Version: @PACKAGE_VERSION@ Libs: -L${lib_dir} -lmowgli-2 Cflags: -I${include_dir} libmowgli-2-libmowgli-2.0.0/m4/000077500000000000000000000000001174351671600161535ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/m4/acx_pthread.m4000066400000000000000000000244761174351671600207140ustar00rootroot00000000000000# =========================================================================== # 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 # # 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 . # # 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_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 ], [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 ]) libmowgli-2-libmowgli-2.0.0/m4/ax_check_openssl.m4000066400000000000000000000101321174351671600217220ustar00rootroot00000000000000# =========================================================================== # 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 # # LICENSE # # Copyright (c) 2009,2010 Zmanda Inc. # Copyright (c) 2009,2010 Dustin J. Mitchell # # 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 , 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 ], [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]) ]) libmowgli-2-libmowgli-2.0.0/m4/buildsys.m4000066400000000000000000000153261174351671600202620ustar00rootroot00000000000000dnl dnl Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 dnl Jonathan Schleifer dnl 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 dnl copyright notice and this permission notice is present in all copies. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" dnl AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE dnl ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE dnl LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR dnl CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF dnl SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS dnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN dnl CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 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_INIT], [ AC_PATH_PROG(TPUT, tput) 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], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(whether we need an implib) case "$host_os" in cygwin* | mingw*) AC_MSG_RESULT(yes) PROG_IMPLIB_NEEDED='yes' PROG_IMPLIB_LDFLAGS='-Wl,-export-all-symbols,--out-implib,lib${PROG}.a' ;; *) AC_MSG_RESULT(no) PROG_IMPLIB_NEEDED='no' PROG_IMPLIB_LDFLAGS='' ;; esac AC_SUBST(PROG_IMPLIB_NEEDED) AC_SUBST(PROG_IMPLIB_LDFLAGS) ]) AC_DEFUN([BUILDSYS_SHARED_LIB], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_MSG_CHECKING(for shared library system) case "$host_os" in darwin*) AC_MSG_RESULT(Darwin) 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_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_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_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}' CLEAN_LIB='' ;; openbsd* | mirbsd*) AC_MSG_RESULT(OpenBSD) LIB_CFLAGS='-fPIC -DPIC' LIB_LDFLAGS='-shared' LIB_PREFIX='lib' LIB_SUFFIX='.so.${LIB_MAJOR}.${LIB_MINOR}' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' 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' CLEAN_LIB='' ;; cygwin* | mingw*) AC_MSG_RESULT(Win32) LIB_CFLAGS='' LIB_LDFLAGS='-shared -Wl,--out-implib,${SHARED_LIB}.a' LIB_PREFIX='lib' LIB_SUFFIX='.dll' LDFLAGS_RPATH='-Wl,-rpath,${libdir}' 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='${SHARED_LIB}.a' ;; *) AC_MSG_RESULT(GNU) 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_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' CLEAN_LIB='' ;; esac AC_SUBST(LIB_CFLAGS) AC_SUBST(LIB_LDFLAGS) AC_SUBST(LIB_PREFIX) AC_SUBST(LIB_SUFFIX) AC_SUBST(LDFLAGS_RPATH) AC_SUBST(PLUGIN_CFLAGS) AC_SUBST(PLUGIN_LDFLAGS) AC_SUBST(PLUGIN_SUFFIX) 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" for i in $(find . -name Makefile); do DEPSFILE="$(dirname $i)/.deps" test -f "$DEPSFILE" && rm "$DEPSFILE" touch -t 0001010000 "$DEPSFILE" done ]) libmowgli-2-libmowgli-2.0.0/m4/pkg.m4000066400000000000000000000040021174351671600171720ustar00rootroot00000000000000 dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page dnl also defines GSTUFF_PKG_ERRORS on error AC_DEFUN([PKG_CHECK_MODULES], [ succeeded=no if test -z "$PKG_CONFIG"; then AC_PATH_PROG(PKG_CONFIG, pkg-config, no) fi if test "$PKG_CONFIG" = "no" ; then echo "*** The pkg-config script could not be found. Make sure it is" echo "*** in your path, or set the PKG_CONFIG environment variable" echo "*** to the full path to pkg-config." echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." else PKG_CONFIG_MIN_VERSION=0.9.0 if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then AC_MSG_CHECKING(for $2) if $PKG_CONFIG --exists "$2" ; then AC_MSG_RESULT(yes) succeeded=yes AC_MSG_CHECKING($1_CFLAGS) $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` AC_MSG_RESULT($$1_CFLAGS) AC_MSG_CHECKING($1_LIBS) $1_LIBS=`$PKG_CONFIG --libs "$2"` AC_MSG_RESULT($$1_LIBS) else AC_MSG_RESULT(no) $1_CFLAGS="" $1_LIBS="" ## If we have a custom action on failure, don't print errors, but ## do set a variable so people can do so. $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` ifelse([$4], ,echo $$1_PKG_ERRORS,) fi AC_SUBST($1_CFLAGS) AC_SUBST($1_LIBS) else echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." echo "*** See http://www.freedesktop.org/software/pkgconfig" fi fi if test $succeeded = yes; then ifelse([$3], , :, [$3]) else ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) fi ]) libmowgli-2-libmowgli-2.0.0/scripts/000077500000000000000000000000001174351671600173225ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/scripts/makerelease.sh000077500000000000000000000056641174351671600221520ustar00rootroot00000000000000#!/bin/sh # mkrelease.sh: Creates a release suitable for distfiles.atheme.org. # # Copyright (c) 2007 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. # if [ "x$1" = "x" ]; then echo "usage: $0 releasename [--automatic]" exit else RELEASENAME="$1" fi if [ "x$2" = "x--automatic" ]; then AUTOMATIC="yes" fi TIP=`git log -1 --pretty=oneline | cut -d" " -f1` GITDIR=`git rev-parse --show-toplevel` WRKDIR=`pwd` if [ -d $RELEASENAME ]; then echo "Deleting previous release named $RELEASENAME." rm -rf $WRKDIR/$RELEASENAME/ fi echo "Making release named $RELEASENAME (tip $TIP)" echo echo "Building root: $RELEASENAME/" cd $GITDIR || exit 1 git archive --format=tar --prefix=$RELEASENAME/ HEAD | gzip >$WRKDIR/$RELEASENAME-working.tar.gz || exit 1 cd $WRKDIR || exit 1 tar -xzvf $RELEASENAME-working.tar.gz || exit 1 cd $RELEASENAME || exit 1 rm -rf .gitignore sh autogen.sh rm -rf autogen.sh autom4te.cache # Run application specific instructions here. if [ -x "$WRKDIR/application.sh" ]; then source $WRKDIR/application.sh fi cd .. echo "Building $RELEASENAME.tar.gz from $RELEASENAME/" tar zcf $RELEASENAME.tar.gz $RELEASENAME/ echo "Building $RELEASENAME.tar.bz2 from $RELEASENAME/" tar jcf $RELEASENAME.tar.bz2 $RELEASENAME/ rm $RELEASENAME-working.tar.gz PUBLISH="yes" ok="0" if [ "x$AUTOMATIC" != "xyes" ]; then echo echo "Would you like to publish these releases now?" while [ $ok -eq 0 ]; do echo -n "[$PUBLISH] " read INPUT case $INPUT in [Yy]*) PUBLISH="yes" ok=1 ;; [Nn]*) PUBLISH="no" ok=1 ;; esac done fi if [ "x$PUBLISH" = "xyes" ]; then 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" echo "distribution network within 15 minutes." fi echo echo "Done. If you have any bugs to report, report them against" echo "the distfiles.atheme.org component at http://jira.atheme.org" echo "Thanks!" echo libmowgli-2-libmowgli-2.0.0/src/000077500000000000000000000000001174351671600164225ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/Makefile000066400000000000000000000001221174351671600200550ustar00rootroot00000000000000SUBDIRS = libmowgli ${EXAMPLES_BUILD} include ../buildsys.mk include ../extra.mk libmowgli-2-libmowgli-2.0.0/src/examples/000077500000000000000000000000001174351671600202405ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/Makefile000066400000000000000000000003231174351671600216760ustar00rootroot00000000000000SUBDIRS = echoserver vio-udplistener async_resolver formattertest helpertest libevent-bench linetest listsort memslice-bench patriciatest patriciatest2 randomtest timertest futuretest include ../../buildsys.mk libmowgli-2-libmowgli-2.0.0/src/examples/async_resolver/000077500000000000000000000000001174351671600232765ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/async_resolver/Makefile000066400000000000000000000002451174351671600247370ustar00rootroot00000000000000PROG_NOINST = async_resolver${PROG_SUFFIX} SRCS = async_resolver.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/async_resolver/async_resolver.c000066400000000000000000000064361174351671600265110ustar00rootroot00000000000000/* This code is in the public domain. */ #include 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; } libmowgli-2-libmowgli-2.0.0/src/examples/echoserver/000077500000000000000000000000001174351671600224055ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/echoserver/Makefile000066400000000000000000000002351174351671600240450ustar00rootroot00000000000000PROG_NOINST = echoserver${PROG_SUFFIX} SRCS = echoserver.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/echoserver/echoserver.c000066400000000000000000000101261174351671600247160ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * echoserver.c: Testing of the I/O system * * Copyright (c) 2011 William Pitcock * * 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_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; } libmowgli-2-libmowgli-2.0.0/src/examples/formattertest/000077500000000000000000000000001174351671600231435ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/formattertest/Makefile000066400000000000000000000002431174351671600246020ustar00rootroot00000000000000PROG_NOINST = formattertest${PROG_SUFFIX} SRCS = formattertest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/formattertest/formattertest.c000066400000000000000000000034251174351671600262160ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * formattertest.c: Testsuite for mowgli.formatter. * * Copyright (c) 2007 William Pitcock * * 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 int main(int argc, char *argv[]) { char buf[65535]; mowgli_formatter_format(buf, 65535, "%1! %2 %3 %4.", "sdpb", "Hello World", 1, 0xDEADBEEF, TRUE); puts(buf); return 0; } libmowgli-2-libmowgli-2.0.0/src/examples/futuretest/000077500000000000000000000000001174351671600224525ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/futuretest/Makefile000066400000000000000000000002351174351671600241120ustar00rootroot00000000000000PROG_NOINST = futuretest${PROG_SUFFIX} SRCS = futuretest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/futuretest/futuretest.c000066400000000000000000000060621174351671600250340ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * futuretest: Combustable lemons * * Copyright (c) 2012 Patrick McFarland * * 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 #include 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"); } } libmowgli-2-libmowgli-2.0.0/src/examples/helpertest/000077500000000000000000000000001174351671600224175ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/helpertest/Makefile000066400000000000000000000002351174351671600240570ustar00rootroot00000000000000PROG_NOINST = helpertest${PROG_SUFFIX} SRCS = helpertest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/helpertest/helpertest.c000066400000000000000000000064141174351671600247470ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * echoserver.c: Testing of the I/O system * * Copyright (c) 2012 William Pitcock * * 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 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; } libmowgli-2-libmowgli-2.0.0/src/examples/libevent-bench/000077500000000000000000000000001174351671600231255ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/libevent-bench/Makefile000066400000000000000000000002231174351671600245620ustar00rootroot00000000000000PROG_NOINST = bench${PROG_SUFFIX} SRCS = bench.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/libevent-bench/bench.c000066400000000000000000000146421174351671600243570ustar00rootroot00000000000000/* * Copyright 2012 William Pitcock . * 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 * 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 * * 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 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); } libmowgli-2-libmowgli-2.0.0/src/examples/linetest/000077500000000000000000000000001174351671600220675ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/linetest/Makefile000066400000000000000000000002311174351671600235230ustar00rootroot00000000000000PROG_NOINST = linetest${PROG_SUFFIX} SRCS = linetest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/linetest/linetest.c000066400000000000000000000106371174351671600240710ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * linetest.c: Testing of the linebuffer * * Copyright (c) 2011 William Pitcock * Copyright (c) 2012 Elizabeth J. Myers * * 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_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; } libmowgli-2-libmowgli-2.0.0/src/examples/listsort/000077500000000000000000000000001174351671600221235ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/listsort/Makefile000066400000000000000000000002311174351671600235570ustar00rootroot00000000000000PROG_NOINST = listsort${PROG_SUFFIX} SRCS = listsort.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/listsort/listsort.c000066400000000000000000000071751174351671600241640ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * listsort.c: Testing of the list sorting routine. * * Copyright (c) 2007 William Pitcock * * 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 #ifdef _WIN32 #define strcasecmp _stricmp #endif int str_comparator(mowgli_node_t *n, mowgli_node_t *n2, void *opaque) { int ret; ret = strcasecmp(n->data, n2->data); return ret; } void test_strings(void) { mowgli_list_t l = { NULL, NULL, 0 }; mowgli_node_t *n, *tn; mowgli_node_add("foo", mowgli_node_create(), &l); mowgli_node_add("bar", mowgli_node_create(), &l); mowgli_node_add("baz", mowgli_node_create(), &l); mowgli_node_add("splork", mowgli_node_create(), &l); mowgli_node_add("rabbit", mowgli_node_create(), &l); mowgli_node_add("meow", mowgli_node_create(), &l); mowgli_node_add("hi", mowgli_node_create(), &l); mowgli_node_add("konnichiwa", mowgli_node_create(), &l); mowgli_node_add("absolutely", mowgli_node_create(), &l); mowgli_node_add("cat", mowgli_node_create(), &l); mowgli_node_add("dog", mowgli_node_create(), &l); mowgli_node_add("woof", mowgli_node_create(), &l); mowgli_node_add("moon", mowgli_node_create(), &l); mowgli_node_add("new", mowgli_node_create(), &l); mowgli_node_add("delete", mowgli_node_create(), &l); mowgli_node_add("alias", mowgli_node_create(), &l); mowgli_list_sort(&l, str_comparator, NULL); printf("\nString test results\n"); MOWGLI_LIST_FOREACH_SAFE(n, tn, l.head) { printf(" %s\n", (char*) n->data); mowgli_node_delete(n, &l); } } int int_comparator(mowgli_node_t *n, mowgli_node_t *n2, void *opaque) { long a = (long) n->data; long b = (long) n2->data; return a - b; } void test_integers(void) { mowgli_list_t l = { NULL, NULL, 0 }; mowgli_node_t *n, *tn; mowgli_node_add((void *) 3, mowgli_node_create(), &l); mowgli_node_add((void *) 2, mowgli_node_create(), &l); mowgli_node_add((void *) 4, mowgli_node_create(), &l); mowgli_node_add((void *) 1, mowgli_node_create(), &l); mowgli_list_sort(&l, int_comparator, NULL); printf("\nInteger test results\n"); MOWGLI_LIST_FOREACH_SAFE(n, tn, l.head) { printf(" %ld\n", (long) n->data); mowgli_node_delete(n, &l); } } int main(int argc, char *argv[]) { test_strings(); test_integers(); return EXIT_SUCCESS; } libmowgli-2-libmowgli-2.0.0/src/examples/memslice-bench/000077500000000000000000000000001174351671600231135ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/memslice-bench/Makefile000066400000000000000000000002451174351671600245540ustar00rootroot00000000000000PROG_NOINST = memslice-bench${PROG_SUFFIX} SRCS = memslice-bench.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/memslice-bench/memslice-bench.c000066400000000000000000000073021174351671600261340ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock * * 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_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; } libmowgli-2-libmowgli-2.0.0/src/examples/patriciatest/000077500000000000000000000000001174351671600227345ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/patriciatest/Makefile000066400000000000000000000002411174351671600243710ustar00rootroot00000000000000PROG_NOINST = patriciatest${PROG_SUFFIX} SRCS = patriciatest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/patriciatest/patriciatest.c000066400000000000000000000100461174351671600255750ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * patriciatest.c: Testing of the patricia tree. * * Copyright (c) 2008 Jilles Tjoelker * * 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 int errors = 0; void str_canon(char *key) { return; } void statscb(const char *line, void *data) { printf("%s\n", line); } /* assumes data is key */ static void check_all_retrievable(mowgli_patricia_t *dtree) { mowgli_patricia_iteration_state_t state; void *elem, *elem2; unsigned int n1 = 0, n2; mowgli_patricia_stats(dtree, statscb, NULL); printf("Checking consistency..."); fflush(stdout); n2 = mowgli_patricia_size(dtree); MOWGLI_PATRICIA_FOREACH(elem, &state, dtree) { elem2 = mowgli_patricia_retrieve(dtree, (const char *)elem); if (elem2 == NULL) { errors++; printf("failed to find element %s\n", (const char *)elem); } else if (strcmp(elem2, elem)) { printf("element %s != %s\n", (const char *)elem, (const char *)elem2); errors++; } else printf("."); fflush(stdout); n1++; if (n1 > n2 * 2) break; } if (n1 != n2) { errors++; printf("number of iterated elements %u != size %u\n", n1, n2); } printf("\n"); fflush(stdout); } void test_patricia(void) { mowgli_patricia_t *dtree; mowgli_patricia_iteration_state_t state; void *elem; dtree = mowgli_patricia_create(str_canon); #define ADD(x) printf("Adding %s\n", x); mowgli_patricia_add(dtree, x, x); check_all_retrievable(dtree) ADD("\1\1"); ADD("alias"); ADD("\377"); ADD("\377\377\377"); ADD("foo"); ADD("bar"); ADD("baz"); ADD("splork"); ADD("rabbit"); ADD("\1"); ADD("meow"); ADD("hi"); ADD("konnichiwa"); ADD("absolutely"); ADD("cat"); ADD("dog"); ADD("woof"); ADD("moon"); ADD("new"); ADD("delete"); MOWGLI_PATRICIA_FOREACH(elem, &state, dtree) { printf("element -> %s\n", (const char *)elem); } printf("End of elements\n"); mowgli_patricia_stats(dtree, statscb, NULL); check_all_retrievable(dtree); #define TESTRETRIEVE(x) elem = mowgli_patricia_retrieve(dtree, x); printf("element %s: %s\n", x, elem ? (errors++, "YES") : "NO") TESTRETRIEVE("meows"); TESTRETRIEVE("meo"); TESTRETRIEVE("deletes"); TESTRETRIEVE("z"); TESTRETRIEVE("0"); #define TESTDELETE(x) mowgli_patricia_delete(dtree, x); elem = mowgli_patricia_retrieve(dtree, x); printf("deleting %s: %s\n", x, elem ? (errors++, "STILL PRESENT") : "GONE"); check_all_retrievable(dtree) TESTDELETE("YYY"); TESTDELETE("foo"); TESTDELETE("splork"); ADD("spork"); ADD("foo"); TESTDELETE("absolutely"); TESTDELETE("cat"); ADD("absolutely"); TESTDELETE("dog"); mowgli_patricia_destroy(dtree, NULL, NULL); } int main(int argc, char *argv[]) { test_patricia(); return errors == 0 ? 0 : 1; } libmowgli-2-libmowgli-2.0.0/src/examples/patriciatest2/000077500000000000000000000000001174351671600230165ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/patriciatest2/Makefile000066400000000000000000000002431174351671600244550ustar00rootroot00000000000000PROG_NOINST = patriciatest2${PROG_SUFFIX} SRCS = patriciatest2.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/patriciatest2/patriciatest2.c000066400000000000000000000073371174351671600257520ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * patriciatest2.c: More testing of the patricia tree. * * Copyright (c) 2008-2010 Jilles Tjoelker * * 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 #define TESTSIZE 10000 int errors = 0; void str_canon(char *key) { return; } void statscb(const char *line, void *data) { } /* assumes data is key */ static void check_all_retrievable(mowgli_patricia_t *dtree) { mowgli_patricia_iteration_state_t state; void *elem, *elem2; unsigned int n1 = 0, n2; mowgli_patricia_stats(dtree, statscb, NULL); n2 = mowgli_patricia_size(dtree); MOWGLI_PATRICIA_FOREACH(elem, &state, dtree) { elem2 = mowgli_patricia_retrieve(dtree, (const char *)elem); if (elem2 == NULL) { errors++; printf("failed to find element %s\n", (const char *)elem); } else if (strcmp(elem2, elem)) { printf("element %s != %s\n", (const char *)elem, (const char *)elem2); errors++; } n1++; if (n1 > n2 * 2) break; } if (n1 != n2) { errors++; printf("number of iterated elements %u != size %u\n", n1, n2); } } void test_patricia(void) { mowgli_patricia_t *dtree; int i, j; char buf[100], *strings[TESTSIZE]; srandom(12346); for (i = 0; i < TESTSIZE; i++) { for (j = 0; j < 40; j++) buf[j] = 'a' + random() % 26; buf[20 + random() % 20] = '\0'; strings[i] = strdup(buf); } dtree = mowgli_patricia_create(str_canon); for (i = 0; i < TESTSIZE; i++) { mowgli_patricia_add(dtree, strings[i], strings[i]); check_all_retrievable(dtree); } check_all_retrievable(dtree); for (i = 0; i < TESTSIZE / 2; i++) { mowgli_patricia_delete(dtree, strings[i]); if (mowgli_patricia_retrieve(dtree, strings[i])) { printf("still retrievable after delete: %s\n", strings[i]); errors++; } check_all_retrievable(dtree); } for (i = 0; i < TESTSIZE / 2; i++) { mowgli_patricia_add(dtree, strings[i], strings[i]); check_all_retrievable(dtree); } for (i = 0; i < TESTSIZE; i++) { mowgli_patricia_delete(dtree, strings[i]); if (mowgli_patricia_retrieve(dtree, strings[i])) { printf("still retrievable after delete: %s\n", strings[i]); errors++; } check_all_retrievable(dtree); } mowgli_patricia_destroy(dtree, NULL, NULL); for (i = 0; i < TESTSIZE; i++) free(strings[i]); } int main(int argc, char *argv[]) { test_patricia(); return errors == 0 ? 0 : 1; } libmowgli-2-libmowgli-2.0.0/src/examples/randomtest/000077500000000000000000000000001174351671600224205ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/randomtest/Makefile000066400000000000000000000002351174351671600240600ustar00rootroot00000000000000PROG_NOINST = randomtest${PROG_SUFFIX} SRCS = randomtest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/randomtest/randomtest.c000066400000000000000000000036771174351671600247610ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * randomtest.c: Testsuite for the random number generator. * * Copyright (c) 2007 William Pitcock * Algorithm copyright (c) 1999-2007 Takuji Nishimura and Makoto Matsumoto * * 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 int main(int argc, char *argv[]) { mowgli_random_t *r = mowgli_random_create(); int i; printf("1000 iterations:\n"); for (i = 0; i < 1000; i++) { printf("%10u ", mowgli_random_int(r)); if (i % 5 == 4) printf("\n"); } mowgli_object_unref(r); return 0; } libmowgli-2-libmowgli-2.0.0/src/examples/timertest/000077500000000000000000000000001174351671600222605ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/timertest/Makefile000066400000000000000000000002331174351671600237160ustar00rootroot00000000000000PROG_NOINST = timertest${PROG_SUFFIX} SRCS = timertest.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/timertest/timertest.c000066400000000000000000000033411174351671600244450ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * echoserver.c: Testing of the I/O system * * Copyright (c) 2011 William Pitcock * * 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_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[]) { 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; } libmowgli-2-libmowgli-2.0.0/src/examples/vio-udplistener/000077500000000000000000000000001174351671600233715ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/examples/vio-udplistener/Makefile000066400000000000000000000002471174351671600250340ustar00rootroot00000000000000PROG_NOINST = vio-udplistener${PROG_SUFFIX} SRCS = vio-udplistener.c include ../../../buildsys.mk CPPFLAGS += -I../../libmowgli LIBS += -L../../libmowgli -lmowgli-2 libmowgli-2-libmowgli-2.0.0/src/examples/vio-udplistener/vio-udplistener.c000066400000000000000000000020071174351671600266650ustar00rootroot00000000000000/* 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 #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 */ } libmowgli-2-libmowgli-2.0.0/src/libmowgli/000077500000000000000000000000001174351671600204075ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/Makefile000066400000000000000000000005721174351671600220530ustar00rootroot00000000000000include ../../extra.mk LIB_MAJOR = 0 LIB_MINOR = 0 SHARED_LIB = ${LIBMOWGLI_SHARED_LIB} STATIC_LIB = ${LIBMOWGLI_STATIC_LIB} SUBDIRS = ${LIBMOWGLI_MODULES} platform INCLUDES = mowgli.h LIB_OBJS_EXTRA = ${LIB_OBJS} ${LIBMOWGLI_SHARED_MODULES} OBJS_EXTRA = ${LIBMOWGLI_STATIC_MODULES} include ../../buildsys.mk LIBS += ${PTHREAD_LIBS} CPPFLAGS += -I. -I../.. -DMOWGLI_CORE libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/000077500000000000000000000000001174351671600213215ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/Makefile000066400000000000000000000010461174351671600227620ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/argstack.c000066400000000000000000000153261174351671600232730ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * argstack.c: Argument stacks. * * Copyright (c) 2007 William Pitcock * * 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; /* * \brief Private destructor for the mowgli_argstack_t object. * * \param vptr pointer to mowgli_argstack_t to destroy. */ static void mowgli_argstack_destroy(void *vptr) { mowgli_argstack_t *self = (mowgli_argstack_t *) vptr; mowgli_node_t *n, *tn; MOWGLI_LIST_FOREACH_SAFE(n, tn, self->stack.head) { mowgli_free(n->data); mowgli_node_delete(n, &self->stack); mowgli_node_free(n); } mowgli_free(self); } /* * \brief Initialization code for the mowgli.argstack library. * * Side Effects: * - the mowgli_argstack_t object class is registered. */ void mowgli_argstack_bootstrap(void) { mowgli_object_class_init(&klass, "mowgli_argstack_t", mowgli_argstack_destroy, FALSE); } /* * \brief Creates an argument stack from a va_list and an appropriate * description schema. * * \param descstr a description string which describes the argument stack, where: * + the character 's' means that the value for that slot is a string * + the character 'd' means that the value for that slot is a numeric * + the character 'p' means that the value for that slot is a generic pointer * + the character 'b' means that the value for that slot is a boolean * \param va a va_list containing data to populate the argument stack with. * * \return a mowgli_argstack_t (mowgli.argstack) object. */ mowgli_argstack_t *mowgli_argstack_create_from_va_list(const char *descstr, va_list va) { const char *cp = descstr; mowgli_argstack_t *out = mowgli_alloc(sizeof(mowgli_argstack_t)); mowgli_object_init(mowgli_object(out), descstr, &klass, NULL); if (descstr == NULL) mowgli_throw_exception_val(mowgli.argstack.invalid_description, NULL); while (*cp) { mowgli_argstack_element_t *e = mowgli_alloc(sizeof(mowgli_argstack_element_t)); switch(*cp) { case 's': e->data.string = va_arg(va, char *); e->type = MOWGLI_ARG_STRING; break; case 'd': e->data.numeric = va_arg(va, int); e->type = MOWGLI_ARG_NUMERIC; break; case 'p': e->data.pointer = va_arg(va, void *); e->type = MOWGLI_ARG_POINTER; break; case 'b': e->data.boolean = va_arg(va, mowgli_boolean_t); e->type = MOWGLI_ARG_BOOLEAN; break; default: va_end(va); mowgli_object_unref(out); mowgli_throw_exception_val(mowgli.argstack.invalid_description, NULL); break; } mowgli_node_add(e, mowgli_node_create(), &out->stack); cp++; } return out; } /* * \brief Creates an argument stack. * * \param descstr a description string which describes the argument stack, where: * + the character 's' means that the value for that slot is a string * + the character 'd' means that the value for that slot is a numeric * + the character 'p' means that the value for that slot is a generic pointer * + the character 'b' means that the value for that slot is a boolean * \param va a va_list containing data to populate the argument stack with. * * \return a mowgli_argstack_t (mowgli.argstack) object. */ mowgli_argstack_t *mowgli_argstack_create(const char *descstr, ...) { va_list va; mowgli_argstack_t *out; if (descstr == NULL) mowgli_throw_exception_val(mowgli.argstack.invalid_description, NULL); va_start(va, descstr); out = mowgli_argstack_create_from_va_list(descstr, va); va_end(va); return out; } /* * \brief Convenience function to pop a string value off of an argument stack. * * \param self A mowgli_argstack_t object to pop a string off of. * * \return On success, a string. * * Side Effects: * - the argument is removed from the argstack. */ const char *mowgli_argstack_pop_string(mowgli_argstack_t *self) { mowgli_node_t *n; mowgli_argstack_element_t *e; if (self == NULL) mowgli_throw_exception_val(mowgli.null_pointer_exception, NULL); n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; mowgli_node_free(n); return e->data.string; } /* * \brief Convenience function to pop a numeric value off of an argument stack. * * \param self A mowgli_argstack_t object to pop a numeric off of. * * \return On success, a numeric. * * Side Effects: * - the argument is removed from the argstack. */ int mowgli_argstack_pop_numeric(mowgli_argstack_t *self) { mowgli_node_t *n; mowgli_argstack_element_t *e; if (self == NULL) mowgli_throw_exception_val(mowgli.null_pointer_exception, 0); n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; mowgli_node_free(n); return e->data.numeric; } /* * Convenience function to pop a boolean value off of an argument stack. * * \param self A mowgli_argstack_t object to pop a boolean off of. * * \return On success, a boolean value. * * Side Effects: * - the argument is removed from the argstack. */ mowgli_boolean_t mowgli_argstack_pop_boolean(mowgli_argstack_t *self) { mowgli_node_t *n; mowgli_argstack_element_t *e; if (self == NULL) mowgli_throw_exception_val(mowgli.null_pointer_exception, FALSE); n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; mowgli_node_free(n); return e->data.boolean; } /* * \brief Convenience function to pop a pointer value off of an argument stack. * * \param self A mowgli_argstack_t object to pop a pointer off of. * * \return On success, a pointer. * * Side Effects: * - the argument is removed from the argstack. */ void *mowgli_argstack_pop_pointer(mowgli_argstack_t *self) { mowgli_node_t *n; mowgli_argstack_element_t *e; if (self == NULL) mowgli_throw_exception_val(mowgli.null_pointer_exception, NULL); n = self->stack.head; mowgli_node_delete(n, &self->stack); e = n->data; mowgli_node_free(n); return e->data.pointer; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/argstack.h000066400000000000000000000040551174351671600232750ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * argstack.h: Argument stacks. * * Copyright (c) 2007 William Pitcock * * 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_ARGSTACK_H__ #define __MOWGLI_ARGSTACK_H__ typedef enum { MOWGLI_ARG_NUMERIC, MOWGLI_ARG_POINTER, MOWGLI_ARG_STRING, MOWGLI_ARG_BOOLEAN } mowgli_argstack_element_type_t; typedef struct { union { int numeric; void *pointer; char *string; mowgli_boolean_t boolean; } data; mowgli_argstack_element_type_t type; } mowgli_argstack_element_t; typedef struct { mowgli_object_t parent; 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 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 *); extern void *mowgli_argstack_pop_pointer(mowgli_argstack_t *); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/bitvector.c000066400000000000000000000131571174351671600234750ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * bitvector.c: Bitvectors. * * Copyright (c) 2007 William Pitcock * * 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; /* * mowgli_bitvector_init(void) * * Initialization code for the mowgli.bitvector library. * * Inputs: * - none * * Outputs: * - none * * Side Effects: * - the mowgli_bitvector_t object class is registered. */ void mowgli_bitvector_bootstrap(void) { mowgli_object_class_init(&klass, "mowgli_bitvector_t", mowgli_free, FALSE); } /* * mowgli_bitvector_create(int bits) * * Creates a bitvector. * * Inputs: * - amount of bits that the bitvector should store * * Outputs: * - a mowgli.bitvector object * * Side Effects: * - none */ mowgli_bitvector_t *mowgli_bitvector_create(int bits) { mowgli_bitvector_t *bv = (mowgli_bitvector_t *) mowgli_alloc(sizeof(mowgli_bitvector_t)); mowgli_object_init(mowgli_object(bv), "mowgli_bitvector_t", &klass, NULL); bv->bits = bits; bv->divisor = sizeof(int); bv->vector = (unsigned int *) mowgli_alloc_array(bv->divisor, bv->bits / bv->divisor); return bv; } /* * mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val) * * Sets a bit either ON or OFF in the bitvector. * * Inputs: * - a mowgli bitvector object * - a slot * - the value for that slot * * Outputs: * - nothing * * Side Effects: * - a bit is either set ON or OFF in the bitvector. */ void mowgli_bitvector_set(mowgli_bitvector_t *bv, int slot, mowgli_boolean_t val) { int value = 1 << slot; switch(val) { case FALSE: bv->vector[bv->bits / bv->divisor] &= ~value; break; default: case TRUE: bv->vector[bv->bits / bv->divisor] |= value; break; } } /* * mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot) * * Returns whether the bit in a given slot is ON or OFF. * * Inputs: * - a mowgli.bitvector object * - a slot to lookup * * Outputs: * - TRUE if the bit is on * - FALSE otherwise * * Side Effects: * - none */ mowgli_boolean_t mowgli_bitvector_get(mowgli_bitvector_t *bv, int slot) { int mask = 1 << slot; return ((bv->vector[bv->bits / bv->divisor] & mask) != 0) ? TRUE : FALSE; } /* * mowgli_bitvector_combine(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) * * Combines two bitvectors together. * * Inputs: * - two bitvectors to be combined * * Outputs: * - a new bitvector containing the combined result. * * Side Effects: * - none */ mowgli_bitvector_t *mowgli_bitvector_combine(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) { int bits, iter, bs; mowgli_bitvector_t *out; return_val_if_fail(bv1 != NULL, NULL); return_val_if_fail(bv2 != NULL, NULL); /* choose the larger bitwidth */ bits = bv1->bits > bv2->bits ? bv1->bits : bv2->bits; /* create the third bitvector. */ out = mowgli_bitvector_create(bits); /* cache the size of the bitvector in memory. */ bs = out->bits / out->divisor; for (iter = 0; iter < bs; iter++) { out->vector[iter] |= bv1->vector[iter]; out->vector[iter] |= bv2->vector[iter]; } return out; } /* * mowgli_bitvector_xor(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) * * XORs two bitvectors together. * * Inputs: * - two bitvectors to be XORed * * Outputs: * - a new bitvector containing the XORed result. * * Side Effects: * - none */ mowgli_bitvector_t *mowgli_bitvector_xor(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) { int bits, iter, bs; mowgli_bitvector_t *out; return_val_if_fail(bv1 != NULL, NULL); return_val_if_fail(bv2 != NULL, NULL); /* choose the larger bitwidth */ bits = bv1->bits > bv2->bits ? bv1->bits : bv2->bits; /* create the third bitvector. */ out = mowgli_bitvector_create(bits); /* cache the size of the bitvector in memory. */ bs = out->bits / out->divisor; for (iter = 0; iter < bs; iter++) { out->vector[iter] = bv1->vector[iter]; out->vector[iter] &= ~bv2->vector[iter]; } return out; } /* * mowgli_bitvector_compare(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) * * Compares two bitvectors to each other. * * Inputs: * - two bitvectors to be compared * * Outputs: * - TRUE if the bitvector is equal * - FALSE otherwise * * Side Effects: * - none */ mowgli_boolean_t mowgli_bitvector_compare(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2) { int iter, bs; mowgli_boolean_t ret = TRUE; /* cache the size of the bitvector in memory. */ bs = bv1->bits / bv1->divisor; for (iter = 0; iter < bs; iter++) { if (!(bv1->vector[iter] & bv2->vector[iter])) ret = FALSE; } return ret; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/bitvector.h000066400000000000000000000035511174351671600234770ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * bitvector.h: Bitvectors. * * Copyright (c) 2007 William Pitcock * * 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_BITVECTOR_H__ #define __MOWGLI_BITVECTOR_H__ typedef struct { unsigned int bits; unsigned int divisor; unsigned int *vector; } mowgli_bitvector_t; 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); extern mowgli_bitvector_t *mowgli_bitvector_combine(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2); extern mowgli_bitvector_t *mowgli_bitvector_xor(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2); extern mowgli_boolean_t mowgli_bitvector_compare(mowgli_bitvector_t *bv1, mowgli_bitvector_t *bv2); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/formatter.c000066400000000000000000000062021174351671600234700ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * formatter.c: Reusable formatting. * * Copyright (c) 2007 William Pitcock * * 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_formatter_format_from_argstack(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, mowgli_argstack_t *stack) { size_t pos = 0; char *i = buf; const char *fiter = fmtstr; return_if_fail(buf != NULL); return_if_fail(fmtstr != NULL); return_if_fail(descstr != NULL); *i = '\0'; while (*fiter && pos <= bufstr) { int arg; mowgli_argstack_element_t *e; pos = strlen(buf); switch(*fiter) { case '%': fiter++; arg = atoi(fiter); e = mowgli_node_nth_data(&stack->stack, arg - 1); while (isdigit(*fiter)) fiter++; if (e == NULL) { arg = snprintf(i, bufstr - (i - buf), "(unknown)"); i += arg; continue; } switch(e->type) { case MOWGLI_ARG_STRING: arg = snprintf(i, bufstr - (i - buf), "%s", e->data.string); i += arg; break; case MOWGLI_ARG_NUMERIC: arg = snprintf(i, bufstr - (i - buf), "%d", e->data.numeric); i += arg; break; case MOWGLI_ARG_POINTER: arg = snprintf(i, bufstr - (i - buf), "%p", e->data.pointer); i += arg; break; case MOWGLI_ARG_BOOLEAN: arg = snprintf(i, bufstr - (i - buf), "%s", e->data.boolean ? "TRUE" : "FALSE"); i += arg; break; default: mowgli_throw_exception(mowgli.formatter.unhandled_type_exception); break; } continue; break; default: *i = *fiter; } i++; fiter++; } } void mowgli_formatter_format(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, ...) { va_list va; mowgli_argstack_t *stack; va_start(va, descstr); stack = mowgli_argstack_create_from_va_list(descstr, va); va_end(va); mowgli_formatter_format_from_argstack(buf, bufstr, fmtstr, descstr, stack); } void mowgli_formatter_print(const char *fmtstr, const char *descstr, ...) { va_list va; char buf[65535]; mowgli_argstack_t *stack; va_start(va, descstr); stack = mowgli_argstack_create_from_va_list(descstr, va); va_end(va); mowgli_formatter_format_from_argstack(buf, 65535, fmtstr, descstr, stack); printf("%s", buf); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/formatter.h000066400000000000000000000030231174351671600234730ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * formatter.h: Reusable formatting. * * Copyright (c) 2007 William Pitcock * * 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_FORMATTER_H__ #define __MOWGLI_FORMATTER_H__ extern void mowgli_formatter_format(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, ...); extern void mowgli_formatter_print(const char *fmtstr, const char *descstr, ...); extern void mowgli_formatter_format_from_argstack(char *buf, size_t bufstr, const char *fmtstr, const char *descstr, mowgli_argstack_t *stack); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/hash.c000066400000000000000000000045301174351671600224120ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * hash.c: FNV-1 hashing implementation. * * Copyright (c) 2007 William Pitcock * * 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" #define HASHINIT 0x811c9dc5 #define HASHBITS 16 #define HASHSIZE (1 << HASHBITS) /* 2^16 = 65536 */ int mowgli_fnv_hash_string(const char *p) { static int htoast = 0; unsigned int hval = HASHINIT; if (htoast == 0) { mowgli_random_t *r = mowgli_random_create(); htoast = mowgli_random_int(r); mowgli_object_unref(r); } if (!p) return (0); for (; *p != '\0'; ++p) { hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); hval ^= (tolower(*p) ^ htoast); } return ((hval >> HASHBITS) ^ (hval & ((1 << HASHBITS) - 1)) % HASHSIZE); } int mowgli_fnv_hash(unsigned int *p) { static int htoast = 0; unsigned int hval = HASHINIT; if (htoast == 0) { mowgli_random_t *r = mowgli_random_create(); htoast = mowgli_random_int(r); mowgli_object_unref(r); } if (!p) return (0); for (; *p != '\0'; ++p) { hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); hval ^= (tolower(*p) ^ htoast); } return ((hval >> HASHBITS) ^ (hval & ((1 << HASHBITS) - 1)) % HASHSIZE); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/hash.h000066400000000000000000000024431174351671600224200ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * hash.h: FNV-1 hashing implementation. * * Copyright (c) 2007 William Pitcock * * 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_HASH_H__ #define __MOWGLI_HASH_H__ extern int mowgli_fnv_hash_string(const char *data); extern int mowgli_fnv_hash(unsigned int *data); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/hook.c000066400000000000000000000067121174351671600224330ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * hook.c: Hooks. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007 Giacomo Lozito * * 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_patricia_t *mowgli_hooks = NULL; static mowgli_heap_t *mowgli_hook_item_heap; static void _hook_key_canon(char *str) { while (*str) { *str = toupper(*str); str++; } } 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); } static mowgli_hook_t * mowgli_hook_find(const char *name) { return mowgli_patricia_retrieve(mowgli_hooks, name); } void mowgli_hook_register(const char *name) { mowgli_hook_t *hook; return_if_fail(name != NULL); return_if_fail((hook = mowgli_hook_find(name)) == NULL); hook = mowgli_alloc(sizeof(mowgli_hook_t)); hook->name = mowgli_strdup(name); mowgli_patricia_add(mowgli_hooks, hook->name, hook); } int mowgli_hook_associate(const char *name, mowgli_hook_function_t func, void *user_data) { mowgli_hook_t *hook; mowgli_hook_item_t *hookitem; return_val_if_fail(name != NULL, -1); return_val_if_fail(func != NULL, -1); hook = mowgli_hook_find(name); if (hook == NULL) { mowgli_hook_register(name); hook = mowgli_hook_find(name); } /* this *cant* happen */ return_val_if_fail(hook != NULL, -1); hookitem = mowgli_heap_alloc(mowgli_hook_item_heap); hookitem->func = func; hookitem->user_data = user_data; mowgli_node_add(hookitem, &hookitem->node, &hook->items); return 0; } int mowgli_hook_dissociate(const char *name, mowgli_hook_function_t func) { mowgli_hook_t *hook; mowgli_node_t *n, *tn; return_val_if_fail(name != NULL, -1); return_val_if_fail(func != NULL, -1); hook = mowgli_hook_find(name); if (hook == NULL) return -1; MOWGLI_LIST_FOREACH_SAFE(n, tn, hook->items.head) { mowgli_hook_item_t *hookitem = n->data; if (hookitem->func == func) { mowgli_node_delete(&hookitem->node, &hook->items); mowgli_heap_free(mowgli_hook_item_heap, hookitem); return 0; } } return -1; } void mowgli_hook_call(const char *name, void *hook_data) { mowgli_hook_t *hook; mowgli_node_t *n; return_if_fail(name != NULL); hook = mowgli_hook_find(name); if (hook == NULL) return; MOWGLI_LIST_FOREACH(n, hook->items.head) { mowgli_hook_item_t *hookitem = n->data; return_if_fail(hookitem->func != NULL); hookitem->func(hook_data, hookitem->user_data); } } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/hook.h000066400000000000000000000035161174351671600224370ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * hook.h: Hooks. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007 Giacomo Lozito * * 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_HOOK_H__ #define __MOWGLI_HOOK_H__ typedef void (*mowgli_hook_function_t)(void *hook_data, void *user_data); typedef struct { mowgli_hook_function_t func; void *user_data; mowgli_node_t node; } mowgli_hook_item_t; typedef struct { const char *name; mowgli_list_t items; } mowgli_hook_t; 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); extern void mowgli_hook_call(const char *name, void * hook_data); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/memslice.c000066400000000000000000000060151174351671600232650ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock * * 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; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/memslice.h000066400000000000000000000022701174351671600232710ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/mowgli_signal.c000066400000000000000000000042001174351671600243140ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mowgli_signal.c: Safe signal handling. * * Copyright (c) 2007 William Pitcock * * 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 _WIN32 #include #include "mowgli.h" static mowgli_signal_handler_t mowgli_signal_install_handler_full(int signum, mowgli_signal_handler_t handler, int *sigtoblock, size_t sigtoblocksize) { struct sigaction action, old_action; size_t i; action.sa_handler = handler; action.sa_flags = SA_RESTART; sigemptyset(&action.sa_mask); for (i = 0; i < sigtoblocksize; i++) sigaddset(&action.sa_mask, sigtoblock[i]); if (sigaction(signum, &action, &old_action) == -1) { mowgli_log("Failed to install signal handler for signal %d", signum); return NULL; } return old_action.sa_handler; } /* * A version of signal(2) that works more reliably across different * platforms. * * It restarts interrupted system calls, does not reset the handler, * and blocks the same signal from within the handler. */ mowgli_signal_handler_t mowgli_signal_install_handler(int signum, mowgli_signal_handler_t handler) { return mowgli_signal_install_handler_full(signum, handler, NULL, 0); } #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/mowgli_signal.h000066400000000000000000000025361174351671600243330ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mowgli_signal.h: Safe signal handling. * * Copyright (c) 2007 William Pitcock * * 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_SIGNAL_H__ #define __MOWGLI_SIGNAL_H__ typedef void (*mowgli_signal_handler_t) (int); extern mowgli_signal_handler_t mowgli_signal_install_handler(int signum, mowgli_signal_handler_t handler); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/random.c000066400000000000000000000074361174351671600227570ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * random.c: Portable mersinne-twister based psuedo-random number generator. * * Copyright (c) 2007 William Pitcock * Algorithm copyright (c) 1999-2007 Takuji Nishimura and Makoto Matsumoto * * 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" /* period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ /* mowgli_random_t contains state data which is private */ struct mowgli_random_ { mowgli_object_t object; unsigned int mt[N]; size_t mti; }; static mowgli_object_class_t klass; /* initialization */ void mowgli_random_bootstrap(void) { mowgli_object_class_init(&klass, "mowgli_random_t", NULL, FALSE); } /* construction and destruction. */ mowgli_random_t *mowgli_random_create(void) { return mowgli_random_create_with_seed(time(NULL)); } mowgli_random_t *mowgli_random_create_with_seed(unsigned int seed) { mowgli_random_t *out = mowgli_alloc(sizeof(mowgli_random_t)); mowgli_object_init(mowgli_object(out), NULL, &klass, NULL); mowgli_random_reseed(out, seed); return out; } /* reset seed */ void mowgli_random_reseed(mowgli_random_t *self, unsigned int seed) { return_if_fail(self != NULL); self->mt[0] = seed & 0xffffffffUL; for (self->mti = 1; self->mti < N; self->mti++) { self->mt[self->mti] = (1812433253UL * (self->mt[self->mti - 1] ^ (self->mt[self->mti - 1] >> 30)) + self->mti); self->mt[self->mti] &= 0xffffffffUL; } } /* number retrieval */ unsigned int mowgli_random_int(mowgli_random_t *self) { unsigned int y; static unsigned int mag01[2] = { 0x0UL, MATRIX_A }; return_val_if_fail(self != NULL, 0); if (self->mti >= N) { int t; for (t = 0; t < N - M; t++) { y = (self->mt[t] & UPPER_MASK) | (self->mt[t + 1] & LOWER_MASK); self->mt[t] = self->mt[t + M] ^ (y >> 1) ^ mag01[y & 0x1U]; } for (; t < N - 1; t++) { y = (self->mt[t] & UPPER_MASK) | (self->mt[t + 1] & LOWER_MASK); self->mt[t] = self->mt[t + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1U]; } y = (self->mt[N - 1] & UPPER_MASK) | (self->mt[0] & LOWER_MASK); self->mt[N - 1] = self->mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1U]; self->mti = 0; } y = self->mt[self->mti++]; /* tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680U; y ^= (y << 15) & 0xefc60000U; y ^= (y >> 18); return y; } int mowgli_random_int_ranged(mowgli_random_t *self, int begin, int end) { unsigned int dist = end - begin; unsigned int max, ret; if (dist <= 0x80000000U) { unsigned int remain = (0x80000000U % dist) * 2; if (remain >= dist) remain -= dist; max = 0xFFFFFFFFU - remain; } else max = dist - 1; do { ret = mowgli_random_int(self); } while (ret > max); ret %= dist; return begin + ret; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/base/random.h000066400000000000000000000035361174351671600227610ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * random.h: Portable mersinne-twister based psuedo-random number generator. * * Copyright (c) 2007 William Pitcock * * 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_RANDOM_H__ #define __MOWGLI_RANDOM_H__ /* mowgli_random_t contains state data which is private */ struct mowgli_random_; typedef struct mowgli_random_ mowgli_random_t; /* object class initialization. */ extern void mowgli_random_bootstrap(void); /* construction and destruction. */ extern mowgli_random_t *mowgli_random_create(void); extern mowgli_random_t *mowgli_random_create_with_seed(unsigned int seed); /* reset seed */ extern void mowgli_random_reseed(mowgli_random_t *self, unsigned int seed); /* number retrieval */ extern unsigned int mowgli_random_int(mowgli_random_t *self); extern int mowgli_random_int_ranged(mowgli_random_t *self, int begin, int end); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/000077500000000000000000000000001174351671600223715ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/Makefile000066400000000000000000000006561174351671600240400ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/dictionary.c000066400000000000000000000523771174351671600247200ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * dictionary.c: Dictionary-based information storage. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007 Jilles Tjoelker * * 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_heap_t *elem_heap = NULL; struct mowgli_dictionary_ { mowgli_dictionary_comparator_func_t compare_cb; mowgli_dictionary_elem_t *root, *head, *tail; unsigned int count; char *id; bool dirty; }; /* * mowgli_dictionary_create(mowgli_dictionary_comparator_func_t compare_cb) * * Dictionary object factory. * * Inputs: * - function to use for comparing two entries in the dtree * * Outputs: * - on success, a new dictionary object. * * Side Effects: * - if services runs out of memory and cannot allocate the object, * the program will abort. */ mowgli_dictionary_t *mowgli_dictionary_create(mowgli_dictionary_comparator_func_t compare_cb) { mowgli_dictionary_t *dtree = (mowgli_dictionary_t *) mowgli_alloc(sizeof(mowgli_dictionary_t)); dtree->compare_cb = compare_cb; if (!elem_heap) elem_heap = mowgli_heap_create(sizeof(mowgli_dictionary_elem_t), 1024, BH_NOW); return dtree; } /* * mowgli_dictionary_create_named(const char *name, * mowgli_dictionary_comparator_func_t compare_cb) * * Dictionary object factory. * * Inputs: * - dictionary name * - function to use for comparing two entries in the dtree * * Outputs: * - on success, a new dictionary object. * * Side Effects: * - if services runs out of memory and cannot allocate the object, * the program will abort. */ mowgli_dictionary_t *mowgli_dictionary_create_named(const char *name, mowgli_dictionary_comparator_func_t compare_cb) { mowgli_dictionary_t *dtree = (mowgli_dictionary_t *) mowgli_alloc(sizeof(mowgli_dictionary_t)); dtree->compare_cb = compare_cb; dtree->id = strdup(name); if (!elem_heap) elem_heap = mowgli_heap_create(sizeof(mowgli_dictionary_elem_t), 1024, BH_NOW); return dtree; } /* * mowgli_dictionary_set_comparator_func(mowgli_dictionary_t *dict, * mowgli_dictionary_comparator_func_t compare_cb) * * Resets the comparator function used by the dictionary code for * updating the DTree structure. * * Inputs: * - dictionary object * - new comparator function (passed as functor) * * Outputs: * - nothing * * Side Effects: * - the dictionary comparator function is reset. */ void mowgli_dictionary_set_comparator_func(mowgli_dictionary_t *dict, mowgli_dictionary_comparator_func_t compare_cb) { return_if_fail(dict != NULL); return_if_fail(compare_cb != NULL); dict->compare_cb = compare_cb; } /* * mowgli_dictionary_get_comparator_func(mowgli_dictionary_t *dict) * * Returns the current comparator function used by the dictionary. * * Inputs: * - dictionary object * * Outputs: * - comparator function (returned as functor) * * Side Effects: * - none */ mowgli_dictionary_comparator_func_t mowgli_dictionary_get_comparator_func(mowgli_dictionary_t *dict) { return_val_if_fail(dict != NULL, NULL); return dict->compare_cb; } /* * mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, * const void *key) * * Gets a linear index number for key. * * Inputs: * - dictionary tree object * - pointer to data * * Outputs: * - position, from zero. * * Side Effects: * - rebuilds the linear index if the tree is marked as dirty. */ int mowgli_dictionary_get_linear_index(mowgli_dictionary_t *dict, const void *key) { mowgli_dictionary_elem_t *elem; return_val_if_fail(dict != NULL, 0); return_val_if_fail(key != NULL, 0); elem = mowgli_dictionary_find(dict, key); if (elem == NULL) return -1; if (!dict->dirty) return elem->position; else { mowgli_dictionary_elem_t *delem; int i; for (delem = dict->head, i = 0; delem != NULL; delem = delem->next, i++) delem->position = i; dict->dirty = false; } return elem->position; } /* * mowgli_dictionary_retune(mowgli_dictionary_t *dict, const void *key) * * Retunes the tree, self-optimizing for the element which belongs to key. * * Tuning the tree structure is a very complex operation. Unlike * 2-3-4 trees and BTree/BTree+ structures, this structure is a * constantly evolving algorithm. * * Instead of maintaining a balanced tree, we constantly adapt the * tree by nominating a new root nearby the most recently looked up * or added data. We are constantly retuning ourselves instead of * doing massive O(n) rebalance operations as seen in BTrees, * and the level of data stored in a tree is dynamic, instead of being * held to a restricted design like other trees. * * Moreover, we are different than a radix/patricia tree, because we * don't statically allocate positions. Radix trees have the advantage * of not requiring tuning or balancing operations while having the * disadvantage of requiring a large amount of memory to store * large trees. Our efficiency as far as speed goes is not as * fast as a radix tree; but is close to it. * * The retuning algorithm uses the comparison callback that is * passed in the initialization of the tree container. If the * comparator returns a value which is less than zero, we push the * losing node out of the way, causing it to later be reparented * with another node. The winning child of this comparison is always * the right-most node. * * Once we have reached the key which has been targeted, or have reached * a deadend, we nominate the nearest node as the new root of the tree. * If an exact match has been found, the new root becomes the node which * represents key. * * This results in a tree which can self-optimize for both critical * conditions: nodes which are distant and similar and trees which * have ordered lookups. * * Inputs: * - node to begin search from * * Outputs: * - none * * Side Effects: * - a new root node is nominated. */ void mowgli_dictionary_retune(mowgli_dictionary_t *dict, const void *key) { mowgli_dictionary_elem_t n, *tn, *left, *right, *node; ptrdiff_t ret; return_if_fail(dict != NULL); if (dict->root == NULL) return; /* * we initialize n with known values, since it's on stack * memory. otherwise the dict would become corrupted. * * n is used for temporary storage while the tree is retuned. * -nenolod */ n.left = n.right = NULL; left = right = &n; /* this for(;;) loop is the main workhorse of the rebalancing */ for (node = dict->root; ; ) { if ((ret = dict->compare_cb(key, node->key)) == 0) break; if (ret < 0) { if (node->left == NULL) break; if ((ret = dict->compare_cb(key, node->left->key)) < 0) { tn = node->left; node->left = tn->right; tn->right = node; node = tn; if (node->left == NULL) break; } right->left = node; right = node; node = node->left; } else { if (node->right == NULL) break; if ((ret = dict->compare_cb(key, node->right->key)) > 0) { tn = node->right; node->right = tn->left; tn->left = node; node = tn; if (node->right == NULL) break; } left->right = node; left = node; node = node->right; } } left->right = node->left; right->left = node->right; node->left = n.right; node->right = n.left; dict->root = node; } /* * mowgli_dictionary_link(mowgli_dictionary_t *dict, * mowgli_dictionary_elem_t *delem) * * Links a dictionary tree element to the dictionary. * * When we add new nodes to the tree, it becomes the * next nominated root. This is perhaps not a wise * optimization because of automatic retuning, but * it keeps the code simple. * * Inputs: * - dictionary tree * - dictionary tree element * * Outputs: * - nothing * * Side Effects: * - a node is linked to the dictionary tree */ void mowgli_dictionary_link(mowgli_dictionary_t *dict, mowgli_dictionary_elem_t *delem) { return_if_fail(dict != NULL); return_if_fail(delem != NULL); dict->dirty = true; dict->count++; if (dict->root == NULL) { delem->left = delem->right = NULL; delem->next = delem->prev = NULL; dict->head = dict->tail = dict->root = delem; } else { int ret; mowgli_dictionary_retune(dict, delem->key); if ((ret = dict->compare_cb(delem->key, dict->root->key)) < 0) { delem->left = dict->root->left; delem->right = dict->root; dict->root->left = NULL; if (dict->root->prev) dict->root->prev->next = delem; else dict->head = delem; delem->prev = dict->root->prev; delem->next = dict->root; dict->root->prev = delem; dict->root = delem; } else if (ret > 0) { delem->right = dict->root->right; delem->left = dict->root; dict->root->right = NULL; if (dict->root->next) dict->root->next->prev = delem; else dict->tail = delem; delem->next = dict->root->next; delem->prev = dict->root; dict->root->next = delem; dict->root = delem; } else { dict->root->key = delem->key; dict->root->data = delem->data; dict->count--; mowgli_heap_free(elem_heap, delem); } } } /* * mowgli_dictionary_unlink_root(mowgli_dictionary_t *dict) * * Unlinks the root dictionary tree element from the dictionary. * * Inputs: * - dictionary tree * * Outputs: * - nothing * * Side Effects: * - the root node is unlinked from the dictionary tree */ void mowgli_dictionary_unlink_root(mowgli_dictionary_t *dict) { mowgli_dictionary_elem_t *delem, *nextnode, *parentofnext; dict->dirty = true; delem = dict->root; if (delem == NULL) return; if (dict->root->left == NULL) dict->root = dict->root->right; else if (dict->root->right == NULL) dict->root = dict->root->left; else { /* Make the node with the next highest key the new root. * This node has a NULL left pointer. */ nextnode = delem->next; soft_assert(nextnode->left == NULL); if (nextnode == delem->right) { dict->root = nextnode; dict->root->left = delem->left; } else { parentofnext = delem->right; while (parentofnext->left != NULL && parentofnext->left != nextnode) parentofnext = parentofnext->left; soft_assert(parentofnext->left == nextnode); parentofnext->left = nextnode->right; dict->root = nextnode; dict->root->left = delem->left; dict->root->right = delem->right; } } /* linked list */ if (delem->prev != NULL) delem->prev->next = delem->next; if (dict->head == delem) dict->head = delem->next; if (delem->next) delem->next->prev = delem->prev; if (dict->tail == delem) dict->tail = delem->prev; dict->count--; } /* * mowgli_dictionary_destroy(mowgli_dictionary_t *dtree, * void (*destroy_cb)(dictionary_elem_t *delem, void *privdata), * void *privdata); * * Recursively destroys all nodes in a dictionary tree. * * Inputs: * - dictionary tree object * - optional iteration callback * - optional opaque/private data to pass to callback * * Outputs: * - nothing * * Side Effects: * - on success, a dtree and optionally it's children are destroyed. * * Notes: * - if this is called without a callback, the objects bound to the * DTree will not be destroyed. */ void mowgli_dictionary_destroy(mowgli_dictionary_t *dtree, void (*destroy_cb)(mowgli_dictionary_elem_t *delem, void *privdata), void *privdata) { mowgli_dictionary_elem_t *n, *tn; return_if_fail(dtree != NULL); MOWGLI_LIST_FOREACH_SAFE(n, tn, dtree->head) { if (destroy_cb != NULL) (*destroy_cb)(n, privdata); mowgli_heap_free(elem_heap, n); } mowgli_free(dtree); } /* * mowgli_dictionary_foreach(mowgli_dictionary_t *dtree, * void (*destroy_cb)(dictionary_elem_t *delem, void *privdata), * void *privdata); * * Iterates over all entries in a DTree. * * Inputs: * - dictionary tree object * - optional iteration callback * - optional opaque/private data to pass to callback * * Outputs: * - nothing * * Side Effects: * - on success, a dtree is iterated */ void mowgli_dictionary_foreach(mowgli_dictionary_t *dtree, int (*foreach_cb)(mowgli_dictionary_elem_t *delem, void *privdata), void *privdata) { mowgli_dictionary_elem_t *n, *tn; return_if_fail(dtree != NULL); MOWGLI_LIST_FOREACH_SAFE(n, tn, dtree->head) { /* delem_t is a subclass of node_t. */ mowgli_dictionary_elem_t *delem = (mowgli_dictionary_elem_t *) n; if (foreach_cb != NULL) (*foreach_cb)(delem, privdata); } } /* * mowgli_dictionary_search(mowgli_dictionary_t *dtree, * void (*destroy_cb)(mowgli_dictionary_elem_t *delem, void *privdata), * void *privdata); * * Searches all entries in a DTree using a custom callback. * * Inputs: * - dictionary tree object * - optional iteration callback * - optional opaque/private data to pass to callback * * Outputs: * - on success, the requested object * - on failure, NULL. * * Side Effects: * - a dtree is iterated until the requested conditions are met */ void *mowgli_dictionary_search(mowgli_dictionary_t *dtree, void *(*foreach_cb)(mowgli_dictionary_elem_t *delem, void *privdata), void *privdata) { mowgli_dictionary_elem_t *n, *tn; void *ret = NULL; return_val_if_fail(dtree != NULL, NULL); MOWGLI_LIST_FOREACH_SAFE(n, tn, dtree->head) { /* delem_t is a subclass of node_t. */ mowgli_dictionary_elem_t *delem = (mowgli_dictionary_elem_t *) n; if (foreach_cb != NULL) ret = (*foreach_cb)(delem, privdata); if (ret) break; } return ret; } /* * mowgli_dictionary_foreach_start(mowgli_dictionary_t *dtree, * mowgli_dictionary_iteration_state_t *state); * * Initializes a static DTree iterator. * * Inputs: * - dictionary tree object * - static DTree iterator * * Outputs: * - nothing * * Side Effects: * - the static iterator, &state, is initialized. */ void mowgli_dictionary_foreach_start(mowgli_dictionary_t *dtree, mowgli_dictionary_iteration_state_t *state) { return_if_fail(dtree != NULL); return_if_fail(state != NULL); state->cur = NULL; state->next = NULL; /* find first item */ state->cur = dtree->head; if (state->cur == NULL) return; /* make state->cur point to first item and state->next point to * second item */ state->next = state->cur; mowgli_dictionary_foreach_next(dtree, state); } /* * mowgli_dictionary_foreach_cur(mowgli_dictionary_t *dtree, * mowgli_dictionary_iteration_state_t *state); * * Returns the data from the current node being iterated by the * static iterator. * * Inputs: * - dictionary tree object * - static DTree iterator * * Outputs: * - reference to data in the current dtree node being iterated * * Side Effects: * - none */ void *mowgli_dictionary_foreach_cur(mowgli_dictionary_t *dtree, mowgli_dictionary_iteration_state_t *state) { return_val_if_fail(dtree != NULL, NULL); return_val_if_fail(state != NULL, NULL); return state->cur != NULL ? state->cur->data : NULL; } /* * mowgli_dictionary_foreach_next(mowgli_dictionary_t *dtree, * mowgli_dictionary_iteration_state_t *state); * * Advances a static DTree iterator. * * Inputs: * - dictionary tree object * - static DTree iterator * * Outputs: * - nothing * * Side Effects: * - the static iterator, &state, is advanced to a new DTree node. */ void mowgli_dictionary_foreach_next(mowgli_dictionary_t *dtree, mowgli_dictionary_iteration_state_t *state) { return_if_fail(dtree != NULL); return_if_fail(state != NULL); if (state->cur == NULL) { mowgli_log("mowgli_dictionary_foreach_next(): called again after iteration finished on dtree<%p>", dtree); return; } state->cur = state->next; if (state->next == NULL) return; state->next = state->next->next; } /* * mowgli_dictionary_find(mowgli_dictionary_t *dtree, const void *key) * * Looks up a DTree node by name. * * Inputs: * - dictionary tree object * - name of node to lookup * * Outputs: * - on success, the dtree node requested * - on failure, NULL * * Side Effects: * - none */ 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); /* retune for key, key will be the tree's root if it's available */ mowgli_dictionary_retune(dict, key); if (dict->root && !dict->compare_cb(key, dict->root->key)) return dict->root; return NULL; } /* * mowgli_dictionary_add(mowgli_dictionary_t *dtree, const void *key, void *data) * * Creates a new DTree node and binds data to it. * * Inputs: * - dictionary tree object * - name for new DTree node * - data to bind to the new DTree node * * Outputs: * - on success, a new DTree node * - on failure, NULL * * Side Effects: * - data is inserted into the DTree. */ mowgli_dictionary_elem_t *mowgli_dictionary_add(mowgli_dictionary_t *dict, const void *key, void *data) { mowgli_dictionary_elem_t *delem; return_val_if_fail(dict != NULL, NULL); return_val_if_fail(key != NULL, NULL); return_val_if_fail(data != NULL, NULL); return_val_if_fail(mowgli_dictionary_find(dict, key) == NULL, NULL); delem = mowgli_heap_alloc(elem_heap); delem->key = key; delem->data = data; if (delem->key == NULL) { mowgli_log("major WTF: delem->key is NULL, not adding node.", key); mowgli_heap_free(elem_heap, delem); return NULL; } mowgli_dictionary_link(dict, delem); return delem; } /* * mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const void *key) * * Deletes data from a dictionary tree. * * Inputs: * - dictionary tree object * - name of DTree node to delete * * Outputs: * - on success, the remaining data that needs to be mowgli_freed * - on failure, NULL * * Side Effects: * - data is removed from the DTree. * * Notes: * - the returned data needs to be mowgli_freed/released manually! */ void *mowgli_dictionary_delete(mowgli_dictionary_t *dtree, const void *key) { mowgli_dictionary_elem_t *delem = mowgli_dictionary_find(dtree, key); void *data; if (delem == NULL) return NULL; data = delem->data; mowgli_dictionary_unlink_root(dtree); mowgli_heap_free(elem_heap, delem); return data; } /* * mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const void *key) * * Retrieves data from a dictionary. * * Inputs: * - dictionary tree object * - name of node to lookup * * Outputs: * - on success, the data bound to the DTree node. * - on failure, NULL * * Side Effects: * - none */ void *mowgli_dictionary_retrieve(mowgli_dictionary_t *dtree, const void *key) { mowgli_dictionary_elem_t *delem = mowgli_dictionary_find(dtree, key); if (delem != NULL) return delem->data; return NULL; } /* * mowgli_dictionary_size(mowgli_dictionary_t *dict) * * Returns the size of a dictionary. * * Inputs: * - dictionary tree object * * Outputs: * - size of dictionary * * Side Effects: * - none */ unsigned int mowgli_dictionary_size(mowgli_dictionary_t *dict) { return_val_if_fail(dict != NULL, 0); return dict->count; } /* returns the sum of the depths of the subtree rooted in delem at depth depth */ static int stats_recurse(mowgli_dictionary_elem_t *delem, int depth, int *pmaxdepth) { int result; if (depth > *pmaxdepth) *pmaxdepth = depth; result = depth; if (delem->left) result += stats_recurse(delem->left, depth + 1, pmaxdepth); if (delem->right) result += stats_recurse(delem->right, depth + 1, pmaxdepth); return result; } /* * mowgli_dictionary_stats(mowgli_dictionary_t *dict, void (*cb)(const char *line, void *privdata), void *privdata) * * Returns the size of a dictionary. * * Inputs: * - dictionary tree object * - callback * - data for callback * * Outputs: * - none * * Side Effects: * - callback called with stats text */ void mowgli_dictionary_stats(mowgli_dictionary_t *dict, void (*cb)(const char *line, void *privdata), void *privdata) { char str[256]; int sum, maxdepth; return_if_fail(dict != NULL); if (dict->id != NULL) snprintf(str, sizeof str, "Dictionary stats for %s (%d)", dict->id, dict->count); else snprintf(str, sizeof str, "Dictionary stats for <%p> (%d)", dict, dict->count); cb(str, privdata); maxdepth = 0; if (dict->root != NULL) { sum = stats_recurse(dict->root, 0, &maxdepth); snprintf(str, sizeof str, "Depth sum %d Avg depth %d Max depth %d", sum, sum / dict->count, maxdepth); } else snprintf(str, sizeof str, "Depth sum 0 Avg depth 0 Max depth 0"); cb(str, privdata); return; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/dictionary.h000066400000000000000000000143111174351671600247070ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * dictionary.h: Dictionary-based storage. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007 Jilles Tjoelker * * 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_DICTIONARY_H__ #define __MOWGLI_DICTIONARY_H__ struct mowgli_dictionary_; /* defined in src/dictionary.c */ typedef struct mowgli_dictionary_ mowgli_dictionary_t; typedef struct mowgli_dictionary_elem_ mowgli_dictionary_elem_t; 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; const void *key; int position; }; /* * mowgli_dictionary_iteration_state_t, private. */ struct mowgli_dictionary_iteration_state_ { mowgli_dictionary_elem_t *cur, *next; void *pspare[4]; int ispare[4]; }; typedef struct mowgli_dictionary_iteration_state_ mowgli_dictionary_iteration_state_t; /* * this is a convenience macro for inlining iteration of dictionaries. */ #define MOWGLI_DICTIONARY_FOREACH(element, state, dict) for (mowgli_dictionary_foreach_start((dict), (state)); (element = mowgli_dictionary_foreach_cur((dict), (state))); mowgli_dictionary_foreach_next((dict), (state))) /* * mowgli_dictionary_create() creates a new dictionary tree. * 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_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_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_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_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 void *key); /* * mowgli_dictionary_destroy() destroys all entries in a dtree, and also optionally calls * a defined callback function to destroy any data attached to it. */ extern void mowgli_dictionary_destroy(mowgli_dictionary_t *dtree, void (*destroy_cb)(mowgli_dictionary_elem_t *delem, void *privdata), void *privdata); /* * mowgli_dictionary_foreach() iterates all entries in a dtree, and also optionally calls * a defined callback function to use any data attached to it. * * To shortcircuit iteration, return non-zero from the callback function. */ extern void mowgli_dictionary_foreach(mowgli_dictionary_t *dtree, int (*foreach_cb)(mowgli_dictionary_elem_t *delem, void *privdata), void *privdata); /* * mowgli_dictionary_search() iterates all entries in a dtree, and also optionally calls * a defined callback function to use any data attached to it. * * When the object is found, a non-NULL is returned from the callback, which results * in that object being returned to the user. */ extern void *mowgli_dictionary_search(mowgli_dictionary_t *dtree, void *(*foreach_cb)(mowgli_dictionary_elem_t *delem, void *privdata), void *privdata); /* * mowgli_dictionary_foreach_start() begins an iteration over all items * keeping state in the given struct. If there is only one iteration * in progress at a time, it is permitted to remove the current element * 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_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_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_dictionary_add() adds a key->value entry to the dictionary tree. */ 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 void *key); /* * mowgli_dictionary_find() returns data from a dtree for key 'key'. */ 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 void *key); void mowgli_dictionary_stats(mowgli_dictionary_t *dict, void (*cb)(const char *line, void *privdata), void *privdata); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/index.c000066400000000000000000000120631174351671600236460ustar00rootroot00000000000000/* * Copyright 2009-2011 John Lindgren * * 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 #include #include "mowgli.h" struct mowgli_index_ { void * * data; int count, size; int (* compare) (const void * a, const void * b, void * data); void * compare_data; }; static mowgli_heap_t *index_heap = NULL; void mowgli_index_init (void) { index_heap = mowgli_heap_create(sizeof(mowgli_index_t), 32, BH_NOW); } mowgli_index_t * mowgli_index_create (void) { mowgli_index_t * index = mowgli_heap_alloc(index_heap); index->data = NULL; index->count = 0; index->size = 0; index->compare = NULL; index->compare_data = NULL; return index; } void mowgli_index_destroy (mowgli_index_t * index) { mowgli_free (index->data); mowgli_heap_free (index_heap, index); } int mowgli_index_count (mowgli_index_t * index) { return index->count; } 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; 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) { index->data[at] = value; } void * mowgli_index_get (mowgli_index_t * index, int at) { return index->data[at]; } static void make_room (mowgli_index_t * index, int at, int count) { mowgli_index_allocate (index, index->count + count); if (at < index->count) memmove (index->data + at + count, index->data + at, sizeof (void *) * (index->count - at)); index->count += count; } void mowgli_index_insert (mowgli_index_t * index, int at, void * value) { make_room (index, at, 1); index->data[at] = value; } void mowgli_index_append (mowgli_index_t * index, void * value) { mowgli_index_insert (index, index->count, value); } void mowgli_index_copy_set (mowgli_index_t * source, int from, mowgli_index_t * target, int to, int count) { memcpy (target->data + to, source->data + from, sizeof (void *) * count); } void mowgli_index_copy_insert (mowgli_index_t * source, int from, mowgli_index_t * target, int to, int count) { make_room (target, to, count); memcpy (target->data + to, source->data + from, sizeof (void *) * count); } void mowgli_index_copy_append (mowgli_index_t * source, int from, mowgli_index_t * target, int count) { mowgli_index_copy_insert (source, from, target, target->count, count); } void mowgli_index_merge_insert (mowgli_index_t * first, int at, mowgli_index_t * second) { mowgli_index_copy_insert (second, 0, first, at, second->count); } void mowgli_index_merge_append (mowgli_index_t * first, mowgli_index_t * second) { mowgli_index_copy_insert (second, 0, first, first->count, second->count); } void mowgli_index_move (mowgli_index_t * index, int from, int to, int count) { memmove (index->data + to, index->data + from, sizeof (void *) * count); } void mowgli_index_delete (mowgli_index_t * index, int at, int count) { index->count -= count; memmove (index->data + at, index->data + at + count, sizeof (void *) * (index->count - at)); } void mowgli_index_sort (mowgli_index_t * index, int (* compare) (const void *, const void *)) { qsort(index->data, index->count, sizeof (void *), compare); } #ifdef NOTYET static int mowgli_index_compare_with_data (const void * a, const void * b, void * _index) { mowgli_index_t * index = _index; return index->compare (* (const void * *) a, * (const void * *) b, index->compare_data); } void mowgli_index_sort_with_data (mowgli_index_t * index, int (* compare) (const void * a, const void * b, void * data), void * data) { index->compare = compare; index->compare_data = data; g_qsort_with_data (index->data, index->count, sizeof (void *), mowgli_index_compare_with_data, index); index->compare = NULL; index->compare_data = NULL; } #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/index.h000066400000000000000000000047031174351671600236550ustar00rootroot00000000000000/* * Copyright 2009-2011 John Lindgren * * 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_INDEX_H__ #define __MOWGLI_INDEX_H__ struct mowgli_index_; typedef struct mowgli_index_ mowgli_index_t; mowgli_index_t * mowgli_index_create (void); void mowgli_index_destroy (mowgli_index_t * index); int mowgli_index_count (mowgli_index_t * index); void mowgli_index_allocate (mowgli_index_t * index, int size); void mowgli_index_set (mowgli_index_t * index, int at, void * value); void * mowgli_index_get (mowgli_index_t * index, int at); void mowgli_index_insert (mowgli_index_t * index, int at, void * value); void mowgli_index_append (mowgli_index_t * index, void * value); void mowgli_index_copy_set (mowgli_index_t * source, int from, mowgli_index_t * target, int to, int count); void mowgli_index_copy_insert (mowgli_index_t * source, int from, mowgli_index_t * target, int to, int count); void mowgli_index_copy_append (mowgli_index_t * source, int from, mowgli_index_t * target, int count); void mowgli_index_merge_insert (mowgli_index_t * first, int at, mowgli_index_t * second); void mowgli_index_merge_append (mowgli_index_t * first, mowgli_index_t * second); void mowgli_index_move (mowgli_index_t * index, int from, int to, int count); void mowgli_index_delete (mowgli_index_t * index, int at, int count); void mowgli_index_sort (mowgli_index_t * index, int (* compare) (const void * a, const void * b)); void mowgli_index_sort_with_data (mowgli_index_t * index, int (* compare) (const void * a, const void * b, void * data), void * data); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/list.c000066400000000000000000000211771174351671600235200ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * list.c: Linked lists. * * Copyright (c) 2007 William Pitcock * * 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_heap_t *mowgli_node_heap; static mowgli_heap_t *mowgli_list_heap; 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); if (mowgli_node_heap == NULL || mowgli_list_heap == NULL) { mowgli_log("heap allocator failure."); abort(); } } /* creates a new node */ mowgli_node_t *mowgli_node_create(void) { mowgli_node_t *n; /* allocate it */ n = mowgli_heap_alloc(mowgli_node_heap); /* initialize */ n->next = n->prev = n->data = NULL; /* return a pointer to the new node */ return n; } /* frees a node */ void mowgli_node_free(mowgli_node_t *n) { return_if_fail(n != NULL); /* free it */ mowgli_heap_free(mowgli_node_heap, n); } /* adds a node to the end of a list */ void mowgli_node_add(void *data, mowgli_node_t *n, mowgli_list_t *l) { mowgli_node_t *tn; return_if_fail(n != NULL); return_if_fail(l != NULL); n->next = n->prev = NULL; n->data = data; /* first node? */ if (l->head == NULL) { l->head = n; l->tail = n; l->count++; return; } /* use the cached tail. */ tn = l->tail; /* set the our `prev' to the last node */ n->prev = tn; /* set the last node's `next' to us */ n->prev->next = n; /* set the list's `tail' to us */ l->tail = n; /* up the count */ l->count++; } /* adds a node to the head of a list */ void mowgli_node_add_head(void *data, mowgli_node_t *n, mowgli_list_t *l) { mowgli_node_t *tn; return_if_fail(n != NULL); return_if_fail(l != NULL); n->next = n->prev = NULL; n->data = data; /* first node? */ if (!l->head) { l->head = n; l->tail = n; l->count++; return; } tn = l->head; n->next = tn; tn->prev = n; l->head = n; l->count++; } /* adds a node to a list before another node, or to the end */ void mowgli_node_add_before(void *data, mowgli_node_t *n, mowgli_list_t *l, mowgli_node_t *before) { return_if_fail(n != NULL); return_if_fail(l != NULL); if (before == NULL) mowgli_node_add(data, n, l); else if (before == l->head) mowgli_node_add_head(data, n, l); else { n->data = data; n->prev = before->prev; n->next = before; before->prev = n; if (n->prev != NULL) n->prev->next = n; l->count++; } } /* adds a node to a list after another node, or to the end */ void mowgli_node_add_after(void *data, mowgli_node_t *n, mowgli_list_t *l, mowgli_node_t *before) { return_if_fail(n != NULL); return_if_fail(l != NULL); if (before == NULL || before->next == NULL) mowgli_node_add(data, n, l); else { n->data = data; n->prev = before; n->next = before->next; before->next = n; n->next->prev = n; l->count++; } } /* retrieves a node at `position` position. */ mowgli_node_t *mowgli_node_nth(mowgli_list_t *l, size_t pos) { size_t iter; mowgli_node_t *n; return_val_if_fail(l != NULL, 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); else for (iter = MOWGLI_LIST_LENGTH(l) - 1, n = l->tail; iter != pos && n != NULL; iter--, n = n->prev); return n; } /* returns the data from node at `position` position, or NULL. */ void *mowgli_node_nth_data(mowgli_list_t *l, size_t pos) { mowgli_node_t *n; return_val_if_fail(l != NULL, NULL); n = mowgli_node_nth(l, pos); if (n == NULL) return NULL; return n->data; } /* inserts a node at `position` position. */ void mowgli_node_insert(void *data, mowgli_node_t *n, mowgli_list_t *l, size_t pos) { mowgli_node_t *tn; return_if_fail(n != NULL); return_if_fail(l != NULL); /* locate the proper position. */ tn = mowgli_node_nth(l, pos); mowgli_node_add_before(data, n, l, tn); } /* retrieves the index position of a node in a list. */ ssize_t mowgli_node_index(mowgli_node_t *n, mowgli_list_t *l) { ssize_t iter; mowgli_node_t *tn; return_val_if_fail(n != NULL, -1); return_val_if_fail(l != NULL, -1); /* locate the proper position. */ for (iter = 0, tn = l->head; tn != n && tn != NULL; iter++, tn = tn->next); return iter < (ssize_t) MOWGLI_LIST_LENGTH(l) ? iter : -1; } /* deletes a link between a node and a list. */ void mowgli_node_delete(mowgli_node_t *n, mowgli_list_t *l) { return_if_fail(n != NULL); return_if_fail(l != NULL); /* are we the head? */ if (!n->prev) l->head = n->next; else n->prev->next = n->next; /* are we the tail? */ if (!n->next) l->tail = n->prev; else n->next->prev = n->prev; /* down the count */ l->count--; } /* finds a node by `data' */ mowgli_node_t *mowgli_node_find(void *data, mowgli_list_t *l) { mowgli_node_t *n; return_val_if_fail(l != NULL, NULL); MOWGLI_LIST_FOREACH(n, l->head) if (n->data == data) return n; return NULL; } /* moves a node from one list to another. */ void mowgli_node_move(mowgli_node_t *m, mowgli_list_t *oldlist, mowgli_list_t *newlist) { return_if_fail(m != NULL); return_if_fail(oldlist != NULL); return_if_fail(newlist != NULL); /* Assumption: If m->next == NULL, then list->tail == m * and: If m->prev == NULL, then list->head == m */ if (m->next != NULL) m->next->prev = m->prev; else oldlist->tail = m->prev; if (m->prev != NULL) m->prev->next = m->next; else oldlist->head = m->next; m->prev = NULL; m->next = newlist->head; if (newlist->head != NULL) newlist->head->prev = m; else if (newlist->tail == NULL) newlist->tail = m; newlist->head = m; oldlist->count--; newlist->count++; } /* creates a new list. */ mowgli_list_t *mowgli_list_create(void) { mowgli_list_t *out = mowgli_heap_alloc(mowgli_list_heap); return out; } /* frees a created list. */ void mowgli_list_free(mowgli_list_t *l) { mowgli_heap_free(mowgli_list_heap, l); } /* concatenates two lists together. */ void mowgli_list_concat(mowgli_list_t *l, mowgli_list_t *l2) { return_if_fail(l != NULL); return_if_fail(l2 != NULL); 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; /* clear out l2 as it is no longer needed. */ l2->head = l2->tail = NULL; l2->count = 0; } /* reverse a list -- O(n)! */ void mowgli_list_reverse(mowgli_list_t *l) { mowgli_node_t *n, *tn; return_if_fail(l != NULL); MOWGLI_LIST_FOREACH_SAFE(n, tn, l->head) { mowgli_node_t *tn2 = n->next; n->next = n->prev; n->prev = tn2; } tn = l->head; l->head = l->tail; l->tail = tn; } /* sorts a list -- O(n ^ 2) most likely, i don't want to think about it. --nenolod */ void mowgli_list_sort(mowgli_list_t *l, mowgli_list_comparator_t comp, void *opaque) { mowgli_node_t *n, *tn, *n2, *tn2; return_if_fail(l != NULL); return_if_fail(comp != NULL); MOWGLI_LIST_FOREACH_SAFE(n, tn, l->head) { MOWGLI_LIST_FOREACH_SAFE(n2, tn2, l->head) { int result; int i, i2; if (n == n2) continue; i = mowgli_node_index(n, l); i2 = mowgli_node_index(n2, l); if ((result = comp(n, n2, opaque)) == 0) continue; else if (result < 0 && i > i2) { mowgli_node_delete(n, l); mowgli_node_add_before(n->data, n, l, n2); } else if (result > 0 && i < i2) { mowgli_node_delete(n, l); mowgli_node_add_after(n->data, n, l, n2); } } } } libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/list.h000066400000000000000000000066131174351671600235230ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * list.h: Linked lists. * * Copyright (c) 2007 William Pitcock * * 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_LIST_H__ #define __MOWGLI_LIST_H__ /* macros for linked lists */ #define MOWGLI_LIST_FOREACH(n, head) for (n = (head); n; n = n->next) #define MOWGLI_LIST_FOREACH_NEXT(n, head) for (n = (head); n->next; n = n->next) #define MOWGLI_LIST_FOREACH_PREV(n, tail) for (n = (tail); n; n = n->prev) #define MOWGLI_LIST_LENGTH(list) (list)->count #define MOWGLI_LIST_FOREACH_SAFE(n, tn, head) for (n = (head), tn = n ? n->next : NULL; n != NULL; n = tn, tn = n ? n->next : NULL) /* list node struct */ typedef struct mowgli_node_ mowgli_node_t; typedef struct mowgli_list_ mowgli_list_t; struct mowgli_node_ { struct mowgli_node_ *next, *prev; void *data; /* pointer to real structure */ }; /* node list struct */ struct mowgli_list_ { mowgli_node_t *head, *tail; size_t count; /* how many entries in the list */ }; 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, 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, 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); extern mowgli_list_t *mowgli_list_create(void); extern void mowgli_list_free(mowgli_list_t *l); extern void mowgli_list_concat(mowgli_list_t *l, mowgli_list_t *l2); extern void mowgli_list_reverse(mowgli_list_t *l); extern void mowgli_list_sort(mowgli_list_t *l, mowgli_list_comparator_t comp, void *opaque); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/patricia.c000066400000000000000000000572171174351671600243450ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * patricia.c: Dictionary-based information storage. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007-2010 Jilles Tjoelker * * 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" static mowgli_heap_t *leaf_heap = NULL; static mowgli_heap_t *node_heap = NULL; /* * Patricia tree. * * A radix trie that avoids one-way branching and redundant nodes. * * To find a node, the tree is traversed starting from the root. The * nibnum in each node indicates which nibble of the key needs to be * tested, and the appropriate branch is taken. * * The nibnum values are strictly increasing while going down the tree. * * -- jilles */ union patricia_elem; struct mowgli_patricia_ { void (*canonize_cb)(char *key); union patricia_elem *root; unsigned int count; char *id; }; #define POINTERS_PER_NODE 16 #define NIBBLE_VAL(key, nibnum) (((key)[(nibnum) / 2] >> ((nibnum) & 1 ? 0 : 4)) & 0xF) struct patricia_node { /* nibble to test (nibble NUM%2 of byte NUM/2) */ int nibnum; /* branches of the tree */ union patricia_elem *down[POINTERS_PER_NODE]; union patricia_elem *parent; char parent_val; }; /* mowgli_patricia_elem_ is the name used in mowgli_patricia.h. * patricia_leaf is the name historically used here. */ #define patricia_leaf mowgli_patricia_elem_ struct patricia_leaf { /* -1 to indicate this is a leaf, not a node */ int nibnum; /* data associated with the key */ void *data; /* key (canonized copy) */ char *key; union patricia_elem *parent; char parent_val; }; union patricia_elem { int nibnum; struct patricia_node node; struct patricia_leaf leaf; }; #define IS_LEAF(elem) ((elem)->nibnum == -1) /* Preserve compatibility with the old mowgli_patricia.h */ #define STATE_CUR(state) ((state)->pspare[0]) #define STATE_NEXT(state) ((state)->pspare[1]) /* * first_leaf() * * Find the smallest leaf hanging off a subtree. * * Inputs: * - element (may be leaf or node) heading subtree * * Outputs: * - lowest leaf in subtree * * Side Effects: * - none */ static union patricia_elem *first_leaf(union patricia_elem *delem) { int val; while (!IS_LEAF(delem)) { for (val = 0; val < POINTERS_PER_NODE; val++) { if (delem->node.down[val] != NULL) { delem = delem->node.down[val]; break; } } } return delem; } /* * mowgli_patricia_create(void (*canonize_cb)(char *key)) * * Dictionary object factory. * * Inputs: * - function to use for canonizing keys (for example, use * a function that makes the string upper case to create * a patricia with case-insensitive matching) * * Outputs: * - on success, a new patricia object. * * Side Effects: * - if services runs out of memory and cannot allocate the object, * the program will abort. */ mowgli_patricia_t *mowgli_patricia_create(void (*canonize_cb)(char *key)) { mowgli_patricia_t *dtree = (mowgli_patricia_t *) mowgli_alloc(sizeof(mowgli_patricia_t)); dtree->canonize_cb = canonize_cb; if (!leaf_heap) leaf_heap = mowgli_heap_create(sizeof(struct patricia_leaf), 1024, BH_NOW); if (!node_heap) node_heap = mowgli_heap_create(sizeof(struct patricia_node), 128, BH_NOW); dtree->root = NULL; return dtree; } /* * mowgli_patricia_create_named(const char *name, * void (*canonize_cb)(char *key)) * * Dictionary object factory. * * Inputs: * - patricia name * - function to use for canonizing keys (for example, use * a function that makes the string upper case to create * a patricia with case-insensitive matching) * * Outputs: * - on success, a new patricia object. * * Side Effects: * - if services runs out of memory and cannot allocate the object, * the program will abort. */ mowgli_patricia_t *mowgli_patricia_create_named(const char *name, void (*canonize_cb)(char *key)) { mowgli_patricia_t *dtree = (mowgli_patricia_t *) mowgli_alloc(sizeof(mowgli_patricia_t)); dtree->canonize_cb = canonize_cb; dtree->id = mowgli_strdup(name); if (!leaf_heap) leaf_heap = mowgli_heap_create(sizeof(struct patricia_leaf), 1024, BH_NOW); if (!node_heap) node_heap = mowgli_heap_create(sizeof(struct patricia_node), 128, BH_NOW); dtree->root = NULL; return dtree; } /* * 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); * * Recursively destroys all nodes in a patricia tree. * * Inputs: * - patricia tree object * - optional iteration callback * - optional opaque/private data to pass to callback * * Outputs: * - nothing * * Side Effects: * - on success, a dtree and optionally it's children are destroyed. * * Notes: * - if this is called without a callback, the objects bound to the * DTree will not be destroyed. */ void mowgli_patricia_destroy(mowgli_patricia_t *dtree, void (*destroy_cb)(const char *key, void *data, void *privdata), void *privdata) { mowgli_patricia_iteration_state_t state; union patricia_elem *delem; void *entry; return_if_fail(dtree != NULL); MOWGLI_PATRICIA_FOREACH(entry, &state, dtree) { delem = STATE_CUR(&state); if (destroy_cb != NULL) (*destroy_cb)(delem->leaf.key, delem->leaf.data, privdata); mowgli_patricia_delete(dtree, delem->leaf.key); } mowgli_free(dtree); } /* * mowgli_patricia_foreach(mowgli_patricia_t *dtree, * int (*foreach_cb)(const char *key, void *data, void *privdata), * void *privdata); * * Iterates over all entries in a DTree. * * Inputs: * - patricia tree object * - optional iteration callback * - optional opaque/private data to pass to callback * * Outputs: * - nothing * * Side Effects: * - on success, a dtree is iterated */ void mowgli_patricia_foreach(mowgli_patricia_t *dtree, int (*foreach_cb)(const char *key, void *data, void *privdata), void *privdata) { union patricia_elem *delem, *next; int val; return_if_fail(dtree != NULL); delem = dtree->root; if (delem == NULL) return; /* Only one element in the tree */ if (IS_LEAF(delem)) { if (foreach_cb != NULL) (*foreach_cb)(delem->leaf.key, delem->leaf.data, privdata); return; } val = 0; do { do next = delem->node.down[val++]; while (next == NULL && val < POINTERS_PER_NODE); if (next != NULL) { if (IS_LEAF(next)) { if (foreach_cb != NULL) (*foreach_cb)(next->leaf.key, next->leaf.data, privdata); } else { delem = next; val = 0; } } while (val >= POINTERS_PER_NODE) { val = delem->node.parent_val; delem = delem->node.parent; if (delem == NULL) break; val++; } } while (delem != NULL); } /* * mowgli_patricia_search(mowgli_patricia_t *dtree, * void *(*foreach_cb)(const char *key, void *data, void *privdata), * void *privdata); * * Searches all entries in a DTree using a custom callback. * * Inputs: * - patricia tree object * - optional iteration callback * - optional opaque/private data to pass to callback * * Outputs: * - on success, the requested object * - on failure, NULL. * * Side Effects: * - a dtree is iterated until the requested conditions are met */ void *mowgli_patricia_search(mowgli_patricia_t *dtree, void *(*foreach_cb)(const char *key, void *data, void *privdata), void *privdata) { union patricia_elem *delem, *next; int val; void *ret = NULL; return_val_if_fail(dtree != NULL, NULL); delem = dtree->root; if (delem == NULL) return NULL; /* Only one element in the tree */ if (IS_LEAF(delem)) { if (foreach_cb != NULL) return (*foreach_cb)(delem->leaf.key, delem->leaf.data, privdata); return NULL; } val = 0; for (;;) { do next = delem->node.down[val++]; while (next == NULL && val < POINTERS_PER_NODE); if (next != NULL) { if (IS_LEAF(next)) { if (foreach_cb != NULL) ret = (*foreach_cb)(next->leaf.key, next->leaf.data, privdata); if (ret != NULL) break; } else { delem = next; val = 0; } } while (val >= POINTERS_PER_NODE) { val = delem->node.parent_val; delem = delem->node.parent; if (delem == NULL) break; val++; } } return ret; } /* * mowgli_patricia_foreach_start(mowgli_patricia_t *dtree, * mowgli_patricia_iteration_state_t *state); * * Initializes a static DTree iterator. * * Inputs: * - patricia tree object * - static DTree iterator * * Outputs: * - nothing * * Side Effects: * - the static iterator, &state, is initialized. */ void mowgli_patricia_foreach_start(mowgli_patricia_t *dtree, mowgli_patricia_iteration_state_t *state) { if (dtree == NULL) return; return_if_fail(state != NULL); if (dtree->root != NULL) STATE_NEXT(state) = first_leaf(dtree->root); else STATE_NEXT(state) = NULL; STATE_CUR(state) = STATE_NEXT(state); if (STATE_NEXT(state) == NULL) return; /* make STATE_CUR point to first item and STATE_NEXT point to * second item */ mowgli_patricia_foreach_next(dtree, state); } /* * mowgli_patricia_foreach_cur(mowgli_patricia_t *dtree, * mowgli_patricia_iteration_state_t *state); * * Returns the data from the current node being iterated by the * static iterator. * * Inputs: * - patricia tree object * - static DTree iterator * * Outputs: * - reference to data in the current dtree node being iterated * * Side Effects: * - none */ void *mowgli_patricia_foreach_cur(mowgli_patricia_t *dtree, mowgli_patricia_iteration_state_t *state) { if (dtree == NULL) return NULL; return_val_if_fail(state != NULL, NULL); return STATE_CUR(state) != NULL ? ((struct patricia_leaf *)STATE_CUR(state))->data : NULL; } /* * mowgli_patricia_foreach_next(mowgli_patricia_t *dtree, * mowgli_patricia_iteration_state_t *state); * * Advances a static DTree iterator. * * Inputs: * - patricia tree object * - static DTree iterator * * Outputs: * - nothing * * Side Effects: * - the static iterator, &state, is advanced to a new DTree node. */ void mowgli_patricia_foreach_next(mowgli_patricia_t *dtree, mowgli_patricia_iteration_state_t *state) { struct patricia_leaf *leaf; union patricia_elem *delem, *next; int val; if (dtree == NULL) return; return_if_fail(state != NULL); if (STATE_CUR(state) == NULL) { mowgli_log("mowgli_patricia_foreach_next(): called again after iteration finished on dtree<%p>", dtree); return; } STATE_CUR(state) = STATE_NEXT(state); if (STATE_NEXT(state) == NULL) return; leaf = STATE_NEXT(state); delem = leaf->parent; val = leaf->parent_val; while (delem != NULL) { do next = delem->node.down[val++]; while (next == NULL && val < POINTERS_PER_NODE); if (next != NULL) { if (IS_LEAF(next)) { /* We will find the original leaf first. */ if (&next->leaf != leaf) { if (strcmp(next->leaf.key, leaf->key) < 0) { mowgli_log("mowgli_patricia_foreach_next(): iteration went backwards (libmowgli bug) on dtree<%p>", dtree); STATE_NEXT(state) = NULL; return; } STATE_NEXT(state) = next; return; } } else { delem = next; val = 0; } } while (val >= POINTERS_PER_NODE) { val = delem->node.parent_val; delem = delem->node.parent; if (delem == NULL) break; val++; } } STATE_NEXT(state) = NULL; } /* * mowgli_patricia_elem_find(mowgli_patricia_t *dtree, const char *key) * * Looks up a DTree node by name. * * Inputs: * - patricia tree object * - name of node to lookup * * Outputs: * - on success, the dtree node requested * - on failure, NULL * * Side Effects: * - none */ struct patricia_leaf *mowgli_patricia_elem_find(mowgli_patricia_t *dict, const char *key) { char ckey_store[256]; char *ckey_buf = NULL; const char *ckey; union patricia_elem *delem; int val, keylen; return_val_if_fail(dict != NULL, NULL); return_val_if_fail(key != NULL, NULL); keylen = strlen(key); if (dict->canonize_cb == NULL) ckey = key; else { if (keylen >= (int) sizeof(ckey_store)) { ckey_buf = mowgli_strdup(key); dict->canonize_cb(ckey_buf); ckey = ckey_buf; } else { mowgli_strlcpy(ckey_store, key, sizeof ckey_store); dict->canonize_cb(ckey_store); ckey = ckey_store; } } delem = dict->root; while (delem != NULL && !IS_LEAF(delem)) { if (delem->nibnum / 2 < keylen) val = NIBBLE_VAL(ckey, delem->nibnum); else val = 0; delem = delem->node.down[val]; } /* Now, if the key is in the tree, delem contains it. */ if (delem != NULL && strcmp(delem->leaf.key, ckey)) delem = NULL; if (ckey_buf != NULL) mowgli_free(ckey_buf); return &delem->leaf; } /* * mowgli_patricia_add(mowgli_patricia_t *dtree, const char *key, void *data) * * Creates a new DTree node and binds data to it. * * Inputs: * - patricia tree object * - name for new DTree node * - data to bind to the new DTree node * * Outputs: * - on success, TRUE * - on failure, FALSE * * Side Effects: * - data is inserted into the DTree. */ struct patricia_leaf *mowgli_patricia_elem_add(mowgli_patricia_t *dict, const char *key, void *data) { char *ckey; union patricia_elem *delem, *prev, *newnode; union patricia_elem **place1; int val, keylen; int i, j; return_val_if_fail(dict != NULL, FALSE); return_val_if_fail(key != NULL, FALSE); return_val_if_fail(data != NULL, FALSE); keylen = strlen(key); ckey = mowgli_strdup(key); if (ckey == NULL) { mowgli_log("major WTF: ckey is NULL, not adding node."); return NULL; } if (dict->canonize_cb != NULL) dict->canonize_cb(ckey); prev = NULL; val = POINTERS_PER_NODE + 2; /* trap value */ delem = dict->root; while (delem != NULL && !IS_LEAF(delem)) { prev = delem; if (delem->nibnum / 2 < keylen) val = NIBBLE_VAL(ckey, delem->nibnum); else val = 0; delem = delem->node.down[val]; } /* Now, if the key is in the tree, delem contains it. */ if (delem != NULL && !strcmp(delem->leaf.key, ckey)) { mowgli_log("Key is already in dict, ignoring duplicate"); mowgli_free(ckey); return NULL; } if (delem == NULL && prev != NULL) { /* Get a leaf to compare with. */ delem = first_leaf(prev); } if (delem == NULL) { soft_assert(prev == NULL); 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; (*place1)->leaf.parent = prev; (*place1)->leaf.parent_val = val; dict->count++; return &(*place1)->leaf; } /* Find the first nibble where they differ. */ for (i = 0; NIBBLE_VAL(ckey, i) == NIBBLE_VAL(delem->leaf.key, i); i++) ; /* Find where to insert the new node. */ while (prev != NULL && prev->nibnum > i) { val = prev->node.parent_val; prev = prev->node.parent; } if (prev == NULL || prev->nibnum < i) { /* 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; for (j = 0; j < POINTERS_PER_NODE; j++) newnode->node.down[j] = NULL; if (prev == NULL) { newnode->node.down[NIBBLE_VAL(delem->leaf.key, i)] = dict->root; if (IS_LEAF(dict->root)) { dict->root->leaf.parent = newnode; dict->root->leaf.parent_val = NIBBLE_VAL(delem->leaf.key, i); } else { soft_assert(dict->root->nibnum > i); dict->root->node.parent = newnode; dict->root->node.parent_val = NIBBLE_VAL(delem->leaf.key, i); } dict->root = newnode; } else { newnode->node.down[NIBBLE_VAL(delem->leaf.key, i)] = prev->node.down[val]; if (IS_LEAF(prev->node.down[val])) { prev->node.down[val]->leaf.parent = newnode; prev->node.down[val]->leaf.parent_val = NIBBLE_VAL(delem->leaf.key, i); } else { prev->node.down[val]->node.parent = newnode; prev->node.down[val]->node.parent_val = NIBBLE_VAL(delem->leaf.key, i); } prev->node.down[val] = newnode; } } else { /* This nibble is already checked. */ soft_assert(prev->nibnum == i); newnode = prev; } val = NIBBLE_VAL(ckey, i); 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; (*place1)->leaf.parent = newnode; (*place1)->leaf.parent_val = val; dict->count++; return &(*place1)->leaf; } mowgli_boolean_t mowgli_patricia_add(mowgli_patricia_t *dict, const char *key, void *data) { return (mowgli_patricia_elem_add(dict, key, data) != NULL) ? TRUE : FALSE; } /* * mowgli_patricia_delete(mowgli_patricia_t *dtree, const char *key) * * Deletes data from a patricia tree. * * Inputs: * - patricia tree object * - name of DTree node to delete * * Outputs: * - on success, the remaining data that needs to be mowgli_freed * - on failure, NULL * * Side Effects: * - data is removed from the DTree. * * Notes: * - the returned data needs to be mowgli_freed/released manually! */ void *mowgli_patricia_delete(mowgli_patricia_t *dict, const char *key) { void *data; struct patricia_leaf *leaf; leaf = mowgli_patricia_elem_find(dict, key); if (leaf == NULL) return NULL; data = leaf->data; mowgli_patricia_elem_delete(dict, leaf); return data; } void mowgli_patricia_elem_delete(mowgli_patricia_t *dict, struct patricia_leaf *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; prev = delem->leaf.parent; mowgli_free(delem->leaf.key); mowgli_heap_free(leaf_heap, delem); if (prev != NULL) { prev->node.down[val] = NULL; /* Leaf is gone, now consider the node it was in. */ delem = prev; used = -1; for (i = 0; i < POINTERS_PER_NODE; i++) if (delem->node.down[i] != NULL) used = used == -1 ? i : -2; soft_assert(used == -2 || used >= 0); if (used >= 0) { /* Only one pointer in this node, remove it. * Replace the pointer that pointed to it by * the sole pointer in it. */ next = delem->node.down[used]; val = delem->node.parent_val; prev = delem->node.parent; if (prev != NULL) prev->node.down[val] = next; else dict->root = next; if (IS_LEAF(next)) next->leaf.parent = prev, next->leaf.parent_val = val; else next->node.parent = prev, next->node.parent_val = val; mowgli_heap_free(node_heap, delem); } } else { /* This was the last leaf. */ dict->root = NULL; } dict->count--; if (dict->count == 0) { soft_assert(dict->root == NULL); dict->root = NULL; } } /* * mowgli_patricia_retrieve(mowgli_patricia_t *dtree, const char *key) * * Retrieves data from a patricia. * * Inputs: * - patricia tree object * - name of node to lookup * * Outputs: * - on success, the data bound to the DTree node. * - on failure, NULL * * Side Effects: * - none */ void *mowgli_patricia_retrieve(mowgli_patricia_t *dtree, const char *key) { struct patricia_leaf *delem = mowgli_patricia_elem_find(dtree, key); if (delem != NULL) return delem->data; return NULL; } 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; } /* * mowgli_patricia_size(mowgli_patricia_t *dict) * * Returns the size of a patricia. * * Inputs: * - patricia tree object * * Outputs: * - size of patricia * * Side Effects: * - none */ unsigned int mowgli_patricia_size(mowgli_patricia_t *dict) { return_val_if_fail(dict != NULL, 0); return dict->count; } /* returns the sum of the depths of the subtree rooted in delem at depth depth */ /* there is no need for this to be recursive, but it is easier... */ static int stats_recurse(union patricia_elem *delem, int depth, int *pmaxdepth) { int result = 0; int val; union patricia_elem *next; if (depth > *pmaxdepth) *pmaxdepth = depth; if (depth == 0) { if (IS_LEAF(delem)) { soft_assert(delem->leaf.parent == NULL); } else { soft_assert(delem->node.parent == NULL); } } if (IS_LEAF(delem)) return depth; for (val = 0; val < POINTERS_PER_NODE; val++) { next = delem->node.down[val]; if (next == NULL) continue; result += stats_recurse(next, depth + 1, pmaxdepth); if (IS_LEAF(next)) { soft_assert(next->leaf.parent == delem); soft_assert(next->leaf.parent_val == val); } else { soft_assert(next->node.parent == delem); soft_assert(next->node.parent_val == val); soft_assert(next->node.nibnum > delem->node.nibnum); } } return result; } /* * mowgli_patricia_stats(mowgli_patricia_t *dict, void (*cb)(const char *line, void *privdata), void *privdata) * * Returns the size of a patricia. * * Inputs: * - patricia tree object * - callback * - data for callback * * Outputs: * - none * * Side Effects: * - callback called with stats text */ void mowgli_patricia_stats(mowgli_patricia_t *dict, void (*cb)(const char *line, void *privdata), void *privdata) { char str[256]; int sum, maxdepth; return_if_fail(dict != NULL); if (dict->id != NULL) snprintf(str, sizeof str, "Dictionary stats for %s (%d)", dict->id, dict->count); else snprintf(str, sizeof str, "Dictionary stats for <%p> (%d)", dict, dict->count); cb(str, privdata); maxdepth = 0; if (dict->count > 0) { sum = stats_recurse(dict->root, 0, &maxdepth); snprintf(str, sizeof str, "Depth sum %d Avg depth %d Max depth %d", sum, sum / dict->count, maxdepth); } else snprintf(str, sizeof str, "Depth sum 0 Avg depth 0 Max depth 0"); cb(str, privdata); return; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/patricia.h000066400000000000000000000141351174351671600243420ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * patricia.h: Dictionary-based storage. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007-2008 Jilles Tjoelker * * 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. */ #ifndef __MOWGLI_PATRICIA_H__ #define __MOWGLI_PATRICIA_H__ struct mowgli_patricia_; /* defined in src/patricia.c */ struct mowgli_patricia_elem_; /* defined in src/patricia.c */ typedef struct mowgli_patricia_ mowgli_patricia_t; typedef struct mowgli_patricia_elem_ mowgli_patricia_elem_t; /* * mowgli_patricia_iteration_state_t, private. */ struct mowgli_patricia_iteration_state_ { mowgli_patricia_elem_t *cur, *next; void *pspare[4]; int ispare[4]; }; typedef struct mowgli_patricia_iteration_state_ mowgli_patricia_iteration_state_t; /* * this is a convenience macro for inlining iteration of dictionaries. */ #define MOWGLI_PATRICIA_FOREACH(element, state, dict) for (mowgli_patricia_foreach_start((dict), (state)); (element = mowgli_patricia_foreach_cur((dict), (state))); mowgli_patricia_foreach_next((dict), (state))) /* * mowgli_patricia_create() creates a new patricia tree of the defined resolution. * compare_cb is the canonizing function. */ /* defined if this version of Mowgli allows canonize_cb to be NULL */ #define MOWGLI_PATRICIA_ALLOWS_NULL_CANONIZE 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. */ extern void mowgli_patricia_destroy(mowgli_patricia_t *dtree, void (*destroy_cb)(const char *key, void *data, void *privdata), void *privdata); /* * mowgli_patricia_foreach() iterates all entries in a dtree, and also optionally calls * a defined callback function to use any data attached to it. * * To shortcircuit iteration, return non-zero from the callback function. */ extern void mowgli_patricia_foreach(mowgli_patricia_t *dtree, int (*foreach_cb)(const char *key, void *data, void *privdata), void *privdata); /* * mowgli_patricia_search() iterates all entries in a dtree, and also optionally calls * a defined callback function to use any data attached to it. * * When the object is found, a non-NULL is returned from the callback, which results * in that object being returned to the user. */ extern void *mowgli_patricia_search(mowgli_patricia_t *dtree, void *(*foreach_cb)(const char *key, void *data, void *privdata), void *privdata); /* * mowgli_patricia_foreach_start() begins an iteration over all items * keeping state in the given struct. If there is only one iteration * in progress at a time, it is permitted to remove the current element * of the iteration (but not any other element). */ extern void mowgli_patricia_foreach_start(mowgli_patricia_t *dtree, mowgli_patricia_iteration_state_t *state); /* * mowgli_patricia_foreach_cur() returns the current element of the iteration, * or NULL if there are no more elements. */ extern void *mowgli_patricia_foreach_cur(mowgli_patricia_t *dtree, mowgli_patricia_iteration_state_t *state); /* * mowgli_patricia_foreach_next() moves to the next element. */ extern void mowgli_patricia_foreach_next(mowgli_patricia_t *dtree, mowgli_patricia_iteration_state_t *state); /* * mowgli_patricia_add() adds a key->value entry to the patricia tree. */ extern mowgli_boolean_t mowgli_patricia_add(mowgli_patricia_t *dtree, const char *key, void *data); /* * mowgli_patricia_find() returns data from a dtree for key 'key'. */ extern void *mowgli_patricia_retrieve(mowgli_patricia_t *dtree, const char *key); /* * mowgli_patricia_delete() deletes a key->value entry from the patricia tree. */ extern void *mowgli_patricia_delete(mowgli_patricia_t *dtree, const char *key); /* Low-level functions */ mowgli_patricia_elem_t *mowgli_patricia_elem_add(mowgli_patricia_t *dtree, const char *key, void *data); mowgli_patricia_elem_t *mowgli_patricia_elem_find(mowgli_patricia_t *dtree, const char *key); void mowgli_patricia_elem_delete(mowgli_patricia_t *dtree, mowgli_patricia_elem_t *elem); const char *mowgli_patricia_elem_get_key(mowgli_patricia_elem_t *elem); void mowgli_patricia_elem_set_data(mowgli_patricia_elem_t *elem, void *data); void *mowgli_patricia_elem_get_data(mowgli_patricia_elem_t *elem); unsigned int mowgli_patricia_size(mowgli_patricia_t *dict); void mowgli_patricia_stats(mowgli_patricia_t *dict, void (*cb)(const char *line, void *privdata), void *privdata); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/queue.c000066400000000000000000000111161174351671600236610ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * queue.c: Double-ended queues, also known as deque. * * Copyright (c) 2007 William Pitcock * * 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_heap_t *mowgli_queue_heap = NULL; void mowgli_queue_bootstrap(void) { mowgli_queue_heap = mowgli_heap_create(sizeof(mowgli_queue_t), 256, BH_NOW); if (mowgli_queue_heap == NULL) mowgli_log("mowgli_queue_heap was not created, expect problems."); } mowgli_queue_t * 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; if (head != NULL) { out->prev = head->prev; if (out->prev != NULL) out->prev->next = out; head->prev = out; } return out; } mowgli_queue_t * 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; if (head != NULL) head->next = out; return out; } mowgli_queue_t * 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; if (head->next != NULL) head->next->prev = head->prev; out = head->prev != NULL ? head->prev : head->next; mowgli_heap_free(mowgli_queue_heap, head); return out; } mowgli_queue_t * 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; return NULL; } mowgli_queue_t * 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); return NULL; } void 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); } mowgli_queue_t * 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; } mowgli_queue_t * 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; } mowgli_queue_t * 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; } mowgli_queue_t * 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; } void * mowgli_queue_pop_head(mowgli_queue_t **n) { mowgli_queue_t *tn; void *out; return_val_if_fail(n != NULL, NULL); return_val_if_fail(*n != NULL, NULL); tn = *n; out = tn->data; *n = tn->next; mowgli_queue_remove(tn); return out; } void * mowgli_queue_pop_tail(mowgli_queue_t **n) { mowgli_queue_t *tn; void *out; return_val_if_fail(n != NULL, NULL); return_val_if_fail(*n != NULL, NULL); tn = *n; out = tn->data; *n = tn->prev; mowgli_queue_remove(tn); return out; } int 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; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/container/queue.h000066400000000000000000000042101174351671600236630ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * queue.h: Double-ended queues, also known as deque. * * Copyright (c) 2007 William Pitcock * * 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_QUEUE_H__ #define __MOWGLI_QUEUE_H__ typedef mowgli_iterator_t mowgli_queue_t; 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); extern mowgli_queue_t *mowgli_queue_find(mowgli_queue_t *head, void *data); extern mowgli_queue_t *mowgli_queue_remove_data(mowgli_queue_t *head, void *data); extern void mowgli_queue_destroy(mowgli_queue_t *head); extern mowgli_queue_t *mowgli_queue_skip(mowgli_queue_t *head, int amt); extern mowgli_queue_t *mowgli_queue_rewind(mowgli_queue_t *head, int amt); extern mowgli_queue_t *mowgli_queue_head(mowgli_queue_t *n); extern mowgli_queue_t *mowgli_queue_tail(mowgli_queue_t *n); extern void *mowgli_queue_pop_head(mowgli_queue_t **n); extern void *mowgli_queue_pop_tail(mowgli_queue_t **n); extern int mowgli_queue_length(mowgli_queue_t *head); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/000077500000000000000000000000001174351671600213375ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/Makefile000066400000000000000000000011721174351671600230000ustar00rootroot00000000000000include ../../../extra.mk STATIC_PIC_LIB_NOINST = ${LIBMOWGLI_SHARED_CORE} STATIC_LIB_NOINST = ${LIBMOWGLI_STATIC_CORE} SRCS = bootstrap.c \ alloc.c \ allocation_policy.c \ allocator.c \ heap.c \ logger.c \ mowgli_string.c \ process.c INCLUDES = bootstrap.h \ alloc.h \ allocation_policy.h \ allocator.h \ assert.h \ exception.h \ heap.h \ iterator.h \ logger.h \ mowgli_string.h \ stdinc.h \ process.h include ../../../buildsys.mk includesubdir = $(PACKAGE_NAME)/core CPPFLAGS += -I. -I.. -I../../.. -DMOWGLI_CORE libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/alloc.c000066400000000000000000000116141174351671600226000ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * alloc.c: Safe, portable implementations of malloc, calloc, and free. * * Copyright (c) 2007, 2012 William Pitcock * * 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 */ typedef struct { mowgli_allocation_policy_t *allocator; } alloc_tag_t; static void * _mowgli_bootstrap_alloc(size_t 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_using_policy(mowgli_allocation_policy_t *policy, size_t size, size_t count) { size_t adj_size; void *r; return_val_if_fail(policy != NULL, NULL); adj_size = (size * count) + sizeof(alloc_tag_t); r = policy->allocate(adj_size); ((alloc_tag_t *)r)->allocator = policy; return r + sizeof(alloc_tag_t); } /* * \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_using_policy(mowgli_allocation_policy_t *policy, size_t size) { return mowgli_alloc_array_using_policy(policy, size, 1); } /* * \brief Duplicater a string using mowgli_alloc() using a specific policy. */ char * mowgli_strdup_using_policy(mowgli_allocation_policy_t *policy, const char *in) { char *out; size_t len; return_val_if_fail(in != NULL, NULL); len = strlen(in) + 1; out = mowgli_alloc_using_policy(policy, len); mowgli_strlcpy(out, in, len); return out; } /* * \brief Duplicater a string using mowgli_alloc() using a specific policy. */ char * mowgli_strdup(const char *in) { return mowgli_strdup_using_policy(_mowgli_allocator, in); } /* * \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 mowgli_alloc_array_using_policy(_mowgli_allocator, 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_using_policy(_mowgli_allocator, 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) { alloc_tag_t *tag; return_if_fail(ptr != NULL); tag = (alloc_tag_t *) (ptr - sizeof(alloc_tag_t)); tag->allocator->deallocate(tag); } /* * \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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/alloc.h000066400000000000000000000032751174351671600226110ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * alloc.h: Safe, portable implementations of malloc, calloc, and free. * * Copyright (c) 2007 William Pitcock * * 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_using_policy(mowgli_allocation_policy_t *policy, size_t size, size_t count); extern void * mowgli_alloc_using_policy(mowgli_allocation_policy_t *policy, size_t size); extern char * mowgli_strdup_using_policy(mowgli_allocation_policy_t *policy, const char *in); extern void * mowgli_alloc_array(size_t size, size_t count); extern void * mowgli_alloc(size_t size); extern char * mowgli_strdup(const char *in); extern void mowgli_free(void *ptr); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/allocation_policy.c000066400000000000000000000047761174351671600252250ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * allocation_policy.h: Allocation policy management. * * Copyright (c) 2007 William Pitcock * * 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_bootstrap(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; mowgli_patricia_add(mowgli_allocation_policy_dict, name, policy); 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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/allocation_policy.h000066400000000000000000000036461174351671600252250ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * allocation_policy.h: Allocation policy management. * * Copyright (c) 2007 William Pitcock * * 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_ALLOCATION_POLICY_H__ #define __MOWGLI_ALLOCATION_POLICY_H__ typedef void *(*mowgli_allocation_func_t)(size_t size); typedef void (*mowgli_deallocation_func_t)(void *ptr); typedef struct { mowgli_object_t parent; mowgli_allocation_func_t allocate; mowgli_deallocation_func_t deallocate; } mowgli_allocation_policy_t; void mowgli_allocation_policy_bootstrap(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); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/allocator.c000066400000000000000000000030661174351671600234700ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * allocator.h: Builtin allocation policies (mmap/malloc). * * Copyright (c) 2007 William Pitcock * * 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_allocation_policy_t *mowgli_allocator_malloc = NULL; static void * mowgli_allocator_func_malloc(size_t size) { return calloc(size, 1); } static void mowgli_allocator_func_free(void *ptr) { if (ptr) free(ptr); } void mowgli_allocator_bootstrap(void) { mowgli_allocator_malloc = mowgli_allocation_policy_create("malloc", mowgli_allocator_func_malloc, mowgli_allocator_func_free); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/allocator.h000066400000000000000000000024761174351671600235010ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * allocator.h: Builtin allocation policies (mmap/malloc). * * Copyright (c) 2007 William Pitcock * * 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_ALLOCATOR_H__ #define __MOWGLI_ALLOCATOR_H__ void mowgli_allocator_bootstrap(void); extern mowgli_allocation_policy_t *mowgli_allocator_malloc; #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/assert.h000066400000000000000000000060441174351671600230150ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * assert.h: Assertions. * * Copyright (c) 2007 William Pitcock * * 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); \ } #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/bootstrap.c000066400000000000000000000040601174351671600235200ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * bootstrap.c: Initialization of libmowgli. * * Copyright (c) 2007 William Pitcock * * 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_BOOTSTRAP_FUNC(mowgli_bootstrap_real) { static bool bootstrapped = 0; if(bootstrapped) return; #ifdef _WIN32 extern void mowgli_winsock_bootstrap(void); mowgli_winsock_bootstrap(); #endif /* initial bootstrap */ mowgli_node_bootstrap(); mowgli_queue_bootstrap(); mowgli_argstack_bootstrap(); mowgli_bitvector_bootstrap(); mowgli_global_storage_bootstrap(); mowgli_hook_bootstrap(); mowgli_random_bootstrap(); mowgli_allocation_policy_bootstrap(); mowgli_allocator_bootstrap(); mowgli_memslice_bootstrap(); /* now that we're bootstrapped, we can use a more optimised allocator if one is available. */ mowgli_allocator_set_policy(mowgli_allocator_malloc); bootstrapped = true; } void mowgli_init(void) { mowgli_log("mowgli_init() is a deprecated function, provided only for backwards compatibility with Mowgli-1. You should remove it if you no longer support using Mowgli-1."); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/bootstrap.h000066400000000000000000000023601174351671600235260ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * bootstrap.c: Initialization of libmowgli. * * Copyright (c) 2007 William Pitcock * * 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_BOOTSTRAP_H__ #define __MOWGLI_BOOTSTRAP_H__ extern void mowgli_bootstrap(void); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/exception.h000066400000000000000000000030011174351671600235000ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * exception.h: Exceptions. * * Copyright (c) 2007 William Pitcock * * 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); \ abort(); \ } while (0) #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/heap.c000066400000000000000000000215421174351671600224240ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * heap.c: Heap allocation. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2005-2006 Theo Julienne * Copyright (c) 2011 Andrew Wilcox * * 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 # 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; unsigned int num_allocated; }; /* A pile of blocks */ 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 */ }; 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; blp_size = sizeof(mowgli_block_t) + (bh->alloc_size * bh->mowgli_heap_elems); if(bh->empty_block != NULL) return; #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 #elif defined (_WIN32) if (bh->use_mmap) blp = VirtualAlloc(NULL, sizeof(mowgli_block_t) + (bh->alloc_size * bh->mowgli_heap_elems), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 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); #if defined(HAVE_MMAP) if (heap->use_mmap) munmap(b, sizeof(mowgli_block_t) + (heap->alloc_size * heap->mowgli_heap_elems)); else #elif defined(_WIN32) if (heap->use_mmap) VirtualFree(b, 0, MEM_RELEASE); 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(mowgli_mutex_init(&bh->mutex) != 0) mowgli_throw_exception_fatal("heap mutex can't be created"); if (flags & BH_NOW) { mowgli_mutex_lock(&bh->mutex); mowgli_heap_expand(bh); mowgli_mutex_unlock(&bh->mutex); } 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); mowgli_mutex_uninit(&heap->mutex); /* 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; if(mowgli_mutex_lock(&heap->mutex) != 0) mowgli_throw_exception_fatal("heap mutex can't be locked"); /* no free space? */ if (heap->free_elems == 0) { mowgli_heap_expand(heap); if(heap->free_elems == 0) { mowgli_mutex_unlock(&heap->mutex); return 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 mowgli_mutex_unlock(&heap->mutex); /* 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; if(mowgli_mutex_lock(&heap->mutex) != 0) mowgli_throw_exception_fatal("heap mutex can't be locked"); 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); } mowgli_mutex_unlock(&heap->mutex); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/heap.h000066400000000000000000000037301174351671600224300ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * heap.h: Heap allocation. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2005-2006 Theo Julienne * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/iterator.h000066400000000000000000000033121174351671600233400ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * iterator.h: Iterators. * * Copyright (c) 2007 William Pitcock * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/logger.c000066400000000000000000000037131174351671600227660ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * logger.c: Event and debugging message logging. * * Copyright (c) 2007 William Pitcock * * 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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/logger.h000066400000000000000000000035121174351671600227700ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * logger.h: Event and debugging message logging. * * Copyright (c) 2007 William Pitcock * * 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_LOGGER_H__ #define __MOWGLI_LOGGER_H__ typedef void (*mowgli_log_cb_t)(const char *); #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, ...); extern void mowgli_log_set_cb(mowgli_log_cb_t callback); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/mowgli_string.c000066400000000000000000000112061174351671600243670ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mowgli_string.c: Immutable string buffers with cheap manipulation. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007 Pippijn van Steenhoven * * 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_ptr; self->size = MAX(self->size * 2, self->pos + n + 8); new_ptr = mowgli_alloc(self->size); mowgli_strlcpy(new_ptr, self->str, self->size); mowgli_free(self->str); self->str = new_ptr; } 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_ptr; self->size = MAX(self->size * 2, self->pos + 9); new_ptr = mowgli_alloc(self->size); mowgli_strlcpy(new_ptr, self->str, self->size); mowgli_free(self->str); self->str = new_ptr; } self->str[self->pos++] = c; self->str[self->pos] = 0; } /* * Copyright (c) 1998 Todd C. Miller * * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ size_t mowgli_strlcat(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0) return (dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return (dlen + (s - src)); /* count does not include NUL */ } size_t mowgli_strlcpy(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0) { while (--n != 0) { if ((*d++ = *s++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return (s - src - 1); /* count does not include NUL */ } ssize_t mowgli_writef(mowgli_descriptor_t fd, const char *fmt, ...) { size_t len; va_list va; char buf[16384]; return_val_if_fail(fmt != NULL, -1); va_start(va, fmt); len = vsnprintf(buf, sizeof buf, fmt, va); va_end(va); #ifdef _WIN32 return send(fd, buf, len, 0); #else return write(fd, buf, len); #endif } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/mowgli_string.h000066400000000000000000000042141174351671600243750ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mowgli_string.h: Immutable string buffers with cheap manipulation. * * Copyright (c) 2007 William Pitcock * Copyright (c) 2007 Pippijn van Steenhoven * * 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); extern ssize_t mowgli_writef(mowgli_descriptor_t fd, const char *fmt, ...); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/process.c000066400000000000000000000056571174351671600231760ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock * * 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" typedef struct { char *path; char **argv; } mowgli_process_execv_req_t; static void mowgli_process_cloned_execv(mowgli_process_execv_req_t *execv_req) { #ifndef _WIN32 return_if_fail(execv_req != NULL); return_if_fail(execv_req->path != NULL); return_if_fail(execv_req->argv != NULL); /* Do best to set proctitle if below hack don't work */ mowgli_proctitle_set("%s", execv_req->argv[0]); execv(execv_req->path, execv_req->argv); mowgli_free(execv_req->argv); mowgli_free(execv_req->path); mowgli_free(execv_req); #else # warning implement me :( #endif } mowgli_process_t * mowgli_process_clone(mowgli_process_start_fn_t start_fn, const char *procname, void *userdata) { #ifndef _WIN32 mowgli_process_t *out; return_val_if_fail(start_fn != NULL, NULL); out = mowgli_alloc(sizeof(mowgli_process_t)); out->userdata = userdata; out->pid = fork(); switch (out->pid) { default: break; case 0: /* Do our best to set this... */ mowgli_proctitle_set("%s", procname); start_fn(out->userdata); _exit(255); return NULL; break; case -1: mowgli_free(out); return NULL; break; } return out; #else # warning implement me :( return NULL; #endif } mowgli_process_t * mowgli_process_spawn(const char *path, char *const argv[]) { size_t i; mowgli_process_execv_req_t *req; return_val_if_fail(path != NULL, NULL); return_val_if_fail(argv != NULL, NULL); req = mowgli_alloc(sizeof(mowgli_process_execv_req_t)); req->path = mowgli_strdup(path); for (i = 0; argv[i] != NULL; i++) ; req->argv = mowgli_alloc_array(sizeof(char *), i + 1); for (i = 0; argv[i] != NULL; i++) req->argv[i] = argv[i]; return mowgli_process_clone((mowgli_process_start_fn_t) mowgli_process_cloned_execv, req->argv[0], req); } void mowgli_process_kill(mowgli_process_t *process) { #ifndef _WIN32 return_if_fail(process != NULL); kill(process->pid, SIGKILL); #else # warning implement me :( #endif } libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/process.h000066400000000000000000000030121174351671600231620ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock * * 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_PROCESS_H__ #define __MOWGLI_PROCESS_H__ typedef void (*mowgli_process_start_fn_t)(void *data); typedef pid_t mowgli_process_id_t; typedef struct { mowgli_process_id_t pid; void *userdata; } mowgli_process_t; extern mowgli_process_t *mowgli_process_clone(mowgli_process_start_fn_t start_fn, const char *proctitle, void *userdata); extern mowgli_process_t *mowgli_process_spawn(const char *path, char *const argv[]); extern void mowgli_process_kill(mowgli_process_t *process); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/core/stdinc.h000066400000000000000000000057331174351671600230040ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * stdinc.h: Pulls in the base system includes for libmowgli. * * Copyright (c) 2007 William Pitcock * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* socket stuff */ #ifndef _WIN32 # include # include # include # include # include # include # include # include # include # include # include # include #else # define WINVER 0x0501 # define WIN32_LEAN_AND_MEAN # include # include # include # include # include # include # include # include # include "platform/win32/win32_stdinc.h" #endif #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 /* OpenSSL stuff */ #ifdef HAVE_OPENSSL # if defined(__APPLE__) # include # ifdef DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER # undef DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER # define DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER # endif # endif # include # include # include #endif #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/000077500000000000000000000000001174351671600211735ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/Makefile000066400000000000000000000006501174351671600226340ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns.c000066400000000000000000000046161174351671600221320ustar00rootroot00000000000000/* * 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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns.h000066400000000000000000000066361174351671600221430ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns_evloop_res.c000066400000000000000000000677551174351671600244040ustar00rootroot00000000000000/* * 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 ) * * 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, }; libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns_evloop_res.h000066400000000000000000000024641174351671600243730ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns_evloop_reslib.c000066400000000000000000000635321174351671600250600ustar00rootroot00000000000000/* * 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 is present, the number of digits in the * MUST be just sufficient to contain the number of bits specified * by the . 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; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns_evloop_reslib.h000066400000000000000000000073151174351671600250620ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/dns/dns_evloop_reslist_win32.c000066400000000000000000000053671174351671600263110ustar00rootroot00000000000000/* * 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 #include 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/000077500000000000000000000000001174351671600224225ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/Makefile000066400000000000000000000007031174351671600240620ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/epoll_pollops.c000066400000000000000000000127501174351671600254560ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock . * * 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 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/eventloop.c000066400000000000000000000107571174351671600246130ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock . * * 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; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/eventloop.h000066400000000000000000000207151174351671600246130ustar00rootroot00000000000000/* * Copyright (c) 2011, 2012 William Pitcock . * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/helper.c000066400000000000000000000143301174351671600240460ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock . * * 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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/kqueue_pollops.c000066400000000000000000000125631174351671600256440ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock . * Copyright (c) 2011 Jilles Tjoelker . * * 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 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/null_pollops.c000066400000000000000000000071651174351671600253210ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock . * * 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, }; libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/poll_pollops.c000066400000000000000000000143231174351671600253070ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock . * * 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 #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/pollable.c000066400000000000000000000054231174351671600243640ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock . * * 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 } libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/ports_pollops.c000066400000000000000000000125171174351671600255130ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock . * * 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 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/qnx_pollops.c000066400000000000000000000131521174351671600251460ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock . * * 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 #include 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/select_pollops.c000066400000000000000000000131541174351671600256210ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock . * * 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 #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/timer.c000066400000000000000000000122051174351671600237060ustar00rootroot00000000000000/* * Copyright (c) 2011 William Pitcock * 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 = ""; 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 = ""; 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 */ libmowgli-2-libmowgli-2.0.0/src/libmowgli/eventloop/windows_pollops.c000066400000000000000000000165371174351671600260440ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock . * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/000077500000000000000000000000001174351671600212075ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/Makefile000066400000000000000000000010111174351671600226400ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/confparse.c000066400000000000000000000242611174351671600233400ustar00rootroot00000000000000/* * 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 = * qchar = / "\\" / "\" DQUOTE * comment = "/" "*" "*" "/" / * "#" *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 #include #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 */ libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/confparse.h000066400000000000000000000017451174351671600233470ustar00rootroot00000000000000/* * 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 */ libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/error_backtrace.c000066400000000000000000000053731174351671600245130ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * error_backtrace.c: Print errors and explain how they were reached. * * Copyright (c) 2007 William Pitcock * * 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_error_context_display(mowgli_error_context_t *e, const char *delim) { mowgli_node_t *n; char *bt_msg; return_if_fail(e != NULL); return_if_fail(delim != NULL); if (MOWGLI_LIST_LENGTH(&e->bt) == 0) mowgli_throw_exception(mowgli.error_backtrace.no_backtrace); MOWGLI_LIST_FOREACH(n, e->bt.head) { bt_msg = (char *) n->data; fprintf(stderr, "%s%s", bt_msg, n->next != NULL ? delim : "\n"); } } void mowgli_error_context_destroy(mowgli_error_context_t *e) { mowgli_node_t *n, *tn; return_if_fail(e != NULL); if (MOWGLI_LIST_LENGTH(&e->bt) == 0) { mowgli_free(e); return; } MOWGLI_LIST_FOREACH_SAFE(n, tn, e->bt.head) { mowgli_free(n->data); mowgli_node_delete(n, &e->bt); mowgli_node_free(n); } mowgli_free(e); } void mowgli_error_context_display_with_error(mowgli_error_context_t *e, const char *delim, const char *error) { mowgli_error_context_display(e, delim); fprintf(stderr, "Error: %s\n", error); _exit(EXIT_FAILURE); } void mowgli_error_context_push(mowgli_error_context_t *e, const char *msg, ...) { char buf[65535]; va_list va; return_if_fail(e != NULL); return_if_fail(msg != NULL); va_start(va, msg); vsnprintf(buf, 65535, msg, va); va_end(va); mowgli_node_add(mowgli_strdup(buf), mowgli_node_create(), &e->bt); } void mowgli_error_context_pop(mowgli_error_context_t *e) { return_if_fail(e != NULL); mowgli_node_delete(e->bt.tail, &e->bt); } mowgli_error_context_t * mowgli_error_context_create(void) { mowgli_error_context_t *out = (mowgli_error_context_t *) mowgli_alloc(sizeof(mowgli_error_context_t)); return out; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/error_backtrace.h000066400000000000000000000034641174351671600245170ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * error_backtrace.h: Print errors and explain how they were reached. * * Copyright (c) 2007 William Pitcock * * 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_ERROR_BACKTRACE_H__ #define __MOWGLI_ERROR_BACKTRACE_H__ typedef struct mowgli_error_context_ { mowgli_list_t bt; } mowgli_error_context_t; extern void mowgli_error_context_display(mowgli_error_context_t *e, const char *delim); extern void mowgli_error_context_display_with_error(mowgli_error_context_t *e, const char *delim, const char *error); extern void mowgli_error_context_destroy(mowgli_error_context_t *e); extern void mowgli_error_context_push(mowgli_error_context_t *e, const char *msg, ...); extern void mowgli_error_context_pop(mowgli_error_context_t *e); extern mowgli_error_context_t *mowgli_error_context_create(void); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/getopt_long.c000066400000000000000000000307561174351671600237070ustar00rootroot00000000000000/* $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 #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 } libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/getopt_long.h000066400000000000000000000047301174351671600237050ustar00rootroot00000000000000/* $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_ */ libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/global_storage.c000066400000000000000000000042301174351671600243360ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * global_storage.c: Simple key->value global storage tool. * * Copyright (c) 2007, 2011 William Pitcock * * 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_patricia_t *mowgli_global_storage_dict = NULL; static mowgli_mutex_t mowgli_global_storage_lock; static void _storage_key_canon(char *key) { } void mowgli_global_storage_bootstrap(void) { mowgli_global_storage_dict = mowgli_patricia_create(_storage_key_canon); mowgli_mutex_init(&mowgli_global_storage_lock); } void * mowgli_global_storage_get(char *name) { void *ret; mowgli_mutex_lock(&mowgli_global_storage_lock); ret = mowgli_patricia_retrieve(mowgli_global_storage_dict, name); mowgli_mutex_unlock(&mowgli_global_storage_lock); return ret; } void mowgli_global_storage_put(char *name, void *value) { mowgli_mutex_lock(&mowgli_global_storage_lock); mowgli_patricia_add(mowgli_global_storage_dict, name, value); mowgli_mutex_unlock(&mowgli_global_storage_lock); } void mowgli_global_storage_free(char *name) { mowgli_mutex_lock(&mowgli_global_storage_lock); mowgli_patricia_delete(mowgli_global_storage_dict, name); mowgli_mutex_unlock(&mowgli_global_storage_lock); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/global_storage.h000066400000000000000000000026701174351671600243510ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * global_storage.h: Simple key->value global storage tool. * * Copyright (c) 2007 William Pitcock * * 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_GLOBAL_STORAGE_H #define MOWGLI_GLOBAL_STORAGE_H 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); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/proctitle.c000066400000000000000000000212331174351671600233610ustar00rootroot00000000000000/* * 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 /* for HP-UX */ #endif #ifdef HAVE_PS_STRINGS #include /* for old BSD */ #include #endif #if defined(__darwin__) #include #endif #ifdef HAVE_SYS_PRCTL_H #include #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; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/proctitle.h000066400000000000000000000010601174351671600233620ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * 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__ */ libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/program_opts.c000066400000000000000000000103261174351671600240710ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * program_opts.h: Replacement for GNU getopt(). * * Copyright (c) 2012 William Pitcock * * 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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/ext/program_opts.h000066400000000000000000000036641174351671600241050ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * program_opts.h: Replacement for GNU getopt(). * * Copyright (c) 2012 William Pitcock * * 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_PROGRAM_OPTS_H__ #define __MOWGLI_PROGRAM_OPTS_H__ typedef void (*mowgli_program_opts_consumer_t)(const char *arg, void *userdata); typedef struct { 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/linebuf/000077500000000000000000000000001174351671600220335ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/linebuf/Makefile000066400000000000000000000004361174351671600234760ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/linebuf/linebuf.c000066400000000000000000000216241174351671600236300ustar00rootroot00000000000000/* * 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); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/linebuf/linebuf.h000066400000000000000000000050111174351671600236250ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/module/000077500000000000000000000000001174351671600216745ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/module/Makefile000066400000000000000000000004511174351671600233340ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/module/loader_posix.c000066400000000000000000000040711174351671600245320ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * loader_posix.c: Loadable modules for POSIX systems. * * Copyright (c) 2007 William Pitcock * * 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 #ifdef __OpenBSD__ # define RTLD_NOW RTLD_LAZY #endif #ifndef RTLD_LOCAL #define RTLD_LOCAL 0 #endif mowgli_module_t mowgli_module_open(const char *path) { void *handle = dlopen(path, RTLD_NOW | RTLD_LOCAL); /* make sure we have something. make this an assertion so that * there is feedback if something happens. (poor programming practice). */ return_val_if_fail(handle != NULL, NULL); return handle; } void * mowgli_module_symbol(mowgli_module_t module, const char *symbol) { void *handle; return_val_if_fail(module != NULL, NULL); handle = dlsym(module, symbol); /* make sure we have something. make this an assertion so that * there is feedback if something happens. (poor programming practice). */ return_val_if_fail(handle != NULL, NULL); return handle; } void mowgli_module_close(mowgli_module_t module) { return_if_fail(module != NULL); dlclose(module); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/module/loader_win32.c000066400000000000000000000040251174351671600243310ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * loader_win32.c: Loadable modules under Microsoft Windows. * * Copyright (c) 2007 William Pitcock * * 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" #define WIN32_LEAN_AND_MEAN #include mowgli_module_t mowgli_module_open(const char *path) { HANDLE handle = LoadLibraryA(path); /* make sure we have something. make this an assertion so that * there is feedback if something happens. (poor programming practice). */ return_val_if_fail(handle != NULL, NULL); return (mowgli_module_t)handle; } void * mowgli_module_symbol(mowgli_module_t module, const char *symbol) { void *handle; return_val_if_fail(module != NULL, NULL); handle = GetProcAddress((HANDLE)module, symbol); /* make sure we have something. make this an assertion so that * there is feedback if something happens. (poor programming practice). */ return_val_if_fail(handle != NULL, NULL); return handle; } void mowgli_module_close(mowgli_module_t module) { return_if_fail(module != NULL); FreeLibrary((HANDLE)module); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/module/module.h000066400000000000000000000026371174351671600233420ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * module.h: Loadable modules. * * Copyright (c) 2007 William Pitcock * * 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_MODULE_H__ #define __MOWGLI_MODULE_H__ typedef void * mowgli_module_t; extern mowgli_module_t mowgli_module_open(const char *path); extern void * mowgli_module_symbol(mowgli_module_t module, const char *symbol); extern void mowgli_module_close(mowgli_module_t module); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/mowgli.h000066400000000000000000000052141174351671600220600ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mowgli.h: Base header for libmowgli. Includes everything. * * Copyright (c) 2007 William Pitcock * * 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_STAND_H__ #define __MOWGLI_STAND_H__ #ifdef __cplusplus # define MOWGLI_DECLS_START extern "C" { # define MOWGLI_DECLS_END } #else # define MOWGLI_DECLS_START # define MOWGLI_DECLS_END #endif #ifdef MOWGLI_CORE # include "platform/autoconf.h" #endif #include "core/stdinc.h" MOWGLI_DECLS_START #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 #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/000077500000000000000000000000001174351671600216555ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/Makefile000066400000000000000000000006021174351671600233130ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/class.c000066400000000000000000000103201174351671600231220ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * class.c: Object class and type management, cast checking. * * Copyright (c) 2007 William Pitcock * * 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_patricia_t *mowgli_object_class_dict = NULL; static void _object_key_canon(char *str) { while (*str) { *str = toupper(*str); str++; } } void mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mowgli_destructor_t des, mowgli_boolean_t dynamic) { /* if the object_class dictionary has not yet been initialized, we will want to do that. */ if (mowgli_object_class_dict == NULL) mowgli_object_class_dict = mowgli_patricia_create(_object_key_canon); if (klass == NULL) mowgli_throw_exception_fatal(mowgli.object_class.invalid_object_class_exception); if (mowgli_object_class_find_by_name(name) != NULL) mowgli_throw_exception_fatal(mowgli.object_class.duplicate_object_class_exception); /* initialize object_class::name */ klass->name = mowgli_strdup(name); /* initialize object_class::derivitives */ klass->derivitives.head = NULL; klass->derivitives.tail = NULL; klass->derivitives.count = 0; /* initialize object_class::destructor */ klass->destructor = des != NULL ? des : mowgli_free; /* initialize object_class::dynamic */ klass->dynamic = dynamic; /* add to the object_class index */ mowgli_patricia_add(mowgli_object_class_dict, klass->name, klass); } int mowgli_object_class_check_cast(mowgli_object_class_t *klass1, mowgli_object_class_t *klass2) { mowgli_node_t *n; if (klass1 == NULL || klass2 == NULL) mowgli_throw_exception_val(mowgli.object_class.invalid_object_class_exception, 0); MOWGLI_LIST_FOREACH(n, klass1->derivitives.head) { mowgli_object_class_t *tklass = (mowgli_object_class_t *) n->data; if (tklass == klass2) return 1; } return 0; } void mowgli_object_class_set_derivitive(mowgli_object_class_t *klass, mowgli_object_class_t *parent) { if (klass == NULL || parent == NULL) mowgli_throw_exception_fatal(mowgli.object_class.invalid_object_class_exception); mowgli_node_add(klass, mowgli_node_create(), &parent->derivitives); } void *mowgli_object_class_reinterpret_impl(/* mowgli_object_t */ void *opdata, mowgli_object_class_t *klass) { mowgli_object_t *object = mowgli_object(opdata); /* this can possibly happen at runtime .. lets not make it a fatal exception. */ return_val_if_fail(object != NULL, NULL); return_val_if_fail(klass != NULL, NULL); if (mowgli_object_class_check_cast(object->klass, klass)) return object; mowgli_log("Invalid reinterpreted cast from %s<%p> to %s", object->klass->name, klass->name); return NULL; } mowgli_object_class_t *mowgli_object_class_find_by_name(const char *name) { return mowgli_patricia_retrieve(mowgli_object_class_dict, name); } void mowgli_object_class_destroy(mowgli_object_class_t *klass) { mowgli_node_t *n, *tn; if (klass == NULL) mowgli_throw_exception_fatal(mowgli.object_class.invalid_object_class_exception); if (klass->dynamic != TRUE) mowgli_throw_exception_fatal(mowgli.object_class.nondynamic_object_class_exception); MOWGLI_LIST_FOREACH_SAFE(n, tn, klass->derivitives.head) { mowgli_node_delete(n, &klass->derivitives); mowgli_node_free(n); } mowgli_free(klass->name); mowgli_free(klass); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/class.h000066400000000000000000000056101174351671600231350ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * class.h: Object class and type management, cast checking. * * Copyright (c) 2007 William Pitcock * * 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_OBJECT_CLASS_H__ #define __MOWGLI_OBJECT_CLASS_H__ typedef void (*mowgli_destructor_t)(void *); typedef struct { char *name; mowgli_list_t derivitives; mowgli_destructor_t destructor; mowgli_boolean_t dynamic; mowgli_list_t message_handlers; } mowgli_object_class_t; extern void mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mowgli_destructor_t des, mowgli_boolean_t dynamic); extern int mowgli_object_class_check_cast(mowgli_object_class_t *klass1, mowgli_object_class_t *klass2); extern void mowgli_object_class_set_derivitive(mowgli_object_class_t *klass, mowgli_object_class_t *parent); extern void *mowgli_object_class_reinterpret_impl(/* mowgli_object_t */ void *object, mowgli_object_class_t *klass); extern mowgli_object_class_t *mowgli_object_class_find_by_name(const char *name); extern void mowgli_object_class_destroy(mowgli_object_class_t *klass); #define MOWGLI_REINTERPRET_CAST(object, klass) (klass *) mowgli_object_class_reinterpret_impl(object, mowgli_object_class_find_by_name( # klass )); #define mowgli_forced_cast(from_type, to_type, from, to)\ do { \ union cast_union \ { \ to_type out; \ from_type in; \ } u; \ typedef int cant_use_union_cast[ \ sizeof (from_type) == sizeof (u) \ && sizeof (from_type) == sizeof (to_type) ? 1 : -1];\ u.in = from; \ to = u.out; \ } while (0) #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/message.c000066400000000000000000000105441174351671600234510ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * messaging.c: Object event notification and message passing. * * Copyright (c) 2007 William Pitcock * * 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_object_class_message_handler_attach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig) { if (klass == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_object_class_exception); if (sig == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); mowgli_node_add(sig, mowgli_node_create(), &klass->message_handlers); } void mowgli_object_class_message_handler_detach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig) { mowgli_node_t *n; if (klass == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_object_class_exception); if (sig == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); n = mowgli_node_find(sig, &klass->message_handlers); mowgli_node_delete(n, &klass->message_handlers); mowgli_node_free(n); } void mowgli_object_message_handler_attach(mowgli_object_t *self, mowgli_object_message_handler_t *sig) { if (self == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_object_exception); if (sig == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); mowgli_node_add(sig, mowgli_node_create(), &self->message_handlers); } void mowgli_object_message_handler_detach(mowgli_object_t *self, mowgli_object_message_handler_t *sig) { mowgli_node_t *n; if (self == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_object_exception); if (sig == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); n = mowgli_node_find(sig, &self->message_handlers); mowgli_node_delete(n, &self->message_handlers); mowgli_node_free(n); } void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, ...) { mowgli_argstack_t *stack; mowgli_object_message_handler_t *sig = NULL; mowgli_node_t *n; va_list va; if (self == NULL) mowgli_throw_exception(mowgli.object_messaging.invalid_object_exception); if (name == NULL) mowgli_throw_exception(mowgli.null_pointer_exception); /* try to find a signal to compile the argument stack from, we start with self::klass first. */ MOWGLI_LIST_FOREACH(n, self->klass->message_handlers.head) { mowgli_object_message_handler_t *sig2 = (mowgli_object_message_handler_t *) n->data; if (!strcasecmp(sig2->name, name)) { sig = sig2; break; } } if (sig == NULL) { MOWGLI_LIST_FOREACH(n, self->klass->message_handlers.head) { mowgli_object_message_handler_t *sig2 = (mowgli_object_message_handler_t *) n->data; if (!strcasecmp(sig2->name, name)) { sig = sig2; break; } } } /* return if no signals found, else compile the argstack */ if (sig == NULL) return; va_start(va, name); stack = mowgli_argstack_create_from_va_list(sig->descstr, va); va_end(va); MOWGLI_LIST_FOREACH(n, self->klass->message_handlers.head) { sig = (mowgli_object_message_handler_t *) n->data; if (!strcasecmp(sig->name, name) && sig->handler != NULL) sig->handler(self, sig, stack); } MOWGLI_LIST_FOREACH(n, self->message_handlers.head) { sig = (mowgli_object_message_handler_t *) n->data; if (!strcasecmp(sig->name, name) && sig->handler != NULL) sig->handler(self, sig, stack); } mowgli_object_unref(stack); } libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/message.h000066400000000000000000000041471174351671600234600ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * message.h: Object event notification and message passing. * * Copyright (c) 2007 William Pitcock * * 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_OBJECT_MESSAGING_H__ #define __MOWGLI_OBJECT_MESSAGING_H__ typedef struct mowgli_object_message_handler_ mowgli_object_message_handler_t; typedef void (*mowgli_object_messaging_func_t)(mowgli_object_t *self, mowgli_object_message_handler_t *sig, mowgli_argstack_t *argstack); struct mowgli_object_message_handler_ { char *name; char *descstr; mowgli_object_messaging_func_t handler; }; extern void mowgli_object_class_message_handler_attach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig); extern void mowgli_object_class_message_handler_detach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig); extern void mowgli_object_message_handler_attach(mowgli_object_t *self, mowgli_object_message_handler_t *sig); extern void mowgli_object_message_handler_detach(mowgli_object_t *self, mowgli_object_message_handler_t *sig); extern void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, ...); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/metadata.c000066400000000000000000000055741174351671600236140ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * metadata.c: Object metadata. * * Copyright (c) 2007 William Pitcock * * 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_object_metadata_associate(mowgli_object_t *self, const char *key, void *value) { mowgli_object_metadata_entry_t *e = NULL; mowgli_node_t *n; if (self == NULL) mowgli_throw_exception(mowgli.object_metadata.invalid_object_exception); if (key == NULL) mowgli_throw_exception(mowgli.null_pointer_exception); MOWGLI_LIST_FOREACH(n, self->metadata.head) { e = (mowgli_object_metadata_entry_t *) n->data; if (!strcasecmp(e->name, key)) break; } if (e != NULL) { e->data = value; return; } e = mowgli_alloc(sizeof(mowgli_object_metadata_entry_t)); e->name = mowgli_strdup(key); e->data = value; mowgli_node_add(e, mowgli_node_create(), &self->metadata); } void mowgli_object_metadata_dissociate(mowgli_object_t *self, const char *key) { mowgli_object_metadata_entry_t *e; mowgli_node_t *n, *tn; if (self == NULL) mowgli_throw_exception(mowgli.object_metadata.invalid_object_exception); if (key == NULL) mowgli_throw_exception(mowgli.null_pointer_exception); MOWGLI_LIST_FOREACH_SAFE(n, tn, self->metadata.head) { e = (mowgli_object_metadata_entry_t *) n->data; if (!strcasecmp(e->name, key)) { mowgli_node_delete(n, &self->metadata); mowgli_node_free(n); mowgli_free(e->name); mowgli_free(e); } } } void *mowgli_object_metadata_retrieve(mowgli_object_t *self, const char *key) { mowgli_object_metadata_entry_t *e; mowgli_node_t *n; if (self == NULL) mowgli_throw_exception_val(mowgli.object_metadata.invalid_object_exception, NULL); if (key == NULL) mowgli_throw_exception_val(mowgli.null_pointer_exception, NULL); MOWGLI_LIST_FOREACH(n, self->metadata.head) { e = (mowgli_object_metadata_entry_t *) n->data; if (!strcasecmp(e->name, key)) return e->data; } return NULL; } libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/metadata.h000066400000000000000000000030511174351671600236050ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * metadata.h: Object metadata. * * Copyright (c) 2007 William Pitcock * * 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_OBJECT_METADATA_H__ #define __MOWGLI_OBJECT_METADATA_H__ typedef struct { char *name; void *data; } mowgli_object_metadata_entry_t; extern void mowgli_object_metadata_associate(mowgli_object_t *self, const char *key, void *value); extern void mowgli_object_metadata_dissociate(mowgli_object_t *self, const char *key); extern void *mowgli_object_metadata_retrieve(mowgli_object_t *self, const char *key); #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/object.c000066400000000000000000000073311174351671600232730ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * object.c: Object management. * * Copyright (c) 2007 William Pitcock * * 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_object_init * * Populates the object manager part of an object. * * Inputs: * - pointer to object manager area * - (optional) name of object * - (optional) class of object * - (optional) custom destructor * * Outputs: * - none * * Side Effects: * - none */ void mowgli_object_init(mowgli_object_t *obj, const char *name, mowgli_object_class_t *klass, mowgli_destructor_t des) { return_if_fail(obj != NULL); if (name != NULL) obj->name = mowgli_strdup(name); if (klass != NULL) obj->klass = klass; else { mowgli_object_class_t *tmp = mowgli_alloc(sizeof(mowgli_object_class_t)); mowgli_object_class_init(tmp, name, des, TRUE); obj->klass = tmp; } obj->refcount = 1; obj->message_handlers.head = NULL; obj->message_handlers.tail = NULL; obj->message_handlers.count = 0; obj->metadata.head = NULL; obj->metadata.tail = NULL; obj->metadata.count = 0; mowgli_object_message_broadcast(obj, "create"); } /* * mowgli_object_init_from_class * * Populates the object manager part of an object from an object class. * * Inputs: * - pointer to object manager area * - class of object * * Outputs: * - none * * Side Effects: * - none */ void mowgli_object_init_from_class(mowgli_object_t *obj, const char *name, mowgli_object_class_t *klass) { return_if_fail(obj != NULL); return_if_fail(klass != NULL); mowgli_object_init(obj, name, klass, NULL); } /* * mowgli_object_ref * * Increment the reference counter on an object. * * Inputs: * - the object to refcount * * Outputs: * - none * * Side Effects: * - none */ void * mowgli_object_ref(void *object) { return_val_if_fail(object != NULL, NULL); mowgli_object(object)->refcount++; return object; } /* * mowgli_object_unref * * Decrement the reference counter on an object. * * Inputs: * - the object to refcount * * Outputs: * - none * * Side Effects: * - if the refcount is 0, the object is destroyed. */ void mowgli_object_unref(void *object) { mowgli_object_t *obj = mowgli_object(object); return_if_fail(object != NULL); obj->refcount--; if (obj->refcount <= 0) { mowgli_object_message_broadcast(obj, "destroy"); if (obj->name != NULL) free(obj->name); if (obj->klass != NULL) { mowgli_destructor_t destructor = obj->klass->destructor; if (obj->klass->dynamic == TRUE) mowgli_object_class_destroy(obj->klass); if (destructor != NULL) destructor(obj); else free(obj); } else mowgli_throw_exception(mowgli.object.invalid_object_class_exception); } } libmowgli-2-libmowgli-2.0.0/src/libmowgli/object/object.h000066400000000000000000000033031174351671600232730ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * object.h: Object management. * * Copyright (c) 2007 William Pitcock * * 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_OBJECT_H__ #define __MOWGLI_OBJECT_H__ typedef struct { char *name; int refcount; mowgli_object_class_t *klass; mowgli_list_t message_handlers; mowgli_list_t metadata; } mowgli_object_t; extern void mowgli_object_init(mowgli_object_t *, const char *name, mowgli_object_class_t *klass, mowgli_destructor_t destructor); extern void mowgli_object_init_from_class(mowgli_object_t *, const char *, mowgli_object_class_t *klass); extern void *mowgli_object_ref(void *); extern void mowgli_object_unref(void *); #define mowgli_object(x) ((mowgli_object_t *) x) #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/000077500000000000000000000000001174351671600222335ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/Makefile000066400000000000000000000002271174351671600236740ustar00rootroot00000000000000SUBDIRS = win32 INCLUDES = constructor.h machine.h include ../../../buildsys.mk includesubdir = $(PACKAGE_NAME)/platform include ../../../extra.mk libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/autoconf.h.in000066400000000000000000000055001174351671600246270ustar00rootroot00000000000000/* 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 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 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 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 header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_EPOLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PRCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PSTAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/constructor.h000066400000000000000000000037001174351671600247710ustar00rootroot00000000000000/* * constructor.h * Code for setting up automatic initializer functions portably. * * Copyright (c) 2012 William Pitcock * * 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_PLATFORM_CONSTRUCTOR_H__ #define __MOWGLI_PLATFORM_CONSTRUCTOR_H__ #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) #else #error MOWGLI_BOOTSTRAP_FUNC not implemented for your platform :( #endif #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/machine.h000066400000000000000000000240611174351671600240130ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * machine.h: Defines to discover what machine we're on easily * * Copyright (c) 2012 Patrick McFarland * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/000077500000000000000000000000001174351671600231755ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/Makefile000066400000000000000000000005711174351671600246400ustar00rootroot00000000000000include ../../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/fork.c000066400000000000000000000116621174351671600243100ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/gettimeofday.c000066400000000000000000000036601174351671600260270ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * win32_support.c: Support functions and values for Win32 platform. * * Copyright (c) 2009 SystemInPlace, Inc. * * 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 _MSC_VER # define EPOCH_TIME_IN_MICROSECS 11644473600000000Ui64 #else # define EPOCH_TIME_IN_MICROSECS 11644473600000000ULL #endif #ifdef _WIN32 int gettimeofday(struct timeval *tv, struct timezone *tz) { FILETIME ft; ULARGE_INTEGER tmpres; static mowgli_boolean_t tz_init_done = FALSE; if (tv != NULL) { GetSystemTimeAsFileTime(&ft); tmpres.u.HighPart = ft.dwHighDateTime; tmpres.u.LowPart = ft.dwLowDateTime; tmpres.QuadPart /= 10; tmpres.QuadPart -= EPOCH_TIME_IN_MICROSECS; tv->tv_sec = (long) (tmpres.QuadPart / 1000000UL); tv->tv_usec = (long) (tmpres.QuadPart % 1000000UL); } if (tz != NULL) { if (!tz_init_done) { _tzset(); tz_init_done = TRUE; } tz->tz_minuteswest = _timezone / 60; tz->tz_dsttime = _daylight; } return 0; } #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/inet.c000066400000000000000000000043371174351671600243070ustar00rootroot00000000000000/* * Copyright (c) 2012 William Pitcock . * * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/pipe.c000066400000000000000000000023231174351671600242760ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * pipe.c: UNIX pipe emulation * * 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. */ #include "mowgli.h" #ifdef _WIN32 int pipe(int pipefd[2]) { return socketpair(AF_INET, SOCK_STREAM, 0, pipefd); } #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/setenv.c000066400000000000000000000024231174351671600246460ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * setenv.c: setenv() wrapper around SetEnvironmentVariable(). * * 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. */ #include "mowgli.h" #ifdef _WIN32 int setenv(const char *name, const char *value, int overwrite) { return !SetEnvironmentVariable(name, value); } #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/socketpair.c000066400000000000000000000070261174351671600255120ustar00rootroot00000000000000/* socketpair.c * Copyright 2007, 2010 by Nathan C. Myers * 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 ) * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/platform/win32/win32_stdinc.h000066400000000000000000000040521174351671600256550ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * win32_stdinc.h: Support functions and values for Win32 platform. * * Copyright (c) 2009 SystemInPlace, Inc. * * 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 __LIBMOWGLI_SRC_LIBMOWGLI_WIN32_SUPPORT_H__GUARD #define __LIBMOWGLI_SRC_LIBMOWGLI_WIN32_SUPPORT_H__GUARD #ifdef _WIN32 #include #include #include #define strcasecmp _stricmp #define strdup _strdup #define usleep(_usecs) Sleep((_usecs)/1000L) #ifdef _MSC_VER # define snprintf _snprintf #endif struct timezone { int tz_minuteswest; int tz_dsttime; }; 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 #endif libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/000077500000000000000000000000001174351671600216565ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/Makefile000066400000000000000000000005611174351671600233200ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/mutex.c000066400000000000000000000066461174351671600232000ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mutex.c: Cross-platform mutexes. * * Copyright (c) 2011 William Pitcock * * 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; } } libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/mutex.h000066400000000000000000000051631174351671600231760ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * mutex.h: Cross-platform mutexes. * * Copyright (c) 2011 William Pitcock * * 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 # include # 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 #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/null_mutexops.c000066400000000000000000000034241174351671600247430ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * null_mutexops.c: null mutex operations * * Copyright (c) 2011 William Pitcock * * 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 int mowgli_null_mutex_create(mowgli_mutex_t *mutex) { return 0; } static int mowgli_null_mutex_lock(mowgli_mutex_t *mutex) { return 0; } static int mowgli_null_mutex_trylock(mowgli_mutex_t *mutex) { return 0; } static int mowgli_null_mutex_unlock(mowgli_mutex_t *mutex) { return 0; } static int mowgli_null_mutex_destroy(mowgli_mutex_t *mutex) { 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 }; libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/posix_mutexops.c000066400000000000000000000071411174351671600251330ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * posix_mutexops.c: POSIX Mutexes. * * Copyright (c) 2011 Wilcox Technologies, 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. */ #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/thread.h000066400000000000000000000055531174351671600233060ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * thread.h: Cross-platform threading helper routines. * * Copyright (c) 2011 Wilcox Technologies, LLC * Copyright (c) 2011, 2012 William Pitcock * * 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 # 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 #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/thread/win32_mutexops.c000066400000000000000000000043421174351671600247330ustar00rootroot00000000000000/* * libmowgli: A collection of useful routines for programming. * win32_mutexops.c: Windows mutex operations * * Copyright (c) 2011 Wilcox Technologies, 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. */ #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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/vio/000077500000000000000000000000001174351671600212045ustar00rootroot00000000000000libmowgli-2-libmowgli-2.0.0/src/libmowgli/vio/Makefile000066400000000000000000000004461174351671600226500ustar00rootroot00000000000000include ../../../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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/vio/vio.c000066400000000000000000000102371174351671600221500ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/vio/vio.h000066400000000000000000000177211174351671600221620ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/vio/vio_openssl.c000066400000000000000000000323101174351671600237070ustar00rootroot00000000000000/* * 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 libmowgli-2-libmowgli-2.0.0/src/libmowgli/vio/vio_sockets.c000066400000000000000000000261501174351671600237040ustar00rootroot00000000000000/* * 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; }