Merge branch 'master' into stable master-stable-switch
authorHenning Rogge <hrogge@googlemail.com>
Wed, 15 Aug 2012 16:00:55 +0000 (18:00 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Wed, 15 Aug 2012 16:00:55 +0000 (18:00 +0200)
690 files changed:
.gitignore
.hgignore
CHANGELOG
HISTORY [deleted file]
Makefile
Makefile.inc
OS-subsystem.txt [deleted file]
README-Olsr-Extensions [new file with mode: 0644]
README-acl [deleted file]
README-callbacks [deleted file]
README-http-txt-services [deleted file]
README-logging [deleted file]
TODO-0.7.0.txt [deleted file]
android/README [new file with mode: 0644]
android/arch/syslimits.h [new file with mode: 0644]
android/linux/if_tunnel.h [new file with mode: 0644]
android/linux/ip6_tunnel.h [new file with mode: 0644]
android/regex.h [new file with mode: 0644]
android/regex/COPYRIGHT [new file with mode: 0644]
android/regex/NOTICE [new file with mode: 0644]
android/regex/WHATSNEW [new file with mode: 0644]
android/regex/cclass.h [new file with mode: 0644]
android/regex/cname.h [new file with mode: 0644]
android/regex/engine.c [new file with mode: 0644]
android/regex/regcomp.c [new file with mode: 0644]
android/regex/regerror.c [new file with mode: 0644]
android/regex/regex2.h [new file with mode: 0644]
android/regex/regexec.c [new file with mode: 0644]
android/regex/regfree.c [new file with mode: 0644]
android/regex/utils.h [new file with mode: 0644]
contrib/netsimpcap/Makefile
contrib/netsimpcap/bin/.gitignore [new file with mode: 0644]
contrib/netsimpcap/src/network_tap.c
contrib/txtinfoshell/Makefile [deleted file]
contrib/txtinfoshell/README [deleted file]
contrib/txtinfoshell/txtinfoshell.c [deleted file]
debian/.gitignore [new file with mode: 0644]
debian/README.Debian [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/olsrd-default [new file with mode: 0644]
debian/olsrd-plugins.dirs [new file with mode: 0644]
debian/olsrd-plugins.docs [new file with mode: 0644]
debian/olsrd.conf [new file with mode: 0644]
debian/olsrd.dirs [new file with mode: 0644]
debian/olsrd.docs [new file with mode: 0644]
debian/olsrd.init [new file with mode: 0644]
debian/olsrd.postinst [new file with mode: 0644]
debian/rules [new file with mode: 0644]
debian/todo [new file with mode: 0644]
files/Makefile [deleted file]
files/olsr_switch.8.gz [new file with mode: 0644]
files/olsrd-adhoc-setup [new file with mode: 0755]
files/olsrd-manpages.xml [deleted file]
files/olsrd-metrics.3.gz [deleted file]
files/olsrd.8.gz
files/olsrd.conf.5.gz
files/olsrd.conf.commotion [new file with mode: 0644]
files/olsrd.conf.default.full [new file with mode: 0644]
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
files/olsrd.conf.default.rfc
files/olsrd.conf.funkfeuer [new file with mode: 0644]
files/olsrd.conf.minimal_freifunk [new file with mode: 0644]
files/olsrd.conf.win32.lq [deleted file]
files/olsrd.conf.win32.rfc [deleted file]
gcc-warnings
gnu-indent.sh
gui/linux-gtk/.gitignore [new file with mode: 0644]
gui/linux-gtk/CHANGELOG
gui/linux-gtk/Makefile
gui/linux-gtk/src/callbacks.c
gui/linux-gtk/src/common.h
gui/linux-gtk/src/interface.c
gui/linux-gtk/src/interface.h
gui/linux-gtk/src/ipc.c
gui/linux-gtk/src/ipc.h
gui/linux-gtk/src/main.c
gui/linux-gtk/src/main.h
gui/linux-gtk/src/nodes.c
gui/linux-gtk/src/nodes.h
gui/linux-gtk/src/olsr.c
gui/linux-gtk/src/olsr_protocol.h
gui/linux-gtk/src/packet.c
gui/linux-gtk/src/packet.h
gui/linux-gtk/src/routes.c
gui/linux-gtk/src/routes.h
gui/win32/.gitignore [new file with mode: 0644]
gui/win32/Inst/installer.nsi
gui/win32/Main/Frontend.cpp
gui/win32/Main/Frontend.h
gui/win32/Main/Frontend.rc
gui/win32/Main/FrontendDlg.cpp
gui/win32/Main/FrontendDlg.h
gui/win32/Main/HnaEntry.cpp
gui/win32/Main/HnaEntry.h
gui/win32/Main/Ipc.h
gui/win32/Main/LQ-Default.olsr
gui/win32/Main/MidEntry.cpp
gui/win32/Main/MidEntry.h
gui/win32/Main/MprEntry.cpp
gui/win32/Main/MprEntry.h
gui/win32/Main/MyDialog1.cpp
gui/win32/Main/MyDialog1.h
gui/win32/Main/MyDialog2.cpp
gui/win32/Main/MyDialog2.h
gui/win32/Main/MyDialog3.cpp
gui/win32/Main/MyDialog3.h
gui/win32/Main/MyDialog4.cpp
gui/win32/Main/MyDialog4.h
gui/win32/Main/MyEdit.cpp
gui/win32/Main/MyEdit.h
gui/win32/Main/MyTabCtrl.cpp
gui/win32/Main/MyTabCtrl.h
gui/win32/Main/NodeEntry.cpp
gui/win32/Main/NodeEntry.h
gui/win32/Main/RFC-Default.olsr
gui/win32/Main/StdAfx.h
gui/win32/Main/TrayIcon.cpp
gui/win32/Main/TrayIcon.h
gui/win32/Shim/shim.c
lib/arprefresh/Makefile
lib/arprefresh/src/olsrd_arprefresh.c
lib/arprefresh/src/olsrd_arprefresh.h
lib/arproaming/README_ARPROAMING [deleted file]
lib/arproaming/src/olsrd_arproaming.c [deleted file]
lib/bmf/Makefile
lib/bmf/README_BMF [moved from lib/bmf/README_BMF.txt with 91% similarity]
lib/bmf/src/Address.c
lib/bmf/src/Address.h
lib/bmf/src/Bmf.c
lib/bmf/src/Bmf.h
lib/bmf/src/NetworkInterfaces.c
lib/bmf/src/NetworkInterfaces.h
lib/bmf/src/Packet.c
lib/bmf/src/Packet.h
lib/bmf/src/PacketHistory.c
lib/bmf/src/PacketHistory.h
lib/bmf/src/olsrd_plugin.c
lib/cl_roam/README_CL_ROAM [deleted file]
lib/cl_roam/src/cl_roam.c [deleted file]
lib/debuginfo/README_DEBUGINFO [deleted file]
lib/debuginfo/src/olsrd_debuginfo.c [deleted file]
lib/dot_draw/Makefile
lib/dot_draw/README_DOT_DRAW
lib/dot_draw/olsr-topology-view.pl [new file with mode: 0644]
lib/dot_draw/src/olsrd_dot_draw.c
lib/dot_draw/src/olsrd_dot_draw.h [new file with mode: 0644]
lib/dot_draw/src/olsrd_plugin.c [moved from src/plugin.h with 51% similarity]
lib/dyn_gw/Makefile
lib/dyn_gw/README_DYN_GW
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw/src/olsrd_dyn_gw.h
lib/dyn_gw/src/olsrd_plugin.c
lib/dyn_gw_plain/Makefile
lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c
lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.h
lib/httpinfo/Makefile
lib/httpinfo/README_HTTPINFO
lib/httpinfo/src/admin_interface.c
lib/httpinfo/src/admin_interface.h
lib/httpinfo/src/gfx.h
lib/httpinfo/src/olsrd_httpinfo.c
lib/httpinfo/src/olsrd_httpinfo.h
lib/httpinfo/src/olsrd_plugin.c
lib/httpinfo/src/olsrd_plugin.h
lib/jsoninfo/Makefile [moved from lib/debuginfo/Makefile with 81% similarity]
lib/jsoninfo/README_JSONINFO [new file with mode: 0644]
lib/jsoninfo/src/olsrd_jsoninfo.c [new file with mode: 0644]
lib/jsoninfo/src/olsrd_jsoninfo.h [new file with mode: 0644]
lib/jsoninfo/src/olsrd_plugin.c [new file with mode: 0644]
lib/jsoninfo/version-script.txt [moved from lib/arproaming/version-script.txt with 100% similarity]
lib/lq_etx_ff/README_LQ_ETX_FF [deleted file]
lib/lq_etx_ff/src/lq_plugin_etx_ff.c [deleted file]
lib/lq_etx_float/Makefile [deleted file]
lib/lq_etx_float/README_LQ_ETX_FLOAT [deleted file]
lib/lq_etx_float/src/lq_plugin_etx_float.c [deleted file]
lib/lq_etx_fpm/Makefile [deleted file]
lib/lq_etx_fpm/README_LQ_ETX_FPM [deleted file]
lib/lq_etx_fpm/src/lq_plugin_etx_fpm.c [deleted file]
lib/lq_rfc/Makefile [deleted file]
lib/lq_rfc/README_LQ_RFC [deleted file]
lib/lq_rfc/src/lq_plugin_rfc.c [deleted file]
lib/mdns/Makefile
lib/mdns/src/Address.c
lib/mdns/src/Address.h
lib/mdns/src/NetworkInterfaces.c
lib/mdns/src/NetworkInterfaces.h
lib/mdns/src/Packet.c
lib/mdns/src/mdns.c
lib/mdns/src/mdns.h
lib/mdns/src/olsrd_plugin.c
lib/mini/Makefile
lib/mini/src/olsrd_plugin.c
lib/mini/src/olsrd_plugin.h
lib/nameservice/Makefile
lib/nameservice/src/compat.c [new file with mode: 0644]
lib/nameservice/src/compat.h [new file with mode: 0644]
lib/nameservice/src/mapwrite.c
lib/nameservice/src/mapwrite.h
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/nameservice/src/nameservice_msg.h
lib/nameservice/src/olsrd_plugin.c
lib/obamp/README [deleted file]
lib/obamp/scenario.jpeg [deleted file]
lib/obamp/src/obamp.c [deleted file]
lib/obamp/src/obamp.h [deleted file]
lib/obamp/version-script.txt [deleted file]
lib/p2pd/Makefile [moved from lib/obamp/Makefile with 60% similarity]
lib/p2pd/README [new file with mode: 0644]
lib/p2pd/src/NetworkInterfaces.c [new file with mode: 0644]
lib/p2pd/src/NetworkInterfaces.h [new file with mode: 0644]
lib/p2pd/src/Packet.c [new file with mode: 0644]
lib/p2pd/src/Packet.h [new file with mode: 0644]
lib/p2pd/src/PacketHistory.c [new file with mode: 0644]
lib/p2pd/src/PacketHistory.h [new file with mode: 0644]
lib/p2pd/src/dllist.c [new file with mode: 0644]
lib/p2pd/src/dllist.h [new file with mode: 0644]
lib/p2pd/src/olsrd_plugin.c [moved from lib/obamp/src/olsrd_plugin.c with 83% similarity]
lib/p2pd/src/p2pd.c [new file with mode: 0644]
lib/p2pd/src/p2pd.h [new file with mode: 0644]
lib/p2pd/src/version-script.txt [moved from lib/cl_roam/version-script.txt with 100% similarity]
lib/p2pd/version-script.txt [moved from lib/debuginfo/version-script.txt with 100% similarity]
lib/pgraph/Makefile [moved from lib/arproaming/Makefile with 88% similarity]
lib/pgraph/README_PGRAPH [new file with mode: 0644]
lib/pgraph/src/olsrd_pgraph.c [new file with mode: 0644]
lib/pgraph/src/olsrd_pgraph.h [new file with mode: 0644]
lib/pgraph/version-script.txt [moved from lib/lq_etx_ff/version-script.txt with 100% similarity]
lib/pud/Makefile [new file with mode: 0644]
lib/pud/Makefile.inc [new file with mode: 0644]
lib/pud/README [new file with mode: 0644]
lib/pud/doc/.gitignore [new file with mode: 0644]
lib/pud/doc/Makefile [new file with mode: 0644]
lib/pud/doc/doxygen.conf [new file with mode: 0644]
lib/pud/doc/olsrd.conf.default.pud [new file with mode: 0644]
lib/pud/doc/pud.odt [new file with mode: 0755]
lib/pud/nmealib/.gitignore [new file with mode: 0644]
lib/pud/nmealib/LICENSE [new file with mode: 0644]
lib/pud/nmealib/Makefile [new file with mode: 0644]
lib/pud/nmealib/Makefile.inc [new file with mode: 0644]
lib/pud/nmealib/README [new file with mode: 0644]
lib/pud/nmealib/doc/.gitignore [new file with mode: 0644]
lib/pud/nmealib/doc/Makefile [new file with mode: 0644]
lib/pud/nmealib/doc/nmea.doxygen [new file with mode: 0644]
lib/pud/nmealib/include/nmea/context.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/conversions.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/generate.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/generator.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/gmath.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/info.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/parse.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/parser.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/sentence.h [new file with mode: 0644]
lib/pud/nmealib/include/nmea/tok.h [new file with mode: 0644]
lib/pud/nmealib/samples/Makefile [new file with mode: 0644]
lib/pud/nmealib/samples/generate/main.c [new file with mode: 0644]
lib/pud/nmealib/samples/generator/main.c [new file with mode: 0644]
lib/pud/nmealib/samples/math/main.c [new file with mode: 0644]
lib/pud/nmealib/samples/parse/main.c [new file with mode: 0644]
lib/pud/nmealib/samples/parse_file/gpslog.txt [new file with mode: 0644]
lib/pud/nmealib/samples/parse_file/main.c [new file with mode: 0644]
lib/pud/nmealib/src/context.c [new file with mode: 0644]
lib/pud/nmealib/src/conversions.c [new file with mode: 0644]
lib/pud/nmealib/src/generate.c [new file with mode: 0644]
lib/pud/nmealib/src/generator.c [new file with mode: 0644]
lib/pud/nmealib/src/gmath.c [new file with mode: 0644]
lib/pud/nmealib/src/info.c [new file with mode: 0644]
lib/pud/nmealib/src/parse.c [new file with mode: 0644]
lib/pud/nmealib/src/parser.c [new file with mode: 0644]
lib/pud/nmealib/src/sentence.c [new file with mode: 0644]
lib/pud/nmealib/src/tok.c [new file with mode: 0644]
lib/pud/resources/olsrd.pud.position.conf [new file with mode: 0644]
lib/pud/src/compiler.h [new file with mode: 0644]
lib/pud/src/configTools.c [new file with mode: 0644]
lib/pud/src/configTools.h [new file with mode: 0644]
lib/pud/src/configuration.c [new file with mode: 0644]
lib/pud/src/configuration.h [new file with mode: 0644]
lib/pud/src/dedup.c [new file with mode: 0644]
lib/pud/src/dedup.h [new file with mode: 0644]
lib/pud/src/gpsConversion.c [new file with mode: 0644]
lib/pud/src/gpsConversion.h [new file with mode: 0644]
lib/pud/src/netTools.c [new file with mode: 0644]
lib/pud/src/netTools.h [new file with mode: 0644]
lib/pud/src/networkInterfaces.c [new file with mode: 0644]
lib/pud/src/networkInterfaces.h [new file with mode: 0644]
lib/pud/src/posAvg.c [new file with mode: 0644]
lib/pud/src/posAvg.h [new file with mode: 0644]
lib/pud/src/posFile.c [new file with mode: 0644]
lib/pud/src/posFile.h [new file with mode: 0644]
lib/pud/src/pud.c [new file with mode: 0644]
lib/pud/src/pud.h [new file with mode: 0644]
lib/pud/src/pudOlsrdPlugin.c [new file with mode: 0644]
lib/pud/src/pudOlsrdPlugin.h [new file with mode: 0644]
lib/pud/src/receiver.c [new file with mode: 0644]
lib/pud/src/receiver.h [new file with mode: 0644]
lib/pud/src/state.c [new file with mode: 0644]
lib/pud/src/state.h [new file with mode: 0644]
lib/pud/src/timers.c [new file with mode: 0644]
lib/pud/src/timers.h [new file with mode: 0644]
lib/pud/src/uplinkGateway.c [new file with mode: 0644]
lib/pud/src/uplinkGateway.h [new file with mode: 0644]
lib/pud/version-script.txt [moved from lib/lq_etx_float/version-script.txt with 100% similarity]
lib/pud/wireformat-java/.gitignore [new file with mode: 0644]
lib/pud/wireformat-java/Makefile [new file with mode: 0644]
lib/pud/wireformat-java/Makefile.inc [new file with mode: 0644]
lib/pud/wireformat-java/README [new file with mode: 0644]
lib/pud/wireformat-java/doc/.gitignore [new file with mode: 0644]
lib/pud/wireformat-java/doc/Makefile [new file with mode: 0644]
lib/pud/wireformat-java/doc/doxygen.conf [new file with mode: 0644]
lib/pud/wireformat-java/resources/How_to_cross-compile_for_older_platform_versions__Joseph_D__Darc.pdf [new file with mode: 0644]
lib/pud/wireformat-java/resources/New_javac_warning_for_setting_an_older_source_without_bootclassp.pdf [new file with mode: 0644]
lib/pud/wireformat-java/resources/WireFormatConstants.java.h [new file with mode: 0644]
lib/pud/wireformat-java/resources/build.xml [new file with mode: 0644]
lib/pud/wireformat-java/resources/ee.j2se/1.6/LICENSE [new file with mode: 0644]
lib/pud/wireformat-java/resources/ee.j2se/1.6/ee.j2se.jar [new file with mode: 0644]
lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_ClusterLeader.c [new file with mode: 0644]
lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_PositionUpdate.c [new file with mode: 0644]
lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_UplinkMessage.c [new file with mode: 0644]
lib/pud/wireformat-java/src/main/c/util.h [new file with mode: 0644]
lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/ClusterLeader.java [new file with mode: 0644]
lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/LibraryLoader.java [new file with mode: 0644]
lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/PositionUpdate.java [new file with mode: 0644]
lib/pud/wireformat-java/src/main/java/org/olsr/plugin/pud/UplinkMessage.java [new file with mode: 0644]
lib/pud/wireformat/.gitignore [new file with mode: 0644]
lib/pud/wireformat/Makefile [new file with mode: 0644]
lib/pud/wireformat/Makefile.inc [new file with mode: 0644]
lib/pud/wireformat/doc/.gitignore [new file with mode: 0644]
lib/pud/wireformat/doc/Makefile [new file with mode: 0644]
lib/pud/wireformat/doc/doxygen.conf [new file with mode: 0644]
lib/pud/wireformat/include/OlsrdPudWireFormat/compiler.h [new file with mode: 0644]
lib/pud/wireformat/include/OlsrdPudWireFormat/nodeIdConversion.h [new file with mode: 0644]
lib/pud/wireformat/include/OlsrdPudWireFormat/wireFormat.h [new file with mode: 0644]
lib/pud/wireformat/src/nodeIdConversion.c [new file with mode: 0644]
lib/pud/wireformat/src/wireFormat.c [new file with mode: 0644]
lib/quagga/Makefile
lib/quagga/README_QUAGGA
lib/quagga/patches/.gitignore [new file with mode: 0644]
lib/quagga/patches/quagga-0.98.6.diff
lib/quagga/patches/quagga-0.99.21.diff [new file with mode: 0644]
lib/quagga/src/client.c [new file with mode: 0644]
lib/quagga/src/client.h [new file with mode: 0644]
lib/quagga/src/common.h [new file with mode: 0644]
lib/quagga/src/olsrd_plugin.c
lib/quagga/src/packet.c [new file with mode: 0644]
lib/quagga/src/packet.h [new file with mode: 0644]
lib/quagga/src/parse.c [new file with mode: 0644]
lib/quagga/src/parse.h [new file with mode: 0644]
lib/quagga/src/plugin.c [new file with mode: 0644]
lib/quagga/src/plugin.h [new file with mode: 0644]
lib/quagga/src/quagga.c
lib/quagga/src/quagga.h
lib/secure/CHANGELOG
lib/secure/Makefile
lib/secure/README_SECURE
lib/secure/src/md5.c
lib/secure/src/md5.h
lib/secure/src/olsrd_plugin.c
lib/secure/src/olsrd_secure.c
lib/secure/src/olsrd_secure.h
lib/secure/src/secure_messages.h
lib/sgwdynspeed/Makefile [new file with mode: 0644]
lib/sgwdynspeed/Makefile.inc [new file with mode: 0644]
lib/sgwdynspeed/doc/.gitignore [new file with mode: 0644]
lib/sgwdynspeed/doc/Makefile [new file with mode: 0644]
lib/sgwdynspeed/doc/doxygen.conf [new file with mode: 0644]
lib/sgwdynspeed/doc/olsrd.conf.default.sgwdynspeed [new file with mode: 0644]
lib/sgwdynspeed/resources/olsrd.sgw.speed.conf [new file with mode: 0644]
lib/sgwdynspeed/src/configuration.c [new file with mode: 0644]
lib/sgwdynspeed/src/configuration.h [new file with mode: 0644]
lib/sgwdynspeed/src/olsrdPlugin.c [new file with mode: 0644]
lib/sgwdynspeed/src/olsrdPlugin.h [new file with mode: 0644]
lib/sgwdynspeed/src/sgwDynSpeed.c [new file with mode: 0644]
lib/sgwdynspeed/src/sgwDynSpeed.h [new file with mode: 0644]
lib/sgwdynspeed/src/speedFile.c [new file with mode: 0644]
lib/sgwdynspeed/src/speedFile.h [new file with mode: 0644]
lib/sgwdynspeed/version-script.txt [moved from lib/lq_etx_fpm/version-script.txt with 100% similarity]
lib/tas/Makefile [moved from lib/cl_roam/Makefile with 67% similarity]
lib/tas/data/chat_head.lsp [new file with mode: 0644]
lib/tas/data/chat_recv.lsp [new file with mode: 0644]
lib/tas/data/chat_send.lsp [new file with mode: 0644]
lib/tas/data/index.html [new file with mode: 0644]
lib/tas/data/pub/profile.html [new file with mode: 0644]
lib/tas/data/show.lsp [new file with mode: 0644]
lib/tas/lua-license.txt [new file with mode: 0644]
lib/tas/src/glua.c [new file with mode: 0644]
lib/tas/src/glua.h [new file with mode: 0644]
lib/tas/src/glua_ext.c [new file with mode: 0644]
lib/tas/src/glua_ext.h [new file with mode: 0644]
lib/tas/src/http.c [new file with mode: 0644]
lib/tas/src/http.h [new file with mode: 0644]
lib/tas/src/lib.c [moved from lib/debuginfo/src/olsrd_debuginfo.h with 56% similarity]
lib/tas/src/lib.h [new file with mode: 0644]
lib/tas/src/link.h [new file with mode: 0644]
lib/tas/src/lua/lapi.c [new file with mode: 0644]
lib/tas/src/lua/lapi.h [new file with mode: 0644]
lib/tas/src/lua/lauxlib.c [new file with mode: 0644]
lib/tas/src/lua/lauxlib.h [new file with mode: 0644]
lib/tas/src/lua/lbaselib.c [new file with mode: 0644]
lib/tas/src/lua/lcode.c [new file with mode: 0644]
lib/tas/src/lua/lcode.h [new file with mode: 0644]
lib/tas/src/lua/ldblib.c [new file with mode: 0644]
lib/tas/src/lua/ldebug.c [new file with mode: 0644]
lib/tas/src/lua/ldebug.h [new file with mode: 0644]
lib/tas/src/lua/ldo.c [new file with mode: 0644]
lib/tas/src/lua/ldo.h [new file with mode: 0644]
lib/tas/src/lua/ldump.c [new file with mode: 0644]
lib/tas/src/lua/lfunc.c [new file with mode: 0644]
lib/tas/src/lua/lfunc.h [new file with mode: 0644]
lib/tas/src/lua/lgc.c [new file with mode: 0644]
lib/tas/src/lua/lgc.h [new file with mode: 0644]
lib/tas/src/lua/liolib.c [new file with mode: 0644]
lib/tas/src/lua/llex.c [new file with mode: 0644]
lib/tas/src/lua/llex.h [new file with mode: 0644]
lib/tas/src/lua/llimits.h [new file with mode: 0644]
lib/tas/src/lua/lmathlib.c [new file with mode: 0644]
lib/tas/src/lua/lmem.c [new file with mode: 0644]
lib/tas/src/lua/lmem.h [new file with mode: 0644]
lib/tas/src/lua/loadlib.c [new file with mode: 0644]
lib/tas/src/lua/lobject.c [new file with mode: 0644]
lib/tas/src/lua/lobject.h [new file with mode: 0644]
lib/tas/src/lua/lopcodes.c [new file with mode: 0644]
lib/tas/src/lua/lopcodes.h [new file with mode: 0644]
lib/tas/src/lua/lparser.c [new file with mode: 0644]
lib/tas/src/lua/lparser.h [new file with mode: 0644]
lib/tas/src/lua/lstate.c [new file with mode: 0644]
lib/tas/src/lua/lstate.h [new file with mode: 0644]
lib/tas/src/lua/lstring.c [new file with mode: 0644]
lib/tas/src/lua/lstring.h [new file with mode: 0644]
lib/tas/src/lua/lstrlib.c [new file with mode: 0644]
lib/tas/src/lua/ltable.c [new file with mode: 0644]
lib/tas/src/lua/ltable.h [new file with mode: 0644]
lib/tas/src/lua/ltablib.c [new file with mode: 0644]
lib/tas/src/lua/ltests.c [new file with mode: 0644]
lib/tas/src/lua/ltm.c [new file with mode: 0644]
lib/tas/src/lua/ltm.h [new file with mode: 0644]
lib/tas/src/lua/lua.h [new file with mode: 0644]
lib/tas/src/lua/lualib.h [new file with mode: 0644]
lib/tas/src/lua/lundump.c [new file with mode: 0644]
lib/tas/src/lua/lundump.h [new file with mode: 0644]
lib/tas/src/lua/lvm.c [new file with mode: 0644]
lib/tas/src/lua/lvm.h [new file with mode: 0644]
lib/tas/src/lua/lzio.c [new file with mode: 0644]
lib/tas/src/lua/lzio.h [new file with mode: 0644]
lib/tas/src/os_unix.c [new file with mode: 0644]
lib/tas/src/os_unix.h [new file with mode: 0644]
lib/tas/src/plugin.c [new file with mode: 0644]
lib/tas/src/plugin.h [new file with mode: 0644]
lib/tas/tas.conf [new file with mode: 0644]
lib/tas/test.c [new file with mode: 0644]
lib/tas/version-script.txt [moved from lib/lq_rfc/version-script.txt with 100% similarity]
lib/txtinfo/Makefile
lib/txtinfo/README_TXTINFO
lib/txtinfo/src/olsrd_plugin.c [new file with mode: 0644]
lib/txtinfo/src/olsrd_txtinfo.c
lib/txtinfo/src/olsrd_txtinfo.h [new file with mode: 0644]
lib/watchdog/Makefile
lib/watchdog/src/olsrd_plugin.c
license.sh [deleted file]
license.txt
list-excludes.sh [new file with mode: 0644]
make/Makefile.android [new file with mode: 0644]
make/Makefile.fbsd
make/Makefile.kfbsd [new file with mode: 0644]
make/Makefile.linux
make/Makefile.nbsd
make/Makefile.obsd
make/Makefile.osx
make/Makefile.vxworks [deleted file]
make/Makefile.win32
make/Makefile.wince
make/guess_os.sh
make/hash_source.sh [new file with mode: 0755]
olsrd-exports.sh [deleted file]
openwrt/README
openwrt/olsrd-stable-git/Makefile [moved from openwrt/olsrd-git/Makefile with 52% similarity]
openwrt/olsrd-stable-git/files/olsrd.config [moved from openwrt/olsrd-git/files/olsrd.config with 100% similarity]
openwrt/olsrd-stable-git/files/olsrd.init [moved from openwrt/olsrd-git/files/olsrd.init with 100% similarity]
openwrt/olsrd-stable-git/files/olsrd_secure_key [moved from openwrt/olsrd-git/files/olsrd_secure_key with 100% similarity]
redhat/olsrd.spec [moved from redhat/olsrd.spec.in with 96% similarity]
release-howto.txt
scripts/linker-cref.pl [deleted file]
scripts/mk-tarball.sh
scripts/rename.sh [deleted file]
src/.gitignore [new file with mode: 0644]
src/apm.h [moved from src/os_apm.h with 92% similarity]
src/bsd/apm.c
src/bsd/bsd_net.h [deleted file]
src/bsd/dummy.c
src/bsd/kernel_routes.c
src/bsd/net.c
src/build_msg.c [new file with mode: 0644]
src/build_msg.h [new file with mode: 0644]
src/cfgparser/.gitignore [new file with mode: 0644]
src/cfgparser/Makefile [moved from lib/lq_etx_ff/Makefile with 57% similarity]
src/cfgparser/README [new file with mode: 0644]
src/cfgparser/cfgfile_gen.c [new file with mode: 0644]
src/cfgparser/local.mk [new file with mode: 0644]
src/cfgparser/olsrd_cfgparser.def [new file with mode: 0644]
src/cfgparser/olsrd_conf.c [new file with mode: 0644]
src/cfgparser/olsrd_conf.h [new file with mode: 0644]
src/cfgparser/oparse.y [new file with mode: 0644]
src/cfgparser/oscan.lex [new file with mode: 0644]
src/cfgparser/version-script.txt [new file with mode: 0644]
src/common/autobuf.c
src/common/autobuf.h
src/common/avl.c
src/common/avl.h
src/common/avl_comp.c [deleted file]
src/common/avl_comp.h [deleted file]
src/common/avl_olsr_comp.c [deleted file]
src/common/avl_olsr_comp.h [deleted file]
src/common/common_types.h [deleted file]
src/common/container_of.h [deleted file]
src/common/list.c [new file with mode: 0644]
src/common/list.h
src/common/string.c [deleted file]
src/defs.h
src/duplicate_handler.c [new file with mode: 0644]
src/duplicate_handler.h [new file with mode: 0644]
src/duplicate_set.c
src/duplicate_set.h
src/fpm.c [new file with mode: 0644]
src/fpm.h [new file with mode: 0644]
src/gateway.c [new file with mode: 0644]
src/gateway.h [new file with mode: 0644]
src/gateway_default_handler.c [new file with mode: 0644]
src/gateway_default_handler.h [new file with mode: 0644]
src/generate_msg.c [moved from src/olsr_ip_acl.c with 55% similarity]
src/generate_msg.h [moved from src/os_system.h with 81% similarity]
src/hashing.c
src/hashing.h
src/hna_set.c
src/hna_set.h
src/hysteresis.c [new file with mode: 0644]
src/hysteresis.h [new file with mode: 0644]
src/ifnet.h [moved from lib/cl_roam/src/cl_roam.h with 78% similarity]
src/interfaces.c
src/interfaces.h
src/ipc_frontend.c [new file with mode: 0644]
src/ipc_frontend.h [new file with mode: 0644]
src/ipcalc.c
src/ipcalc.h
src/kernel_routes.h [moved from src/os_kernel_routes.h with 72% similarity]
src/kernel_tunnel.h [moved from src/os_kernel_tunnel.h with 69% similarity]
src/link_set.c
src/link_set.h
src/linux/apm.c
src/linux/kernel_routes_nl.c [moved from src/linux/kernel_routes.c with 76% similarity]
src/linux/kernel_tunnel.c
src/linux/link_layer.c [new file with mode: 0644]
src/linux/linux_apm.h [deleted file]
src/linux/linux_net.h [deleted file]
src/linux/net.c
src/log.h [new file with mode: 0644]
src/lq_mpr.c
src/lq_mpr.h
src/lq_packet.c
src/lq_packet.h
src/lq_plugin.c
src/lq_plugin.h
src/lq_plugin_default_ff.c [new file with mode: 0644]
src/lq_plugin_default_ff.h [moved from lib/lq_etx_ff/src/lq_plugin_etx_ff.h with 76% similarity]
src/lq_plugin_default_ffeth.c [new file with mode: 0644]
src/lq_plugin_default_ffeth.h [moved from lib/lq_etx_float/src/lq_plugin_etx_float.h with 75% similarity]
src/lq_plugin_default_float.c [new file with mode: 0644]
src/lq_plugin_default_float.h [new file with mode: 0644]
src/lq_plugin_default_fpm.c [new file with mode: 0644]
src/lq_plugin_default_fpm.h [new file with mode: 0644]
src/main.c
src/mantissa.c [new file with mode: 0644]
src/mantissa.h [new file with mode: 0644]
src/mid_set.c
src/mid_set.h
src/misc.h [new file with mode: 0644]
src/mpr.c [new file with mode: 0644]
src/mpr.h [moved from src/common/string.h with 81% similarity]
src/mpr_selector_set.c [new file with mode: 0644]
src/mpr_selector_set.h [moved from lib/lq_etx_fpm/src/lq_plugin_etx_fpm.h with 71% similarity]
src/neighbor_table.c
src/neighbor_table.h
src/net_olsr.c
src/net_olsr.h
src/net_os.h [new file with mode: 0644]
src/olsr.c
src/olsr.h
src/olsr_callbacks.c [deleted file]
src/olsr_callbacks.h [deleted file]
src/olsr_cfg.c [deleted file]
src/olsr_cfg.h
src/olsr_cfg_gen.c [deleted file]
src/olsr_clock.c [deleted file]
src/olsr_comport.c [deleted file]
src/olsr_comport.h [deleted file]
src/olsr_comport_http.c [deleted file]
src/olsr_comport_http.h [deleted file]
src/olsr_comport_txt.c [deleted file]
src/olsr_comport_txt.h [deleted file]
src/olsr_cookie.c [new file with mode: 0644]
src/olsr_cookie.h [moved from src/olsr_socket.h with 50% similarity]
src/olsr_ip_acl.h [deleted file]
src/olsr_ip_prefix_list.c [deleted file]
src/olsr_ip_prefix_list.h [deleted file]
src/olsr_logging.c [deleted file]
src/olsr_logging.h [deleted file]
src/olsr_logging_sources.c [deleted file]
src/olsr_logging_sources.h [deleted file]
src/olsr_memcookie.c [deleted file]
src/olsr_memcookie.h [deleted file]
src/olsr_niit.c [new file with mode: 0644]
src/olsr_niit.h [new file with mode: 0644]
src/olsr_protocol.h
src/olsr_socket.c [deleted file]
src/olsr_spf.c
src/olsr_spf.h
src/olsr_switch/Makefile [new file with mode: 0644]
src/olsr_switch/commands.h [new file with mode: 0644]
src/olsr_switch/link_rules.c [new file with mode: 0644]
src/olsr_switch/link_rules.h [new file with mode: 0644]
src/olsr_switch/main.c [new file with mode: 0644]
src/olsr_switch/ohs_cmd.c [new file with mode: 0644]
src/olsr_switch/ohs_cmd.h [new file with mode: 0644]
src/olsr_switch/olsr_host_switch.h [new file with mode: 0644]
src/olsr_timer.c [deleted file]
src/olsr_timer.h [deleted file]
src/olsr_types.h
src/olsrd_plugin.h [new file with mode: 0644]
src/os_time.h [deleted file]
src/packet.c [new file with mode: 0644]
src/packet.h [moved from src/os_net.h with 51% similarity]
src/parser.c
src/parser.h
src/plugin_loader.c
src/plugin_loader.h
src/plugin_util.c
src/plugin_util.h
src/print_packet.c [new file with mode: 0644]
src/print_packet.h [moved from lib/lq_rfc/src/lq_plugin_rfc.h with 85% similarity]
src/process_package.c
src/process_package.h
src/process_routes.c
src/process_routes.h
src/rebuild_packet.c [new file with mode: 0644]
src/rebuild_packet.h [moved from src/olsr_cfg_gen.h with 84% similarity]
src/routing_table.c
src/routing_table.h
src/scheduler.c [new file with mode: 0644]
src/scheduler.h [new file with mode: 0644]
src/tc_set.c
src/tc_set.h
src/two_hop_neighbor_table.c [new file with mode: 0644]
src/two_hop_neighbor_table.h [moved from src/olsr_clock.h with 58% similarity]
src/unix/ifnet.c
src/unix/init.c [deleted file]
src/unix/log.c
src/unix/misc.c [new file with mode: 0644]
src/unix/time.c [deleted file]
src/unix/unix_log.h [deleted file]
src/valgrind/memcheck.h [deleted file]
src/valgrind/valgrind.h [deleted file]
src/win32/apm.c
src/win32/arpa/inet.h
src/win32/compat.c
src/win32/compat.h [deleted file]
src/win32/dlfcn.h
src/win32/dummy.c [new file with mode: 0644]
src/win32/ifnet.c
src/win32/kernel_routes.c
src/win32/log.c
src/win32/misc.c [new file with mode: 0644]
src/win32/net.c
src/win32/net/if.h
src/win32/net/route.h
src/win32/netinet/in.h
src/win32/sys/ioctl.h
src/win32/sys/socket.h
src/win32/sys/time.h
src/win32/sys/times.h [new file with mode: 0644]
src/win32/sys/utsname.h
src/win32/time.c [deleted file]
src/win32/unistd.h
unmaintained/README [moved from README with 99% similarity]
unmaintained/README-FreeBSD-libnet [moved from README-FreeBSD-libnet with 100% similarity]
unmaintained/README-Link-Quality-Fish-Eye.txt [moved from README-Link-Quality-Fish-Eye.txt with 100% similarity]
unmaintained/README-Link-Quality.html [moved from README-Link-Quality.html with 100% similarity]
unmaintained/README-Olsr-Switch.html [new file with mode: 0644]
unmaintained/features.txt [moved from features.txt with 100% similarity]
valgrind-howto.txt

index 43b49ef..e54968f 100644 (file)
@@ -1,53 +1,28 @@
-# git-ls-files --others --exclude-from=.git/info/exclude
-# Lines that start with '#' are comments.
-# For a project mostly in C, the following would be a good set of
-# exclude patterns (uncomment them if you want to use them):
-# *.[oa]
-# *~
-*.o
+*~
 *.a
+*.aps
 *.d
 *.diff
-*.rej
-*.orig
-*.swp
-*~
-*.out.*
-*-backup
-.cproject
-.project
-.settings
-TAGS
-olsrd
-config-verify
-netsimpcap
-src/builddata.c
-lib/*/*so.*.*
-*.obj
-*.lib
 *.dll
-olsrd.exe
-olsrd.exe.exports
-olsr-setup.exe
-olsrd.exports
-*.opt
+*.lib
 *.ncb
-*.aps
-*.sbr
+*.o
+*.obj
+*.opt
+*.orig
+*.out.*
 *.plg
-gui/win32/Main/Debug/
-gui/win32/Main/Release/
-gui/win32/Shim/Debug/
-gui/win32/Shim/Release/
-#*#
-.#*
-*.flc
-redhat/olsrd.spec
-files/index.html
-files/olsrd_8.html
-files/olsrd_conf_5.html
-files/olsr_switch_8.html
-files/olsrd_metrics_3.html
-files/olsrd-history.5
-contrib/txtinfoshell/txtinfo-sh
-!lib/quagga/patches/quagga-0.98.6.diff
+*.rej
+*.sbr
+*.so.*.*
+*.swp
+/.cproject
+/.project
+/.settings
+/build-stamp
+/configure-stamp
+/olsrd
+/olsrd.exe
+/olsr_switch
+/olsr_switch.exe
+/olsr-setup.exe
\ No newline at end of file
index e46cc0c..339a2d7 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -8,19 +8,20 @@ syntax: glob
 *.swp
 *~
 *.out.*
-*-backup
 TAGS
 olsrd
-config-verify
+olsr_switch
 netsimpcap
 src/builddata.c
+src/cfgparser/oparse.c
+src/cfgparser/oparse.h
+src/cfgparser/oscan.c
 lib/*/*so.*.*
 *.obj
 *.lib
 *.dll
 olsrd.exe
 olsr-setup.exe
-olsrd.exports
 *.opt
 *.ncb
 *.aps
@@ -30,15 +31,3 @@ gui/win32/Main/Debug/
 gui/win32/Main/Release/
 gui/win32/Shim/Debug/
 gui/win32/Shim/Release/
-#*#
-.#*
-*.flc
-redhat/olsrd.spec
-files/index.html
-files/olsrd_8.html
-files/olsrd_conf_5.html
-files/olsr_switch_8.html
-files/olsrd_metrics_3.html
-files/olsrd-history.5
-contrib/txtinfoshell/txtinfo-sh
-
index 8df4c39..46f25c6 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,7 +1,182 @@
 This file states changes as of version 0.2.4:
 
+
+0.6.3 --------------------------------------------------------------------
+
+Bugfix and plugin release 0.6.3
+
+- PUD plugin (position update plugin)
+- JSONinfo plugin
+- sgwdynspeed plugin (select dynamic smart gateway based on gw speed)
+- Update on Quagga plugin (for new Quagga)
+- Fixes for Androids
+- Some fixes for GTK and Win32 gui
+- Lots of core fixes to support new compiler warnings
+
+0.6.2 --------------------------------------------------------------------
+
+Bugfix release for 0.6.1
+
+- Compatibility for Linux kernel 3.x
+- Lots of small fixes
+- reworked makefile output
+- updates for some plugins
+- repair for Smartgateway feature
+
+Read GIT changelog at http://olsr.org/git to see a complete history.
+
+0.6.1 --------------------------------------------------------------------
+
+Bugfix release for 0.6.0
+
+Markus Kittenberger <Markus.Kittenberger@gmx.at>
+- Major bugfix for the neighbor table when a neighbor gets a new main IP.
+- add /interface command to txtinfo, allow multiple commands per request
+
+Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+- wait up to four seconds for aquiring the OLSRd lock. This helps to
+  shutdown OLSRd with a script and restart it at once (kill <pid> is
+  asynchrone, and kill -w is not available in busybox)
+- add md5 has of all source/headers into version string
+
+Mitar<mitar@tnode.com>
+- lot's of small changes for Android. Slowly Android gets a fully
+  supported platform for OLSRd.
+
+and a lot more small bugfixes. Read GIT changelog at http://olsr.org/git
+to see a complete history.
+
+0.6.0 --------------------------------------------------------------------
+
+Change in version number system. No more -rcX for release candidates and
+-rX for bugfix releases. In future bugfix releases or updates of plugins
+will increase the third digit of the version string while feature releases
+will increase the first and/or the second one.
+
+Markus Kittenberger <Markus.Kittenberger@gmx.at>
+Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+- added NIIT kernel module support for sending IPv4 traffic over
+  IPv6 mesh networks. See README-Olsr-Extensions for more information.
+- added SmartGateway support. OLSRd can now automatically build
+  IPIP tunnels towards the gateway to prevent gateway flapping.
+  See README-Olsr-Extensions for more information.
+- complete rewrite of linux netlink routing code. New code should be
+  more understandable and easier to debug/improve.
+
+Teco Boots <teco@inf-net.nl>
+- new dyngw plugin. More flexible and more features.
+- new p2pd plugin (generalized mdns plugin)
+
+Vasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
+- new version of quagga plugin (with IPv6 support !)
+
+Sven-Ola Tuecke <sven-ola@gmx.de>
+- fixes for improved uClibc support
+- fixes for better linux kernel 2.4 support
+
+Saverio Proto <zioproto@gmail.com>
+- new mdns plugin. (backport from master branch)
+
+Eric Tromps <erik_tromp@hotmail.com>
+- new version of bmf plugin. NO pthreads are necessary anymore
+
+and a lot more small bugfixes. Read GIT changelog at http://olsr.org/git
+to see a complete history.
+
+0.5.6-r8 ---------------------------------------------------------------------
+
+Alina Friedrichsen <x-alina@gmx.net>
+- patch for using deticated output socket for OLSR packages. This allows
+  to set the src-ip of OLSR packages, which is useful for interfaces
+  with multiple IPs
+
+Bruce Ford <fordbr@gmail.com>
+- fixes for compiling olsrd for win32
+
+Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+- fix for memoryleak during MID processing
+- patch series for "network logoff" of OLSRd, other nodes now get
+  notified if an OLSR node switch down to remove it from their database.
+- cleanup of naming conventions for settings src/dst-ips of OLSR-packets
+  for ipv4/6. See example config files. 
+- patch to ignore HNA4 for IPv6 and HNA6 for IPv4
+
+Markus Kittenberger <Markus.Kittenberger@gmx.at>
+- patch series for MID handling cleanup
+- compiletime switch for txtinfo to always allow localhost access
+- add "InterfaceDefaults" section to config files to allow setting values
+  which are shared by all interfaces but can be overwritten in specific
+  config file settings
+- patch series to allow OLSRd handle multiple config files
+  (multiple "-f <cfgfile>" options)
+
 0.5.6 ---------------------------------------------------------------------
 
+PATCHES and BUGFIXES from Henning Rogge <rogge@fgan.de>
+- Bugfix for fragmented TC sequence numbers
+- eliminate second timer for edge garbage collection (aka border code).
+- fix SPF bug
+- fix for jitter calculation
+- refactor linkset code
+- add netsimpcap, a network simulation device
+- parser refactoring
+- fix for possible overflow in fpm plugin
+- prevent Originator-IP from changing during runtime
+- fix several compiler warnings
+- fix hanging TC entry from lost onehop neighbor
+- fix drop package with same seqno in etx_ff
+- fix segfault in parsing HNA package with bad netmask
+- fix avl_comparator for route_paths
+- fix alignment problem in packet buffers
+- fix: segfault in neighbor/neighbor-2 table
+- fix: lqmult default parsing
+- HACK: MinTCVTime parameter hack for Berlin FF network...
+  feel free to ask on the mailing list.
+- add Watchdog plugin
+- add explicit runtime lock for OLSR.
+- remove lq-hysteresis for tc on the receiver side.
+- enhance protection against malformed packages to prevent
+  OLSR parsing uninitialized data. Thank you Markus and Keks for the LONG
+  debugging session
+- block tc-redundancy 0/1, it doesn't work with the current dijkstra code
+- convert httpinfo/txtinfo/dotdraw to nonblocking and autobuf to
+  prevent blocking outgoing connections
+- fix some bugs with lq-mult
+- fix bug in duplicate set sequencenumber handling
+- add Debian/KFreeBSD support (Thanks to Holger Levsen and friends for help)
+- fix segfault in 'interface lost' monitor
+- add LQ hysteresis to etx-ff metric
+
+PATCH from Markus Kittenberger <Markus.Kittenberger@gmx.at>:
+- txtinfo plugin: add more http options
+- allow configuration of OLSR UDP port
+- allow configuration of proto Tag for Routes (RtProto)
+- add fallback policy rule (priority 65536) if RtTable is used,
+    to ensure that routes can be added to this table
+- resolve many error conditions while adding routes to the linux kernel
+    (Warning this will also delete any conflicting routes made by other routing daemons or admins)
+- interface modes mesh (default) and ether (no retransmit of olsr-messages back into a broadcastdomain)
+- fix olsr_times() to handle different OS implementations (Linux, BSD, OS X)
+- fix several compiler warnings
+- fix olsr_times() to handle different OS implementations (Linux, BSD, OS X)
+- create policy rule later during startup
+- send MID also with one interface, if its ip different from originator-id
+- linux rtnetlink code cleanup
+- workaround: generate routes to single hop neighbours on the fly when inserting routes via them
+    (active only with fib_metric=flat)
+- testing: insert routes with source-ip set to originator ip
+- testing: syslog numbering (e.g. useful to detect lost syslog messages when using remote-syslog)
+- testing: custom library path (default /usr/testlib)
+Testing features must be activated in olsr_cfg.h before compiling olsrd.
+This features are used to run a test network in Vienna parallel to the existing
+OLSR network.
+- more RT-Netlink cleanups and fixes
+- backport of timejump patch from TIP
+- Add detection for vanishing interfaces to Linux netlink code
+- fix incorret route sorting on new neighbours. use only delete and add/change avl tree,
+  instead of 3 trees
+- learn neighbours interface alias adress from received hellos
+
 PATCHES from Hannes Gredler <hannes@gredler.at>:
 - add small valgrind howto
 - remove the per tc_edge timer
@@ -17,24 +192,40 @@ PATCHES from Hannes Gredler <hannes@gredler.at>:
 - log RIB add/del transactions only if there is an actual route change
 - fix to to always insert a HNA Net when receiving a HNA refresh
 - fix delete all routes if the last IP address is gone
-
-PATCHES and BUGFIXES from Henning Rogge <rogge@fgan.de>
-- Bugfix for fragmented TC sequence numbers
-- eliminate second timer for edge garbage collection (aka border code).
-- fix SPF bug
-- fix for jitter calculation
-- refactor linkset code
-- add netsimpcap, a network simulation device
-- parser refactoring
-- fix for possible overflow in fpm plugin
+- reduce TC vtime jitter from 25% down to 5%
 
 PATCHES and BUGFIXES from Sven-Ola Tuecke <sven-ola@gmx.de>:
 - add a fixed-point math implementation, which saves
   a great deal of CPU on embedded devices
 - fix for Link quality dijkstra limit
+- nameservice plugin supports mac addresses
+- fix fork/restart code
+- fix olsr_times() to handle different OS implementations (Linux, BSD, OS X)
+- fix several compiler warnings
+- fix olsr_times() to handle different OS implementations (Linux, BSD, OS X)
+- add makefile support for google android
+- fix default olsrd.conf examples
 
 PATCHES and BUGFIXES from Aaron Kaplan <aaron@lo-res.org>:
 - fix openbsd warnings / compile errors about sprintf strcpy
+- fix string overflow in dyn_gw plugin
+- fix string overflow in pgraph plugin
+- fix openbsd/osx coompile errors
+
+BUGFIX by Peter Tarjan <peter.tarjan@birdtelecom.hu>:
+- Do not remember LQ information UNSPEC_LINK neighbors in Hellos.
+- ignore UNSPEC link for linktype if there is an ASYM/LOST/SYM Link in the
+  same Hello message
+- ignore UNSPEC_LINKS during MPR lookup
+- broken MID route handling: we also check the data structures for routing,
+  even if a MID entry exists.
+
+BUGFIX by John Hay <jhay@meraka.org.za>:
+- FIX: IPv6 MTU in BSD
+- Another BSD ipv6 Patch by John Hay
+- fixes for 64 Bit FreeBSD
+- fixes for NetBSD
+
 
 BUGFIX from Erik Tromp <erik_tromp@hotmail.com>:
 - update in bmf due to new flags field in tc_edge_entry
@@ -51,8 +242,14 @@ PATCH from Hagen Paul Pfeifer <hagen@jauu.net>:
 PATCH from Andres Ambrois <andresambrois@gmail.com>:
 - nameservice plugin: add parameters for SIGHUPing other daemons, or calling scripts
 
-PATCH from Markus Kittenberger <Markus.Kittenberger@gmx.at>:
-- txtinfo plugin: add more http options
+BUGFIX by Benny Tops <b.tops@mindef.nl>:
+- fix wrong order of drop_tc checkt in olsr_input_tc
+
+Felix (OpenWRT NBD):
+- fix bison problem for OpenWRT
+
+Sebastian Harl:
+- add LISTEN parameter for httpinfo/txtinfo/dotdraw
 
 0.5.5 ---------------------------------------------------------------------
 
diff --git a/HISTORY b/HISTORY
deleted file mode 100644 (file)
index 559aa10..0000000
--- a/HISTORY
+++ /dev/null
@@ -1,191 +0,0 @@
-HISTORY (CITED FROM A.TØNNESEN MASTER THESIS, AUG 2004)
-
-Work  on the olsrd implementation was started spring 2003. At first the
-plan was to add and experiment with MID functionality in  the  existing
-draft3[1]  compatible  OLSR  implementation  by INRIA[2]. This was com‐
-pleted by summer 2003. This means that much olsrd code  originally  was
-based  on  the  INRIA implementation. But since then, close to all code
-has been rewritten or heavily modified. Olsrd is  therefore  considered
-an  independent  OLSR  implementation  and not just an extension to the
-INRIA implementation. [...]
-
-In October 2003 RFC3626 was released and now full RFC compliance became
-the  goal of the project. In November 2003 UniK olsrd version 0.2.0 was
-made public available through a website. But full RFC  core  compliance
-was  not  reached  until  release 0.3.8 in January 2004. Not much later
-0.4.0 was released. It covered all  auxiliary  functionality  as  well,
-except link-layer notifications. [...]
-
-Andreas Tønnesen <andretoæolsr.org>
-       Active  2003-2006: Funder of the project, active contributor and
-       maintainer until 2007, still owning the  domain  olsr.org.  Also
-       created the dotdraw, dyn_gw, httpinfo, and secure plugins. While
-       Andreas Tønnesen published  the  original  implementation  under
-       GPLv2,  he  as well as all other contributors switched to BSD in
-       Nov 2004.
-
-[1] http://hipercom.inria.fr/olsr/draft-ietf-manet-olsr-03.txt
-
-[2] http://hipercom.inria.fr/olsr/#code
-
-FURTHER HISTORY (WOS-03 TO OLSRD-NG)
-
-In Juli 2004, Andreas Tønnesen presented his implementation on the Wiz‐
-ards  of  OS 03[3] conference in Berlin. He met a couple of free public
-network activists from the C-Base[4]  /  Freifunk[5]  community.  While
-some of them tried to test wireless mobility cycling around the confer‐
-ence center with a moped, others established  a  general  agreement  of
-cooperation.  This  leads  to  several  contributors to jump in, namely
-(AFAICR, please add yourself if your name is missing or sort  the  list
-if you think you’re in the wrong position):
-
-Thomas Lopatic <thomasælopatic.de>
-       Active 2004-2007: Implemented the Link Quality Extensions (ETX),
-       solved lots of implementation issues, created  the  Windows  GUI
-       and maintained the olsrd code base as well.
-
-Bruno Randolf <br1æeinfach.org>
-       Active   2004-2005:  Solved  lots  of  wireless  driver/hardware
-       issues, contributed to olsrd implementation  (fixes,  cleanups),
-       contributed  to TAS and Dotdraw plugins, created the nameservice
-       plugin. Also wrotes the related horst[6] tool.
-
-Sven-Ola Tücke <sven-olaægmx.de>
-       Active 2004-[...]: Started the olsrd-based Freifunk  Firmware[7]
-       in late 2004, contributed bug fixes and maintenance (general and
-       Windows), the dyn_gw_plain  and  arprefresh  plugins.   Contiued
-       work  for  olsrd-ng  (see  below):  Fixes  &  maint, FPM, config
-       parser, and documentation.
-
-Jens Nachtigall <nachtigallæweb.de>
-       Active 2004-2005: Contributed bug fixes, contributed  to  dyn_gw
-       plugin and nameservice plugins.
-
-Corinna ’Elektra’ Aichele <onelektraægmx.net>
-       Active  2004-2006: Contributed ideas and valuable comments, also
-       initiated the fish-eye routing scheme.
-
-Erik Tromp <erik.trompænl.thalesgroup.com>
-       Active        2006-[...]:        Created         the         BMF
-       〈http://sourceforge.net/projects/olsr-bmf/〉   (Basic   Multicast
-       Forwarding) plugin.
-
-Lorenz Schori <lorenz.schoriægmx.ch>
-       Active 2006-[...]: Created the txtinfo  plugin  and  contributed
-       bug fixes.
-
-John Hay <jhayæmeraka.org.za>
-       Active  2006-2008:  Contributed  maintenance  and  bug fixes for
-       IPv6.
-
-Immo ’FaUl’ Wehrenberg <immoæchaostreff-dortmund.de>
-       Active 2006-2008: Contributed the quagga plugin.
-
-Vasilis Tsiligiannis <acinonyxsæyahoo.gr>
-       Active 2007-[...]: Fixes and maint for the quagga plugin.
-
-[3] http://www.wizards-of-os.org/archiv/wos_3.html
-
-[4] http://www.c-base.org/
-
-[5] http://www.freifunk.net/
-
-[6] http://br1.einfach.org/horst
-
-[7] http://ff-firmware.sourceforge.net/
-
-OLSRD-NG HISTORY (STILL ACTIVE)
-
-In late 2006, the Vienna based Funkfeuer[8] community  managed  to  get
-some  sponsoring  from  IPA[9].  They  established the OLSRD-NG project
-which should basically lead to a much larger node count and better code
-quality (see Funkfeuer Wiki on OLSRD-NG[10]). This in turn attracts new
-developers for the somewhat silenced team from there on:
-
-Aaron Kaplan <aaronælo-res.org>
-       Active  2005-[...]:  Initiator/Coordinator   of   the   OLSRD-NG
-       project, contributed bug fixes (BSD, MacOS) and documentation.
-
-Bernd Petrovitsch <berndæfirmix.at>
-       Active  2006-[...]:  Patch-juggler  for  the  olsrd  repository,
-       rewrote the build system (Makefiles) and plugin subsystem,  gen‐
-       eralized  commonly  used  code  and functions, also lots of code
-       base maintenance and bug fixes as well.
-
-Hannes Gredler <hannesægredler.at>
-       Active 2007-[...] Contributed the SPF refactoring (routing  code
-       optimization),  code  refactorings  for scheduler and nearly all
-       internal data structures, code base maintenance and  bug  fixes.
-       Currently also hosts the mercurial repository.
-
-Henning Rogge <roggeæfgan.de>
-       Active  2008-[...]:  Reworked  the LQ/ETX algorithm, contributed
-       the netsimcap (network simulation,  GPL),  changed  logging  and
-       data  structures,  also  lots  of  code base maintenance and bug
-       fixes.
-
-Thomas Martin <thomas.martinærohde-schwarz.com>
-       Active 2008: Provided VxWorks branch[11]
-
-Markus Kittenberger <Markus.Kittenbergerægmx.at>
-       Active 2008-[...]: Policy routing changes.
-       Note
-
-       Contributors are simply mentioned in chronological order - which
-       does not imply any other rating. If you want your name mentioned
-       also, please add to files/olsrd-manpages.xml which is the source
-       for the HISTORY file.
-
-[8] http://www.funkfeuer.at/
-
-[9] http://www.netidee.at/
-
-[10] http://wiki.funkfeuer.at//index.php/Olsrd-ng
-
-[11] http://gredler.at/hg/olsrd-vxworks
-
-LICENSING SUMMARY
-
-While  the  overall  project  is  now  (early-2009)  licensed under the
-revised BSD license (without the ‘obnoxious BSD  advertising  clause’),
-licensing differs for some modules and files. This list is for informal
-purposes only - please refer to  the  respective  files,  persons,  and
-legal bodies if you need verified licensing information.
-
-Overall olsrd project
-       Licensed  under  revised  BSD (2004, Andreas Tønnesen and Thomas
-       Lopatic, olsr.org)
-
-contrib/netsimcap/
-       Licensed under GPLv3 (2008, Henning Rogge)
-
-gui/linux-gtk/
-       Licensed under GPLv2 (2003, Andreas Tønnesen)
-
-lib/secure/src/md5.h
-       Licensed under some homebrew public domain (1991, RSA Data Secu‐
-       rity, Inc.)
-
-lib/bmf/
-       Licensed under revised BSD, (2005, Erik Tromp, Thales Communica‐
-       tions, Huizen, The Netherlands)
-
-lib/quagga/
-       Licensed under GPLv2 or LGPLv2 (2006, Immo ’FaUl’ Wehrenberg and
-       2007 Vasilis Tsiligiannis)
-
-As  a  note  to  future contributors: As of Jan-2009, we removed single
-person names from the copyright comments with  the  permission  of  the
-original authors (with the exception of above modules and 6 files under
-src/ created by Bernd Petrovitsch). If you contribute new files to  the
-repository,  please  add  a copy of the license.txt file as comment. If
-you send in  patches,  please  add  a  signed-off-by[12]  statement  to
-express, that your patch is properly licensed. If you add a new plugin,
-you may choose another license (see quagga, bmf). Please make sure your
-license is compatible to olsrd, otherwise do not add to the repository.
-To prevent automatic re-licensing, add your exception to the license.sh
-script  file  also.  IANAL clause: absolutely no warranty for the above
-information, please ask your favorite lawyer if you have any  licensing
-questions or issues.
-
-[12] http://www.kernel.org/pub/linux/utils/util-linux-ng/README.devel
index 221cb6d..a5cb10c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,32 +1,32 @@
 # The olsr.org Optimized Link-State Routing daemon(olsrd)
-# Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+# Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
 # All rights reserved.
 #
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
+# Redistribution and use in source and binary forms, with or without 
+# modification, are permitted provided that the following conditions 
 # are met:
 #
-# * Redistributions of source code must retain the above copyright
+# * Redistributions of source code must retain the above copyright 
 #   notice, this list of conditions and the following disclaimer.
-# * 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
+# * 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.
-# * Neither the name of olsr.org, olsrd nor the names of its
-#   contributors may be used to endorse or promote products derived
+# * Neither the name of olsr.org, olsrd 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 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
+# 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.
 #
 # Visit http://www.olsr.org for more information.
 # Please also write a new version to:
 # gui/win32/Main/Frontend.rc (line 71, around "CAPTION [...]")
 # gui/win32/Inst/installer.nsi (line 57, around "MessageBox MB_YESNO [...]")
-VERS =         pre-0.7.0
+VERS =         0.6.3
 
 TOPDIR = .
+INSTALLOVERWRITE ?=
 include Makefile.inc
 
 # pass generated variables to save time
 MAKECMD = $(MAKE) OS="$(OS)" WARNINGS="$(WARNINGS)"
 
 LIBS +=                $(OS_LIB_DYNLOAD)
-
 ifeq ($(OS), win32)
 LDFLAGS +=     -Wl,--out-implib=libolsrd.a
 LDFLAGS +=     -Wl,--export-all-symbols
 endif
 
-TAG_SRCS =     $(SRCS) $(HDRS)
-
-.PHONY: default_target
-default_target: clean_bin $(EXENAME)
+SWITCHDIR =    src/olsr_switch
+CFGDIR =       src/cfgparser
+include $(CFGDIR)/local.mk
+TAG_SRCS =     $(SRCS) $(HDRS) $(wildcard $(CFGDIR)/*.[ch] $(SWITCHDIR)/*.[ch])
 
-clean_bin:
-       @$(RM) -f $(EXENAME)
+.PHONY: default_target switch
+default_target: $(EXENAME)
 
 $(EXENAME):    $(OBJS) src/builddata.o
-ifeq ($(LD_HAS_DYN), yes)
-               $(SHELL) olsrd-exports.sh $$(find src -name "*.h") > $(EXENAME).exports
-endif
-# precompile plugins for static linking
-               set -e;for dir in $(STATIC_PLUGINS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR);done
-               $(CC) $(LDFLAGS) $(LDFLAGS_EXE) -o $@ $^ $(STATIC_PLUGIN_OBJS) $(LIBS)
+               @echo "[LD] $@"
+               @$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+cfgparser:     $(CFGDEPS) src/builddata.o
+               $(MAKE) -C $(CFGDIR)
 
-show-ignored-warnings:
-       CC="$(CC)" $(TOPDIR)/gcc-warnings $(ALL_WARNINGS) > /dev/null
+switch:                
+       @$(MAKECMD) -C $(SWITCHDIR)
 
 # generate it always
 .PHONY: src/builddata.c
 src/builddata.c:
        @$(RM) "$@"
-       @echo "#include \"defs.h\"" >> "$@"
-       @echo "const char olsrd_version[] = \"olsr.org - $(VERS)-`git log -1 --pretty=%h`\";"  >> "$@"
-       @date +"const char build_date[] = \"%Y-%m-%d %H:%M:%S\";" >> "$@"
-       @echo "const char build_host[] = \"$(shell hostname)\";" >> "$@"
+       @echo "#include \"defs.h\"" >> "$@" 
+       @echo "const char olsrd_version[] = \"olsr.org -  $(VERS)-git_`git log -1 --pretty=%h`-hash_`./make/hash_source.sh`\";"  >> "$@"
+       @date +"const char build_date[] = \"%Y-%m-%d %H:%M:%S\";" >> "$@" 
+       @echo "const char build_host[] = \"$(shell hostname)\";" >> "$@" 
 
 
-.PHONY: help libs clean_libs libs_clean clean uberclean install_libs libs_install install_bin install_olsrd install build_all install_all clean_all
+.PHONY: help libs clean_libs libs_clean clean distclean uberclean install_libs uninstall_libs libs_install libs_uninstall install_bin uninstall_bin install_olsrd uninstall_olsrd install uninstall build_all install_all uninstall_all clean_all 
 
 clean:
        -rm -f $(OBJS) $(SRCS:%.c=%.d) $(EXENAME) $(EXENAME).exe src/builddata.c $(TMPFILES)
-       -rm -f $(EXENAME).exports
        -rm -f libolsrd.a
+       -rm -f olsr_switch.exe
        -rm -f gui/win32/Main/olsrd_cfgparser.lib
        -rm -f olsr-setup.exe
        -rm -fr gui/win32/Main/Release
        -rm -fr gui/win32/Shim/Release
 
+clean_gui:
+       $(MAKE) -C gui/linux-gtk clean
+
+distclean: uberclean
+uberclean:     clean clean_libs clean_gui
+       -rm -f $(TAGFILE)
+#      BSD-xargs has no "--no-run-if-empty" aka "-r"
+       find . \( -name '*.[od]' -o -name '*~' \) -not -path "*/.hg*" -type f -print0 | xargs -0 rm -f
+       @$(MAKECMD) -C $(SWITCHDIR) clean
+       @$(MAKECMD) -C $(CFGDIR) clean
+
 install: install_olsrd
 
+uninstall: uninstall_olsrd
+
 install_bin:
-               mkdir -p '$(SBINDIR)'
-               install -m 755 '$(EXENAME)' '$(SBINDIR)'
-               $(STRIP) '$(SBINDIR)/$(EXENAME)'
+               mkdir -p $(SBINDIR)
+               install -m 755 $(EXENAME) $(SBINDIR)
+               $(STRIP) $(SBINDIR)/$(EXENAME)
+
+uninstall_bin:
+               rm -f $(SBINDIR)/$(EXENAME)
+               rmdir -p --ignore-fail-on-non-empty $(SBINDIR)
 
 install_olsrd: install_bin
-               @echo '========= C O N F I G U R A T I O N - F I L E ============'
-               @echo '$(EXENAME) uses the configfile $(CFGFILE)'
-               @echo 'a default configfile. A sample RFC-compliance aimed'
-               @echo 'configfile can be found in olsrd.conf.default.rfc.'
-               @echo 'However none of the larger OLSRD using networks use that'
-               @echo 'so install a configfile with activated link quality exstensions'
-               @echo 'per default.'
-               @echo 'can be found at files/olsrd.conf.default.lq'
-               @echo '=========================================================='
-               mkdir -p '$(ETCDIR)'
-               -cp -i 'files/olsrd.conf.default.lq' '$(CFGFILE)'
-               @echo '-------------------------------------------'
-               @echo 'Edit $(CFGFILE) before running olsrd!!'
-               @echo '-------------------------------------------'
-               @echo 'Installing manpages $(EXENAME)(8) and $(CFGNAME)(5)'
-               mkdir -p '$(MANDIR)/man3'
-               cp 'files/olsrd-metrics.3.gz' '$(MANDIR)/man3/olsrd-metrics.3.gz'
-               mkdir -p '$(MANDIR)/man5'
-               cp 'files/olsrd.conf.5.gz' '$(MANDIR)/man5/$(CFGNAME).5.gz'
-               mkdir -p '$(MANDIR)/man8'
-               cp 'files/olsrd.8.gz' '$(MANDIR)/man8/$(EXENAME).8.gz'
+               @echo ========= C O N F I G U R A T I O N - F I L E ============
+               @echo $(EXENAME) uses the configfile $(CFGFILE)
+               @echo a default configfile. A sample RFC-compliance aimed
+               @echo configfile can be found in olsrd.conf.default.rfc.
+               @echo However none of the larger OLSRD using networks use that
+               @echo so install a configfile with activated link quality exstensions
+               @echo per default.
+               @echo can be found at files/olsrd.conf.default.lq
+               @echo ==========================================================
+               mkdir -p $(ETCDIR)
+               @if [ -e $(CFGFILE) ]; then \
+                       cp -f files/olsrd.conf.default.lq $(CFGFILE).new; \
+                       echo "Configuration file was saved as $(CFGFILE).new"; \
+               else \
+                       cp -f files/olsrd.conf.default.lq $(CFGFILE); \
+               fi
+               @echo -------------------------------------------
+               @echo Edit $(CFGFILE) before running olsrd!!
+               @echo -------------------------------------------
+               @echo Installing manpages $(EXENAME)\(8\) and $(CFGNAME)\(5\)
+ifneq ($(MANDIR),)
+               mkdir -p $(MANDIR)/man8/
+               cp files/olsrd.8.gz $(MANDIR)/man8/$(EXENAME).8.gz
+               mkdir -p $(MANDIR)/man5/
+               cp files/olsrd.conf.5.gz $(MANDIR)/man5/$(CFGNAME).5.gz
+endif
+
+uninstall_olsrd:       uninstall_bin
+ifneq ($(MANDIR),)
+               rm -f $(MANDIR)/man5/$(CFGNAME).5.gz
+               rmdir -p --ignore-fail-on-non-empty $(MANDIR)/man5/
+               rm -f $(MANDIR)/man8/$(EXENAME).8.gz
+               rmdir -p --ignore-fail-on-non-empty $(MANDIR)/man8/
+endif
+               rm -f $(CFGFILE) $(CFGFILE).new
+               rmdir -p --ignore-fail-on-non-empty $(ETCDIR)
 
 tags:
                $(TAGCMD) -o $(TAGFILE) $(TAG_SRCS)
 
-RPMVER = $(patsubst pre-%,%pre,$(VERS))
-RPMDIR = ../olsrd-$(RPMVER)
-RPMRELEASE = $(shell hg tip | { read tag val && echo "$$val"; })
-redhat/olsrd.spec: redhat/olsrd.spec.in Makefile Makefile.inc
-       @sed -e 's/@VERSION@/$(RPMVER)/' -e 's/@RELEASE@/$(RPMRELEASE)/' < "$<" > "$@"
-
-rpm: redhat/olsrd.spec
-       @echo "Creating $(RPMDIR).tar.bz2 ..."
-       @hg archive --type "tar" "$(RPMDIR).tar"
-       @tar --file "$(RPMDIR).tar" --append "$<"
-       @echo "Building RPMs..."
-       @rpmbuild -ta "$(RPMDIR).tar"
-       @bzip2 --best --force "$(RPMDIR).tar"
-
+rpm:
+               @$(RM) olsrd-current.tar.bz2
+               @echo "Creating olsrd-current.tar.bz2 ..."
+               @./list-excludes.sh | tar  --exclude-from=- --exclude="olsrd-current.tar.bz2" -C .. -cjf olsrd-current.tar.bz2 olsrd-current
+               @echo "Building RPMs..."
+               @rpmbuild -ta olsrd-current.tar.bz2
 #
 # PLUGINS
 #
 
 # This is quite ugly but at least it works
 ifeq ($(OS),linux)
-SUBDIRS = $(notdir $(shell find lib -maxdepth 2 -name Makefile -not -path lib/Makefile -printf "%h\n"|sort))
+SUBDIRS = arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mdns mini nameservice p2pd pgraph pud quagga secure sgwdynspeed tas txtinfo watchdog
 else
 ifeq ($(OS),win32)
-SUBDIRS := dot_draw httpinfo lq_etx_ff lq_etx_float lq_etx_fpm lq_rfc mini secure txtinfo watchdog
+SUBDIRS := dot_draw httpinfo jsoninfo mini pgraph secure txtinfo
 else
-SUBDIRS := debuginfo dot_draw dyn_gw dyn_gw_plain httpinfo lq_etx_ff lq_etx_float lq_etx_fpm lq_rfc mini nameservice secure txtinfo watchdog cl_roam
+ifeq ($(OS),android)
+SUBDIRS := arprefresh bmf dot_draw dyn_gw_plain httpinfo jsoninfo mini nameservice pgraph pud secure sgwdynspeed tas txtinfo watchdog
+else
+SUBDIRS := dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mini nameservice pgraph secure txtinfo watchdog
+endif
 endif
 endif
 
 libs:
-               set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR);done
+               @set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR);done
 
 libs_clean clean_libs:
-               -for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) clean;done
-ifeq ($(OS), win32)
-               -for dir in $(SUBDIRS);do rm -f lib/*.dll;done
-endif
+               -for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) clean;rm -f lib/$$dir/*.so lib/$$dir/*.dll;done
+               -rm -f $(REGEX_OBJS)
 
 libs_install install_libs:
-               set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) install;done
+               @set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) install;done
 
-# targets for making a plugin
-$(SUBDIRS):
-               $(MAKECMD) -C lib/$@ clean
-               $(MAKECMD) -C lib/$@
-               
-# targets for installing a plugin (<plugindir>_install)
-$(foreach subdir,$(SUBDIRS), $(subdir)_install):
-               $(MAKECMD) -C lib/$(subst _install,,$@) DESTDIR=$(DESTDIR) install
+libs_uninstall uninstall_libs:
+               @set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) uninstall;done
+               rmdir -p --ignore-fail-on-non-empty $(LIBDIR)
 
-txtinfoshell:
-       $(MAKECMD) -C contrib/txtinfoshell
+#
+# PLUGINS
+#
 
-build_all:     all libs txtinfoshell
-install_all:   install install_libs
-clean_all:     clean clean_libs
+arprefresh:
+               @$(MAKECMD) -C lib/arprefresh
 
-uberclean: clean_all
-       -rm -f $(TAGFILE)
-#      BSD-xargs has no "--no-run-if-empty" aka "-r"
-       find . \( -name '*.[od]' -o -name '*~' \) -not -path "*/.hg*" -print0 | xargs -0 rm -f
+arprefresh_clean:
+               @$(MAKECMD) -C lib/arprefresh DESTDIR=$(DESTDIR) clean
+
+arprefresh_install:
+               @$(MAKECMD) -C lib/arprefresh DESTDIR=$(DESTDIR) install
+
+arprefresh_uninstall:
+               @$(MAKECMD) -C lib/arprefresh DESTDIR=$(DESTDIR) uninstall
+
+bmf:
+               @$(MAKECMD) -C lib/bmf
+
+bmf_clean:
+               @$(MAKECMD) -C lib/bmf DESTDIR=$(DESTDIR) clean
+
+bmf_install:
+               @$(MAKECMD) -C lib/bmf DESTDIR=$(DESTDIR) install
+
+bmf_uninstall:
+               @$(MAKECMD) -C lib/bmf DESTDIR=$(DESTDIR) uninstall
+
+dot_draw:
+               @$(MAKECMD) -C lib/dot_draw
+
+dot_draw_clean:
+               @$(MAKECMD) -C lib/dot_draw DESTDIR=$(DESTDIR) clean
+
+dot_draw_install:
+               @$(MAKECMD) -C lib/dot_draw DESTDIR=$(DESTDIR) install
+
+dot_draw_uninstall:
+               @$(MAKECMD) -C lib/dot_draw DESTDIR=$(DESTDIR) uninstall
+
+dyn_gw:
+               @$(MAKECMD) -C lib/dyn_gw
+
+dyn_gw_clean:
+               @$(MAKECMD) -C lib/dyn_gw DESTDIR=$(DESTDIR) clean
+
+dyn_gw_install:
+               @$(MAKECMD) -C lib/dyn_gw DESTDIR=$(DESTDIR) install
+
+dyn_gw_uninstall:
+               @$(MAKECMD) -C lib/dyn_gw DESTDIR=$(DESTDIR) uninstall
+
+dyn_gw_plain:
+               @$(MAKECMD) -C lib/dyn_gw_plain
+
+dyn_gw_plain_clean:
+               @$(MAKECMD) -C lib/dyn_gw_plain DESTDIR=$(DESTDIR) clean
+
+dyn_gw_plain_install:
+               @$(MAKECMD) -C lib/dyn_gw_plain DESTDIR=$(DESTDIR) install
+
+dyn_gw_plain_uninstall:
+               @$(MAKECMD) -C lib/dyn_gw_plain DESTDIR=$(DESTDIR) uninstall
+
+httpinfo:
+               @$(MAKECMD) -C lib/httpinfo
+
+httpinfo_clean:
+               @$(MAKECMD) -C lib/httpinfo DESTDIR=$(DESTDIR) clean
+
+httpinfo_install:
+               @$(MAKECMD) -C lib/httpinfo DESTDIR=$(DESTDIR) install
+
+httpinfo_uninstall:
+               @$(MAKECMD) -C lib/httpinfo DESTDIR=$(DESTDIR) uninstall
+
+jsoninfo:
+               @$(MAKECMD) -C lib/jsoninfo
+
+jsoninfo_clean:
+               @$(MAKECMD) -C lib/jsoninfo DESTDIR=$(DESTDIR) clean
+
+jsoninfo_install:
+               @$(MAKECMD) -C lib/jsoninfo DESTDIR=$(DESTDIR) install
+
+jsoninfo_uninstall:
+               @$(MAKECMD) -C lib/jsoninfo DESTDIR=$(DESTDIR) uninstall
+
+mdns:
+               @$(MAKECMD) -C lib/mdns
+
+mdns_clean:
+               @$(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) clean
+
+mdns_install:
+               @$(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) install
+
+mdns_uninstall:
+               @$(MAKECMD) -C lib/mdns DESTDIR=$(DESTDIR) uninstall
+
+#
+# no targets for mini: it's an example plugin
+#
+
+# nameserver uses regex, which was only recently added to Android.  On
+# Android, $(REGEX_OBJS) will have all of the files needed, on all
+# other platforms, it'll be empty and therefore ignored.
+nameservice: $(REGEX_OBJS)
+               @$(MAKECMD) -C lib/nameservice clean
+               @$(MAKECMD) -C lib/nameservice
+
+nameservice_clean:
+               @$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) clean
+
+nameservice_install:
+               @$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) install
+
+nameservice_uninstall:
+               @$(MAKECMD) -C lib/nameservice DESTDIR=$(DESTDIR) uninstall
+
+p2pd:
+               @$(MAKECMD) -C lib/p2pd
+
+p2pd_clean:
+               @$(MAKECMD) -C lib/p2pd DESTDIR=$(DESTDIR) clean
+
+p2pd_install:
+               @$(MAKECMD) -C lib/p2pd DESTDIR=$(DESTDIR) install
+
+p2pd_uninstall:
+               @$(MAKECMD) -C lib/p2pd DESTDIR=$(DESTDIR) uninstall
+
+pgraph:
+               @$(MAKECMD) -C lib/pgraph
+
+pgraph_clean:
+               @$(MAKECMD) -C lib/pgraph DESTDIR=$(DESTDIR) clean
+
+pgraph_install:
+               @$(MAKECMD) -C lib/pgraph DESTDIR=$(DESTDIR) install
+
+pgraph_uninstall:
+               @$(MAKECMD) -C lib/pgraph DESTDIR=$(DESTDIR) uninstall
+
+pud:
+               @$(MAKECMD) -C lib/pud
+
+pud_clean:
+               @$(MAKECMD) -C lib/pud DESTDIR=$(DESTDIR) clean
+
+pud_install:
+               @$(MAKECMD) -C lib/pud DESTDIR=$(DESTDIR) install
+
+pud_uninstall:
+               @$(MAKECMD) -C lib/pud DESTDIR=$(DESTDIR) uninstall
+
+quagga:
+               @$(MAKECMD) -C lib/quagga
+
+quagga_clean:
+               @$(MAKECMD) -C lib/quagga DESTDIR=$(DESTDIR) clean
+
+quagga_install:
+               @$(MAKECMD) -C lib/quagga DESTDIR=$(DESTDIR) install
+
+quagga_uninstall:
+               @$(MAKECMD) -C lib/quagga DESTDIR=$(DESTDIR) uninstall
+
+secure:
+               @$(MAKECMD) -C lib/secure
+
+secure_clean:
+               @$(MAKECMD) -C lib/secure DESTDIR=$(DESTDIR) clean
+
+secure_install:
+               @$(MAKECMD) -C lib/secure DESTDIR=$(DESTDIR) install
+
+secure_uninstall:
+               @$(MAKECMD) -C lib/secure DESTDIR=$(DESTDIR) uninstall
+
+sgwdynspeed:
+               @$(MAKECMD) -C lib/sgwdynspeed
+
+sgwdynspeed_clean:
+               @$(MAKECMD) -C lib/sgwdynspeed DESTDIR=$(DESTDIR) clean
+
+sgwdynspeed_install:
+               @$(MAKECMD) -C lib/sgwdynspeed DESTDIR=$(DESTDIR) install
+
+sgwdynspeed_uninstall:
+               @$(MAKECMD) -C lib/sgwdynspeed DESTDIR=$(DESTDIR) uninstall
+
+tas:
+               @$(MAKECMD) -C lib/tas
+
+tas_clean:
+               @$(MAKECMD) -C lib/tas DESTDIR=$(DESTDIR) clean
+
+tas_install:
+               @$(MAKECMD) -C lib/tas DESTDIR=$(DESTDIR) install
+
+tas_uninstall:
+               @$(MAKECMD) -C lib/tas DESTDIR=$(DESTDIR) uninstall
+
+txtinfo:
+               @$(MAKECMD) -C lib/txtinfo
+
+txtinfo_clean:
+               @$(MAKECMD) -C lib/txtinfo DESTDIR=$(DESTDIR) clean
+
+txtinfo_install:
+               @$(MAKECMD) -C lib/txtinfo DESTDIR=$(DESTDIR) install
+
+txtinfo_uninstall:
+               @$(MAKECMD) -C lib/txtinfo DESTDIR=$(DESTDIR) uninstall
+
+watchdog:
+               @$(MAKECMD) -C lib/watchdog
+
+watchdog_clean:
+               @$(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) clean
+
+watchdog_install:
+               @$(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) install
+
+watchdog_uninstall:
+               @$(MAKECMD) -C lib/watchdog DESTDIR=$(DESTDIR) uninstall
+
+
+build_all:     all switch libs
+install_all:   install install_libs
+uninstall_all: uninstall uninstall_libs
+clean_all:     uberclean clean_libs
index 37763c2..4275ad2 100644 (file)
@@ -4,27 +4,26 @@
 #
 #
 
-# set DEBUG to 1 to add debugger symbols to olsrd
-# set DEBUG to 0 to remove both and optimize olsrd for size
+# activate debugging with 1 or deactivate with 0
 DEBUG ?= 1
 
-# set to 1 to remove a severity level of logging from olsrd
-REMOVE_LOG_DEBUG ?= 0
-REMOVE_LOG_INFO  ?= 0
-REMOVE_LOG_WARN  ?= 0
-REMOVE_LOG_ERROR ?= 0
+# compile OLSR_PRINTF out
+NO_DEBUG_MESSAGES ?= 0
+
+# the optimize option to be set for gcc
+OPTIMIZE ?= 
 
 # enable mudflap with 1 or deactivate with 0
 # you need a recent enough gcc and the libmudflap installed
 MUDFLAP ?= 0
 
-# enables several security features like exec ASLR,
-# stack protector, fortify source, RELRO and BIND_NOW
-# only for linux at the moment
-HARDENING ?= 0
-
-# enable static linking of plugins (list of plugin directory names) 
-STATIC_PLUGINS ?= lq_etx_ff
+# OS detection
+ifeq ($(OS),Windows_NT)
+OS := win32
+endif
+ifeq ($(OS),)
+OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
+endif
 
 ######################
 #
@@ -34,224 +33,166 @@ STATIC_PLUGINS ?= lq_etx_ff
 # programs
 CCACHE ?=       $(shell IFS=:; for i in $$PATH;do test -x "$$i/ccache" && echo "$$i/ccache" && break; done)
 ifeq ($(origin CC),default)
-  CC =                 $(CCACHE) gcc
+CC =           $(CCACHE) gcc
 else
-  CC ?=                $(CCACHE) gcc
+CC ?=          $(CCACHE) gcc
 endif
 ifeq ($(DEBUG),0)
-  STRIP ?=     strip
+STRIP ?=       strip
 else
-  STRIP ?=     :
+STRIP ?=       :
 endif
-
 BISON ?=       bison
 FLEX ?=                flex
 TAGCMD ?=      etags
-LD_HAS_DYN ?=   $(shell $(CC) -Wl,--help 2>&1|grep -w -q -- --dynamic-list && echo yes)
 
 # target directories and names
-PREFIX  ?= /usr/local
-DESTDIR ?=
-SBINDIR ?= $(DESTDIR)$(PREFIX)/sbin
-ETCDIR  ?= $(DESTDIR)$(subst /usr/etc,/etc,$(PREFIX)/etc)
-LIBDIR  ?= $(DESTDIR)$(PREFIX)/lib
-DOCDIR  ?= $(DESTDIR)$(PREFIX)/share/doc
-MANDIR  ?= $(DESTDIR)$(PREFIX)/share/man
-EXENAME ?= olsrd
-CFGNAME ?= $(EXENAME).conf
-CFGFILE ?= $(ETCDIR)/$(CFGNAME)
-
-CPPFLAGS =     $(filter-out -I./src,-Isrc -I$(TOPDIR)/src)
-CPPFLAGS +=    -DOLSRD_CONF_FILE_NAME='"$(CFGNAME)"'
-CPPFLAGS +=    -DOLSRD_GLOBAL_CONF_FILE='"$(CFGFILE)"'
-CPPFLAGS += -D_XOPEN_SOURCE=700 -D_BSD_SOURCE
-#############
-# handle debugging and logging options
-#############
-ifeq ($(REMOVE_LOG_DEBUG),1)
-  CPPFLAGS +=  -DREMOVE_LOG_DEBUG
-endif
-ifeq ($(REMOVE_LOG_INFO),1)
-  CPPFLAGS +=  -DREMOVE_LOG_INFO
-endif
-ifeq ($(REMOVE_LOG_WARN),1)
-  CPPFLAGS +=  -DREMOVE_LOG_WARN
-endif
-ifeq ($(REMOVE_LOG_ERROR),1)
-  CPPFLAGS +=  -DREMOVE_LOG_ERROR
+DESTDIR  ?=
+ETCDIR   ?= $(DESTDIR)/etc
+USRDIR   ?= $(DESTDIR)/usr
+INCLUDEDIR ?= $(DESTDIR)/usr/include
+LIBDIR   ?= $(USRDIR)/lib
+SBINDIR  ?= $(USRDIR)/sbin
+SHAREDIR ?= $(USRDIR)/share
+DOCDIR   ?= $(SHAREDIR)/doc
+MANDIR   ?= $(SHAREDIR)/man
+EXENAME  ?= olsrd
+CFGNAME  ?= $(EXENAME).conf
+CFGFILE  ?= $(ETCDIR)/$(CFGNAME)
+
+DOCDIR_OLSRD ?= $(DOCDIR)/$(EXENAME)
+
+
+CPPFLAGS =     -Isrc
+ifneq ($(TOPDIR),.)
+CPPFLAGS +=    -I$(TOPDIR)/src
 endif
 
-##############
-# OS detection
-##############
-ifeq ($(OS),Windows_NT)
-  OS := win32
-endif
-ifeq ($(OS),)
-  OS := $(shell sh $(TOPDIR)/make/guess_os.sh)
+# add gcc warnings and optimizations if CFLAGS not set
+ifndef CFLAGS
+ifndef WARNINGS
+WARNINGS +=    -Wall
+WARNINGS +=    -Wextra
+WARNINGS +=    -Wold-style-definition
+WARNINGS +=    -Wdeclaration-after-statement
+WARNINGS +=    -Wmissing-prototypes
+WARNINGS +=    -Wstrict-prototypes
+WARNINGS +=    -Wmissing-declarations
+WARNINGS +=    -Wsign-compare
+WARNINGS +=    -Waggregate-return
+WARNINGS +=    -Wmissing-noreturn
+WARNINGS +=    -Wmissing-format-attribute
+WARNINGS +=    -Wno-multichar
+WARNINGS +=    -Wno-deprecated-declarations
+WARNINGS +=    -Wendif-labels
+WARNINGS +=    -Wwrite-strings
+WARNINGS +=    -Wbad-function-cast
+WARNINGS +=    -Wpointer-arith
+WARNINGS +=    -Wcast-qual
+WARNINGS +=    -Wshadow
+WARNINGS +=    -Wformat
+WARNINGS +=    -Wsequence-point
+WARNINGS +=    -Wcast-align
+WARNINGS +=    -Wformat-security
+WARNINGS +=    -Wformat-y2k
+WARNINGS +=    -Winit-self
+WARNINGS +=    -Wswitch-default
+WARNINGS +=    -Wsync-nand
+WARNINGS +=    -Wundef
+WARNINGS +=    -Wlogical-op
+ifneq ($(OS),android)
+WARNINGS +=    -Wdouble-promotion
+WARNINGS +=    -Wjump-misses-init
+WARNINGS +=    -Wtrampolines
 endif
-
-#################
-# OLSRd hardening
-#################
-# -D_FORTIFY_SOURCE=2 need at least -O2
-ifeq ($(OS),win32)
-  HARDENING := 0
+WARNINGS +=    -Wunused-parameter
+# the following 2 do not work yet and need more work on it
+#WARNINGS +=   -Wconversion
+#WARNINGS +=   -Wredundant-decls
+ifeq ($(MUDFLAP),0)
+# work around a bug in gcc-4.*
+WARNINGS +=    -Wnested-externs
 endif
-ifeq ($(DEBUG),1)
-  HARDENING := 0
+# Alas, htons() triggers this so we can't seriously activate it.
+#WARNINGS +=   -Wunreachable-code
+WARNINGS +=    -Winline
+WARNINGS +=    -Wdisabled-optimization
+# WARNINGS +=  -Werror
+WARNINGS +=    -finline-functions-called-once
+WARNINGS +=    -funit-at-a-time
+WARNINGS +=    -fearly-inlining
+ifeq ($(DEBUG),0)
+WARNINGS +=    -fomit-frame-pointer
 endif
-
-ifeq ($(HARDENING),1)
-  ifeq ($(OPTIMIZE),)
-    OPTIMIZE := -O2
-  endif
+# we have small inline functions in src/lq_route.h which should always be inlined
+WARNINGS +=    -finline-limit=350
+# These tell gcc to put each function and global variable in a separate section.
+# The linker can than remove all unreferenced section. But in the olsrd binary
+# unused doesn't imply unused at all since the function may be used by plugins,
+# e.g. the ones in src/plugin_utils.c.
+# So we can use that featuer at most to identify unused functions and remove them
+# from the source by hand.
+#WARNINGS +=   -ffunction-sections
+#WARNINGS +=   -fdata-sections
+WARNINGS :=    $(shell CC="$(CC)" "$(TOPDIR)/gcc-warnings" $(WARNINGS))
 endif
+CFLAGS +=      $(WARNINGS)
+CFLAGS +=      $(OPTIMIZE)
+CFLAGS +=      $(EXTRA_CFLAGS)
 
-##############
-# add gcc warnings and optimizations if CFLAGS not set
-##############
-
-ifndef CFLAGS
-  ifndef WARNINGS
-    ALL_WARNINGS +=    -Wall
-    ALL_WARNINGS +=    -Wextra
-    ALL_WARNINGS +=    -Wold-style-definition
-    ALL_WARNINGS +=    -Wdeclaration-after-statement
-    ALL_WARNINGS +=    -Wmissing-prototypes
-    ALL_WARNINGS +=    -Wstrict-prototypes
-    ALL_WARNINGS +=    -Wmissing-declarations
-    ALL_WARNINGS +=    -Wsign-compare
-    ALL_WARNINGS +=    -Waggregate-return
-    ALL_WARNINGS +=    -Wmissing-noreturn
-    ALL_WARNINGS +=    -Wmissing-format-attribute
-    ALL_WARNINGS +=    -Wno-multichar
-    ALL_WARNINGS +=    -Wno-deprecated-declarations
-    ALL_WARNINGS +=    -Wendif-labels
-    ALL_WARNINGS +=    -Wwrite-strings
-    ALL_WARNINGS +=    -Wbad-function-cast
-    ALL_WARNINGS +=    -Wpointer-arith
-    ALL_WARNINGS +=    -Wcast-qual
-    ALL_WARNINGS +=    -Wshadow
-    ALL_WARNINGS +=    -Wformat-2
-    ALL_WARNINGS +=    -Wsequence-point
-    ALL_WARNINGS +=    -Wpointer-arith
-    #ALL_WARNINGS +=   -Wcast-align
-
-    # the following 2 do not work yet and need more work on it
-    #ALL_WARNINGS +=   -Wconversion
-    #ALL_WARNINGS +=   -Wredundant-decls
-
-    ifeq ($(MUDFLAP),0)
-      # work around a bug in gcc-4.*
-      ALL_WARNINGS +=  -Wnested-externs
-    endif
-
-    # Alas, htons() triggers this so we can't seriously activate it.
-    #ALL_WARNINGS +=   -Wunreachable-code
-
-    ALL_WARNINGS +=    -Winline
-    ALL_WARNINGS +=    -Wdisabled-optimization
-               ALL_WARNINGS += -Wformat
-               ALL_WARNINGS += -Wformat-security
-    ALL_WARNINGS +=    -Werror
-    ALL_WARNINGS +=    -finline-functions-called-once
-    ALL_WARNINGS +=    -funit-at-a-time
-    ALL_WARNINGS +=    -fearly-inlining
-    ALL_WARNINGS += -fno-strict-aliasing
-    
-    ifeq ($(DEBUG),0)
-      ALL_WARNINGS +=  -fomit-frame-pointer
-    endif
-
-    # we have small inline functions in src/ipcalc.h which should always be inlined
-    ALL_WARNINGS +=    -finline-limit=350
-
-    # These tell gcc to put each function and global variable in a separate section.
-    # The linker can than remove all unreferenced section. But in the olsrd binary
-    # unused doesn't imply unused at all since the function may be used by plugins,
-    # e.g. the ones in src/plugin_utils.c.
-    # So we can use that feature at most to identify unused functions and remove them
-    # from the source by hand.
-
-    #ALL_WARNINGS +=   -ffunction-sections
-    #ALL_WARNINGS +=   -fdata-sections
-    ALL_WARNINGS +=    -Wstrict-overflow=5
-    ALL_WARNINGS +=    $(EXTRA_WARNINGS)
-    WARNINGS :=        $(shell CC="$(CC)" $(TOPDIR)/gcc-warnings $(ALL_WARNINGS) 2> /dev/null)
-  endif
-
-  CFLAGS +=    $(WARNINGS)
-  CFLAGS +=    $(OPTIMIZE)
-  CFLAGS +=    $(EXTRA_CFLAGS)
-
-  ifneq ($(filter -Wstrict-overflow%,$(WARNINGS)),)
-    NO_STRICT_OVERFLOW = -Wstrict-overflow=0
-  endif
-
-endif # ifndef CFLAGS
-
-ifeq ($(DEBUG),1)
-  CPPFLAGS +=  -DDEBUG
-  CFLAGS +=    -ggdb
-  OPTIMIZE ?=  -O0
-else
-  OPTIMIZE ?=  -Os
+# Must be specified along with -lpthread on linux
+CPPFLAGS +=    $(OS_CFLAG_PTHREAD)
 endif
-
 ifneq ($(MUDFLAP),0)
-  CFLAGS +=    -fmudflapth
+CFLAGS +=      -fmudflapth
 endif
 
 ifdef OLSRD_PLUGIN
-  # c and ld flags for libraries (plugins)
-  CPPFLAGS +=  -DOLSR_PLUGIN
-  LDFLAGS +=   -shared
-  LDFLAGS +=   -Wl,-soname,$(PLUGIN_NAME)
-  LDFLAGS +=   -Wl,--version-script=version-script.txt
+# c and ld flags for libraries (plugins)
+CPPFLAGS +=    -DOLSR_PLUGIN
+ifeq ($(OS),win32)
+  LDFLAGS +=   -Wl,-export-all-symbols,--enable-auto-import
+endif
+LDFLAGS +=     -shared
+LDFLAGS +=     -Wl,-soname,$(PLUGIN_SONAME)
+LDFLAGS +=     -Wl,--version-script=version-script.txt 
 else
-  # c and ld flags for main
-  ifeq ($(HARDENING),1)
-    CFLAGS +=  -fPIE
-    LDFLAGS += -pie
-  endif
-  ifeq ($(LD_HAS_DYN), yes)
-    LDFLAGS_EXE +=     -Wl,--dynamic-list=$(EXENAME).exports
-  else
-    LDFLAGS_EXE +=     -Wl,-export-dynamic
-  endif
-  LDFLAGS +=   -Wl,-rpath,$(LIBDIR)
+# c and ld flags for main
+ifeq ($(OS),win32)
+  LDFLAGS +=   -Wl,-export-all-symbols
+else 
+  LDFLAGS +=   -Wl,-export-dynamic 
 endif
-
-# LDFLAGS for all
+LDFLAGS +=     -Wl,-rpath,$(LIBDIR)
+endif
+# LDFLAGS for all 
 LDFLAGS +=     -Wl,--warn-common
-
 # See above at "-ffunction-sections" for an explanation (and why it is disabled).
 #LDOPTS +=     -Wl,--gc-sections
 #LDOPTS +=     -Wl,--print-gc-sections
 #LDFLAGS +=    $(shell CC="$(CC)" $(TOPDIR)/ld-warnings $(LDOPTS))
 ifneq ($(MUDFLAP),0)
-  LIBS +=              -lmudflapth
+LIBS +=                -lmudflapth
 endif
+LIBS +=                $(OS_LIB_PTHREAD)
 
 # extra options from the outside
 CPPFLAGS +=    $(EXTRA_CPPFLAGS)
-LDFLAGS +=     $(EXTRA_LDFLAGS)
 
-# search sources and headers in current dir and in src/
-SRCS +=                $(wildcard src/common/*.c src/*.c)
-HDRS +=                $(wildcard src/common/*.h src/*.h)
+###################################
+#
+# options to save space on small systems
 
-#get headers and object files for static plugins
-STATIC_PLUGIN_SRCS += $(foreach dir,$(STATIC_PLUGINS),$(wildcard lib/$(dir)/src/*.c))
-STATIC_PLUGIN_OBJS += $(STATIC_PLUGIN_SRCS:%.c=%.o)
+# we have plugins with the old interface
+#CPPFLAGS +=   -DSUPPORT_OLD_PLUGIN_VERSIONS=1
 
-ifdef OLSRD_PLUGIN
-  # this must be run after the OS-specific makefile
-  CPPFLAGS +=  -DPLUGIN_FULLNAME="\"$(PLUGIN_FULLNAME)\""
-endif
+# use the new fixed point math stuff
+CPPFLAGS +=     -DUSE_FPM
+
+# search sources and headers in current dir and in src/
+SRCS +=                $(wildcard src/common/*.c src/*.c *.c)
+HDRS +=                $(wildcard src/common/*.h src/*.h *.h)
 
-# load os-specific makefiles
 ifeq ($(OS),UNKNOWN)
 all: help
 else
@@ -263,29 +204,46 @@ endif
 # one object for each source file
 OBJS +=                $(SRCS:%.c=%.o)
 
+# debugging or non-debugging flags
+ifeq ($(DEBUG),1)
+CPPFLAGS +=    -DDEBUG
+CFLAGS +=      -ggdb
+else
+CPPFLAGS +=    -DNDEBUG
+endif
+ifeq ($(NO_DEBUG_MESSAGES),1)
+CPPFLAGS +=    -DNODEBUG
+endif
+
+ifeq ($(OS),linux)
+CPPFLAGS+=-DHTTPINFO_PUD -I$(TOPDIR)/lib -I$(TOPDIR)/lib/pud/nmealib/include -I$(TOPDIR)/lib/pud/wireformat/include
+endif
+
 # a make function to quote "/" and "."
 quote = $(subst .,\.,$(subst /,\/,$1))
 
 # fully automatic and working dependency generation
 %.d: %.c
-       @$(filter-out $(CCACHE),$(CC)) -M $(strip $(CPPFLAGS)) "$<" | sed -e '1s/\($(call quote,$(*F))\.o\)[ :]*/$(call quote,$(*D)/\1 $@: Makefile $(if $(TOPDIR),$(TOPDIR)/)Makefile.inc) /g' >"$@"
+       @$(filter-out $(CCACHE),$(CC)) -M $(strip $(CPPFLAGS)) "$<" | sed -e '1s/\($(call quote,$(*F))\.o\)[ :]*/$(call quote,$(*D)/\1 $@: Makefile $(TOPDIR)$(if $(TOPDIR),/)Makefile.inc) /g' >"$@"
 
-src/common/autobuf.o src/mpr.o: CFLAGS += $(NO_STRICT_OVERFLOW)
+%.o: %.c
+       @echo "[CC] $<"
+       @$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
 
 # we always need the includes and defines
 # for legacy since now
 CPPFLAGS += $(INCLUDES) $(DEFINES)
 ifneq ($(INCLUDES),)
-  $(warning Use CPPFLAGS instead of INCLUDES for -I)
+$(warning Use CPPFLAGS instead of INCLUDES for -I)
 endif
 ifneq ($(DEFINES),)
-  $(warning Use CPPFLAGS instead of DEFINES for -D)
+$(warning Use CPPFLAGS instead of DEFINES for -D)
 endif
 
 TAGFILE ?=     src/TAGS
 
 help:
-       @echo
+       @echo 
        @echo '***** olsr.org olsr daemon Make ****'
        @echo ' Automatic detection of your OS     '
        @echo ' failed!                            '
@@ -293,12 +251,13 @@ help:
        @echo ' by setting the OS variable! Valid  '
        @echo ' target OSes are:                   '
        @echo ' ---------------------------------  '
-       @echo ' linux - GNU/Linux                  '
-       @echo ' win32 - MS Windows                 '
-       @echo ' fbsd  - FreeBSD                    '
-       @echo ' nbsd  - NetBSD                     '
-       @echo ' obsd  - OpenBSD                    '
-       @echo ' osx   - Mac OS X                   '
+       @echo ' linux   - GNU/Linux                '
+       @echo ' win32   - MS Windows               '
+       @echo ' fbsd    - FreeBSD                  '
+       @echo ' nbsd    - NetBSD                   '
+       @echo ' obsd    - OpenBSD                  '
+       @echo ' osx     - Mac OS X                 '
+       @echo ' android - Android                  '
        @echo ' ---------------------------------  '
        @echo ' Example - build for windows:       '
        @echo ' make OS=win32                      '
@@ -308,7 +267,7 @@ help:
        @echo '************************************'
        @echo
 
-ifeq ($(filter clean% %clean rpm, $(MAKECMDGOALS)),)
+ifeq ($(filter clean% %clean, $(MAKECMDGOALS)),)
 # include dependencies - we don't need any dependency for a everytime generated files
 -include $(filter-out src/builddata.%,$(SRCS:%.c=%.d))
 endif
diff --git a/OS-subsystem.txt b/OS-subsystem.txt
deleted file mode 100644 (file)
index cbc7dcb..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-Document a little bit the latest changes for the OS refactoring
-===============================================================
-
-
-
-
-moved OS sepcfic includes to src/os_*.h
-deleted and renamed many .h files
-
-
-os_system.h:
-
-
-  /* called very soon ! any static intializations for the OS go here */
-  void os_init(void);
-
-  /* called shortly before olsrd quits . Called very late */
-  void os_cleanup(void);
-   
-
-
-os_net.h:
-
-renamed all olsr_$function to os_$function . For example olsr_sendto() -> os_sendto().
-
-
-/* called very early while initialization of the interface */
-int os_init_interface(struct interface *, struct olsr_if_config *);
-
-/* called very late while cleaning up of the interface */
-void os_cleanup_interface(struct interface *);
-
-
-
-os_kernel_routes.h:
-
-int os_route_add_rtentry(const struct rt_entry *, int);
-int os_route_del_rtentry(const struct rt_entry *, int);
-
-
-os_time.h:
-
-
-  11 #include <sys/time.h>
-  12 #include "defs.h"
-  13 
-  14 int EXPORT(os_gettimeofday)(struct timeval *TVal, void *TZone);
-  15 void EXPORT(os_sleep)(unsigned int Sec);
-  16 int EXPORT(os_nanosleep)(struct timespec *Req, struct timespec *Rem);
-
-
-These are actually posix functions.
-Because they are exported, these can be interfaced with the event based simulator :))
-
-
diff --git a/README-Olsr-Extensions b/README-Olsr-Extensions
new file mode 100644 (file)
index 0000000..ac244cf
--- /dev/null
@@ -0,0 +1,441 @@
+=====================================================
+      OLSRd (version 0.6.0) protocol extensions
+=====================================================
+
+1.) Credits
+2.) Link quality algorithms
+3.) Fisheye
+4.) NIIT (ipv4 over ipv6 traffic)
+5.) Smart gateways (asymmetric gateway tunnels)
+6.) NatThreshold
+
+NIIT and Smart gateways are only supported for Linux at the moment.
+
+    1.) Credits:
+********************
+
+The concept of ETX (Expected Transmission Count) has been developed by
+Douglas S. J. De Couto at the Massachusetts Institute of Technology
+(see http://en.wikipedia.org/wiki/Expected_Transmission_Count).
+
+The original ETX design has been done by the Berlin Freifunk Network
+(see www.freifunk.net and www.c-base.org), the code and message format
+was coded by Thomas Lopatic.
+
+Fisheye was implemented by Thomas Lopatic in 2005.
+
+The LQ-Plugin rewrite was done by Henning Rogge in 2008.
+
+The NIIT kernel module was written by lynxis in 2009.
+
+The asymmetric gateway tunnel functionality was written by Markus Kittenberger
+and Henning Rogge, but the concept was used by B.A.T.M.A.N before OLSRd.
+
+
+
+    2.) Link quality algorithm
+**********************************
+
+Concept:
+--------
+
+OLSRd (since version 0.5.6) uses a dimension-less integer value as a
+representation of the 'cost' of each link. This is often called Link Quality
+(LQ for short). There are multiple LQ plugins, each of them calculating a cost
+for the links of the router. At the moment (version 0.6.0) all LQ plugins are
+using an ETX-metric (Expected Transmission Count) but other metrics would be
+possible and imaginable, such as MIC [0], etc.
+
+
+Each link is described by an LQ/NLQ (Link Quality/Neighbor Link Quality) value
+pair, which describe the quality towards the router (LQ) and towards the
+neighbor (NLQ). Both LQ and NLQ can be values between 0 and 1. The total cost
+of the link is calculated as ETX = 1.0/(LQ * NLQ). The ETX value of a link can
+be seen as the number of retransmissions necessary to deliver the packet to the
+target. ETX 1.0 mean a perfect link without packet loss.
+
+       A                  B
+     +---+              +---+
+     |   |  <--- LQ --- |   |
+     |   |  ---- NLQ -->|   |
+     +---+              +---+
+
+Note that the LQ and NLQ are always as seen from one nodes' perspective: the LQ
+of node B towards A is the percentage of packets that B can transmit to A.
+Hence, in the OLSR ETX implementation, B has to tell A it's LQ.
+
+OLSRd chooses the path towards a target by selecting the path segments with the
+smallest sum of link costs. In other words:
+
+   best_path(A,B) = minimum_sum({set of all paths between A and B})
+
+
+Configuration:
+--------------
+
+The link quality system is activated by setting the configuration variable
+"LinkQualityLevel" to 2.
+
+You can use the "LinkQualityAlgorithm" parameter to choose the current
+link quality algorithm in the configuration file. Some embedded OLSRd versions
+are only compiled with one plugin (mostly etx_ff), so don't use the
+configuration option with these agents.
+
+There are four different link quality algorithms in OLSRd 0.6.0, two
+current Funkfeuer/Freifunk ETX implementations and two legacy implementations.
+
+LinkQuality-Algorithm "etx_ff":
+-------------------------------
+
+"Etx_ff" (ETX Funkfeuer/Freifunk) is the current default LQ algorithm for OLSRd.
+It uses the sequence number of the OLSR packets (which are link specific)
+to determine the current packet loss rate. Etx_ff includes a hysteresis
+mechanism to suppress small fluctuations of the LQ and NLQ values. If
+no packets are received from a certain neighbor at all, a timer begins
+to lower the calculated LQ value until the next packet is received or
+the link is dropped.
+Etx_ff uses only integer arithmetic, so it performs well on embedded
+hardware having no FPU.
+
+The message format of etx_ff is compatible with etx_fpm and etx_float.
+
+
+LinkQuality-Algorithm "etx_ffeth"
+--------------------------------
+
+"Etx_ffeth" is an experimental and INCOMPATIBLE extension of etx_ff (meaning it
+is not interoperable with etx_ff nodes).  The problem with etx_ff, etx_float
+and etx_fpm is that they calculate Ethernet links with the same cost as a
+wireless link without packet loss (ETX=1.0) because the encoding of etx_ff
+cannot encode link costs lower than 1.0. This means OLSRd prefers a single
+wireless link with some loss (e.g. ETX=1.5) over a two hop route with one
+Ethernet link (ETX=1.0) and one perfect wireless link (ETX=1.0) *even though*
+the 2 hop path would be better!
+
+"Etx_ffeth" tries to work around this problem by introducing a special
+LQ encoding value ETX=0.1, which is only used for Ethernet
+links without packet loss. Because of the different encoding, etx_ffeth
+is not compatible with etx_ff, etx_fpm or etx_float. These three
+implementations detect etx_ffeth nodes with LQ 0 (ETX infinite).
+
+etx_ffeth uses only integer arithmetic, so it performs well on embedded
+hardware.
+
+All Ethernet interfaces must be marked with "mode ether"
+(see olsrd.conf.default.full) in their interface configuration to get any
+useful advantage of etxff_eth.
+
+At the time of this writing, etx_ffeth is the preferred metric for building new
+mesh networks which include links over LAN cables (such as daisy chained
+Linksys routers).
+
+
+Legacy LinkQuality-Algorithm "etx_float"
+----------------------------------------
+
+"Etx_float" calculates the ETX value by using exponential aging (with
+a configurable aging parameter) on the incoming (or lost) Hellos.
+It is easier to understand than etx_ff, but the results are not as
+good as with etx_ff, since it cannot use the TC messages for link
+quality calculation.
+Etx_float uses floating point math, so it might use more CPU on embedded
+hardware.
+
+The message format of etx_float is compatible with etx_fpm and etx_ff.
+
+
+Legacy LinkQuality-Algorithm "etx_fpm"
+--------------------------------------
+
+"Etx_fpm" is a fixed point math implementation of etx_float. It
+calculates the same link qualities as etx_float, but is much faster
+on embedded hardware.
+
+The message format of etx_fpm is compatible with etx_float and etx_ff.
+
+
+Building your own LinkQuality Algorithm
+----------------------------------------
+
+With the supplied samples OLSRd can be easily extended to support different
+metrics. Please take a look at src/lq_plugin*.[ch] for inspiration and get in
+contact with us on the OLSR development mailing list in case you plan to
+implement a new metric.
+
+
+
+    3.) Fisheye
+*******************
+
+Normally OLSR floods all topology control (TC) messages to all
+routes in the mesh, which can create a lot of overhead for large
+meshes with hundreds of routers. Reducing the rate of TCs can reduce
+this overhead, but delay route changes and correction of errors
+in the routing tables.
+
+The Fisheye (sometimes called Hazy Sighted Link State Routing [1])
+mechanism implements a strategy to reach a compromise between
+these two problems. When activated only every 8th TC is send
+to all mesh nodes. Most TCs are given a reduced TTL (time to live)
+and are only transmitted to the neighborhood of the router.
+
+The current sequence of TTLs with active Fisheye mechanism is
+2, 8, 2, 16, 2, 8, 2 and 255 (maximum TTL).
+
+The problem with Fisheye is that it introduces artificial borders
+for flooding TCs, which can theoretically lead to inconsistent routes
+and routing loops at the border of the Fisheye circles. In practice
+Fisheye seems to work well enough that it is a mandatory feature
+for most larger Funkfeuer/Freifunk meshes.
+
+
+    4.) NIIT (ipv4 over ipv6 traffic)
+*****************************************
+(see https://dev.dd19.de/cgi-bin/gitweb.cgi?p=niit.git;a=summary)
+
+NIIT is a special Linux kernel device that allows easy transmission of IPv4
+unicast traffic through an IPv6 network. Since version 0.6.0 OLSRd has
+integrated support for NIIT in the routing daemon. So setting up IPv4 traffic
+over IPv6 OLSR meshes is very easy. Instead of creating routes and tunnels by
+hand all the administrator of a router needs to do is to, is to set up his own
+IPv4 targets as "IPv4-mapped" IPv6 HNAs.
+
+Example configurations:
+- connect a local 192.168.1.0/8 net to the mesh
+
+HNA6 {
+  0::ffff:C0A8:01:00 120
+}
+
+- announce an IPv4 Internet gateway
+
+HNA6 {
+  0::ffff:0:0 96
+}
+
+
+More information on NIIT can be found at: http://wiki.freifunk.net/Niit
+(German)
+
+
+    5.) Smart gateways (asymmetric gateway tunnels)
+*******************************************************
+
+    5.1) Introduction
+
+The smart gateway mechanism was written by Markus Kittenberger and
+Henning Rogge to allow an OLSR user to directly choose their default
+Internet gateway instead of relying on the hop by hop decisions on
+the way to the gateway. OLSRd 0.6.0 can create an IPIP tunnel
+to the gateway's OLSRd address to side-step the same nasty effects
+described in the NAT-Threshold section.
+
+The smart gateway code can be split into two sections, one is
+responsible for announcing the existence of a smart gateway uplink
+and one (on the client nodes) to choose an uplink and create the
+tunnel to the gateway. The announcing code uses a modified (but
+backward compatible) special HNA to signal the gateways to the
+clients. The clients can use a plugin (or the integrated default
+code) to choose one of the available gateways and change it if
+necessary.
+
+The smart gateway system is setup by several configuration parameters,
+most of them with a sane default setting. The whole system can be
+switched on/off by the following parameter:
+
+SmartGateway <yes/no>
+
+All other parameters will be ignored if SmartGateway is set to "no"
+(the default is "no").
+
+
+    5.2) Client Side
+
+1- SmartGatewayAllowNAT controls whether you want to allow the selection
+   of an outgoing ipv4 gateway with NAT (Network Address Translation).
+   The default setting is "yes".
+2- SmartGatewayPeriod determines the period (in milliseconds) on which
+   a new smart gateway selection is performed.
+   The default setting is 10000 milliseconds.
+3- SmartGatewayStableCount determines the number of times the link state
+   database must be stable before a new smart gateway is selected.
+   The default setting is 6.
+4- SmartGatewayThreshold controls whether you want to allow re-selection
+   of a new outgoing gateway if its routing cost is lower or equal to the
+   configured percentage of the routing cost of the current gateway.
+   The default setting is 0, which disables it.
+5- SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
+   SmartGatewayWeightEtx and SmartGatewayDividerEtx control the weighing
+   of gateway bandwidth and ETX costs.
+
+   If SmartGatewayDividerEtx is zero then no weighing is performed (classical
+   behaviour). Classical behaviour only takes ETX costs into account when
+   choosing a gateway (select the 'nearest' gateway).
+
+   The weighing also takes the gateway bandwidths into account (select the
+   'nearest fat pipe' gateway).
+
+   Gateways that have zero bandwidth for either their uplink or downlink are
+   ignored.
+
+   * The Weighing Process
+   ======================
+
+     ** Configuration Parameters
+     ===========================
+     SmartGatewayWeightExitLinkUp   = gateway exit link uplink weight
+     SmartGatewayWeightExitLinkDown = gateway exit link downlink weight
+     SmartGatewayWeightEtx          = ETX path cost weight
+     SmartGatewayDividerEtx         = ETX path cost divider
+
+     ** Gateway Parameters
+     ===========================
+     gw->uplink   (Mbps)            = gateway exit link uplink  , in Mbps
+     gw->downlink (Mbps)            = gateway exit link downlink, in Mbps
+
+     ** Weighing Formula
+     ===================
+                          SmartGatewayWeightExitLinkUp
+     path_cost_weighed =  ---------------------------- +
+                                gw->uplink (Mbps)
+
+                          SmartGatewayWeightExitLinkDown
+                          ------------------------------ +
+                                gw->downlink (Mbps)
+
+                           SmartGatewayWeightEtx
+                          ---------------------- * path_cost
+                          SmartGatewayDividerEtx
+
+     ** Recommended Configuration Parameter Settings
+     ===============================================
+     SmartGatewayWeightExitLinkUp   = 1 (default is 1)
+     SmartGatewayWeightExitLinkDown = 1 (default is 1)
+     SmartGatewayWeightEtx          = 1 (default is 1)
+     SmartGatewayDividerEtx         = 4 (default is 0)
+
+
+    5.3) Uplink Side
+
+1- SmartGatewayUplink defines which kind of uplink is exported to the
+   other mesh nodes. The existence of the uplink is detected by looking
+   for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. The default
+   setting is "both".
+2- SmartGatewayUplinkNAT defines if the ipv4 part of the uplink uses NAT.
+   The default of this setting is "yes".
+3- SmartGatewaySpeed sets the uplink and downlink speed of the gateway,
+   which could be used by a plugin to choose the right gateway for a
+   client. The default is 128/1024 kbit/s.
+4- SmartGatewayPrefix can be used to signal the external IPv6 prefix of
+   the uplink to the clients. This might allow a client to change it's
+   local IPv6 address to use the IPv6 gateway without any kind of address
+   translation. The maximum prefix length is 64 bits,
+   the default is ::/0 (no prefix).
+
+
+    5.4) Architecture & Notes
+
+On the smart gateway server (the OLSR instance announcing 'Internet here!' via
+HNA 0/0 or similar) the implicit tunl0 interface is used to forward incoming
+packets originating on smart gateway clients to the Internet route. This may be
+protected by the sysctl rp_filter setting. Note, that at least with RedHat
+kernel 2.6.18, the net.ipv4.conf.tunl0.rp_filter sysctl file is not present
+after loading the "ipip" kernel module, which prevents OLSRd from switching off
+the filter. As a workaround, add an "ip addr add 0.0.0.0/32 dev tunl0" after
+the "modprobe ipip" line in your OLSRd startup script.
+
+While the smart gateway function does a fine job on stand-alone PCs, system
+builders should keep in mind the following facts when setting up routing,
+firewalls and gateways:
+
+a) The smart gateway tunnel communicates asymmetrically. An IP packet destined
+   for an Internet server is sent via the IPIP tunnel but returned via the
+   standard OLSRd host route.
+
+b) On the smart gateway server, you should double check your firewall rules and
+   rp_filter defaults. While it's normally not possible to simply encapsulate
+   (for example) a "telnet 127.0.0.1" into IPIP and sent that to the smart
+   gateway server, your specific configuration may open up such attack vectors
+   for an intruder.
+
+c) Do not forget to open up the firewall for tunl0->Internet traffic and (if
+   required to NAT/MASQUERADE) this communication path.
+
+d) While the smart gateway server does not use special routing, the smart
+   gateway client inserts policy routing rules for it's function. By using the
+   default configuration, the OLSRd standard default route is maintained in
+   table 223 and the OLSRd smart gateway default route in table 224. Both
+   tables are examined only, if you do not have a default route in the main
+   table (visible with "ip route ls"). Use "ip route ls table 223" or
+   "ip route ls table 224" for debugging/monitoring. You may also activate the
+   txtinfo plugin and do a "wget -O - http://localhost:2006/gateway".
+
+e) For a standalone client (a notebook user running OLSRd in order to browse)
+   the lowered IPIP tunnel MTU is no problem. If you do proxy routing, e.g. for
+   attached LAN clients without OLSRd, you may want MSS-clamping for the tunnel
+   interface created by OLSRd. Because OLSRd uses an arbitrary name for the
+   tunnel interface (e.g. tnl_7c41c668) you may want to include a wildcard
+   iptables rule. Example:
+     iptables -A FORWARD -o tnl_+ -p tcp --tcp-flags SYN,RST SYN \
+              -j TCPMSS --clamp-mss-to-pmtu
+
+Furthermore (or alternatively) you might consider (on your gateway nodes)
+clamping all traffic leaving your mesh to your ipip mtu (regardless if the
+traffic comes out of the smart gateway tunnel or not!). Example:
+  iptables -A FORWARD -o [your_gateway_interface] -p tcp \
+           --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1480
+
+Especially as during OLSRd startup, before an smart gateway is chosen (which is
+delayed), new connections would use a larger MSS than the smart gateway tunnel
+can handle. So the approach to clamp on the gateways should give better results.
+
+But if you don't NAT on your gateways (but want to use smart gateway for some
+special reason), you would have to do this on ALL gateways (even on gateways
+that do not provide the smart gateway functionality!).
+
+
+    6.) NatThreshold
+************************
+
+The NatThreshold option was introduced by Sven Ola to suppress a very annoying
+problem with OLSRd, switching default gateways. If a router is located between
+two Internet gateways with similar path costs the default route (0.0.0.0/0)
+will constantly switch between the two gateways due to normal fluctuations of
+the link metrics. Whenever OLSRd decides that the other NAT gateway is
+"better", then switching to this new gateway will result in termination of all
+connected sessions (TCP and HTTP).
+The user experience will be rather painful and users will experience hanging
+SSH and HTTP sessions (or anything using TCP).
+
+NatThreshold tries to help by introducing a hysteresis factor for
+choosing the route to the default gateway. Only if the new gateway has
+a lower cost than the current gateways path cost multiplied by
+NatThreshold the node will switch the gateway.
+In short:
+
+  if (cost(new_gateway) < cost(current_gw)*NatThreshold)) {
+       switch_gateway();
+  }
+
+
+Practical experience shows that this leads to much better quality of default
+gateway selection, even if (in theory) a small NatThreshold together with
+Fisheye can lead to  persistent routing loops.
+Please note that even with NatThreshold enabled, some users will still
+experience gateway switching. However, most users will not.
+
+Smart Gateways can replace NatThreshold all together because they allow sending
+traffic directly to a gateway circumventing the problems described above which
+stem from a hop-by-hop routing approach
+
+
+
+     7.) References
+************************
+[0] MIC Metric: "Designing Routing Metrics for Mesh Networks",
+       Yaling Yang, Jun Wang, Robin Kravets
+       http://www.cs.ucdavis.edu/~prasant/WIMESH/p6.pdf
+
+[1] "Making link-state routing scale for ad hoc networks",
+       Cesar A. Santivanez, Ram Ramanathan, Ioannis Stavrakakis
+       http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.5940
diff --git a/README-acl b/README-acl
deleted file mode 100644 (file)
index f38131f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-   Using access control lists in OLSRd
-=========================================
-
-Several plugins in OLSRd allow you to limit the access to
-their server functions by IP. This file will explain how to
-use the ACL features.
-The access is controlled by two lists of ip
-addresses and ip networks, a blacklist (reject list) and
-a whitelist (accept list). Two binary flags control which
-list is to be used first and what should be the default
-reaction to an unknown IP.
-
-The parameter "accept" contains an IP address or network
-which is allowed to access the service, the parameter "reject"
-contains a IP/network which is NOT allow to access it.
-
-The parameter "checkfirst" tells the service which of the
-two lists have to be checked first.
-The default setting is "reject".
-
-The last parameter "defaultpolicy" controls what the server
-should do with IPs which are not found in BOTH lists.
-The default setting is "reject".
-
-
-   Examples for ACL usage
-============================
-
-Examples for parameters accept/reject:
-PlParam   "accept"   "10.0.0.0/8" 
-PlParam   "reject"   "10.0.0.1" 
-PlParam   "accept"   "10.0.0.0 255.0.0.0" 
-
-Examples for parameters for binary flags
-PlParam   "checkfirst"      "reject"
-PlParam   "defaultpolicy"   "accept"
-
-
-   Legacy parameters
-=======================
-The old parameters "host", "host4", "host6", "net", "net4"
-and "net6" are just alias names for "accept".
diff --git a/README-callbacks b/README-callbacks
deleted file mode 100644 (file)
index 849b65a..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-
-   Using the callback API in OLSR
-=========================================
-by Aaron Kaplan (aaron@lo-res.org)
-
-Since early 2011, OLSR has an internal callback API.  The idea behind it is,
-that plugins and other parts of the code can inform each other about changes to
-internal database structures.  For this purpose, the callback API offers
-listeners/consumers datastructres which can trigger callbacks in the case of
-changes to internal datastructures.
-
-Such an event can either be:
-  * addition (for example of objects to the routing DB)
-  * deletion 
-  * change
-
-The callback API knows "providers" and "consumers" and objects.  A provider is
-a datastructure which can call callback functions for events for objects.  A
-consumer is a datastructure which specifies who will consume the callback for
-an event of an object.
-
-Objects (such as routing DB entries)  are identified  by a unique name (that
-is, a unique key in the form of a char*).
-
-
-Example usage
-==============
-
-In src/nhdp.{c,h} we want to trigger "add" events when a link changes.  First
-of all in nhdp.c we define the key (unique name) for the object:
-
-   const char *CB_NHDP_LINK = "nhdp link";
-
-
-Next, let's take a look at the init function:
-
-nhdp_link_init(void) {
-  /* (...) */
-
-  /* initialize callback provider */
-  if (olsr_callback_prv_create(&nhdp_link_callback, CB_NHDP_LINK)) {
-       /* callback providers for internal databases are mandatory */
-       OLSR_ERROR(LOG_NHDP, "Callback provider for NHDP link database is
-mandatory\n"); 
-    olsr_exit(1); 
-  } 
-}
-
-Here, we initialize the callback provider. Please note, that the CB_NHDP_LINK
-key is passed as second parameter.
-
-
-
-This code fragment shows how to destroy a callback provider:
-
-void nhdp_link_cleanup(void) {
-  olsr_callback_prv_destroy(&nhdp_link_callback);
-  /* (...) */
-}
-
-
-
-And finally, this code shows how consumers get informed of the deletion of an
-object (an nhdp link in this case, a similar case would be for an addition of
-an object):
-
-/**
- * Delete a NHDP link
- * @param link nhdp link pointer
- */
-void
-nhdp_delete_link(struct nhdp_link *link) {
-
-
-  /* (...) */
-
-  /* inform everyone that object will be removed */
-  olsr_callback_remove_object(&nhdp_link_callback, link);
-
-  /* (...) */
-}
-
-
-
-
-
diff --git a/README-http-txt-services b/README-http-txt-services
deleted file mode 100644 (file)
index d88a02e..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-   HTTP/Telnet services in olsrd
-===================================
-
-Olsrd contains an integrated telnet and http server core, which is
-used by plugins and the core to provide easy access the html pages
-and text commands.
-
-
-   HTTP services
--------------------
-
-The http server core supports both GET and POST parameter processing,
-allows the plugin/provider to set up a ACL and provides http basic
-password authentification (should be used together with an https proxy
-for security).
-
-Plugins use the function olsr_com_add_htmlsite() to set up a static
-webpage for a filename or a whole path, the function
-olsr_com_add_htmlhandler() can be used to set up a callback for dynamic
-webpage generation.
-
-olsr_com_set_htmlsite_acl_auth() can be used on the returned
-olsr_html_site pointer from one of the "add" functions to set up an
-ip ACL and/or a list of username/passwords. The username/password
-strings must be base64 encoded as defined in the http basic
-authentification standard.
-(see  http://en.wikipedia.org/wiki/Basic_access_authentication )
-
-
-   Telnet services
----------------------
-
-The telnet server implements a simple text interface to the olsr core,
-which can be equipped with any number of commands.
-
-The first way to use a telnet command is to enter the commands name,
-followed by it's parameters (similar to a normal console). After the
-command is finished, a new prompt will be displayed and you can
-enter another command.
-
-The second way is to prefix a command with a '/' character. No parameters
-can be used in this mode, but multiple commands can be concatenated in
-a single line. After the last command finished the telnet server will
-hang up. This mode emulates the commands of the old txtinfo plugin.
-
-Some commands will not stop after a predefined output but will continue
-to output data to the console. They can be stopped by sending a single
-character to the telnet server.
-
-The server will hang up the connection if no input/output happens for
-a certain period of time (default 120 seconds).
-
-
-   Builtin telnet commands
------------------------------
-
-"quit" or "exit":
-  Ends the telnet session and hangup the connection.
-
-"help":
-  Displays a list of available commands.
-
-"help <commandname>":
-  Displays a help text for a certain command (if available).
-
-"csv":
-  Activates the csv (comma separated value) output mode. All
-  commands capable to use this flag will switch to a CSV output
-  format.
-
-"csvoff"
-  Deactivates the csv output mode.
-
-"timeout <seconds>":
-  Sets the telnet session timeout to a new value. A parameter
-  of '0' will deactivate the timeout.
-
-"version"
-  Displays a version string of the olsrd.
-
-"repeat <seconds> <command and parameters>":
-  Calls another internal command every few seconds. Of course
-  the other command must not be one with continous output
-  itself.
-  
\ No newline at end of file
diff --git a/README-logging b/README-logging
deleted file mode 100644 (file)
index bb459e4..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-==============================================
-           Logging in OLSRd 0.5.7
-==============================================
-by Henning Rogge (hrogge@googlemail.com)
-
-
-OLSRd versions up to 0.5.6 had a strange mix of syslog, printf and OLSR_PRINT
-macro to create logging entries. Some events were send to multiple logging
-targets (syslog and OLSR_PRINTF for example), other were just put into one
-category.
-
-In addition to this the OLSR_PRINTF debug level tried to put all
-logging events into a linear sorted priority list. Most times a logging level
-was creating to many or not enough logging output, frustrating everyone
-while debugging a problem.
-
-Finally there were a group of compiler directives to control the amount of
-debugging code compiled into the routing agent, which is important for
-embedded hardware distributions (less binary size). There were three macros
-called DEBUG, NODEBUG and NO_DEBUG_MESSAGES and it wasn't clear which macro
-was responsible for a certain job.
-
-The OLSRd 0.5.7 contains a new logging API that allows much more flexibility
-for logging events. It cleans up the debug-macros grown during the last years,
-adds a more flexible filter system for logging events from the command line
-and allows the user control the target of the logging events. Every logging
-event can contain the filename/linenumber where the event happened to speedup
-bug hunting.
-
-The new logging system has three new concepts, log severity, log source and
-log target.
-
-  !!! Each logging message has ONE severity and ONE source !!!
-
-Log severity means the importance of a logging event. There are four severity
-levels:
-
-- ERROR, something really bad has happened, the OLSRd routing agent will shut
-  down after this message.
-- WARN, an error has happened but the agent will continue to run.
-- INFO contains important information for the user, like state of a database
-  (link, tc, ...)
-- DEBUG has lot's of detailed information for debugging, much of them are
-  useless without looking at the specific source code.
-
-Log sources are logical parts of the routing agent like NETWORKING, PLUGINS,
-and LINKS. You can get a list of all log sources by using the command line
-option "--help=log".
-
-Log targets are the different 'backends' for logging events. At the moment
-the OLSRd supports three different targets, which can be used individually
-or together:
-
-- STDERR prints all logging events to the console
-- FILE stores them into an user defined file
-- SYSLOG puts them into the syslog
-
-
-
-
-    Logging for users
-------------------------- 
-
-The logging system is controlled by a number of command line/config file options.
-
-log_debug=<source-list>
-log_info=<source-list>
-log_warn=<source-list>
-log_error=<source-list>
-
-  These four options control which log SOURCES are visible down to a certain
-  severity level. The parameter is a comma separated list of log sources. If you
-  set a source for a lower severity level (--log_info=links  for example) and do
-  NOT set the higher severity level (warn for example) the sources are copied
-  there too.
-
-log_debug=<debug_level>
-
-  This is a simple way to define a few default logging options. It's additional
-  purpose is to provide limited backward compatiblity to the old debugging
-  level option of 0.5.6.
-  
-    debug level -2: no debug output.
-    debug level -1: only ERROR messages.
-    debug level  0: only ERROR and WARNING messages.
-    debug level  1: all ERRORs, all WARNINGs and INFO messages for
-                  MAIN, PLUGINS, ROUTING, LINKS, NEIGHTABLE, 2NEIGH and TC.
-    debug level  2: all ERRORs, WARNINGs and INFOs.
-    debug level  3: all debug messages
-
-  If no debug severity is set (log_debug/info/warn/error) and no debug level is
-  set (log_debug) the routing agent falls back to it's default "log_debug=0".
-
-log_syslog
-log_stderr
-log_file=<filename>
-
-  These three options activate a certain log TARGET. Each log target can be used
-  once. If not set the routing agent falls back to the default "log_stderr".
-
-
-
-
-    Logging for OLSRd developers
-------------------------------------
-
-To use the new logging API you have to include the file "olsr_logging.h".
-
-There are eight macros to create a logging event, two for each severity level.
-
-OLSR_DEBUG(source, format, args...)
-OLSR_INFO(source, format, args...)
-OLSR_WARN(source, format, args...)
-OLSR_ERROR(source, format, args...)
-
-These four macros work like a printf() command with an additional log SOURCE
-as the first parameter. The source must be a member of the enum log_source
-(see src/olsr_cfg_data.h). The source LOG_ALL can NOT be used for the macros,
-it's just for the configuration parser !
-
-OLSR_DEBUG_NH(source, format, args...)
-OLSR_INFO_NH(source, format, args...)
-OLSR_WARN_NH(source, format, args...)
-OLSR_ERROR_NH(source, format, args...)
-
-These macros work like the other ones, but don't produce a header with filename,
-line number, timestamp, ... (NH = no header)
-You should use them to create multiline logging events (first one macro of the
-first group of macros, then multiple of this group)
-
-example:
-
-OLSR_INFO(LOG_MAIN, "This is the first line of a macro");
-OLSR_INFO_NH(LOG_MAIN, "and this is the second time...");
-
-
-
-
-    Logging for firmware developers
----------------------------------------
-
-There are five compiler defines in Makefile.inc that can be used to control
-the size of the binary of Olsrd.
-
-DEBUG = 0/1
-
-Set DEBUG to 1 to add debugger symbols to olsrd.
-Set DEBUG to 0 to remove debugger symbols and optimize olsrd for size.
-
-REMOVE_LOG_DEBUG = 0/1
-REMOVE_LOG_INFO = 0/1
-REMOVE_LOG_WARN = 0/1
-REMOVE_LOG_ERROR = 0/1
-
-Set one of this four defines to 1 to remove all code for creating logging
-events of this severity level.
-
-A good way to create a compact OLSRd for small embedded devices would be:
-
-  DEBUG = 0
-  REMOVE_LOG_DEBUG = 1
-  REMOVE_LOG_INFO = 1
diff --git a/TODO-0.7.0.txt b/TODO-0.7.0.txt
deleted file mode 100644 (file)
index 0d14902..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-- rewrite httpinfo server
-- documentation for txtinfo
-- strict parser validation flag Makefile ?
-- remove debug code from html-server
-- use olsr_ip_acl für net_olsr (remove filter-tree) ?
-- remove fib_metric ?
-- make fib_metric (default 2) configurable ?
-- multi-arch port port of linuk kernel route handling
-- make route installs asynchronous of SPF
-- read routes before attempting a write
-- check which 0.5.6 patches are missing
diff --git a/android/README b/android/README
new file mode 100644 (file)
index 0000000..9f36257
--- /dev/null
@@ -0,0 +1,32 @@
+
+This directory contains some Android specific code. (Mostly dealing
+with providing missing filesfrom Android NDK.)
+
+ * regex support was not added until NDK platform android-8 (v2.2)
+
+
+Building olsrd for Android
+--------------------------
+
+In order to build olsrd and the plugins for Android, you will need to
+download the free (as in beer, and mostly as in speech) Android NDK
+(the pud plugin requires NDK r8, everything else you can build with r6
+or maybe earlier):
+
+http://developer.android.com/sdk/ndk/index.html
+
+Once you have that installed, run this in your terminal:
+
+  make OS=android NDK_BASE=/path/to/your/android-ndk-r8 build_all
+
+Then you can find olsrd in the root, and the plugin files in lib/*/*.so*
+
+
+Android App
+-----------
+
+As part of the Commotion project, there is an Android app being
+developed to make it easy to install and run OLSR mesh networking on
+Android devices.  This app is called Commotion Mesh Tether:
+
+https://code.commotionwireless.net/projects/commotion-android
diff --git a/android/arch/syslimits.h b/android/arch/syslimits.h
new file mode 100644 (file)
index 0000000..3465f5a
--- /dev/null
@@ -0,0 +1 @@
+// A dummy file so that compiling for Android does not throw an error.
diff --git a/android/linux/if_tunnel.h b/android/linux/if_tunnel.h
new file mode 100644 (file)
index 0000000..16b92d0
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef _IF_TUNNEL_H_
+#define _IF_TUNNEL_H_
+
+#include <linux/types.h>
+#include <asm/byteorder.h>
+
+#ifdef __KERNEL__
+#include <linux/ip.h>
+#include <linux/in6.h>
+#endif
+
+#define SIOCGETTUNNEL   (SIOCDEVPRIVATE + 0)
+#define SIOCADDTUNNEL   (SIOCDEVPRIVATE + 1)
+#define SIOCDELTUNNEL   (SIOCDEVPRIVATE + 2)
+#define SIOCCHGTUNNEL   (SIOCDEVPRIVATE + 3)
+#define SIOCGETPRL      (SIOCDEVPRIVATE + 4)
+#define SIOCADDPRL      (SIOCDEVPRIVATE + 5)
+#define SIOCDELPRL      (SIOCDEVPRIVATE + 6)
+#define SIOCCHGPRL      (SIOCDEVPRIVATE + 7)
+#define SIOCGET6RD      (SIOCDEVPRIVATE + 8)
+#define SIOCADD6RD      (SIOCDEVPRIVATE + 9)
+#define SIOCDEL6RD      (SIOCDEVPRIVATE + 10)
+#define SIOCCHG6RD      (SIOCDEVPRIVATE + 11)
+
+#define GRE_CSUM       __cpu_to_be16(0x8000)
+#define GRE_ROUTING    __cpu_to_be16(0x4000)
+#define GRE_KEY                __cpu_to_be16(0x2000)
+#define GRE_SEQ                __cpu_to_be16(0x1000)
+#define GRE_STRICT     __cpu_to_be16(0x0800)
+#define GRE_REC                __cpu_to_be16(0x0700)
+#define GRE_FLAGS      __cpu_to_be16(0x00F8)
+#define GRE_VERSION    __cpu_to_be16(0x0007)
+
+struct ip_tunnel_parm {
+       char                    name[IFNAMSIZ];
+       int                     link;
+       __be16                  i_flags;
+       __be16                  o_flags;
+       __be32                  i_key;
+       __be32                  o_key;
+       struct iphdr            iph;
+};
+
+/* SIT-mode i_flags */
+#define        SIT_ISATAP      0x0001
+
+struct ip_tunnel_prl {
+       __be32                  addr;
+       __u16                   flags;
+       __u16                   __reserved;
+       __u32                   datalen;
+       __u32                   __reserved2;
+       /* data follows */
+};
+
+/* PRL flags */
+#define        PRL_DEFAULT             0x0001
+
+struct ip_tunnel_6rd {
+       struct in6_addr         prefix;
+       __be32                  relay_prefix;
+       __u16                   prefixlen;
+       __u16                   relay_prefixlen;
+};
+
+enum {
+       IFLA_GRE_UNSPEC,
+       IFLA_GRE_LINK,
+       IFLA_GRE_IFLAGS,
+       IFLA_GRE_OFLAGS,
+       IFLA_GRE_IKEY,
+       IFLA_GRE_OKEY,
+       IFLA_GRE_LOCAL,
+       IFLA_GRE_REMOTE,
+       IFLA_GRE_TTL,
+       IFLA_GRE_TOS,
+       IFLA_GRE_PMTUDISC,
+       __IFLA_GRE_MAX,
+};
+
+#define IFLA_GRE_MAX   (__IFLA_GRE_MAX - 1)
+
+#endif /* _IF_TUNNEL_H_ */
diff --git a/android/linux/ip6_tunnel.h b/android/linux/ip6_tunnel.h
new file mode 100644 (file)
index 0000000..acb9ad6
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef _IP6_TUNNEL_H
+#define _IP6_TUNNEL_H
+
+#include <linux/types.h>
+
+#define IPV6_TLV_TNL_ENCAP_LIMIT 4
+#define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4
+
+/* don't add encapsulation limit if one isn't present in inner packet */
+#define IP6_TNL_F_IGN_ENCAP_LIMIT 0x1
+/* copy the traffic class field from the inner packet */
+#define IP6_TNL_F_USE_ORIG_TCLASS 0x2
+/* copy the flowlabel from the inner packet */
+#define IP6_TNL_F_USE_ORIG_FLOWLABEL 0x4
+/* being used for Mobile IPv6 */
+#define IP6_TNL_F_MIP6_DEV 0x8
+/* copy DSCP from the outer packet */
+#define IP6_TNL_F_RCV_DSCP_COPY 0x10
+
+struct ip6_tnl_parm {
+       char name[IFNAMSIZ];    /* name of tunnel device */
+       int link;               /* ifindex of underlying L2 interface */
+       __u8 proto;             /* tunnel protocol */
+       __u8 encap_limit;       /* encapsulation limit for tunnel */
+       __u8 hop_limit;         /* hop limit for tunnel */
+       __be32 flowinfo;        /* traffic class and flowlabel for tunnel */
+       __u32 flags;            /* tunnel flags */
+       struct in6_addr laddr;  /* local tunnel end-point address */
+       struct in6_addr raddr;  /* remote tunnel end-point address */
+};
+
+#endif
diff --git a/android/regex.h b/android/regex.h
new file mode 100644 (file)
index 0000000..aec38e3
--- /dev/null
@@ -0,0 +1,105 @@
+/*     $OpenBSD: regex.h,v 1.6 2003/06/02 19:34:12 millert Exp $       */
+/*     $NetBSD: regex.h,v 1.4.6.1 1996/06/10 18:57:07 explorer Exp $   */
+
+/*-
+ * Copyright (c) 1992 Henry Spencer.
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer of the University of Toronto.
+ *
+ * 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.
+ *
+ *     @(#)regex.h     8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _REGEX_H_
+#define        _REGEX_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+/* types */
+typedef off_t regoff_t;
+
+typedef struct {
+       int re_magic;
+       size_t re_nsub;         /* number of parenthesized subexpressions */
+       const char *re_endp;    /* end pointer for REG_PEND */
+       struct re_guts *re_g;   /* none of your business :-) */
+} regex_t;
+
+typedef struct {
+       regoff_t rm_so;         /* start of match */
+       regoff_t rm_eo;         /* end of match */
+} regmatch_t;
+
+/* regcomp() flags */
+#define        REG_BASIC       0000
+#define        REG_EXTENDED    0001
+#define        REG_ICASE       0002
+#define        REG_NOSUB       0004
+#define        REG_NEWLINE     0010
+#define        REG_NOSPEC      0020
+#define        REG_PEND        0040
+#define        REG_DUMP        0200
+
+/* regerror() flags */
+#define        REG_NOMATCH      1
+#define        REG_BADPAT       2
+#define        REG_ECOLLATE     3
+#define        REG_ECTYPE       4
+#define        REG_EESCAPE      5
+#define        REG_ESUBREG      6
+#define        REG_EBRACK       7
+#define        REG_EPAREN       8
+#define        REG_EBRACE       9
+#define        REG_BADBR       10
+#define        REG_ERANGE      11
+#define        REG_ESPACE      12
+#define        REG_BADRPT      13
+#define        REG_EMPTY       14
+#define        REG_ASSERT      15
+#define        REG_INVARG      16
+#define        REG_ATOI        255     /* convert name to number (!) */
+#define        REG_ITOA        0400    /* convert number to name (!) */
+
+/* regexec() flags */
+#define        REG_NOTBOL      00001
+#define        REG_NOTEOL      00002
+#define        REG_STARTEND    00004
+#define        REG_TRACE       00400   /* tracing of execution */
+#define        REG_LARGE       01000   /* force large representation */
+#define        REG_BACKR       02000   /* force use of backref code */
+
+__BEGIN_DECLS
+int    regcomp(regex_t *, const char *, int);
+size_t regerror(int, const regex_t *, char *, size_t);
+int    regexec(const regex_t *, const char *, size_t, regmatch_t [], int);
+void   regfree(regex_t *);
+__END_DECLS
+
+#endif /* !_REGEX_H_ */
diff --git a/android/regex/COPYRIGHT b/android/regex/COPYRIGHT
new file mode 100644 (file)
index 0000000..a6392fd
--- /dev/null
@@ -0,0 +1,54 @@
+$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $
+
+Copyright 1992, 1993, 1994 Henry Spencer.  All rights reserved.
+This software is not subject to any license of the American Telephone
+and Telegraph Company or of the Regents of the University of California.
+
+Permission is granted to anyone to use this software for any purpose on
+any computer system, and to alter it and redistribute it, subject
+to the following restrictions:
+
+1. The author is not responsible for the consequences of use of this
+   software, no matter how awful, even if they arise from flaws in it.
+
+2. The origin of this software must not be misrepresented, either by
+   explicit claim or by omission.  Since few users ever read sources,
+   credits must appear in the documentation.
+
+3. Altered versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.  Since few users
+   ever read sources, credits must appear in the documentation.
+
+4. This notice may not be removed or altered.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+/*-
+ * Copyright (c) 1994
+ *     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.
+ *
+ *     @(#)COPYRIGHT   8.1 (Berkeley) 3/16/94
+ */
diff --git a/android/regex/NOTICE b/android/regex/NOTICE
new file mode 100644 (file)
index 0000000..d9e6818
--- /dev/null
@@ -0,0 +1,382 @@
+
+Copyright (c) 2005-2010, The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the name of The Android Open Source Project 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 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.
+
+
+Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+Copyright (c) 1995,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 ISC DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC 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) 1995 by International Business Machines, Inc.
+
+International Business Machines, Inc. (hereinafter called IBM) grants
+permission under its copyrights to use, copy, modify, and distribute this
+Software with or without fee, provided that the above copyright notice and
+all paragraphs of this notice appear in all copies, and that the name of IBM
+not be used in connection with the marketing of any product incorporating
+the Software or modifications thereof, without specific, written prior
+permission.
+
+To the extent it has a right to do so, IBM grants an immunity from suit
+under its patents, if any, for the use, sale or manufacture of products to
+the extent that such products are used for performing Domain Name System
+dynamic updates in TCP/IP networks by means of the Software.  No immunity is
+granted for any product per se or for any other function of any product.
+
+THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
+DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
+OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
+IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Copyright (c) 1997, 1998, 1999, 2004 The NetBSD Foundation, Inc.
+All rights reserved.
+
+This code is derived from software contributed to The NetBSD Foundation
+by Luke Mewburn; and by Jason R. Thorpe.
+This code is derived from software contributed to The NetBSD Foundation
+by Christos Zoulas.
+
+Copyright (c) 1993 Christopher G. Demetriou
+Copyright (c) 1983, 1985, 1993 The Regents of the University of California.  All rights reserved.
+Copyright (c) 2000 Ben Harris.
+Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+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 project 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 PROJECT 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 PROJECT 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.
+
+Copyright (c) 2003 Networks Associates Technology, Inc.
+All rights reserved.
+
+Portions of this software were developed for the FreeBSD Project by
+Jacques A. Vidrine, Safeport Network Services, and Network
+Associates Laboratories, the Security Research Division of Network
+Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+("CBOSS"), as part of the DARPA CHATS research program.
+
+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 AUTHOR 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 AUTHOR 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.
+
+
+Copyright (c) 1997 Mark Brinicombe
+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. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+     This product includes software developed by Mark Brinicombe
+4. 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 AUTHOR 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 AUTHOR 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.
+
+
+Copyright (c) 1993 Martin Birgmeier
+All rights reserved.
+
+You may redistribute unmodified or modified versions of this source
+code provided that the above copyright notice and this and the
+following conditions are retained.
+
+This software is provided ``as is'', and comes with no warranties
+of any kind. I shall in no event be liable for anything that happens
+to anyone/anything when using this software.
+
+
+Arc4 random number generator for OpenBSD.
+Copyright 1996 David Mazieres <dm@lcs.mit.edu>.
+
+Modification and redistribution in source and binary forms is
+permitted provided that due credit is given to the author and the
+OpenBSD project by leaving this copyright notice intact.
+
+
+Copyright (c) 1999 Kungliga Tekniska Högskolan
+(Royal Institute of Technology, Stockholm, Sweden). 
+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 KTH 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 KTH AND ITS 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 KTH OR ITS 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. */
+
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+====================================================
+
+
+Copyright (c) 1997, 2005 Todd C. Miller <Todd.Miller@courtesan.com>
+
+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.
+
+
+Copyright (c) 1989, 1993
+     The Regents of the University of California.  All rights reserved.
+(c) UNIX System Laboratories, Inc.
+All or some portions of this file are derived from material licensed
+to the University of California by American Telephone and Telegraph
+Co. or Unix System Laboratories, Inc. and are reproduced herein with
+the permission of UNIX System Laboratories, Inc.
+
+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.
+
+
+Copyright (c) 1995, 1996 Carnegie-Mellon University.
+All rights reserved.
+
+Author: Chris G. Demetriou
+
+Permission to use, copy, modify and distribute this software and
+its documentation is hereby granted, provided that both the copyright
+notice and this permission notice appear in all copies of the
+software, derivative works or modified versions, and any portions
+thereof, and that both notices appear in supporting documentation.
+
+CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+
+Carnegie Mellon requests users of this software to return to
+
+ Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ School of Computer Science
+ Carnegie Mellon University
+ Pittsburgh PA 15213-3890
+
+any improvements or extensions that they make and grant Carnegie the
+rights to redistribute these changes.
+
+
+Copyright (c) 1995, 1996 Carnegie-Mellon University.
+All rights reserved.
+
+Author: Chris G. Demetriou
+
+Permission to use, copy, modify and distribute this software and
+its documentation is hereby granted, provided that both the copyright
+notice and this permission notice appear in all copies of the
+software, derivative works or modified versions, and any portions
+thereof, and that both notices appear in supporting documentation.
+
+CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+
+Carnegie Mellon requests users of this software to return to
+
+ Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ School of Computer Science
+ Carnegie Mellon University
+ Pittsburgh PA 15213-3890
+
+any improvements or extensions that they make and grant Carnegie the
+rights to redistribute these changes.
+
+
+Copyright (c) 2003 Networks Associates Technology, Inc.
+All rights reserved.
+
+Portions of this software were developed for the FreeBSD Project by
+Jacques A. Vidrine, Safeport Network Services, and Network
+Associates Laboratories, the Security Research Division of Network
+Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+("CBOSS"), as part of the DARPA CHATS research program.
+
+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 AUTHOR 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 AUTHOR 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.
+
+
diff --git a/android/regex/WHATSNEW b/android/regex/WHATSNEW
new file mode 100644 (file)
index 0000000..95a80ed
--- /dev/null
@@ -0,0 +1,95 @@
+#      $OpenBSD: WHATSNEW,v 1.3 1997/04/28 20:44:56 millert Exp $
+# @(#)WHATSNEW 8.3 (Berkeley) 3/18/94
+
+New in alpha3.4:  The complex bug alluded to below has been fixed (in a
+slightly kludgey temporary way that may hurt efficiency a bit; this is
+another "get it out the door for 4.4" release).  The tests at the end of
+the tests file have accordingly been uncommented.  The primary sign of
+the bug was that something like a?b matching ab matched b rather than ab.
+(The bug was essentially specific to this exact situation, else it would
+have shown up earlier.)
+
+New in alpha3.3:  The definition of word boundaries has been altered
+slightly, to more closely match the usual programming notion that "_"
+is an alphabetic.  Stuff used for pre-ANSI systems is now in a subdir,
+and the makefile no longer alludes to it in mysterious ways.  The
+makefile has generally been cleaned up some.  Fixes have been made
+(again!) so that the regression test will run without -DREDEBUG, at
+the cost of weaker checking.  A workaround for a bug in some folks'
+<assert.h> has been added.  And some more things have been added to
+tests, including a couple right at the end which are commented out
+because the code currently flunks them (complex bug; fix coming).
+Plus the usual minor cleanup.
+
+New in alpha3.2:  Assorted bits of cleanup and portability improvement
+(the development base is now a BSDI system using GCC instead of an ancient
+Sun system, and the newer compiler exposed some glitches).  Fix for a
+serious bug that affected REs using many [] (including REG_ICASE REs
+because of the way they are implemented), *sometimes*, depending on
+memory-allocation patterns.  The header-file prototypes no longer name
+the parameters, avoiding possible name conflicts.  The possibility that
+some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is
+now handled gracefully.  "uchar" is no longer used as an internal type
+name (too many people have the same idea).  Still the same old lousy
+performance, alas.
+
+New in alpha3.1:  Basically nothing, this release is just a bookkeeping
+convenience.  Stay tuned.
+
+New in alpha3.0:  Performance is no better, alas, but some fixes have been
+made and some functionality has been added.  (This is basically the "get
+it out the door in time for 4.4" release.)  One bug fix:  regfree() didn't
+free the main internal structure (how embarrassing).  It is now possible
+to put NULs in either the RE or the target string, using (resp.) a new
+REG_PEND flag and the old REG_STARTEND flag.  The REG_NOSPEC flag to
+regcomp() makes all characters ordinary, so you can match a literal
+string easily (this will become more useful when performance improves!).
+There are now primitives to match beginnings and ends of words, although
+the syntax is disgusting and so is the implementation.  The REG_ATOI
+debugging interface has changed a bit.  And there has been considerable
+internal cleanup of various kinds.
+
+New in alpha2.3:  Split change list out of README, and moved flags notes
+into Makefile.  Macro-ized the name of regex(7) in regex(3), since it has
+to change for 4.4BSD.  Cleanup work in engine.c, and some new regression
+tests to catch tricky cases thereof.
+
+New in alpha2.2:  Out-of-date manpages updated.  Regerror() acquires two
+small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges
+in my own test program and might be useful to others for similar purposes.
+The regression test will now compile (and run) without REDEBUG.  The
+BRE \$ bug is fixed.  Most uses of "uchar" are gone; it's all chars now.
+Char/uchar parameters are now written int/unsigned, to avoid possible
+portability problems with unpromoted parameters.  Some unsigned casts have
+been introduced to minimize portability problems with shifting into sign
+bits.
+
+New in alpha2.1:  Lots of little stuff, cleanup and fixes.  The one big
+thing is that regex.h is now generated, using mkh, rather than being
+supplied in the distribution; due to circularities in dependencies,
+you have to build regex.h explicitly by "make h".  The two known bugs
+have been fixed (and the regression test now checks for them), as has a
+problem with assertions not being suppressed in the absence of REDEBUG.
+No performance work yet.
+
+New in alpha2:  Backslash-anything is an ordinary character, not an
+error (except, of course, for the handful of backslashed metacharacters
+in BREs), which should reduce script breakage.  The regression test
+checks *where* null strings are supposed to match, and has generally
+been tightened up somewhat.  Small bug fixes in parameter passing (not
+harmful, but technically errors) and some other areas.  Debugging
+invoked by defining REDEBUG rather than not defining NDEBUG.
+
+New in alpha+3:  full prototyping for internal routines, using a little
+helper program, mkh, which extracts prototypes given in stylized comments.
+More minor cleanup.  Buglet fix:  it's CHAR_BIT, not CHAR_BITS.  Simple
+pre-screening of input when a literal string is known to be part of the
+RE; this does wonders for performance.
+
+New in alpha+2:  minor bits of cleanup.  Notably, the number "32" for the
+word width isn't hardwired into regexec.c any more, the public header
+file prototypes the functions if __STDC__ is defined, and some small typos
+in the manpages have been fixed.
+
+New in alpha+1:  improvements to the manual pages, and an important
+extension, the REG_STARTEND option to regexec().
diff --git a/android/regex/cclass.h b/android/regex/cclass.h
new file mode 100644 (file)
index 0000000..d105491
--- /dev/null
@@ -0,0 +1,68 @@
+/*     $OpenBSD: cclass.h,v 1.5 2003/06/02 20:18:36 millert Exp $      */
+
+/*-
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * 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.
+ *
+ *     @(#)cclass.h    8.3 (Berkeley) 3/20/94
+ */
+
+/* character-class table */
+static const struct cclass {
+       char *name;
+       char *chars;
+       char *multis;
+} cclasses[] = {
+       { "alnum",      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789",                           ""} ,
+       { "alpha",      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+                                       ""} ,
+       { "blank",      " \t",          ""} ,
+       { "cntrl",      "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
+\25\26\27\30\31\32\33\34\35\36\37\177",        ""} ,
+       { "digit",      "0123456789",   ""} ,
+       { "graph",      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+                                       ""} ,
+       { "lower",      "abcdefghijklmnopqrstuvwxyz",
+                                       ""} ,
+       { "print",      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
+                                       ""} ,
+       { "punct",      "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+                                       ""} ,
+       { "space",      "\t\n\v\f\r ",  ""} ,
+       { "upper",      "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+                                       ""} ,
+       { "xdigit",     "0123456789ABCDEFabcdef",
+                                       ""} ,
+       { NULL,         0,              "" }
+};
diff --git a/android/regex/cname.h b/android/regex/cname.h
new file mode 100644 (file)
index 0000000..b674b68
--- /dev/null
@@ -0,0 +1,139 @@
+/*     $OpenBSD: cname.h,v 1.5 2003/06/02 20:18:36 millert Exp $       */
+
+/*-
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * 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.
+ *
+ *     @(#)cname.h     8.3 (Berkeley) 3/20/94
+ */
+
+/* character-name table */
+static const struct cname {
+       char *name;
+       char code;
+} cnames[] = {
+       { "NUL",                        '\0' },
+       { "SOH",                        '\001' },
+       { "STX",                        '\002' },
+       { "ETX",                        '\003' },
+       { "EOT",                        '\004' },
+       { "ENQ",                        '\005' },
+       { "ACK",                        '\006' },
+       { "BEL",                        '\007' },
+       { "alert",                      '\007' },
+       { "BS",                         '\010' },
+       { "backspace",                  '\b' },
+       { "HT",                         '\011' },
+       { "tab",                        '\t' },
+       { "LF",                         '\012' },
+       { "newline",                    '\n' },
+       { "VT",                         '\013' },
+       { "vertical-tab",               '\v' },
+       { "FF",                         '\014' },
+       { "form-feed",                  '\f' },
+       { "CR",                         '\015' },
+       { "carriage-return",            '\r' },
+       { "SO",                         '\016' },
+       { "SI",                         '\017' },
+       { "DLE",                        '\020' },
+       { "DC1",                        '\021' },
+       { "DC2",                        '\022' },
+       { "DC3",                        '\023' },
+       { "DC4",                        '\024' },
+       { "NAK",                        '\025' },
+       { "SYN",                        '\026' },
+       { "ETB",                        '\027' },
+       { "CAN",                        '\030' },
+       { "EM",                         '\031' },
+       { "SUB",                        '\032' },
+       { "ESC",                        '\033' },
+       { "IS4",                        '\034' },
+       { "FS",                         '\034' },
+       { "IS3",                        '\035' },
+       { "GS",                         '\035' },
+       { "IS2",                        '\036' },
+       { "RS",                         '\036' },
+       { "IS1",                        '\037' },
+       { "US",                         '\037' },
+       { "space",                      ' ' },
+       { "exclamation-mark",           '!' },
+       { "quotation-mark",             '"' },
+       { "number-sign",                '#' },
+       { "dollar-sign",                '$' },
+       { "percent-sign",               '%' },
+       { "ampersand",                  '&' },
+       { "apostrophe",                 '\'' },
+       { "left-parenthesis",           '(' },
+       { "right-parenthesis",          ')' },
+       { "asterisk",                   '*' },
+       { "plus-sign",                  '+' },
+       { "comma",                      ',' },
+       { "hyphen",                     '-' },
+       { "hyphen-minus",               '-' },
+       { "period",                     '.' },
+       { "full-stop",                  '.' },
+       { "slash",                      '/' },
+       { "solidus",                    '/' },
+       { "zero",                       '0' },
+       { "one",                        '1' },
+       { "two",                        '2' },
+       { "three",                      '3' },
+       { "four",                       '4' },
+       { "five",                       '5' },
+       { "six",                        '6' },
+       { "seven",                      '7' },
+       { "eight",                      '8' },
+       { "nine",                       '9' },
+       { "colon",                      ':' },
+       { "semicolon",                  ';' },
+       { "less-than-sign",             '<' },
+       { "equals-sign",                '=' },
+       { "greater-than-sign",          '>' },
+       { "question-mark",              '?' },
+       { "commercial-at",              '@' },
+       { "left-square-bracket",        '[' },
+       { "backslash",                  '\\' },
+       { "reverse-solidus",            '\\' },
+       { "right-square-bracket",       ']' },
+       { "circumflex",                 '^' },
+       { "circumflex-accent",          '^' },
+       { "underscore",                 '_' },
+       { "low-line",                   '_' },
+       { "grave-accent",               '`' },
+       { "left-brace",                 '{' },
+       { "left-curly-bracket",         '{' },
+       { "vertical-line",              '|' },
+       { "right-brace",                '}' },
+       { "right-curly-bracket",        '}' },
+       { "tilde",                      '~' },
+       { "DEL",                        '\177' },
+       { NULL,                         0 }
+};
diff --git a/android/regex/engine.c b/android/regex/engine.c
new file mode 100644 (file)
index 0000000..eae6ff2
--- /dev/null
@@ -0,0 +1,1021 @@
+/*     $OpenBSD: engine.c,v 1.15 2005/08/05 13:03:00 espie Exp $       */
+
+/*-
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * 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.
+ *
+ *     @(#)engine.c    8.5 (Berkeley) 3/20/94
+ */
+
+/*
+ * The matching engine and friends.  This file is #included by regexec.c
+ * after suitable #defines of a variety of macros used herein, so that
+ * different state representations can be used without duplicating masses
+ * of code.
+ */
+
+#ifdef SNAMES
+#define        matcher smatcher
+#define        fast    sfast
+#define        slow    sslow
+#define        dissect sdissect
+#define        backref sbackref
+#define        step    sstep
+#define        print   sprint
+#define        at      sat
+#define        match   smat
+#define        nope    snope
+#endif
+#ifdef LNAMES
+#define        matcher lmatcher
+#define        fast    lfast
+#define        slow    lslow
+#define        dissect ldissect
+#define        backref lbackref
+#define        step    lstep
+#define        print   lprint
+#define        at      lat
+#define        match   lmat
+#define        nope    lnope
+#endif
+
+/* another structure passed up and down to avoid zillions of parameters */
+struct match {
+       struct re_guts *g;
+       int eflags;
+       regmatch_t *pmatch;     /* [nsub+1] (0 element unused) */
+       char *offp;             /* offsets work from here */
+       char *beginp;           /* start of string -- virtual NUL precedes */
+       char *endp;             /* end of string -- virtual NUL here */
+       char *coldp;            /* can be no match starting before here */
+       char **lastpos;         /* [nplus+1] */
+       STATEVARS;
+       states st;              /* current states */
+       states fresh;           /* states for a fresh start */
+       states tmp;             /* temporary */
+       states empty;           /* empty set of states */
+};
+
+static int matcher(struct re_guts *, char *, size_t, regmatch_t[], int);
+static char *dissect(struct match *, char *, char *, sopno, sopno);
+static char *backref(struct match *, char *, char *, sopno, sopno, sopno, int);
+static char *fast(struct match *, char *, char *, sopno, sopno);
+static char *slow(struct match *, char *, char *, sopno, sopno);
+static states step(struct re_guts *, sopno, sopno, states, int, states);
+#define MAX_RECURSION  100
+#define        BOL     (OUT+1)
+#define        EOL     (BOL+1)
+#define        BOLEOL  (BOL+2)
+#define        NOTHING (BOL+3)
+#define        BOW     (BOL+4)
+#define        EOW     (BOL+5)
+#define        CODEMAX (BOL+5)         /* highest code used */
+#define        NONCHAR(c)      ((c) > CHAR_MAX)
+#define        NNONCHAR        (CODEMAX-CHAR_MAX)
+#ifdef REDEBUG
+static void print(struct match *, char *, states, int, FILE *);
+#endif
+#ifdef REDEBUG
+static void at(struct match *, char *, char *, char *, sopno, sopno);
+#endif
+#ifdef REDEBUG
+static char *pchar(int);
+#endif
+
+#ifdef REDEBUG
+#define        SP(t, s, c)     print(m, t, s, c, stdout)
+#define        AT(t, p1, p2, s1, s2)   at(m, t, p1, p2, s1, s2)
+#define        NOTE(str)       { if (m->eflags&REG_TRACE) (void)printf("=%s\n", (str)); }
+static int nope = 0;
+#else
+#define        SP(t, s, c)     /* nothing */
+#define        AT(t, p1, p2, s1, s2)   /* nothing */
+#define        NOTE(s) /* nothing */
+#endif
+
+/*
+ - matcher - the actual matching engine
+ */
+static int                     /* 0 success, REG_NOMATCH failure */
+matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
+    int eflags)
+{
+       char *endp;
+       int i;
+       struct match mv;
+       struct match *m = &mv;
+       char *dp;
+       const sopno gf = g->firststate+1;       /* +1 for OEND */
+       const sopno gl = g->laststate;
+       char *start;
+       char *stop;
+
+       /* simplify the situation where possible */
+       if (g->cflags&REG_NOSUB)
+               nmatch = 0;
+       if (eflags&REG_STARTEND) {
+               start = string + pmatch[0].rm_so;
+               stop = string + pmatch[0].rm_eo;
+       } else {
+               start = string;
+               stop = start + strlen(start);
+       }
+       if (stop < start)
+               return(REG_INVARG);
+
+       /* prescreening; this does wonders for this rather slow code */
+       if (g->must != NULL) {
+               for (dp = start; dp < stop; dp++)
+                       if (*dp == g->must[0] && stop - dp >= g->mlen &&
+                               memcmp(dp, g->must, (size_t)g->mlen) == 0)
+                               break;
+               if (dp == stop)         /* we didn't find g->must */
+                       return(REG_NOMATCH);
+       }
+
+       /* match struct setup */
+       m->g = g;
+       m->eflags = eflags;
+       m->pmatch = NULL;
+       m->lastpos = NULL;
+       m->offp = string;
+       m->beginp = start;
+       m->endp = stop;
+       STATESETUP(m, 4);
+       SETUP(m->st);
+       SETUP(m->fresh);
+       SETUP(m->tmp);
+       SETUP(m->empty);
+       CLEAR(m->empty);
+
+       /* this loop does only one repetition except for backrefs */
+       for (;;) {
+               endp = fast(m, start, stop, gf, gl);
+               if (endp == NULL) {             /* a miss */
+                       free(m->pmatch);
+                       free(m->lastpos);
+                       STATETEARDOWN(m);
+                       return(REG_NOMATCH);
+               }
+               if (nmatch == 0 && !g->backrefs)
+                       break;          /* no further info needed */
+
+               /* where? */
+               assert(m->coldp != NULL);
+               for (;;) {
+                       NOTE("finding start");
+                       endp = slow(m, m->coldp, stop, gf, gl);
+                       if (endp != NULL)
+                               break;
+                       assert(m->coldp < m->endp);
+                       m->coldp++;
+               }
+               if (nmatch == 1 && !g->backrefs)
+                       break;          /* no further info needed */
+
+               /* oh my, he wants the subexpressions... */
+               if (m->pmatch == NULL)
+                       m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) *
+                                                       sizeof(regmatch_t));
+               if (m->pmatch == NULL) {
+                       STATETEARDOWN(m);
+                       return(REG_ESPACE);
+               }
+               for (i = 1; i <= (int)m->g->nsub; i++)
+                       m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
+               if (!g->backrefs && !(m->eflags&REG_BACKR)) {
+                       NOTE("dissecting");
+                       dp = dissect(m, m->coldp, endp, gf, gl);
+               } else {
+                       if (g->nplus > 0 && m->lastpos == NULL)
+                               m->lastpos = (char **)malloc((g->nplus+1) *
+                                                       sizeof(char *));
+                       if (g->nplus > 0 && m->lastpos == NULL) {
+                               free(m->pmatch);
+                               STATETEARDOWN(m);
+                               return(REG_ESPACE);
+                       }
+                       NOTE("backref dissect");
+                       dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
+               }
+               if (dp != NULL)
+                       break;
+
+               /* uh-oh... we couldn't find a subexpression-level match */
+               assert(g->backrefs);    /* must be back references doing it */
+               assert(g->nplus == 0 || m->lastpos != NULL);
+               for (;;) {
+                       if (dp != NULL || endp <= m->coldp)
+                               break;          /* defeat */
+                       NOTE("backoff");
+                       endp = slow(m, m->coldp, endp-1, gf, gl);
+                       if (endp == NULL)
+                               break;          /* defeat */
+                       /* try it on a shorter possibility */
+#ifndef NDEBUG
+                       for (i = 1; i <= m->g->nsub; i++) {
+                               assert(m->pmatch[i].rm_so == -1);
+                               assert(m->pmatch[i].rm_eo == -1);
+                       }
+#endif
+                       NOTE("backoff dissect");
+                       dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
+               }
+               assert(dp == NULL || dp == endp);
+               if (dp != NULL)         /* found a shorter one */
+                       break;
+
+               /* despite initial appearances, there is no match here */
+               NOTE("false alarm");
+               if (m->coldp == stop)
+                       break;
+               start = m->coldp + 1;   /* recycle starting later */
+       }
+
+       /* fill in the details if requested */
+       if (nmatch > 0) {
+               pmatch[0].rm_so = m->coldp - m->offp;
+               pmatch[0].rm_eo = endp - m->offp;
+       }
+       if (nmatch > 1) {
+               assert(m->pmatch != NULL);
+               for (i = 1; i < (ssize_t)nmatch; i++)
+                       if (i <= (int)m->g->nsub)
+                               pmatch[i] = m->pmatch[i];
+                       else {
+                               pmatch[i].rm_so = -1;
+                               pmatch[i].rm_eo = -1;
+                       }
+       }
+
+       if (m->pmatch != NULL)
+               free((char *)m->pmatch);
+       if (m->lastpos != NULL)
+               free((char *)m->lastpos);
+       STATETEARDOWN(m);
+       return(0);
+}
+
+/*
+ - dissect - figure out what matched what, no back references
+ */
+static char *                  /* == stop (success) always */
+dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
+{
+       int i;
+       sopno ss;       /* start sop of current subRE */
+       sopno es;       /* end sop of current subRE */
+       char *sp;       /* start of string matched by it */
+       char *stp;      /* string matched by it cannot pass here */
+       char *rest;     /* start of rest of string */
+       char *tail;     /* string unmatched by rest of RE */
+       sopno ssub;     /* start sop of subsubRE */
+       sopno esub;     /* end sop of subsubRE */
+       char *ssp;      /* start of string matched by subsubRE */
+       char *sep;      /* end of string matched by subsubRE */
+       char *oldssp;   /* previous ssp */
+       char *dp;
+
+       AT("diss", start, stop, startst, stopst);
+       sp = start;
+       for (ss = startst; ss < stopst; ss = es) {
+               /* identify end of subRE */
+               es = ss;
+               switch (OP(m->g->strip[es])) {
+               case OPLUS_:
+               case OQUEST_:
+                       es += OPND(m->g->strip[es]);
+                       break;
+               case OCH_:
+                       while (OP(m->g->strip[es]) != O_CH)
+                               es += OPND(m->g->strip[es]);
+                       break;
+               }
+               es++;
+
+               /* figure out what it matched */
+               switch (OP(m->g->strip[ss])) {
+               case OEND:
+                       assert(nope);
+                       break;
+               case OCHAR:
+                       sp++;
+                       break;
+               case OBOL:
+               case OEOL:
+               case OBOW:
+               case OEOW:
+                       break;
+               case OANY:
+               case OANYOF:
+                       sp++;
+                       break;
+               case OBACK_:
+               case O_BACK:
+                       assert(nope);
+                       break;
+               /* cases where length of match is hard to find */
+               case OQUEST_:
+                       stp = stop;
+                       for (;;) {
+                               /* how long could this one be? */
+                               rest = slow(m, sp, stp, ss, es);
+                               assert(rest != NULL);   /* it did match */
+                               /* could the rest match the rest? */
+                               tail = slow(m, rest, stop, es, stopst);
+                               if (tail == stop)
+                                       break;          /* yes! */
+                               /* no -- try a shorter match for this one */
+                               stp = rest - 1;
+                               assert(stp >= sp);      /* it did work */
+                       }
+                       ssub = ss + 1;
+                       esub = es - 1;
+                       /* did innards match? */
+                       if (slow(m, sp, rest, ssub, esub) != NULL) {
+                               dp = dissect(m, sp, rest, ssub, esub);
+                               assert(dp == rest);
+                       } else          /* no */
+                               assert(sp == rest);
+                       sp = rest;
+                       break;
+               case OPLUS_:
+                       stp = stop;
+                       for (;;) {
+                               /* how long could this one be? */
+                               rest = slow(m, sp, stp, ss, es);
+                               assert(rest != NULL);   /* it did match */
+                               /* could the rest match the rest? */
+                               tail = slow(m, rest, stop, es, stopst);
+                               if (tail == stop)
+                                       break;          /* yes! */
+                               /* no -- try a shorter match for this one */
+                               stp = rest - 1;
+                               assert(stp >= sp);      /* it did work */
+                       }
+                       ssub = ss + 1;
+                       esub = es - 1;
+                       ssp = sp;
+                       oldssp = ssp;
+                       for (;;) {      /* find last match of innards */
+                               sep = slow(m, ssp, rest, ssub, esub);
+                               if (sep == NULL || sep == ssp)
+                                       break;  /* failed or matched null */
+                               oldssp = ssp;   /* on to next try */
+                               ssp = sep;
+                       }
+                       if (sep == NULL) {
+                               /* last successful match */
+                               sep = ssp;
+                               ssp = oldssp;
+                       }
+                       assert(sep == rest);    /* must exhaust substring */
+                       assert(slow(m, ssp, sep, ssub, esub) == rest);
+                       dp = dissect(m, ssp, sep, ssub, esub);
+                       assert(dp == sep);
+                       sp = rest;
+                       break;
+               case OCH_:
+                       stp = stop;
+                       for (;;) {
+                               /* how long could this one be? */
+                               rest = slow(m, sp, stp, ss, es);
+                               assert(rest != NULL);   /* it did match */
+                               /* could the rest match the rest? */
+                               tail = slow(m, rest, stop, es, stopst);
+                               if (tail == stop)
+                                       break;          /* yes! */
+                               /* no -- try a shorter match for this one */
+                               stp = rest - 1;
+                               assert(stp >= sp);      /* it did work */
+                       }
+                       ssub = ss + 1;
+                       esub = ss + OPND(m->g->strip[ss]) - 1;
+                       assert(OP(m->g->strip[esub]) == OOR1);
+                       for (;;) {      /* find first matching branch */
+                               if (slow(m, sp, rest, ssub, esub) == rest)
+                                       break;  /* it matched all of it */
+                               /* that one missed, try next one */
+                               assert(OP(m->g->strip[esub]) == OOR1);
+                               esub++;
+                               assert(OP(m->g->strip[esub]) == OOR2);
+                               ssub = esub + 1;
+                               esub += OPND(m->g->strip[esub]);
+                               if (OP(m->g->strip[esub]) == OOR2)
+                                       esub--;
+                               else
+                                       assert(OP(m->g->strip[esub]) == O_CH);
+                       }
+                       dp = dissect(m, sp, rest, ssub, esub);
+                       assert(dp == rest);
+                       sp = rest;
+                       break;
+               case O_PLUS:
+               case O_QUEST:
+               case OOR1:
+               case OOR2:
+               case O_CH:
+                       assert(nope);
+                       break;
+               case OLPAREN:
+                       i = OPND(m->g->strip[ss]);
+                       assert(0 < i && i <= m->g->nsub);
+                       m->pmatch[i].rm_so = sp - m->offp;
+                       break;
+               case ORPAREN:
+                       i = OPND(m->g->strip[ss]);
+                       assert(0 < i && i <= m->g->nsub);
+                       m->pmatch[i].rm_eo = sp - m->offp;
+                       break;
+               default:                /* uh oh */
+                       assert(nope);
+                       break;
+               }
+       }
+
+       assert(sp == stop);
+       return(sp);
+}
+
+/*
+ - backref - figure out what matched what, figuring in back references
+ */
+static char *                  /* == stop (success) or NULL (failure) */
+backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst,
+    sopno lev, int rec)                        /* PLUS nesting level */
+{
+       int i;
+       sopno ss;       /* start sop of current subRE */
+       char *sp;       /* start of string matched by it */
+       sopno ssub;     /* start sop of subsubRE */
+       sopno esub;     /* end sop of subsubRE */
+       char *ssp;      /* start of string matched by subsubRE */
+       char *dp;
+       size_t len;
+       int hard;
+       sop s;
+       regoff_t offsave;
+       cset *cs;
+
+       AT("back", start, stop, startst, stopst);
+       sp = start;
+
+       /* get as far as we can with easy stuff */
+       hard = 0;
+       for (ss = startst; !hard && ss < stopst; ss++)
+               switch (OP(s = m->g->strip[ss])) {
+               case OCHAR:
+                       if (sp == stop || *sp++ != (char)OPND(s))
+                               return(NULL);
+                       break;
+               case OANY:
+                       if (sp == stop)
+                               return(NULL);
+                       sp++;
+                       break;
+               case OANYOF:
+                       cs = &m->g->sets[OPND(s)];
+                       if (sp == stop || !CHIN(cs, *sp++))
+                               return(NULL);
+                       break;
+               case OBOL:
+                       if ( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+                                       (sp < m->endp && *(sp-1) == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case OEOL:
+                       if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+                                       (sp < m->endp && *sp == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case OBOW:
+                       if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+                                       (sp < m->endp && *(sp-1) == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) ||
+                                       (sp > m->beginp &&
+                                                       !ISWORD(*(sp-1))) ) &&
+                                       (sp < m->endp && ISWORD(*sp)) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case OEOW:
+                       if (( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+                                       (sp < m->endp && *sp == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) ||
+                                       (sp < m->endp && !ISWORD(*sp)) ) &&
+                                       (sp > m->beginp && ISWORD(*(sp-1))) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case O_QUEST:
+                       break;
+               case OOR1:      /* matches null but needs to skip */
+                       ss++;
+                       s = m->g->strip[ss];
+                       do {
+                               assert(OP(s) == OOR2);
+                               ss += OPND(s);
+                       } while (OP(s = m->g->strip[ss]) != O_CH);
+                       /* note that the ss++ gets us past the O_CH */
+                       break;
+               default:        /* have to make a choice */
+                       hard = 1;
+                       break;
+               }
+       if (!hard) {            /* that was it! */
+               if (sp != stop)
+                       return(NULL);
+               return(sp);
+       }
+       ss--;                   /* adjust for the for's final increment */
+
+       /* the hard stuff */
+       AT("hard", sp, stop, ss, stopst);
+       s = m->g->strip[ss];
+       switch (OP(s)) {
+       case OBACK_:            /* the vilest depths */
+               i = OPND(s);
+               assert(0 < i && i <= m->g->nsub);
+               if (m->pmatch[i].rm_eo == -1)
+                       return(NULL);
+               assert(m->pmatch[i].rm_so != -1);
+               len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;
+               if (len == 0 && rec++ > MAX_RECURSION)
+                       return(NULL);
+               assert(stop - m->beginp >= len);
+               if (sp > stop - len)
+                       return(NULL);   /* not enough left to match */
+               ssp = m->offp + m->pmatch[i].rm_so;
+               if (memcmp(sp, ssp, len) != 0)
+                       return(NULL);
+               while (m->g->strip[ss] != SOP(O_BACK, i))
+                       ss++;
+               return(backref(m, sp+len, stop, ss+1, stopst, lev, rec));
+               break;
+       case OQUEST_:           /* to null or not */
+               dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
+               if (dp != NULL)
+                       return(dp);     /* not */
+               return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev, rec));
+               break;
+       case OPLUS_:
+               assert(m->lastpos != NULL);
+               assert(lev+1 <= m->g->nplus);
+               m->lastpos[lev+1] = sp;
+               return(backref(m, sp, stop, ss+1, stopst, lev+1, rec));
+               break;
+       case O_PLUS:
+               if (sp == m->lastpos[lev])      /* last pass matched null */
+                       return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
+               /* try another pass */
+               m->lastpos[lev] = sp;
+               dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev, rec);
+               if (dp == NULL)
+                       return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
+               else
+                       return(dp);
+               break;
+       case OCH_:              /* find the right one, if any */
+               ssub = ss + 1;
+               esub = ss + OPND(s) - 1;
+               assert(OP(m->g->strip[esub]) == OOR1);
+               for (;;) {      /* find first matching branch */
+                       dp = backref(m, sp, stop, ssub, esub, lev, rec);
+                       if (dp != NULL)
+                               return(dp);
+                       /* that one missed, try next one */
+                       if (OP(m->g->strip[esub]) == O_CH)
+                               return(NULL);   /* there is none */
+                       esub++;
+                       assert(OP(m->g->strip[esub]) == OOR2);
+                       ssub = esub + 1;
+                       esub += OPND(m->g->strip[esub]);
+                       if (OP(m->g->strip[esub]) == OOR2)
+                               esub--;
+                       else
+                               assert(OP(m->g->strip[esub]) == O_CH);
+               }
+               break;
+       case OLPAREN:           /* must undo assignment if rest fails */
+               i = OPND(s);
+               assert(0 < i && i <= m->g->nsub);
+               offsave = m->pmatch[i].rm_so;
+               m->pmatch[i].rm_so = sp - m->offp;
+               dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
+               if (dp != NULL)
+                       return(dp);
+               m->pmatch[i].rm_so = offsave;
+               return(NULL);
+               break;
+       case ORPAREN:           /* must undo assignment if rest fails */
+               i = OPND(s);
+               assert(0 < i && i <= m->g->nsub);
+               offsave = m->pmatch[i].rm_eo;
+               m->pmatch[i].rm_eo = sp - m->offp;
+               dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
+               if (dp != NULL)
+                       return(dp);
+               m->pmatch[i].rm_eo = offsave;
+               return(NULL);
+               break;
+       default:                /* uh oh */
+               assert(nope);
+               break;
+       }
+
+       /* "can't happen" */
+       assert(nope);
+       /* NOTREACHED */
+       return 0;
+}
+
+/*
+ - fast - step through the string at top speed
+ */
+static char *                  /* where tentative match ended, or NULL */
+fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
+{
+       states st = m->st;
+       states fresh = m->fresh;
+       states tmp = m->tmp;
+       char *p = start;
+       int c = (start == m->beginp) ? OUT : *(start-1);
+       int lastc;      /* previous c */
+       int flagch;
+       int i;
+       char *coldp;    /* last p after which no match was underway */
+
+       CLEAR(st);
+       SET1(st, startst);
+       st = step(m->g, startst, stopst, st, NOTHING, st);
+       ASSIGN(fresh, st);
+       SP("start", st, *p);
+       coldp = NULL;
+       for (;;) {
+               /* next character */
+               lastc = c;
+               c = (p == m->endp) ? OUT : *p;
+               if (EQ(st, fresh))
+                       coldp = p;
+
+               /* is there an EOL and/or BOL between lastc and c? */
+               flagch = '\0';
+               i = 0;
+               if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+                       flagch = BOL;
+                       i = m->g->nbol;
+               }
+               if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+                       flagch = (flagch == BOL) ? BOLEOL : EOL;
+                       i += m->g->neol;
+               }
+               if (i != 0) {
+                       for (; i > 0; i--)
+                               st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("boleol", st, c);
+               }
+
+               /* how about a word boundary? */
+               if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+                                       (c != OUT && ISWORD(c)) ) {
+                       flagch = BOW;
+               }
+               if ( (lastc != OUT && ISWORD(lastc)) &&
+                               (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+                       flagch = EOW;
+               }
+               if (flagch == BOW || flagch == EOW) {
+                       st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("boweow", st, c);
+               }
+
+               /* are we done? */
+               if (ISSET(st, stopst) || p == stop)
+                       break;          /* NOTE BREAK OUT */
+
+               /* no, we must deal with this character */
+               ASSIGN(tmp, st);
+               ASSIGN(st, fresh);
+               assert(c != OUT);
+               st = step(m->g, startst, stopst, tmp, c, st);
+               SP("aft", st, c);
+               assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+               p++;
+       }
+
+       assert(coldp != NULL);
+       m->coldp = coldp;
+       if (ISSET(st, stopst))
+               return(p+1);
+       else
+               return(NULL);
+}
+
+/*
+ - slow - step through the string more deliberately
+ */
+static char *                  /* where it ended */
+slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
+{
+       states st = m->st;
+       states empty = m->empty;
+       states tmp = m->tmp;
+       char *p = start;
+       int c = (start == m->beginp) ? OUT : *(start-1);
+       int lastc;      /* previous c */
+       int flagch;
+       int i;
+       char *matchp;   /* last p at which a match ended */
+
+       AT("slow", start, stop, startst, stopst);
+       CLEAR(st);
+       SET1(st, startst);
+       SP("sstart", st, *p);
+       st = step(m->g, startst, stopst, st, NOTHING, st);
+       matchp = NULL;
+       for (;;) {
+               /* next character */
+               lastc = c;
+               c = (p == m->endp) ? OUT : *p;
+
+               /* is there an EOL and/or BOL between lastc and c? */
+               flagch = '\0';
+               i = 0;
+               if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+                       flagch = BOL;
+                       i = m->g->nbol;
+               }
+               if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+                       flagch = (flagch == BOL) ? BOLEOL : EOL;
+                       i += m->g->neol;
+               }
+               if (i != 0) {
+                       for (; i > 0; i--)
+                               st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("sboleol", st, c);
+               }
+
+               /* how about a word boundary? */
+               if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+                                       (c != OUT && ISWORD(c)) ) {
+                       flagch = BOW;
+               }
+               if ( (lastc != OUT && ISWORD(lastc)) &&
+                               (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+                       flagch = EOW;
+               }
+               if (flagch == BOW || flagch == EOW) {
+                       st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("sboweow", st, c);
+               }
+
+               /* are we done? */
+               if (ISSET(st, stopst))
+                       matchp = p;
+               if (EQ(st, empty) || p == stop)
+                       break;          /* NOTE BREAK OUT */
+
+               /* no, we must deal with this character */
+               ASSIGN(tmp, st);
+               ASSIGN(st, empty);
+               assert(c != OUT);
+               st = step(m->g, startst, stopst, tmp, c, st);
+               SP("saft", st, c);
+               assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+               p++;
+       }
+
+       return(matchp);
+}
+
+
+/*
+ - step - map set of states reachable before char to set reachable after
+ */
+static states
+step(struct re_guts *g,
+    sopno start,               /* start state within strip */
+    sopno stop,                        /* state after stop state within strip */
+    states bef,                        /* states reachable before */
+    int ch,                    /* character or NONCHAR code */
+    states aft)                        /* states already known reachable after */
+{
+       cset *cs;
+       sop s;
+       sopno pc;
+       onestate here;          /* note, macros know this name */
+       sopno look;
+       int i;
+
+       for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) {
+               s = g->strip[pc];
+               switch (OP(s)) {
+               case OEND:
+                       assert(pc == stop-1);
+                       break;
+               case OCHAR:
+                       /* only characters can match */
+                       assert(!NONCHAR(ch) || ch != (char)OPND(s));
+                       if (ch == (char)OPND(s))
+                               FWD(aft, bef, 1);
+                       break;
+               case OBOL:
+                       if (ch == BOL || ch == BOLEOL)
+                               FWD(aft, bef, 1);
+                       break;
+               case OEOL:
+                       if (ch == EOL || ch == BOLEOL)
+                               FWD(aft, bef, 1);
+                       break;
+               case OBOW:
+                       if (ch == BOW)
+                               FWD(aft, bef, 1);
+                       break;
+               case OEOW:
+                       if (ch == EOW)
+                               FWD(aft, bef, 1);
+                       break;
+               case OANY:
+                       if (!NONCHAR(ch))
+                               FWD(aft, bef, 1);
+                       break;
+               case OANYOF:
+                       cs = &g->sets[OPND(s)];
+                       if (!NONCHAR(ch) && CHIN(cs, ch))
+                               FWD(aft, bef, 1);
+                       break;
+               case OBACK_:            /* ignored here */
+               case O_BACK:
+                       FWD(aft, aft, 1);
+                       break;
+               case OPLUS_:            /* forward, this is just an empty */
+                       FWD(aft, aft, 1);
+                       break;
+               case O_PLUS:            /* both forward and back */
+                       FWD(aft, aft, 1);
+                       i = ISSETBACK(aft, OPND(s));
+                       BACK(aft, aft, OPND(s));
+                       if (!i && ISSETBACK(aft, OPND(s))) {
+                               /* oho, must reconsider loop body */
+                               pc -= OPND(s) + 1;
+                               INIT(here, pc);
+                       }
+                       break;
+               case OQUEST_:           /* two branches, both forward */
+                       FWD(aft, aft, 1);
+                       FWD(aft, aft, OPND(s));
+                       break;
+               case O_QUEST:           /* just an empty */
+                       FWD(aft, aft, 1);
+                       break;
+               case OLPAREN:           /* not significant here */
+               case ORPAREN:
+                       FWD(aft, aft, 1);
+                       break;
+               case OCH_:              /* mark the first two branches */
+                       FWD(aft, aft, 1);
+                       assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+                       FWD(aft, aft, OPND(s));
+                       break;
+               case OOR1:              /* done a branch, find the O_CH */
+                       if (ISSTATEIN(aft, here)) {
+                               for (look = 1;
+                                               OP(s = g->strip[pc+look]) != O_CH;
+                                               look += OPND(s))
+                                       assert(OP(s) == OOR2);
+                               FWD(aft, aft, look);
+                       }
+                       break;
+               case OOR2:              /* propagate OCH_'s marking */
+                       FWD(aft, aft, 1);
+                       if (OP(g->strip[pc+OPND(s)]) != O_CH) {
+                               assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+                               FWD(aft, aft, OPND(s));
+                       }
+                       break;
+               case O_CH:              /* just empty */
+                       FWD(aft, aft, 1);
+                       break;
+               default:                /* ooooops... */
+                       assert(nope);
+                       break;
+               }
+       }
+
+       return(aft);
+}
+
+#ifdef REDEBUG
+/*
+ - print - print a set of states
+ */
+static void
+print(struct match *m, char *caption, states st, int ch, FILE *d)
+{
+       struct re_guts *g = m->g;
+       int i;
+       int first = 1;
+
+       if (!(m->eflags&REG_TRACE))
+               return;
+
+       (void)fprintf(d, "%s", caption);
+       if (ch != '\0')
+               (void)fprintf(d, " %s", pchar(ch));
+       for (i = 0; i < g->nstates; i++)
+               if (ISSET(st, i)) {
+                       (void)fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
+                       first = 0;
+               }
+       (void)fprintf(d, "\n");
+}
+
+/* 
+ - at - print current situation
+ */
+static void
+at(struct match *m, char *title, char *start, char *stop, sopno startst,
+    sopno stopst)
+{
+       if (!(m->eflags&REG_TRACE))
+               return;
+
+       (void)printf("%s %s-", title, pchar(*start));
+       (void)printf("%s ", pchar(*stop));
+       (void)printf("%ld-%ld\n", (long)startst, (long)stopst);
+}
+
+#ifndef PCHARDONE
+#define        PCHARDONE       /* never again */
+/*
+ - pchar - make a character printable
+ *
+ * Is this identical to regchar() over in debug.c?  Well, yes.  But a
+ * duplicate here avoids having a debugging-capable regexec.o tied to
+ * a matching debug.o, and this is convenient.  It all disappears in
+ * the non-debug compilation anyway, so it doesn't matter much.
+ */
+static char *                  /* -> representation */
+pchar(int ch)
+{
+       static char pbuf[10];
+
+       if (isprint(ch) || ch == ' ')
+               (void)snprintf(pbuf, sizeof pbuf, "%c", ch);
+       else
+               (void)snprintf(pbuf, sizeof pbuf, "\\%o", ch);
+       return(pbuf);
+}
+#endif
+#endif
+
+#undef matcher
+#undef fast
+#undef slow
+#undef dissect
+#undef backref
+#undef step
+#undef print
+#undef at
+#undef match
+#undef nope
diff --git a/android/regex/regcomp.c b/android/regex/regcomp.c
new file mode 100644 (file)
index 0000000..19f4790
--- /dev/null
@@ -0,0 +1,1517 @@
+/*     $OpenBSD: regcomp.c,v 1.19 2008/02/23 08:13:07 otto Exp $ */
+/*-
+ * Copyright (c) 1992, 1993, 1994 Henry Spencer.
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * 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.
+ *
+ *     @(#)regcomp.c   8.5 (Berkeley) 3/20/94
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+#include "cclass.h"
+#include "cname.h"
+
+/*
+ * parse structure, passed up and down to avoid global variables and
+ * other clumsinesses
+ */
+struct parse {
+       char *next;             /* next character in RE */
+       char *end;              /* end of string (-> NUL normally) */
+       int error;              /* has an error been seen? */
+       sop *strip;             /* malloced strip */
+       sopno ssize;            /* malloced strip size (allocated) */
+       sopno slen;             /* malloced strip length (used) */
+       int ncsalloc;           /* number of csets allocated */
+       struct re_guts *g;
+#      define  NPAREN  10      /* we need to remember () 1-9 for back refs */
+       sopno pbegin[NPAREN];   /* -> ( ([0] unused) */
+       sopno pend[NPAREN];     /* -> ) ([0] unused) */
+};
+
+static void p_ere(struct parse *, int);
+static void p_ere_exp(struct parse *);
+static void p_str(struct parse *);
+static void p_bre(struct parse *, int, int);
+static int p_simp_re(struct parse *, int);
+static int p_count(struct parse *);
+static void p_bracket(struct parse *);
+static void p_b_term(struct parse *, cset *);
+static void p_b_cclass(struct parse *, cset *);
+static void p_b_eclass(struct parse *, cset *);
+static char p_b_symbol(struct parse *);
+static char p_b_coll_elem(struct parse *, int);
+static char othercase(int);
+static void bothcases(struct parse *, int);
+static void ordinary(struct parse *, int);
+static void nonnewline(struct parse *);
+static void repeat(struct parse *, sopno, int, int);
+static int seterr(struct parse *, int);
+static cset *allocset(struct parse *);
+static void freeset(struct parse *, cset *);
+static int freezeset(struct parse *, cset *);
+static int firstch(struct parse *, cset *);
+static int nch(struct parse *, cset *);
+static void mcadd(struct parse *, cset *, char *);
+static void mcinvert(struct parse *, cset *);
+static void mccase(struct parse *, cset *);
+static int isinsets(struct re_guts *, int);
+static int samesets(struct re_guts *, int, int);
+static void categorize(struct parse *, struct re_guts *);
+static sopno dupl(struct parse *, sopno, sopno);
+static void doemit(struct parse *, sop, size_t);
+static void doinsert(struct parse *, sop, size_t, sopno);
+static void dofwd(struct parse *, sopno, sop);
+static void enlarge(struct parse *, sopno);
+static void stripsnug(struct parse *, struct re_guts *);
+static void findmust(struct parse *, struct re_guts *);
+static sopno pluscount(struct parse *, struct re_guts *);
+
+static char nuls[10];          /* place to point scanner in event of error */
+
+/*
+ * macros for use with parse structure
+ * BEWARE:  these know that the parse structure is named `p' !!!
+ */
+#define        PEEK()  (*p->next)
+#define        PEEK2() (*(p->next+1))
+#define        MORE()  (p->next < p->end)
+#define        MORE2() (p->next+1 < p->end)
+#define        SEE(c)  (MORE() && PEEK() == (c))
+#define        SEETWO(a, b)    (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
+#define        EAT(c)  ((SEE(c)) ? (NEXT(), 1) : 0)
+#define        EATTWO(a, b)    ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
+#define        NEXT()  (p->next++)
+#define        NEXT2() (p->next += 2)
+#define        NEXTn(n)        (p->next += (n))
+#define        GETNEXT()       (*p->next++)
+#define        SETERROR(e)     seterr(p, (e))
+#define        REQUIRE(co, e)  ((co) || SETERROR(e))
+#define        MUSTSEE(c, e)   (REQUIRE(MORE() && PEEK() == (c), e))
+#define        MUSTEAT(c, e)   (REQUIRE(MORE() && GETNEXT() == (c), e))
+#define        MUSTNOTSEE(c, e)        (REQUIRE(!MORE() || PEEK() != (c), e))
+#define        EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
+#define        INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
+#define        AHEAD(pos)              dofwd(p, pos, HERE()-(pos))
+#define        ASTERN(sop, pos)        EMIT(sop, HERE()-pos)
+#define        HERE()          (p->slen)
+#define        THERE()         (p->slen - 1)
+#define        THERETHERE()    (p->slen - 2)
+#define        DROP(n) (p->slen -= (n))
+
+#ifndef NDEBUG
+static int never = 0;          /* for use in asserts; shuts lint up */
+#else
+#define        never   0               /* some <assert.h>s have bugs too */
+#endif
+
+/*
+ - regcomp - interface for parser and compilation
+ */
+int                            /* 0 success, otherwise REG_something */
+regcomp(regex_t *preg, const char *pattern, int cflags)
+{
+       struct parse pa;
+       struct re_guts *g;
+       struct parse *p = &pa;
+       int i;
+       size_t len;
+#ifdef REDEBUG
+#      define  GOODFLAGS(f)    (f)
+#else
+#      define  GOODFLAGS(f)    ((f)&~REG_DUMP)
+#endif
+
+       cflags = GOODFLAGS(cflags);
+       if ((cflags&REG_EXTENDED) && (cflags&REG_NOSPEC))
+               return(REG_INVARG);
+
+       if (cflags&REG_PEND) {
+               if (preg->re_endp < pattern)
+                       return(REG_INVARG);
+               len = preg->re_endp - pattern;
+       } else
+               len = strlen((char *)pattern);
+
+       /* do the mallocs early so failure handling is easy */
+       g = (struct re_guts *)malloc(sizeof(struct re_guts) +
+                                                       (NC-1)*sizeof(cat_t));
+       if (g == NULL)
+               return(REG_ESPACE);
+       p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */
+       p->strip = (sop *)calloc(p->ssize, sizeof(sop));
+       p->slen = 0;
+       if (p->strip == NULL) {
+               free((char *)g);
+               return(REG_ESPACE);
+       }
+
+       /* set things up */
+       p->g = g;
+       p->next = (char *)pattern;      /* convenience; we do not modify it */
+       p->end = p->next + len;
+       p->error = 0;
+       p->ncsalloc = 0;
+       for (i = 0; i < NPAREN; i++) {
+               p->pbegin[i] = 0;
+               p->pend[i] = 0;
+       }
+       g->csetsize = NC;
+       g->sets = NULL;
+       g->setbits = NULL;
+       g->ncsets = 0;
+       g->cflags = cflags;
+       g->iflags = 0;
+       g->nbol = 0;
+       g->neol = 0;
+       g->must = NULL;
+       g->mlen = 0;
+       g->nsub = 0;
+       g->ncategories = 1;     /* category 0 is "everything else" */
+       g->categories = &g->catspace[-(CHAR_MIN)];
+       (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
+       g->backrefs = 0;
+
+       /* do it */
+       EMIT(OEND, 0);
+       g->firststate = THERE();
+       if (cflags&REG_EXTENDED)
+               p_ere(p, OUT);
+       else if (cflags&REG_NOSPEC)
+               p_str(p);
+       else
+               p_bre(p, OUT, OUT);
+       EMIT(OEND, 0);
+       g->laststate = THERE();
+
+       /* tidy up loose ends and fill things in */
+       categorize(p, g);
+       stripsnug(p, g);
+       findmust(p, g);
+       g->nplus = pluscount(p, g);
+       g->magic = MAGIC2;
+       preg->re_nsub = g->nsub;
+       preg->re_g = g;
+       preg->re_magic = MAGIC1;
+#ifndef REDEBUG
+       /* not debugging, so can't rely on the assert() in regexec() */
+       if (g->iflags&BAD)
+               SETERROR(REG_ASSERT);
+#endif
+
+       /* win or lose, we're done */
+       if (p->error != 0)      /* lose */
+               regfree(preg);
+       return(p->error);
+}
+
+/*
+ - p_ere - ERE parser top level, concatenation and alternation
+ */
+static void
+p_ere(struct parse *p, int stop)       /* character this ERE should end at */
+{
+       char c;
+       sopno prevback = 0;
+       sopno prevfwd = 0;
+       sopno conc;
+       int first = 1;